Bladeren bron

新增采购和申购功能

fgd 1 jaar geleden
bovenliggende
commit
20f315388e
40 gewijzigde bestanden met toevoegingen van 1798 en 1 verwijderingen
  1. 68 0
      sd-business/src/main/java/com/sd/business/controller/apply/ApplyBuyBomController.java
  2. 70 0
      sd-business/src/main/java/com/sd/business/controller/apply/ApplyBuyController.java
  3. 10 0
      sd-business/src/main/java/com/sd/business/controller/purchase/PurchaseBomController.java
  4. 23 0
      sd-business/src/main/java/com/sd/business/controller/purchase/PurchaseController.java
  5. 68 0
      sd-business/src/main/java/com/sd/business/controller/supplier/SupplierController.java
  6. 17 0
      sd-business/src/main/java/com/sd/business/entity/apply/dto/ApplyBuyBomDto.java
  7. 17 0
      sd-business/src/main/java/com/sd/business/entity/apply/dto/ApplyBuyBomSelectDto.java
  8. 26 0
      sd-business/src/main/java/com/sd/business/entity/apply/dto/ApplyBuyDto.java
  9. 26 0
      sd-business/src/main/java/com/sd/business/entity/apply/dto/ApplyBuySelectDto.java
  10. 53 0
      sd-business/src/main/java/com/sd/business/entity/apply/po/ApplyBuy.java
  11. 49 0
      sd-business/src/main/java/com/sd/business/entity/apply/po/ApplyBuyBom.java
  12. 48 0
      sd-business/src/main/java/com/sd/business/entity/apply/vo/ApplyBuyBomVo.java
  13. 23 0
      sd-business/src/main/java/com/sd/business/entity/apply/vo/ApplyBuyVo.java
  14. 31 0
      sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseBomDetailsSelectDto.java
  15. 56 0
      sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseBomImportDataDto.java
  16. 74 0
      sd-business/src/main/java/com/sd/business/entity/purchase/vo/PurchaseBomDetailsVo.java
  17. 17 0
      sd-business/src/main/java/com/sd/business/entity/supplier/dto/SupplierDto.java
  18. 17 0
      sd-business/src/main/java/com/sd/business/entity/supplier/dto/SupplierSelectDto.java
  19. 134 0
      sd-business/src/main/java/com/sd/business/entity/supplier/po/Supplier.java
  20. 17 0
      sd-business/src/main/java/com/sd/business/entity/supplier/vo/SupplierVo.java
  21. 142 0
      sd-business/src/main/java/com/sd/business/flow/ApplyBuyFlow.java
  22. 170 0
      sd-business/src/main/java/com/sd/business/flow/PurchaseFlow.java
  23. 16 0
      sd-business/src/main/java/com/sd/business/mapper/apply/ApplyBuyBomMapper.java
  24. 16 0
      sd-business/src/main/java/com/sd/business/mapper/apply/ApplyBuyMapper.java
  25. 16 0
      sd-business/src/main/java/com/sd/business/mapper/supplier/SupplierMapper.java
  26. 46 0
      sd-business/src/main/java/com/sd/business/service/apply/ApplyBuyBomService.java
  27. 45 0
      sd-business/src/main/java/com/sd/business/service/apply/ApplyBuyService.java
  28. 68 0
      sd-business/src/main/java/com/sd/business/service/apply/impl/ApplyBuyBomServiceImpl.java
  29. 92 0
      sd-business/src/main/java/com/sd/business/service/apply/impl/ApplyBuyServiceImpl.java
  30. 8 0
      sd-business/src/main/java/com/sd/business/service/purchase/PurchaseBomService.java
  31. 12 0
      sd-business/src/main/java/com/sd/business/service/purchase/PurchaseService.java
  32. 28 0
      sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseBomServiceImpl.java
  33. 157 1
      sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseServiceImpl.java
  34. 46 0
      sd-business/src/main/java/com/sd/business/service/supplier/SupplierService.java
  35. 68 0
      sd-business/src/main/java/com/sd/business/service/supplier/impl/SupplierServiceImpl.java
  36. 3 0
      sd-business/src/main/java/com/sd/business/util/CodeEnum.java
  37. 5 0
      sd-business/src/main/resources/mapper/apply/ApplyBuyBomMapper.xml
  38. 5 0
      sd-business/src/main/resources/mapper/apply/ApplyBuyMapper.xml
  39. 5 0
      sd-business/src/main/resources/mapper/supplier/SupplierMapper.xml
  40. 6 0
      sd-framework/src/main/java/com/sd/framework/util/sql/Select.java

+ 68 - 0
sd-business/src/main/java/com/sd/business/controller/apply/ApplyBuyBomController.java

@@ -0,0 +1,68 @@
+package com.sd.business.controller.apply;
+
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sd.business.entity.apply.vo.ApplyBuyBomVo;
+import com.sd.business.entity.apply.dto.ApplyBuyBomSelectDto;
+import com.sd.business.entity.apply.dto.ApplyBuyBomDto;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.sd.business.service.apply.ApplyBuyBomService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+
+/**
+ * <p>
+ * 申购单bom 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-03
+ */
+@RestController
+@RequestMapping("/applyBuyBom")
+public class ApplyBuyBomController {
+
+    @Autowired
+    private ApplyBuyBomService applyBuyBomService;
+
+    /**
+     * 申购单bom分页
+     */
+    @PostMapping("/page")
+    public Page<ApplyBuyBomVo> page(@RequestBody ApplyBuyBomSelectDto dto) {
+        return applyBuyBomService.getPage(dto);
+    }
+
+    /**
+     * 申购单bom明细
+     */
+    @PostMapping("/detail")
+    public ApplyBuyBomVo detail(@RequestBody BaseSelectDto dto) {
+        return applyBuyBomService.detail(dto.getId());
+    }
+
+    /**
+     * 申购单bom新增
+     */
+    @PostMapping("/add")
+    public void add(@RequestBody ApplyBuyBomDto dto) {
+        applyBuyBomService.add(dto);
+    }
+
+    /**
+     * 申购单bom编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody ApplyBuyBomDto dto) {
+        applyBuyBomService.edit(dto);
+    }
+
+    /**
+     * 申购单bom删除
+     */
+    @PostMapping("/delete")
+    public void delete(@RequestBody BaseSelectDto dto) {
+        applyBuyBomService.delete(dto.getId());
+    }
+
+}

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

@@ -0,0 +1,70 @@
+package com.sd.business.controller.apply;
+
+import com.fjhx.flow.enums.FlowStatusEnum;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sd.business.entity.apply.vo.ApplyBuyVo;
+import com.sd.business.entity.apply.dto.ApplyBuySelectDto;
+import com.sd.business.entity.apply.dto.ApplyBuyDto;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.sd.business.service.apply.ApplyBuyService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+
+/**
+ * <p>
+ * 申购单 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-03
+ */
+@RestController
+@RequestMapping("/applyBuy")
+public class ApplyBuyController {
+
+    @Autowired
+    private ApplyBuyService applyBuyService;
+
+    /**
+     * 申购单分页
+     */
+    @PostMapping("/page")
+    public Page<ApplyBuyVo> page(@RequestBody ApplyBuySelectDto dto) {
+        return applyBuyService.getPage(dto);
+    }
+
+    /**
+     * 申购单明细
+     */
+    @PostMapping("/detail")
+    public ApplyBuyVo detail(@RequestBody BaseSelectDto dto) {
+        return applyBuyService.detail(dto.getId());
+    }
+
+    /**
+     * 申购单新增
+     */
+    @PostMapping("/add")
+    public void add(@RequestBody ApplyBuyDto dto) {
+        dto.setFlowStatus(FlowStatusEnum.READY_START.getKey());
+        applyBuyService.add(dto);
+    }
+
+    /**
+     * 申购单编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody ApplyBuyDto dto) {
+        applyBuyService.edit(dto);
+    }
+
+    /**
+     * 申购单删除
+     */
+    @PostMapping("/delete")
+    public void delete(@RequestBody BaseSelectDto dto) {
+        applyBuyService.delete(dto.getId());
+    }
+
+}

+ 10 - 0
sd-business/src/main/java/com/sd/business/controller/purchase/PurchaseBomController.java

@@ -2,8 +2,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.PurchaseBomDetailsSelectDto;
 import com.sd.business.entity.purchase.dto.PurchaseBomDto;
 import com.sd.business.entity.purchase.dto.PurchaseBomSelectDto;
+import com.sd.business.entity.purchase.vo.PurchaseBomDetailsVo;
 import com.sd.business.entity.purchase.vo.PurchaseBomVo;
 import com.sd.business.service.purchase.PurchaseBomService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -68,4 +70,12 @@ public class PurchaseBomController {
         purchaseBomService.delete(dto.getId());
     }
 
+    /**
+     * 采购合同 bom分页
+     */
+    @PostMapping("/purchaseDetailsPage")
+    public Page<PurchaseBomDetailsVo> purchaseDetailsPage(@RequestBody PurchaseBomDetailsSelectDto dto) {
+        return purchaseBomService.getDetailsPage(dto);
+    }
+
 }

+ 23 - 0
sd-business/src/main/java/com/sd/business/controller/purchase/PurchaseController.java

@@ -1,16 +1,22 @@
 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.PurchaseBomImportDataDto;
 import com.sd.business.entity.purchase.dto.PurchaseDto;
 import com.sd.business.entity.purchase.dto.PurchaseSelectDto;
 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;
 
 
 /**
@@ -49,6 +55,7 @@ public class PurchaseController {
      */
     @PostMapping("/add")
     public void add(@RequestBody PurchaseDto dto) {
+        dto.setFlowStatus(FlowStatusEnum.READY_START.getKey());
         purchaseService.add(dto);
     }
 
@@ -68,4 +75,20 @@ public class PurchaseController {
         purchaseService.delete(dto.getId());
     }
 
+    /**
+     * 采购终止
+     */
+    @PostMapping("/purchaseTermination")
+    public void purchaseTermination(@RequestBody BaseSelectDto dto) {
+        purchaseService.purchaseTermination(dto.getId());
+    }
+
+    /**
+     * 导入E10采购合同
+     */
+    @PostMapping("/purchaseImport")
+    public void purchaseImport(MultipartFile file) {
+        List<PurchaseBomImportDataDto> list = ExcelUtil.read(file, PurchaseBomImportDataDto.class);
+        purchaseService.purchaseImport(list);
+    }
 }

+ 68 - 0
sd-business/src/main/java/com/sd/business/controller/supplier/SupplierController.java

@@ -0,0 +1,68 @@
+package com.sd.business.controller.supplier;
+
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sd.business.entity.supplier.vo.SupplierVo;
+import com.sd.business.entity.supplier.dto.SupplierSelectDto;
+import com.sd.business.entity.supplier.dto.SupplierDto;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.sd.business.service.supplier.SupplierService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+
+/**
+ * <p>
+ * 供应商 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-02
+ */
+@RestController
+@RequestMapping("/supplier")
+public class SupplierController {
+
+    @Autowired
+    private SupplierService supplierService;
+
+    /**
+     * 供应商分页
+     */
+    @PostMapping("/page")
+    public Page<SupplierVo> page(@RequestBody SupplierSelectDto dto) {
+        return supplierService.getPage(dto);
+    }
+
+    /**
+     * 供应商明细
+     */
+    @PostMapping("/detail")
+    public SupplierVo detail(@RequestBody BaseSelectDto dto) {
+        return supplierService.detail(dto.getId());
+    }
+
+    /**
+     * 供应商新增
+     */
+    @PostMapping("/add")
+    public void add(@RequestBody SupplierDto dto) {
+        supplierService.add(dto);
+    }
+
+    /**
+     * 供应商编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody SupplierDto dto) {
+        supplierService.edit(dto);
+    }
+
+    /**
+     * 供应商删除
+     */
+    @PostMapping("/delete")
+    public void delete(@RequestBody BaseSelectDto dto) {
+        supplierService.delete(dto.getId());
+    }
+
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/apply/dto/ApplyBuyBomDto.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.apply.dto;
+
+import com.sd.business.entity.apply.po.ApplyBuyBom;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 申购单bom新增编辑入参实体
+ *
+ * @author 
+ * @since 2024-01-03
+ */
+@Getter
+@Setter
+public class ApplyBuyBomDto extends ApplyBuyBom {
+
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/apply/dto/ApplyBuyBomSelectDto.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.apply.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 申购单bom列表查询入参实体
+ *
+ * @author 
+ * @since 2024-01-03
+ */
+@Getter
+@Setter
+public class ApplyBuyBomSelectDto extends BaseSelectDto {
+
+}

+ 26 - 0
sd-business/src/main/java/com/sd/business/entity/apply/dto/ApplyBuyDto.java

@@ -0,0 +1,26 @@
+package com.sd.business.entity.apply.dto;
+
+import com.sd.business.entity.apply.po.ApplyBuy;
+import com.sd.business.entity.apply.po.ApplyBuyBom;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 申购单新增编辑入参实体
+ *
+ * @author 
+ * @since 2024-01-03
+ */
+@Getter
+@Setter
+public class ApplyBuyDto extends ApplyBuy {
+
+    /**
+     * 申购bom
+     */
+    @NotEmpty(message = "申购清单不能为空")
+    private List<ApplyBuyBom> applyBuyBomList;
+}

+ 26 - 0
sd-business/src/main/java/com/sd/business/entity/apply/dto/ApplyBuySelectDto.java

@@ -0,0 +1,26 @@
+package com.sd.business.entity.apply.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 申购单列表查询入参实体
+ *
+ * @author 
+ * @since 2024-01-03
+ */
+@Getter
+@Setter
+public class ApplyBuySelectDto extends BaseSelectDto {
+
+    /**
+     * 申购单号
+     */
+    private String code;
+
+    /**
+     * 流程状态 0未发起 1进行中 2已通过 3已驳回 4已作废
+     */
+    private Integer flowStatus;
+}

+ 53 - 0
sd-business/src/main/java/com/sd/business/entity/apply/po/ApplyBuy.java

@@ -0,0 +1,53 @@
+package com.sd.business.entity.apply.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 申购单
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-03
+ */
+@Getter
+@Setter
+@TableName("apply_buy")
+public class ApplyBuy extends BasePo {
+
+    /**
+     * 申购单号
+     */
+    private String code;
+
+    /**
+     * 申购人
+     */
+    private String applyName;
+
+    /**
+     * 申购时间
+     */
+    private Date applyTime;
+
+    /**
+     * 申购说明
+     */
+    private String remark;
+
+    /**
+     * 流程id
+     */
+    private Long flowId;
+
+    /**
+     * 流程状态 0未发起 1进行中 2已通过 3已驳回 4已作废 10已采购
+     */
+    private Integer flowStatus;
+
+}

+ 49 - 0
sd-business/src/main/java/com/sd/business/entity/apply/po/ApplyBuyBom.java

@@ -0,0 +1,49 @@
+package com.sd.business.entity.apply.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 申购单bom
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-03
+ */
+@Getter
+@Setter
+@TableName("apply_buy_bom")
+public class ApplyBuyBom extends BasePo {
+
+    /**
+     * 申购单id
+     */
+    private Long applyBuyId;
+
+    /**
+     * bom规格id
+     */
+    private Long bomSpecId;
+
+    /**
+     * 申购数量
+     */
+    private BigDecimal quantity;
+
+    /**
+     * 采购数量
+     */
+    private BigDecimal purchaseQuantity;
+
+    /**
+     * 冻结数量
+     */
+    private BigDecimal frozenQuantity;
+
+}

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

@@ -0,0 +1,48 @@
+package com.sd.business.entity.apply.vo;
+
+import com.sd.business.entity.apply.po.ApplyBuyBom;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 申购单bom列表查询返回值实体
+ *
+ * @author 
+ * @since 2024-01-03
+ */
+@Getter
+@Setter
+public class ApplyBuyBomVo extends ApplyBuyBom {
+
+    /**
+     * 品号
+     */
+    private String bomSpecCode;
+
+    /**
+     * 品名
+     */
+    private String bomSpecName;
+
+    /**
+     * 颜色
+     */
+    private String bomSpecColour;
+
+    /**
+     * 长 cm
+     */
+    private BigDecimal bomSpecLength;
+
+    /**
+     * 宽 cm
+     */
+    private BigDecimal bomSpecWidth;
+
+    /**
+     * 高 cm
+     */
+    private BigDecimal bomSpecHeight;
+}

+ 23 - 0
sd-business/src/main/java/com/sd/business/entity/apply/vo/ApplyBuyVo.java

@@ -0,0 +1,23 @@
+package com.sd.business.entity.apply.vo;
+
+import com.sd.business.entity.apply.po.ApplyBuy;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 申购单列表查询返回值实体
+ *
+ * @author 
+ * @since 2024-01-03
+ */
+@Getter
+@Setter
+public class ApplyBuyVo extends ApplyBuy {
+
+    /**
+     * 申购明细
+     */
+    private List<ApplyBuyBomVo> applyBuyBomList;
+}

+ 31 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseBomDetailsSelectDto.java

@@ -0,0 +1,31 @@
+package com.sd.business.entity.purchase.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 采购合同bom 明细列表查询入参实体
+ *
+ * @author
+ * @since 2023-09-18
+ */
+@Getter
+@Setter
+public class PurchaseBomDetailsSelectDto extends BaseSelectDto {
+
+    /**
+     * 采购合同编号
+     */
+    private String purchaseCode;
+
+    /**
+     * 规格品名
+     */
+    private String bomSpecName;
+
+    /**
+     * 规格品号
+     */
+    private String bomSpecCode;
+}

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

@@ -0,0 +1,56 @@
+package com.sd.business.entity.purchase.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * E10采购合同bom 导入入参实体
+ */
+@Getter
+@Setter
+public class PurchaseBomImportDataDto {
+    /**
+     * 采购单号
+     */
+    @ExcelProperty("单号")
+    private String purchaseCode;
+
+    /**
+     * 供应商编码
+     */
+    @ExcelProperty("供应商编号")
+    private String supplierCode;
+
+    /**
+     * bom品号
+     */
+    @ExcelProperty("品号")
+    private String bomSpecCode;
+
+    /**
+     * 数量
+     */
+    @ExcelProperty("业务数量")
+    private String quantity;
+
+    /**
+     * 含税单价
+     */
+    @ExcelProperty("折扣后单价")
+    private String unitPrice;
+
+    /**
+     * 总金额
+     */
+    @ExcelProperty("金额")
+    private String totalAmount;
+
+    /**
+     * 交付日期
+     */
+    @ExcelProperty("预到货日")
+    private Date deliveryDate;
+}

+ 74 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/vo/PurchaseBomDetailsVo.java

@@ -0,0 +1,74 @@
+package com.sd.business.entity.purchase.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 采购合同bom明细列表查询返回值实体
+ *
+ * @author
+ * @since 2023-09-18
+ */
+@Getter
+@Setter
+public class PurchaseBomDetailsVo {
+
+
+    /**
+     * 采购合同编号
+     */
+    private String purchaseCode;
+
+    /**
+     * 规格品名
+     */
+    private String bomSpecName;
+
+    /**
+     * 规格品号
+     */
+    private String bomSpecCode;
+
+    /**
+     * 长 cm
+     */
+    private BigDecimal length;
+
+    /**
+     * 宽 cm
+     */
+    private BigDecimal width;
+
+    /**
+     * 高 cm
+     */
+    private BigDecimal height;
+
+    /**
+     * 采购数量
+     */
+    private BigDecimal purchaseQuantity;
+
+    /**
+     * 到货数量
+     */
+    private BigDecimal arrivalQuantity;
+
+    /**
+     * 在途数量
+     */
+    private BigDecimal inTransitQuantity;
+
+    /**
+     * 退货数量
+     */
+    private BigDecimal returnQuantity;
+
+    /**
+     * 含税单价
+     */
+    private BigDecimal unitPrice;
+
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/supplier/dto/SupplierDto.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.supplier.dto;
+
+import com.sd.business.entity.supplier.po.Supplier;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 供应商新增编辑入参实体
+ *
+ * @author 
+ * @since 2024-01-02
+ */
+@Getter
+@Setter
+public class SupplierDto extends Supplier {
+
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/supplier/dto/SupplierSelectDto.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.supplier.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 供应商列表查询入参实体
+ *
+ * @author 
+ * @since 2024-01-02
+ */
+@Getter
+@Setter
+public class SupplierSelectDto extends BaseSelectDto {
+
+}

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

@@ -0,0 +1,134 @@
+package com.sd.business.entity.supplier.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 供应商
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-02
+ */
+@Getter
+@Setter
+@TableName("supplier")
+public class Supplier extends BasePo {
+
+    /**
+     * 供应商名称
+     */
+    private String name;
+
+    /**
+     * 供应商编号
+     */
+    private String code;
+
+    /**
+     * 公司电话
+     */
+    private String companyTelephone;
+
+    /**
+     * 账期
+     */
+    private Integer paymentPeriod;
+
+    /**
+     * 省
+     */
+    private String province;
+
+    /**
+     * 市
+     */
+    private String city;
+
+    /**
+     * 详细地址
+     */
+    private String detailedAddress;
+
+    /**
+     * 税号
+     */
+    private String dutyNumber;
+
+    /**
+     * 付款类型 0-现结,1-月结
+     */
+    private Boolean paymentType;
+
+    /**
+     * 次月多少天内,结算费用
+     */
+    private Integer nextMonthDays;
+
+    /**
+     * 联系人1
+     */
+    private String contactPerson1;
+
+    /**
+     * 联系人电话1
+     */
+    private String contactNumber1;
+
+    /**
+     * 联系人邮箱1
+     */
+    private String contactMailbox1;
+
+    /**
+     * 联系人2
+     */
+    private String contactPerson2;
+
+    /**
+     * 联系人电话2
+     */
+    private String contactNumber2;
+
+    /**
+     * 联系人邮箱2
+     */
+    private String contactMailbox2;
+
+    /**
+     * 联系人3
+     */
+    private String contactPerson3;
+
+    /**
+     * 联系人电话3
+     */
+    private String contactNumber3;
+
+    /**
+     * 联系人邮箱3
+     */
+    private String contactMailbox3;
+
+    /**
+     * 银行
+
+     */
+    private String bank;
+
+    /**
+     * 银行账户名
+
+     */
+    private String bankAccountName;
+
+    /**
+     * 银行账号
+     */
+    private String bankAccountNumber;
+
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/supplier/vo/SupplierVo.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.supplier.vo;
+
+import com.sd.business.entity.supplier.po.Supplier;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 供应商列表查询返回值实体
+ *
+ * @author 
+ * @since 2024-01-02
+ */
+@Getter
+@Setter
+public class SupplierVo extends Supplier {
+
+}

+ 142 - 0
sd-business/src/main/java/com/sd/business/flow/ApplyBuyFlow.java

@@ -0,0 +1,142 @@
+package com.sd.business.flow;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fjhx.flow.core.FlowDelegate;
+import com.fjhx.flow.core.FlowThreadLocalUtil;
+import com.fjhx.flow.enums.FlowStatusEnum;
+import com.ruoyi.common.core.domain.BaseIdPo;
+import com.ruoyi.common.core.domain.BasePo;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.sd.business.entity.apply.dto.ApplyBuyDto;
+import com.sd.business.entity.apply.po.ApplyBuy;
+import com.sd.business.entity.apply.po.ApplyBuyBom;
+import com.sd.business.service.apply.ApplyBuyService;
+import com.sd.framework.util.Assert;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 发起申购流程
+ */
+@Service
+public class ApplyBuyFlow extends FlowDelegate {
+
+    @Autowired
+    private ApplyBuyService applyBuyService;
+
+    @Override
+    public String getFlowKey() {
+        return "apply_buy";
+    }
+
+    @Override
+    public Long start(Long flowId, JSONObject submitData) {
+
+        ApplyBuyDto applyBuyDto = submitData.toJavaObject(ApplyBuyDto.class);
+        validated(applyBuyDto);
+
+        applyBuyDto.setFlowId(flowId);
+        applyBuyDto.setFlowStatus(FlowStatusEnum.IN_PROGRESS.getKey());
+
+        if (applyBuyDto.getId() == null) {
+            applyBuyService.add(applyBuyDto);
+        } else {
+            applyBuyService.edit(applyBuyDto);
+        }
+
+        return applyBuyDto.getId();
+    }
+
+    @Override
+    public void end(Long flowId, Long businessId, JSONObject submitData) {
+        applyBuyService.update(q -> q
+                .eq(BaseIdPo::getId, businessId)
+                .set(ApplyBuy::getFlowStatus, FlowStatusEnum.PASS.getKey())
+                .set(BasePo::getUpdateTime, new Date())
+                .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+        );
+    }
+
+    /**
+     * 流程退回到发起人
+     *
+     * @param flowId     流程id
+     * @param businessId 业务id
+     * @param flowStatus 流程状态枚举
+     */
+    @Override
+    public void returnToOriginator(Long flowId, Long businessId, FlowStatusEnum flowStatus) {
+        applyBuyService.update(q -> q
+                .eq(BaseIdPo::getId, FlowThreadLocalUtil.getBusinessId())
+                .set(ApplyBuy::getFlowStatus, flowStatus.getKey())
+                .set(BasePo::getUpdateTime, new Date())
+                .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+        );
+    }
+
+    /**
+     * 流程重新发起
+     *
+     * @param flowId     流程id
+     * @param businessId 业务id
+     * @param flowStatus 流程状态枚举
+     * @param submitData 发起参数
+     */
+    @Override
+    public void relaunch(Long flowId, Long businessId, FlowStatusEnum flowStatus, JSONObject submitData) {
+        ApplyBuyDto applyBuyDto = submitData.toJavaObject(ApplyBuyDto.class);
+        validated(applyBuyDto);
+        applyBuyDto.setFlowStatus(FlowStatusEnum.IN_PROGRESS.getKey());
+        applyBuyService.edit(applyBuyDto);
+    }
+
+    /**
+     * 流程驳回
+     *
+     * @param flowId     流程id
+     * @param businessId 业务id
+     * @param flowStatus 流程状态枚举
+     */
+    @Override
+    public void reject(Long flowId, Long businessId, FlowStatusEnum flowStatus) {
+        applyBuyService.update(q -> q
+                .eq(BaseIdPo::getId, FlowThreadLocalUtil.getBusinessId())
+                .set(ApplyBuy::getFlowStatus, flowStatus.getKey())
+                .set(BasePo::getUpdateTime, new Date())
+                .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+        );
+    }
+
+    /**
+     * 作废
+     *
+     * @param flowId     流程id
+     * @param businessId 业务id
+     * @param flowStatus 流程状态枚举
+     */
+    @Override
+    public void cancellation(Long flowId, Long businessId, FlowStatusEnum flowStatus) {
+        reject(flowId, businessId, flowStatus);
+    }
+
+    /**
+     * 验证数据
+     */
+    private void validated(ApplyBuyDto applyBuyDto) {
+        Assert.notBlank(applyBuyDto.getApplyName(), "申购人不能为空");
+        Assert.notEmpty(applyBuyDto.getApplyTime(), "申购时间不能为空");
+
+        List<ApplyBuyBom> applyBuyBomList = applyBuyDto.getApplyBuyBomList();
+        Assert.notEmpty(applyBuyBomList, "申购清单不能为空");
+
+        for (ApplyBuyBom applyBuyBom : applyBuyBomList) {
+            Assert.notNull(applyBuyBom.getBomSpecId(), "bom规格Id不能为空");
+            Assert.notNull(applyBuyBom.getQuantity(), "申购数量不能为空");
+            Assert.gtZero(applyBuyBom.getQuantity(), "申购数量必须大于0");
+        }
+    }
+
+}

+ 170 - 0
sd-business/src/main/java/com/sd/business/flow/PurchaseFlow.java

@@ -0,0 +1,170 @@
+package com.sd.business.flow;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.fjhx.flow.core.FlowDelegate;
+import com.fjhx.flow.enums.FlowStatusEnum;
+import com.ruoyi.common.core.domain.BaseIdPo;
+import com.ruoyi.common.core.domain.BasePo;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.sd.business.entity.apply.po.ApplyBuy;
+import com.sd.business.entity.apply.po.ApplyBuyBom;
+import com.sd.business.entity.purchase.dto.PurchaseDto;
+import com.sd.business.entity.purchase.enums.PurchaseStatusEnum;
+import com.sd.business.entity.purchase.po.Purchase;
+import com.sd.business.entity.purchase.po.PurchaseBom;
+import com.sd.business.service.apply.ApplyBuyBomService;
+import com.sd.business.service.apply.ApplyBuyService;
+import com.sd.business.service.purchase.PurchaseBomService;
+import com.sd.business.service.purchase.PurchaseService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 发起采购流程
+ */
+@Service
+public class PurchaseFlow extends FlowDelegate {
+
+    @Autowired
+    private PurchaseService purchaseService;
+
+    @Autowired
+    private PurchaseBomService purchaseBomService;
+
+    @Autowired
+    private ApplyBuyService applyBuyService;
+
+    @Autowired
+    private ApplyBuyBomService applyBuyBomService;
+
+    @Override
+    public String getFlowKey() {
+        return "purchase";
+    }
+
+    @Override
+    public Long start(Long flowId, JSONObject submitData) {
+
+        PurchaseDto purchase = submitData.toJavaObject(PurchaseDto.class);
+        purchase.setFlowStatus(FlowStatusEnum.IN_PROGRESS.getKey());
+        purchase.setFlowId(flowId);
+        purchase.setStatus(PurchaseStatusEnum.UNDER_REVIEW.getKey());
+
+        if (purchase.getId() == null) {
+            purchaseService.add(purchase);
+        } else {
+            purchaseService.edit(purchase);
+        }
+
+        return purchase.getId();
+    }
+
+    @Override
+    public void end(Long flowId, Long businessId, JSONObject submitData) {
+
+        // 修改采购暂存表的数据
+        Purchase purchase = purchaseService.getById(businessId);
+        purchase.setFlowStatus(FlowStatusEnum.PASS.getKey());
+        purchase.setFlowId(flowId);
+        purchase.setStatus(PurchaseStatusEnum.UNDER_PURCHASE.getKey());
+        purchaseService.updateById(purchase);
+
+        Map<Long, PurchaseBom> purchaseBomMap = purchaseBomService.mapKEntity(
+                PurchaseBom::getApplyBuyBomId,
+                q -> q.eq(PurchaseBom::getPurchaseId, businessId));
+
+        List<ApplyBuyBom> applyBuyBomList = applyBuyBomService.list(
+                q -> q.eq(ApplyBuyBom::getApplyBuyId, purchase.getApplyBuyId()));
+
+        boolean isComplete = true;
+        for (ApplyBuyBom applyBuyBom : applyBuyBomList) {
+            PurchaseBom purchaseBom = purchaseBomMap.get(applyBuyBom.getId());
+            if (purchaseBom != null) {
+                applyBuyBom.setFrozenQuantity(applyBuyBom.getFrozenQuantity().subtract(purchaseBom.getPurchaseQuantity()));
+                applyBuyBom.setPurchaseQuantity(applyBuyBom.getPurchaseQuantity().add(purchaseBom.getPurchaseQuantity()));
+            }
+
+            if (applyBuyBom.getQuantity().compareTo(applyBuyBom.getPurchaseQuantity()) > 0) {
+                isComplete = false;
+            }
+        }
+
+        applyBuyBomService.updateBatchById(applyBuyBomList);
+        if (isComplete) {
+            applyBuyService.update(q -> q
+                    .eq(BaseIdPo::getId, purchase.getApplyBuyId())
+                    .set(ApplyBuy::getFlowStatus, "4")
+                    .set(BasePo::getUpdateTime, new Date())
+                    .set(BasePo::getUpdateUser, SecurityUtils.getUserId()));
+        }
+
+    }
+
+    @Override
+    public void returnToOriginator(Long flowId, Long businessId, FlowStatusEnum flowStatus) {
+        purchaseService.update(q -> q
+                .eq(BaseIdPo::getId, businessId)
+                .set(Purchase::getFlowStatus, flowStatus.getKey())
+                .set(Purchase::getStatus, PurchaseStatusEnum.DRAFT.getKey())
+                .set(BasePo::getUpdateTime, new Date())
+                .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+        );
+    }
+
+    @Override
+    public void relaunch(Long flowId, Long businessId, FlowStatusEnum flowStatus, JSONObject submitData) {
+        PurchaseDto purchase = submitData.toJavaObject(PurchaseDto.class);
+        purchase.setFlowStatus(FlowStatusEnum.IN_PROGRESS.getKey());
+        purchase.setStatus(PurchaseStatusEnum.UNDER_REVIEW.getKey());
+        purchaseService.edit(purchase);
+    }
+
+    @Override
+    public void reject(Long flowId, Long businessId, FlowStatusEnum flowStatus) {
+
+        Map<Long, PurchaseBom> purchaseBomMap = purchaseBomService.mapKEntity(
+                PurchaseBom::getApplyBuyBomId,
+                q -> q.eq(PurchaseBom::getPurchaseId, businessId));
+
+        List<ApplyBuyBom> applyBuyBomList = applyBuyBomService.list(
+                q -> q.eq(ApplyBuyBom::getApplyBuyId, businessId));
+
+        applyBuyBomList.forEach(item -> {
+            PurchaseBom purchaseBom = purchaseBomMap.get(item.getId());
+            if (purchaseBom == null) {
+                return;
+            }
+            item.setFrozenQuantity(item.getFrozenQuantity().subtract(purchaseBom.getPurchaseQuantity()));
+        });
+        applyBuyBomService.updateBatchById(applyBuyBomList);
+
+        purchaseService.update(q -> q
+                .eq(BaseIdPo::getId, businessId)
+                .set(Purchase::getFlowStatus, flowStatus.getKey())
+                .set(Purchase::getStatus,
+                        ObjectUtil.equals(FlowStatusEnum.REJECT.getKey(), flowStatus.getKey()) ?
+                        PurchaseStatusEnum.REJECT.getKey() : PurchaseStatusEnum.CANCELLATION.getKey()
+                    )
+                .set(BasePo::getUpdateTime, new Date())
+                .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+        );
+    }
+
+    /**
+     * 作废
+     *
+     * @param flowId     流程id
+     * @param businessId 业务id
+     * @param flowStatus 流程状态枚举
+     */
+    @Override
+    public void cancellation(Long flowId, Long businessId, FlowStatusEnum flowStatus) {
+        reject(flowId, businessId, flowStatus);
+    }
+
+}

+ 16 - 0
sd-business/src/main/java/com/sd/business/mapper/apply/ApplyBuyBomMapper.java

@@ -0,0 +1,16 @@
+package com.sd.business.mapper.apply;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sd.business.entity.apply.po.ApplyBuyBom;
+
+/**
+ * <p>
+ * 申购单bom Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-03
+ */
+public interface ApplyBuyBomMapper extends BaseMapper<ApplyBuyBom> {
+
+}

+ 16 - 0
sd-business/src/main/java/com/sd/business/mapper/apply/ApplyBuyMapper.java

@@ -0,0 +1,16 @@
+package com.sd.business.mapper.apply;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sd.business.entity.apply.po.ApplyBuy;
+
+/**
+ * <p>
+ * 申购单 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-03
+ */
+public interface ApplyBuyMapper extends BaseMapper<ApplyBuy> {
+
+}

+ 16 - 0
sd-business/src/main/java/com/sd/business/mapper/supplier/SupplierMapper.java

@@ -0,0 +1,16 @@
+package com.sd.business.mapper.supplier;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sd.business.entity.supplier.po.Supplier;
+
+/**
+ * <p>
+ * 供应商 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-02
+ */
+public interface SupplierMapper extends BaseMapper<Supplier> {
+
+}

+ 46 - 0
sd-business/src/main/java/com/sd/business/service/apply/ApplyBuyBomService.java

@@ -0,0 +1,46 @@
+package com.sd.business.service.apply;
+
+import com.sd.business.entity.apply.po.ApplyBuyBom;
+import com.ruoyi.common.core.service.BaseService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sd.business.entity.apply.vo.ApplyBuyBomVo;
+import com.sd.business.entity.apply.dto.ApplyBuyBomSelectDto;
+import com.sd.business.entity.apply.dto.ApplyBuyBomDto;
+
+
+/**
+ * <p>
+ * 申购单bom 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-03
+ */
+public interface ApplyBuyBomService extends BaseService<ApplyBuyBom> {
+
+    /**
+     * 申购单bom分页
+     */
+    Page<ApplyBuyBomVo> getPage(ApplyBuyBomSelectDto dto);
+
+    /**
+     * 申购单bom明细
+     */
+    ApplyBuyBomVo detail(Long id);
+
+    /**
+     * 申购单bom新增
+     */
+    void add(ApplyBuyBomDto dto);
+
+    /**
+     * 申购单bom编辑
+     */
+    void edit(ApplyBuyBomDto dto);
+
+    /**
+     * 申购单bom删除
+     */
+    void delete(Long id);
+
+}

+ 45 - 0
sd-business/src/main/java/com/sd/business/service/apply/ApplyBuyService.java

@@ -0,0 +1,45 @@
+package com.sd.business.service.apply;
+
+import com.sd.business.entity.apply.po.ApplyBuy;
+import com.ruoyi.common.core.service.BaseService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sd.business.entity.apply.vo.ApplyBuyVo;
+import com.sd.business.entity.apply.dto.ApplyBuySelectDto;
+import com.sd.business.entity.apply.dto.ApplyBuyDto;
+
+
+/**
+ * <p>
+ * 申购单 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-03
+ */
+public interface ApplyBuyService extends BaseService<ApplyBuy> {
+
+    /**
+     * 申购单分页
+     */
+    Page<ApplyBuyVo> getPage(ApplyBuySelectDto dto);
+
+    /**
+     * 申购单明细
+     */
+    ApplyBuyVo detail(Long id);
+
+    /**
+     * 申购单新增
+     */
+    void add(ApplyBuyDto dto);
+
+    /**
+     * 申购单编辑
+     */
+    void edit(ApplyBuyDto dto);
+
+    /**
+     * 申购单删除
+     */
+    void delete(Long id);
+}

+ 68 - 0
sd-business/src/main/java/com/sd/business/service/apply/impl/ApplyBuyBomServiceImpl.java

@@ -0,0 +1,68 @@
+package com.sd.business.service.apply.impl;
+
+import com.sd.business.entity.apply.po.ApplyBuyBom;
+import com.sd.business.mapper.apply.ApplyBuyBomMapper;
+import com.sd.business.service.apply.ApplyBuyBomService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sd.business.entity.apply.vo.ApplyBuyBomVo;
+import com.sd.business.entity.apply.dto.ApplyBuyBomSelectDto;
+import com.sd.business.entity.apply.dto.ApplyBuyBomDto;
+import com.sd.framework.util.sql.Sql;
+import com.sd.framework.util.Assert;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 申购单bom 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-03
+ */
+@Service
+public class ApplyBuyBomServiceImpl extends ServiceImpl<ApplyBuyBomMapper, ApplyBuyBom> implements ApplyBuyBomService {
+
+    @Override
+    public Page<ApplyBuyBomVo> getPage(ApplyBuyBomSelectDto dto) {
+
+        Page<ApplyBuyBomVo> page = Sql.create(ApplyBuyBomVo.class)
+                .selectAll(ApplyBuyBom.class)
+                .from(ApplyBuyBom.class)
+                .orderByDesc(ApplyBuyBom::getId)
+                .page(dto);
+
+        return page;
+    }
+
+    @Override
+    public ApplyBuyBomVo detail(Long id) {
+
+        ApplyBuyBomVo vo = Sql.create(ApplyBuyBomVo.class)
+                .selectAll(ApplyBuyBom.class)
+                .from(ApplyBuyBom.class)
+                .eq(ApplyBuyBom::getId, id)
+                .one();
+
+        Assert.notNull(vo, "未知数据");
+
+        return vo;
+    }
+
+    @Override
+    public void add(ApplyBuyBomDto dto) {
+        save(dto);
+    }
+
+    @Override
+    public void edit(ApplyBuyBomDto dto) {
+        updateById(dto);
+    }
+
+    @Override
+    public void delete(Long id) {
+        removeById(id);
+    }
+
+}

+ 92 - 0
sd-business/src/main/java/com/sd/business/service/apply/impl/ApplyBuyServiceImpl.java

@@ -0,0 +1,92 @@
+package com.sd.business.service.apply.impl;
+
+import com.sd.business.entity.apply.po.ApplyBuy;
+import com.sd.business.entity.apply.po.ApplyBuyBom;
+import com.sd.business.entity.apply.vo.ApplyBuyBomVo;
+import com.sd.business.entity.bom.po.BomSpec;
+import com.sd.business.mapper.apply.ApplyBuyMapper;
+import com.sd.business.service.apply.ApplyBuyService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sd.business.entity.apply.vo.ApplyBuyVo;
+import com.sd.business.entity.apply.dto.ApplyBuySelectDto;
+import com.sd.business.entity.apply.dto.ApplyBuyDto;
+import com.sd.framework.util.sql.Sql;
+import com.sd.framework.util.Assert;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+
+/**
+ * <p>
+ * 申购单 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-03
+ */
+@Service
+public class ApplyBuyServiceImpl extends ServiceImpl<ApplyBuyMapper, ApplyBuy> implements ApplyBuyService {
+
+    @Override
+    public Page<ApplyBuyVo> getPage(ApplyBuySelectDto dto) {
+
+        Page<ApplyBuyVo> page = Sql.create(ApplyBuyVo.class)
+                .selectAll(ApplyBuy.class)
+                .from(ApplyBuy.class)
+                .like(ApplyBuy::getCode, dto.getCode())
+                .eq(ApplyBuy::getFlowStatus, dto.getFlowStatus())
+                .ge(ApplyBuy::getApplyTime, dto.getBeginTime())
+                .le(ApplyBuy::getApplyTime, dto.getEndTime())
+                .orderByDesc(ApplyBuy::getId)
+                .page(dto);
+
+        return page;
+    }
+
+    @Override
+    public ApplyBuyVo detail(Long id) {
+
+        ApplyBuyVo vo = Sql.create(ApplyBuyVo.class)
+                .selectAll(ApplyBuy.class)
+                .from(ApplyBuy.class)
+                .eq(ApplyBuy::getId, id)
+                .one();
+
+        Assert.notNull(vo, "未知数据");
+
+        List<ApplyBuyBomVo> bomVoList = Sql.create(ApplyBuyBomVo.class)
+                .selectAll(ApplyBuyBom.class)
+                .selectAs(BomSpec::getCode, ApplyBuyBomVo::getBomSpecCode)
+                .selectAs(BomSpec::getName, ApplyBuyBomVo::getBomSpecName)
+                .selectAs(BomSpec::getColour, ApplyBuyBomVo::getBomSpecColour)
+                .selectAs(BomSpec::getLength, ApplyBuyBomVo::getBomSpecLength)
+                .selectAs(BomSpec::getWidth, ApplyBuyBomVo::getBomSpecWidth)
+                .selectAs(BomSpec::getHeight, ApplyBuyBomVo::getBomSpecHeight)
+                .from(ApplyBuyBom.class)
+                .innerJoin(BomSpec.class, BomSpec::getId, ApplyBuyBom::getBomSpecId)
+                .eq(ApplyBuyBom::getId, id)
+                .list();
+
+        vo.setApplyBuyBomList(bomVoList);
+
+        return vo;
+    }
+
+    @Override
+    public void add(ApplyBuyDto dto) {
+        save(dto);
+    }
+
+    @Override
+    public void edit(ApplyBuyDto dto) {
+        updateById(dto);
+    }
+
+    @Override
+    public void delete(Long id) {
+        removeById(id);
+    }
+
+}

+ 8 - 0
sd-business/src/main/java/com/sd/business/service/purchase/PurchaseBomService.java

@@ -2,9 +2,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.PurchaseBomDetailsSelectDto;
 import com.sd.business.entity.purchase.dto.PurchaseBomDto;
 import com.sd.business.entity.purchase.dto.PurchaseBomSelectDto;
 import com.sd.business.entity.purchase.po.PurchaseBom;
+import com.sd.business.entity.purchase.vo.PurchaseBomDetailsVo;
 import com.sd.business.entity.purchase.vo.PurchaseBomVo;
 
 
@@ -43,4 +45,10 @@ public interface PurchaseBomService extends BaseService<PurchaseBom> {
      */
     void delete(Long id);
 
+    /**
+     * 获取采购bom明细分页
+     * @param dto
+     * @return
+     */
+    Page<PurchaseBomDetailsVo> getDetailsPage(PurchaseBomDetailsSelectDto dto);
 }

+ 12 - 0
sd-business/src/main/java/com/sd/business/service/purchase/PurchaseService.java

@@ -3,6 +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.PurchaseBomImportDataDto;
 import com.sd.business.entity.purchase.dto.PurchaseDto;
 import com.sd.business.entity.purchase.dto.PurchaseSelectDto;
 import com.sd.business.entity.purchase.po.Purchase;
@@ -51,4 +52,15 @@ public interface PurchaseService extends BaseService<Purchase> {
      */
     void updatePurchaseBomArrivalQuantity(Long purchaseId, List<InOutStorageBom> inOutStorageBomList);
 
+    /**
+     * 采购合同终止
+     * @param id
+     */
+    void purchaseTermination(Long id);
+
+    /**
+     * 导入E10采购合同
+     * @param list
+     */
+    void purchaseImport(List<PurchaseBomImportDataDto> list);
 }

+ 28 - 0
sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseBomServiceImpl.java

@@ -2,9 +2,13 @@ package com.sd.business.service.purchase.impl;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sd.business.entity.bom.po.BomSpec;
+import com.sd.business.entity.purchase.dto.PurchaseBomDetailsSelectDto;
 import com.sd.business.entity.purchase.dto.PurchaseBomDto;
 import com.sd.business.entity.purchase.dto.PurchaseBomSelectDto;
+import com.sd.business.entity.purchase.po.Purchase;
 import com.sd.business.entity.purchase.po.PurchaseBom;
+import com.sd.business.entity.purchase.vo.PurchaseBomDetailsVo;
 import com.sd.business.entity.purchase.vo.PurchaseBomVo;
 import com.sd.business.mapper.purchase.PurchaseBomMapper;
 import com.sd.business.service.purchase.PurchaseBomService;
@@ -65,4 +69,28 @@ public class PurchaseBomServiceImpl extends ServiceImpl<PurchaseBomMapper, Purch
         removeById(id);
     }
 
+    @Override
+    public Page<PurchaseBomDetailsVo> getDetailsPage(PurchaseBomDetailsSelectDto dto) {
+
+        Page<PurchaseBomDetailsVo> page = Sql.create(PurchaseBomDetailsVo.class)
+                .selectAll(PurchaseBom.class)
+                .selectAs(Purchase::getCode, PurchaseBomDetailsVo::getPurchaseCode)
+                .selectAs(BomSpec::getCode, PurchaseBomDetailsVo::getBomSpecCode)
+                .selectAs(BomSpec::getName, PurchaseBomDetailsVo::getBomSpecName)
+                .select(BomSpec::getLength)
+                .select(BomSpec::getWidth)
+                .select(BomSpec::getHeight)
+                .selectAs("t1.purchase_quantity - t1.arrival_quantity + t1.return_quantity", PurchaseBomDetailsVo::getInTransitQuantity)
+                .from(PurchaseBom.class)
+                .innerJoin(Purchase.class, Purchase::getId, PurchaseBom::getPurchaseId)
+                .innerJoin(BomSpec.class, BomSpec::getId, PurchaseBom::getBomSpecId)
+                .eq(Purchase::getCode, dto.getPurchaseCode())
+                .eq(BomSpec::getCode, dto.getBomSpecCode())
+                .eq(BomSpec::getName, dto.getBomSpecName())
+                .orderByDesc(PurchaseBom::getId)
+                .page(dto);
+
+        return page;
+    }
+
 }

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

@@ -1,25 +1,41 @@
 package com.sd.business.service.purchase.impl;
 
+import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.ObjectUtil;
+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.flow.enums.FlowStatusEnum;
 import com.ruoyi.common.constant.StatusConstant;
+import com.ruoyi.common.core.domain.BaseIdPo;
+import com.ruoyi.common.exception.ServiceException;
+import com.sd.business.entity.bom.bo.BomSpecBo;
+import com.sd.business.entity.bom.po.BomSpec;
 import com.sd.business.entity.in.po.InOutStorageBom;
+import com.sd.business.entity.purchase.dto.PurchaseBomImportDataDto;
 import com.sd.business.entity.purchase.dto.PurchaseDto;
 import com.sd.business.entity.purchase.dto.PurchaseSelectDto;
 import com.sd.business.entity.purchase.enums.PurchaseStatusEnum;
 import com.sd.business.entity.purchase.po.Purchase;
 import com.sd.business.entity.purchase.po.PurchaseBom;
 import com.sd.business.entity.purchase.vo.PurchaseVo;
+import com.sd.business.entity.supplier.po.Supplier;
 import com.sd.business.mapper.purchase.PurchaseMapper;
+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.sku.SkuSpecService;
+import com.sd.business.service.supplier.SupplierService;
+import com.sd.business.util.CodeEnum;
 import com.sd.framework.util.Assert;
 import com.sd.framework.util.sql.Sql;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.stream.Collectors;
 
 
 /**
@@ -36,6 +52,16 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
     @Autowired
     private PurchaseBomService purchaseBomService;
 
+    @Autowired
+    private BomSpecService bomSpecService;
+
+    @Autowired
+    private SkuSpecService skuSpecService;
+
+    @Autowired
+    private SupplierService supplierService;
+
+
     @Override
     public Page<PurchaseVo> getPage(PurchaseSelectDto dto) {
 
@@ -111,4 +137,134 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
 
     }
 
+    @Override
+    public void purchaseTermination(Long id) {
+        Purchase purchase = this.getById(id);
+        if (purchase == null) {
+            return;
+        }
+        purchase.setStatus(PurchaseStatusEnum.TERMINATION.getKey());
+        purchase.setStorageStatus(StatusConstant.YES);
+        this.updateById(purchase);
+
+        // 合同终止将bom到货数量设置为采购数量
+        List<PurchaseBom> purchaseBomList = purchaseBomService.list(q -> q
+                .eq(PurchaseBom::getPurchaseId, id)
+                .apply("(purchase_quantity + return_quantity) > arrival_quantity"));
+        for (PurchaseBom purchaseBom : purchaseBomList) {
+            purchaseBom.setArrivalQuantity(purchaseBom.getPurchaseQuantity().add(purchaseBom.getReturnQuantity()));
+        }
+        purchaseBomService.updateBatchById(purchaseBomList);
+    }
+
+    @Override
+    public void purchaseImport(List<PurchaseBomImportDataDto> list) {
+
+        // 验证导入数据
+        validatedImportData(list);
+
+        Map<String, List<PurchaseBomImportDataDto>> bomMap = list.stream().collect(Collectors.groupingBy(PurchaseBomImportDataDto::getPurchaseCode));
+        Map<String, Long> purchaseMap = this.mapKV(Purchase::getErpCode, BaseIdPo::getId, q -> q.in(Purchase::getErpCode, bomMap.keySet()));
+
+        Set<String> supplierCodes = list.stream().map(PurchaseBomImportDataDto::getSupplierCode).collect(Collectors.toSet());
+        Map<String, Long> supplierMap = supplierService.mapKV(Supplier::getCode, BaseIdPo::getId, q -> q.in(Supplier::getCode, supplierCodes));
+
+        List<String> bomSpecCodes = list.stream().map(PurchaseBomImportDataDto::getBomSpecCode).collect(Collectors.toList());
+        Map<String, BomSpec> bomSpecMap = bomSpecService.mapKEntity(BomSpec::getCode, q -> q.in(BomSpec::getCode, bomSpecCodes));
+
+        List<Purchase> purchaseList = new ArrayList<>();
+        List<PurchaseBom> purchaseBomList = new ArrayList<>();
+        List<BomSpec> bomSpecList = new ArrayList<>();
+        for (Map.Entry<String, List<PurchaseBomImportDataDto>> entry : bomMap.entrySet()) {
+            String purchaseCode = entry.getKey();
+            List<PurchaseBomImportDataDto> bomList = entry.getValue();
+            if (ObjectUtil.isEmpty(bomList)) {
+                continue;
+            }
+
+            // 判断是否存在重复编号
+            Long purchaseId = purchaseMap.get(purchaseCode);
+            if (purchaseId != null) {
+                throw new ServiceException("采购合同编号:" + purchaseCode + " 已存在");
+            }
+
+            Long supplierId = supplierMap.get(bomList.get(0).getSupplierCode());
+            if (supplierId == null) {
+                throw new ServiceException("未知供应商编号:" + bomList.get(0).getSupplierCode());
+            }
+
+            // 保存采购合同
+            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(purchaseCode);
+            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);
+            purchase.setDeliveryDate(bomList.get(0).getDeliveryDate());
+
+
+            List<PurchaseBom> bomData = bomList.stream().map(item -> {
+                BomSpec bomSpec = bomSpecMap.get(item.getBomSpecCode());
+                if (bomSpec == null) {
+                    throw new ServiceException("未知bom品号:" + item.getBomSpecCode());
+                }
+                PurchaseBom purchaseBom = new PurchaseBom();
+                purchaseBom.setPurchaseId(purchase.getId());
+                purchaseBom.setBomSpecId(bomSpec.getId());
+                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));
+
+                // 保存最新的合同价格
+                bomSpec.setCostPrice(purchaseBom.getUnitPrice());
+                bomSpec.setInternalSellingPrice(purchaseBom.getUnitPrice());
+                bomSpecList.add(bomSpec);
+
+                return purchaseBom;
+            }).collect(Collectors.toList());
+            purchaseList.add(purchase);
+            purchaseBomList.addAll(bomData);
+            purchaseMap.put(purchaseCode, purchase.getId());
+        }
+
+        this.saveBatch(purchaseList);
+        purchaseBomService.saveBatch(purchaseBomList);
+        if (!bomSpecList.isEmpty()) {
+            bomSpecService.updateBatchById(bomSpecList);
+        }
+    }
+
+    private void validatedImportData(List<PurchaseBomImportDataDto> list) {
+        Assert.notEmpty(list, "采购合同明细不能为空");
+        for (PurchaseBomImportDataDto dto : list) {
+            Assert.notBlank(dto.getPurchaseCode(), "采购合同编号不能为空");
+            Assert.notBlank(dto.getSupplierCode(), "供应商编号不能为空");
+            Assert.notBlank(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");
+        }
+    }
 }

+ 46 - 0
sd-business/src/main/java/com/sd/business/service/supplier/SupplierService.java

@@ -0,0 +1,46 @@
+package com.sd.business.service.supplier;
+
+import com.sd.business.entity.supplier.po.Supplier;
+import com.ruoyi.common.core.service.BaseService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sd.business.entity.supplier.vo.SupplierVo;
+import com.sd.business.entity.supplier.dto.SupplierSelectDto;
+import com.sd.business.entity.supplier.dto.SupplierDto;
+
+
+/**
+ * <p>
+ * 供应商 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-02
+ */
+public interface SupplierService extends BaseService<Supplier> {
+
+    /**
+     * 供应商分页
+     */
+    Page<SupplierVo> getPage(SupplierSelectDto dto);
+
+    /**
+     * 供应商明细
+     */
+    SupplierVo detail(Long id);
+
+    /**
+     * 供应商新增
+     */
+    void add(SupplierDto dto);
+
+    /**
+     * 供应商编辑
+     */
+    void edit(SupplierDto dto);
+
+    /**
+     * 供应商删除
+     */
+    void delete(Long id);
+
+}

+ 68 - 0
sd-business/src/main/java/com/sd/business/service/supplier/impl/SupplierServiceImpl.java

@@ -0,0 +1,68 @@
+package com.sd.business.service.supplier.impl;
+
+import com.sd.business.entity.supplier.po.Supplier;
+import com.sd.business.mapper.supplier.SupplierMapper;
+import com.sd.business.service.supplier.SupplierService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sd.business.entity.supplier.vo.SupplierVo;
+import com.sd.business.entity.supplier.dto.SupplierSelectDto;
+import com.sd.business.entity.supplier.dto.SupplierDto;
+import com.sd.framework.util.sql.Sql;
+import com.sd.framework.util.Assert;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 供应商 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2024-01-02
+ */
+@Service
+public class SupplierServiceImpl extends ServiceImpl<SupplierMapper, Supplier> implements SupplierService {
+
+    @Override
+    public Page<SupplierVo> getPage(SupplierSelectDto dto) {
+
+        Page<SupplierVo> page = Sql.create(SupplierVo.class)
+                .selectAll(Supplier.class)
+                .from(Supplier.class)
+                .orderByDesc(Supplier::getId)
+                .page(dto);
+
+        return page;
+    }
+
+    @Override
+    public SupplierVo detail(Long id) {
+
+        SupplierVo vo = Sql.create(SupplierVo.class)
+                .selectAll(Supplier.class)
+                .from(Supplier.class)
+                .eq(Supplier::getId, id)
+                .one();
+
+        Assert.notNull(vo, "未知数据");
+
+        return vo;
+    }
+
+    @Override
+    public void add(SupplierDto dto) {
+        save(dto);
+    }
+
+    @Override
+    public void edit(SupplierDto dto) {
+        updateById(dto);
+    }
+
+    @Override
+    public void delete(Long id) {
+        removeById(id);
+    }
+
+}

+ 3 - 0
sd-business/src/main/java/com/sd/business/util/CodeEnum.java

@@ -10,6 +10,7 @@ import com.ruoyi.common.exception.ServiceException;
 import com.sd.business.service.in.InOutStorageService;
 import com.sd.business.service.inventory.InventoryFinishedOrderDetailService;
 import com.sd.business.service.order.OrderInfoService;
+import com.sd.business.service.purchase.PurchaseService;
 import com.sd.business.service.statement.StatementOfAccountService;
 import lombok.Getter;
 
@@ -32,6 +33,8 @@ public enum CodeEnum {
     SH_CODE("SH", "-yyMMddHH-", "delivery_code", 3, OrderInfoService.class),
     // 工单号
     WORK_ORDER_CODE("JH", "-yyMMddHH-", "code", 3, OrderInfoService.class),
+    // 采购单号
+    PURCHASE_CODE("PUR", "-yyMMdd-", "code", 6, PurchaseService.class),
     ;
 
     // 编码前缀

+ 5 - 0
sd-business/src/main/resources/mapper/apply/ApplyBuyBomMapper.xml

@@ -0,0 +1,5 @@
+<?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.apply.ApplyBuyBomMapper">
+
+</mapper>

+ 5 - 0
sd-business/src/main/resources/mapper/apply/ApplyBuyMapper.xml

@@ -0,0 +1,5 @@
+<?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.apply.ApplyBuyMapper">
+
+</mapper>

+ 5 - 0
sd-business/src/main/resources/mapper/supplier/SupplierMapper.xml

@@ -0,0 +1,5 @@
+<?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.supplier.SupplierMapper">
+
+</mapper>

+ 6 - 0
sd-framework/src/main/java/com/sd/framework/util/sql/Select.java

@@ -59,6 +59,12 @@ public class Select<T> {
         return this;
     }
 
+    public <S, V> Select<T> selectAs(String selectSql, SFunction<T, ?> asFunction) {
+        String as = PropertyNamer.methodToProperty(LambdaUtils.extract(asFunction).getImplMethodName());
+        sql.selectList.add(selectSql + StringPool.SPACE + as);
+        return this;
+    }
+
     @SafeVarargs
     public final <S> Select<T> selectAll(Class<S> cls, SFunction<S, ?>... excludeFunction) {
         return selectAll(sql.getTableAlias(cls), cls, excludeFunction);