|
|
|
|
@ -13,17 +13,23 @@ import org.dromara.common.core.utils.StringUtils;
|
|
|
|
|
import org.dromara.common.tenant.helper.TenantHelper;
|
|
|
|
|
import org.dromara.oa.erp.domain.ErpContractInfo;
|
|
|
|
|
import org.dromara.oa.erp.domain.ErpProjectInfo;
|
|
|
|
|
import org.dromara.oa.erp.domain.ErpProjectContracts;
|
|
|
|
|
import org.dromara.oa.erp.domain.ErpProjectPlan;
|
|
|
|
|
import org.dromara.oa.erp.domain.ErpProjectPlanStage;
|
|
|
|
|
import org.dromara.oa.erp.domain.bo.ErpProjectInfoBo;
|
|
|
|
|
import org.dromara.oa.erp.domain.bo.ErpProjectContractsBo;
|
|
|
|
|
import org.dromara.oa.erp.domain.bo.ErpProjectPlanStageBo;
|
|
|
|
|
import org.dromara.oa.erp.domain.vo.ErpContractInfoVo;
|
|
|
|
|
import org.dromara.oa.erp.domain.vo.ErpProjectInfoVo;
|
|
|
|
|
import org.dromara.oa.erp.mapper.ErpContractInfoMapper;
|
|
|
|
|
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.IErpContractOrderService;
|
|
|
|
|
import org.dromara.oa.erp.service.IErpProjectInfoService;
|
|
|
|
|
import org.dromara.oa.erp.service.IErpProjectTypeService;
|
|
|
|
|
import org.dromara.oa.erp.domain.vo.ErpProjectTypeVo;
|
|
|
|
|
import org.dromara.oa.erp.constant.ProjectCategoryConstant;
|
|
|
|
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
|
|
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
|
|
|
|
@ -33,6 +39,7 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
|
|
|
|
import org.dromara.system.api.RemoteCodeRuleService;
|
|
|
|
|
import org.dromara.workflow.api.RemoteWorkflowService;
|
|
|
|
|
import org.dromara.workflow.api.domain.RemoteStartProcess;
|
|
|
|
|
import org.dromara.workflow.api.domain.RemoteFlowInstanceBizExt;
|
|
|
|
|
import org.dromara.workflow.api.event.ProcessEvent;
|
|
|
|
|
import org.springframework.context.event.EventListener;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
@ -41,6 +48,7 @@ import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.Objects;
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
import cn.hutool.core.map.MapUtil;
|
|
|
|
|
import cn.hutool.core.convert.Convert;
|
|
|
|
|
@ -60,7 +68,13 @@ public class ErpContractOrderServiceImpl implements IErpContractOrderService {
|
|
|
|
|
private final ErpProjectPlanMapper projectPlanMapper;
|
|
|
|
|
private final ErpProjectPlanStageMapper planStageMapper;
|
|
|
|
|
private final ErpContractInfoMapper contractInfoMapper;
|
|
|
|
|
private final ErpProjectContractsMapper projectContractsMapper;
|
|
|
|
|
|
|
|
|
|
private final IErpProjectInfoService projectInfoService;
|
|
|
|
|
private final IErpProjectTypeService projectTypeService;
|
|
|
|
|
|
|
|
|
|
/** 项目申请流程编码(新增项目提交时使用) */
|
|
|
|
|
private static final String FLOW_CODE_PROJECT = "xmsq";
|
|
|
|
|
|
|
|
|
|
@DubboReference(timeout = 300000)
|
|
|
|
|
private RemoteWorkflowService remoteWorkflowService;
|
|
|
|
|
@ -182,9 +196,97 @@ public class ErpContractOrderServiceImpl implements IErpContractOrderService {
|
|
|
|
|
// 保存项目阶段计划列表
|
|
|
|
|
savePlanStageList(projectInfo, bo.getPlanStageList());
|
|
|
|
|
|
|
|
|
|
// 保存项目关联合同列表
|
|
|
|
|
saveProjectContractsByContract(bo);
|
|
|
|
|
|
|
|
|
|
return MapstructUtils.convert(projectInfo, ErpProjectInfoVo.class);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 根据合同维度维护项目关联合同列表
|
|
|
|
|
*
|
|
|
|
|
* @param bo 合同订单(项目信息)业务对象
|
|
|
|
|
*/
|
|
|
|
|
private void saveProjectContractsByContract(ErpProjectInfoBo bo) {
|
|
|
|
|
Long contractId = bo.getContractId();
|
|
|
|
|
if (contractId == null) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
List<ErpProjectContractsBo> projectContractsList = bo.getProjectContractsList();
|
|
|
|
|
if (projectContractsList == null) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MPJLambdaWrapper<ErpProjectContracts> lqwRecord = JoinWrappers.lambda(ErpProjectContracts.class);
|
|
|
|
|
lqwRecord.eq(ErpProjectContracts::getContractId, contractId);
|
|
|
|
|
List<ErpProjectContracts> projectContractsOldList = projectContractsMapper.selectList(lqwRecord);
|
|
|
|
|
|
|
|
|
|
if (!projectContractsList.isEmpty()) {
|
|
|
|
|
// 原有关联 ID 集合
|
|
|
|
|
Set<Long> oldIds = projectContractsOldList.stream()
|
|
|
|
|
.map(ErpProjectContracts::getProjectContractsId)
|
|
|
|
|
.filter(Objects::nonNull)
|
|
|
|
|
.collect(Collectors.toSet());
|
|
|
|
|
|
|
|
|
|
// 保存新列表(新增项目 + 新增/更新关联合同)
|
|
|
|
|
for (ErpProjectContractsBo projectContractsBo : projectContractsList) {
|
|
|
|
|
// 项目来源默认:无 projectId 为新增项目(1),否则为选择已有项目(0)
|
|
|
|
|
if (StringUtils.isBlank(projectContractsBo.getProjectSource())) {
|
|
|
|
|
projectContractsBo.setProjectSource(projectContractsBo.getProjectId() == null ? "1" : "0");
|
|
|
|
|
}
|
|
|
|
|
// 如果没有项目ID,说明需要在同一事务中新增项目
|
|
|
|
|
if (projectContractsBo.getProjectId() == null) {
|
|
|
|
|
ErpProjectInfo newProject = new ErpProjectInfo();
|
|
|
|
|
newProject.setProjectCode(projectContractsBo.getProjectCode());
|
|
|
|
|
newProject.setProjectName(projectContractsBo.getProjectName());
|
|
|
|
|
newProject.setDeptId(projectContractsBo.getDeptId());
|
|
|
|
|
newProject.setManagerId(projectContractsBo.getManagerId());
|
|
|
|
|
newProject.setChargeId(projectContractsBo.getChargeId());
|
|
|
|
|
newProject.setDeputyId(projectContractsBo.getDeputyId());
|
|
|
|
|
newProject.setPeopleId(projectContractsBo.getPeopleId());
|
|
|
|
|
newProject.setAmount(projectContractsBo.getAmount());
|
|
|
|
|
newProject.setProjectCategory(projectContractsBo.getProjectCategory());
|
|
|
|
|
newProject.setSpareFlag(projectContractsBo.getSpareFlag());
|
|
|
|
|
newProject.setBusinessDirection(bo.getBusinessDirection());
|
|
|
|
|
newProject.setProjectTypeId(bo.getProjectTypeId());
|
|
|
|
|
newProject.setContractFlag("1");
|
|
|
|
|
newProject.setProjectStatus(OAStatusEnum.DRAFT.getStatus());
|
|
|
|
|
newProject.setFlowStatus(BusinessStatusEnum.DRAFT.getStatus());
|
|
|
|
|
validEntityBeforeSave(newProject);
|
|
|
|
|
projectInfoMapper.insert(newProject);
|
|
|
|
|
projectContractsBo.setProjectId(newProject.getProjectId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
projectContractsBo.setContractId(contractId);
|
|
|
|
|
ErpProjectContracts projectContracts = MapstructUtils.convert(projectContractsBo, ErpProjectContracts.class);
|
|
|
|
|
if (projectContracts.getProjectContractsId() == null || !oldIds.contains(projectContracts.getProjectContractsId())) {
|
|
|
|
|
projectContracts.setProjectContractsId(null);
|
|
|
|
|
projectContractsMapper.insert(projectContracts);
|
|
|
|
|
} else {
|
|
|
|
|
projectContractsMapper.insertOrUpdate(projectContracts);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 删除在旧列表中但不在新列表中的关联
|
|
|
|
|
Set<Long> existingIds = projectContractsList.stream()
|
|
|
|
|
.map(ErpProjectContractsBo::getProjectContractsId)
|
|
|
|
|
.filter(Objects::nonNull)
|
|
|
|
|
.filter(oldIds::contains)
|
|
|
|
|
.collect(Collectors.toSet());
|
|
|
|
|
List<ErpProjectContracts> toDelete = projectContractsOldList.stream()
|
|
|
|
|
.filter(contract -> !existingIds.contains(contract.getProjectContractsId()))
|
|
|
|
|
.toList();
|
|
|
|
|
for (ErpProjectContracts item : toDelete) {
|
|
|
|
|
projectContractsMapper.deleteById(item.getProjectContractsId());
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 新列表为空:删除该合同下所有原有关联
|
|
|
|
|
for (ErpProjectContracts item : projectContractsOldList) {
|
|
|
|
|
projectContractsMapper.deleteById(item.getProjectContractsId());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 修改合同订单(项目信息)
|
|
|
|
|
*
|
|
|
|
|
@ -218,11 +320,64 @@ public class ErpContractOrderServiceImpl implements IErpContractOrderService {
|
|
|
|
|
startProcess.setBizExt(bo.getBizExt());
|
|
|
|
|
bo.getBizExt().setBusinessId(startProcess.getBusinessId());
|
|
|
|
|
bo.getBizExt().setBusinessCode(bo.getProjectCode());
|
|
|
|
|
// 含有选择已有项目(projectSource=0):走主流程“提交合同订单并提交流程”,variables 中由前端传入 hasExistProject
|
|
|
|
|
boolean flagOne = remoteWorkflowService.startCompleteTask(startProcess);
|
|
|
|
|
if (!flagOne) {
|
|
|
|
|
throw new ServiceException("流程发起异常");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 关联项目:仅新增项目走项目申请流程;选择已有项目不走 xzxm,仅走主流程(variables 含 hasExistProject)
|
|
|
|
|
List<ErpProjectContractsBo> projectContractsList = bo.getProjectContractsList();
|
|
|
|
|
if (CollUtil.isNotEmpty(projectContractsList)) {
|
|
|
|
|
for (ErpProjectContractsBo pc : projectContractsList) {
|
|
|
|
|
if (pc.getProjectId() == null) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
if ("1".equals(pc.getProjectSource())) {
|
|
|
|
|
// 新增项目:走项目申请流程,variables/bizExt 与项目申请页 edit 保持一致
|
|
|
|
|
ErpProjectInfoVo projectVo = projectInfoService.queryById(pc.getProjectId());
|
|
|
|
|
if (projectVo != null) {
|
|
|
|
|
ErpProjectInfoBo projectBo = new ErpProjectInfoBo();
|
|
|
|
|
projectBo.setProjectId(projectVo.getProjectId());
|
|
|
|
|
projectBo.setProjectCode(projectVo.getProjectCode());
|
|
|
|
|
projectBo.setProjectName(projectVo.getProjectName());
|
|
|
|
|
projectBo.setContractFlag(projectVo.getContractFlag());
|
|
|
|
|
projectBo.setProjectTypeId(projectVo.getProjectTypeId());
|
|
|
|
|
projectBo.setFlowCode(FLOW_CODE_PROJECT);
|
|
|
|
|
Map<String, Object> 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();
|
|
|
|
|
if (projectBizExt == null) {
|
|
|
|
|
projectBizExt = new RemoteFlowInstanceBizExt();
|
|
|
|
|
projectBo.setBizExt(projectBizExt);
|
|
|
|
|
}
|
|
|
|
|
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());
|
|
|
|
|
projectInfoService.projectSubmitAndFlowStart(projectBo);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.warn("关联项目流程发起失败 projectId={} projectSource={}", pc.getProjectId(), pc.getProjectSource(), e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return vo;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|