diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpContractChangeController.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpContractChangeController.java index ce0d67df..b9e8f812 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpContractChangeController.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/ErpContractChangeController.java @@ -105,6 +105,17 @@ public class ErpContractChangeController extends BaseController { return R.ok(erpContractChangeService.contractChangeSubmitAndFlowStart(bo)); } + /** + * 合同内容变更提交:保存变更单并新增合同,新合同走正常合同流程 + */ + @SaCheckPermission("oa/erp:contractChange:add") + @Log(title = "合同变更", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/submitContentChange") + public R submitContentChange(@RequestBody ErpContractChangeSaveBo bo) { + return R.ok(erpContractChangeService.submitContentChange(bo)); + } + /** * 新增合同变更 */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpContractChange.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpContractChange.java index 737d7141..1ed57f6e 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpContractChange.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpContractChange.java @@ -140,6 +140,11 @@ public class ErpContractChange extends TenantEntity { */ private String remark; + /** + * 内容变更生成的新合同ID(仅变更类型=1时使用,用于新合同激活时继承原合同项目并作废原合同) + */ + private Long newContractId; + /** * 激活标识(1是 0否) */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpContractInfo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpContractInfo.java index da76b74b..f7cb70f5 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpContractInfo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/ErpContractInfo.java @@ -63,7 +63,7 @@ public class ErpContractInfo extends TenantEntity { private String contractType; /** - * 业务方向(1智能轮胎 2轮胎工厂 3快递物流 4锂电 5工业软件 6智能制造 7新行业及零售) + * 业务方向(1智能轮胎 2轮胎&制品 3快递&新零售 4制造大集成 5工厂数字化) */ private String businessDirection; @@ -262,4 +262,9 @@ public class ErpContractInfo extends TenantEntity { */ private String contractTemplateFlag; + /** + * 内容变更来源的原合同ID(仅当本合同由合同内容变更生成时非空,用于激活时继承原合同关联项目并作废原合同) + */ + private Long originalContractId; + } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpContractChangeBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpContractChangeBo.java index d81cfd08..b793150c 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpContractChangeBo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpContractChangeBo.java @@ -140,6 +140,11 @@ public class ErpContractChangeBo extends BaseEntity { */ private String remark; + /** + * 内容变更生成的新合同ID + */ + private Long newContractId; + /** * 激活标识(1是 0否) */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpContractInfoBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpContractInfoBo.java index 1dc8a392..0dfc667f 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpContractInfoBo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/ErpContractInfoBo.java @@ -66,7 +66,7 @@ public class ErpContractInfoBo extends BaseEntity { private String contractType; /** - * 业务方向(1智能轮胎 2轮胎工厂 3快递物流 4锂电 5工业软件 6智能制造 7新行业及零售) + * 业务方向(1智能轮胎 2轮胎&制品 3快递&新零售 4制造大集成 5工厂数字化) */ private String businessDirection; @@ -265,6 +265,11 @@ public class ErpContractInfoBo extends BaseEntity { */ private String contractTemplateFlag; + /** + * 内容变更来源的原合同ID(仅当本合同由合同内容变更生成时非空) + */ + private Long originalContractId; + /** * 流程定义编码 */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpContractChangeVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpContractChangeVo.java index aa719d15..00ecf2a4 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpContractChangeVo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpContractChangeVo.java @@ -183,6 +183,11 @@ public class ErpContractChangeVo implements Serializable { @ExcelProperty(value = "备注") private String remark; + /** + * 内容变更生成的新合同ID + */ + private Long newContractId; + /** * 激活标识(1是 0否) */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpContractInfoVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpContractInfoVo.java index 9f653dd3..bdc3b85b 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpContractInfoVo.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/ErpContractInfoVo.java @@ -80,7 +80,7 @@ public class ErpContractInfoVo implements Serializable { private String contractType; /** - * 业务方向(1智能轮胎 2轮胎工厂 3快递物流 4锂电 5工业软件 6智能制造 7新行业及零售) + * 业务方向(1智能轮胎 2轮胎&制品 3快递&新零售 4制造大集成 5工厂数字化) */ @ExcelProperty(value = "业务方向", converter = ExcelDictConvert.class) @ExcelDictFormat(dictType = "business_direction") @@ -332,6 +332,11 @@ public class ErpContractInfoVo implements Serializable { @ExcelDictFormat(dictType = "contract_template_flag") private String contractTemplateFlag; + /** + * 内容变更来源的原合同ID(仅当本合同由合同内容变更生成时非空) + */ + private Long originalContractId; + /** * 甲方办公地 */ diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpContractChangeService.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpContractChangeService.java index 5238d909..231d65e7 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpContractChangeService.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/IErpContractChangeService.java @@ -99,4 +99,20 @@ public interface IErpContractChangeService { * @return 合同变更主表 VO */ ErpContractChangeVo contractChangeSubmitAndFlowStart(ErpContractChangeSaveBo bo); + + /** + * 合同内容变更提交:不走 HTBG,保存变更单后新增合同并写入 new_contract_id,新合同由用户在合同管理中走正常合同流程(OAC)。 + * + * @param bo 保存数据(主表 + changeInfo + changeMaterialList + changePaymentMethodList) + * @return 合同变更主表 VO(含 newContractId) + */ + ErpContractChangeVo submitContentChange(ErpContractChangeSaveBo bo); + + /** + * 新合同激活时回调:若当前合同为由内容变更产生的新合同,则继承原合同关联项目、作废原合同并解除原合同与项目关联。 + * 在合同订单保存/激活流程中调用,幂等(原合同已作废则跳过)。 + * + * @param newContractId 当前(新)合同 ID + */ + void onActivateNewContractFromChange(Long newContractId); } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractChangeServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractChangeServiceImpl.java index ed8b45af..2c3d14be 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractChangeServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractChangeServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.oa.erp.service.impl; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.map.MapUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -7,6 +8,7 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.enums.OAStatusEnum; import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.oa.erp.domain.bo.ErpContractChangeInfoBo; import org.dromara.oa.erp.domain.bo.ErpContractChangeMaterialBo; import org.dromara.oa.erp.domain.bo.ErpContractChangePaymentMethodBo; import org.dromara.workflow.api.event.ProcessEvent; @@ -27,6 +29,8 @@ import org.dromara.oa.erp.domain.bo.ErpContractChangeSaveBo; import org.dromara.oa.erp.domain.vo.*; import org.dromara.oa.erp.mapper.*; import org.dromara.oa.erp.service.IErpContractChangeService; +import org.dromara.oa.erp.service.IErpContractInfoService; +import org.dromara.oa.erp.domain.bo.ErpContractInfoBo; import org.dromara.system.api.RemoteCodeRuleService; import org.dromara.workflow.api.RemoteWorkflowService; import org.dromara.workflow.api.domain.RemoteStartProcess; @@ -63,6 +67,8 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService { private final ErpContractInfoMapper contractInfoMapper; private final ErpContractMaterialMapper contractMaterialMapper; private final ErpContractPaymentMethodMapper contractPaymentMethodMapper; + private final ErpProjectContractsMapper projectContractsMapper; + private final IErpContractInfoService contractInfoService; @DubboReference private RemoteCodeRuleService remoteCodeRuleService; @@ -234,6 +240,7 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService { boolean isUpdate = bo.getContractChangeId() != null; ErpContractChange main = buildMainEntity(bo); validEntityBeforeSave(main); + validContentChangeContractCode(bo); if (isUpdate) { // 已回写的数据不允许覆盖回写相关字段 @@ -313,6 +320,94 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService { return baseMapper.selectVoById(changeId); } + /** + * 合同内容变更提交:不走 HTBG,保存变更单后新增合同并写入 new_contract_id,新合同由用户在合同管理中走正常合同流程(OAC)。 + * 校验:变更后合同编号必须与原合同编号不同。 + * + * @param bo 保存数据(主表 + changeInfo + changeMaterialList + changePaymentMethodList) + * @return 合同变更主表 VO(含 newContractId) + */ + @Override + @GlobalTransactional(rollbackFor = Exception.class) + public ErpContractChangeVo submitContentChange(ErpContractChangeSaveBo bo) { + // 保存变更单,变更状态设为可用、不发起流程 + bo.setChangeStatus(CHANGE_STATUS_AVAILABLE); + bo.setFlowStatus("finish"); + Long changeId = saveContractChange(bo); + ErpContractChange main = baseMapper.selectById(changeId); + if (main == null) { + throw new ServiceException("保存合同变更失败"); + } + // 由变更快照新增合同,并直接走合同审批流程(OAC) + ErpContractInfoBo contractBo = buildContractBoFromChange(bo); + // 先插入合同主数据及子表 + ErpContractInfoVo contractVo = contractInfoService.insertByBo(contractBo); + Long newContractId = contractVo.getContractId(); + if (newContractId == null) { + throw new ServiceException("新增合同失败"); + } + // 直接发起合同流程 + contractBo.setContractId(newContractId); + contractInfoService.contractSubmitAndFlowStart(contractBo); + + main.setNewContractId(newContractId); + baseMapper.updateById(main); + return baseMapper.selectVoById(changeId); + } + + /** + * 内容变更时校验:变更后合同编号必须与原合同编号不同 + */ + private void validContentChangeContractCode(ErpContractChangeSaveBo bo) { + if (CHANGE_TYPE_CONTENT.equals(bo.getChangeType())) { + ErpContractInfo orig = contractInfoMapper.selectById(bo.getContractId()); + if (orig == null) { + throw new ServiceException("原合同不存在"); + } + String originalCode = orig.getContractCode(); + String changeCode = bo.getChangeInfo().getContractCode(); + if (changeCode != null && changeCode.trim().equals(StringUtils.isBlank(originalCode) ? "" : originalCode.trim())) { + throw new ServiceException("合同内容变更时,变更后合同编号必须与原合同编号不同"); + } + } + } + + /** + * 由变更快照组装合同 BO(不含 contractId,用于新增) + */ + private ErpContractInfoBo buildContractBoFromChange(ErpContractChangeSaveBo bo) { + ErpContractChangeInfoBo info = bo.getChangeInfo(); + if (info == null) { + throw new ServiceException("内容变更时变更后合同信息不能为空"); + } + // 不能直接用 MapstructUtils 在 BO 之间转换,这里显式拷贝字段 + ErpContractInfoBo contractBo = new ErpContractInfoBo(); + BeanUtil.copyProperties(info, contractBo, true); + contractBo.setContractId(null); + List materials = new ArrayList<>(); + if (bo.getChangeMaterialList() != null) { + for (ErpContractChangeMaterialBo m : bo.getChangeMaterialList()) { + ErpContractChangeMaterial entity = MapstructUtils.convert(m, ErpContractChangeMaterial.class); + materials.add(copyChangeMaterialToContract(entity, null)); + } + } + contractBo.setContractMaterialList(materials); + List payments = new ArrayList<>(); + if (bo.getChangePaymentMethodList() != null) { + for (ErpContractChangePaymentMethodBo p : bo.getChangePaymentMethodList()) { + ErpContractChangePaymentMethod entity = MapstructUtils.convert(p, ErpContractChangePaymentMethod.class); + payments.add(copyChangePaymentToContract(entity, null)); + } + } + contractBo.setContractPaymentMethodList(payments); + if (info.getDeliveryStart() != null && contractBo.getDeliveryStart() == null) { + contractBo.setDeliveryStart(info.getDeliveryStart().intValue()); + } + contractBo.setOriginalContractId(bo.getContractId()); + contractBo.setSignatureAppendix(null); + return contractBo; + } + /** * 从 SaveBo 组装主表实体(不包含子表),新增时默认未回写、变更状态 1、激活 1 */ @@ -399,8 +494,6 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService { Long contractId = change.getContractId(); if (CHANGE_TYPE_TERMINATE.equals(change.getChangeType())) { doWriteBackTerminate(contractId); - } else { - doWriteBackContent(change.getContractChangeId(), contractId); } change.setChangeStatus(CHANGE_STATUS_AVAILABLE); change.setFlowStatus(BusinessStatusEnum.FINISH.getStatus()); @@ -419,6 +512,68 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService { } } + /** + * 新合同激活时:若该合同为由内容变更产生的新合同,则继承原合同关联项目、作废原合同、解除原合同与项目关联并删除原合同订单信息。幂等。 + * 优先从合同表 original_contract_id 取原合同ID,若无则从 erp_contract_change.new_contract_id 反查。 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void onActivateNewContractFromChange(Long newContractId) { + if (newContractId == null) { + return; + } + ErpContractInfo newContract = contractInfoMapper.selectById(newContractId); + Long originalContractId = null; + if (newContract != null && newContract.getOriginalContractId() != null) { + originalContractId = newContract.getOriginalContractId(); + } + if (originalContractId == null) { + List list = baseMapper.selectList( + new LambdaQueryWrapper() + .eq(ErpContractChange::getNewContractId, newContractId) + .last("limit 1")); + if (list.isEmpty()) { + return; + } + originalContractId = list.get(0).getContractId(); + } + if (originalContractId == null) { + return; + } + ErpContractInfo originalContract = contractInfoMapper.selectById(originalContractId); + if (originalContract == null) { + return; + } + if ("0".equals(originalContract.getActiveFlag()) && OAStatusEnum.INVALID.getStatus().equals(originalContract.getContractStatus())) { + return; + } + List oldLinks = projectContractsMapper.selectList( + new LambdaQueryWrapper().eq(ErpProjectContracts::getContractId, originalContractId)); + for (ErpProjectContracts oldLink : oldLinks) { + long cnt = projectContractsMapper.selectCount( + new LambdaQueryWrapper() + .eq(ErpProjectContracts::getContractId, newContractId) + .eq(ErpProjectContracts::getProjectId, oldLink.getProjectId())); + if (cnt > 0) { + continue; + } + ErpProjectContracts newLink = new ErpProjectContracts(); + newLink.setContractId(newContractId); + newLink.setProjectId(oldLink.getProjectId()); + newLink.setSortOrder(oldLink.getSortOrder()); + newLink.setRemark(oldLink.getRemark()); + newLink.setActiveFlag(StringUtils.isNotBlank(oldLink.getActiveFlag()) ? oldLink.getActiveFlag() : "1"); + newLink.setProjectSource(oldLink.getProjectSource()); + projectContractsMapper.insert(newLink); + } + originalContract.setActiveFlag("0"); + originalContract.setContractStatus(OAStatusEnum.INVALID.getStatus()); + contractInfoMapper.updateById(originalContract); + for (ErpProjectContracts oldLink : oldLinks) { + projectContractsMapper.deleteById(oldLink.getProjectContractsId()); + } + } + /** * 内容变更回写:用变更信息快照更新原合同主表;原合同物料/付款方式先逻辑删除后按变更快照插入(逻辑删除,实体带 @TableLogic)。 */ 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 926d9d67..a5061592 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 @@ -42,6 +42,7 @@ import org.dromara.oa.erp.mapper.ErpContractPaymentMethodMapper; import org.dromara.oa.erp.service.IErpContractInfoService; import org.dromara.system.api.RemoteUserService; import org.dromara.workflow.api.RemoteWorkflowService; +import org.dromara.workflow.api.domain.RemoteFlowInstanceBizExt; import org.dromara.workflow.api.domain.RemoteStartProcess; import org.dromara.workflow.api.event.ProcessEvent; import org.springframework.context.event.EventListener; @@ -68,6 +69,9 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService { private static final String FINANCE_MANAGER_NODE_NAME = "财务经理"; + /** 合同审批流程编码(与流程引擎中 flowCode 一致) */ + public static final String FLOW_CODE_CONTRACT = "OAC"; + private final ErpContractInfoMapper baseMapper; private final ErpContractMaterialMapper contractMaterialMapper; @@ -647,6 +651,8 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService { @Override @GlobalTransactional(rollbackFor = Exception.class) public ErpContractInfoVo contractSubmitAndFlowStart(ErpContractInfoBo bo) { + // 统一补齐并落库:flowCode/variables/bizExt/contractStatus/flowStatus + fillContractOacParams(bo); ErpContractInfo add = MapstructUtils.convert(bo, ErpContractInfo.class); if (StringUtils.isNull(bo.getContractId())) { this.insertByBo(bo); @@ -654,7 +660,9 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService { this.updateByBo(bo); } // 后端发起需要忽略权限 - bo.getVariables().put("ignore", true); + Map vars = bo.getVariables(); + vars.put("ignore", true); + bo.setVariables(vars); RemoteStartProcess startProcess = new RemoteStartProcess(); startProcess.setBusinessId(bo.getContractId().toString()); startProcess.setFlowCode(bo.getFlowCode()); @@ -668,6 +676,62 @@ public class ErpContractInfoServiceImpl implements IErpContractInfoService { return MapstructUtils.convert(add, ErpContractInfoVo.class); } + /** + * 统一补齐合同走 OAC 流程所需字段,并确保会随 insert/update 落库。 + */ + private void fillContractOacParams(ErpContractInfoBo bo) { + if (bo == null) { + return; + } + if (StringUtils.isBlank(bo.getFlowCode())) { + bo.setFlowCode(FLOW_CODE_CONTRACT); + } + if (StringUtils.isBlank(bo.getContractStatus())) { + bo.setContractStatus(OAStatusEnum.APPROVING.getStatus()); + } + if (StringUtils.isBlank(bo.getFlowStatus())) { + bo.setFlowStatus(BusinessStatusEnum.WAITING.getStatus()); + } + Map vars = bo.getVariables(); + if (!vars.containsKey("contractName")) { + vars.put("contractName", bo.getContractName()); + } + if (!vars.containsKey("totalPrice")) { + vars.put("totalPrice", bo.getTotalPrice()); + } + if (!vars.containsKey("businessDirection")) { + vars.put("businessDirection", bo.getBusinessDirection()); + } + if (!vars.containsKey("contractDeptId")) { + vars.put("contractDeptId", bo.getContractDeptId()); + } + if (!vars.containsKey("contractCode")) { + vars.put("contractCode", bo.getContractCode()); + } + /* 1智能轮胎 默认审批人:董兰飞,默认抄送陈海军、张东辉。 + 2轮胎&制品 默认审批人:佟强,默认抄送陈海军、张东辉。 + 3快递&新零售 默认审批人:张东辉,默认抄送陈海军 + 4制造大集成 默认审批人:祁海波,默认抄送陈海军、张东辉 + 5工厂数字化 默认审批人:尹治丰,默认抄送陈海军、张东辉 + */ + if (!vars.containsKey("recipientUserId")) { + String recipientUserId = Objects.equals(bo.getBusinessDirection(), "3") + ? "1985254723705556993" + : "1985254723705556993,1985251968270127105"; + vars.put("recipientUserId", recipientUserId); + } + bo.setVariables(vars); + if (bo.getBizExt() == null) { + bo.setBizExt(new RemoteFlowInstanceBizExt()); + } + if (StringUtils.isBlank(bo.getBizExt().getBusinessTitle())) { + bo.getBizExt().setBusinessTitle(bo.getContractName() + "合同审批"); + } + if (StringUtils.isBlank(bo.getBizExt().getBusinessCode())) { + bo.getBizExt().setBusinessCode(bo.getContractCode()); + } + } + /** * 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成等) * 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 d9f301b3..c6a9b0ca 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 @@ -26,6 +26,7 @@ import org.dromara.oa.erp.mapper.ErpProjectInfoMapper; import org.dromara.oa.erp.mapper.ErpProjectContractsMapper; import org.dromara.oa.erp.mapper.ErpProjectPlanMapper; import org.dromara.oa.erp.mapper.ErpProjectPlanStageMapper; +import org.dromara.oa.erp.service.IErpContractChangeService; import org.dromara.oa.erp.service.IErpContractOrderService; import org.dromara.oa.erp.service.IErpProjectInfoService; import org.dromara.oa.erp.service.IErpProjectTypeService; @@ -70,6 +71,7 @@ public class ErpContractOrderServiceImpl implements IErpContractOrderService { private final ErpContractInfoMapper contractInfoMapper; private final ErpProjectContractsMapper projectContractsMapper; + private final IErpContractChangeService erpContractChangeService; private final IErpProjectInfoService projectInfoService; private final IErpProjectTypeService projectTypeService; @@ -172,6 +174,8 @@ 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()); @@ -317,9 +321,9 @@ public class ErpContractOrderServiceImpl implements IErpContractOrderService { startProcess.setBusinessId(bo.getProjectId().toString()); startProcess.setFlowCode(bo.getFlowCode()); startProcess.setVariables(bo.getVariables()); - startProcess.setBizExt(bo.getBizExt()); bo.getBizExt().setBusinessId(startProcess.getBusinessId()); - bo.getBizExt().setBusinessCode(bo.getProjectCode()); + bo.getBizExt().setBusinessCode(vo.getProjectCode()); + startProcess.setBizExt(bo.getBizExt()); // 含有选择已有项目(projectSource=0):走主流程“提交合同订单并提交流程”,variables 中由前端传入 hasExistProject boolean flagOne = remoteWorkflowService.startCompleteTask(startProcess); if (!flagOne) { diff --git a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpContractChangeMapper.xml b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpContractChangeMapper.xml index e250629e..c019dd21 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpContractChangeMapper.xml +++ b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpContractChangeMapper.xml @@ -7,12 +7,43 @@ diff --git a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpContractInfoMapper.xml b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpContractInfoMapper.xml index 14a8aefc..56591b55 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpContractInfoMapper.xml +++ b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/ErpContractInfoMapper.xml @@ -49,6 +49,7 @@ t.contract_manager_id, t.capitalized_amount, t.contract_template_flag, + t.original_contract_id, t.del_flag, t.create_dept, t.create_by,