فهرست منبع

采购付款流程增加“决策辅助” v-0.4

24282 2 سال پیش
والد
کامیت
c002c761c0

+ 1 - 1
hx-purchase/src/main/java/com/fjhx/purchase/controller/purchase/PurchaseOtherFeeController.java

@@ -29,7 +29,7 @@ public class PurchaseOtherFeeController {
      * 获取采购其他费用已有列表
      */
     @GetMapping("/listName")
-    List<PurchaseOtherFee> listName() {
+    public List<PurchaseOtherFee> listName() {
         return purchaseOtherFeeService.listName();
     }
 

+ 9 - 4
hx-sale/src/main/java/com/fjhx/sale/controller/contract/ContractController.java

@@ -5,11 +5,9 @@ import com.fjhx.item.entity.product.dto.ProductInfoSelectDto;
 import com.fjhx.sale.entity.contract.dto.ContractDto;
 import com.fjhx.sale.entity.contract.dto.ContractSelectDto;
 import com.fjhx.sale.entity.contract.dto.DecisionAidDto;
+import com.fjhx.sale.entity.contract.dto.PayDecisionAidDto;
 import com.fjhx.sale.entity.contract.po.Contract;
-import com.fjhx.sale.entity.contract.vo.ContractBudgetVo;
-import com.fjhx.sale.entity.contract.vo.ContractPdfInfoVo;
-import com.fjhx.sale.entity.contract.vo.ContractVo;
-import com.fjhx.sale.entity.contract.vo.DecisionAidVo;
+import com.fjhx.sale.entity.contract.vo.*;
 import com.fjhx.sale.service.contract.ContractService;
 import com.ruoyi.common.core.domain.BaseSelectDto;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -204,5 +202,12 @@ public class ContractController {
         return contractService.decisionAid(dto);
     }
 
+    /**
+     * 采购付款决策辅助
+     */
+    @PostMapping("/payDecisionAid")
+    public PayDecisionAidVo payDecisionAid(@RequestBody PayDecisionAidDto dto) {
+        return contractService.payDecisionAid(dto);
+    }
 
 }

+ 17 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/contract/dto/PayDecisionAidDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.sale.entity.contract.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class PayDecisionAidDto {
+
+    /**
+     * 采购合同id
+     */
+    private List<Long> purchaseIdList;
+
+}

+ 74 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/contract/vo/PayDecisionAidVo.java

@@ -0,0 +1,74 @@
+package com.fjhx.sale.entity.contract.vo;
+
+import com.fjhx.sale.entity.contract.po.Contract;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Getter
+@Setter
+public class PayDecisionAidVo {
+
+    private List<Contract> contractList;
+
+    private List<PurchaseInfo> purchaseInfoList;
+
+    @Getter
+    @Setter
+    public static class PurchaseInfo {
+
+        /**
+         * 采购合同id
+         */
+        private Long purchaseId;
+
+        /**
+         * 采购合同编号
+         */
+        private String purchaseCode;
+
+        /**
+         * 申购明细id
+         */
+        private Long purchaseDetailsId;
+
+        /**
+         * 产品id
+         */
+        private Long productId;
+
+        /**
+         * 产品名称
+         */
+        private String productName;
+
+        /**
+         * 产品编码
+         */
+        private String productCode;
+
+        /**
+         * 采购数量
+         */
+        private BigDecimal purchaseQuantity;
+
+        /**
+         * 到货数量
+         */
+        private BigDecimal invoiceQuantity;
+
+        /**
+         * 质检合格数量
+         */
+        private BigDecimal qualifiedCount;
+
+        /**
+         * 质检不合格数量
+         */
+        private BigDecimal noQualifiedCount;
+
+    }
+
+}

+ 7 - 4
hx-sale/src/main/java/com/fjhx/sale/service/contract/ContractService.java

@@ -7,11 +7,9 @@ import com.fjhx.item.entity.product.dto.ProductInfoSelectDto;
 import com.fjhx.sale.entity.contract.dto.ContractDto;
 import com.fjhx.sale.entity.contract.dto.ContractSelectDto;
 import com.fjhx.sale.entity.contract.dto.DecisionAidDto;
+import com.fjhx.sale.entity.contract.dto.PayDecisionAidDto;
 import com.fjhx.sale.entity.contract.po.Contract;
-import com.fjhx.sale.entity.contract.vo.ContractBudgetVo;
-import com.fjhx.sale.entity.contract.vo.ContractPdfInfoVo;
-import com.fjhx.sale.entity.contract.vo.ContractVo;
-import com.fjhx.sale.entity.contract.vo.DecisionAidVo;
+import com.fjhx.sale.entity.contract.vo.*;
 import com.fjhx.sale.entity.sale.vo.SaleQuotationVo;
 import com.ruoyi.common.core.service.BaseService;
 
@@ -157,4 +155,9 @@ public interface ContractService extends BaseService<Contract> {
      */
     DecisionAidVo decisionAid(DecisionAidDto dto);
 
+    /**
+     * 采购付款决策辅助
+     */
+    PayDecisionAidVo payDecisionAid(PayDecisionAidDto dto);
+
 }

+ 182 - 0
hx-sale/src/main/java/com/fjhx/sale/service/contract/impl/ContractServiceImpl.java

@@ -34,14 +34,22 @@ import com.fjhx.file.entity.FileInfoVo;
 import com.fjhx.file.utils.ObsFileUtil;
 import com.fjhx.item.entity.product.dto.ProductInfoSelectDto;
 import com.fjhx.item.service.product.ProductInfoService;
+import com.fjhx.purchase.entity.arrival.po.ArrivalDetail;
+import com.fjhx.purchase.entity.purchase.po.Purchase;
+import com.fjhx.purchase.entity.purchase.po.PurchaseDetail;
 import com.fjhx.purchase.entity.purchase.vo.PurchaseDetailVo;
+import com.fjhx.purchase.entity.quality.po.QualityDetail;
+import com.fjhx.purchase.service.arrival.ArrivalDetailService;
 import com.fjhx.purchase.service.purchase.PurchaseDetailService;
+import com.fjhx.purchase.service.purchase.PurchaseService;
+import com.fjhx.purchase.service.quality.QualityDetailService;
 import com.fjhx.sale.entity.claim.po.ClaimContract;
 import com.fjhx.sale.entity.contract.bo.ContractCurrencyRate;
 import com.fjhx.sale.entity.contract.bo.ContractDocumentaryBo;
 import com.fjhx.sale.entity.contract.dto.ContractDto;
 import com.fjhx.sale.entity.contract.dto.ContractSelectDto;
 import com.fjhx.sale.entity.contract.dto.DecisionAidDto;
+import com.fjhx.sale.entity.contract.dto.PayDecisionAidDto;
 import com.fjhx.sale.entity.contract.po.Contract;
 import com.fjhx.sale.entity.contract.po.ContractProduct;
 import com.fjhx.sale.entity.contract.po.ContractProject;
@@ -131,6 +139,18 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
     @Autowired
     private ContractProjectService contractProjectService;
 
+    @Autowired
+    private ContractService contractService;
+
+    @Autowired
+    private PurchaseService purchaseService;
+
+    @Autowired
+    private ArrivalDetailService arrivalDetailService;
+
+    @Autowired
+    private QualityDetailService qualityDetailService;
+
     /**
      * 分页
      *
@@ -775,6 +795,168 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
         return decisionAidVo;
     }
 
+    @Override
+    public PayDecisionAidVo payDecisionAid(PayDecisionAidDto dto) {
+
+        PayDecisionAidVo vo = new PayDecisionAidVo();
+
+        // 采购合同id
+        List<Long> purchaseIdList = dto.getPurchaseIdList();
+
+        if (purchaseIdList.size() == 0) {
+            return vo;
+        }
+
+        // 采购合同
+        List<Purchase> purchaseList = purchaseService.listByIds(purchaseIdList);
+        List<PurchaseDetail> purchaseDetailList = purchaseDetailService.list(q -> q.in(PurchaseDetail::getPurchaseId, purchaseIdList));
+
+        // 赋值关联销售合同
+        setContractInfo(vo, purchaseDetailList);
+
+        // 赋值采购合同数据
+        setPurchaseInfo(vo, purchaseList, purchaseDetailList);
+
+        // 赋值到货数据
+        List<ArrivalDetail> arrivalDetails = setInvoiceQuantity(vo);
+
+        // 赋值合格率
+        setPassRate(vo, arrivalDetails);
+
+        // TODO 赋值退货数量 无法关联
+
+
+        return vo;
+    }
+
+    /**
+     * 赋值合格率
+     */
+    private void setPassRate(PayDecisionAidVo vo, List<ArrivalDetail> arrivalDetails) {
+        List<PayDecisionAidVo.PurchaseInfo> purchaseInfoList = vo.getPurchaseInfoList();
+
+        if (arrivalDetails.size() == 0) {
+            return;
+        }
+
+        // 到货明细通过采购明细id分组
+        Map<Long, List<ArrivalDetail>> arrivalDetailMap = arrivalDetails.stream().collect(Collectors.groupingBy(
+                ArrivalDetail::getPurchaseDetailId
+        ));
+
+        // 通过到货明细查询质检记录
+        List<Long> arrivalDetailsIdList = arrivalDetails.stream().map(BaseIdPo::getId).collect(Collectors.toList());
+        List<QualityDetail> list = qualityDetailService.list(q -> q.in(QualityDetail::getArrivalDetailId, arrivalDetailsIdList));
+
+
+        for (PayDecisionAidVo.PurchaseInfo purchaseInfo : purchaseInfoList) {
+
+            List<ArrivalDetail> arrivalDetailsList = arrivalDetailMap.get(purchaseInfo.getPurchaseDetailsId());
+
+            purchaseInfo.setQualifiedCount(BigDecimal.ZERO);
+            purchaseInfo.setNoQualifiedCount(BigDecimal.ZERO);
+
+            List<Long> itemArrivalDetailsIdList = arrivalDetailsList.stream().map(BaseIdPo::getId).collect(Collectors.toList());
+            for (QualityDetail qualityDetail : list) {
+                if (!itemArrivalDetailsIdList.contains(qualityDetail.getArrivalDetailId())) {
+                    continue;
+                }
+                purchaseInfo.setQualifiedCount(purchaseInfo.getQualifiedCount().add(qualityDetail.getQualifiedCount()));
+                purchaseInfo.setNoQualifiedCount(purchaseInfo.getNoQualifiedCount().add(qualityDetail.getNoQualifiedCount()));
+            }
+        }
+
+    }
+
+
+    /**
+     * 赋值到货数据
+     */
+    private List<ArrivalDetail> setInvoiceQuantity(PayDecisionAidVo vo) {
+        List<PayDecisionAidVo.PurchaseInfo> purchaseInfoList = vo.getPurchaseInfoList();
+
+        // 采购明细id列表
+        List<Long> purchaseDetailsIdList = purchaseInfoList.stream()
+                .map(PayDecisionAidVo.PurchaseInfo::getPurchaseDetailsId).collect(Collectors.toList());
+
+        if (purchaseDetailsIdList.size() == 0) {
+            return Collections.emptyList();
+        }
+
+        List<ArrivalDetail> list = arrivalDetailService.list(q -> q.eq(ArrivalDetail::getPurchaseDetailId, purchaseDetailsIdList));
+
+        Map<Long, BigDecimal> collect = list.stream().collect(Collectors.toMap(
+                ArrivalDetail::getPurchaseDetailId,
+                ArrivalDetail::getCount,
+                BigDecimal::add
+        ));
+
+        for (PayDecisionAidVo.PurchaseInfo purchaseInfo : purchaseInfoList) {
+            BigDecimal invoiceQuantity = collect.getOrDefault(purchaseInfo.getPurchaseDetailsId(), BigDecimal.ZERO);
+            purchaseInfo.setInvoiceQuantity(invoiceQuantity);
+        }
+
+        return list;
+    }
+
+    /**
+     * 赋值采购合同数据
+     */
+    private void setPurchaseInfo(PayDecisionAidVo vo, List<Purchase> purchaseList, List<PurchaseDetail> purchaseDetailList) {
+
+        Map<Long, List<PurchaseDetail>> purchaseDetailMap = purchaseDetailList.stream()
+                .collect(Collectors.groupingBy(PurchaseDetail::getPurchaseId));
+
+        List<PayDecisionAidVo.PurchaseInfo> list = new ArrayList<>();
+
+        for (Purchase purchase : purchaseList) {
+            List<PurchaseDetail> itemList = purchaseDetailMap.get(purchase.getId());
+
+            if (itemList.size() == 0) {
+                continue;
+            }
+
+            for (PurchaseDetail purchaseDetail : itemList) {
+                PayDecisionAidVo.PurchaseInfo purchaseInfo = new PayDecisionAidVo.PurchaseInfo();
+                purchaseInfo.setPurchaseId(purchase.getId());
+                purchaseInfo.setPurchaseCode(purchase.getCode());
+                purchaseInfo.setPurchaseDetailsId(purchaseDetail.getId());
+                purchaseInfo.setProductId(purchaseDetail.getBussinessId());
+                purchaseInfo.setPurchaseQuantity(purchaseDetail.getCount());
+                list.add(purchaseInfo);
+            }
+        }
+
+        // 赋值产品id
+        productInfoService.attributeAssign(list, PayDecisionAidVo.PurchaseInfo::getProductId, (item, product) -> {
+            item.setProductName(product.getName());
+            item.setProductCode(product.getCode());
+        });
+
+        vo.setPurchaseInfoList(list);
+    }
+
+    /**
+     * 赋值销售合同数据
+     */
+    private void setContractInfo(PayDecisionAidVo vo, List<PurchaseDetail> purchaseDetailList) {
+
+        List<Long> contractIdList = purchaseDetailList.stream()
+                .filter(item -> Objects.equals(item.getDataResource(), 1))
+                .map(PurchaseDetail::getDataResourceId)
+                .filter(Objects::nonNull)
+                .distinct()
+                .collect(Collectors.toList());
+
+        if (contractIdList.size() == 0) {
+            vo.setContractList(Collections.emptyList());
+            return;
+        }
+
+        List<Contract> customerList = contractService.list(q -> q.in(BaseIdPo::getId, contractIdList));
+        vo.setContractList(customerList);
+    }
+
 
     /**
      * 赋值外销合同信息