Jelajahi Sumber

新增采购待入库功能

fgd 1 tahun lalu
induk
melakukan
afcb6cff7c
24 mengubah file dengan 884 tambahan dan 4 penghapusan
  1. 2 1
      sd-business/src/main/java/com/sd/business/controller/purchase/PurchaseController.java
  2. 77 0
      sd-business/src/main/java/com/sd/business/controller/purchase/PurchasePendingStorageController.java
  3. 36 0
      sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseArrivalImportDataDto.java
  4. 16 0
      sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchasePendingStorageBomDto.java
  5. 28 0
      sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchasePendingStorageDto.java
  6. 28 0
      sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchasePendingStorageSelectDto.java
  7. 36 0
      sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseSelectListDto.java
  8. 43 0
      sd-business/src/main/java/com/sd/business/entity/purchase/po/PurchasePendingStorage.java
  9. 53 0
      sd-business/src/main/java/com/sd/business/entity/purchase/po/PurchasePendingStorageBom.java
  10. 53 0
      sd-business/src/main/java/com/sd/business/entity/purchase/vo/PurchasePendingStorageBomVo.java
  11. 33 0
      sd-business/src/main/java/com/sd/business/entity/purchase/vo/PurchasePendingStorageVo.java
  12. 5 0
      sd-business/src/main/java/com/sd/business/entity/purchase/vo/PurchaseReturnBomVo.java
  13. 26 0
      sd-business/src/main/java/com/sd/business/mapper/purchase/PurchasePendingStorageBomMapper.java
  14. 20 0
      sd-business/src/main/java/com/sd/business/mapper/purchase/PurchasePendingStorageMapper.java
  15. 24 0
      sd-business/src/main/java/com/sd/business/service/purchase/PurchasePendingStorageBomService.java
  16. 54 0
      sd-business/src/main/java/com/sd/business/service/purchase/PurchasePendingStorageService.java
  17. 2 1
      sd-business/src/main/java/com/sd/business/service/purchase/PurchaseService.java
  18. 29 0
      sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchasePendingStorageBomServiceImpl.java
  19. 257 0
      sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchasePendingStorageServiceImpl.java
  20. 1 0
      sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseReturnServiceImpl.java
  21. 6 1
      sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseServiceImpl.java
  22. 4 1
      sd-business/src/main/java/com/sd/business/util/CodeEnum.java
  23. 30 0
      sd-business/src/main/resources/mapper/purchase/PurchasePendingStorageBomMapper.xml
  24. 21 0
      sd-business/src/main/resources/mapper/purchase/PurchasePendingStorageMapper.xml

+ 2 - 1
sd-business/src/main/java/com/sd/business/controller/purchase/PurchaseController.java

@@ -5,6 +5,7 @@ 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.vo.PurchaseVo;
 import com.sd.business.service.purchase.PurchaseService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -93,7 +94,7 @@ public class PurchaseController {
      * 采购合同下拉框列表
      */
     @PostMapping("/getPurchaseSelectList")
-    public Page<PurchaseVo> getPurchaseSelectList(@RequestBody PurchaseSelectDto dto) {
+    public Page<PurchaseVo> getPurchaseSelectList(@RequestBody PurchaseSelectListDto dto) {
         return purchaseService.getPurchaseSelectList(dto);
     }
 }

+ 77 - 0
sd-business/src/main/java/com/sd/business/controller/purchase/PurchasePendingStorageController.java

@@ -0,0 +1,77 @@
+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.PurchasePendingStorageDto;
+import com.sd.business.entity.purchase.dto.PurchasePendingStorageSelectDto;
+import com.sd.business.entity.purchase.vo.PurchasePendingStorageVo;
+import com.sd.business.service.purchase.PurchasePendingStorageService;
+import com.sd.framework.util.excel.util.ExcelUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+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;
+
+/**
+ * <p>
+ * 采购待入库 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2023-10-12
+ */
+@RestController
+@RequestMapping("/purchasePendingStorage")
+public class PurchasePendingStorageController {
+
+    @Autowired
+    private PurchasePendingStorageService purchasePendingStorageService;
+
+    /**
+     * 采购待入库分页
+     */
+    @PostMapping("/page")
+    public Page<PurchasePendingStorageVo> page(@RequestBody PurchasePendingStorageSelectDto dto) {
+        return purchasePendingStorageService.getPage(dto);
+    }
+
+    /**
+     * 采购待入库明细
+     */
+    @PostMapping("/detail")
+    public PurchasePendingStorageVo detail(@RequestBody BaseSelectDto dto) {
+        return purchasePendingStorageService.detail(dto.getId());
+    }
+
+    /**
+     * 采购待入库新增
+     */
+    @PostMapping("/add")
+    public void add(@Validated @RequestBody PurchasePendingStorageDto dto) {
+        purchasePendingStorageService.add(dto);
+    }
+
+    /**
+     * 采购待入库删除
+     */
+    @PostMapping("/delete")
+    public void delete(@RequestBody BaseSelectDto dto) {
+        purchasePendingStorageService.delete(dto.getId());
+    }
+
+    /**
+     * 导入采购到货单
+     */
+    @PostMapping("/purchaseArrivalImport")
+    public PurchasePendingStorageVo purchaseArrivalImport(MultipartFile file) {
+        List<PurchaseArrivalImportDataDto> list = ExcelUtil.read(file, 1, PurchaseArrivalImportDataDto.class);
+        return purchasePendingStorageService.purchaseArrivalImport(list);
+    }
+
+}

+ 36 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseArrivalImportDataDto.java

@@ -0,0 +1,36 @@
+package com.sd.business.entity.purchase.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+@Getter
+@Setter
+public class PurchaseArrivalImportDataDto {
+
+    /**
+     * 到货单号
+     */
+    @ExcelProperty("PURCHASE_ARRIVAL__DOC_NO")
+    private String arrivalCode;
+
+    /**
+     * 采购合同编号
+     */
+    @ExcelProperty("PURCHASE_ORD_DOC_NO")
+    private String purchaseCode;
+
+    /**
+     * bom规格编码
+     */
+    @ExcelProperty("ITEM_ID_CODE")
+    private String bomSpecCode;
+
+    /**
+     * 到货数量
+     */
+    @ExcelProperty("BUSINESS_QTY")
+    private String arrivalQuantity;
+}

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

@@ -0,0 +1,16 @@
+package com.sd.business.entity.purchase.dto;
+
+import com.sd.business.entity.purchase.po.PurchasePendingStorageBom;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 采购待入库bom新增编辑入参实体
+ *
+ * @author
+ * @since 2023-10-12
+ */
+@Getter
+@Setter
+public class PurchasePendingStorageBomDto extends PurchasePendingStorageBom {
+}

+ 28 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchasePendingStorageDto.java

@@ -0,0 +1,28 @@
+package com.sd.business.entity.purchase.dto;
+
+import com.sd.business.entity.purchase.po.PurchasePendingStorage;
+import com.sd.business.entity.purchase.po.PurchasePendingStorageBom;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 采购待入库新增编辑入参实体
+ *
+ * @author
+ * @since 2023-10-12
+ */
+@Getter
+@Setter
+public class PurchasePendingStorageDto extends PurchasePendingStorage {
+
+    /**
+     * 采购待入库详情数据
+     */
+    @Valid
+    @NotEmpty(message = "采购待入库详情数据不能为空")
+    private List<PurchasePendingStorageBom> purchasePendingStorageBomList;
+}

+ 28 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchasePendingStorageSelectDto.java

@@ -0,0 +1,28 @@
+package com.sd.business.entity.purchase.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 采购待入库 列表查询入参实体
+ */
+@Getter
+@Setter
+public class PurchasePendingStorageSelectDto extends BaseSelectDto {
+
+    /**
+     * 采购入库编号
+     */
+    private String code;
+
+    /**
+     * 到货单号
+     */
+    private String arrivalCode;
+
+    /**
+     * 采购合同编号
+     */
+    private String purchaseCode;
+}

+ 36 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseSelectListDto.java

@@ -0,0 +1,36 @@
+package com.sd.business.entity.purchase.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 采购合同下拉框列表查询入参实体
+ *
+ * @author
+ * @since 2023-10-13
+ */
+@Getter
+@Setter
+public class PurchaseSelectListDto extends BaseSelectDto {
+
+    /**
+     * 采购合同编号
+     */
+    private String code;
+
+    /**
+     * 流程状态 0未发起 1进行中 2已通过 3已驳回 4已作废
+     */
+    private Integer flowStatus;
+
+    /**
+     * 供应商名称
+     */
+    private String supplierName;
+
+    /**
+     * 查询类型 1-采购入库查询
+     */
+    private Integer queryType;
+}

+ 43 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/po/PurchasePendingStorage.java

@@ -0,0 +1,43 @@
+package com.sd.business.entity.purchase.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 采购待入库
+ * </p>
+ *
+ * @author
+ * @since 2023-10-12
+ */
+@Getter
+@Setter
+@TableName("purchase_pending_storage")
+public class PurchasePendingStorage extends BasePo {
+
+    /**
+     * 采购合同id
+     */
+    private Long purchaseId;
+
+    /**
+     * 采购入库编号
+     */
+    private String code;
+
+    /**
+     * 到货单号
+     */
+    private String arrivalCode;
+
+    /**
+     * 到货数量
+     */
+    private BigDecimal arrivalQuantity;
+}

+ 53 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/po/PurchasePendingStorageBom.java

@@ -0,0 +1,53 @@
+package com.sd.business.entity.purchase.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.DecimalMin;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ * 采购待入库 bom
+ * </p>
+ *
+ * @author
+ * @since 2023-10-12
+ */
+@Getter
+@Setter
+@TableName("purchase_pending_storage_bom")
+public class PurchasePendingStorageBom extends BasePo {
+
+    /**
+     * 采购待入库id
+     */
+    private Long purchasePendingStorageId;
+
+    /**
+     * 采购合同id
+     */
+    @NotNull(message = "采购合同id不能为空")
+    private Long purchaseId;
+
+    /**
+     * 仓库id
+     */
+    private Long warehouseId;
+
+    /**
+     * bom规格id
+     */
+    @NotNull(message = "bom规格id不能为空")
+    private Long bomSpecId;
+
+    /**
+     * 到货数量
+     */
+    @NotNull(message = "到货数量不能为空")
+    @DecimalMin(value = "0.01", message = "到货数量必须大于0")
+    private BigDecimal arrivalQuantity;
+}

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

@@ -0,0 +1,53 @@
+package com.sd.business.entity.purchase.vo;
+
+import com.sd.business.entity.purchase.po.PurchasePendingStorageBom;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 采购待入库bom列表查询返回值实体
+ *
+ * @author
+ * @since 2023-10-12
+ */
+@Getter
+@Setter
+public class PurchasePendingStorageBomVo extends PurchasePendingStorageBom {
+
+    /**
+     * 采购合同编号
+     */
+    private String purchaseCode;
+
+    /**
+     * 仓库
+     */
+    private String warehouseName;
+
+    /**
+     * bom规格编码
+     */
+    private String bomSpecCode;
+
+    /**
+     * bom规格名称
+     */
+    private String bomSpecName;
+
+    /**
+     * bom规格长
+     */
+    private BigDecimal bomSpecLength;
+
+    /**
+     * bom规格宽
+     */
+    private BigDecimal bomSpecWidth;
+
+    /**
+     * bom规格高
+     */
+    private BigDecimal bomSpecHeight;
+}

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

@@ -0,0 +1,33 @@
+package com.sd.business.entity.purchase.vo;
+
+import com.sd.business.entity.purchase.po.PurchasePendingStorage;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 采购待入库列表查询返回值实体
+ *
+ * @author
+ * @since 2023-10-12
+ */
+@Getter
+@Setter
+public class PurchasePendingStorageVo extends PurchasePendingStorage {
+
+    /**
+     * 采购合同编号
+     */
+    private String purchaseCode;
+
+    /**
+     * 供应商名称
+     */
+    private String supplierName;
+
+    /**
+     * 采购待入库详情数据
+     */
+    private List<PurchasePendingStorageBomVo> purchasePendingStorageBomList;
+}

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

@@ -50,4 +50,9 @@ public class PurchaseReturnBomVo extends PurchaseReturnBom {
      * 已退货数量
      */
     private BigDecimal finishReturnQuantity;
+
+    /**
+     * 可入库数量
+     */
+    private BigDecimal canInStorageQuantity;
 }

+ 26 - 0
sd-business/src/main/java/com/sd/business/mapper/purchase/PurchasePendingStorageBomMapper.java

@@ -0,0 +1,26 @@
+package com.sd.business.mapper.purchase;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.purchase.po.PurchasePendingStorageBom;
+import com.sd.business.entity.purchase.vo.PurchasePendingStorageBomVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 采购待入库bom Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2023-10-12
+ */
+public interface PurchasePendingStorageBomMapper extends BaseMapper<PurchasePendingStorageBom> {
+
+    /**
+     * 获取采购待入库bom明细
+     * @return
+     */
+    List<PurchasePendingStorageBomVo> getList(@Param("ew") IWrapper<PurchasePendingStorageBom> wrapper);
+}

+ 20 - 0
sd-business/src/main/java/com/sd/business/mapper/purchase/PurchasePendingStorageMapper.java

@@ -0,0 +1,20 @@
+package com.sd.business.mapper.purchase;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.purchase.po.PurchasePendingStorage;
+import com.sd.business.entity.purchase.vo.PurchasePendingStorageVo;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 采购待入库 Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2023-10-12
+ */
+public interface PurchasePendingStorageMapper extends BaseMapper<PurchasePendingStorage> {
+    Page<PurchasePendingStorageVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<PurchasePendingStorage> wrapper);
+}

+ 24 - 0
sd-business/src/main/java/com/sd/business/service/purchase/PurchasePendingStorageBomService.java

@@ -0,0 +1,24 @@
+package com.sd.business.service.purchase;
+
+import com.ruoyi.common.core.service.BaseService;
+import com.sd.business.entity.purchase.po.PurchasePendingStorageBom;
+import com.sd.business.entity.purchase.vo.PurchasePendingStorageBomVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 采购待入库bom 服务类
+ * </p>
+ *
+ * @author
+ * @since 2023-10-12
+ */
+public interface PurchasePendingStorageBomService extends BaseService<PurchasePendingStorageBom> {
+    /**
+     * 获取采购待入库bom明细
+     * @param id
+     * @return
+     */
+    List<PurchasePendingStorageBomVo> getListByPurchasePendingStorageId(Long id);
+}

+ 54 - 0
sd-business/src/main/java/com/sd/business/service/purchase/PurchasePendingStorageService.java

@@ -0,0 +1,54 @@
+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.PurchasePendingStorageDto;
+import com.sd.business.entity.purchase.dto.PurchasePendingStorageSelectDto;
+import com.sd.business.entity.purchase.po.PurchasePendingStorage;
+import com.sd.business.entity.purchase.vo.PurchasePendingStorageVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 采购待入库 服务类
+ * </p>
+ *
+ * @author
+ * @since 2023-10-12
+ */
+public interface PurchasePendingStorageService extends BaseService<PurchasePendingStorage> {
+    /**
+     * 采购待入库分页
+     * @param dto
+     * @return
+     */
+    Page<PurchasePendingStorageVo> getPage(PurchasePendingStorageSelectDto dto);
+
+    /**
+     * 采购待入库明细
+     * @param id
+     * @return
+     */
+    PurchasePendingStorageVo detail(Long id);
+
+    /**
+     * 采购待入库新增
+     * @param dto
+     */
+    void add(PurchasePendingStorageDto dto);
+
+    /**
+     * 采购待入库删除
+     * @param id
+     */
+    void delete(Long id);
+
+    /**
+     * 采购到货单导入
+     * @param list
+     * @return
+     */
+    PurchasePendingStorageVo purchaseArrivalImport(List<PurchaseArrivalImportDataDto> list);
+}

+ 2 - 1
sd-business/src/main/java/com/sd/business/service/purchase/PurchaseService.java

@@ -5,6 +5,7 @@ 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.po.Purchase;
 import com.sd.business.entity.purchase.vo.PurchaseVo;
 
@@ -69,5 +70,5 @@ public interface PurchaseService extends BaseService<Purchase> {
      * 获取采购合同下拉框列表
      * @return
      */
-    Page<PurchaseVo> getPurchaseSelectList(PurchaseSelectDto dto);
+    Page<PurchaseVo> getPurchaseSelectList(PurchaseSelectListDto dto);
 }

+ 29 - 0
sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchasePendingStorageBomServiceImpl.java

@@ -0,0 +1,29 @@
+package com.sd.business.service.purchase.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.purchase.po.PurchasePendingStorageBom;
+import com.sd.business.entity.purchase.vo.PurchasePendingStorageBomVo;
+import com.sd.business.mapper.purchase.PurchasePendingStorageBomMapper;
+import com.sd.business.service.purchase.PurchasePendingStorageBomService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 采购待入库bom 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2023-10-12
+ */
+@Service
+public class PurchasePendingStorageBomServiceImpl extends ServiceImpl<PurchasePendingStorageBomMapper, PurchasePendingStorageBom> implements PurchasePendingStorageBomService {
+    @Override
+    public List<PurchasePendingStorageBomVo> getListByPurchasePendingStorageId(Long id) {
+        IWrapper<PurchasePendingStorageBom> wrapper = getWrapper();
+        wrapper.eq("ppsb", PurchasePendingStorageBom::getPurchasePendingStorageId, id);
+        return this.baseMapper.getList(wrapper);
+    }
+}

+ 257 - 0
sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchasePendingStorageServiceImpl.java

@@ -0,0 +1,257 @@
+package com.sd.business.service.purchase.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+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;
+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.po.Purchase;
+import com.sd.business.entity.purchase.po.PurchaseBom;
+import com.sd.business.entity.purchase.po.PurchasePendingStorage;
+import com.sd.business.entity.purchase.po.PurchasePendingStorageBom;
+import com.sd.business.entity.purchase.vo.PurchasePendingStorageBomVo;
+import com.sd.business.entity.purchase.vo.PurchasePendingStorageVo;
+import com.sd.business.entity.warehouse.constant.WarehouseConstant;
+import com.sd.business.mapper.purchase.PurchasePendingStorageMapper;
+import com.sd.business.service.bom.BomSpecService;
+import com.sd.business.service.in.InOutStorageService;
+import com.sd.business.service.purchase.PurchaseBomService;
+import com.sd.business.service.purchase.PurchasePendingStorageBomService;
+import com.sd.business.service.purchase.PurchasePendingStorageService;
+import com.sd.business.service.purchase.PurchaseService;
+import com.sd.business.service.sku.SkuSpecService;
+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.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 采购待入库 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2023-10-12
+ */
+@Service
+public class PurchasePendingStorageServiceImpl extends ServiceImpl<PurchasePendingStorageMapper, PurchasePendingStorage> implements PurchasePendingStorageService {
+    @Autowired
+    private PurchasePendingStorageBomService purchasePendingStorageBomService;
+
+    @Autowired
+    private InOutStorageService inOutStorageService;
+
+    @Autowired
+    private SkuSpecService skuSpecService;
+
+    @Autowired
+    private PurchaseService purchaseService;
+
+    @Autowired
+    private PurchaseBomService purchaseBomService;
+
+    @Autowired
+    private BomSpecService bomSpecService;
+
+    @Override
+    public Page<PurchasePendingStorageVo> getPage(PurchasePendingStorageSelectDto dto) {
+        IWrapper<PurchasePendingStorage> wrapper = getWrapper();
+        wrapper.orderByDesc("pps", PurchasePendingStorage::getId);
+        wrapper.like("pps", PurchasePendingStorage::getCode, dto.getCode());
+        wrapper.like("pps", PurchasePendingStorage::getArrivalCode, dto.getArrivalCode());
+        wrapper.like("p", Purchase::getCode, dto.getPurchaseCode());
+        Page<PurchasePendingStorageVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
+        return page;
+    }
+
+    @Override
+    public PurchasePendingStorageVo detail(Long id) {
+        PurchasePendingStorage purchasePendingStorage = this.getById(id);
+        PurchasePendingStorageVo result = BeanUtil.toBean(purchasePendingStorage, PurchasePendingStorageVo.class);
+
+        // 赋值采购待入库明细
+        List<PurchasePendingStorageBomVo> list = purchasePendingStorageBomService.getListByPurchasePendingStorageId(id);
+        result.setPurchasePendingStorageBomList(list);
+        return result;
+    }
+
+    @DSTransactional
+    @Override
+    public void add(PurchasePendingStorageDto dto) {
+        List<PurchasePendingStorageBom> purchasePendingStorageBomList = 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);
+
+        List<Long> bomSpecIds = purchasePendingStorageBomList.stream().map(PurchasePendingStorageBom::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<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.setInOutStorageBomList(inOutStorageBomList);
+            inOutStorageService.add(inOutStorageDto);
+        }
+
+        // 保存采购待入库明细
+        purchasePendingStorageBomService.saveBatch(purchasePendingStorageBomList);
+    }
+
+    @DSTransactional
+    @Override
+    public void delete(Long id) {
+        this.removeById(id);
+        purchasePendingStorageBomService.remove(q -> q.eq(PurchasePendingStorageBom::getPurchasePendingStorageId, id));
+    }
+
+    @Override
+    public PurchasePendingStorageVo purchaseArrivalImport(List<PurchaseArrivalImportDataDto> list) {
+        validatedImportData(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));
+        if (purchaseList.isEmpty()) {
+            throw new ServiceException("未知采购合同编号");
+        }
+        Map<String, Purchase> purchaseMap = purchaseList.stream().collect(Collectors.toMap(Purchase::getCode, Function.identity()));
+        List<Long> purchaseIds = purchaseList.stream().map(BaseIdPo::getId).collect(Collectors.toList());
+        // 采购合同bom 数据
+        List<PurchaseBom> purchaseBomAllList = purchaseBomService.list(q -> q.in(PurchaseBom::getPurchaseId, purchaseIds));
+        Map<Long, List<PurchaseBom>> purchaseBomMap = purchaseBomAllList.stream().collect(Collectors.groupingBy(PurchaseBom::getPurchaseId));
+        // bom数据
+        List<Long> bomSpecIds = purchaseBomAllList.stream().map(PurchaseBom::getBomSpecId).collect(Collectors.toList());
+        Map<Long, BomSpecBo> bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(bomSpecIds);
+        List<String> bomSpecCodes = list.stream().map(PurchaseArrivalImportDataDto::getBomSpecCode).collect(Collectors.toList());
+        Map<String, BomSpec> bomSpecMap = bomSpecService.mapKEntity(BomSpec::getCode, q -> q.in(BomSpec::getCode, bomSpecCodes));
+
+        List<PurchasePendingStorageBomVo> purchasePendingStorageBomList = new ArrayList<>();
+        for (PurchaseArrivalImportDataDto dto : list) {
+            Purchase purchase = purchaseMap.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());
+            }
+            List<PurchaseBom> purchaseBomList = purchaseBomMap.get(purchase.getId());
+            PurchaseBom purchaseBom = purchaseBomList.stream().filter(item -> ObjectUtil.equals(bomSpec.getId(), item.getBomSpecId())).findFirst().orElse(null);
+            if (purchaseBom == null) {
+                throw new ServiceException("采购合同" + dto.getPurchaseCode() + "清单中不存在bom品号:" + dto.getPurchaseCode());
+            }
+            // 判断到货数量是否超出采购可入库数量
+            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() + "超出可入库数量");
+            }
+
+            BomSpecBo bomSpecBo = bomSpecBoMap.get(bomSpec.getId());
+
+            // 赋值明细
+            PurchasePendingStorageBomVo bomVo = new PurchasePendingStorageBomVo();
+            bomVo.setPurchaseCode(dto.getPurchaseCode());
+            bomVo.setPurchaseId(purchase.getId());
+            bomVo.setBomSpecId(bomSpec.getId());
+            bomVo.setArrivalQuantity(arrivalQuantity);
+            if (ObjectUtil.equals(bomSpecBo.getClassifyParentId(), 1L)) {
+                bomVo.setWarehouseName("半成品仓");
+            } else {
+                bomVo.setWarehouseName("包材仓");
+            }
+            bomVo.setBomSpecCode(bomSpec.getCode());
+            bomVo.setBomSpecName(bomSpec.getName());
+            bomVo.setBomSpecLength(bomSpec.getLength());
+            bomVo.setBomSpecWidth(bomSpec.getWidth());
+            bomVo.setBomSpecHeight(bomSpec.getHeight());
+            purchasePendingStorageBomList.add(bomVo);
+
+            if (purchasePendingStorageVo.getArrivalCode() == null) {
+                purchasePendingStorageVo.setArrivalCode(dto.getArrivalCode());
+            }
+        }
+        purchasePendingStorageVo.setPurchasePendingStorageBomList(purchasePendingStorageBomList);
+        return purchasePendingStorageVo;
+    }
+
+    private void validatedImportData(List<PurchaseArrivalImportDataDto> list) {
+        // 删除第一行表头字段
+        list.remove(0);
+        for (PurchaseArrivalImportDataDto dto : list) {
+            Assert.notNull(dto.getPurchaseCode(), "采购合同编号不能为空");
+            Assert.notNull(dto.getBomSpecCode(), "bom品号不能为空");
+            Assert.notNull(dto.getArrivalCode(), "到货单号不能为空");
+            Assert.eqTrue(NumberUtil.isInteger(dto.getArrivalQuantity()), "到货数量格式不正确");
+            Assert.gtZero(new BigDecimal(dto.getArrivalQuantity()), "到货数量必须大于0");
+        }
+    }
+}

+ 1 - 0
sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseReturnServiceImpl.java

@@ -246,6 +246,7 @@ public class PurchaseReturnServiceImpl extends ServiceImpl<PurchaseReturnMapper,
             vo.setPurchaseQuantity(item.getPurchaseQuantity());
             vo.setCanReturnQuantity(item.getArrivalQuantity().subtract(item.getReturnQuantity()));
             vo.setFinishReturnQuantity(item.getReturnQuantity());
+            vo.setCanInStorageQuantity(item.getPurchaseQuantity().subtract(item.getArrivalQuantity()).add(item.getReturnQuantity()));
             return vo;
         }).collect(Collectors.toList());
         return purchaseBomList;

+ 6 - 1
sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseServiceImpl.java

@@ -24,6 +24,7 @@ import com.sd.business.entity.in.po.InOutStorageBom;
 import com.sd.business.entity.inventory.po.Inventory;
 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.enums.PurchaseStatusEnum;
 import com.sd.business.entity.purchase.po.Purchase;
 import com.sd.business.entity.purchase.po.PurchaseBom;
@@ -342,11 +343,15 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
     }
 
     @Override
-    public Page<PurchaseVo> getPurchaseSelectList(PurchaseSelectDto dto) {
+    public Page<PurchaseVo> getPurchaseSelectList(PurchaseSelectListDto dto) {
         IWrapper<Purchase> wrapper = getWrapper();
         wrapper.like("p", Purchase::getCode, dto.getCode());
         wrapper.eq("p", Purchase::getFlowStatus, dto.getFlowStatus());
         wrapper.like("s", Supplier::getName, dto.getSupplierName());
+        // 采购入库查询排除胜德塑胶供应商
+        if (ObjectUtil.equals(dto.getQueryType(), 1)) {
+            wrapper.ne("s", Supplier::getName, "福清市胜德塑胶制品有限公司");
+        }
         wrapper.orderByDesc("p", Purchase::getId);
 
         // 查询采购单数据

+ 4 - 1
sd-business/src/main/java/com/sd/business/util/CodeEnum.java

@@ -13,6 +13,7 @@ import com.sd.business.service.inventory.InventoryFinishedOrderDetailService;
 import com.sd.business.service.lend.LendService;
 import com.sd.business.service.order.OrderExchangeService;
 import com.sd.business.service.order.OrderService;
+import com.sd.business.service.purchase.PurchasePendingStorageService;
 import com.sd.business.service.purchase.PurchaseReturnService;
 import com.sd.business.service.purchase.PurchaseService;
 import com.sd.business.service.statement.StatementOfAccountService;
@@ -47,7 +48,9 @@ public enum CodeEnum {
     // 成品仓入库
     FINISHED_IN("POS", "-yyMMdd-", "code", 6, InventoryFinishedOrderDetailService.class),
     // 成品仓出库
-    FINISHED_OUT("PWS", "-yyMMdd-", "code", 6, InventoryFinishedOrderDetailService.class);
+    FINISHED_OUT("PWS", "-yyMMdd-", "code", 6, InventoryFinishedOrderDetailService.class),
+    // 采购入库编号
+    PURCHASE_STORAGE_CODE("CG", "yyMMdd", "code", 4, PurchasePendingStorageService.class);
 
     // 编码前缀
     private final String prefix;

+ 30 - 0
sd-business/src/main/resources/mapper/purchase/PurchasePendingStorageBomMapper.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sd.business.mapper.purchase.PurchasePendingStorageBomMapper">
+
+    <select id="getList" resultType="com.sd.business.entity.purchase.vo.PurchasePendingStorageBomVo">
+        select
+            ppsb.id,
+            ppsb.purchase_pending_storage_id,
+            ppsb.purchase_id,
+            ppsb.warehouse_id,
+            ppsb.bom_spec_id,
+            ppsb.arrival_quantity,
+            ppsb.create_user,
+            ppsb.create_time,
+            ppsb.update_user,
+            ppsb.update_time,
+            p.code purchaseCode,
+            w.name  warehouseName,
+            bs.code bomSpecCode,
+            bs.name bomSpecName,
+            bs.length bomSpecLength,
+            bs.width bomSpecWidth,
+            bs.height bomSpecHeight
+        from purchase_pending_storage_bom ppsb
+            left join purchase p on ppsb.purchase_id = p.id
+            left join bom_spec bs on ppsb.bom_spec_id = bs.id
+            left join warehouse w on ppsb.warehouse_id = w.id
+            ${ew.customSqlSegment}
+    </select>
+</mapper>

+ 21 - 0
sd-business/src/main/resources/mapper/purchase/PurchasePendingStorageMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sd.business.mapper.purchase.PurchasePendingStorageMapper">
+    <select id="getPage" resultType="com.sd.business.entity.purchase.vo.PurchasePendingStorageVo">
+        select
+            pps.id,
+            pps.code,
+            pps.arrival_code,
+            pps.arrival_quantity,
+            pps.create_user,
+            pps.create_time,
+            pps.update_user,
+            pps.update_time,
+            p.code purchaseCode,
+            ifnull(s.name, '福清市胜德塑胶制品有限公司') supplierName
+        from purchase_pending_storage pps
+            left join purchase p on pps.purchase_id = p.id
+            left join supplier s on p.supplier_id = s.id
+        ${ew.customSqlSegment}
+    </select>
+</mapper>