Compare commits

..

No commits in common. "521a162233f01a23d06479964ba62fb8f7679011" and "b532e46a1e4a658e3d19f273045211a4c9c12071" have entirely different histories.

45 changed files with 165 additions and 601 deletions

View File

@ -1,6 +1,5 @@
package cn.iocoder.yudao.module.bpm.controller.admin.definition; package cn.iocoder.yudao.module.bpm.controller.admin.definition;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@ -86,8 +85,6 @@ public class BpmProcessCcController {
PageResult<BpmProcessCcDO> pageResult = processCcService.getProcessCcPage(pageReqVO); PageResult<BpmProcessCcDO> pageResult = processCcService.getProcessCcPage(pageReqVO);
PageResult<BpmProcessCcRespVO> respVOPageResult = BeanUtils.toBean(pageResult, BpmProcessCcRespVO.class); PageResult<BpmProcessCcRespVO> respVOPageResult = BeanUtils.toBean(pageResult, BpmProcessCcRespVO.class);
if (CollUtil.isNotEmpty(respVOPageResult.getList())) {
// 获取公司部门Map // 获取公司部门Map
Map<Long, DeptRespDTO> deptMap = convertMap(deptApi.getCompanyDept().getCheckedData(), DeptRespDTO::getId); Map<Long, DeptRespDTO> deptMap = convertMap(deptApi.getCompanyDept().getCheckedData(), DeptRespDTO::getId);
// 获取列表中所有用户组详情 // 获取列表中所有用户组详情
@ -109,8 +106,6 @@ public class BpmProcessCcController {
.map(item -> deptMap.get(item) != null ? deptMap.get(item).getName() : "") .map(item -> deptMap.get(item) != null ? deptMap.get(item).getName() : "")
.collect(Collectors.joining(""))); .collect(Collectors.joining("")));
}); });
}
return success(respVOPageResult); return success(respVOPageResult);
} }
} }

View File

@ -37,6 +37,7 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti
* OA 合同审批 Controller * OA 合同审批 Controller
* *
* @author 符溶馨 * @author 符溶馨
*/ */
@Tag(name = "管理后台 - OA 合同审批") @Tag(name = "管理后台 - OA 合同审批")
@RestController @RestController
@ -67,6 +68,7 @@ public class BpmOAContractController {
@Operation(summary = "获得合同审批") @Operation(summary = "获得合同审批")
@Parameter(name = "id", description = "编号", required = true, example = "1024") @Parameter(name = "id", description = "编号", required = true, example = "1024")
public CommonResult<BpmOAContractRespVO> getContract(@RequestParam("id") Long id) { public CommonResult<BpmOAContractRespVO> getContract(@RequestParam("id") Long id) {
BpmOAContractDO contract = contractService.getContract(id); BpmOAContractDO contract = contractService.getContract(id);
BpmOAContractRespVO respVO = BpmOAContractConvert.INSTANCE.convert(contract); BpmOAContractRespVO respVO = BpmOAContractConvert.INSTANCE.convert(contract);
if (respVO != null) { if (respVO != null) {
@ -135,12 +137,15 @@ public class BpmOAContractController {
return success(contractService.getContractPage(pageReqVO)); return success(contractService.getContractPage(pageReqVO));
} }
@GetMapping("/getList") @GetMapping("/getListByDeptId")
@Operation(summary = "获取下属和自己的合同列表") @Operation(summary = "获得同部门的销售合同")
public CommonResult<List<BpmOAContractRespVO>> getList(@RequestParam(required = false) String relation, public CommonResult<List<BpmOAContractRespVO>> getListByDeptId() {
@RequestParam(required = false) Integer contractType,
@RequestParam(required = false) String contractName) { // 获取同部门所有用户id
List<BpmOAContractDO> contracts = contractService.getList(relation, contractType, contractName); List<Long> userIds = userApi.getUserIdsByUserIdGroupByDept(getLoginUserId()).getCheckedData();
List<BpmOAContractDO> contracts = contractService.getListByDeptId(userIds);
return success(BeanUtils.toBean(contracts, BpmOAContractRespVO.class)); return success(BeanUtils.toBean(contracts, BpmOAContractRespVO.class));
} }

View File

@ -58,7 +58,6 @@ public class BpmOAImprestController {
BpmOAImprestDO imprest = imprestService.getImprest(id); BpmOAImprestDO imprest = imprestService.getImprest(id);
BpmOAImprestRespVO respVO = BpmOAImprestConvert.INSTANCE.convert(imprest); BpmOAImprestRespVO respVO = BpmOAImprestConvert.INSTANCE.convert(imprest);
if (respVO != null) { if (respVO != null) {
if (respVO.getBankId() != null) {
// 获取收款账号信息 // 获取收款账号信息
BankRespDTO bankRespDTO = bankApi.getBank(respVO.getBankId()).getCheckedData(); BankRespDTO bankRespDTO = bankApi.getBank(respVO.getBankId()).getCheckedData();
if (bankRespDTO != null) { if (bankRespDTO != null) {
@ -66,7 +65,6 @@ public class BpmOAImprestController {
respVO.setNickname(bankRespDTO.getNickname()); respVO.setNickname(bankRespDTO.getNickname());
respVO.setBankNo(bankRespDTO.getBankNo()); respVO.setBankNo(bankRespDTO.getBankNo());
} }
}
// 获取公司信息 // 获取公司信息
DeptRespDTO company = deptApi.getDept(respVO.getCompanyId()).getCheckedData(); DeptRespDTO company = deptApi.getDept(respVO.getCompanyId()).getCheckedData();

View File

@ -26,9 +26,6 @@ public class BpmOAInvoiceRespVO extends BpmOABaseRespVO {
@Schema(description = "合同名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED) @Schema(description = "合同名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String contractName; private String contractName;
@Schema(description = "合同编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String contractNo;
@Schema(description = "关联合同流程实例编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED) @Schema(description = "关联合同流程实例编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String contractInstanceId; private String contractInstanceId;

View File

@ -16,17 +16,32 @@ import java.util.Objects;
public interface BpmOAInvoiceMapper extends BaseMapperX<BpmOAInvoiceDO> { public interface BpmOAInvoiceMapper extends BaseMapperX<BpmOAInvoiceDO> {
default PageResult<BpmOAInvoiceRespVO> selectPage(BpmOAInvoicePageReqVO pageReqVO, default PageResult<BpmOAInvoiceRespVO> selectPage(BpmOAInvoicePageReqVO pageReqVO,
List<Long> userIds) { Long userId) {
MPJLambdaWrapperX<BpmOAInvoiceDO> query = new MPJLambdaWrapperX<>(); MPJLambdaWrapperX<BpmOAInvoiceDO> query = new MPJLambdaWrapperX<>();
query.selectAll(BpmOAInvoiceDO.class); query.selectAll(BpmOAInvoiceDO.class);
query.selectAs(BpmOAContractDO::getContractName, BpmOAInvoiceRespVO::getContractName); query.selectAs(BpmOAContractDO::getContractName, BpmOAInvoiceRespVO::getContractName);
query.selectAs(BpmOAContractDO::getCustomerName, BpmOAInvoiceRespVO::getCustomerName); query.selectAs(BpmOAContractDO::getCustomerName, BpmOAInvoiceRespVO::getCustomerName);
query.selectAs(BpmOAContractDO::getContractNo, BpmOAInvoiceRespVO::getContractNo);
query.leftJoin(BpmOAContractDO.class, "c", BpmOAContractDO::getId, BpmOAInvoiceDO::getContractId); query.leftJoin(BpmOAContractDO.class, "c", BpmOAContractDO::getId, BpmOAInvoiceDO::getContractId);
query.apply(Objects.nonNull(pageReqVO.getContractName()), "c.contract_name LIKE CONCAT('%', {0}, '%')", pageReqVO.getContractName()); query.apply(Objects.nonNull(pageReqVO.getContractName()), "c.contract_name LIKE CONCAT('%', {0}, '%')", pageReqVO.getContractName());
query.apply(Objects.nonNull(pageReqVO.getCustomerName()), "c.customer_name LIKE CONCAT('%', {0}, '%')", pageReqVO.getCustomerName()); query.apply(Objects.nonNull(pageReqVO.getCustomerName()), "c.customer_name LIKE CONCAT('%', {0}, '%')", pageReqVO.getCustomerName());
query.in(BpmOAInvoiceDO::getUserId, userIds); if ("my".equals(pageReqVO.getRelation())) {
query.eq(BpmOAContractDO::getUserId, userId);
}else if ("sub".equals(pageReqVO.getRelation())){
query.innerJoin("(" +
"\tSELECT DISTINCT\n" +
"\t\tu.id \n" +
"\tFROM\n" +
"\t\tsystem_users u\n" +
"\t\tINNER JOIN system_dept d ON d.leader_user_id = "+ userId +"\n" +
"\t\tINNER JOIN system_dept d1 ON d1.flag LIKE CONCAT( '%', d.id, '-' ) \n" +
"\t\tOR d1.flag LIKE CONCAT( '%-', d.id, '-%' ) \n" +
"\t\tOR d1.flag LIKE CONCAT( '-', d.id, '%' ) \n" +
"\tWHERE\n" +
"\t\tu.dept_id = d1.id \n" +
"\t\tAND u.STATUS = 0 \n" +
"\t) subordinate ON subordinate.id = t.user_id");
}
query.orderByDesc(BpmOAInvoiceDO::getCreateTime); query.orderByDesc(BpmOAInvoiceDO::getCreateTime);
return selectJoinPage(pageReqVO, BpmOAInvoiceRespVO.class, query); return selectJoinPage(pageReqVO, BpmOAInvoiceRespVO.class, query);

View File

@ -127,11 +127,4 @@ public interface BpmOAContractService {
* @param contractIds * @param contractIds
*/ */
void updateSettlementFlagByIds(List<Long> contractIds); void updateSettlementFlagByIds(List<Long> contractIds);
/**
* 获取下属和自己的合同列表
*
* @return
*/
List<BpmOAContractDO> getList(String relation, Integer contractType, String contractName);
} }

View File

@ -2,7 +2,9 @@ package cn.iocoder.yudao.module.bpm.service.oa;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.NumberUtil;
import cn.iocoder.yudao.framework.common.enums.ShopCommonEnum; import cn.iocoder.yudao.framework.common.enums.ShopCommonEnum;
import cn.iocoder.yudao.framework.common.exception.ErrorCode;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile; import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@ -16,7 +18,6 @@ import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAContractMapper;
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
import cn.iocoder.yudao.module.bpm.service.task.BpmHistoryProcessInstanceService; import cn.iocoder.yudao.module.bpm.service.task.BpmHistoryProcessInstanceService;
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
import cn.iocoder.yudao.module.hrm.api.crmbusiness.BusinessApi;
import cn.iocoder.yudao.module.hrm.api.crmcontract.ContractApi; import cn.iocoder.yudao.module.hrm.api.crmcontract.ContractApi;
import cn.iocoder.yudao.module.hrm.api.crmcontract.dto.CrmContractProductDTO; import cn.iocoder.yudao.module.hrm.api.crmcontract.dto.CrmContractProductDTO;
import cn.iocoder.yudao.module.hrm.api.crmcustomer.CrmCustomerApi; import cn.iocoder.yudao.module.hrm.api.crmcustomer.CrmCustomerApi;
@ -24,6 +25,8 @@ import cn.iocoder.yudao.module.hrm.api.crmcustomer.dto.CrmCustomerDTO;
import cn.iocoder.yudao.module.hrm.api.userlivetree.UserLiveTreeApi; import cn.iocoder.yudao.module.hrm.api.userlivetree.UserLiveTreeApi;
import cn.iocoder.yudao.module.product.api.storeproduct.StoreProductApi; import cn.iocoder.yudao.module.product.api.storeproduct.StoreProductApi;
import cn.iocoder.yudao.module.product.api.storeproductattrvalue.StoreProductAttrValueApi; import cn.iocoder.yudao.module.product.api.storeproductattrvalue.StoreProductAttrValueApi;
import cn.iocoder.yudao.module.product.api.storeproductattrvalue.dto.StoreProductAttrValueApiDTO;
import cn.iocoder.yudao.module.product.api.storeproductattrvalue.vo.StoreProductAttrValueApiVO;
import cn.iocoder.yudao.module.system.api.dept.DeptApi; import cn.iocoder.yudao.module.system.api.dept.DeptApi;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
@ -104,8 +107,7 @@ public class BpmOAContractServiceImpl extends BpmOABaseService implements BpmOAC
@Resource @Resource
private CrmCustomerApi customerApi; private CrmCustomerApi customerApi;
@Resource
private BusinessApi businessApi;
@Resource @Resource
private UserLiveTreeApi userLiveTreeApi; private UserLiveTreeApi userLiveTreeApi;
@ -204,15 +206,13 @@ public class BpmOAContractServiceImpl extends BpmOABaseService implements BpmOAC
ProcessInstance instance = processInstanceService.getProcessInstance(processInstanceId); ProcessInstance instance = processInstanceService.getProcessInstance(processInstanceId);
if (instance.isEnded()) { if (instance.isEnded()) {
// 审批通过后更新客户成交信息 // 审批通过后更新客户成交信息
customerApi.updateCustomerPurchaseTotal(new CrmCustomerDTO() customerApi.updateCustomerPurchaseTotal(new CrmCustomerDTO()
.setId(contract.getCustomerId()) .setId(contract.getCustomerId())
.setDealStatus(ShopCommonEnum.IS_STATUS_1.getValue()) .setDealStatus(ShopCommonEnum.IS_STATUS_1.getValue())
.setDealTime(LocalDateTime.now()) .setDealTime(LocalDateTime.now())
.setPurchaseTotal(contract.getContractMoney())); .setPurchaseTotal(contract.getContractMoney()));
// 审批通过后更新商机状态
businessApi.updateIsEnd(contract.getBusinessId(), ShopCommonEnum.IS_STATUS_1.getValue());
} }
} }
@ -354,27 +354,6 @@ public class BpmOAContractServiceImpl extends BpmOABaseService implements BpmOAC
.in(BpmOAContractDO::getId, contractIds)); .in(BpmOAContractDO::getId, contractIds));
} }
@Override
public List<BpmOAContractDO> getList(String relation, Integer contractType, String contractName) {
List<Long> userIds = new ArrayList<>();
Long id = getLoginUserId();
if ("my".equals(relation)) {
userIds.add(id);
} else if ("sub".equals(relation)) {
// 查询当前用户 所有下级用户编号
userIds.addAll(userLiveTreeApi.getItemIdsByUserId(id).getCheckedData());
}
userIds.add(id);
if (CollUtil.isNotEmpty(userIds)) {
return contractMapper.selectList(new LambdaQueryWrapperX<BpmOAContractDO>()
.in(BpmOAContractDO::getUserId, userIds)
.eqIfPresent(BpmOAContractDO::getContractType, contractType)
.likeIfPresent(BpmOAContractDO::getContractName, contractName)
.eq(BpmOAContractDO::getResult, BpmProcessInstanceResultEnum.APPROVE.getResult()));
}
return Collections.emptyList();
}
public static BigDecimal calculatePercentageChange(Object today, Object yesterday) { public static BigDecimal calculatePercentageChange(Object today, Object yesterday) {
// 转换为 BigDecimal 进行高精度计算 // 转换为 BigDecimal 进行高精度计算

View File

@ -14,7 +14,6 @@ import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAInvoiceDO;
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAInvoiceMapper; import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAInvoiceMapper;
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
import cn.iocoder.yudao.module.bpm.service.task.BpmHistoryProcessInstanceService; import cn.iocoder.yudao.module.bpm.service.task.BpmHistoryProcessInstanceService;
import cn.iocoder.yudao.module.hrm.api.userlivetree.UserLiveTreeApi;
import org.redisson.api.RLock; import org.redisson.api.RLock;
import org.redisson.api.RedissonClient; import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -23,7 +22,6 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -38,6 +36,7 @@ import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
* OA 开票申请 Service 实现类 * OA 开票申请 Service 实现类
* *
* @author 符溶馨 * @author 符溶馨
*/ */
@Service @Service
@Validated @Validated
@ -62,8 +61,6 @@ public class BpmOAInvoiceServiceImpl extends BpmOABaseService implements BpmOAIn
@Resource @Resource
private RedissonClient redissonClient; private RedissonClient redissonClient;
@Resource
private UserLiveTreeApi userLiveTreeApi;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@ -187,14 +184,8 @@ public class BpmOAInvoiceServiceImpl extends BpmOABaseService implements BpmOAIn
@Override @Override
public PageResult<BpmOAInvoiceRespVO> getInvoicePage(BpmOAInvoicePageReqVO pageReqVO) { public PageResult<BpmOAInvoiceRespVO> getInvoicePage(BpmOAInvoicePageReqVO pageReqVO) {
Long loginUserId = getLoginUserId();
List<Long> userIds = new ArrayList<>(); return invoiceMapper.selectPage(pageReqVO, getLoginUserId());
if ("my".equals(pageReqVO.getRelation())) {
userIds.add(loginUserId);
} else {
userIds = userLiveTreeApi.getItemIdsByUserId(loginUserId).getCheckedData();
}
return invoiceMapper.selectPage(pageReqVO, userIds);
} }
@Override @Override

View File

@ -35,7 +35,6 @@
WHERE WHERE
a.deleted = 0 a.deleted = 0
AND b.deleted = 0 AND b.deleted = 0
AND b.result = 2
<if test="pageReqVO.userId != null"> <if test="pageReqVO.userId != null">
AND b.user_id = #{pageReqVO.userId} AND b.user_id = #{pageReqVO.userId}
</if> </if>

View File

@ -28,9 +28,4 @@ public interface BusinessApi {
@Operation(summary = "获得商机所绑定产品信息") @Operation(summary = "获得商机所绑定产品信息")
@Parameter(name = "businessId", description = "商机编号", required = true) @Parameter(name = "businessId", description = "商机编号", required = true)
CommonResult<List<CrmBusinessProductDTO>> getBusinessProduct(@RequestParam("businessId") Long businessId); CommonResult<List<CrmBusinessProductDTO>> getBusinessProduct(@RequestParam("businessId") Long businessId);
@GetMapping(PREFIX + "/updateIsEnd")
@Operation(summary = "更新商机状态")
@Parameter(name = "id", description = "ID", required = true)
CommonResult<Boolean> updateIsEnd(@RequestParam("id") Long id, @RequestParam("isEnd") Integer isEnd);
} }

View File

@ -16,6 +16,5 @@ public interface ErrorCodeConstants {
ErrorCode ACHIEVEMENT_NOT_EXISTS = new ErrorCode(200009, "业绩目标不存在"); ErrorCode ACHIEVEMENT_NOT_EXISTS = new ErrorCode(200009, "业绩目标不存在");
ErrorCode NOT_EDITABLE_UNTIL_SALES_TARGET_HAS_BEEN_APPLIED = new ErrorCode(200010, "未申请销售目标前不可编辑"); ErrorCode NOT_EDITABLE_UNTIL_SALES_TARGET_HAS_BEEN_APPLIED = new ErrorCode(200010, "未申请销售目标前不可编辑");
ErrorCode THIS_CUSTOMER_ALREADY_EXISTS_IN_THE_SYSTEM_AND_CANNOT_BE_ENTERED_REPEATEDLY = new ErrorCode(200011, "系统已存在该客户,不可重复录入"); ErrorCode THIS_CUSTOMER_ALREADY_EXISTS_IN_THE_SYSTEM_AND_CANNOT_BE_ENTERED_REPEATEDLY = new ErrorCode(200011, "系统已存在该客户,不可重复录入");
ErrorCode THIS_CUSTOMER_ALREADY_EXISTS_IN_THE_SYSTEM_DO_YOU_WANT_TO_CONTINUE_ADDING = new ErrorCode(200012, "系统已存在该客户,是否继续添加");
} }

View File

@ -12,6 +12,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List; import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@ -37,10 +38,4 @@ public class BusinessApiImpl implements BusinessApi {
List<CrmBusinessProductDO> businessProductList = businessService.getBusinessProductListByBusinessId(businessId); List<CrmBusinessProductDO> businessProductList = businessService.getBusinessProductListByBusinessId(businessId);
return success(BeanUtils.toBean(businessProductList, CrmBusinessProductDTO.class)); return success(BeanUtils.toBean(businessProductList, CrmBusinessProductDTO.class));
} }
@Override
public CommonResult<Boolean> updateIsEnd(Long id, Integer isEnd) {
businessService.updateIsEnd(id, isEnd);
return success(true);
}
} }

View File

@ -12,13 +12,15 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -134,11 +136,11 @@ public class CrmCustomerController {
@Parameter(name = "averageType", description = "分配方式") @Parameter(name = "averageType", description = "分配方式")
}) })
public CommonResult<CustomerImportRespVO> importExcel(@RequestParam("file") MultipartFile file, public CommonResult<CustomerImportRespVO> importExcel(@RequestParam("file") MultipartFile file,
@RequestParam("deptId") String deptId,
@RequestParam("adminIds") String adminIds, @RequestParam("adminIds") String adminIds,
@RequestParam("averageType") Integer averageType, @RequestParam("averageType") Integer averageType) throws Exception {
@RequestParam(value = "repeatConfirmationFlag", defaultValue = "0") Integer repeatConfirmationFlag) throws Exception {
List<CrmCustomerImportVO> list = ExcelUtils.read(file, CrmCustomerImportVO.class); List<CrmCustomerImportVO> list = ExcelUtils.read(file, CrmCustomerImportVO.class);
return success(customerService.importList(list, adminIds, averageType, repeatConfirmationFlag)); return success(customerService.importList(list, deptId,adminIds,averageType));
} }
@PostMapping("/recover") @PostMapping("/recover")
@ -170,4 +172,6 @@ public class CrmCustomerController {
} }
} }

View File

@ -16,8 +16,6 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true) @ToString(callSuper = true)
public class CrmCustomerPageReqVO extends PageParam { public class CrmCustomerPageReqVO extends PageParam {
@Schema(description = "是否去重 0否 1是 默认否", example = "0")
private Integer distinctFlag = 0;
@Schema(description = "客户名称", example = "李四") @Schema(description = "客户名称", example = "李四")
private String name; private String name;

View File

@ -133,6 +133,4 @@ public class CrmCustomerRespVO {
@Schema(description = "负责人") @Schema(description = "负责人")
private String createName; private String createName;
@Schema(description = "相同客户自增排序")
private Integer sortNum;
} }

View File

@ -1,9 +1,9 @@
package cn.iocoder.yudao.module.crm.controller.admin.crmcustomer.vo; package cn.iocoder.yudao.module.crm.controller.admin.crmcustomer.vo;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import javax.validation.constraints.NotEmpty;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -108,7 +108,6 @@ public class CrmCustomerSaveReqVO {
@Schema(description = "跟进状态", example = "1") @Schema(description = "跟进状态", example = "1")
private Integer followStatus; private Integer followStatus;
@Schema(description = "重复客户依旧添加 0否 1是 默认否", example = "1")
private Integer repeatConfirmationFlag = 0;
} }

View File

@ -107,11 +107,11 @@ public class CrmCluesDO extends BaseDO {
private LocalDateTime collectTime; private LocalDateTime collectTime;
/** /**
* 跟进状态1|新客 * 跟进状态1|新客
* 2|待再次沟通 2|待再次沟通
* 3|有意向 3|有意向
* 4|已加微信 4|已加微信
* 5|转商机 5|转商机
* 0|无效 0|无效
*/ */
private Integer followStatus; private Integer followStatus;

View File

@ -78,10 +78,7 @@ public class CrmCustomerDO extends BaseDO {
* 负责人ID * 负责人ID
*/ */
private Long ownerUserId; private Long ownerUserId;
/**
* 相同客户自增排序
*/
private Integer sortNum;
/** /**
* 省份id * 省份id
*/ */

View File

@ -41,17 +41,7 @@ public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> {
.orderByDesc(CrmCustomerDO::getId)); .orderByDesc(CrmCustomerDO::getId));
} }
IPage<CrmCustomerRespVO> selectPageList2(@Param("page") IPage page, @Param("dto") CrmCustomerPageReqVO pageReqVO, @Param("ids") List<Long> ids); IPage<CrmCustomerRespVO> selectPageList(@Param("page") IPage page, @Param("dto") CrmCustomerPageReqVO pageReqVO, @Param("ids") List<Long> ids);
List<CustomerStatisticRespVO> selectStatistic(@Param("userIds") List<Long> userIds, @Param("createTime") LocalDateTime[] createTime); List<CustomerStatisticRespVO> selectStatistic(@Param("userIds") List<Long> userIds, @Param("createTime") LocalDateTime[] createTime);
IPage<CrmCustomerDO> selectPageList(@Param("page") IPage page, @Param("dto") CrmCustomerPageReqVO pageReqVO, @Param("ids") List<Long> ids);
/**
* 获取重复客户的所有负责人名称
*
* @param name
* @return
*/
List<String> getRepeatOwnerUserName(@Param("name") String name);
} }

View File

@ -10,11 +10,8 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.crmcontract.CrmContractDO;
import cn.iocoder.yudao.module.crm.dal.dataobject.crmcontractreceivables.CrmContractReceivablesDO; import cn.iocoder.yudao.module.crm.dal.dataobject.crmcontractreceivables.CrmContractReceivablesDO;
import cn.iocoder.yudao.module.crm.dal.dataobject.crmcustomer.CrmCustomerDO; import cn.iocoder.yudao.module.crm.dal.dataobject.crmcustomer.CrmCustomerDO;
import cn.iocoder.yudao.module.crm.dal.dataobject.crminvoice.CrmInvoiceDO; import cn.iocoder.yudao.module.crm.dal.dataobject.crminvoice.CrmInvoiceDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
@ -29,7 +26,6 @@ public interface CrmInvoiceMapper extends BaseMapperX<CrmInvoiceDO> {
default PageResult<CrmInvoiceRespVO> selectPage2(CrmInvoicePageReqVO reqVO, List<Long> ids) { default PageResult<CrmInvoiceRespVO> selectPage2(CrmInvoicePageReqVO reqVO, List<Long> ids) {
Long loginAdminId = SecurityFrameworkUtils.getLoginUserId(); Long loginAdminId = SecurityFrameworkUtils.getLoginUserId();
return selectJoinPage(reqVO, CrmInvoiceRespVO.class, new MPJLambdaWrapper<CrmInvoiceDO>() return selectJoinPage(reqVO, CrmInvoiceRespVO.class, new MPJLambdaWrapper<CrmInvoiceDO>()
.selectAll(CrmInvoiceDO.class) .selectAll(CrmInvoiceDO.class)
.selectAs(CrmCustomerDO::getName,CrmInvoiceRespVO::getCustomerName) .selectAs(CrmCustomerDO::getName,CrmInvoiceRespVO::getCustomerName)

View File

@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.crm.framework.rpc.config;
import cn.iocoder.yudao.module.bpm.api.oa.BpmOAContractApi; import cn.iocoder.yudao.module.bpm.api.oa.BpmOAContractApi;
import cn.iocoder.yudao.module.bpm.api.oa.BpmOAReceiptApi; import cn.iocoder.yudao.module.bpm.api.oa.BpmOAReceiptApi;
import cn.iocoder.yudao.module.bpm.api.oa.BpmOASalesPerformanceApi; import cn.iocoder.yudao.module.bpm.api.oa.BpmOASalesPerformanceApi;
import cn.iocoder.yudao.module.hrm.api.crmbusiness.BusinessApi;
import cn.iocoder.yudao.module.product.api.storeproduct.StoreProductApi; import cn.iocoder.yudao.module.product.api.storeproduct.StoreProductApi;
import cn.iocoder.yudao.module.product.api.storeproductattrvalue.StoreProductAttrValueApi; import cn.iocoder.yudao.module.product.api.storeproductattrvalue.StoreProductAttrValueApi;
import cn.iocoder.yudao.module.system.api.auth.AdminOauthUserOtherInfoApi; import cn.iocoder.yudao.module.system.api.auth.AdminOauthUserOtherInfoApi;
@ -20,6 +19,6 @@ import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@EnableFeignClients(clients = {DeptApi.class, DictDataApi.class, AdminUserApi.class, StoreProductApi.class, StoreProductAttrValueApi.class, SmsSendApi.class, MailSendApi.class, NoticeApi.class, @EnableFeignClients(clients = {DeptApi.class, DictDataApi.class, AdminUserApi.class, StoreProductApi.class, StoreProductAttrValueApi.class, SmsSendApi.class, MailSendApi.class, NoticeApi.class,
BpmOAContractApi.class, BpmOAReceiptApi.class, BpmOASalesPerformanceApi.class, AdminOauthUserOtherInfoApi.class, SubscribeMessageSendApi.class, RoleApi.class, BusinessApi.class}) BpmOAContractApi.class, BpmOAReceiptApi.class, BpmOASalesPerformanceApi.class, AdminOauthUserOtherInfoApi.class, SubscribeMessageSendApi.class, RoleApi.class})
public class RpcConfiguration { public class RpcConfiguration {
} }

View File

@ -1,28 +0,0 @@
package cn.iocoder.yudao.module.crm.job.salesperformance;
import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
import cn.iocoder.yudao.module.crm.service.crmclues.CrmCluesService;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
@Slf4j
public class FollowUpCluesJob {
// TODO: 2024/11/04 - 每天晚上2点 执行一次 判断三天内是否有跟进
@Resource
private CrmCluesService cluesService;
@XxlJob("followUpClues")
@TenantJob // --- 这个注解 会将租户列表拉出来 完了后逐个租户执行 定时任务需要注意
public ReturnT<String> execute() {
log.info("开始 线索跟进任务");
cluesService.autoConfirmJob();
log.info("结束 线索跟进任务");
return ReturnT.SUCCESS;
}
}

View File

@ -137,7 +137,7 @@ public class CustomerServiceImpl implements CustomerService {
pageResult1.getList().forEach(v -> { pageResult1.getList().forEach(v -> {
String per = "0.00"; String per = "0";
if (customerMap.get(v.getId()) == null) { if (customerMap.get(v.getId()) == null) {
v.setCustomerCount(0L); v.setCustomerCount(0L);
v.setSuccessCount(0L); v.setSuccessCount(0L);

View File

@ -72,12 +72,4 @@ public interface CrmBusinessService {
* @param transferVO * @param transferVO
*/ */
void transfer(@Valid CrmBusinessTransferVO transferVO); void transfer(@Valid CrmBusinessTransferVO transferVO);
/**
* 更新商机状态
*
* @param id
* @param isEnd
*/
void updateIsEnd(Long id, Integer isEnd);
} }

View File

@ -205,14 +205,6 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
} }
} }
@Override
public void updateIsEnd(Long id, Integer isEnd) {
CrmBusinessDO businessDO = new CrmBusinessDO();
businessDO.setId(id);
businessDO.setIsEnd(isEnd);
businessMapper.updateById(businessDO);
}
private void createBusinessProductList(Long businessId, List<CrmBusinessProductDO> list) { private void createBusinessProductList(Long businessId, List<CrmBusinessProductDO> list) {
list.forEach(o -> o.setBusinessId(businessId)); list.forEach(o -> o.setBusinessId(businessId));
businessProductMapper.insertBatch(list); businessProductMapper.insertBatch(list);

View File

@ -57,28 +57,24 @@ public interface CrmCluesService {
/** /**
* 放入线索池 * 放入线索池
*
* @param id * @param id
*/ */
void openClues(Long id); void openClues(Long id);
/** /**
* 领取线索 * 领取线索
*
* @param id * @param id
*/ */
void receiveClues(Long id); void receiveClues(Long id);
/** /**
* 线索转换成客户 * 线索转换成客户
*
* @param createReqVO * @param createReqVO
*/ */
void createCustomer(CrmCustomerSaveReqVO createReqVO); void createCustomer(CrmCustomerSaveReqVO createReqVO);
/** /**
* 线索导入 * 线索导入
*
* @param importUsers 导入文件 * @param importUsers 导入文件
* @param deptId 部门ID * @param deptId 部门ID
* @param adminIds 用户ID * @param adminIds 用户ID
@ -89,21 +85,14 @@ public interface CrmCluesService {
/** /**
* 转移线索 * 转移线索
*
* @param transferVO * @param transferVO
*/ */
void transfer(CrmCluesTransferVO transferVO); void transfer(CrmCluesTransferVO transferVO);
/** /**
* 获取指定用户的线索统计信息 * 获取指定用户的线索统计信息
*
* @param ownerUserIds 用户ID * @param ownerUserIds 用户ID
* @return 线索统计信息列表 * @return 线索统计信息列表
*/ */
List<CrmCluesStatisticsRespVO> getCluesStatisticsByUserIds(List<Long> ownerUserIds, LocalDateTime[] createTime); List<CrmCluesStatisticsRespVO> getCluesStatisticsByUserIds(List<Long> ownerUserIds, LocalDateTime[] createTime);
/**
* 线索跟进任务
*/
void autoConfirmJob();
} }

View File

@ -33,11 +33,15 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.CLUES_NOT_EXISTS; import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.CLUES_NOT_EXISTS;
import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.THIS_CUSTOMER_ALREADY_EXISTS_IN_THE_SYSTEM_AND_CANNOT_BE_ENTERED_REPEATEDLY;
/** /**
* 线索 Service 实现类 * 线索 Service 实现类
@ -158,10 +162,11 @@ public class CrmCluesServiceImpl implements CrmCluesService {
throw exception(new ErrorCode(202411160,"已经转化成客户!")); throw exception(new ErrorCode(202411160,"已经转化成客户!"));
} }
// 判断客户名称是否唯一 // 判断客户名称是否唯一
List<String> repeatOwnerUserNameList = customerMapper.getRepeatOwnerUserName(createReqVO.getName()); Long count = customerMapper.selectCount(new LambdaQueryWrapper<CrmCustomerDO>()
if (CollUtil.isNotEmpty(repeatOwnerUserNameList) && createReqVO.getRepeatConfirmationFlag() == 0) { .eq(CrmCustomerDO::getName, createReqVO.getName()));
List<String> items = repeatOwnerUserNameList.stream().distinct().collect(Collectors.toList()); if (count > 0) {
throw exception(new ErrorCode(200012, "该客户已被:" + String.join(",", items) + "添加过,是否继续添加?")); } throw exception(THIS_CUSTOMER_ALREADY_EXISTS_IN_THE_SYSTEM_AND_CANNOT_BE_ENTERED_REPEATEDLY);
}
createReqVO.setId(null); createReqVO.setId(null);
CrmCustomerDO customerDO = BeanUtils.toBean(createReqVO, CrmCustomerDO.class); CrmCustomerDO customerDO = BeanUtils.toBean(createReqVO, CrmCustomerDO.class);
customerDO.setOwnerUserId(SecurityFrameworkUtils.getLoginUserId()); customerDO.setOwnerUserId(SecurityFrameworkUtils.getLoginUserId());
@ -281,19 +286,4 @@ public class CrmCluesServiceImpl implements CrmCluesService {
return cluesMapper.selectStatisticsByUserIds(ownerUserIds, createTime); return cluesMapper.selectStatisticsByUserIds(ownerUserIds, createTime);
} }
@Override
public void autoConfirmJob() {
// 获取负责人不为0 并且跟进记录为3天以外的数据
List<CrmCluesDO> crmCluesDOS = cluesMapper.selectList(new LambdaQueryWrapper<CrmCluesDO>()
.ne(CrmCluesDO::getOwnerUserId, 0)
.in(CrmCluesDO::getStatus, Arrays.asList(CluesStatusEnum.STATUS_0.getValue(), CluesStatusEnum.STATUS_NEG_1.getValue()))
.le(CrmCluesDO::getFollowTime, LocalDateTime.now().minusDays(3)));
for (CrmCluesDO crmCluesDO : crmCluesDOS) {
crmCluesDO.setOwnerUserId(0L);
}
if (CollUtil.isNotEmpty(crmCluesDOS)) {
cluesMapper.updateBatch(crmCluesDOS);
}
}
} }

View File

@ -82,11 +82,12 @@ public interface CrmCustomerService {
/** /**
* 客户导入 * 客户导入
* @param importUsers 导入文件 * @param importUsers 导入文件
* @param deptId 部门ID
* @param adminIds 用户ID * @param adminIds 用户ID
* @param averageType 导入类型 * @param averageType 导入类型
* @return * @return
*/ */
CustomerImportRespVO importList(List<CrmCustomerImportVO> importUsers, String adminIds, Integer averageType,Integer repeatConfirmationFlag); CustomerImportRespVO importList(List<CrmCustomerImportVO> importUsers, String deptId, String adminIds, Integer averageType);
/** /**

View File

@ -32,6 +32,8 @@ import cn.iocoder.yudao.module.system.api.mail.dto.MailSendSingleReqDTO;
import cn.iocoder.yudao.module.system.api.sms.SmsSendApi; import cn.iocoder.yudao.module.system.api.sms.SmsSendApi;
import cn.iocoder.yudao.module.system.api.sms.dto.send.SmsSendSingleReqDTO; import cn.iocoder.yudao.module.system.api.sms.dto.send.SmsSendSingleReqDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserApiDTO;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserApiVO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -40,11 +42,15 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.CUSTOMER_NOT_EXISTS; import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.CUSTOMER_NOT_EXISTS;
import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.THIS_CUSTOMER_ALREADY_EXISTS_IN_THE_SYSTEM_AND_CANNOT_BE_ENTERED_REPEATEDLY;
/** /**
* 客户 Service 实现类 * 客户 Service 实现类
@ -82,18 +88,17 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long createCustomer(CrmCustomerSaveReqVO createReqVO) { public Long createCustomer(CrmCustomerSaveReqVO createReqVO) {
// 插入 // 插入
// 判断客户名称是否唯一 // 判断客户名称是否唯一
List<String> repeatOwnerUserNameList = customerMapper.getRepeatOwnerUserName(createReqVO.getName()); Long count = customerMapper.selectCount(new LambdaQueryWrapper<CrmCustomerDO>()
if (CollUtil.isNotEmpty(repeatOwnerUserNameList) && createReqVO.getRepeatConfirmationFlag() == 0) { .eq(CrmCustomerDO::getName, createReqVO.getName()));
List<String> items = repeatOwnerUserNameList.stream().distinct().collect(Collectors.toList()); if (count > 0) {
throw exception(new ErrorCode(200012, "该客户已被:" + String.join(",", items) + "添加过,是否继续添加?")); throw exception(THIS_CUSTOMER_ALREADY_EXISTS_IN_THE_SYSTEM_AND_CANNOT_BE_ENTERED_REPEATEDLY);
} }
CrmCustomerDO customer = BeanUtils.toBean(createReqVO, CrmCustomerDO.class); CrmCustomerDO customer = BeanUtils.toBean(createReqVO, CrmCustomerDO.class);
customer.setCollectTime(LocalDateTime.now()); customer.setCollectTime(LocalDateTime.now());
customer.setFollowTime(LocalDateTime.now()); customer.setFollowTime(LocalDateTime.now());
// 由于这里是 size 而排序是从0开始的 所以这里递增一个直接用size即可
customer.setSortNum(repeatOwnerUserNameList.size());
customer.setOwnerUserId(SecurityFrameworkUtils.getLoginUserId()); customer.setOwnerUserId(SecurityFrameworkUtils.getLoginUserId());
customerMapper.insert(customer); customerMapper.insert(customer);
@ -121,17 +126,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
public void updateCustomer(CrmCustomerSaveReqVO updateReqVO) { public void updateCustomer(CrmCustomerSaveReqVO updateReqVO) {
// 校验存在 // 校验存在
CrmCustomerDO customerDO = validateCustomerExists(updateReqVO.getId()); CrmCustomerDO customerDO = validateCustomerExists(updateReqVO.getId());
List<String> repeatOwnerUserNameList = customerMapper.getRepeatOwnerUserName(updateReqVO.getName());
if (!customerDO.getName().equals(updateReqVO.getName())
&& CollUtil.isNotEmpty(repeatOwnerUserNameList)
&& updateReqVO.getRepeatConfirmationFlag() == 0) {
List<String> items = repeatOwnerUserNameList.stream().distinct().collect(Collectors.toList());
throw exception(new ErrorCode(200012, "该客户已被:" + String.join(",", items) + "添加过,是否继续添加?")); }
// 更新 // 更新
CrmCustomerDO updateObj = BeanUtils.toBean(updateReqVO, CrmCustomerDO.class); CrmCustomerDO updateObj = BeanUtils.toBean(updateReqVO, CrmCustomerDO.class);
// 由于这里是 size 而排序是从0开始的 所以这里递增一个直接用size即可
updateObj.setSortNum(repeatOwnerUserNameList.size());
customerMapper.updateById(updateObj); customerMapper.updateById(updateObj);
//插入日志 //插入日志
@ -259,14 +255,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
if (CollUtil.isEmpty(ids)) { if (CollUtil.isEmpty(ids)) {
return PageResult.empty(); return PageResult.empty();
} }
IPage<CrmCustomerDO> pageResult;
if (pageReqVO.getDistinctFlag() == 0) {
return customerMapper.selectPage(pageReqVO, ids); return customerMapper.selectPage(pageReqVO, ids);
} else {
IPage mpPage = MyBatisUtils.buildPage(pageReqVO);
pageResult = customerMapper.selectPageList(mpPage, pageReqVO, ids);
}
return new PageResult<>(pageResult.getRecords(), pageResult.getTotal());
} }
@ -287,47 +276,43 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
return PageResult.empty(); return PageResult.empty();
} }
IPage mpPage = MyBatisUtils.buildPage(pageReqVO); IPage mpPage = MyBatisUtils.buildPage(pageReqVO);
IPage<CrmCustomerRespVO> pageResult = customerMapper.selectPageList2(mpPage, pageReqVO, ids); IPage<CrmCustomerRespVO> pageResult = customerMapper.selectPageList(mpPage, pageReqVO, ids);
return new PageResult<>(pageResult.getRecords(), pageResult.getTotal()); return new PageResult<>(pageResult.getRecords(), pageResult.getTotal());
} }
@Override @Override
public CustomerImportRespVO importList(List<CrmCustomerImportVO> importUsers, String adminIds, public CustomerImportRespVO importList(List<CrmCustomerImportVO> importUsers, String deptId, String adminIds,
Integer averageType, Integer repeatConfirmationFlag) { Integer averageType) {
CustomerImportRespVO respVO = CustomerImportRespVO.builder().createNames(new ArrayList<>()) CustomerImportRespVO respVO = CustomerImportRespVO.builder().createNames(new ArrayList<>())
.failureNames(new LinkedHashMap<>()).build(); .failureNames(new LinkedHashMap<>()).build();
//处理客户归属方案 //处理客户归属方案
//如果只选择了机构没有选择用户直接获取当前部门下的用户 //如果只选择了机构没有选择用户直接获取当前部门下的用户
List<Long> userList = new ArrayList<>(); List<Long> userList = new ArrayList<>();
if (StrUtil.isNotEmpty(adminIds)) { if (StrUtil.isNotEmpty(deptId) && StrUtil.isEmpty(adminIds)) {
List<AdminUserApiVO> adminUserDOS = adminUserApi.getUserList(new AdminUserApiDTO().setDeptId(Long.valueOf(deptId)).setNextDept(1)).getCheckedData();
userList = adminUserDOS.stream().map(AdminUserApiVO::getId).collect(Collectors.toList());
if (userList.isEmpty()) {
throw exception(new ErrorCode(202409080, "当前部门下没有用户,清重新选择"));
}
} else {
userList = StrUtil.split(adminIds, ",").stream().map(Long::parseLong).collect(Collectors.toList()); userList = StrUtil.split(adminIds, ",").stream().map(Long::parseLong).collect(Collectors.toList());
} }
int i = 1; int i = 1;
int j = 0; int j = 0;
int adminCount = userList.size(); int adminCount = userList.size();
List<CrmCustomerDO> customerList = new ArrayList<>();
// -- 查询重复
Map<String, Integer> map = new HashMap<>();
if (repeatConfirmationFlag == 0) {
List<String> nameList = importUsers.stream().map(CrmCustomerImportVO::getName).filter(StrUtil::isNotEmpty).distinct().collect(Collectors.toList());
if (CollUtil.isNotEmpty(nameList)) {
List<CrmCustomerDO> crmCustomerDOS = customerMapper.selectList(new LambdaQueryWrapper<CrmCustomerDO>()
.in(CrmCustomerDO::getName, nameList));
map = crmCustomerDOS.stream().collect(Collectors.groupingBy(CrmCustomerDO::getName, Collectors.summingInt(e -> 1)));
}
}
for (CrmCustomerImportVO importVO : importUsers) { for (CrmCustomerImportVO importVO : importUsers) {
if (StrUtil.isEmpty(importVO.getName())) { if (StrUtil.isEmpty(importVO.getName())) {
respVO.getFailureNames().put("" + i + "行:", "客户名称为空,已经被过滤掉"); respVO.getFailureNames().put("" + i + "行:", "客户名称为空,已经被过滤掉");
continue; continue;
} }
if (repeatConfirmationFlag == 0) { Long count = customerMapper.selectCount(new LambdaQueryWrapper<CrmCustomerDO>()
Integer num = map.get(importVO.getName()); .eq(CrmCustomerDO::getName, importVO.getName()));
if (num != null && num > 1) { if (count > 0) {
respVO.getFailureNames().put("" + i + "行:", "客户名称重复,已经被过滤掉"); respVO.getFailureNames().put("" + i + "行:", "客户名称已经存在,已经被过滤掉");
continue; continue;
} }
}
CrmCustomerDO customer = BeanUtils.toBean(importVO, CrmCustomerDO.class); CrmCustomerDO customer = BeanUtils.toBean(importVO, CrmCustomerDO.class);
Long adminId = 0L; Long adminId = 0L;
if (ShopCommonEnum.AVG_1.getValue().equals(averageType)) { if (ShopCommonEnum.AVG_1.getValue().equals(averageType)) {
@ -344,22 +329,11 @@ public class CrmCustomerServiceImpl implements CrmCustomerService {
int num = random.nextInt(adminCount); int num = random.nextInt(adminCount);
adminId = userList.get(num); adminId = userList.get(num);
} }
Integer num = map.get(importVO.getName());
if (num != null && num > 1) {
map.put(importVO.getName(), num + 1);
} else if (num == null) {
num = 0;
map.put(importVO.getName(), num);
}
customer.setSortNum(num);
customer.setOwnerUserId(adminId); customer.setOwnerUserId(adminId);
customerList.add(customer); customerMapper.insert(customer);
respVO.getCreateNames().add("" + i + "行:导入成功用户名->" + importVO.getName()); respVO.getCreateNames().add("" + i + "行:导入成功用户名->" + importVO.getName());
i++; i++;
} }
if (!customerList.isEmpty()) {
customerMapper.insertBatch(customerList);
}
return respVO; return respVO;
} }

View File

@ -92,6 +92,9 @@ public class CrmCustomerContactsServiceImpl implements CrmCustomerContactsServic
} else if (RelationEnum.SUB.getValue().equals(pageReqVO.getRelation())) { } else if (RelationEnum.SUB.getValue().equals(pageReqVO.getRelation())) {
ids = userLiveTreeService.getItemIdsByUserId(adminId); ids = userLiveTreeService.getItemIdsByUserId(adminId);
} }
if (CollUtil.isEmpty(ids)){
return PageResult.empty();
}
IPage mpPage = MyBatisUtils.buildPage(pageReqVO); IPage mpPage = MyBatisUtils.buildPage(pageReqVO);
IPage<CrmCustomerContactsRespVO> pageResult = customerContactsMapper.selectPageList(mpPage, pageReqVO, ids); IPage<CrmCustomerContactsRespVO> pageResult = customerContactsMapper.selectPageList(mpPage, pageReqVO, ids);
return new PageResult<>(pageResult.getRecords(), pageResult.getTotal()); return new PageResult<>(pageResult.getRecords(), pageResult.getTotal());

View File

@ -6,7 +6,6 @@ import cn.iocoder.yudao.framework.common.enums.ShopCommonEnum;
import cn.iocoder.yudao.framework.common.exception.ErrorCode; import cn.iocoder.yudao.framework.common.exception.ErrorCode;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.crm.controller.admin.crmcontract.vo.CheckInfoVO; import cn.iocoder.yudao.module.crm.controller.admin.crmcontract.vo.CheckInfoVO;
import cn.iocoder.yudao.module.crm.controller.admin.crminvoice.vo.CrmInvoicePageReqVO; import cn.iocoder.yudao.module.crm.controller.admin.crminvoice.vo.CrmInvoicePageReqVO;
@ -29,7 +28,6 @@ import cn.iocoder.yudao.module.hrm.enums.*;
import cn.iocoder.yudao.module.system.api.mail.MailSendApi; import cn.iocoder.yudao.module.system.api.mail.MailSendApi;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock; import org.redisson.api.RLock;
import org.redisson.api.RedissonClient; import org.redisson.api.RedissonClient;

View File

@ -18,7 +18,6 @@
left join system_users b ON b.id = a.owner_user_id left join system_users b ON b.id = a.owner_user_id
<where> <where>
a.deleted = 0 a.deleted = 0
and a.status != 1
<if test="dto.name != null and dto.name != ''"> <if test="dto.name != null and dto.name != ''">
and a.name like concat('%', #{dto.name}, '%') and a.name like concat('%', #{dto.name}, '%')
</if> </if>

View File

@ -9,7 +9,7 @@
文档可见https://www.yixiang.co/MyBatis/x-plugins/ 文档可见https://www.yixiang.co/MyBatis/x-plugins/
--> -->
<select id="selectPageList2" <select id="selectPageList"
resultType="cn.iocoder.yudao.module.crm.controller.admin.crmcustomer.vo.CrmCustomerRespVO"> resultType="cn.iocoder.yudao.module.crm.controller.admin.crmcustomer.vo.CrmCustomerRespVO">
select select
a.*, a.*,
@ -74,65 +74,4 @@
</if> </if>
GROUP BY owner_user_id GROUP BY owner_user_id
</select> </select>
<select id="selectPageList"
resultType="cn.iocoder.yudao.module.crm.dal.dataobject.crmcustomer.CrmCustomerDO">
SELECT * from (
select
a.*,
ROW_NUMBER() OVER (PARTITION BY name ORDER BY sort_num DESC, id DESC) AS rn
from crm_customer as a
<where>
a.deleted = 0
<if test="ids != null and ids.size() > 0">
and a.owner_user_id in
<foreach item="ownerUserId" collection="ids" separator="," open="(" close=")" index="">
#{ownerUserId}
</foreach>
</if>
<if test="dto.name != null and dto.name != ''">
and a.name like concat('%', #{dto.name}, '%')
</if>
<if test="dto.mobile != null and dto.mobile != ''">
and a.mobile = #{dto.mobile}
</if>
<if test="dto.telephone != null and dto.telephone != ''">
and a.telephone = #{dto.telephone}
</if>
<if test="dto.dealStatus != null">
and a.deal_status = #{dto.dealStatus}
</if>
<if test="dto.level != null">
and a.level = #{dto.level}
</if>
<if test="dto.industry != null">
and a.industry = #{dto.industry}
</if>
<if test="dto.source != null">
and a.source = #{dto.source}
</if>
<if test="dto.weixin != null and dto.weixin != ''">
and a.weixin = #{dto.weixin}
</if>
<if test="dto.qq != null and dto.qq != ''">
and a.qq = #{dto.qq}
</if>
<if test="dto.qq != null and dto.qq != ''">
and a.qq = #{dto.qq}
</if>
<if test="dto.followStatus != null">
and a.follow_status = #{dto.followStatus}
</if>
</where>
order by a.id desc
) AS ranked
where rn = 1;
</select>
<select id="getRepeatOwnerUserName" resultType="java.lang.String">
select t1.nickname
from crm_customer as a
left join system_users as t1 on a.owner_user_id = t1.id
where a.deleted = 0
and t1.deleted = 0
and a.name = #{name}
</select>
</mapper> </mapper>

View File

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.crm.dal.mysql.crminvoice.CrmInvoiceMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.yixiang.co/MyBatis/x-plugins/
-->
</mapper>

View File

@ -667,9 +667,9 @@ public class StoreProductServiceImpl extends ServiceImpl<StoreProductMapper, Sto
.reduce(Integer::sum) .reduce(Integer::sum)
.orElse(0); .orElse(0);
// if (stock <= 0) { if (stock <= 0) {
// throw exception(STORE_PRODUCT_STOCK_ERROR); throw exception(STORE_PRODUCT_STOCK_ERROR);
// } }
return ProductResultDto.builder() return ProductResultDto.builder()
.minPrice(minPrice) .minPrice(minPrice)

View File

@ -2,8 +2,10 @@ package cn.iocoder.yudao.module.system.controller.admin.worklog;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission; import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserRespVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserRespVO;
@ -19,20 +21,10 @@ import cn.iocoder.yudao.module.system.service.user.AdminUserService;
import cn.iocoder.yudao.module.system.service.worklog.LogInstanceService; import cn.iocoder.yudao.module.system.service.worklog.LogInstanceService;
import cn.iocoder.yudao.module.system.service.worklog.LogReadService; import cn.iocoder.yudao.module.system.service.worklog.LogReadService;
import cn.iocoder.yudao.module.system.service.worklog.LogUseService; import cn.iocoder.yudao.module.system.service.worklog.LogUseService;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.converters.longconverter.LongStringConverter;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.merge.OnceAbsoluteMergeStrategy;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -41,9 +33,10 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import java.io.IOException; import java.io.IOException;
import java.net.URLEncoder; import java.util.ArrayList;
import java.nio.charset.StandardCharsets; import java.util.HashMap;
import java.util.*; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@ -313,69 +306,12 @@ public class LogInstanceController {
@Operation(summary = "导出日志实例 Excel") @Operation(summary = "导出日志实例 Excel")
@PreAuthorize("@ss.hasPermission('system:log-instance:export')") @PreAuthorize("@ss.hasPermission('system:log-instance:export')")
@OperateLog(type = EXPORT) @OperateLog(type = EXPORT)
public void exportLogInstanceExcel(@Valid LogExportVO reqVO, public void exportLogInstanceExcel(@Valid LogInstancePageReqVO pageReqVO,
HttpServletResponse response) throws IOException { HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<LogExportExcelVO> list = logInstanceService.getLogInstanceExport(reqVO); List<LogInstanceRespVO> list = logInstanceService.getLogInstancePage(pageReqVO, null).getRecords();
// 导出 Excel
ExcelUtils.write(response, "日志实例的拓展.xls", "数据", LogInstanceRespVO.class,
// 输出excel BeanUtils.toBean(list, LogInstanceRespVO.class));
ExcelWriterBuilder writer = EasyExcel.write(response.getOutputStream(), LogExportExcelVO.class);
List<OnceAbsoluteMergeStrategy> strategies = getMergeStrategy(list);
strategies.forEach(writer::registerWriteHandler);
writer.autoCloseStream(false); // 不要自动关闭交给 Servlet 自己处理
writer.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()); // 基于 column 长度自动适配最大 255 宽度
writer.registerWriteHandler(new HorizontalCellStyleStrategy(getHeadStyle(), getContentStyle()));
writer.registerConverter(new LongStringConverter()); // 避免 Long 类型丢失精度
writer.excelType(ExcelTypeEnum.XLS);
writer.sheet("数据").doWrite(list);
// 设置 header contentType写在最后的原因是避免报错时响应 contentType 已经被修改了
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("日志实例的拓展.xls", StandardCharsets.UTF_8.name()));
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
// // 导出 Excel
// ExcelUtils.write(response, "日志实例的拓展.xls", "数据", LogExportExcelVO.class,
// list);
}
public static List<OnceAbsoluteMergeStrategy> getMergeStrategy(List<LogExportExcelVO> dataList) {
List<OnceAbsoluteMergeStrategy> strategies = new ArrayList<>();
List<Integer> mergeCols = Arrays.asList(0, 1); // 需要合并的列索引
// 遍历数据生成合并区间
for (int i = 0; i < dataList.size(); i++) {
if (i > 0 && dataList.get(i).getNickname().equals(dataList.get(i - 1).getNickname()) && dataList.get(i).getTime().equals(dataList.get(i - 1).getTime())) {
continue;
}
int startRow = i + 1;
while (i < dataList.size() - 1 && dataList.get(i).getNickname().equals(dataList.get(i + 1).getNickname()) && dataList.get(i).getTime().equals(dataList.get(i + 1).getTime())) {
i++;
}
for (int col : mergeCols) {
strategies.add(new OnceAbsoluteMergeStrategy(startRow, i + 1, col, col));
}
}
return strategies;
}
// 表头样式居中
public static WriteCellStyle getHeadStyle() {
WriteCellStyle headStyle = new WriteCellStyle();
headStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
headStyle.setVerticalAlignment(VerticalAlignment.CENTER);
return headStyle;
}
// 内容样式居中
public static WriteCellStyle getContentStyle() {
WriteCellStyle contentStyle = new WriteCellStyle();
contentStyle.setWrapped(true); // 启用自动换行
contentStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
contentStyle.setVerticalAlignment(VerticalAlignment.CENTER);
return contentStyle;
} }
} }

View File

@ -1,31 +0,0 @@
package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* 日志Excel 导出 VO
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = false) // 设置 chain = false避免用户导入有问题
public class LogExportExcelVO {
@ExcelProperty("用户名称")
private String nickname;
@ExcelProperty("日期")
private String time;
@ExcelProperty("标题")
private String title;
@ExcelProperty("内容")
private String content;
}

View File

@ -1,18 +0,0 @@
package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 日志实例导出 Response VO")
@Data
public class LogExportVO {
@Schema(description = "部门编号")
private Long companyDeptId;
@Schema(description = "日志模版编号")
private Long formId;
@Schema(description = "时间范围")
private String[] time;
}

View File

@ -41,7 +41,6 @@ import cn.iocoder.yudao.module.system.service.dept.DeptService;
import cn.iocoder.yudao.module.system.service.dept.PostService; import cn.iocoder.yudao.module.system.service.dept.PostService;
import cn.iocoder.yudao.module.system.service.permission.PermissionService; import cn.iocoder.yudao.module.system.service.permission.PermissionService;
import cn.iocoder.yudao.module.system.service.tenant.TenantService; import cn.iocoder.yudao.module.system.service.tenant.TenantService;
import cn.iocoder.yudao.module.system.service.worklog.LogUseService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
@ -101,9 +100,6 @@ public class AdminUserServiceImpl implements AdminUserService {
@Resource @Resource
private FileApi fileApi; private FileApi fileApi;
@Resource
private LogUseService logUseService;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void updateUserOpenId(Long id, String openId) { public void updateUserOpenId(Long id, String openId) {
@ -159,14 +155,9 @@ public class AdminUserServiceImpl implements AdminUserService {
userMapper.updateById(updateObj); userMapper.updateById(updateObj);
// 更新岗位 // 更新岗位
updateUserPost(updateReqVO, updateObj); updateUserPost(updateReqVO, updateObj);
// 更新日志使用人信息
logUseService.updateUseDeptId(updateObj.getId(), updateObj.getDeptId());
} }
private void updateUserPost(UserSaveReqVO reqVO, AdminUserDO updateObj) { private void updateUserPost(UserSaveReqVO reqVO, AdminUserDO updateObj) {
Long userId = reqVO.getId(); Long userId = reqVO.getId();
Set<Long> dbPostIds = convertSet(userPostMapper.selectListByUserId(userId), UserPostDO::getPostId); Set<Long> dbPostIds = convertSet(userPostMapper.selectListByUserId(userId), UserPostDO::getPostId);
// 计算新增和删除的岗位编号 // 计算新增和删除的岗位编号

View File

@ -92,11 +92,4 @@ public interface LogInstanceService {
* @return * @return
*/ */
LogInstanceNextOrUpVO getNextOrUp(LogInstancePageReqVO dto, Long id, Integer pagingType); LogInstanceNextOrUpVO getNextOrUp(LogInstancePageReqVO dto, Long id, Integer pagingType);
/**
* 获取日志导出列表
* @param reqVO 请求参数
* @return 日志列表
*/
List<LogExportExcelVO> getLogInstanceExport(LogExportVO reqVO);
} }

View File

@ -1,13 +1,11 @@
package cn.iocoder.yudao.module.system.service.worklog; package cn.iocoder.yudao.module.system.service.worklog;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO; import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptRespVO;
import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.*; import cn.iocoder.yudao.module.system.controller.admin.worklog.vo.loginstance.*;
import cn.iocoder.yudao.module.system.convert.worklog.LogInstanceConvert; import cn.iocoder.yudao.module.system.convert.worklog.LogInstanceConvert;
@ -142,8 +140,7 @@ public class LogInstanceServiceImpl implements LogInstanceService {
List<LogReadUserRespDTO> respDTOS = logInstanceMapper.selectRaedUser(userId, adminUserDO.getDeptId()); List<LogReadUserRespDTO> respDTOS = logInstanceMapper.selectRaedUser(userId, adminUserDO.getDeptId());
//特殊情况 日志发起人为研发部时 手动添加查看者 //特殊情况 日志发起人为研发部时 手动添加查看者
List<Long> deptIds = convertList(deptService.getChildDept(128L), DeptDO::getId); if (adminUserDO.getDeptId() == 128L && adminUserDO.getId() != 126L) {
if (deptIds.contains(adminUserDO.getDeptId()) && adminUserDO.getId() != 126L) {
LogReadUserRespDTO dto = new LogReadUserRespDTO(); LogReadUserRespDTO dto = new LogReadUserRespDTO();
dto.setUserId(126L); dto.setUserId(126L);
@ -289,7 +286,7 @@ public class LogInstanceServiceImpl implements LogInstanceService {
item.setAvatar(userDO.getAvatar()); item.setAvatar(userDO.getAvatar());
} }
//设置日志内部分an //设置日志内部分
LogFormDO logFormDO = formMap.get(item.getFormId()); LogFormDO logFormDO = formMap.get(item.getFormId());
List<String> fields = logFormDO.getFields(); List<String> fields = logFormDO.getFields();
StringBuilder workLogContent = new StringBuilder(); StringBuilder workLogContent = new StringBuilder();
@ -448,73 +445,6 @@ public class LogInstanceServiceImpl implements LogInstanceService {
return vo; return vo;
} }
@Override
public List<LogExportExcelVO> getLogInstanceExport(LogExportVO reqVO) {
// 获取所有部门及下级部门信息
List<DeptDO> deptDOS = deptService.getChildDept(reqVO.getCompanyDeptId());
List<LogInstanceDO> list = logInstanceMapper.selectList(new LambdaQueryWrapperX<LogInstanceDO>()
.inIfPresent(LogInstanceDO::getDeptId, convertList(deptDOS, DeptDO::getId))
.eqIfPresent(LogInstanceDO::getFormId, reqVO.getFormId())
.betweenIfPresent(LogInstanceDO::getTime, reqVO.getTime()));
List<LogExportExcelVO> result = new ArrayList<>();
if (CollUtil.isNotEmpty(list)) {
//模版ids过滤
Set<Long> workFormIds = list.stream().map(LogInstanceDO::getFormId).collect(Collectors.toSet());
// 查询模版列表
List<LogFormDO> formList = logFormService.getFormList(workFormIds);
Map<Long, LogFormDO> formMap = formList.stream().collect(Collectors.toMap(LogFormDO::getId, item -> item));
//查询用户信息列表
Set<Long> userIds = list.stream().map(LogInstanceDO::getStartUserId).collect(Collectors.toSet());
Map<Long, AdminUserDO> userMap = adminUserService.getUserMap(userIds);
//遍历
for (LogInstanceDO item : list) {
//设置日志内部分an
LogFormDO logFormDO = formMap.get(item.getFormId());
List<String> fields = logFormDO.getFields();
if (!item.getFormVariables().isEmpty()) {
JSONObject workLogContentJson = new JSONObject(item.getFormVariables());
for (String fieldItem : fields) {
JSONObject fieldJson = new JSONObject(fieldItem);
if ("upload".equals(fieldJson.getStr("type"))) {
continue;
}
String fieldStr = fieldJson.getStr("field");
String title = fieldJson.getStr("title");
if (fieldStr == null || title == null) {
continue;
}
String field = workLogContentJson.getStr(fieldStr);
LogExportExcelVO logExportExcelVO = new LogExportExcelVO();
// 设置时间
logExportExcelVO.setTime(item.getTime());
//设置发起人用户名称和头像
AdminUserDO userDO = userMap.get(item.getStartUserId());
if (userDO != null) {
logExportExcelVO.setNickname(userDO.getNickname());
}
logExportExcelVO.setTitle(title);
logExportExcelVO.setContent(field);
result.add(logExportExcelVO);
}
}
}
}
return result;
}
@Override @Override
public List<LogInstanceDO> getNeedWriteLogInstanceByTimeRange(Long fromId, List<String> time, Long userId) { public List<LogInstanceDO> getNeedWriteLogInstanceByTimeRange(Long fromId, List<String> time, Long userId) {
return logInstanceMapper.selectList(new LambdaQueryWrapper<LogInstanceDO>() return logInstanceMapper.selectList(new LambdaQueryWrapper<LogInstanceDO>()

View File

@ -10,7 +10,6 @@ import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogFormMapper;
import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogRuleMapper; import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogRuleMapper;
import cn.iocoder.yudao.module.system.service.worklog.dto.LogUseSaveReqDTO; import cn.iocoder.yudao.module.system.service.worklog.dto.LogUseSaveReqDTO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -133,4 +132,5 @@ public class LogRuleServiceImpl implements LogRuleService {
return logRuleMapper.selectOne(new LambdaQueryWrapper<LogRuleDO>() return logRuleMapper.selectOne(new LambdaQueryWrapper<LogRuleDO>()
.eq(LogRuleDO::getFormId, formId)); .eq(LogRuleDO::getFormId, formId));
} }
} }

View File

@ -74,11 +74,4 @@ public interface LogUseService {
* @return 模版列表 * @return 模版列表
*/ */
List<Long> getFormIdList(List<Long> deptIds); List<Long> getFormIdList(List<Long> deptIds);
/**
* 更新日志规则使用部门id
* @param userId 用户编号
* @param deptId 部门编号
*/
void updateUseDeptId(Long userId, Long deptId);
} }

View File

@ -5,7 +5,6 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogUseDO; import cn.iocoder.yudao.module.system.dal.dataobject.worklog.LogUseDO;
import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogUseMapper; import cn.iocoder.yudao.module.system.dal.mysql.worklog.LogUseMapper;
import cn.iocoder.yudao.module.system.service.worklog.dto.LogUseSaveReqDTO; import cn.iocoder.yudao.module.system.service.worklog.dto.LogUseSaveReqDTO;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -107,12 +106,4 @@ public class LogUseServiceImpl implements LogUseService {
List<LogUseDO> logUseDOS = logUseMapper.selectList(LogUseDO::getUseUserDept, deptIds); List<LogUseDO> logUseDOS = logUseMapper.selectList(LogUseDO::getUseUserDept, deptIds);
return logUseDOS.stream().map(LogUseDO::getFormId).distinct().collect(Collectors.toList()); return logUseDOS.stream().map(LogUseDO::getFormId).distinct().collect(Collectors.toList());
} }
@Override
public void updateUseDeptId(Long userId, Long deptId) {
logUseMapper.update(null, new LambdaUpdateWrapper<LogUseDO>()
.set(LogUseDO::getUseUserDept, deptId)
.eq(LogUseDO::getUseUserId, userId));
}
} }

View File

@ -116,8 +116,8 @@ public class StaffServiceImpl implements StaffService {
}); });
vo.setTotal(dos.size()); vo.setTotal(dos.size());
vo.setMaleTotal((int) dos.stream().filter(a -> a.getSex() != null && a.getSex() == 0).count()); vo.setMaleTotal((int) dos.stream().filter(a -> a.getSex() == 0).count());
vo.setFemaleTotal((int) dos.stream().filter(a -> a.getSex() != null && a.getSex() == 1).count()); vo.setFemaleTotal((int) dos.stream().filter(a -> a.getSex() == 1).count());
vo.setStaffInfos(dos); vo.setStaffInfos(dos);
return vo; return vo;
} }