From 10aa754afcb5dcacf043ce92e2fba180028b197d Mon Sep 17 00:00:00 2001 From: Yangk Date: Thu, 25 Dec 2025 10:48:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(oa):=20=E5=AE=9E=E7=8E=B0=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E5=8D=95=E6=8D=AE=E5=90=8E=E7=AB=AF=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E7=94=9F=E6=88=90=E7=BC=96=E5=8F=B7=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在出差申请服务中集成RemoteCodeRuleService远程服务 - 在售后管理服务中集成RemoteCodeRuleService远程服务 - 在工时填报服务中集成RemoteCodeRuleService远程服务 --- .../impl/CrmBusinessTripApplyServiceImpl.java | 9 + .../oa/erp/domain/bo/ErpAfterSalesBo.java | 2 +- .../oa/erp/domain/bo/ErpTimesheetInfoBo.java | 2 - .../impl/ErpAfterSalesServiceImpl.java | 167 ++++++++++-------- .../impl/ErpContractInfoServiceImpl.java | 48 +++-- .../impl/ErpTimesheetInfoServiceImpl.java | 129 +++++++------- 6 files changed, 202 insertions(+), 155 deletions(-) diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/service/impl/CrmBusinessTripApplyServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/service/impl/CrmBusinessTripApplyServiceImpl.java index fe1cc37b..0cc84e1e 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/service/impl/CrmBusinessTripApplyServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/crm/service/impl/CrmBusinessTripApplyServiceImpl.java @@ -26,6 +26,7 @@ import org.apache.dubbo.config.annotation.DubboReference; import org.apache.seata.spring.annotation.GlobalTransactional; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.exception.ServiceException; +import org.dromara.system.api.RemoteCodeRuleService; import org.dromara.workflow.api.RemoteWorkflowService; import org.dromara.workflow.api.domain.RemoteStartProcess; import org.dromara.workflow.api.event.ProcessEvent; @@ -50,6 +51,9 @@ public class CrmBusinessTripApplyServiceImpl implements ICrmBusinessTripApplySer @DubboReference(timeout = 30000) private RemoteWorkflowService remoteWorkflowService; + @DubboReference() + private RemoteCodeRuleService remoteCodeRuleService; + /** * 查询出差申请 * @@ -144,6 +148,11 @@ public class CrmBusinessTripApplyServiceImpl implements ICrmBusinessTripApplySer public Boolean insertByBo(CrmBusinessTripApplyBo bo) { CrmBusinessTripApply add = MapstructUtils.convert(bo, CrmBusinessTripApply.class); validEntityBeforeSave(add); + // 自动生成申请单号 + if (StringUtils.isBlank(add.getApplyCode())) { + String applyCode = remoteCodeRuleService.selectCodeRuleCode("1017"); + add.setApplyCode(applyCode); + } boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setTripId(add.getTripId()); diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpAfterSalesBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpAfterSalesBo.java index 741487cd..565caa9f 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpAfterSalesBo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpAfterSalesBo.java @@ -106,7 +106,7 @@ public class ErpAfterSalesBo extends BaseEntity { /** * 客户干系人ID(关联客户联系人表) */ - @NotBlank(message = "客户干系人ID(关联客户联系人表)不能为空", groups = { AddGroup.class, EditGroup.class }) +// @NotBlank(message = "客户干系人ID(关联客户联系人表)不能为空", groups = { AddGroup.class, EditGroup.class }) private String stakeholderId; /** diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpTimesheetInfoBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpTimesheetInfoBo.java index 0c32eeb1..0243988e 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpTimesheetInfoBo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpTimesheetInfoBo.java @@ -37,7 +37,6 @@ public class ErpTimesheetInfoBo extends BaseEntity { /** * 工时填报编号 */ - @NotBlank(message = "工时填报编号不能为空", groups = { AddGroup.class, EditGroup.class }) private String timesheetCode; /** @@ -118,5 +117,4 @@ public class ErpTimesheetInfoBo extends BaseEntity { */ private RemoteFlowInstanceBizExt bizExt; - } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpAfterSalesServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpAfterSalesServiceImpl.java index 47876801..bcf2199a 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpAfterSalesServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpAfterSalesServiceImpl.java @@ -9,9 +9,9 @@ import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; - import org.dromara.common.mybatis.core.page.TableDataInfo; - import org.dromara.common.mybatis.core.page.PageQuery; - import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -25,6 +25,7 @@ import org.dromara.oa.erp.domain.vo.ErpAfterSalesLaborCostsVo; import org.dromara.oa.erp.domain.vo.ErpAfterSalesMaterialCostsVo; import org.dromara.oa.erp.service.IErpAfterSalesLaborCostsService; import org.dromara.oa.erp.service.IErpAfterSalesMaterialCostsService; +import org.dromara.system.api.RemoteCodeRuleService; import org.dromara.workflow.api.RemoteWorkflowService; import org.dromara.workflow.api.domain.RemoteStartProcess; import org.springframework.stereotype.Service; @@ -38,8 +39,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.springframework.context.event.EventListener; import org.dromara.workflow.api.event.ProcessEvent; - - import java.util.HashMap; import java.util.List; import java.util.Map; @@ -61,6 +60,9 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService { @DubboReference(timeout = 30000) private RemoteWorkflowService remoteWorkflowService; + @DubboReference() + private RemoteCodeRuleService remoteCodeRuleService; + private final IErpAfterSalesLaborCostsService laborCostsService; private final IErpAfterSalesMaterialCostsService materialCostsService; @@ -71,41 +73,42 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService { * @return 项目售后信息 */ @Override - public ErpAfterSalesVo queryById(Long afterSalesId){ + public ErpAfterSalesVo queryById(Long afterSalesId) { ErpAfterSalesVo vo = baseMapper.selectVoById(afterSalesId); if (vo != null) { List laborEntities = laborCostsService.list( - new LambdaQueryWrapper() - .eq(ErpAfterSalesLaborCosts::getAfterSalesId, afterSalesId) - ); - List laborVos = MapstructUtils.convert(laborEntities, ErpAfterSalesLaborCostsVo.class); + new LambdaQueryWrapper() + .eq(ErpAfterSalesLaborCosts::getAfterSalesId, afterSalesId)); + List laborVos = MapstructUtils.convert(laborEntities, + ErpAfterSalesLaborCostsVo.class); vo.setLaborCostsList(laborVos); List materialEntities = materialCostsService.list( - new LambdaQueryWrapper() - .eq(ErpAfterSalesMaterialCosts::getAfterSalesId, afterSalesId) - ); - List materialVos = MapstructUtils.convert(materialEntities, ErpAfterSalesMaterialCostsVo.class); + new LambdaQueryWrapper() + .eq(ErpAfterSalesMaterialCosts::getAfterSalesId, afterSalesId)); + List materialVos = MapstructUtils.convert(materialEntities, + ErpAfterSalesMaterialCostsVo.class); vo.setMaterialCostsList(materialVos); } return vo; } - /** - * 分页查询项目售后信息列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 项目售后信息分页列表 - */ - @Override - public TableDataInfo queryPageList(ErpAfterSalesBo bo, PageQuery pageQuery) { - MPJLambdaWrapper lqw = buildQueryWrapper(bo); -// Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - Page result = baseMapper.selectCustomVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } + /** + * 分页查询项目售后信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 项目售后信息分页列表 + */ + @Override + public TableDataInfo queryPageList(ErpAfterSalesBo bo, PageQuery pageQuery) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + // Page result = baseMapper.selectVoPage(pageQuery.build(), + // lqw); + Page result = baseMapper.selectCustomVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } /** * 查询符合条件的项目售后信息列表 @@ -116,40 +119,48 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService { @Override public List queryList(ErpAfterSalesBo bo) { MPJLambdaWrapper lqw = buildQueryWrapper(bo); -// return baseMapper.selectVoList(lqw); + // return baseMapper.selectVoList(lqw); return baseMapper.selectCustomVoList(lqw); } private MPJLambdaWrapper buildQueryWrapper(ErpAfterSalesBo bo) { Map params = bo.getParams(); MPJLambdaWrapper lqw = JoinWrappers.lambda(ErpAfterSales.class) - .selectAll(ErpAfterSales.class) - .eq(ErpAfterSales::getDelFlag, "0") - .eq(StringUtils.isNotBlank(bo.getAfterSalesCode()), ErpAfterSales::getAfterSalesCode, bo.getAfterSalesCode()) - .eq(StringUtils.isNotBlank(bo.getAfterSalesSubject()), ErpAfterSales::getAfterSalesSubject, bo.getAfterSalesSubject()) - .eq(bo.getProjectId() != null, ErpAfterSales::getProjectId, bo.getProjectId()) - .eq(StringUtils.isNotBlank(bo.getProjectCode()), ErpAfterSales::getProjectCode, bo.getProjectCode()) - .like(StringUtils.isNotBlank(bo.getProjectName()), ErpAfterSales::getProjectName, bo.getProjectName()) - .eq(bo.getCustomerId() != null, ErpAfterSales::getCustomerId, bo.getCustomerId()) - .like(StringUtils.isNotBlank(bo.getCustomerName()), ErpAfterSales::getCustomerName, bo.getCustomerName()) - .eq(StringUtils.isNotBlank(bo.getContactPerson()), ErpAfterSales::getContactPerson, bo.getContactPerson()) - .eq(StringUtils.isNotBlank(bo.getContactPhone()), ErpAfterSales::getContactPhone, bo.getContactPhone()) - .eq(bo.getAfterSalesDate() != null, ErpAfterSales::getAfterSalesDate, bo.getAfterSalesDate()) - .eq(bo.getContractId() != null, ErpAfterSales::getContractId, bo.getContractId()) - .eq(StringUtils.isNotBlank(bo.getContractCode()), ErpAfterSales::getContractCode, bo.getContractCode()) - .eq(StringUtils.isNotBlank(bo.getAfterSalesType()), ErpAfterSales::getAfterSalesType, bo.getAfterSalesType()) - .eq(StringUtils.isNotBlank(bo.getStakeholderId()), ErpAfterSales::getStakeholderId, bo.getStakeholderId()) - .eq(StringUtils.isNotBlank(bo.getHandlerId()), ErpAfterSales::getHandlerId, bo.getHandlerId()) - .eq(StringUtils.isNotBlank(bo.getProblemDescription()), ErpAfterSales::getProblemDescription, bo.getProblemDescription()) - .eq(bo.getTotalWorkHours() != null, ErpAfterSales::getTotalWorkHours, bo.getTotalWorkHours()) - .eq(bo.getTotalCost() != null, ErpAfterSales::getTotalCost, bo.getTotalCost()) - .eq(StringUtils.isNotBlank(bo.getSolveStatus()), ErpAfterSales::getSolveStatus, bo.getSolveStatus()) - .eq(bo.getCompletionDate() != null, ErpAfterSales::getCompletionDate, bo.getCompletionDate()) - .eq(StringUtils.isNotBlank(bo.getProcessingResult()), ErpAfterSales::getProcessingResult, bo.getProcessingResult()) - .eq(StringUtils.isNotBlank(bo.getAfterSalesStatus()), ErpAfterSales::getAfterSalesStatus, bo.getAfterSalesStatus()) - .eq(StringUtils.isNotBlank(bo.getFlowStatus()), ErpAfterSales::getFlowStatus, bo.getFlowStatus()) - .eq(StringUtils.isNotBlank(bo.getActiveFlag()), ErpAfterSales::getActiveFlag, bo.getActiveFlag()) -; + .selectAll(ErpAfterSales.class) + .eq(ErpAfterSales::getDelFlag, "0") + .eq(StringUtils.isNotBlank(bo.getAfterSalesCode()), ErpAfterSales::getAfterSalesCode, + bo.getAfterSalesCode()) + .eq(StringUtils.isNotBlank(bo.getAfterSalesSubject()), ErpAfterSales::getAfterSalesSubject, + bo.getAfterSalesSubject()) + .eq(bo.getProjectId() != null, ErpAfterSales::getProjectId, bo.getProjectId()) + .eq(StringUtils.isNotBlank(bo.getProjectCode()), ErpAfterSales::getProjectCode, bo.getProjectCode()) + .like(StringUtils.isNotBlank(bo.getProjectName()), ErpAfterSales::getProjectName, bo.getProjectName()) + .eq(bo.getCustomerId() != null, ErpAfterSales::getCustomerId, bo.getCustomerId()) + .like(StringUtils.isNotBlank(bo.getCustomerName()), ErpAfterSales::getCustomerName, + bo.getCustomerName()) + .eq(StringUtils.isNotBlank(bo.getContactPerson()), ErpAfterSales::getContactPerson, + bo.getContactPerson()) + .eq(StringUtils.isNotBlank(bo.getContactPhone()), ErpAfterSales::getContactPhone, bo.getContactPhone()) + .eq(bo.getAfterSalesDate() != null, ErpAfterSales::getAfterSalesDate, bo.getAfterSalesDate()) + .eq(bo.getContractId() != null, ErpAfterSales::getContractId, bo.getContractId()) + .eq(StringUtils.isNotBlank(bo.getContractCode()), ErpAfterSales::getContractCode, bo.getContractCode()) + .eq(StringUtils.isNotBlank(bo.getAfterSalesType()), ErpAfterSales::getAfterSalesType, + bo.getAfterSalesType()) + .eq(StringUtils.isNotBlank(bo.getStakeholderId()), ErpAfterSales::getStakeholderId, + bo.getStakeholderId()) + .eq(StringUtils.isNotBlank(bo.getHandlerId()), ErpAfterSales::getHandlerId, bo.getHandlerId()) + .eq(StringUtils.isNotBlank(bo.getProblemDescription()), ErpAfterSales::getProblemDescription, + bo.getProblemDescription()) + .eq(bo.getTotalWorkHours() != null, ErpAfterSales::getTotalWorkHours, bo.getTotalWorkHours()) + .eq(bo.getTotalCost() != null, ErpAfterSales::getTotalCost, bo.getTotalCost()) + .eq(StringUtils.isNotBlank(bo.getSolveStatus()), ErpAfterSales::getSolveStatus, bo.getSolveStatus()) + .eq(bo.getCompletionDate() != null, ErpAfterSales::getCompletionDate, bo.getCompletionDate()) + .eq(StringUtils.isNotBlank(bo.getProcessingResult()), ErpAfterSales::getProcessingResult, + bo.getProcessingResult()) + .eq(StringUtils.isNotBlank(bo.getAfterSalesStatus()), ErpAfterSales::getAfterSalesStatus, + bo.getAfterSalesStatus()) + .eq(StringUtils.isNotBlank(bo.getFlowStatus()), ErpAfterSales::getFlowStatus, bo.getFlowStatus()) + .eq(StringUtils.isNotBlank(bo.getActiveFlag()), ErpAfterSales::getActiveFlag, bo.getActiveFlag()); return lqw; } @@ -165,6 +176,11 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService { ErpAfterSales add = MapstructUtils.convert(bo, ErpAfterSales.class); validEntityBeforeSave(add); + // 自动生成售后编号 + if (StringUtils.isBlank(add.getAfterSalesCode())) { + String afterSalesCode = remoteCodeRuleService.selectCodeRuleCode("1012"); + add.setAfterSalesCode(afterSalesCode); + } boolean flag = baseMapper.insert(add) > 0; bo.setAfterSalesId(add.getAfterSalesId()); // 将生成的 ID 回填给 BO @@ -174,14 +190,16 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService { List laborBoList = bo.getLaborCostsList(); if (CollUtil.isNotEmpty(laborBoList)) { - List laborList = MapstructUtils.convert(laborBoList, ErpAfterSalesLaborCosts.class); + List laborList = MapstructUtils.convert(laborBoList, + ErpAfterSalesLaborCosts.class); laborList.forEach(item -> item.setAfterSalesId(afterSalesId)); laborCostsService.saveBatch(laborList); } List materialBoList = bo.getMaterialCostsList(); if (CollUtil.isNotEmpty(materialBoList)) { - List materialList = MapstructUtils.convert(materialBoList, ErpAfterSalesMaterialCosts.class); + List materialList = MapstructUtils.convert(materialBoList, + ErpAfterSalesMaterialCosts.class); materialList.forEach(item -> item.setAfterSalesId(afterSalesId)); materialCostsService.saveBatch(materialList); } @@ -205,15 +223,16 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService { if (row > 0) { Long afterSalesId = bo.getAfterSalesId(); - // ================== 处理人员费用 ================== + // ================== 处理人员费用 ================== // 先删除旧的 laborCostsService.remove(new LambdaQueryWrapper() - .eq(ErpAfterSalesLaborCosts::getAfterSalesId, afterSalesId)); + .eq(ErpAfterSalesLaborCosts::getAfterSalesId, afterSalesId)); // 后新增新的 List laborBoList = bo.getLaborCostsList(); if (CollUtil.isNotEmpty(laborBoList)) { - List laborList = MapstructUtils.convert(laborBoList, ErpAfterSalesLaborCosts.class); + List laborList = MapstructUtils.convert(laborBoList, + ErpAfterSalesLaborCosts.class); // 遍历列表,清空 ID laborList.forEach(item -> { @@ -224,13 +243,14 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService { laborCostsService.saveBatch(laborList); } - // ================== 处理材料费用 ================== + // ================== 处理材料费用 ================== materialCostsService.remove(new LambdaQueryWrapper() - .eq(ErpAfterSalesMaterialCosts::getAfterSalesId, afterSalesId)); + .eq(ErpAfterSalesMaterialCosts::getAfterSalesId, afterSalesId)); List materialBoList = bo.getMaterialCostsList(); if (CollUtil.isNotEmpty(materialBoList)) { - List materialList = MapstructUtils.convert(materialBoList, ErpAfterSalesMaterialCosts.class); + List materialList = MapstructUtils.convert(materialBoList, + ErpAfterSalesMaterialCosts.class); materialList.forEach(item -> { item.setMaterialCostsId(null); @@ -246,8 +266,8 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService { /** * 保存前的数据校验 */ - private void validEntityBeforeSave(ErpAfterSales entity){ - //TODO 做一些数据校验,如唯一约束 + private void validEntityBeforeSave(ErpAfterSales entity) { + // TODO 做一些数据校验,如唯一约束 } /** @@ -259,8 +279,8 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService { */ @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 + if (isValid) { + // TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteByIds(ids) > 0; } @@ -324,7 +344,7 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService { TenantHelper.dynamic(processEvent.getTenantId(), () -> { log.info("【售后流程监听】开始处理: key={}, status={}", processEvent.getFlowCode(), processEvent.getStatus()); - // 根据 BusinessId 查询出当前的售后单 + // 根据 BusinessId 查询出当前的售后单 Long afterSalesId = Convert.toLong(processEvent.getBusinessId()); ErpAfterSales afterSales = baseMapper.selectById(afterSalesId); @@ -333,10 +353,10 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService { return; } - // 同步流程状态 (flow_status) + // 同步流程状态 (flow_status) afterSales.setFlowStatus(processEvent.getStatus()); - // 根据流程状态,更新业务状态 (after_sales_status) + // 根据流程状态,更新业务状态 (after_sales_status) String status = processEvent.getStatus(); // A. 审批中 @@ -349,12 +369,12 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService { } // C. 驳回 (Back) 或 撤销 (Cancel) else if (BusinessStatusEnum.BACK.getStatus().equals(status) - || BusinessStatusEnum.CANCEL.getStatus().equals(status)) { + || BusinessStatusEnum.CANCEL.getStatus().equals(status)) { afterSales.setAfterSalesStatus("0"); } // D. 作废 (Invalid) 或 终止 (Termination) else if (BusinessStatusEnum.INVALID.getStatus().equals(status) - || BusinessStatusEnum.TERMINATION.getStatus().equals(status)) { + || BusinessStatusEnum.TERMINATION.getStatus().equals(status)) { afterSales.setAfterSalesStatus("0"); } @@ -363,5 +383,4 @@ public class ErpAfterSalesServiceImpl implements IErpAfterSalesService { }); } - } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractInfoServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractInfoServiceImpl.java index 4e5bc603..973b1ea0 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractInfoServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractInfoServiceImpl.java @@ -72,7 +72,8 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService { .selectAll(ErpContractMaterial.class) .eq(contractId != null, ErpContractMaterial::getContractId, contractId) .eq("t.del_flag", "0"); - List contractMaterialList = contractMaterialMapper.selectCustomErpContractMaterialVoList(lqw); + List contractMaterialList = contractMaterialMapper + .selectCustomErpContractMaterialVoList(lqw); contractInfoVo.setContractMaterialList(contractMaterialList); return contractInfoVo; } @@ -107,27 +108,38 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService { Map params = bo.getParams(); MPJLambdaWrapper lqw = JoinWrappers.lambda(ErpContractInfo.class) .selectAll(ErpContractInfo.class) - .eq(StringUtils.isNotBlank(bo.getContractFlag()), ErpContractInfo::getContractFlag, bo.getContractFlag()) - .eq(StringUtils.isNotBlank(bo.getContractCode()), ErpContractInfo::getContractCode, bo.getContractCode()) - .eq(StringUtils.isNotBlank(bo.getCustomerContractCode()), ErpContractInfo::getCustomerContractCode, bo.getCustomerContractCode()) - .like(StringUtils.isNotBlank(bo.getContractName()), ErpContractInfo::getContractName, bo.getContractName()) - .eq(StringUtils.isNotBlank(bo.getContractCategory()), ErpContractInfo::getContractCategory, bo.getContractCategory()) - .eq(StringUtils.isNotBlank(bo.getContractType()), ErpContractInfo::getContractType, bo.getContractType()) - .eq(StringUtils.isNotBlank(bo.getBusinessDirection()), ErpContractInfo::getBusinessDirection, bo.getBusinessDirection()) + .eq(StringUtils.isNotBlank(bo.getContractFlag()), ErpContractInfo::getContractFlag, + bo.getContractFlag()) + .eq(StringUtils.isNotBlank(bo.getContractCode()), ErpContractInfo::getContractCode, + bo.getContractCode()) + .eq(StringUtils.isNotBlank(bo.getCustomerContractCode()), ErpContractInfo::getCustomerContractCode, + bo.getCustomerContractCode()) + .like(StringUtils.isNotBlank(bo.getContractName()), ErpContractInfo::getContractName, + bo.getContractName()) + .eq(StringUtils.isNotBlank(bo.getContractCategory()), ErpContractInfo::getContractCategory, + bo.getContractCategory()) + .eq(StringUtils.isNotBlank(bo.getContractType()), ErpContractInfo::getContractType, + bo.getContractType()) + .eq(StringUtils.isNotBlank(bo.getBusinessDirection()), ErpContractInfo::getBusinessDirection, + bo.getBusinessDirection()) .eq(bo.getContractDeptId() != null, ErpContractInfo::getContractDeptId, bo.getContractDeptId()) .eq(bo.getContractDate() != null, ErpContractInfo::getContractDate, bo.getContractDate()) .eq(bo.getTotalPrice() != null, ErpContractInfo::getTotalPrice, bo.getTotalPrice()) - .eq(StringUtils.isNotBlank(bo.getContractStatus()), ErpContractInfo::getContractStatus, bo.getContractStatus()) + .eq(StringUtils.isNotBlank(bo.getContractStatus()), ErpContractInfo::getContractStatus, + bo.getContractStatus()) .eq(StringUtils.isNotBlank(bo.getFlowStatus()), ErpContractInfo::getFlowStatus, bo.getFlowStatus()) .eq(bo.getTemplateId() != null, ErpContractInfo::getTemplateId, bo.getTemplateId()) .eq(StringUtils.isNotBlank(bo.getOssId()), ErpContractInfo::getOssId, bo.getOssId()) - .eq(StringUtils.isNotBlank(bo.getPaymentMethod()), ErpContractInfo::getPaymentMethod, bo.getPaymentMethod()) + .eq(StringUtils.isNotBlank(bo.getPaymentMethod()), ErpContractInfo::getPaymentMethod, + bo.getPaymentMethod()) .eq(bo.getSignatureAppendix() != null, ErpContractInfo::getSignatureAppendix, bo.getSignatureAppendix()) .eq(bo.getTaxRate() != null, ErpContractInfo::getTaxRate, bo.getTaxRate()) .eq(StringUtils.isNotBlank(bo.getActiveFlag()), ErpContractInfo::getActiveFlag, bo.getActiveFlag()) .eq(bo.getContractManagerId() != null, ErpContractInfo::getContractManagerId, bo.getContractManagerId()) - .eq(StringUtils.isNotBlank(bo.getCapitalizedAmount()), ErpContractInfo::getCapitalizedAmount, bo.getCapitalizedAmount()) - .eq(StringUtils.isNotBlank(bo.getContractTemplateFlag()), ErpContractInfo::getContractTemplateFlag, bo.getContractTemplateFlag()) + .eq(StringUtils.isNotBlank(bo.getCapitalizedAmount()), ErpContractInfo::getCapitalizedAmount, + bo.getCapitalizedAmount()) + .eq(StringUtils.isNotBlank(bo.getContractTemplateFlag()), ErpContractInfo::getContractTemplateFlag, + bo.getContractTemplateFlag()) .eq("t.del_flag", "0") .orderByDesc(ErpContractInfo::getCreateTime); return lqw; @@ -207,7 +219,8 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService { * @param customerId 客户ID */ private void processRelationMaterial(ErpContractMaterial erpContractMaterial, Long customerId) { - if (erpContractMaterial.getMaterialId() != null && customerId != null && erpContractMaterial.getMaterialFlag().equals("1")) { + if (erpContractMaterial.getMaterialId() != null && customerId != null + && erpContractMaterial.getMaterialFlag().equals("1")) { Long relationMaterialId = erpContractMaterial.getRelationMaterialId(); // 如果relationMaterialId为空,则查询是否存在关联物料信息 if (relationMaterialId == null) { @@ -238,10 +251,11 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService { */ private void validEntityBeforeSave(ErpContractInfo entity) { // 物料列表的强制校验 - // if (entity.getContractMaterialList() == null || entity.getContractMaterialList().isEmpty()) { - // throw new ServiceException("请填写合同物料!"); + // if (entity.getContractMaterialList() == null || + // entity.getContractMaterialList().isEmpty()) { + // throw new ServiceException("请填写合同物料!"); // } - //存储合同大写金额 + // 存储合同大写金额 if (StringUtils.isNotNull(entity.getTotalPrice())) { String capitalizedAmount = NumberChineseFormatter.format(entity.getTotalPrice().doubleValue(), true, true); entity.setCapitalizedAmount(capitalizedAmount); @@ -258,7 +272,7 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService { @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { if (isValid) { - //TODO 做一些业务上的校验,判断是否需要校验 + // TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteByIds(ids) > 0; } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpTimesheetInfoServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpTimesheetInfoServiceImpl.java index d8f69597..4498d4ed 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpTimesheetInfoServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpTimesheetInfoServiceImpl.java @@ -10,9 +10,9 @@ import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; - import org.dromara.common.mybatis.core.page.TableDataInfo; - import org.dromara.common.mybatis.core.page.PageQuery; - import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -26,6 +26,7 @@ import org.dromara.oa.erp.domain.vo.ErpTimesheetDeptVo; import org.dromara.oa.erp.domain.vo.ErpTimesheetProjectVo; import org.dromara.oa.erp.service.IErpTimesheetDeptService; import org.dromara.oa.erp.service.IErpTimesheetProjectService; +import org.dromara.system.api.RemoteCodeRuleService; import org.dromara.workflow.api.RemoteWorkflowService; import org.dromara.workflow.api.domain.RemoteStartProcess; import org.dromara.workflow.api.event.ProcessEvent; @@ -57,6 +58,9 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService { @DubboReference(timeout = 30000) private RemoteWorkflowService remoteWorkflowService; + @DubboReference() + private RemoteCodeRuleService remoteCodeRuleService; + private final IErpTimesheetDeptService timesheetDeptService; private final IErpTimesheetProjectService timesheetProjectService; @@ -72,33 +76,32 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService { if (vo != null) { // 回显部门工时 List deptList = timesheetDeptService.list( - new LambdaQueryWrapper().eq(ErpTimesheetDept::getTimesheetId, timesheetId) - ); + new LambdaQueryWrapper().eq(ErpTimesheetDept::getTimesheetId, timesheetId)); vo.setTimesheetDeptList(MapstructUtils.convert(deptList, ErpTimesheetDeptVo.class)); // 回显项目工时 List projectList = timesheetProjectService.list( - new LambdaQueryWrapper().eq(ErpTimesheetProject::getTimesheetId, timesheetId) - ); + new LambdaQueryWrapper().eq(ErpTimesheetProject::getTimesheetId, timesheetId)); vo.setTimesheetProjectList(MapstructUtils.convert(projectList, ErpTimesheetProjectVo.class)); } return vo; } - /** - * 分页查询工时填报列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 工时填报分页列表 - */ - @Override - public TableDataInfo queryPageList(ErpTimesheetInfoBo bo, PageQuery pageQuery) { - MPJLambdaWrapper lqw = buildQueryWrapper(bo); -// Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - Page result = baseMapper.selectCustomVoPage(pageQuery.build(), lqw); - return TableDataInfo.build(result); - } + /** + * 分页查询工时填报列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 工时填报分页列表 + */ + @Override + public TableDataInfo queryPageList(ErpTimesheetInfoBo bo, PageQuery pageQuery) { + MPJLambdaWrapper lqw = buildQueryWrapper(bo); + // Page result = baseMapper.selectVoPage(pageQuery.build(), + // lqw); + Page result = baseMapper.selectCustomVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } /** * 查询符合条件的工时填报列表 @@ -109,7 +112,7 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService { @Override public List queryList(ErpTimesheetInfoBo bo) { MPJLambdaWrapper lqw = buildQueryWrapper(bo); -// return baseMapper.selectVoList(lqw); + // return baseMapper.selectVoList(lqw); return baseMapper.selectCustomVoList(lqw); } @@ -117,19 +120,20 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService { private MPJLambdaWrapper buildQueryWrapper(ErpTimesheetInfoBo bo) { Map params = bo.getParams(); MPJLambdaWrapper lqw = JoinWrappers.lambda(ErpTimesheetInfo.class) - .selectAll(ErpTimesheetInfo.class) - .eq(ErpTimesheetInfo::getDelFlag, "0") - .eq(StringUtils.isNotBlank(bo.getTimesheetCode()), ErpTimesheetInfo::getTimesheetCode, bo.getTimesheetCode()) - .eq(bo.getUserId() != null, ErpTimesheetInfo::getUserId, bo.getUserId()) - .eq(bo.getDeptId() != null, ErpTimesheetInfo::getDeptId, bo.getDeptId()) - .eq(bo.getStartTime() != null, ErpTimesheetInfo::getStartTime, bo.getStartTime()) - .eq(bo.getEndTime() != null, ErpTimesheetInfo::getEndTime, bo.getEndTime()) - .eq(bo.getTotalHours() != null, ErpTimesheetInfo::getTotalHours, bo.getTotalHours()) - .eq(bo.getDeptHours() != null, ErpTimesheetInfo::getDeptHours, bo.getDeptHours()) - .eq(bo.getProjectHours() != null, ErpTimesheetInfo::getProjectHours, bo.getProjectHours()) - .eq(StringUtils.isNotBlank(bo.getTimesheetStatus()), ErpTimesheetInfo::getTimesheetStatus, bo.getTimesheetStatus()) - .eq(StringUtils.isNotBlank(bo.getFlowStatus()), ErpTimesheetInfo::getFlowStatus, bo.getFlowStatus()) -; + .selectAll(ErpTimesheetInfo.class) + .eq(ErpTimesheetInfo::getDelFlag, "0") + .eq(StringUtils.isNotBlank(bo.getTimesheetCode()), ErpTimesheetInfo::getTimesheetCode, + bo.getTimesheetCode()) + .eq(bo.getUserId() != null, ErpTimesheetInfo::getUserId, bo.getUserId()) + .eq(bo.getDeptId() != null, ErpTimesheetInfo::getDeptId, bo.getDeptId()) + .eq(bo.getStartTime() != null, ErpTimesheetInfo::getStartTime, bo.getStartTime()) + .eq(bo.getEndTime() != null, ErpTimesheetInfo::getEndTime, bo.getEndTime()) + .eq(bo.getTotalHours() != null, ErpTimesheetInfo::getTotalHours, bo.getTotalHours()) + .eq(bo.getDeptHours() != null, ErpTimesheetInfo::getDeptHours, bo.getDeptHours()) + .eq(bo.getProjectHours() != null, ErpTimesheetInfo::getProjectHours, bo.getProjectHours()) + .eq(StringUtils.isNotBlank(bo.getTimesheetStatus()), ErpTimesheetInfo::getTimesheetStatus, + bo.getTimesheetStatus()) + .eq(StringUtils.isNotBlank(bo.getFlowStatus()), ErpTimesheetInfo::getFlowStatus, bo.getFlowStatus()); return lqw; } @@ -144,6 +148,11 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService { public Boolean insertByBo(ErpTimesheetInfoBo bo) { ErpTimesheetInfo add = MapstructUtils.convert(bo, ErpTimesheetInfo.class); validEntityBeforeSave(add); + // 自动生成工时单号 + if (StringUtils.isBlank(add.getTimesheetCode())) { + String timesheetCode = remoteCodeRuleService.selectCodeRuleCode("1015"); + add.setTimesheetCode(timesheetCode); + } boolean flag = baseMapper.insert(add) > 0; if (flag) { @@ -151,7 +160,7 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService { bo.setTimesheetId(add.getTimesheetId()); Long timesheetId = add.getTimesheetId(); - // 保存部门工时子表 + // 保存部门工时子表 List deptBoList = bo.getTimesheetDeptList(); if (CollUtil.isNotEmpty(deptBoList)) { List list = MapstructUtils.convert(deptBoList, ErpTimesheetDept.class); @@ -159,7 +168,7 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService { timesheetDeptService.saveBatch(list); } - // 保存项目工时子表 + // 保存项目工时子表 List projectBoList = bo.getTimesheetProjectList(); if (CollUtil.isNotEmpty(projectBoList)) { List list = MapstructUtils.convert(projectBoList, ErpTimesheetProject.class); @@ -186,9 +195,9 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService { if (row > 0) { Long timesheetId = bo.getTimesheetId(); - // 更新部门工时 (先删后增) + // 更新部门工时 (先删后增) timesheetDeptService.remove(new LambdaQueryWrapper() - .eq(ErpTimesheetDept::getTimesheetId, timesheetId)); + .eq(ErpTimesheetDept::getTimesheetId, timesheetId)); List deptBoList = bo.getTimesheetDeptList(); if (CollUtil.isNotEmpty(deptBoList)) { @@ -200,9 +209,9 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService { timesheetDeptService.saveBatch(list); } - // 更新项目工时 (先删后增) + // 更新项目工时 (先删后增) timesheetProjectService.remove(new LambdaQueryWrapper() - .eq(ErpTimesheetProject::getTimesheetId, timesheetId)); + .eq(ErpTimesheetProject::getTimesheetId, timesheetId)); List projectBoList = bo.getTimesheetProjectList(); if (CollUtil.isNotEmpty(projectBoList)) { @@ -220,8 +229,8 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService { /** * 保存前的数据校验 */ - private void validEntityBeforeSave(ErpTimesheetInfo entity){ - //TODO 做一些数据校验,如唯一约束 + private void validEntityBeforeSave(ErpTimesheetInfo entity) { + // TODO 做一些数据校验,如唯一约束 } /** @@ -233,8 +242,8 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService { */ @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 + if (isValid) { + // TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteByIds(ids) > 0; } @@ -264,35 +273,33 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService { List deptApprovers = new ArrayList<>(); if (CollUtil.isNotEmpty(deptList)) { deptApprovers = deptList.stream() - .map(ErpTimesheetDeptBo::getApproverId) - .filter(Objects::nonNull) - .map(String::valueOf) - .distinct() - .collect(Collectors.toList()); + .map(ErpTimesheetDeptBo::getApproverId) + .filter(Objects::nonNull) + .map(String::valueOf) + .distinct() + .collect(Collectors.toList()); } - // deptApprovers (审批人列表) + // deptApprovers (审批人列表) variables.put("deptApprovers", deptApprovers); - // hasDeptWork (是否有部门工时) - true/false + // hasDeptWork (是否有部门工时) - true/false variables.put("hasDeptWork", CollUtil.isNotEmpty(deptApprovers)); - // --- 处理项目工时审批人 --- List projectList = bo.getTimesheetProjectList(); List projectApprovers = new ArrayList<>(); if (CollUtil.isNotEmpty(projectList)) { projectApprovers = projectList.stream() - .map(ErpTimesheetProjectBo::getApproverId) - .filter(Objects::nonNull) - .map(String::valueOf) - .distinct() - .collect(Collectors.toList()); + .map(ErpTimesheetProjectBo::getApproverId) + .filter(Objects::nonNull) + .map(String::valueOf) + .distinct() + .collect(Collectors.toList()); } variables.put("projectApprovers", projectApprovers); variables.put("hasProjectWork", CollUtil.isNotEmpty(projectApprovers)); - RemoteStartProcess startProcess = new RemoteStartProcess(); startProcess.setBusinessId(bo.getTimesheetId().toString()); startProcess.setFlowCode(bo.getFlowCode()); @@ -341,12 +348,12 @@ public class ErpTimesheetInfoServiceImpl implements IErpTimesheetInfoService { } // C. 驳回/撤销 else if (BusinessStatusEnum.BACK.getStatus().equals(status) - || BusinessStatusEnum.CANCEL.getStatus().equals(status)) { + || BusinessStatusEnum.CANCEL.getStatus().equals(status)) { timeSheetInfo.setTimesheetStatus("1"); } // D. 作废/终止 else if (BusinessStatusEnum.INVALID.getStatus().equals(status) - || BusinessStatusEnum.TERMINATION.getStatus().equals(status)) { + || BusinessStatusEnum.TERMINATION.getStatus().equals(status)) { timeSheetInfo.setTimesheetStatus("4"); }