package com.fjhx.sale.flow; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.fjhx.common.enums.FlowStatusEnum1; import com.fjhx.common.utils.Assert; import com.fjhx.flow.core.FlowDelegate; import com.fjhx.flow.enums.FlowStatusEnum; import com.fjhx.sale.entity.contract.dto.ContractDto; import com.fjhx.sale.entity.contract.po.Contract; import com.fjhx.sale.entity.contract.po.ContractProduct; import com.fjhx.sale.entity.contract.po.ContractProject; import com.fjhx.sale.entity.contract.po.ContractShipment; import com.fjhx.sale.service.contract.ContractProductService; import com.fjhx.sale.service.contract.ContractService; import com.ruoyi.common.core.domain.BaseIdPo; import com.ruoyi.common.core.domain.BasePo; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; /** * 合同变更流程 */ @Component public class ContractUpdateFlow extends FlowDelegate { @Autowired private ContractFlow contractFlow; @Autowired private ContractService contractService; @Autowired private ContractProductService contractProductService; @Override public String getFlowKey() { return "contract_update_flow"; } /** * 发起流程 * * @param flowId 流程ID * @param submitData 采购付款数据 * @return */ @Override public Long start(Long flowId, JSONObject submitData) { ContractDto contract = submitData.toJavaObject(ContractDto.class); Assert.notEmpty(contract.getOldContractId(), "原合同id不能为空"); //变更 用原来合同号加后缀 Contract oldContract = contractService.getById(contract.getOldContractId()); Assert.notEmpty(oldContract, "查询不到原合同信息"); String code = oldContract.getCode(); Matcher matcher = Pattern.compile(".*\\((.*?)\\)$").matcher(code); int index = 2; if (matcher.find()) { index = (Integer.parseInt(matcher.group(1)) + 1); code = code.substring(0, code.lastIndexOf("(")); } contract.setCode(code + "(" + index + ")"); //变更合同提前操作数据 contract = opDate(contract); //清空id 方便后面生成新合同 contract.setId(null); // 清空合同产品id List contractProductList = contract.getContractProductList(); if (CollectionUtils.isNotEmpty(contractProductList)) { contractProductList.forEach(item -> item.setId(null)); } // 清空收费项目id List contractProjectList = contract.getContractProjectList(); if (CollectionUtils.isNotEmpty(contractProjectList)) { contractProjectList.forEach(item -> item.setId(null)); } // 清空自定义出货id List contractShipmentList = contract.getContractShipmentList(); if (CollectionUtils.isNotEmpty(contractShipmentList)) { contractShipmentList.forEach(item -> item.setId(null)); } contract = contractFlow.commStart(contract, 0); return contract.getId(); } /** * 结束流程 * * @param flowId 流程ID * @param businessId 业务ID * @param submitData 数据 */ @Override public void end(Long flowId, Long businessId, JSONObject submitData) { contractFlow.end(flowId, businessId, submitData); // 通过业务id查询合同数据 Contract contract = contractService.getById(businessId); // 原合同改为作废状态 Long oldContractId = contract.getOldContractId(); Contract oldContract = contractService.getById(oldContractId); if (oldContract == null) { throw new ServiceException("原合同不存在"); } oldContract.setStatus(FlowStatusEnum1.UPDATE.getKey()); oldContract.setIsChange("1"); contractService.updateById(oldContract); } @Override public void defaultMethod(Long flowId, Long businessId, FlowStatusEnum flowStatusEnum, JSONObject submitData) { //重新发起 if (FlowStatusEnum.READY_START.equals(flowStatusEnum)) { reStart(submitData); } //驳回 if (FlowStatusEnum.REJECT.equals(flowStatusEnum)) { reject(businessId); } } /** * 变更合同时执行的数据操作公共代码 */ private ContractDto opDate(ContractDto contract) { // 原合同id不能为空 Long oldContractId = contract.getOldContractId(); if (oldContractId == null) { throw new ServiceException("原合同id不能为空"); } List list = contractProductService.list(q -> q.eq(ContractProduct::getContractId, oldContractId)); // 赋值待处理数量 if (CollectionUtils.isNotEmpty(list)) { List contractProductList = contract.getContractProductList(); if (ObjectUtil.isEmpty(contractProductList)) { throw new ServiceException("没有合同产品"); } Map contractProductMap = contractProductList .stream() .filter(item -> ObjectUtil.isNotEmpty(item.getId())) .collect(Collectors.toMap(BaseIdPo::getId, Function.identity())); for (ContractProduct item : list) { ContractProduct contractProduct = contractProductMap.get(item.getId()); if (ObjectUtil.isNotEmpty(contractProduct)) { BigDecimal expendQuantity = item.getExpendQuantity().subtract(item.getQuantity().subtract(contractProduct.getQuantity())); contractProduct.setExpendQuantity(expendQuantity); } } } return contract; } /** * 重新发起 */ private void reStart(JSONObject submitData) { ContractDto contract = submitData.toJavaObject(ContractDto.class); Assert.notEmpty(contract.getId(), "合同id不能为空"); //变更合同需要提前操作数据 contract = opDate(contract); contractFlow.reStart1(contract); } /** * 驳回 */ private void reject(Long businessId) { contractService.update(q -> q .eq(Contract::getId, businessId) .set(Contract::getStatus, FlowStatusEnum1.REJECT.getKey())//20为驳回 .set(BasePo::getUpdateTime, new Date()) .set(BasePo::getUpdateUser, SecurityUtils.getUserId()) ); } }