Bladeren bron

新增E10采购合同导入,供应商新增编号字段

fgd 1 jaar geleden
bovenliggende
commit
daffcc81f1

+ 13 - 3
sd-business/src/main/java/com/sd/business/controller/purchase/PurchaseController.java

@@ -3,16 +3,16 @@ package com.sd.business.controller.purchase;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.flow.enums.FlowStatusEnum;
 import com.ruoyi.common.core.domain.BaseSelectDto;
-import com.sd.business.entity.purchase.dto.PurchaseDto;
-import com.sd.business.entity.purchase.dto.PurchaseSelectDto;
-import com.sd.business.entity.purchase.dto.PurchaseSelectListDto;
+import com.sd.business.entity.purchase.dto.*;
 import com.sd.business.entity.purchase.vo.PurchaseVo;
 import com.sd.business.service.purchase.PurchaseService;
+import com.sd.framework.util.excel.util.ExcelUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 
@@ -97,4 +97,14 @@ public class PurchaseController {
     public Page<PurchaseVo> getPurchaseSelectList(@RequestBody PurchaseSelectListDto dto) {
         return purchaseService.getPurchaseSelectList(dto);
     }
+
+    /**
+     * 导入E10采购合同
+     */
+    @PostMapping("/purchaseImport")
+    public void purchaseImport(MultipartFile file) {
+        List<PurchaseImportDataDto> list = ExcelUtil.read(file, 0, PurchaseImportDataDto.class);
+        List<PurchaseBomImportDataDto> bomImportDataList = ExcelUtil.read(file, 1, PurchaseBomImportDataDto.class);
+        purchaseService.purchaseImport(list, bomImportDataList);
+    }
 }

+ 3 - 1
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseArrivalImportDataDto.java

@@ -4,8 +4,10 @@ import com.alibaba.excel.annotation.ExcelProperty;
 import lombok.Getter;
 import lombok.Setter;
 
-import java.math.BigDecimal;
 
+/**
+ * 采购到货单导入入参实体
+ */
 @Getter
 @Setter
 public class PurchaseArrivalImportDataDto {

+ 48 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseBomImportDataDto.java

@@ -0,0 +1,48 @@
+package com.sd.business.entity.purchase.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * E10采购合同bom 导入入参实体
+ */
+@Getter
+@Setter
+public class PurchaseBomImportDataDto {
+    /**
+     * 采购单号
+     */
+    @ExcelProperty("PURCHASE_ORDER__DOC_NO")
+    private String purchaseCode;
+
+    /**
+     * bom品号
+     */
+    @ExcelProperty("ITEM_ID_CODE")
+    private String bomSpecCode;
+
+    /**
+     * 数量
+     */
+    @ExcelProperty("BUSINESS_QTY")
+    private String quantity;
+
+    /**
+     * 含税单价
+     */
+    @ExcelProperty("DISCOUNTED_PRICE")
+    private String unitPrice;
+
+    /**
+     * 总金额
+     */
+    @ExcelProperty("AMOUNT")
+    private String totalAmount;
+
+    /**
+     * 交付日期
+     */
+    @ExcelProperty("PLAN_ARRIVAL_DATE")
+    private String deliveryDate;
+}

+ 26 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseImportDataDto.java

@@ -0,0 +1,26 @@
+package com.sd.business.entity.purchase.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * E10采购合同导入入参实体
+ */
+@Getter
+@Setter
+public class PurchaseImportDataDto {
+
+    /**
+     * 采购单号
+     */
+    @ExcelProperty("DOC_NO")
+    private String code;
+
+
+    /**
+     * 供应商编码
+     */
+    @ExcelProperty("SUPPLIER_ID_CODE")
+    private String supplierCode;
+}

+ 5 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/po/Purchase.java

@@ -27,6 +27,11 @@ public class Purchase extends BasePo {
     private String code;
 
     /**
+     * e10 采购合同编号
+     */
+    private String erpCode;
+
+    /**
      * 申购单id
      */
     private Long applyBuyId;

+ 5 - 0
sd-business/src/main/java/com/sd/business/entity/supplier/po/Supplier.java

@@ -24,6 +24,11 @@ public class Supplier extends BasePo {
     private String name;
 
     /**
+     * 供应商编码
+     */
+    private String code;
+
+    /**
      * 公司电话
      */
     private String companyTelephone;

+ 8 - 3
sd-business/src/main/java/com/sd/business/service/purchase/PurchaseService.java

@@ -3,9 +3,7 @@ package com.sd.business.service.purchase;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.service.BaseService;
 import com.sd.business.entity.in.po.InOutStorageBom;
-import com.sd.business.entity.purchase.dto.PurchaseDto;
-import com.sd.business.entity.purchase.dto.PurchaseSelectDto;
-import com.sd.business.entity.purchase.dto.PurchaseSelectListDto;
+import com.sd.business.entity.purchase.dto.*;
 import com.sd.business.entity.purchase.po.Purchase;
 import com.sd.business.entity.purchase.vo.PurchaseVo;
 
@@ -71,4 +69,11 @@ public interface PurchaseService extends BaseService<Purchase> {
      * @return
      */
     Page<PurchaseVo> getPurchaseSelectList(PurchaseSelectListDto dto);
+
+    /**
+     * 导入E10采购合同
+     * @param list
+     * @param bomImportDataList
+     */
+    void purchaseImport(List<PurchaseImportDataDto> list, List<PurchaseBomImportDataDto> bomImportDataList);
 }

+ 9 - 5
sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchasePendingStorageServiceImpl.java

@@ -177,11 +177,12 @@ public class PurchasePendingStorageServiceImpl extends ServiceImpl<PurchasePendi
         PurchasePendingStorageVo purchasePendingStorageVo = new PurchasePendingStorageVo();
         List<String> purchaseCodes = list.stream().map(PurchaseArrivalImportDataDto::getPurchaseCode).collect(Collectors.toList());
         // 采购合同数据
-        List<Purchase> purchaseList = purchaseService.list(q -> q.in(Purchase::getCode, purchaseCodes));
+        List<Purchase> purchaseList = purchaseService.list(q -> q.in(Purchase::getCode, purchaseCodes).or().in(Purchase::getErpCode, purchaseCodes));
         if (purchaseList.isEmpty()) {
             throw new ServiceException("未知采购合同编号");
         }
         Map<String, Purchase> purchaseMap = purchaseList.stream().collect(Collectors.toMap(Purchase::getCode, Function.identity()));
+        Map<String, Purchase> erpPurchaseMap = purchaseList.stream().collect(Collectors.toMap(Purchase::getErpCode, Function.identity(), (v1, v2) -> v2));
         List<Long> purchaseIds = purchaseList.stream().map(BaseIdPo::getId).collect(Collectors.toList());
         // 采购合同bom 数据
         List<PurchaseBom> purchaseBomAllList = purchaseBomService.list(q -> q.in(PurchaseBom::getPurchaseId, purchaseIds));
@@ -196,12 +197,15 @@ public class PurchasePendingStorageServiceImpl extends ServiceImpl<PurchasePendi
         for (PurchaseArrivalImportDataDto dto : list) {
             Purchase purchase = purchaseMap.get(dto.getPurchaseCode());
             if (purchase == null) {
-                throw new ServiceException("未知采购合同编号:" + dto.getPurchaseCode());
+                purchase = erpPurchaseMap.get(dto.getPurchaseCode());
+                if (purchase == null) {
+                    throw new ServiceException("未知采购合同编号:" + dto.getPurchaseCode());
+                }
             }
             // 判断采购合同是否存在当前bom
             BomSpec bomSpec = bomSpecMap.get(dto.getBomSpecCode());
             if (bomSpec == null) {
-                throw new ServiceException("未知bom品号:" + dto.getPurchaseCode());
+                throw new ServiceException("未知bom品号:" + dto.getBomSpecCode());
             }
             List<PurchaseBom> purchaseBomList = purchaseBomMap.get(purchase.getId());
             PurchaseBom purchaseBom = purchaseBomList.stream().filter(item -> ObjectUtil.equals(bomSpec.getId(), item.getBomSpecId())).findFirst().orElse(null);
@@ -212,7 +216,7 @@ public class PurchasePendingStorageServiceImpl extends ServiceImpl<PurchasePendi
             BigDecimal arrivalQuantity = new BigDecimal(dto.getArrivalQuantity());
             BigDecimal canInStorageQuantity = purchaseBom.getPurchaseQuantity().subtract(purchaseBom.getArrivalQuantity()).add(purchaseBom.getReturnQuantity());
             if (canInStorageQuantity.compareTo(arrivalQuantity) < 0) {
-                throw new ServiceException("bom品号:" + dto.getPurchaseCode() + "超出可入库数量");
+                throw new ServiceException("bom品号:" + dto.getBomSpecCode() + "超出可入库数量");
             }
 
             BomSpecBo bomSpecBo = bomSpecBoMap.get(bomSpec.getId());
@@ -224,7 +228,7 @@ public class PurchasePendingStorageServiceImpl extends ServiceImpl<PurchasePendi
             bomVo.setBomSpecId(bomSpec.getId());
             bomVo.setArrivalQuantity(arrivalQuantity);
             if (ObjectUtil.equals(bomSpecBo.getClassifyParentId(), 1L)) {
-                bomVo.setWarehouseName("半成品仓");
+                bomVo.setWarehouseName("材料仓");
             } else {
                 bomVo.setWarehouseName("包材仓");
             }

+ 124 - 4
sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseServiceImpl.java

@@ -1,8 +1,11 @@
 package com.sd.business.service.purchase.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.file.utils.ObsFileUtil;
@@ -12,10 +15,10 @@ import com.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.sd.business.entity.apply.po.ApplyBuyBom;
+import com.sd.business.entity.bom.po.BomSpec;
 import com.sd.business.entity.in.po.InOutStorageBom;
-import com.sd.business.entity.purchase.dto.PurchaseDto;
-import com.sd.business.entity.purchase.dto.PurchaseSelectDto;
-import com.sd.business.entity.purchase.dto.PurchaseSelectListDto;
+import com.sd.business.entity.order.po.OrderInfo;
+import com.sd.business.entity.purchase.dto.*;
 import com.sd.business.entity.purchase.enums.PurchaseStatusEnum;
 import com.sd.business.entity.purchase.po.Purchase;
 import com.sd.business.entity.purchase.po.PurchaseBom;
@@ -27,11 +30,14 @@ import com.sd.business.service.apply.ApplyBuyBomService;
 import com.sd.business.service.bom.BomSpecService;
 import com.sd.business.service.purchase.PurchaseBomService;
 import com.sd.business.service.purchase.PurchaseService;
+import com.sd.business.service.supplier.SupplierService;
 import com.sd.business.util.CodeEnum;
+import com.sd.framework.util.Assert;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -56,13 +62,16 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
     @Autowired
     private ApplyBuyBomService applyBuyBomService;
 
+    @Autowired
+    private SupplierService supplierService;
+
     @Override
     public Page<PurchaseVo> getPage(PurchaseSelectDto dto) {
         IWrapper<Purchase> wrapper = getWrapper();
-        wrapper.like("p", Purchase::getCode, dto.getCode());
         wrapper.eq("p", Purchase::getFlowStatus, dto.getFlowStatus());
         wrapper.eq("p", Purchase::getStatus, dto.getStatus());
         wrapper.like("s", Supplier::getName, dto.getSupplierName());
+        wrapper.and(q -> q.like("p", Purchase::getCode, dto.getCode()).or().like("p", Purchase::getErpCode, dto.getCode()));
         wrapper.orderByDesc("p", Purchase::getId);
 
         // 查询采购单数据
@@ -296,10 +305,121 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
         // 采购入库查询排除胜德塑胶供应商
         if (ObjectUtil.equals(dto.getQueryType(), 1)) {
             wrapper.ne("s", Supplier::getName, "福清市胜德塑胶制品有限公司");
+            wrapper.eq("p", Purchase::getStatus, PurchaseStatusEnum.UNDER_PURCHASE);
         }
         wrapper.orderByDesc("p", Purchase::getId);
 
         // 查询采购单数据
         return this.baseMapper.getPage(dto.getPage(), wrapper);
     }
+
+    @Override
+    public void purchaseImport(List<PurchaseImportDataDto> list, List<PurchaseBomImportDataDto> bomImportDataList) {
+        // 验证导入数据
+        validatedImportData(list, bomImportDataList);
+
+        Map<String, List<PurchaseBomImportDataDto>> bomMap = bomImportDataList.stream().collect(Collectors.groupingBy(PurchaseBomImportDataDto::getPurchaseCode));
+
+        List<String> purchaseCodes = list.stream().map(PurchaseImportDataDto::getCode).collect(Collectors.toList());
+        Map<String, Long> purchaseMap = this.mapKV(Purchase::getErpCode, BaseIdPo::getId, q -> q.in(Purchase::getErpCode, purchaseCodes));
+
+        List<String> supplierCodes = list.stream().map(PurchaseImportDataDto::getSupplierCode).collect(Collectors.toList());
+        Map<String, Long> supplierMap = supplierService.mapKV(Supplier::getCode, BaseIdPo::getId, q -> q.in(Supplier::getCode, supplierCodes));
+        List<String> bomSpecCodes = bomImportDataList.stream().map(PurchaseBomImportDataDto::getBomSpecCode).collect(Collectors.toList());
+        Map<String, Long> bomSpecMap = bomSpecService.mapKV(BomSpec::getCode, BaseIdPo::getId, q -> q.in(BomSpec::getCode, bomSpecCodes));
+
+        List<Purchase> purchaseList = new ArrayList<>();
+        List<PurchaseBom> purchaseBomList = new ArrayList<>();
+        for (PurchaseImportDataDto importDataDto : list) {
+            // 判断是否存在重复编号
+            Long purchaseId = purchaseMap.get(importDataDto.getCode());
+            if (purchaseId != null) {
+                throw new ServiceException("采购合同编号:" + importDataDto.getCode() + " 已存在");
+            }
+
+            Long supplierId = supplierMap.get(importDataDto.getSupplierCode());
+            if (supplierId == null) {
+                throw new ServiceException("未知供应商编号:" + importDataDto.getSupplierCode());
+            }
+
+            List<PurchaseBomImportDataDto> bomList = bomMap.get(importDataDto.getCode());
+
+            if (ObjectUtil.isEmpty(bomList)) {
+                continue;
+            }
+
+            // 保存采购合同
+            Purchase purchase = new Purchase();
+            purchase.setId(IdWorker.getId());
+            purchase.setCode(CodeEnum.PURCHASE_CODE.getCode());
+            purchase.setSupplierId(supplierId);
+            purchase.setStatus(PurchaseStatusEnum.UNDER_PURCHASE.getKey());
+            purchase.setFlowStatus(FlowStatusEnum.PASS.getKey());
+            purchase.setErpCode(importDataDto.getCode());
+            purchase.setReceiveGoodsType(1);
+            purchase.setAdvancePayment(BigDecimal.ZERO);
+            purchase.setReturnAmount(BigDecimal.ZERO);
+            purchase.setClosedAccountAmount(BigDecimal.ZERO);
+            purchase.setDeductibleAmount(BigDecimal.ZERO);
+            purchase.setPaymentStatus(StatusConstant.NO);
+            purchase.setStorageStatus(StatusConstant.NO);
+            purchase.setTotalAmountIncludingTax(BigDecimal.ZERO);
+            purchase.setTotalAmountExcludingTax(BigDecimal.ZERO);
+            try {
+                purchase.setDeliveryDate(DateUtil.parse(bomList.get(0).getDeliveryDate()));
+            } catch (Exception e) {
+                throw new ServiceException("交付日期格式异常");
+            }
+
+            List<PurchaseBom> bomData = bomList.stream().map(item -> {
+                Long bomSpecId = bomSpecMap.get(item.getBomSpecCode());
+                if (bomSpecId == null) {
+                    throw new ServiceException("未知bom品号:" + item.getBomSpecCode());
+                }
+                PurchaseBom purchaseBom = new PurchaseBom();
+                purchaseBom.setPurchaseId(purchase.getId());
+                purchaseBom.setBomSpecId(bomSpecId);
+                purchaseBom.setUnitPrice(new BigDecimal(item.getUnitPrice()));
+                purchaseBom.setTaxRate(BigDecimal.TEN);
+                purchaseBom.setPurchaseQuantity(new BigDecimal(item.getQuantity()));
+                purchaseBom.setArrivalQuantity(BigDecimal.ZERO);
+                purchaseBom.setReturnQuantity(BigDecimal.ZERO);
+                purchaseBom.setPaidAmount(BigDecimal.ZERO);
+
+                purchase.setTotalAmountIncludingTax(purchase.getTotalAmountIncludingTax().add(new BigDecimal(item.getTotalAmount())));
+                // 计算不含税总金额
+                BigDecimal totalAmountIncludingTax = purchaseBom.getUnitPrice().divide(new BigDecimal("1.1"), 4, RoundingMode.HALF_UP).multiply(purchaseBom.getPurchaseQuantity());
+                purchase.setTotalAmountExcludingTax(purchase.getTotalAmountExcludingTax().add(totalAmountIncludingTax));
+                return purchaseBom;
+            }).collect(Collectors.toList());
+            purchaseList.add(purchase);
+            purchaseBomList.addAll(bomData);
+            purchaseMap.put(importDataDto.getCode(), purchase.getId());
+        }
+
+        this.saveBatch(purchaseList);
+        purchaseBomService.saveBatch(purchaseBomList);
+    }
+
+    private void validatedImportData(List<PurchaseImportDataDto> list, List<PurchaseBomImportDataDto> bomImportDataList) {
+        // 删除第一行表头字段
+        list.remove(0);
+        bomImportDataList.remove(0);
+        Assert.notEmpty(list, "采购合同不能为空");
+        Assert.notEmpty(bomImportDataList, "采购合同明细不能为空");
+        for (PurchaseImportDataDto dto : list) {
+            Assert.notNull(dto.getCode(), "采购合同编号不能为空");
+            Assert.notNull(dto.getSupplierCode(), "供应商编号不能为空");
+        }
+        for (PurchaseBomImportDataDto dto : bomImportDataList) {
+            Assert.notNull(dto.getPurchaseCode(), "采购合同编号不能为空");
+            Assert.notNull(dto.getBomSpecCode(), "bom品号不能为空");
+            Assert.eqTrue(NumberUtil.isNumber(dto.getQuantity()), "采购数量格式不正确");
+            Assert.eqTrue(NumberUtil.isNumber(dto.getUnitPrice()), "采购单价格式不正确");
+            Assert.eqTrue(NumberUtil.isNumber(dto.getTotalAmount()), "采购金额合计格式不正确");
+            Assert.gtZero(new BigDecimal(dto.getQuantity()), "采购数量必须大于0");
+            Assert.gtZero(new BigDecimal(dto.getUnitPrice()), "采购单价必须大于0");
+        }
+    }
+
 }