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 f6b84ea0..7534e293 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 @@ -164,6 +164,11 @@ public class ErpProjectInfoBo extends BaseEntity { */ private List planStageList; + /** + * 项目关联合同列表 + */ + private List projectContractsList; + public Map getVariables() { if (variables == null) { return new HashMap<>(16); 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 ddf6cd8c..77387b5f 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 @@ -23,6 +23,9 @@ import org.dromara.oa.erp.domain.vo.ErpProjectInfoVo; import org.dromara.oa.erp.domain.ErpProjectInfo; import org.dromara.oa.erp.mapper.ErpProjectInfoMapper; import org.dromara.oa.erp.service.IErpProjectInfoService; +import org.dromara.oa.erp.domain.bo.ErpProjectContractsBo; +import org.dromara.oa.erp.domain.ErpProjectContracts; +import org.dromara.oa.erp.mapper.ErpProjectContractsMapper; import org.apache.dubbo.config.annotation.DubboReference; import org.apache.seata.spring.annotation.GlobalTransactional; import org.dromara.common.core.exception.ServiceException; @@ -33,6 +36,9 @@ import java.util.List; import java.util.Map; import java.util.Collection; import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import org.springframework.transaction.annotation.Transactional; /** * 项目信息Service业务层处理 @@ -47,6 +53,8 @@ public class ErpProjectInfoServiceImpl implements IErpProjectInfoService { private final ErpProjectInfoMapper baseMapper; + private final ErpProjectContractsMapper projectContractsMapper; + @DubboReference(timeout = 30000) private RemoteWorkflowService remoteWorkflowService; @@ -125,12 +133,22 @@ public class ErpProjectInfoServiceImpl implements IErpProjectInfoService { * @return 是否新增成功 */ @Override + @Transactional(rollbackFor = Exception.class) public Boolean insertByBo(ErpProjectInfoBo bo) { ErpProjectInfo add = MapstructUtils.convert(bo, ErpProjectInfo.class); validEntityBeforeSave(add); boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setProjectId(add.getProjectId()); + // 处理项目关联合同列表 + List projectContractsList = bo.getProjectContractsList(); + if (projectContractsList != null && !projectContractsList.isEmpty()) { + for (ErpProjectContractsBo projectContractsBo : projectContractsList) { + projectContractsBo.setProjectId(add.getProjectId()); + ErpProjectContracts projectContracts = MapstructUtils.convert(projectContractsBo, ErpProjectContracts.class); + projectContractsMapper.insert(projectContracts); + } + } } return flag; } @@ -142,10 +160,57 @@ public class ErpProjectInfoServiceImpl implements IErpProjectInfoService { * @return 是否修改成功 */ @Override + @Transactional(rollbackFor = Exception.class) public Boolean updateByBo(ErpProjectInfoBo bo) { ErpProjectInfo update = MapstructUtils.convert(bo, ErpProjectInfo.class); validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; + boolean flag = baseMapper.updateById(update) > 0; + if (flag) { + // 处理项目关联合同列表 + List projectContractsList = bo.getProjectContractsList(); + // 查询原有的关联合同列表 + MPJLambdaWrapper lqwRecord = JoinWrappers.lambda(ErpProjectContracts.class); + lqwRecord.eq(ErpProjectContracts::getProjectId, bo.getProjectId()); + List projectContractsOldList = projectContractsMapper.selectList(lqwRecord); + + if (projectContractsList != null && !projectContractsList.isEmpty()) { + // 获取原有关联合同的ID集合 + Set oldProjectContractsIds = projectContractsOldList.stream() + .map(ErpProjectContracts::getProjectContractsId) + .collect(Collectors.toSet()); + + // 保存新的关联合同列表 + for (ErpProjectContractsBo projectContractsBo : projectContractsList) { + projectContractsBo.setProjectId(bo.getProjectId()); + ErpProjectContracts projectContracts = MapstructUtils.convert(projectContractsBo, ErpProjectContracts.class); + // 如果 projectContractsId 为空或不在原列表中,则新增;否则更新 + if (projectContracts.getProjectContractsId() == null || !oldProjectContractsIds.contains(projectContracts.getProjectContractsId())) { + projectContracts.setProjectContractsId(null); + projectContractsMapper.insert(projectContracts); + } else { + projectContractsMapper.insertOrUpdate(projectContracts); + } + } + // 删除不在新列表中的关联合同 + Set existingProjectContractsIds = projectContractsList.stream() + .map(ErpProjectContractsBo::getProjectContractsId) + .filter(Objects::nonNull) + .filter(oldProjectContractsIds::contains) // 只处理真实ID(在原列表中存在) + .collect(Collectors.toSet()); + List filterProjectContracts = projectContractsOldList.stream() + .filter(contract -> !existingProjectContractsIds.contains(contract.getProjectContractsId())) + .toList(); + for (ErpProjectContracts filterProjectContract : filterProjectContracts) { + projectContractsMapper.deleteById(filterProjectContract.getProjectContractsId()); + } + } else if (projectContractsList != null && projectContractsList.isEmpty()) { + // 如果新列表为空,删除所有原有关联 + for (ErpProjectContracts projectContract : projectContractsOldList) { + projectContractsMapper.deleteById(projectContract.getProjectContractsId()); + } + } + } + return flag; } /**