1.0.75 合同激活页面(多个项目分金额)添加项目标识(可生成项目或选择项目【睿原审批】)

dev
yinq 4 days ago
parent 1ff3ffdd33
commit 8ec44bf9ee

@ -52,6 +52,11 @@ public class ErpProjectContracts extends TenantEntity {
*/
private String activeFlag;
/**
* 1 0
*/
private String projectSource;
/**
* 0 1
*/

@ -2,12 +2,11 @@ package org.dromara.oa.erp.domain.bo;
import org.dromara.oa.erp.domain.ErpProjectContracts;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.math.BigDecimal;
/**
* erp_project_contracts
@ -50,5 +49,59 @@ public class ErpProjectContractsBo extends BaseEntity {
*/
private String activeFlag;
/**
* 1 0
*/
private String projectSource;
/**
*
*/
private String projectCode;
/**
*
*/
private String projectName;
/**
* ID
*/
private Long deptId;
/**
*
*/
private Long managerId;
/**
*
*/
private Long chargeId;
/**
*
*/
private Long deputyId;
/**
*
*/
private String peopleId;
/**
*
*/
private BigDecimal amount;
/**
* 1 2
*/
private String projectCategory;
/**
* 1 0
*/
private String spareFlag;
}

@ -66,6 +66,17 @@ public class ErpProjectContractsVo implements Serializable {
@ExcelDictFormat(dictType = "active_flag")
private String activeFlag;
/**
* 1 0
*/
private String projectSource;
/**
*
*/
@ExcelProperty(value = "项目编号")
private String projectCode;
/**
*
*/
@ -90,6 +101,24 @@ public class ErpProjectContractsVo implements Serializable {
@ExcelProperty(value = "合同总价")
private BigDecimal totalPrice;
/**
*
*/
@ExcelProperty(value = "部门名称")
private String deptName;
/**
*
*/
@ExcelProperty(value = "项目经理名称")
private String managerName;
/**
*
*/
@ExcelProperty(value = "项目金额")
private BigDecimal amount;
/**
*
*/
@ -104,5 +133,11 @@ public class ErpProjectContractsVo implements Serializable {
@ExcelDictFormat(dictType = "contract_status")
private String contractStatus;
/**
* 1 2
*/
@ExcelProperty(value = "项目类别", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "project_category")
private String projectCategory;
}

@ -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;
}

@ -150,6 +150,7 @@ public class ErpProjectInfoServiceImpl implements IErpProjectInfoService {
for (ErpProjectContractsBo projectContractsBo : projectContractsList) {
projectContractsBo.setProjectId(add.getProjectId());
ErpProjectContracts projectContracts = MapstructUtils.convert(projectContractsBo, ErpProjectContracts.class);
projectContracts.setProjectContractsId(null);
projectContractsMapper.insert(projectContracts);
}
}

@ -14,13 +14,18 @@
t.sort_order,
t.remark,
t.active_flag,
t.project_source,
t.del_flag,
t.create_dept,
t.create_by,
t.create_time,
t.update_by,
t.update_time,
e.project_code,
e.project_name,
d.dept_name deptName,
u.nick_name managerName,
e.amount amount,
c.contract_code,
c.contract_name,
c.total_price,
@ -28,6 +33,8 @@
c.contract_status
from erp_project_contracts t
left join erp_project_info e on e.project_id = t.project_id
left join sys_dept d on d.dept_id = e.dept_id
left join sys_user u on u.user_id = e.manager_id
left join erp_contract_info c on c.contract_id = t.contract_id
${ew.getCustomSqlSegment}
</select>

Loading…
Cancel
Save