1.0.88 合同内容变更提交修改流程

dev
yinq 4 months ago
parent 833d5663f6
commit 6257b52b10

@ -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<ErpContractChangeVo> submitContentChange(@RequestBody ErpContractChangeSaveBo bo) {
return R.ok(erpContractChangeService.submitContentChange(bo));
}
/**
*
*/

@ -140,6 +140,11 @@ public class ErpContractChange extends TenantEntity {
*/
private String remark;
/**
* ID=1使
*/
private Long newContractId;
/**
* (1 0)
*/

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

@ -140,6 +140,11 @@ public class ErpContractChangeBo extends BaseEntity {
*/
private String remark;
/**
* ID
*/
private Long newContractId;
/**
* (1 0)
*/

@ -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;
/**
*
*/

@ -183,6 +183,11 @@ public class ErpContractChangeVo implements Serializable {
@ExcelProperty(value = "备注")
private String remark;
/**
* ID
*/
private Long newContractId;
/**
* (1 0)
*/

@ -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;
/**
*
*/

@ -99,4 +99,20 @@ public interface IErpContractChangeService {
* @return VO
*/
ErpContractChangeVo contractChangeSubmitAndFlowStart(ErpContractChangeSaveBo bo);
/**
* HTBG new_contract_idOAC
*
* @param bo + changeInfo + changeMaterialList + changePaymentMethodList
* @return VO newContractId
*/
ErpContractChangeVo submitContentChange(ErpContractChangeSaveBo bo);
/**
*
* /
*
* @param newContractId ID
*/
void onActivateNewContractFromChange(Long newContractId);
}

@ -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_idOAC
*
*
* @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<ErpContractMaterial> 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<ErpContractPaymentMethod> 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<ErpContractChange> list = baseMapper.selectList(
new LambdaQueryWrapper<ErpContractChange>()
.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<ErpProjectContracts> oldLinks = projectContractsMapper.selectList(
new LambdaQueryWrapper<ErpProjectContracts>().eq(ErpProjectContracts::getContractId, originalContractId));
for (ErpProjectContracts oldLink : oldLinks) {
long cnt = projectContractsMapper.selectCount(
new LambdaQueryWrapper<ErpProjectContracts>()
.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
*/

@ -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<String, Object> 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<String, Object> 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());
}
}
/**
* (: 稿退)
*

@ -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) {

@ -7,12 +7,43 @@
</resultMap>
<select id="selectCustomErpContractChangeVoList" resultMap="ErpContractChangeResult">
select t.contract_change_id, t.tenant_id, t.contract_id, t.change_code, t.change_type, t.change_contract_code, t.change_contract_name, t.customer_name, t.change_contract_amount, t.contract_code, t.contract_name, t.original_customer_name, t.original_contract_amount, t.change_reason, t.apply_time, t.undertake_dept_id, t.undertake_by, t.industry_region, t.seal_legal_entity, t.change_status, t.flow_status, t.write_back_flag, t.write_back_time, t.remark, t.active_flag, t.del_flag, t.create_dept, t.create_by, t.create_time, t.update_by, t.update_time,
select t.contract_change_id,
t.tenant_id,
t.contract_id,
t.change_code,
t.change_type,
t.change_contract_code,
t.change_contract_name,
t.customer_name,
t.change_contract_amount,
t.contract_code,
t.contract_name,
t.original_customer_name,
t.original_contract_amount,
t.change_reason,
t.apply_time,
t.undertake_dept_id,
t.undertake_by,
t.industry_region,
t.seal_legal_entity,
t.change_status,
t.flow_status,
t.write_back_flag,
t.write_back_time,
t.new_contract_id,
t.remark,
t.active_flag,
t.del_flag,
t.create_dept,
t.create_by,
t.create_time,
t.update_by,
t.update_time,
d.dept_name as undertake_dept_name,
u.nick_name as undertake_by_name
from erp_contract_change t
left join sys_dept d on d.dept_id = t.undertake_dept_id
left join sys_user u on u.user_id = t.undertake_by
left join sys_dept d on d.dept_id = t.undertake_dept_id
left join sys_user u on u.user_id = t.undertake_by
${ew.getCustomSqlSegment}
</select>

@ -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,

Loading…
Cancel
Save