1.0.80 合同变更审批流完善

dev
yinq 6 days ago
parent bd7b76767f
commit 3c25f0e0cc

@ -94,6 +94,17 @@ public class ErpContractChangeController extends BaseController {
return R.ok(erpContractChangeService.saveContractChange(bo)); return R.ok(erpContractChangeService.saveContractChange(bo));
} }
/**
*
*/
@SaCheckPermission("oa/erp:contractChange:add")
@Log(title = "合同变更", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/contractChangeSubmitAndFlowStart")
public R<ErpContractChangeVo> contractChangeSubmitAndFlowStart(@RequestBody ErpContractChangeSaveBo bo) {
return R.ok(erpContractChangeService.contractChangeSubmitAndFlowStart(bo));
}
/** /**
* *
*/ */

@ -1,6 +1,7 @@
package org.dromara.oa.erp.domain.bo; package org.dromara.oa.erp.domain.bo;
import lombok.Data; import lombok.Data;
import org.dromara.workflow.api.domain.RemoteFlowInstanceBizExt;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
@ -8,6 +9,8 @@ import jakarta.validation.constraints.NotNull;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Objects;
/** /**
* +++ * +++
@ -115,4 +118,34 @@ public class ErpContractChangeSaveBo {
* 使 * 使
*/ */
private List<ErpContractChangePaymentMethodBo> changePaymentMethodList; private List<ErpContractChangePaymentMethodBo> changePaymentMethodList;
/**
*
*/
private String flowCode;
/**
* 使
*/
private Map<String, Object> variables;
/**
* 使
*/
private RemoteFlowInstanceBizExt bizExt;
public Map<String, Object> getVariables() {
if (variables == null) {
return new java.util.HashMap<>(16);
}
variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue()));
return variables;
}
public RemoteFlowInstanceBizExt getBizExt() {
if (bizExt == null) {
bizExt = new RemoteFlowInstanceBizExt();
}
return bizExt;
}
} }

@ -90,5 +90,13 @@ public interface IErpContractChangeService {
* *
* @param contractChangeId ID * @param contractChangeId ID
*/ */
void writeBackToContract(Long contractChangeId); void writeBackToContract(ErpContractChange contractChangeId);
/**
*
*
* @param bo + flowCodevariablesbizExt
* @return VO
*/
ErpContractChangeVo contractChangeSubmitAndFlowStart(ErpContractChangeSaveBo bo);
} }

@ -1,8 +1,11 @@
package org.dromara.oa.erp.service.impl; package org.dromara.oa.erp.service.impl;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.map.MapUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.enums.BusinessStatusEnum; import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.enums.OAStatusEnum;
import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.oa.erp.domain.bo.ErpContractChangeMaterialBo; import org.dromara.oa.erp.domain.bo.ErpContractChangeMaterialBo;
import org.dromara.oa.erp.domain.bo.ErpContractChangePaymentMethodBo; import org.dromara.oa.erp.domain.bo.ErpContractChangePaymentMethodBo;
@ -25,24 +28,34 @@ import org.dromara.oa.erp.domain.vo.*;
import org.dromara.oa.erp.mapper.*; import org.dromara.oa.erp.mapper.*;
import org.dromara.oa.erp.service.IErpContractChangeService; import org.dromara.oa.erp.service.IErpContractChangeService;
import org.dromara.system.api.RemoteCodeRuleService; import org.dromara.system.api.RemoteCodeRuleService;
import org.dromara.workflow.api.RemoteWorkflowService;
import org.dromara.workflow.api.domain.RemoteStartProcess;
import org.dromara.common.core.exception.ServiceException;
import org.apache.seata.spring.annotation.GlobalTransactional;
import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboReference;
import java.util.Collection; import java.util.*;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/** /**
* Service * Service
* <p>
*
* /
* </p>
* <p>
* {@code @TableLogic}Mapper delete UPDATE del_flag
* </p>
* *
* @author Yinq * @author Yinq
* @date 2026-03-07 * @date 2026-03-07
*/ */
@RequiredArgsConstructor @RequiredArgsConstructor
@Service @Service
@Slf4j
public class ErpContractChangeServiceImpl implements IErpContractChangeService { public class ErpContractChangeServiceImpl implements IErpContractChangeService {
// ---------- 主表及子表 Mapper ----------
private final ErpContractChangeMapper baseMapper; private final ErpContractChangeMapper baseMapper;
private final ErpContractChangeInfoMapper changeInfoMapper; private final ErpContractChangeInfoMapper changeInfoMapper;
private final ErpContractChangeMaterialMapper changeMaterialMapper; private final ErpContractChangeMaterialMapper changeMaterialMapper;
@ -54,50 +67,55 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
@DubboReference @DubboReference
private RemoteCodeRuleService remoteCodeRuleService; private RemoteCodeRuleService remoteCodeRuleService;
/** 合同变更流程编码 */ @DubboReference(timeout = 30000)
private RemoteWorkflowService remoteWorkflowService;
/** 合同变更流程定义编码(与流程引擎中 flowCode 一致) */
public static final String FLOW_CODE_CONTRACT_CHANGE = "HTBG"; public static final String FLOW_CODE_CONTRACT_CHANGE = "HTBG";
/** 变更编号编码规则 */ /** 变更编号规则编码(调用编码规则服务生成变更编号) */
private static final String CONTRACT_CHANGE_CODE_RULE = "1021"; private static final String CONTRACT_CHANGE_CODE_RULE = "1021";
/** 变更类型1内容变更 2解除合同 */ /** 变更类型1-内容变更(需维护变更后信息/物料/付款方式快照) */
private static final String CHANGE_TYPE_CONTENT = "1"; private static final String CHANGE_TYPE_CONTENT = "1";
/** 变更类型2-解除合同(仅更新原合同激活标识) */
private static final String CHANGE_TYPE_TERMINATE = "2"; private static final String CHANGE_TYPE_TERMINATE = "2";
/** 未回写 */ /** 回写标识0-未回写 */
private static final String WRITE_BACK_NO = "0"; private static final String WRITE_BACK_NO = "0";
/** 已回写/可用 */ /** 回写标识1-已回写(审批通过并已写回原合同后不再允许修改回写相关字段) */
private static final String WRITE_BACK_YES = "1"; private static final String WRITE_BACK_YES = "1";
/** 变更状态3-可用(审批完成且已回写后的终态) */
private static final String CHANGE_STATUS_AVAILABLE = "3"; private static final String CHANGE_STATUS_AVAILABLE = "3";
/** /**
* *
* *
* @param contractChangeId * @param contractChangeId
* @return * @return VO null
*/ */
@Override @Override
public ErpContractChangeVo queryById(Long contractChangeId){ public ErpContractChangeVo queryById(Long contractChangeId) {
return baseMapper.selectVoById(contractChangeId); return baseMapper.selectVoById(contractChangeId);
} }
/** /**
* * queryList
* *
* @param bo * @param bo
* @param pageQuery * @param pageQuery
* @return * @return
*/ */
@Override @Override
public TableDataInfo<ErpContractChangeVo> queryPageList(ErpContractChangeBo bo, PageQuery pageQuery) { public TableDataInfo<ErpContractChangeVo> queryPageList(ErpContractChangeBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<ErpContractChange> lqw = buildQueryWrapper(bo); MPJLambdaWrapper<ErpContractChange> lqw = buildQueryWrapper(bo);
Page<ErpContractChangeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); Page<ErpContractChangeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result); return TableDataInfo.build(result);
} }
/** /**
* *
* *
* @param bo * @param bo
* @return * @return
*/ */
@Override @Override
public List<ErpContractChangeVo> queryList(ErpContractChangeBo bo) { public List<ErpContractChangeVo> queryList(ErpContractChangeBo bo) {
@ -105,38 +123,43 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
return baseMapper.selectVoList(lqw); return baseMapper.selectVoList(lqw);
} }
/**
* / bo /
*/
private MPJLambdaWrapper<ErpContractChange> buildQueryWrapper(ErpContractChangeBo bo) { private MPJLambdaWrapper<ErpContractChange> buildQueryWrapper(ErpContractChangeBo bo) {
return JoinWrappers.lambda(ErpContractChange.class) return JoinWrappers.lambda(ErpContractChange.class)
.selectAll(ErpContractChange.class) .selectAll(ErpContractChange.class)
.eq(ErpContractChange::getDelFlag, "0") .eq(ErpContractChange::getDelFlag, "0")
.eq(bo.getContractId() != null, ErpContractChange::getContractId, bo.getContractId()) .eq(bo.getContractId() != null, ErpContractChange::getContractId, bo.getContractId())
.eq(StringUtils.isNotBlank(bo.getChangeCode()), ErpContractChange::getChangeCode, bo.getChangeCode()) .eq(StringUtils.isNotBlank(bo.getChangeCode()), ErpContractChange::getChangeCode, bo.getChangeCode())
.eq(StringUtils.isNotBlank(bo.getChangeType()), ErpContractChange::getChangeType, bo.getChangeType()) .eq(StringUtils.isNotBlank(bo.getChangeType()), ErpContractChange::getChangeType, bo.getChangeType())
.eq(StringUtils.isNotBlank(bo.getChangeContractCode()), ErpContractChange::getChangeContractCode, bo.getChangeContractCode()) .eq(StringUtils.isNotBlank(bo.getChangeContractCode()), ErpContractChange::getChangeContractCode, bo.getChangeContractCode())
.like(StringUtils.isNotBlank(bo.getChangeContractName()), ErpContractChange::getChangeContractName, bo.getChangeContractName()) .like(StringUtils.isNotBlank(bo.getChangeContractName()), ErpContractChange::getChangeContractName, bo.getChangeContractName())
.like(StringUtils.isNotBlank(bo.getCustomerName()), ErpContractChange::getCustomerName, bo.getCustomerName()) .like(StringUtils.isNotBlank(bo.getCustomerName()), ErpContractChange::getCustomerName, bo.getCustomerName())
.eq(bo.getChangeContractAmount() != null, ErpContractChange::getChangeContractAmount, bo.getChangeContractAmount()) .eq(bo.getChangeContractAmount() != null, ErpContractChange::getChangeContractAmount, bo.getChangeContractAmount())
.eq(StringUtils.isNotBlank(bo.getContractCode()), ErpContractChange::getContractCode, bo.getContractCode()) .eq(StringUtils.isNotBlank(bo.getContractCode()), ErpContractChange::getContractCode, bo.getContractCode())
.like(StringUtils.isNotBlank(bo.getContractName()), ErpContractChange::getContractName, bo.getContractName()) .like(StringUtils.isNotBlank(bo.getContractName()), ErpContractChange::getContractName, bo.getContractName())
.like(StringUtils.isNotBlank(bo.getOriginalCustomerName()), ErpContractChange::getOriginalCustomerName, bo.getOriginalCustomerName()) .like(StringUtils.isNotBlank(bo.getOriginalCustomerName()), ErpContractChange::getOriginalCustomerName, bo.getOriginalCustomerName())
.eq(bo.getOriginalContractAmount() != null, ErpContractChange::getOriginalContractAmount, bo.getOriginalContractAmount()) .eq(bo.getOriginalContractAmount() != null, ErpContractChange::getOriginalContractAmount, bo.getOriginalContractAmount())
.eq(StringUtils.isNotBlank(bo.getChangeReason()), ErpContractChange::getChangeReason, bo.getChangeReason()) .eq(StringUtils.isNotBlank(bo.getChangeReason()), ErpContractChange::getChangeReason, bo.getChangeReason())
.eq(bo.getApplyTime() != null, ErpContractChange::getApplyTime, bo.getApplyTime()) .eq(bo.getApplyTime() != null, ErpContractChange::getApplyTime, bo.getApplyTime())
.eq(bo.getUndertakeDeptId() != null, ErpContractChange::getUndertakeDeptId, bo.getUndertakeDeptId()) .eq(bo.getUndertakeDeptId() != null, ErpContractChange::getUndertakeDeptId, bo.getUndertakeDeptId())
.eq(bo.getUndertakeBy() != null, ErpContractChange::getUndertakeBy, bo.getUndertakeBy()) .eq(bo.getUndertakeBy() != null, ErpContractChange::getUndertakeBy, bo.getUndertakeBy())
.eq(StringUtils.isNotBlank(bo.getIndustryRegion()), ErpContractChange::getIndustryRegion, bo.getIndustryRegion()) .eq(StringUtils.isNotBlank(bo.getIndustryRegion()), ErpContractChange::getIndustryRegion, bo.getIndustryRegion())
.eq(StringUtils.isNotBlank(bo.getSealLegalEntity()), ErpContractChange::getSealLegalEntity, bo.getSealLegalEntity()) .eq(StringUtils.isNotBlank(bo.getSealLegalEntity()), ErpContractChange::getSealLegalEntity, bo.getSealLegalEntity())
.eq(StringUtils.isNotBlank(bo.getChangeStatus()), ErpContractChange::getChangeStatus, bo.getChangeStatus()) .eq(StringUtils.isNotBlank(bo.getChangeStatus()), ErpContractChange::getChangeStatus, bo.getChangeStatus())
.eq(StringUtils.isNotBlank(bo.getFlowStatus()), ErpContractChange::getFlowStatus, bo.getFlowStatus()) .eq(StringUtils.isNotBlank(bo.getFlowStatus()), ErpContractChange::getFlowStatus, bo.getFlowStatus())
.eq(StringUtils.isNotBlank(bo.getWriteBackFlag()), ErpContractChange::getWriteBackFlag, bo.getWriteBackFlag()) .eq(StringUtils.isNotBlank(bo.getWriteBackFlag()), ErpContractChange::getWriteBackFlag, bo.getWriteBackFlag())
.eq(bo.getWriteBackTime() != null, ErpContractChange::getWriteBackTime, bo.getWriteBackTime()) .eq(bo.getWriteBackTime() != null, ErpContractChange::getWriteBackTime, bo.getWriteBackTime())
.eq(StringUtils.isNotBlank(bo.getActiveFlag()), ErpContractChange::getActiveFlag, bo.getActiveFlag()); .eq(StringUtils.isNotBlank(bo.getActiveFlag()), ErpContractChange::getActiveFlag, bo.getActiveFlag());
} }
// ======================= 主表增删改(单表) =======================
/** /**
* *
* *
* @param bo * @param bo BO bo
* @return * @return
*/ */
@Override @Override
@ -151,9 +174,9 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
} }
/** /**
* *
* *
* @param bo * @param bo BO
* @return * @return
*/ */
@Override @Override
@ -164,7 +187,7 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
} }
/** /**
* * ID
*/ */
private void validEntityBeforeSave(ErpContractChange entity) { private void validEntityBeforeSave(ErpContractChange entity) {
if (entity.getContractId() == null) { if (entity.getContractId() == null) {
@ -176,20 +199,34 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
} }
/** /**
* * ErpContractChange @TableLogic UPDATE del_flag
* isValid true
* *
* @param ids * @param ids
* @param isValid * @param isValid
* @return * @return
*/ */
@Override @Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){ if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验 // TODO 按业务需要补充:如已回写、审批中等不允许删除等
} }
return baseMapper.deleteByIds(ids) > 0; return baseMapper.deleteByIds(ids) > 0;
} }
// ======================= 保存与提交流程 =======================
/**
* + //
* <ul>
* <li> bo </li>
* <li></li>
* <li></li>
* </ul>
*
* @param bo + changeInfo / changeMaterialList / changePaymentMethodList
* @return
*/
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long saveContractChange(ErpContractChangeSaveBo bo) { public Long saveContractChange(ErpContractChangeSaveBo bo) {
@ -198,12 +235,14 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
validEntityBeforeSave(main); validEntityBeforeSave(main);
if (isUpdate) { if (isUpdate) {
// 已回写的数据不允许覆盖回写相关字段
ErpContractChange existing = baseMapper.selectById(main.getContractChangeId()); ErpContractChange existing = baseMapper.selectById(main.getContractChangeId());
if (existing != null && StringUtils.isNotBlank(existing.getWriteBackFlag()) && WRITE_BACK_YES.equals(existing.getWriteBackFlag())) { if (existing != null && StringUtils.isNotBlank(existing.getWriteBackFlag()) && WRITE_BACK_YES.equals(existing.getWriteBackFlag())) {
main.setWriteBackFlag(existing.getWriteBackFlag()); main.setWriteBackFlag(existing.getWriteBackFlag());
main.setWriteBackTime(existing.getWriteBackTime()); main.setWriteBackTime(existing.getWriteBackTime());
} }
baseMapper.updateById(main); baseMapper.updateById(main);
// 内容变更时子表采用「先逻辑删除后新增」,保证与前端提交一致(子表实体带 @TableLogic
if (CHANGE_TYPE_CONTENT.equals(bo.getChangeType())) { if (CHANGE_TYPE_CONTENT.equals(bo.getChangeType())) {
deleteChangeSubByChangeId(main.getContractChangeId()); deleteChangeSubByChangeId(main.getContractChangeId());
} }
@ -217,6 +256,7 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
bo.setChangeCode(main.getChangeCode()); bo.setChangeCode(main.getChangeCode());
} }
// 内容变更时写入/更新:变更信息快照、物料快照、付款方式快照(子表主键置空表示新增)
if (CHANGE_TYPE_CONTENT.equals(bo.getChangeType())) { if (CHANGE_TYPE_CONTENT.equals(bo.getChangeType())) {
Long changeId = main.getContractChangeId(); Long changeId = main.getContractChangeId();
if (bo.getChangeInfo() != null) { if (bo.getChangeInfo() != null) {
@ -245,6 +285,36 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
return main.getContractChangeId(); return main.getContractChangeId();
} }
/**
* contractSubmitAndFlowStart
*
*
* @param bo + flowCodevariablesbizExt
* @return VO
*/
@Override
@GlobalTransactional(rollbackFor = Exception.class)
public ErpContractChangeVo contractChangeSubmitAndFlowStart(ErpContractChangeSaveBo bo) {
Long changeId = saveContractChange(bo);
bo.setContractChangeId(changeId);
// 后端发起时忽略权限校验
bo.getVariables().put("ignore", true);
RemoteStartProcess startProcess = new RemoteStartProcess();
startProcess.setBusinessId(changeId.toString());
startProcess.setFlowCode(bo.getFlowCode());
startProcess.setVariables(bo.getVariables());
startProcess.setBizExt(bo.getBizExt());
bo.getBizExt().setBusinessId(startProcess.getBusinessId());
boolean flag = remoteWorkflowService.startCompleteTask(startProcess);
if (!flag) {
throw new ServiceException("流程发起异常");
}
return baseMapper.selectVoById(changeId);
}
/**
* SaveBo 1 1
*/
private ErpContractChange buildMainEntity(ErpContractChangeSaveBo bo) { private ErpContractChange buildMainEntity(ErpContractChangeSaveBo bo) {
ErpContractChange e = new ErpContractChange(); ErpContractChange e = new ErpContractChange();
e.setContractChangeId(bo.getContractChangeId()); e.setContractChangeId(bo.getContractChangeId());
@ -275,15 +345,27 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
return e; return e;
} }
/**
* ID
* @TableLogicMapper.delete UPDATE del_flag
*/
private void deleteChangeSubByChangeId(Long contractChangeId) { private void deleteChangeSubByChangeId(Long contractChangeId) {
changeInfoMapper.delete(new LambdaQueryWrapper<ErpContractChangeInfo>() changeInfoMapper.delete(new LambdaQueryWrapper<ErpContractChangeInfo>()
.eq(ErpContractChangeInfo::getContractChangeId, contractChangeId)); .eq(ErpContractChangeInfo::getContractChangeId, contractChangeId));
changeMaterialMapper.delete(new LambdaQueryWrapper<ErpContractChangeMaterial>() changeMaterialMapper.delete(new LambdaQueryWrapper<ErpContractChangeMaterial>()
.eq(ErpContractChangeMaterial::getContractChangeId, contractChangeId)); .eq(ErpContractChangeMaterial::getContractChangeId, contractChangeId));
changePaymentMethodMapper.delete(new LambdaQueryWrapper<ErpContractChangePaymentMethod>() changePaymentMethodMapper.delete(new LambdaQueryWrapper<ErpContractChangePaymentMethod>()
.eq(ErpContractChangePaymentMethod::getContractChangeId, contractChangeId)); .eq(ErpContractChangePaymentMethod::getContractChangeId, contractChangeId));
} }
// ======================= 详情与回写 =======================
/**
* + + +
*
* @param contractChangeId
* @return VO main null
*/
@Override @Override
public ContractChangeDetailVo queryDetailById(Long contractChangeId) { public ContractChangeDetailVo queryDetailById(Long contractChangeId) {
ContractChangeDetailVo vo = new ContractChangeDetailVo(); ContractChangeDetailVo vo = new ContractChangeDetailVo();
@ -292,19 +374,24 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
return vo; return vo;
} }
List<ErpContractChangeInfoVo> infoList = changeInfoMapper.selectVoList( List<ErpContractChangeInfoVo> infoList = changeInfoMapper.selectVoList(
new LambdaQueryWrapper<ErpContractChangeInfo>().eq(ErpContractChangeInfo::getContractChangeId, contractChangeId)); new LambdaQueryWrapper<ErpContractChangeInfo>().eq(ErpContractChangeInfo::getContractChangeId, contractChangeId));
vo.setChangeInfo(infoList.isEmpty() ? null : infoList.get(0)); vo.setChangeInfo(infoList.isEmpty() ? null : infoList.get(0));
vo.setChangeMaterialList(changeMaterialMapper.selectVoList( vo.setChangeMaterialList(changeMaterialMapper.selectVoList(
new LambdaQueryWrapper<ErpContractChangeMaterial>().eq(ErpContractChangeMaterial::getContractChangeId, contractChangeId))); new LambdaQueryWrapper<ErpContractChangeMaterial>().eq(ErpContractChangeMaterial::getContractChangeId, contractChangeId)));
vo.setChangePaymentMethodList(changePaymentMethodMapper.selectVoList( vo.setChangePaymentMethodList(changePaymentMethodMapper.selectVoList(
new LambdaQueryWrapper<ErpContractChangePaymentMethod>().eq(ErpContractChangePaymentMethod::getContractChangeId, contractChangeId))); new LambdaQueryWrapper<ErpContractChangePaymentMethod>().eq(ErpContractChangePaymentMethod::getContractChangeId, contractChangeId)));
return vo; return vo;
} }
/**
*
* 0//
*
* @param change contractIdchangeType
*/
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void writeBackToContract(Long contractChangeId) { public void writeBackToContract(ErpContractChange change) {
ErpContractChange change = baseMapper.selectById(contractChangeId);
if (change == null || !WRITE_BACK_NO.equals(change.getWriteBackFlag())) { if (change == null || !WRITE_BACK_NO.equals(change.getWriteBackFlag())) {
return; return;
} }
@ -312,7 +399,7 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
if (CHANGE_TYPE_TERMINATE.equals(change.getChangeType())) { if (CHANGE_TYPE_TERMINATE.equals(change.getChangeType())) {
doWriteBackTerminate(contractId); doWriteBackTerminate(contractId);
} else { } else {
doWriteBackContent(contractChangeId, contractId); doWriteBackContent(change.getContractChangeId(), contractId);
} }
change.setChangeStatus(CHANGE_STATUS_AVAILABLE); change.setChangeStatus(CHANGE_STATUS_AVAILABLE);
change.setFlowStatus(BusinessStatusEnum.FINISH.getStatus()); change.setFlowStatus(BusinessStatusEnum.FINISH.getStatus());
@ -321,6 +408,7 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
baseMapper.updateById(change); baseMapper.updateById(change);
} }
/** 解除合同回写:将原合同激活标识置为 0 */
private void doWriteBackTerminate(Long contractId) { private void doWriteBackTerminate(Long contractId) {
ErpContractInfo info = contractInfoMapper.selectById(contractId); ErpContractInfo info = contractInfoMapper.selectById(contractId);
if (info != null) { if (info != null) {
@ -329,9 +417,12 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
} }
} }
/**
* / @TableLogic
*/
private void doWriteBackContent(Long contractChangeId, Long contractId) { private void doWriteBackContent(Long contractChangeId, Long contractId) {
List<ErpContractChangeInfoVo> infoList = changeInfoMapper.selectVoList( List<ErpContractChangeInfoVo> infoList = changeInfoMapper.selectVoList(
new LambdaQueryWrapper<ErpContractChangeInfo>().eq(ErpContractChangeInfo::getContractChangeId, contractChangeId)); new LambdaQueryWrapper<ErpContractChangeInfo>().eq(ErpContractChangeInfo::getContractChangeId, contractChangeId));
if (!infoList.isEmpty()) { if (!infoList.isEmpty()) {
ErpContractInfo contractInfo = contractInfoMapper.selectById(contractId); ErpContractInfo contractInfo = contractInfoMapper.selectById(contractId);
if (contractInfo != null) { if (contractInfo != null) {
@ -339,35 +430,67 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
contractInfoMapper.updateById(contractInfo); contractInfoMapper.updateById(contractInfo);
} }
} }
// 逻辑删除原合同下物料(@TableLogic
LambdaQueryWrapper<ErpContractMaterial> materialDel = new LambdaQueryWrapper<ErpContractMaterial>().eq(ErpContractMaterial::getContractId, contractId); LambdaQueryWrapper<ErpContractMaterial> materialDel = new LambdaQueryWrapper<ErpContractMaterial>().eq(ErpContractMaterial::getContractId, contractId);
contractMaterialMapper.delete(materialDel); contractMaterialMapper.delete(materialDel);
List<ErpContractChangeMaterial> materials = changeMaterialMapper.selectList( List<ErpContractChangeMaterial> materials = changeMaterialMapper.selectList(
new LambdaQueryWrapper<ErpContractChangeMaterial>().eq(ErpContractChangeMaterial::getContractChangeId, contractChangeId)); new LambdaQueryWrapper<ErpContractChangeMaterial>().eq(ErpContractChangeMaterial::getContractChangeId, contractChangeId));
for (ErpContractChangeMaterial m : materials) { for (ErpContractChangeMaterial m : materials) {
contractMaterialMapper.insert(copyChangeMaterialToContract(m, contractId)); contractMaterialMapper.insert(copyChangeMaterialToContract(m, contractId));
} }
// 逻辑删除原合同下付款方式(@TableLogic
LambdaQueryWrapper<ErpContractPaymentMethod> paymentDel = new LambdaQueryWrapper<ErpContractPaymentMethod>().eq(ErpContractPaymentMethod::getContractId, contractId); LambdaQueryWrapper<ErpContractPaymentMethod> paymentDel = new LambdaQueryWrapper<ErpContractPaymentMethod>().eq(ErpContractPaymentMethod::getContractId, contractId);
contractPaymentMethodMapper.delete(paymentDel); contractPaymentMethodMapper.delete(paymentDel);
List<ErpContractChangePaymentMethod> payments = changePaymentMethodMapper.selectList( List<ErpContractChangePaymentMethod> payments = changePaymentMethodMapper.selectList(
new LambdaQueryWrapper<ErpContractChangePaymentMethod>().eq(ErpContractChangePaymentMethod::getContractChangeId, contractChangeId)); new LambdaQueryWrapper<ErpContractChangePaymentMethod>().eq(ErpContractChangePaymentMethod::getContractChangeId, contractChangeId));
for (ErpContractChangePaymentMethod p : payments) { for (ErpContractChangePaymentMethod p : payments) {
contractPaymentMethodMapper.insert(copyChangePaymentToContract(p, contractId)); contractPaymentMethodMapper.insert(copyChangePaymentToContract(p, contractId));
} }
} }
// ======================= 流程监听 =======================
/** /**
* * flowCode=HTBG flowStatus/changeStatus
* <ul>
* <li>WAITING -> </li>
* <li>FINISH -> writeBackToContract</li>
* <li>INVALID/TERMINATION -> </li>
* <li>BACK/CANCEL -> 稿</li>
* </ul>
*/ */
@EventListener(condition = "#processEvent.flowCode == T(org.dromara.oa.erp.service.impl.ErpContractChangeServiceImpl).FLOW_CODE_CONTRACT_CHANGE") @EventListener(condition = "#processEvent.flowCode =='HTBG'")
public void processHandler(ProcessEvent processEvent) { public void processHandler(ProcessEvent processEvent) {
TenantHelper.dynamic(processEvent.getTenantId(), () -> { TenantHelper.dynamic(processEvent.getTenantId(), () -> {
if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) { log.info("当前任务执行了{}", processEvent.toString());
Long contractChangeId = Convert.toLong(processEvent.getBusinessId()); ErpContractChange contractChange = baseMapper.selectById(Convert.toLong(processEvent.getBusinessId()));
writeBackToContract(contractChangeId); contractChange.setFlowStatus(processEvent.getStatus());
Map<String, Object> params = processEvent.getParams();
if (MapUtil.isNotEmpty(params)) {
// 预留:办理人等信息可按需从 params 取用
String handler = Convert.toStr(params.get("handler"));
} }
if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.WAITING.getStatus())) {
contractChange.setChangeStatus(OAStatusEnum.APPROVING.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.FINISH.getStatus())) {
contractChange.setChangeStatus(OAStatusEnum.COMPLETED.getStatus());
writeBackToContract(contractChange);
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.INVALID.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.TERMINATION.getStatus())) {
contractChange.setChangeStatus(OAStatusEnum.INVALID.getStatus());
} else if (Objects.equals(processEvent.getStatus(), BusinessStatusEnum.BACK.getStatus())
|| Objects.equals(processEvent.getStatus(), BusinessStatusEnum.CANCEL.getStatus())) {
contractChange.setChangeStatus(OAStatusEnum.DRAFT.getStatus());
}
baseMapper.updateById(contractChange);
}); });
} }
// ======================= 回写时的数据拷贝 =======================
/**
*
*/
private void copyChangeInfoToContract(ErpContractChangeInfoVo snap, ErpContractInfo contract) { private void copyChangeInfoToContract(ErpContractChangeInfoVo snap, ErpContractInfo contract) {
contract.setContractFlag(snap.getContractFlag()); contract.setContractFlag(snap.getContractFlag());
contract.setCustomerContractCode(snap.getCustomerContractCode()); contract.setCustomerContractCode(snap.getCustomerContractCode());
@ -408,7 +531,9 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
contract.setRemark(snap.getRemark()); contract.setRemark(snap.getRemark());
} }
/** 变更物料快照转合同物料(回写)*/ /**
* erp_contract_material
*/
private ErpContractMaterial copyChangeMaterialToContract(ErpContractChangeMaterial m, Long contractId) { private ErpContractMaterial copyChangeMaterialToContract(ErpContractChangeMaterial m, Long contractId) {
ErpContractMaterial cm = new ErpContractMaterial(); ErpContractMaterial cm = new ErpContractMaterial();
cm.setContractId(contractId); cm.setContractId(contractId);
@ -429,7 +554,9 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
return cm; return cm;
} }
/** 变更付款方式快照转合同付款方式(回写) */ /**
* erp_contract_payment_method
*/
private ErpContractPaymentMethod copyChangePaymentToContract(ErpContractChangePaymentMethod p, Long contractId) { private ErpContractPaymentMethod copyChangePaymentToContract(ErpContractChangePaymentMethod p, Long contractId) {
ErpContractPaymentMethod cpm = new ErpContractPaymentMethod(); ErpContractPaymentMethod cpm = new ErpContractPaymentMethod();
cpm.setContractId(contractId); cpm.setContractId(contractId);

Loading…
Cancel
Save