From 7b52d2c3d322ce27c7066f5a5e3ac502196d7a94 Mon Sep 17 00:00:00 2001 From: yinq Date: Thu, 19 Mar 2026 09:03:45 +0800 Subject: [PATCH] =?UTF-8?q?1.0.90=20=E9=A1=B9=E7=9B=AE=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E5=8F=98=E9=87=8F=E7=BB=9F=E4=B8=80=E8=B5=B0?= =?UTF-8?q?=E5=90=8E=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oa/erp/domain/bo/ErpProjectInfoBo.java | 2 +- .../impl/ErpContractOrderServiceImpl.java | 27 +------ .../impl/ErpProjectInfoServiceImpl.java | 74 ++++++++++++++++++- 3 files changed, 75 insertions(+), 28 deletions(-) diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectInfoBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectInfoBo.java index 38364c54..9e3119b1 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectInfoBo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpProjectInfoBo.java @@ -191,7 +191,7 @@ public class ErpProjectInfoBo extends BaseEntity { public Map getVariables() { if (variables == null) { - return new HashMap<>(16); + variables = new HashMap<>(16); } variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue())); return variables; diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractOrderServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractOrderServiceImpl.java index c6a9b0ca..796acb51 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractOrderServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractOrderServiceImpl.java @@ -174,8 +174,6 @@ public class ErpContractOrderServiceImpl implements IErpContractOrderService { validEntityBeforeSave(projectInfo); if (StringUtils.isNotNull(bo.getOssId()) && StringUtils.isNotNull(bo.getContractId())) { - // 若本合同为由内容变更产生的新合同,激活时继承原合同关联项目并作废原合同(幂等) - erpContractChangeService.onActivateNewContractFromChange(bo.getContractId()); ErpContractInfoVo contractInfoVo = contractInfoMapper.selectVoById(bo.getContractId()); ErpContractInfo contractInfo = new ErpContractInfo(); contractInfo.setContractId(contractInfoVo.getContractId()); @@ -330,6 +328,9 @@ public class ErpContractOrderServiceImpl implements IErpContractOrderService { throw new ServiceException("流程发起异常"); } + // 若本合同为由内容变更产生的新合同,激活时继承原合同关联项目并作废原合同 + erpContractChangeService.onActivateNewContractFromChange(bo.getContractId()); + // 关联项目:仅新增项目走项目申请流程;选择已有项目不走 xzxm,仅走主流程(variables 含 hasExistProject) List projectContractsList = bo.getProjectContractsList(); if (CollUtil.isNotEmpty(projectContractsList)) { @@ -349,28 +350,6 @@ public class ErpContractOrderServiceImpl implements IErpContractOrderService { projectBo.setContractFlag(projectVo.getContractFlag()); projectBo.setProjectTypeId(projectVo.getProjectTypeId()); projectBo.setFlowCode(FLOW_CODE_PROJECT); - Map variables = projectBo.getVariables(); - variables.put("ignore", true); - variables.put("projectId", projectVo.getProjectId()); - variables.put("projectCode", projectVo.getProjectCode()); - variables.put("projectName", projectVo.getProjectName()); - variables.put("contractFlag", Convert.toInt(projectVo.getContractFlag())); - Long projectTypeParentId = null; - if (projectVo.getProjectTypeId() != null) { - ErpProjectTypeVo projectTypeVo = projectTypeService.queryById(projectVo.getProjectTypeId()); - if (projectTypeVo != null) { - projectTypeParentId = projectTypeVo.getParentId(); - } - } - variables.put("projectTypeParentId", projectTypeParentId); - RemoteFlowInstanceBizExt projectBizExt = projectBo.getBizExt(); - projectBizExt.setBusinessId(String.valueOf(projectVo.getProjectId())); - projectBizExt.setBusinessCode(projectVo.getProjectCode()); - projectBizExt.setBusinessTitle(projectVo.getProjectName() != null ? projectVo.getProjectName() + "市场项目审批" : "市场项目审批"); - projectBo.setProjectStatus(OAStatusEnum.APPROVING.getStatus()); - projectBo.setFlowStatus(BusinessStatusEnum.WAITING.getStatus()); - projectBo.setVariables(variables); - projectBo.setBizExt(projectBizExt); projectInfoService.projectSubmitAndFlowStart(projectBo); } } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectInfoServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectInfoServiceImpl.java index bc40031b..6347148d 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectInfoServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpProjectInfoServiceImpl.java @@ -33,12 +33,14 @@ import org.dromara.oa.erp.domain.bo.ErpProjectInfoBo; import org.dromara.oa.erp.domain.vo.ErpContractInfoVo; import org.dromara.oa.erp.domain.vo.ErpContractMaterialVo; import org.dromara.oa.erp.domain.vo.ErpProjectInfoVo; +import org.dromara.oa.erp.domain.vo.ErpProjectTypeVo; import org.dromara.oa.erp.enums.ProjectCategoryEnum; import org.dromara.oa.erp.mapper.ErpContractInfoMapper; import org.dromara.oa.erp.mapper.ErpProjectContractsMapper; import org.dromara.oa.erp.mapper.ErpProjectInfoMapper; import org.dromara.oa.erp.service.IErpContractInfoService; import org.dromara.oa.erp.service.IErpProjectInfoService; +import org.dromara.oa.erp.service.IErpProjectTypeService; import org.dromara.wms.api.RemoteWmsShippingBillService; import org.dromara.wms.api.domain.RemoteWmsShippingDraft; import org.dromara.wms.api.domain.RemoteWmsShippingDraftItem; @@ -71,6 +73,8 @@ public class ErpProjectInfoServiceImpl implements IErpProjectInfoService { private final ErpContractInfoMapper erpContractInfoMapper; + private final IErpProjectTypeService projectTypeService; + @DubboReference(timeout = 30000) private RemoteWorkflowService remoteWorkflowService; @@ -240,7 +244,17 @@ public class ErpProjectInfoServiceImpl implements IErpProjectInfoService { * 保存前的数据校验 */ private void validEntityBeforeSave(ErpProjectInfo entity) { - //TODO 做一些数据校验,如唯一约束 + // 项目编号不能重复(编辑时排除自身) + if (entity != null && StringUtils.isNotBlank(entity.getProjectCode())) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper() + .eq(ErpProjectInfo::getProjectCode, entity.getProjectCode()) + .eq(ErpProjectInfo::getDelFlag, "0") + .ne(entity.getProjectId() != null, ErpProjectInfo::getProjectId, entity.getProjectId()); + Long cnt = baseMapper.selectCount(lqw); + if (cnt != null && cnt > 0) { + throw new ServiceException("项目编号【" + entity.getProjectCode() + "】已存在,请勿重复"); + } + } } /** @@ -269,13 +283,12 @@ public class ErpProjectInfoServiceImpl implements IErpProjectInfoService { public ErpProjectInfoVo projectSubmitAndFlowStart(ErpProjectInfoBo bo) { ErpProjectInfo add = MapstructUtils.convert(bo, ErpProjectInfo.class); validEntityBeforeSave(add); + populateProjectFlowStartPayload(bo); if (StringUtils.isNull(bo.getProjectId())) { this.insertByBo(bo); } else { this.updateByBo(bo); } - // 后端发起需要忽略权限 - bo.getVariables().put("ignore", true); RemoteStartProcess startProcess = new RemoteStartProcess(); startProcess.setBusinessId(bo.getProjectId().toString()); startProcess.setFlowCode(bo.getFlowCode()); @@ -289,6 +302,61 @@ public class ErpProjectInfoServiceImpl implements IErpProjectInfoService { return MapstructUtils.convert(add, ErpProjectInfoVo.class); } + private void populateProjectFlowStartPayload(ErpProjectInfoBo bo) { + if (bo == null) { + return; + } + + Map variables = bo.getVariables(); + variables.put("ignore", true); + + variables.putIfAbsent("projectId", bo.getProjectId()); + variables.putIfAbsent("projectCode", bo.getProjectCode()); + variables.putIfAbsent("projectName", bo.getProjectName()); + variables.putIfAbsent("contractFlag", Convert.toInt(bo.getContractFlag())); + variables.putIfAbsent("chargeId", bo.getChargeId()); + variables.putIfAbsent("deputyId", bo.getDeputyId()); + + Long projectTypeParentId = resolveProjectTypeParentId(bo.getProjectTypeId()); + variables.putIfAbsent("projectTypeParentId", projectTypeParentId); + + bo.setProjectStatus(OAStatusEnum.APPROVING.getStatus()); + bo.setFlowStatus(BusinessStatusEnum.WAITING.getStatus()); + + String approvalTitleSuffix = resolveProjectApprovalTitleSuffix(bo.getFlowCode()); + String businessTitle = StringUtils.isNotBlank(bo.getProjectName()) + ? bo.getProjectName() + approvalTitleSuffix + : approvalTitleSuffix; + + bo.getBizExt().setBusinessId(String.valueOf(bo.getProjectId())); + bo.getBizExt().setBusinessCode(bo.getProjectCode()); + bo.getBizExt().setBusinessTitle(businessTitle); + } + + private Long resolveProjectTypeParentId(Long projectTypeId) { + if (projectTypeId == null) { + return null; + } + ErpProjectTypeVo projectTypeVo = projectTypeService.queryById(projectTypeId); + if (projectTypeVo == null) { + return null; + } + return projectTypeVo.getParentId(); + } + + private String resolveProjectApprovalTitleSuffix(String flowCode) { + if (flowCode.startsWith("xmsq")) { + if ("xmsqf".equals(flowCode)) { + return "研发项目审批"; + } + if ("xmsqt".equals(flowCode)) { + return "预投项目审批"; + } + return "市场项目审批"; + } + return "项目审批"; + } + /** * 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成等) *