Parcourir la source

新增采购赠品入库

fgd il y a 1 an
Parent
commit
d6171872d9

+ 12 - 1
sd-business/src/main/java/com/sd/business/controller/purchase/PurchasePendingStorageController.java

@@ -3,8 +3,10 @@ package com.sd.business.controller.purchase;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.domain.BaseSelectDto;
 import com.sd.business.entity.purchase.dto.PurchaseArrivalImportDataDto;
+import com.sd.business.entity.purchase.dto.PurchaseGiftImportDataDto;
 import com.sd.business.entity.purchase.dto.PurchasePendingStorageDto;
 import com.sd.business.entity.purchase.dto.PurchasePendingStorageSelectDto;
+import com.sd.business.entity.purchase.vo.PurchasePendingStorageBomVo;
 import com.sd.business.entity.purchase.vo.PurchasePendingStorageVo;
 import com.sd.business.service.purchase.PurchasePendingStorageService;
 import com.sd.framework.util.excel.util.ExcelUtil;
@@ -69,9 +71,18 @@ public class PurchasePendingStorageController {
      * 导入采购到货单
      */
     @PostMapping("/purchaseArrivalImport")
-    public PurchasePendingStorageVo purchaseArrivalImport(MultipartFile file) {
+    public List<PurchasePendingStorageBomVo> purchaseArrivalImport(MultipartFile file) {
         List<PurchaseArrivalImportDataDto> list = ExcelUtil.read(file, PurchaseArrivalImportDataDto.class);
         return purchasePendingStorageService.purchaseArrivalImport(list);
     }
 
+    /**
+     * 导入采购赠品入库
+     */
+    @PostMapping("/purchaseGiftImport")
+    public List<PurchasePendingStorageBomVo> purchaseGiftImport(MultipartFile file) {
+        List<PurchaseGiftImportDataDto> list = ExcelUtil.read(file, PurchaseGiftImportDataDto.class);
+        return purchasePendingStorageService.purchaseGiftImport(list);
+    }
+
 }

+ 54 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseGiftImportDataDto.java

@@ -0,0 +1,54 @@
+package com.sd.business.entity.purchase.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 赠品入库导入实体
+ *
+ * @author
+ * @since 2023-11-07
+ */
+@Getter
+@Setter
+public class PurchaseGiftImportDataDto {
+    /**
+     * 单号
+     */
+    @ExcelProperty("单号")
+    private String code;
+
+    /**
+     * 入库时间
+     */
+    @ExcelProperty("交易日期")
+    private Date arrivalDate;
+
+    /**
+     * 仓库名称
+     */
+    @ExcelProperty("仓库名称")
+    private String warehouseName;
+
+    /**
+     * bom品号
+     */
+    @ExcelProperty("品号")
+    private String bomSpecCode;
+
+    /**
+     * 数量
+     */
+    @ExcelProperty("业务数量")
+    private BigDecimal quantity;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty("备注")
+    private String remark;
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchasePendingStorageBomDto.java

@@ -4,6 +4,8 @@ import com.sd.business.entity.purchase.po.PurchasePendingStorageBom;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.Date;
+
 /**
  * 采购待入库bom新增编辑入参实体
  *
@@ -13,4 +15,19 @@ import lombok.Setter;
 @Getter
 @Setter
 public class PurchasePendingStorageBomDto extends PurchasePendingStorageBom {
+
+    /**
+     * 到货单号
+     */
+    private String arrivalCode;
+
+    /**
+     * 到货日期
+     */
+    private Date arrivalDate;
+
+    /**
+     * 备注
+     */
+    private String remark;
 }

+ 1 - 6
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchasePendingStorageDto.java

@@ -21,14 +21,9 @@ import java.util.List;
 public class PurchasePendingStorageDto extends PurchasePendingStorage {
 
     /**
-     * 到货日期
-     */
-    private Date arrivalDate;
-
-    /**
      * 采购待入库详情数据
      */
     @Valid
     @NotEmpty(message = "采购待入库详情数据不能为空")
-    private List<PurchasePendingStorageBom> purchasePendingStorageBomList;
+    private List<PurchasePendingStorageBomDto> purchasePendingStorageBomList;
 }

+ 16 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/vo/PurchasePendingStorageBomVo.java

@@ -5,6 +5,7 @@ import lombok.Getter;
 import lombok.Setter;
 
 import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * 采购待入库bom列表查询返回值实体
@@ -17,6 +18,16 @@ import java.math.BigDecimal;
 public class PurchasePendingStorageBomVo extends PurchasePendingStorageBom {
 
     /**
+     * 到货单号
+     */
+    private String arrivalCode;
+
+    /**
+     * 到货日期
+     */
+    private Date arrivalDate;
+
+    /**
      * 采购合同编号
      */
     private String purchaseCode;
@@ -50,4 +61,9 @@ public class PurchasePendingStorageBomVo extends PurchasePendingStorageBom {
      * bom规格高
      */
     private BigDecimal bomSpecHeight;
+
+    /**
+     * 备注
+     */
+    private String remark;
 }

+ 0 - 5
sd-business/src/main/java/com/sd/business/entity/purchase/vo/PurchasePendingStorageVo.java

@@ -18,11 +18,6 @@ import java.util.List;
 public class PurchasePendingStorageVo extends PurchasePendingStorage {
 
     /**
-     * 到货日期
-     */
-    private Date arrivalDate;
-
-    /**
      * 采购合同编号
      */
     private String purchaseCode;

+ 10 - 1
sd-business/src/main/java/com/sd/business/service/purchase/PurchasePendingStorageService.java

@@ -3,9 +3,11 @@ 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.purchase.dto.PurchaseArrivalImportDataDto;
+import com.sd.business.entity.purchase.dto.PurchaseGiftImportDataDto;
 import com.sd.business.entity.purchase.dto.PurchasePendingStorageDto;
 import com.sd.business.entity.purchase.dto.PurchasePendingStorageSelectDto;
 import com.sd.business.entity.purchase.po.PurchasePendingStorage;
+import com.sd.business.entity.purchase.vo.PurchasePendingStorageBomVo;
 import com.sd.business.entity.purchase.vo.PurchasePendingStorageVo;
 
 import java.util.List;
@@ -50,5 +52,12 @@ public interface PurchasePendingStorageService extends BaseService<PurchasePendi
      * @param list
      * @return
      */
-    PurchasePendingStorageVo purchaseArrivalImport(List<PurchaseArrivalImportDataDto> list);
+    List<PurchasePendingStorageBomVo> purchaseArrivalImport(List<PurchaseArrivalImportDataDto> list);
+
+    /**
+     * 导入采购赠品入库
+     * @param list
+     * @return
+     */
+    List<PurchasePendingStorageBomVo> purchaseGiftImport(List<PurchaseGiftImportDataDto> list);
 }

+ 124 - 70
sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchasePendingStorageServiceImpl.java

@@ -5,13 +5,13 @@ import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 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.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
-import com.sd.business.entity.apply.po.ApplyBuyBom;
 import com.sd.business.entity.bom.bo.BomSpecBo;
 import com.sd.business.entity.bom.po.BomSpec;
 import com.sd.business.entity.department.constant.DepartmentConstant;
@@ -19,9 +19,7 @@ import com.sd.business.entity.in.dto.InOutStorageDto;
 import com.sd.business.entity.in.emums.InDetailTypeEnum;
 import com.sd.business.entity.in.emums.InOutTypeEnum;
 import com.sd.business.entity.in.po.InOutStorageBom;
-import com.sd.business.entity.purchase.dto.PurchaseArrivalImportDataDto;
-import com.sd.business.entity.purchase.dto.PurchasePendingStorageDto;
-import com.sd.business.entity.purchase.dto.PurchasePendingStorageSelectDto;
+import com.sd.business.entity.purchase.dto.*;
 import com.sd.business.entity.purchase.po.Purchase;
 import com.sd.business.entity.purchase.po.PurchaseBom;
 import com.sd.business.entity.purchase.po.PurchasePendingStorage;
@@ -100,69 +98,89 @@ public class PurchasePendingStorageServiceImpl extends ServiceImpl<PurchasePendi
     @DSTransactional
     @Override
     public void add(PurchasePendingStorageDto dto) {
-        List<PurchasePendingStorageBom> purchasePendingStorageBomList = dto.getPurchasePendingStorageBomList();
+        List<PurchasePendingStorageBomDto> list = dto.getPurchasePendingStorageBomList();
 
-        BigDecimal arrivalQuantityTotal = purchasePendingStorageBomList.stream()
-                .map(PurchasePendingStorageBom::getArrivalQuantity)
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
-        // 保存采购待入库
-        dto.setCode(CodeEnum.PURCHASE_STORAGE_CODE.getCode());
-        dto.setArrivalQuantity(arrivalQuantityTotal);
-        this.save(dto);
+        Map<String, List<PurchasePendingStorageBomDto>> purchaseStorageMap = list.stream()
+                .collect(Collectors.groupingBy(PurchasePendingStorageBomDto::getArrivalCode));
 
-        List<Long> bomSpecIds = purchasePendingStorageBomList.stream().map(PurchasePendingStorageBom::getBomSpecId).collect(Collectors.toList());
+        List<Long> bomSpecIds = list.stream().map(PurchasePendingStorageBomDto::getBomSpecId).collect(Collectors.toList());
         Map<Long, BomSpecBo> bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(bomSpecIds);
-        purchasePendingStorageBomList.forEach(item -> {
-            BomSpecBo bomSpecBo = bomSpecBoMap.get(item.getBomSpecId());
-            if (bomSpecBo == null) {
-                throw new ServiceException("未知bom规格id:" + item.getBomSpecId());
-            }
-            // 判断入库仓库id
-            Long warehouseId;
-            if (ObjectUtil.equals(bomSpecBo.getClassifyParentId(), 1L)) {
-                warehouseId = WarehouseConstant.SEMI_FINISHED_PRODUCT;
-            } else {
-                warehouseId = WarehouseConstant.PACKAGING_MATERIAL;
-            }
-            item.setPurchasePendingStorageId(dto.getId());
-            item.setWarehouseId(warehouseId);
-        });
 
-        // 根据采购合同分组
-        Map<Long, List<PurchasePendingStorageBom>> map = purchasePendingStorageBomList.stream().collect(Collectors.groupingBy(PurchasePendingStorageBom::getPurchaseId));
-        for (Long purchaseIds : map.keySet()) {
-            List<PurchasePendingStorageBom> purchaseStorageBomList = map.get(purchaseIds);
-            // 获取入库仓库id
-            Set<Long> warehouseIds = purchaseStorageBomList.stream().map(PurchasePendingStorageBom::getWarehouseId).collect(Collectors.toSet());
-            if (warehouseIds.size() != 1) {
-                throw new ServiceException("当前采购bom入仓不一致!");
-            }
-            Long warehouseId = warehouseIds.iterator().next();
+        List<PurchasePendingStorage> purchasePendingStorageList = new ArrayList<>();
+        List<PurchasePendingStorageBom> bomList = new ArrayList<>();
+        for (Map.Entry<String, List<PurchasePendingStorageBomDto>> entry : purchaseStorageMap.entrySet()) {
+            List<PurchasePendingStorageBomDto> purchasePendingStorageBomList = entry.getValue();
+            BigDecimal arrivalQuantityTotal = purchasePendingStorageBomList.stream()
+                    .map(PurchasePendingStorageBom::getArrivalQuantity)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            // 保存采购待入库
+            PurchasePendingStorage purchasePendingStorage = new PurchasePendingStorage();
+            purchasePendingStorage.setId(IdWorker.getId());
+            purchasePendingStorage.setCode(CodeEnum.PURCHASE_STORAGE_CODE.getCode());
+            purchasePendingStorage.setArrivalQuantity(arrivalQuantityTotal);
+            purchasePendingStorage.setArrivalCode(entry.getKey());
+            purchasePendingStorageList.add(purchasePendingStorage);
+
+            // 保存采购待入库明细
+            purchasePendingStorageBomList.forEach(item -> {
+                item.setPurchasePendingStorageId(purchasePendingStorage.getId());
+                BomSpecBo bomSpecBo = bomSpecBoMap.get(item.getBomSpecId());
+                if (bomSpecBo == null) {
+                    throw new ServiceException("未知bom规格id:" + item.getBomSpecId());
+                }
+                // 判断入库仓库id
+                Long warehouseId;
+                if (ObjectUtil.equals(bomSpecBo.getClassifyParentId(), 1L)) {
+                    warehouseId = WarehouseConstant.SEMI_FINISHED_PRODUCT;
+                } else {
+                    warehouseId = WarehouseConstant.PACKAGING_MATERIAL;
+                }
+                item.setWarehouseId(warehouseId);
+            });
+            bomList.addAll(purchasePendingStorageBomList);
+            // 根据采购合同分组
+            Map<Long, List<PurchasePendingStorageBomDto>> map = purchasePendingStorageBomList.stream().collect(Collectors.groupingBy(PurchasePendingStorageBom::getPurchaseId));
+            for (Long purchaseIds : map.keySet()) {
+                List<PurchasePendingStorageBomDto> purchaseStorageBomList = map.get(purchaseIds);
+                // 获取入库仓库id
+                Set<Long> warehouseIds = purchaseStorageBomList.stream().map(PurchasePendingStorageBom::getWarehouseId).collect(Collectors.toSet());
+                if (warehouseIds.size() != 1) {
+                    throw new ServiceException("当前入库bom入仓不一致!");
+                }
+                Long warehouseId = purchaseStorageBomList.get(0).getWarehouseId();
 
-            // 入库
-            List<InOutStorageBom> inOutStorageBomList = purchaseStorageBomList.stream()
-                    .map(item -> {
-                        InOutStorageBom inOutStorageBom = new InOutStorageBom();
-                        inOutStorageBom.setBomSpecId(item.getBomSpecId());
-                        inOutStorageBom.setQuantity(item.getArrivalQuantity());
-                        return inOutStorageBom;
-                    })
-                    .filter(item -> Objects.nonNull(item.getQuantity()))
-                    .collect(Collectors.toList());
-            InOutStorageDto inOutStorageDto = new InOutStorageDto();
-            inOutStorageDto.setType(InOutTypeEnum.IN.getKey());
-            inOutStorageDto.setPurchaseId(purchaseIds);
-            inOutStorageDto.setDetailType(InDetailTypeEnum.PURCHASE.getKey());
-            inOutStorageDto.setWarehouseId(warehouseId);
-            inOutStorageDto.setDepartmentId(DepartmentConstant.SD_SPORTS);
-            inOutStorageDto.setApplicant(SecurityUtils.getLoginUser().getUser().getNickName());
-            inOutStorageDto.setInOutStorageTime(dto.getArrivalDate());
-            inOutStorageDto.setInOutStorageBomList(inOutStorageBomList);
-            inOutStorageService.add(inOutStorageDto);
+                // 入库
+                List<InOutStorageBom> inOutStorageBomList = purchaseStorageBomList.stream()
+                        .map(item -> {
+                            InOutStorageBom inOutStorageBom = new InOutStorageBom();
+                            inOutStorageBom.setBomSpecId(item.getBomSpecId());
+                            inOutStorageBom.setQuantity(item.getArrivalQuantity());
+                            return inOutStorageBom;
+                        })
+                        .filter(item -> Objects.nonNull(item.getQuantity()))
+                        .collect(Collectors.toList());
+                InOutStorageDto inOutStorageDto = new InOutStorageDto();
+                inOutStorageDto.setType(InOutTypeEnum.IN.getKey());
+                inOutStorageDto.setPurchaseId(purchaseIds);
+                if (Objects.equals(purchaseIds, -1L)) {
+                    inOutStorageDto.setDetailType(InDetailTypeEnum.GIFT.getKey());
+                } else {
+                    inOutStorageDto.setDetailType(InDetailTypeEnum.PURCHASE.getKey());
+                }
+                inOutStorageDto.setWarehouseId(warehouseId);
+                inOutStorageDto.setDepartmentId(DepartmentConstant.SD_SPORTS);
+                inOutStorageDto.setApplicant(SecurityUtils.getLoginUser().getUser().getNickName());
+                inOutStorageDto.setRemark(purchaseStorageBomList.get(0).getRemark());
+                inOutStorageDto.setInOutStorageTime(purchaseStorageBomList.get(0).getArrivalDate());
+                inOutStorageDto.setInOutStorageBomList(inOutStorageBomList);
+                inOutStorageService.add(inOutStorageDto);
+            }
         }
 
+        // 保存采购待入库
+        this.saveBatch(purchasePendingStorageList);
         // 保存采购待入库明细
-        purchasePendingStorageBomService.saveBatch(purchasePendingStorageBomList);
+        purchasePendingStorageBomService.saveBatch(bomList);
     }
 
     @DSTransactional
@@ -173,10 +191,9 @@ public class PurchasePendingStorageServiceImpl extends ServiceImpl<PurchasePendi
     }
 
     @Override
-    public PurchasePendingStorageVo purchaseArrivalImport(List<PurchaseArrivalImportDataDto> list) {
-        validatedImportData(list);
+    public List<PurchasePendingStorageBomVo> purchaseArrivalImport(List<PurchaseArrivalImportDataDto> list) {
+        this.validatedArrivalImportData(list);
 
-        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).or().in(Purchase::getErpCode, purchaseCodes));
@@ -239,20 +256,57 @@ public class PurchasePendingStorageServiceImpl extends ServiceImpl<PurchasePendi
             bomVo.setBomSpecLength(bomSpec.getLength());
             bomVo.setBomSpecWidth(bomSpec.getWidth());
             bomVo.setBomSpecHeight(bomSpec.getHeight());
+            bomVo.setArrivalCode(dto.getArrivalCode());
+            bomVo.setArrivalDate(dto.getArrivalDate());
             purchasePendingStorageBomList.add(bomVo);
+        }
+        return purchasePendingStorageBomList;
+    }
 
-            if (purchasePendingStorageVo.getArrivalCode() == null) {
-                purchasePendingStorageVo.setArrivalCode(dto.getArrivalCode());
-            }
-            if (purchasePendingStorageVo.getArrivalDate() == null) {
-                purchasePendingStorageVo.setArrivalDate(dto.getArrivalDate());
+    @Override
+    public List<PurchasePendingStorageBomVo> purchaseGiftImport(List<PurchaseGiftImportDataDto> list) {
+        this.validatedGiftImportData(list);
+        // bom数据
+        List<String> bomSpecCodes = list.stream().map(PurchaseGiftImportDataDto::getBomSpecCode).collect(Collectors.toList());
+        Map<String, BomSpec> bomSpecMap = bomSpecService.mapKEntity(BomSpec::getCode, q -> q.in(BomSpec::getCode, bomSpecCodes));
+        List<PurchasePendingStorageBomVo> purchasePendingStorageBomList = new ArrayList<>();
+        for (PurchaseGiftImportDataDto dto : list) {
+            BomSpec bomSpec = bomSpecMap.get(dto.getBomSpecCode());
+            if (bomSpec == null) {
+                throw new ServiceException("未知bom品号:" + dto.getBomSpecCode());
             }
+
+            // 赋值明细
+            PurchasePendingStorageBomVo bomVo = new PurchasePendingStorageBomVo();
+            bomVo.setPurchaseId(-1L);
+            bomVo.setBomSpecId(bomSpec.getId());
+            bomVo.setArrivalQuantity(dto.getQuantity());
+            bomVo.setWarehouseName(dto.getWarehouseName());
+            bomVo.setBomSpecCode(bomSpec.getCode());
+            bomVo.setBomSpecName(bomSpec.getName());
+            bomVo.setBomSpecLength(bomSpec.getLength());
+            bomVo.setBomSpecWidth(bomSpec.getWidth());
+            bomVo.setBomSpecHeight(bomSpec.getHeight());
+            bomVo.setArrivalCode(dto.getCode());
+            bomVo.setArrivalDate(dto.getArrivalDate());
+            bomVo.setRemark(dto.getRemark());
+            purchasePendingStorageBomList.add(bomVo);
+        }
+        return purchasePendingStorageBomList;
+    }
+
+    private void validatedGiftImportData(List<PurchaseGiftImportDataDto> list) {
+        Assert.notEmpty(list, "入库明细不能为空");
+        for (PurchaseGiftImportDataDto dto : list) {
+            Assert.notBlank(dto.getCode(), "单号不能为空");
+            Assert.notBlank(dto.getBomSpecCode(), "bom品号不能为空");
+            Assert.notBlank(dto.getWarehouseName(), "仓库名称不能为空");
+            Assert.notNull(dto.getArrivalDate(), "交易日期不能为空");
+            Assert.gtZero(dto.getQuantity(), "业务数量必须大于0");
         }
-        purchasePendingStorageVo.setPurchasePendingStorageBomList(purchasePendingStorageBomList);
-        return purchasePendingStorageVo;
     }
 
-    private void validatedImportData(List<PurchaseArrivalImportDataDto> list) {
+    private void validatedArrivalImportData(List<PurchaseArrivalImportDataDto> list) {
         Assert.notEmpty(list, "到货明细不能为空");
         for (PurchaseArrivalImportDataDto dto : list) {
             if (StrUtil.isBlank(dto.getPurchaseCode())) {