package com.fjhx.sale.flow; import com.alibaba.fastjson.JSONObject; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.fjhx.area.utils.CustomizeAreaUtil; import com.fjhx.common.constant.SourceConstant; import com.fjhx.common.enums.CodingRuleEnum; import com.fjhx.common.service.coding.CodingRuleService; import com.fjhx.common.utils.Assert; import com.fjhx.file.utils.ObsFileUtil; import com.fjhx.flow.core.FlowDelegate; import com.fjhx.flow.core.FlowThreadLocalUtil; import com.fjhx.flow.enums.FlowStatusEnum; import com.fjhx.flow.enums.HandleTypeEnum; import com.fjhx.purchase.entity.purchase.enums.PurchaseDataResourceEnum; import com.fjhx.purchase.entity.purchase.enums.PurchaseStatusEnum; import com.fjhx.purchase.entity.subscribe.enums.SubscribeDetailStatusEnum; import com.fjhx.purchase.entity.subscribe.po.SubscribeDetail; import com.fjhx.purchase.service.subscribe.SubscribeDetailService; import com.fjhx.sale.entity.contract.po.Contract; import com.fjhx.sale.entity.contract.po.ContractProduct; import com.fjhx.sale.entity.purchase.dto.EhsdPurchaseDto; import com.fjhx.sale.entity.purchase.po.*; import com.fjhx.sale.entity.sample.po.Sample; import com.fjhx.sale.entity.sample.po.SampleProduct; import com.fjhx.sale.service.contract.ContractProductService; import com.fjhx.sale.service.contract.ContractService; import com.fjhx.sale.service.purchase.*; import com.fjhx.sale.service.sample.SampleProductService; import com.fjhx.sale.service.sample.SampleService; import com.ruoyi.common.annotation.LogicIgnore; import com.ruoyi.common.annotation.TenantIgnore; import com.ruoyi.common.core.domain.BasePo; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import lombok.experimental.Delegate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.stream.Collectors; /** * EHSD采购流程 * * @Author:caozj * @DATE:2023/4/3 17:38 */ @Component @DS(SourceConstant.SALE) public class EhsdPurchaseFlow extends FlowDelegate { @Autowired private EhsdPurchaseService purchaseService; @Autowired private EhsdPurchaseProductService purchaseProductService; @Autowired private EhsdPurchaseProjectService purchaseProjectService; @Autowired private EhsdPurchaseArrivalService purchaseArrivalService; @Autowired private EhsdPurchaseProductMountingsService purchaseProductMountingsService; @Autowired private ContractProductService contractProductService; @Autowired private SampleProductService sampleProductService; @Autowired private CodingRuleService codingRuleService; @Autowired private SubscribeDetailService subscribeDetailService; @Autowired private ContractService contractService; @Autowired private SampleService sampleService; @Override public String getFlowKey() { return "ehsd_purchase_flow"; } /** * 发起流程 * * @param flowId 流程ID * @param submitData 采购数据 * @return */ @Override public Long start(Long flowId, JSONObject submitData) { EhsdPurchaseDto purchase = submitData.toJavaObject(EhsdPurchaseDto.class); purchase.setFlowId(flowId); //手动创建 编号规则 if (0 == purchase.getDataResource()) { purchase.setCode(codingRuleService.createCode(CodingRuleEnum.EHSD_PURCHASE.getKey(), null)); } //合同 编号规则 if (1 == purchase.getDataResource()) { Contract contract = contractService.getById(purchase.getDataResourceId()); Assert.notEmpty(contract, "查询不到合同信息,无法生成编号"); long count = purchaseService.count(q -> q.eq(EhsdPurchase::getDataResourceId, contract.getId())); purchase.setCode(contract.getCode() + "-" + (count + 1)); } //样品单 编号规则 if (2 == purchase.getDataResource()) { Sample sample = sampleService.getById(purchase.getDataResourceId()); Assert.notEmpty(sample, "查询不到样品单信息,无法生成编号"); long count = purchaseService.count(q -> q.eq(EhsdPurchase::getDataResourceId, sample.getId())); purchase.setCode(sample.getCode() + "-" + (count + 1)); } //公共代码 purchase = connStart(purchase); return purchase.getId(); } /** * 公共代码块--变更 */ public EhsdPurchaseDto updateStart(EhsdPurchaseDto purchase) { //赋值城市省份信息 CustomizeAreaUtil.setAreaId(purchase); purchase.setSellCityId(purchase.getCityId()); purchase.setSellCountryId(purchase.getCountryId()); purchase.setSellProvinceId(purchase.getProvinceId()); purchase.setStatus(PurchaseStatusEnum.UNDER_REVIEW.getKey()); String nickName = SecurityUtils.getLoginUser().getUser().getNickName(); purchase.setUserName(nickName); purchaseService.save(purchase); List purchaseProductList = purchase.getPurchaseProductList(); List purchaseProjectList = purchase.getPurchaseProjectList(); List purchaseArrivalList = purchase.getPurchaseArrivalList(); List addMountingsList = new ArrayList<>(); if (CollectionUtils.isNotEmpty(purchaseProductList)) { for (EhsdPurchaseProduct s : purchaseProductList) {//产品 long id ; if(ObjectUtils.isNotEmpty(s.getId())){ id = s.getId(); }else{ id = IdWorker.getId(); } s.setId(id); s.setPurchaseId(purchase.getId()); List purchaseProductMountingsList = s.getPurchaseProductMountingsList(); if (CollectionUtils.isNotEmpty(purchaseProductMountingsList)) {//产品配件 purchaseProductMountingsList.forEach(obj -> obj.setPurchaseProductId(id)); addMountingsList.addAll(purchaseProductMountingsList); } ObsFileUtil.saveFile(s.getFileList(), s.getId()); if ("0".equals(purchase.getDataResource())) { //计算采购数量是否大于申购数量 List purchaseDetailList1 = purchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getSubscribeDetailId, s.getSubscribeDetailId())); //求和 BigDecimal purchaseCount = purchaseDetailList1.stream() .map(EhsdPurchaseProduct::getQuantity) .reduce(BigDecimal.ZERO, BigDecimal::add); //计算历史采购数量+本次采购数量之和 BigDecimal count = purchaseCount.add(s.getQuantity()); //判断采购数量是否大于申购数量 SubscribeDetail subscribeDetail = subscribeDetailService.getById(s.getSubscribeDetailId()); if (count.compareTo(subscribeDetail.getCount()) > 0) { throw new ServiceException("采购数量不能大于申购数量"); } } } purchaseProductService.saveBatch(purchaseProductList); purchaseProductMountingsService.saveBatch(addMountingsList); } if (CollectionUtils.isNotEmpty(purchaseProjectList)) {//到货 for (EhsdPurchaseProject s : purchaseProjectList) { s.setPurchaseId(purchase.getId()); } purchaseProjectService.saveBatch(purchaseProjectList); } if (CollectionUtils.isNotEmpty(purchaseArrivalList)) {//收费项目 for (EhsdPurchaseArrival s : purchaseArrivalList) { s.setPurchaseId(purchase.getId()); } purchaseArrivalService.saveBatch(purchaseArrivalList); } return purchase; } /** * 公共代码块--发起 */ public EhsdPurchaseDto connStart(EhsdPurchaseDto purchase) { //赋值城市省份信息 CustomizeAreaUtil.setAreaId(purchase); purchase.setSellCityId(purchase.getCityId()); purchase.setSellCountryId(purchase.getCountryId()); purchase.setSellProvinceId(purchase.getProvinceId()); purchase.setStatus(PurchaseStatusEnum.UNDER_REVIEW.getKey()); String nickName = SecurityUtils.getLoginUser().getUser().getNickName(); purchase.setUserName(nickName); purchaseService.saveOrUpdate(purchase); List purchaseProductList = purchase.getPurchaseProductList(); List purchaseProjectList = purchase.getPurchaseProjectList(); List purchaseArrivalList = purchase.getPurchaseArrivalList(); List addMountingsList = new ArrayList<>(); if (CollectionUtils.isNotEmpty(purchaseProductList)) { for (EhsdPurchaseProduct s : purchaseProductList) {//产品 long id ; if(ObjectUtils.isNotEmpty(s.getId())){ id = s.getId(); }else{ id = IdWorker.getId(); } s.setId(id); s.setPurchaseId(purchase.getId()); List purchaseProductMountingsList = s.getPurchaseProductMountingsList(); if (CollectionUtils.isNotEmpty(purchaseProductMountingsList)) {//产品配件 purchaseProductMountingsList.forEach(obj -> obj.setPurchaseProductId(id)); addMountingsList.addAll(purchaseProductMountingsList); } if ("0".equals(purchase.getDataResource())) { //计算采购数量是否大于申购数量 List purchaseDetailList1 = purchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getSubscribeDetailId, s.getSubscribeDetailId())); //求和 BigDecimal purchaseCount = purchaseDetailList1.stream() .map(EhsdPurchaseProduct::getQuantity) .reduce(BigDecimal.ZERO, BigDecimal::add); //计算历史采购数量+本次采购数量之和 BigDecimal count = purchaseCount.add(s.getQuantity()); //判断采购数量是否大于申购数量 SubscribeDetail subscribeDetail = subscribeDetailService.getById(s.getSubscribeDetailId()); if (count.compareTo(subscribeDetail.getCount()) > 0) { throw new ServiceException("采购数量不能大于申购数量"); } } } purchaseProductService.saveOrUpdateBatch(purchaseProductList); purchaseProductMountingsService.saveOrUpdateBatch(addMountingsList); } if (CollectionUtils.isNotEmpty(purchaseProjectList)) {//到货 for (EhsdPurchaseProject s : purchaseProjectList) { s.setPurchaseId(purchase.getId()); } purchaseProjectService.saveOrUpdateBatch(purchaseProjectList); } if (CollectionUtils.isNotEmpty(purchaseArrivalList)) {//收费项目 for (EhsdPurchaseArrival s : purchaseArrivalList) { s.setPurchaseId(purchase.getId()); } purchaseArrivalService.saveOrUpdateBatch(purchaseArrivalList); } return purchase; } /** * 结束流程 * * @param flowId 流程ID * @param businessId 业务ID * @param submitData 数据 */ @Override public void end(Long flowId, Long businessId, JSONObject submitData) { //通过业务ID查询采购数据 EhsdPurchase purchase = purchaseService.getById(businessId); if (ObjectUtils.isEmpty(purchase)) { throw new ServiceException("采购单不存在,或已被删除"); } //查询采购产品 List purchaseProductList = purchaseProductService.list(Wrappers.query().lambda().eq(EhsdPurchaseProduct::getPurchaseId, businessId)); List upContractProduct = new ArrayList<>(); List upSampleProduct = new ArrayList<>(); for (EhsdPurchaseProduct p : purchaseProductList) { if (ObjectUtils.isNotEmpty(p.getDataResourceId()) && p.getDataResource() == PurchaseDataResourceEnum.DATA_RESOURCE_1.getKey()) {//如果采购的是外销合同 ContractProduct contractProduct = contractProductService.getById(p.getDataResourceId()); BigDecimal expendQuantity = contractProduct.getExpendQuantity().subtract(p.getQuantity()); if (expendQuantity.compareTo(BigDecimal.ZERO) < 0) {//小于0不让继续执行 throw new ServiceException("采购数量不得大于合同剩余采购数量,请驳回审批修改"); } contractProduct.setExpendQuantity(expendQuantity); upContractProduct.add(contractProduct); } if (ObjectUtils.isNotEmpty(p.getDataResourceId()) && p.getDataResource() == PurchaseDataResourceEnum.DATA_RESOURCE_2.getKey()) {//如果采购的是样品单 SampleProduct sampleProduct = sampleProductService.getById(p.getDataResourceId()); BigDecimal expendQuantity = sampleProduct.getExpendQuantity().subtract(p.getQuantity()); if (expendQuantity.compareTo(BigDecimal.ZERO) < 0) {//小于0不让继续执行 // throw new ServiceException("采购数量不得大于合同剩余采购数量,请驳回审批修改"); } sampleProduct.setExpendQuantity(expendQuantity); upSampleProduct.add(sampleProduct); } } if (CollectionUtils.isNotEmpty(upContractProduct)) {//扣减销售合同数量 contractProductService.updateBatchById(upContractProduct); } if (CollectionUtils.isNotEmpty(upSampleProduct)) {//扣减样品单数量 sampleProductService.updateBatchById(upSampleProduct); } //修改采购状态为审批通过 purchase.setStatus(PurchaseStatusEnum.PASS.getKey()); purchase.setApprovedDate(new Date()); purchaseService.updateById(purchase); if ("0".equals(purchase.getDataResource())) { //修改申购明细状态 List purchaseDetailList = purchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getProductId, businessId)); List subscribeDetailIds = purchaseDetailList.stream().map(EhsdPurchaseProduct::getSubscribeDetailId).collect(Collectors.toList()); List subscribeDetails = subscribeDetailService.listByIds(subscribeDetailIds); for (SubscribeDetail subscribeDetail : subscribeDetails) { //获取申购明细下的所有采购记录 计算已采购数 List purchaseDetails = purchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getSubscribeDetailId, subscribeDetail.getId()).eq(EhsdPurchaseProduct::getProductId, subscribeDetail.getBussinessId())); BigDecimal count = purchaseDetails.stream() .map(EhsdPurchaseProduct::getQuantity) .reduce(BigDecimal.ZERO, BigDecimal::add); if (count.compareTo(subscribeDetail.getCount()) >= 0) { //修改为已采购 subscribeDetail.setStatus(SubscribeDetailStatusEnum.PURCHASED.getKey()); } else { //修改为部分采购 subscribeDetail.setStatus(SubscribeDetailStatusEnum.LITT_PAID_AMOUNT.getKey()); } } subscribeDetailService.updateBatchById(subscribeDetails); } } /** * 重新发起 * @param flowId * @param businessId * @param flowStatus * @param submitData */ @Override @LogicIgnore(tableName = {""},alias = {""}) @Transactional(rollbackFor = Exception.class) public void relaunch(Long flowId, Long businessId, FlowStatusEnum flowStatus, JSONObject submitData) { //删除采购合同 EhsdPurchaseDto purchase = submitData.toJavaObject(EhsdPurchaseDto.class); if(ObjectUtils.isEmpty(purchase)){ throw new ServiceException("采购数据不能为空"); } purchase.setFlowId(flowId); connStart(purchase); } /** * 驳回 * @param flowId * @param businessId * @param flowStatus */ @Override public void reject(Long flowId, Long businessId, FlowStatusEnum flowStatus) { if (HandleTypeEnum.REJECT.equals(FlowThreadLocalUtil.getHandleTypeEnum())) { sampleService.update(q -> q .eq(Sample::getId, FlowThreadLocalUtil.getBusinessId()) .set(Sample::getStatus, 20)//20为驳回 .set(Sample::getUpdateTime, new Date()) .set(BasePo::getUpdateUser, SecurityUtils.getUserId()) ); } } }