Преглед на файлове

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseServiceImpl.java
24282 преди 1 година
родител
ревизия
03eb09f385
променени са 17 файла, в които са добавени 267 реда и са изтрити 80 реда
  1. 3 3
      sd-business/src/main/java/com/sd/business/controller/apply/ApplyBuyController.java
  2. 13 3
      sd-business/src/main/java/com/sd/business/controller/purchase/PurchaseController.java
  3. 0 21
      sd-business/src/main/java/com/sd/business/entity/apply/dto/ApplyBuyDetailSelectDto.java
  4. 0 11
      sd-business/src/main/java/com/sd/business/entity/apply/vo/ApplyBuyBomVo.java
  5. 5 0
      sd-business/src/main/java/com/sd/business/entity/board/dto/SkuSpecQuotationDto.java
  6. 3 1
      sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseArrivalImportDataDto.java
  7. 48 0
      sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseBomImportDataDto.java
  8. 26 0
      sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseImportDataDto.java
  9. 5 0
      sd-business/src/main/java/com/sd/business/entity/purchase/po/Purchase.java
  10. 4 0
      sd-business/src/main/java/com/sd/business/entity/purchase/vo/PurchaseBomVo.java
  11. 5 0
      sd-business/src/main/java/com/sd/business/entity/supplier/po/Supplier.java
  12. 1 2
      sd-business/src/main/java/com/sd/business/service/apply/ApplyBuyService.java
  13. 4 20
      sd-business/src/main/java/com/sd/business/service/apply/impl/ApplyBuyServiceImpl.java
  14. 8 3
      sd-business/src/main/java/com/sd/business/service/purchase/PurchaseService.java
  15. 9 5
      sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchasePendingStorageServiceImpl.java
  16. 130 8
      sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseServiceImpl.java
  17. 3 3
      sd-business/src/main/java/com/sd/business/service/sku/impl/SkuSpecServiceImpl.java

+ 3 - 3
sd-business/src/main/java/com/sd/business/controller/apply/ApplyBuyController.java

@@ -2,7 +2,7 @@ package com.sd.business.controller.apply;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.flow.enums.FlowStatusEnum;
-import com.sd.business.entity.apply.dto.ApplyBuyDetailSelectDto;
+import com.ruoyi.common.core.domain.BaseSelectDto;
 import com.sd.business.entity.apply.dto.ApplyBuyDto;
 import com.sd.business.entity.apply.dto.ApplyBuySelectDto;
 import com.sd.business.entity.apply.vo.ApplyBuyVo;
@@ -42,8 +42,8 @@ public class ApplyBuyController {
      * 申购单明细
      */
     @PostMapping("/detail")
-    public ApplyBuyVo detail(@RequestBody ApplyBuyDetailSelectDto dto) {
-        return applyBuyService.detail(dto);
+    public ApplyBuyVo detail(@RequestBody BaseSelectDto dto) {
+        return applyBuyService.detail(dto.getId());
     }
 
     /**

+ 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);
+    }
 }

+ 0 - 21
sd-business/src/main/java/com/sd/business/entity/apply/dto/ApplyBuyDetailSelectDto.java

@@ -1,21 +0,0 @@
-package com.sd.business.entity.apply.dto;
-
-import com.ruoyi.common.core.domain.BaseSelectDto;
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * 申购单详情查询入参实体
- *
- * @author
- * @since 2023-10-30
- */
-@Getter
-@Setter
-public class ApplyBuyDetailSelectDto extends BaseSelectDto {
-
-    /**
-     * 采购id
-     */
-    private Long purchaseId;
-}

+ 0 - 11
sd-business/src/main/java/com/sd/business/entity/apply/vo/ApplyBuyBomVo.java

@@ -45,15 +45,4 @@ public class ApplyBuyBomVo extends ApplyBuyBom {
      * 高 cm
      */
     private BigDecimal bomSpecHeight;
-
-    /**
-     * 到货数量
-     */
-    private BigDecimal arrivalQuantity;
-
-    /**
-     * 在途数量
-     */
-    private BigDecimal inTransitQuantity;
-
 }

+ 5 - 0
sd-business/src/main/java/com/sd/business/entity/board/dto/SkuSpecQuotationDto.java

@@ -14,6 +14,11 @@ import lombok.Setter;
 public class SkuSpecQuotationDto {
 
     /**
+     * 事业部id
+     */
+    private Long departmentId;
+
+    /**
      * sku品号
      */
     private String skuSpecCode;

+ 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;

+ 4 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/vo/PurchaseBomVo.java

@@ -46,4 +46,8 @@ public class PurchaseBomVo extends PurchaseBom {
      */
     private BigDecimal bomSpecHeight;
 
+    /**
+     * 在途数量
+     */
+    private BigDecimal inTransitQuantity;
 }

+ 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;

+ 1 - 2
sd-business/src/main/java/com/sd/business/service/apply/ApplyBuyService.java

@@ -2,7 +2,6 @@ package com.sd.business.service.apply;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.service.BaseService;
-import com.sd.business.entity.apply.dto.ApplyBuyDetailSelectDto;
 import com.sd.business.entity.apply.dto.ApplyBuyDto;
 import com.sd.business.entity.apply.dto.ApplyBuySelectDto;
 import com.sd.business.entity.apply.po.ApplyBuy;
@@ -27,7 +26,7 @@ public interface ApplyBuyService extends BaseService<ApplyBuy> {
     /**
      * 申购单明细
      */
-    ApplyBuyVo detail(ApplyBuyDetailSelectDto dto);
+    ApplyBuyVo detail(Long id);
 
     /**
      * 申购单添加

+ 4 - 20
sd-business/src/main/java/com/sd/business/service/apply/impl/ApplyBuyServiceImpl.java

@@ -14,7 +14,6 @@ import com.fjhx.file.service.FileInfoService;
 import com.fjhx.file.utils.ObsFileUtil;
 import com.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.utils.wrapper.IWrapper;
-import com.sd.business.entity.apply.dto.ApplyBuyDetailSelectDto;
 import com.sd.business.entity.apply.dto.ApplyBuyDto;
 import com.sd.business.entity.apply.dto.ApplyBuySelectDto;
 import com.sd.business.entity.apply.po.ApplyBuy;
@@ -25,7 +24,6 @@ import com.sd.business.entity.apply.vo.ApplyBuyVo;
 import com.sd.business.entity.bom.po.BomSpec;
 import com.sd.business.entity.department.constant.DepartmentConstant;
 import com.sd.business.entity.inventory.po.Inventory;
-import com.sd.business.entity.purchase.po.PurchaseBom;
 import com.sd.business.entity.warehouse.constant.WarehouseConstant;
 import com.sd.business.mapper.apply.ApplyBuyMapper;
 import com.sd.business.service.apply.ApplyBuyBomService;
@@ -106,15 +104,15 @@ public class ApplyBuyServiceImpl extends ServiceImpl<ApplyBuyMapper, ApplyBuy> i
     }
 
     @Override
-    public ApplyBuyVo detail(ApplyBuyDetailSelectDto dto) {
-        Assert.notNull(dto.getId(), "申购单id不能为空");
+    public ApplyBuyVo detail(Long id) {
+        Assert.notNull(id, "申购单id不能为空");
 
         // 申购单
-        ApplyBuy ApplyBuy = this.getById(dto.getId());
+        ApplyBuy ApplyBuy = this.getById(id);
         Assert.notNull(ApplyBuy, "没有找到申购单");
 
         // 申购明细
-        List<ApplyBuyBom> list = applyBuyBomService.list(q -> q.eq(ApplyBuyBom::getApplyBuyId, dto.getId()));
+        List<ApplyBuyBom> list = applyBuyBomService.list(q -> q.eq(ApplyBuyBom::getApplyBuyId, id));
         List<ApplyBuyBomVo> applyBuyBomList = BeanUtil.copyToList(list, ApplyBuyBomVo.class);
 
         // 赋值bom规格
@@ -128,20 +126,6 @@ public class ApplyBuyServiceImpl extends ServiceImpl<ApplyBuyMapper, ApplyBuy> i
         });
 
         // TODO 库存,在途数量,近30天消耗量,近30天入库量,安全库存 未赋值
-        // 赋值到货数量和在途数量
-        if (dto.getPurchaseId() != null) {
-            Map<Long, PurchaseBom> purchaseBomMap = purchaseBomService.mapKEntity(PurchaseBom::getBomSpecId, q -> q
-                    .eq(PurchaseBom::getPurchaseId, dto.getPurchaseId()));
-            applyBuyBomList.forEach(item -> {
-                PurchaseBom purchaseBom = purchaseBomMap.get(item.getBomSpecId());
-                if (purchaseBom != null) {
-                    item.setInTransitQuantity(purchaseBom.getPurchaseQuantity()
-                            .subtract(purchaseBom.getArrivalQuantity())
-                            .add(purchaseBom.getReturnQuantity()));
-                    item.setArrivalQuantity(purchaseBom.getArrivalQuantity());
-                }
-            });
-        }
 
         // 赋值返回值
         ApplyBuyVo result = BeanUtil.toBean(ApplyBuy, ApplyBuyVo.class);

+ 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("包材仓");
             }

+ 130 - 8
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,15 +30,15 @@ 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.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import java.math.RoundingMode;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -59,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);
 
         // 查询采购单数据
@@ -112,6 +118,11 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
             item.setBomSpecWidth(bomSpec.getWidth());
             item.setBomSpecHeight(bomSpec.getHeight());
         });
+        // 赋值在途数量
+        purchaseBomList.forEach(item -> item.setInTransitQuantity(
+                item.getPurchaseQuantity()
+                .subtract(item.getArrivalQuantity())
+                .add(item.getReturnQuantity())));
 
         result.setPurchaseBomList(purchaseBomList);
         return result;
@@ -296,10 +307,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");
+        }
+    }
+
 }

+ 3 - 3
sd-business/src/main/java/com/sd/business/service/sku/impl/SkuSpecServiceImpl.java

@@ -175,8 +175,8 @@ public class SkuSpecServiceImpl extends ServiceImpl<SkuSpecMapper, SkuSpec> impl
 
     @Override
     public List<SkuSpecQuotationVo> getSkuSpecQuotationList(SkuSpecQuotationDto dto) {
-        Long deptId = SecurityUtils.getDeptId();
-        Department department = departmentService.getById(deptId);
+        Assert.notNull(dto.getDepartmentId(), "事业部id不能为空");
+        Department department = departmentService.getById(dto.getDepartmentId());
         Assert.notNull(department, "未知事业部");
         String priceBillingStandardIdStr = department.getPriceBillingStandardId();
         Assert.notBlank(priceBillingStandardIdStr, "事业部未绑定加工计费标准");
@@ -211,7 +211,7 @@ public class SkuSpecServiceImpl extends ServiceImpl<SkuSpecMapper, SkuSpec> impl
         List<Long> skuSpecIds = skuSpecList.stream().map(BaseIdPo::getId).collect(Collectors.toList());
         Map<Long, List<SkuSpecLink>> linkMap = skuSpecLinkService.mapKGroup(SkuSpecLink::getSkuSpecId,
                 q -> q.in(SkuSpecLink::getSkuSpecId, skuSpecIds)
-                        .eq(SkuSpecLink::getDepartmentId, deptId)
+                        .eq(SkuSpecLink::getDepartmentId, department.getId())
                         .eq(SkuSpecLink::getType, 1));
         Set<Long> bomSpecIds = skuSpecList.stream().map(SkuSpec::getBomSpecId).collect(Collectors.toSet());
         bomSpecIds.addAll(linkMap.values().stream().flatMap(item -> item.stream().map(SkuSpecLink::getBomSpecId)).collect(Collectors.toList()));