1.0.77 初始化合同变更审批逻辑

dev
yinq 4 days ago
parent 1321973ed3
commit d5f2e32d5d

@ -1,6 +1,6 @@
# Tomcat
server:
port: 8080
port: 8095
servlet:
context-path: /

@ -1,6 +1,5 @@
package org.dromara.oa.erp.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.dromara.common.core.enums.BusinessStatusEnum;
@ -27,11 +26,9 @@ import org.dromara.oa.erp.mapper.*;
import org.dromara.oa.erp.service.IErpContractChangeService;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.Objects;
/**
@ -55,6 +52,15 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
/** 合同变更流程编码(审批通过后回写用) */
public static final String FLOW_CODE_CONTRACT_CHANGE = "HTBG";
/** 变更类型1内容变更 2解除合同 */
private static final String CHANGE_TYPE_CONTENT = "1";
private static final String CHANGE_TYPE_TERMINATE = "2";
/** 未回写 */
private static final String WRITE_BACK_NO = "0";
/** 已回写/可用 */
private static final String WRITE_BACK_YES = "1";
private static final String CHANGE_STATUS_AVAILABLE = "3";
/**
*
*
@ -93,34 +99,31 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
}
private MPJLambdaWrapper<ErpContractChange> buildQueryWrapper(ErpContractChangeBo bo) {
Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<ErpContractChange> lqw = JoinWrappers.lambda(ErpContractChange.class)
.selectAll(ErpContractChange.class)
.eq(ErpContractChange::getDelFlag, "0")
.eq(bo.getContractId() != null, ErpContractChange::getContractId, bo.getContractId())
.eq(StringUtils.isNotBlank(bo.getChangeCode()), ErpContractChange::getChangeCode, bo.getChangeCode())
.eq(StringUtils.isNotBlank(bo.getChangeType()), ErpContractChange::getChangeType, bo.getChangeType())
.eq(StringUtils.isNotBlank(bo.getChangeContractCode()), ErpContractChange::getChangeContractCode, bo.getChangeContractCode())
.like(StringUtils.isNotBlank(bo.getChangeContractName()), ErpContractChange::getChangeContractName, bo.getChangeContractName())
.like(StringUtils.isNotBlank(bo.getCustomerName()), ErpContractChange::getCustomerName, bo.getCustomerName())
.eq(bo.getChangeContractAmount() != null, ErpContractChange::getChangeContractAmount, bo.getChangeContractAmount())
.eq(StringUtils.isNotBlank(bo.getContractCode()), ErpContractChange::getContractCode, bo.getContractCode())
.like(StringUtils.isNotBlank(bo.getContractName()), ErpContractChange::getContractName, bo.getContractName())
.like(StringUtils.isNotBlank(bo.getOriginalCustomerName()), ErpContractChange::getOriginalCustomerName, bo.getOriginalCustomerName())
.eq(bo.getOriginalContractAmount() != null, ErpContractChange::getOriginalContractAmount, bo.getOriginalContractAmount())
.eq(StringUtils.isNotBlank(bo.getChangeReason()), ErpContractChange::getChangeReason, bo.getChangeReason())
.eq(bo.getApplyTime() != null, ErpContractChange::getApplyTime, bo.getApplyTime())
.eq(bo.getUndertakeDeptId() != null, ErpContractChange::getUndertakeDeptId, bo.getUndertakeDeptId())
.eq(bo.getUndertakeBy() != null, ErpContractChange::getUndertakeBy, bo.getUndertakeBy())
.eq(StringUtils.isNotBlank(bo.getIndustryRegion()), ErpContractChange::getIndustryRegion, bo.getIndustryRegion())
.eq(StringUtils.isNotBlank(bo.getSealLegalEntity()), ErpContractChange::getSealLegalEntity, bo.getSealLegalEntity())
.eq(StringUtils.isNotBlank(bo.getChangeStatus()), ErpContractChange::getChangeStatus, bo.getChangeStatus())
.eq(StringUtils.isNotBlank(bo.getFlowStatus()), ErpContractChange::getFlowStatus, bo.getFlowStatus())
.eq(StringUtils.isNotBlank(bo.getWriteBackFlag()), ErpContractChange::getWriteBackFlag, bo.getWriteBackFlag())
.eq(bo.getWriteBackTime() != null, ErpContractChange::getWriteBackTime, bo.getWriteBackTime())
.eq(StringUtils.isNotBlank(bo.getActiveFlag()), ErpContractChange::getActiveFlag, bo.getActiveFlag())
;
return lqw;
return JoinWrappers.lambda(ErpContractChange.class)
.selectAll(ErpContractChange.class)
.eq(ErpContractChange::getDelFlag, "0")
.eq(bo.getContractId() != null, ErpContractChange::getContractId, bo.getContractId())
.eq(StringUtils.isNotBlank(bo.getChangeCode()), ErpContractChange::getChangeCode, bo.getChangeCode())
.eq(StringUtils.isNotBlank(bo.getChangeType()), ErpContractChange::getChangeType, bo.getChangeType())
.eq(StringUtils.isNotBlank(bo.getChangeContractCode()), ErpContractChange::getChangeContractCode, bo.getChangeContractCode())
.like(StringUtils.isNotBlank(bo.getChangeContractName()), ErpContractChange::getChangeContractName, bo.getChangeContractName())
.like(StringUtils.isNotBlank(bo.getCustomerName()), ErpContractChange::getCustomerName, bo.getCustomerName())
.eq(bo.getChangeContractAmount() != null, ErpContractChange::getChangeContractAmount, bo.getChangeContractAmount())
.eq(StringUtils.isNotBlank(bo.getContractCode()), ErpContractChange::getContractCode, bo.getContractCode())
.like(StringUtils.isNotBlank(bo.getContractName()), ErpContractChange::getContractName, bo.getContractName())
.like(StringUtils.isNotBlank(bo.getOriginalCustomerName()), ErpContractChange::getOriginalCustomerName, bo.getOriginalCustomerName())
.eq(bo.getOriginalContractAmount() != null, ErpContractChange::getOriginalContractAmount, bo.getOriginalContractAmount())
.eq(StringUtils.isNotBlank(bo.getChangeReason()), ErpContractChange::getChangeReason, bo.getChangeReason())
.eq(bo.getApplyTime() != null, ErpContractChange::getApplyTime, bo.getApplyTime())
.eq(bo.getUndertakeDeptId() != null, ErpContractChange::getUndertakeDeptId, bo.getUndertakeDeptId())
.eq(bo.getUndertakeBy() != null, ErpContractChange::getUndertakeBy, bo.getUndertakeBy())
.eq(StringUtils.isNotBlank(bo.getIndustryRegion()), ErpContractChange::getIndustryRegion, bo.getIndustryRegion())
.eq(StringUtils.isNotBlank(bo.getSealLegalEntity()), ErpContractChange::getSealLegalEntity, bo.getSealLegalEntity())
.eq(StringUtils.isNotBlank(bo.getChangeStatus()), ErpContractChange::getChangeStatus, bo.getChangeStatus())
.eq(StringUtils.isNotBlank(bo.getFlowStatus()), ErpContractChange::getFlowStatus, bo.getFlowStatus())
.eq(StringUtils.isNotBlank(bo.getWriteBackFlag()), ErpContractChange::getWriteBackFlag, bo.getWriteBackFlag())
.eq(bo.getWriteBackTime() != null, ErpContractChange::getWriteBackTime, bo.getWriteBackTime())
.eq(StringUtils.isNotBlank(bo.getActiveFlag()), ErpContractChange::getActiveFlag, bo.getActiveFlag());
}
/**
@ -156,8 +159,13 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
/**
*
*/
private void validEntityBeforeSave(ErpContractChange entity){
//TODO 做一些数据校验,如唯一约束
private void validEntityBeforeSave(ErpContractChange entity) {
if (entity.getContractId() == null) {
throw new IllegalArgumentException("原合同ID不能为空");
}
if (StringUtils.isBlank(entity.getChangeType())) {
throw new IllegalArgumentException("变更类型不能为空");
}
}
/**
@ -183,9 +191,13 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
validEntityBeforeSave(main);
if (isUpdate) {
ErpContractChange existing = baseMapper.selectById(main.getContractChangeId());
if (existing != null && StringUtils.isNotBlank(existing.getWriteBackFlag()) && WRITE_BACK_YES.equals(existing.getWriteBackFlag())) {
main.setWriteBackFlag(existing.getWriteBackFlag());
main.setWriteBackTime(existing.getWriteBackTime());
}
baseMapper.updateById(main);
// 内容变更时先删子表再插
if ("1".equals(bo.getChangeType())) {
if (CHANGE_TYPE_CONTENT.equals(bo.getChangeType())) {
deleteChangeSubByChangeId(main.getContractChangeId());
}
} else {
@ -193,17 +205,18 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
bo.setContractChangeId(main.getContractChangeId());
}
if ("1".equals(bo.getChangeType())) {
if (CHANGE_TYPE_CONTENT.equals(bo.getChangeType())) {
Long changeId = main.getContractChangeId();
if (bo.getChangeInfo() != null) {
ErpContractChangeInfo info = MapstructUtils.convert(bo.getChangeInfo(), ErpContractChangeInfo.class);
info.setContractChangeId(main.getContractChangeId());
info.setContractChangeId(changeId);
info.setChangeInfoId(null);
changeInfoMapper.insert(info);
}
if (bo.getChangeMaterialList() != null && !bo.getChangeMaterialList().isEmpty()) {
for (ErpContractChangeMaterialBo m : bo.getChangeMaterialList()) {
ErpContractChangeMaterial e = MapstructUtils.convert(m, ErpContractChangeMaterial.class);
e.setContractChangeId(main.getContractChangeId());
e.setContractChangeId(changeId);
e.setChangeMaterialId(null);
changeMaterialMapper.insert(e);
}
@ -211,7 +224,7 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
if (bo.getChangePaymentMethodList() != null && !bo.getChangePaymentMethodList().isEmpty()) {
for (ErpContractChangePaymentMethodBo p : bo.getChangePaymentMethodList()) {
ErpContractChangePaymentMethod e = MapstructUtils.convert(p, ErpContractChangePaymentMethod.class);
e.setContractChangeId(main.getContractChangeId());
e.setContractChangeId(changeId);
e.setChangePaymentId(null);
changePaymentMethodMapper.insert(e);
}
@ -244,20 +257,19 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
e.setChangeContractName(bo.getChangeContractName());
e.setCustomerName(bo.getCustomerName());
e.setChangeContractAmount(bo.getChangeContractAmount());
e.setWriteBackFlag("0");
if (bo.getContractChangeId() == null) {
e.setWriteBackFlag(WRITE_BACK_NO);
}
return e;
}
private void deleteChangeSubByChangeId(Long contractChangeId) {
LambdaQueryWrapper<ErpContractChangeInfo> q1 = new LambdaQueryWrapper<>();
q1.eq(ErpContractChangeInfo::getContractChangeId, contractChangeId);
changeInfoMapper.delete(q1);
LambdaQueryWrapper<ErpContractChangeMaterial> q2 = new LambdaQueryWrapper<>();
q2.eq(ErpContractChangeMaterial::getContractChangeId, contractChangeId);
changeMaterialMapper.delete(q2);
LambdaQueryWrapper<ErpContractChangePaymentMethod> q3 = new LambdaQueryWrapper<>();
q3.eq(ErpContractChangePaymentMethod::getContractChangeId, contractChangeId);
changePaymentMethodMapper.delete(q3);
changeInfoMapper.delete(new LambdaQueryWrapper<ErpContractChangeInfo>()
.eq(ErpContractChangeInfo::getContractChangeId, contractChangeId));
changeMaterialMapper.delete(new LambdaQueryWrapper<ErpContractChangeMaterial>()
.eq(ErpContractChangeMaterial::getContractChangeId, contractChangeId));
changePaymentMethodMapper.delete(new LambdaQueryWrapper<ErpContractChangePaymentMethod>()
.eq(ErpContractChangePaymentMethod::getContractChangeId, contractChangeId));
}
@Override
@ -281,55 +293,56 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
@Transactional(rollbackFor = Exception.class)
public void writeBackToContract(Long contractChangeId) {
ErpContractChange change = baseMapper.selectById(contractChangeId);
if (change == null || !"0".equals(change.getWriteBackFlag())) {
if (change == null || !WRITE_BACK_NO.equals(change.getWriteBackFlag())) {
return;
}
change.setChangeStatus("3");
baseMapper.updateById(change);
Long contractId = change.getContractId();
if ("2".equals(change.getChangeType())) {
ErpContractInfo info = contractInfoMapper.selectById(contractId);
if (info != null) {
info.setActiveFlag("0");
contractInfoMapper.updateById(info);
}
if (CHANGE_TYPE_TERMINATE.equals(change.getChangeType())) {
doWriteBackTerminate(contractId);
} else {
List<ErpContractChangeInfoVo> infoList = changeInfoMapper.selectVoList(
new LambdaQueryWrapper<ErpContractChangeInfo>().eq(ErpContractChangeInfo::getContractChangeId, contractChangeId));
if (!infoList.isEmpty()) {
ErpContractInfo contractInfo = contractInfoMapper.selectById(contractId);
if (contractInfo != null) {
ErpContractChangeInfoVo snap = infoList.get(0);
copyChangeInfoToContract(snap, contractInfo);
contractInfoMapper.updateById(contractInfo);
}
}
contractMaterialMapper.delete(new LambdaQueryWrapper<ErpContractMaterial>().eq(ErpContractMaterial::getContractId, contractId));
List<ErpContractChangeMaterial> materials = changeMaterialMapper.selectList(
new LambdaQueryWrapper<ErpContractChangeMaterial>().eq(ErpContractChangeMaterial::getContractChangeId, contractChangeId));
for (ErpContractChangeMaterial m : materials) {
ErpContractMaterial cm = new ErpContractMaterial();
BeanUtil.copyProperties(m, cm, "contractMaterialId", "contractChangeId", "createTime", "updateTime", "createBy", "updateBy");
cm.setContractId(contractId);
cm.setContractMaterialId(null);
contractMaterialMapper.insert(cm);
}
contractPaymentMethodMapper.delete(new LambdaQueryWrapper<ErpContractPaymentMethod>().eq(ErpContractPaymentMethod::getContractId, contractId));
List<ErpContractChangePaymentMethod> payments = changePaymentMethodMapper.selectList(
new LambdaQueryWrapper<ErpContractChangePaymentMethod>().eq(ErpContractChangePaymentMethod::getContractChangeId, contractChangeId));
for (ErpContractChangePaymentMethod p : payments) {
ErpContractPaymentMethod cpm = new ErpContractPaymentMethod();
BeanUtil.copyProperties(p, cpm, "paymentMethodId", "contractChangeId", "changePaymentId", "createTime", "updateTime", "createBy", "updateBy");
cpm.setContractId(contractId);
cpm.setPaymentMethodId(null);
contractPaymentMethodMapper.insert(cpm);
}
doWriteBackContent(contractChangeId, contractId);
}
change.setWriteBackFlag("1");
change.setChangeStatus(CHANGE_STATUS_AVAILABLE);
change.setFlowStatus(BusinessStatusEnum.FINISH.getStatus());
change.setWriteBackFlag(WRITE_BACK_YES);
change.setWriteBackTime(new Date());
baseMapper.updateById(change);
}
private void doWriteBackTerminate(Long contractId) {
ErpContractInfo info = contractInfoMapper.selectById(contractId);
if (info != null) {
info.setActiveFlag("0");
contractInfoMapper.updateById(info);
}
}
private void doWriteBackContent(Long contractChangeId, Long contractId) {
List<ErpContractChangeInfoVo> infoList = changeInfoMapper.selectVoList(
new LambdaQueryWrapper<ErpContractChangeInfo>().eq(ErpContractChangeInfo::getContractChangeId, contractChangeId));
if (!infoList.isEmpty()) {
ErpContractInfo contractInfo = contractInfoMapper.selectById(contractId);
if (contractInfo != null) {
copyChangeInfoToContract(infoList.get(0), contractInfo);
contractInfoMapper.updateById(contractInfo);
}
}
LambdaQueryWrapper<ErpContractMaterial> materialDel = new LambdaQueryWrapper<ErpContractMaterial>().eq(ErpContractMaterial::getContractId, contractId);
contractMaterialMapper.delete(materialDel);
List<ErpContractChangeMaterial> materials = changeMaterialMapper.selectList(
new LambdaQueryWrapper<ErpContractChangeMaterial>().eq(ErpContractChangeMaterial::getContractChangeId, contractChangeId));
for (ErpContractChangeMaterial m : materials) {
contractMaterialMapper.insert(copyChangeMaterialToContract(m, contractId));
}
LambdaQueryWrapper<ErpContractPaymentMethod> paymentDel = new LambdaQueryWrapper<ErpContractPaymentMethod>().eq(ErpContractPaymentMethod::getContractId, contractId);
contractPaymentMethodMapper.delete(paymentDel);
List<ErpContractChangePaymentMethod> payments = changePaymentMethodMapper.selectList(
new LambdaQueryWrapper<ErpContractChangePaymentMethod>().eq(ErpContractChangePaymentMethod::getContractChangeId, contractChangeId));
for (ErpContractChangePaymentMethod p : payments) {
contractPaymentMethodMapper.insert(copyChangePaymentToContract(p, contractId));
}
}
/**
*
*/
@ -353,7 +366,7 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
contract.setBusinessDirection(snap.getBusinessDirection());
contract.setContractDeptId(snap.getContractDeptId());
contract.setContractDate(snap.getContractDate());
contract.setTotalPrice(snap.getTotalPrice() != null ? BigDecimal.valueOf(snap.getTotalPrice()) : null);
contract.setTotalPrice(toBigDecimal(snap.getTotalPrice()));
contract.setOneCustomerId(snap.getOneCustomerId());
contract.setOneRepresent(snap.getOneRepresent());
contract.setOneDate(snap.getOneDate());
@ -375,11 +388,59 @@ public class ErpContractChangeServiceImpl implements IErpContractChangeService {
contract.setWarrantyPeriodDescription(snap.getWarrantyPeriodDescription());
contract.setDeliveryLocation(snap.getDeliveryLocation());
contract.setShipMethod(snap.getShipMethod());
contract.setTaxRate(snap.getTaxRate() != null ? BigDecimal.valueOf(snap.getTaxRate()) : null);
contract.setTaxRate(toBigDecimal(snap.getTaxRate()));
contract.setSigningPlace(snap.getSigningPlace());
contract.setMaterialRemark(snap.getMaterialRemark());
contract.setContractTemplateFlag(snap.getContractTemplateFlag());
contract.setCapitalizedAmount(snap.getCapitalizedAmount());
contract.setRemark(snap.getRemark());
}
/** 变更物料快照转合同物料(回写)*/
private ErpContractMaterial copyChangeMaterialToContract(ErpContractChangeMaterial m, Long contractId) {
ErpContractMaterial cm = new ErpContractMaterial();
cm.setContractId(contractId);
cm.setContractMaterialId(null);
cm.setMaterialFlag(m.getMaterialFlag());
cm.setProductName(m.getProductName());
cm.setSpecificationDescription(m.getSpecificationDescription());
cm.setMaterialId(m.getMaterialId());
cm.setRelationMaterialId(m.getRelationMaterialId());
cm.setUnitId(m.getUnitId());
cm.setRemark(m.getRemark());
cm.setActiveFlag(StringUtils.isNotBlank(m.getActiveFlag()) ? m.getActiveFlag() : "1");
cm.setAmount(toBigDecimal(m.getAmount()));
cm.setBeforePrice(toBigDecimal(m.getBeforePrice()));
cm.setTaxRate(toBigDecimal(m.getTaxRate()));
cm.setIncludingPrice(toBigDecimal(m.getIncludingPrice()));
cm.setSubtotal(toBigDecimal(m.getSubtotal()));
return cm;
}
/** 变更付款方式快照转合同付款方式(回写),兼容 Long/Number 与 BigDecimal */
private ErpContractPaymentMethod copyChangePaymentToContract(ErpContractChangePaymentMethod p, Long contractId) {
ErpContractPaymentMethod cpm = new ErpContractPaymentMethod();
cpm.setContractId(contractId);
cpm.setPaymentMethodId(null);
cpm.setSortOrder(p.getSortOrder());
cpm.setPaymentStageId(p.getPaymentStageId());
cpm.setPaymentDeadline(toBigDecimal(p.getPaymentDeadline()));
cpm.setPaymentPercentage(toBigDecimal(p.getPaymentPercentage()));
cpm.setInvoicePercentage(toBigDecimal(p.getInvoicePercentage()));
cpm.setPaymentAmount(toBigDecimal(p.getPaymentAmount()));
cpm.setPaymentDescription(p.getPaymentDescription());
cpm.setRemark(p.getRemark());
cpm.setActiveFlag(StringUtils.isNotBlank(p.getActiveFlag()) ? p.getActiveFlag() : "1");
return cpm;
}
private static BigDecimal toBigDecimal(Number n) {
if (n == null) {
return null;
}
if (n instanceof BigDecimal) {
return (BigDecimal) n;
}
return BigDecimal.valueOf(n.doubleValue());
}
}

Loading…
Cancel
Save