fgd преди 1 година
родител
ревизия
60ca4c7ecd
променени са 14 файла, в които са добавени 544 реда и са изтрити 16 реда
  1. 2 1
      sd-business/src/main/java/com/sd/business/controller/purchase/PurchaseBomController.java
  2. 9 0
      sd-business/src/main/java/com/sd/business/controller/purchase/PurchaseController.java
  3. 51 0
      sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseBomSelectDto.java
  4. 13 0
      sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseDto.java
  5. 19 0
      sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseSelectDto.java
  6. 70 0
      sd-business/src/main/java/com/sd/business/entity/purchase/vo/PurchaseBomInfoVo.java
  7. 42 0
      sd-business/src/main/java/com/sd/business/entity/purchase/vo/PurchaseBomSelectVo.java
  8. 36 0
      sd-business/src/main/java/com/sd/business/entity/purchase/vo/PurchaseBomVo.java
  9. 16 0
      sd-business/src/main/java/com/sd/business/entity/purchase/vo/PurchaseVo.java
  10. 11 1
      sd-business/src/main/java/com/sd/business/service/apply/impl/ApplyBuyServiceImpl.java
  11. 2 1
      sd-business/src/main/java/com/sd/business/service/purchase/PurchaseBomService.java
  12. 6 0
      sd-business/src/main/java/com/sd/business/service/purchase/PurchaseService.java
  13. 75 6
      sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseBomServiceImpl.java
  14. 192 7
      sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseServiceImpl.java

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

@@ -6,6 +6,7 @@ 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.PurchaseBomSelectVo;
 import com.sd.business.entity.purchase.vo.PurchaseBomVo;
 import com.sd.business.service.purchase.PurchaseBomService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -34,7 +35,7 @@ public class PurchaseBomController {
      * 采购合同bom分页
      */
     @PostMapping("/page")
-    public Page<PurchaseBomVo> page(@RequestBody PurchaseBomSelectDto dto) {
+    public Page<PurchaseBomSelectVo> page(@RequestBody PurchaseBomSelectDto dto) {
         return purchaseBomService.getPage(dto);
     }
 

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

@@ -76,6 +76,15 @@ public class PurchaseController {
     }
 
     /**
+     * 采购可入库列表
+     * @return
+     */
+    @PostMapping("/purchaseInStorageList")
+    public List<PurchaseVo> purchaseInStorageList() {
+        return purchaseService.getPurchaseInStorageList();
+    }
+
+    /**
      * 采购终止
      */
     @PostMapping("/purchaseTermination")

+ 51 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseBomSelectDto.java

@@ -4,6 +4,8 @@ import com.ruoyi.common.core.domain.BaseSelectDto;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.List;
+
 /**
  * 采购合同bom列表查询入参实体
  *
@@ -14,4 +16,53 @@ import lombok.Setter;
 @Setter
 public class PurchaseBomSelectDto extends BaseSelectDto {
 
+    /**
+     * 采购合同id
+     */
+    private Long purchaseId;
+
+    /**
+     * bom品名
+     */
+    private String bomName;
+
+    /**
+     * bom品号
+     */
+    private String bomCode;
+
+    /**
+     * 规格品名
+     */
+    private String bomSpecName;
+
+    /**
+     * 规格品号
+     */
+    private String bomSpecCode;
+
+    /**
+     * 种类 字典:bom_species
+     */
+    private String species;
+
+    /**
+     * 颜色
+     */
+    private String colour;
+
+    /**
+     * 售价体系id
+     */
+    private Long priceSystemId;
+
+    /**
+     * bom分类id
+     */
+    private Long bomClassifyId;
+
+    /**
+     * bom分类id
+     */
+    private List<Long> bomClassifyIdList;
 }

+ 13 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseDto.java

@@ -1,9 +1,13 @@
 package com.sd.business.entity.purchase.dto;
 
+import com.fjhx.file.entity.ObsFile;
 import com.sd.business.entity.purchase.po.Purchase;
+import com.sd.business.entity.purchase.po.PurchaseBom;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.List;
+
 /**
  * 采购合同新增编辑入参实体
  *
@@ -14,4 +18,13 @@ import lombok.Setter;
 @Setter
 public class PurchaseDto extends Purchase {
 
+    /**
+     * 采购详情数据
+     */
+    private List<PurchaseBom> purchaseBomList;
+
+    /**
+     * 附件列表
+     */
+    private List<ObsFile> fileList;
 }

+ 19 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseSelectDto.java

@@ -14,4 +14,23 @@ import lombok.Setter;
 @Setter
 public class PurchaseSelectDto extends BaseSelectDto {
 
+    /**
+     * 采购合同编号
+     */
+    private String code;
+
+    /**
+     * 流程状态 0未发起 1进行中 2已通过 3已驳回 4已作废
+     */
+    private Integer flowStatus;
+
+    /**
+     * 供应商名称
+     */
+    private String supplierName;
+
+    /**
+     * 采购状态 0 草稿 10审批中 20采购中 30已采购 40驳回 50已作废 60已终止
+     */
+    private String status;
 }

+ 70 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/vo/PurchaseBomInfoVo.java

@@ -0,0 +1,70 @@
+package com.sd.business.entity.purchase.vo;
+
+import com.sd.business.entity.purchase.po.PurchaseBom;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 采购合同bom列表详情查询返回值实体
+ */
+@Getter
+@Setter
+public class PurchaseBomInfoVo extends PurchaseBom {
+
+    /**
+     * bom id
+     */
+    private Long bomId;
+
+    /**
+     * bom规格品名
+     */
+    private String name;
+
+    /**
+     * bom规格品号
+     */
+    private String code;
+
+    /**
+     * 颜色
+     */
+    private String colour;
+
+    /**
+     * 成本价
+     */
+    private BigDecimal costPrice;
+
+    /**
+     * 对内销售价(含税)
+     */
+    private BigDecimal internalSellingPrice;
+
+    /**
+     * 对外销售价(含税)
+     */
+    private BigDecimal externalSellingPrice;
+
+    /**
+     * 长 cm
+     */
+    private BigDecimal length;
+
+    /**
+     * 宽 cm
+     */
+    private BigDecimal width;
+
+    /**
+     * 高 cm
+     */
+    private BigDecimal height;
+
+    /**
+     * 净重 g
+     */
+    private BigDecimal netWeight;
+}

+ 42 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/vo/PurchaseBomSelectVo.java

@@ -0,0 +1,42 @@
+package com.sd.business.entity.purchase.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 采购合同bom列表查询返回值实体
+ *
+ * @author
+ * @since 2023-08-07
+ */
+@Getter
+@Setter
+public class PurchaseBomSelectVo {
+
+    /**
+     * bom id
+     */
+    private Long bomId;
+
+    /**
+     * bom品号
+     */
+    private String code;
+
+    /**
+     * bom 品名
+     */
+    private String name;
+
+    /**
+     * 种类 字典:bom_species
+     */
+    private String species;
+
+    /**
+     * bom规格信息列表
+     */
+    private List<PurchaseBomInfoVo> bomSpecList;
+}

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

@@ -4,6 +4,8 @@ import com.sd.business.entity.purchase.po.PurchaseBom;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
+
 /**
  * 采购合同bom列表查询返回值实体
  *
@@ -14,4 +16,38 @@ import lombok.Setter;
 @Setter
 public class PurchaseBomVo extends PurchaseBom {
 
+    /**
+     * bom规格编码
+     */
+    private String bomSpecCode;
+
+    /**
+     * bom规格名称
+     */
+    private String bomSpecName;
+
+    /**
+     * bom规格颜色
+     */
+    private String bomSpecColour;
+
+    /**
+     * bom规格长
+     */
+    private BigDecimal bomSpecLength;
+
+    /**
+     * bom规格宽
+     */
+    private BigDecimal bomSpecWidth;
+
+    /**
+     * bom规格高
+     */
+    private BigDecimal bomSpecHeight;
+
+    /**
+     * 在途数量
+     */
+    private BigDecimal inTransitQuantity;
 }

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

@@ -4,6 +4,8 @@ import com.sd.business.entity.purchase.po.Purchase;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.List;
+
 /**
  * 采购合同列表查询返回值实体
  *
@@ -14,4 +16,18 @@ import lombok.Setter;
 @Setter
 public class PurchaseVo extends Purchase {
 
+    /**
+     * 供应商名称
+     */
+    private String supplierName;
+
+    /**
+     * 申购单号
+     */
+    private String applyBuyCode;
+
+    /**
+     * 采购详情数据
+     */
+    private List<PurchaseBomVo> purchaseBomList;
 }

+ 11 - 1
sd-business/src/main/java/com/sd/business/service/apply/impl/ApplyBuyServiceImpl.java

@@ -18,6 +18,7 @@ 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 org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -73,8 +74,9 @@ public class ApplyBuyServiceImpl extends ServiceImpl<ApplyBuyMapper, ApplyBuy> i
                 .selectAs(BomSpec::getWidth, ApplyBuyBomVo::getBomSpecWidth)
                 .selectAs(BomSpec::getHeight, ApplyBuyBomVo::getBomSpecHeight)
                 .from(ApplyBuyBom.class)
+                .innerJoin(ApplyBuy.class, ApplyBuy::getId, ApplyBuyBom::getApplyBuyId)
                 .innerJoin(BomSpec.class, BomSpec::getId, ApplyBuyBom::getBomSpecId)
-                .eq(ApplyBuyBom::getId, id)
+                .eq(ApplyBuy::getId, id)
                 .list();
 
         vo.setApplyBuyBomList(bomVoList);
@@ -82,6 +84,7 @@ public class ApplyBuyServiceImpl extends ServiceImpl<ApplyBuyMapper, ApplyBuy> i
         return vo;
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void add(ApplyBuyDto dto) {
         Long applyBuyId = IdWorker.getId();
@@ -100,9 +103,16 @@ public class ApplyBuyServiceImpl extends ServiceImpl<ApplyBuyMapper, ApplyBuy> i
         applyBuyBomService.saveBatch(applyBuyBomList);
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void edit(ApplyBuyDto dto) {
+        Long applyBuyId = dto.getId();
+
+        List<ApplyBuyBom> applyBuyBomList = dto.getApplyBuyBomList();
+        applyBuyBomList.forEach(item -> item.setApplyBuyId(applyBuyId));
+
         updateById(dto);
+        applyBuyBomService.editLinked(applyBuyBomList, ApplyBuyBom::getApplyBuyId, applyBuyId);
     }
 
     @Override

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

@@ -7,6 +7,7 @@ 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.PurchaseBomSelectVo;
 import com.sd.business.entity.purchase.vo.PurchaseBomVo;
 
 
@@ -23,7 +24,7 @@ public interface PurchaseBomService extends BaseService<PurchaseBom> {
     /**
      * 采购合同bom分页
      */
-    Page<PurchaseBomVo> getPage(PurchaseBomSelectDto dto);
+    Page<PurchaseBomSelectVo> getPage(PurchaseBomSelectDto dto);
 
     /**
      * 采购合同bom明细

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

@@ -53,6 +53,12 @@ public interface PurchaseService extends BaseService<Purchase> {
     void updatePurchaseBomArrivalQuantity(Long purchaseId, List<InOutStorageBom> inOutStorageBomList);
 
     /**
+     * 获取可入库的采购合同列表
+     * @return
+     */
+    List<PurchaseVo> getPurchaseInStorageList();
+
+    /**
      * 采购合同终止
      */
     void purchaseTermination(Long id);

+ 75 - 6
sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseBomServiceImpl.java

@@ -1,7 +1,10 @@
 package com.sd.business.service.purchase.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sd.business.entity.bom.po.Bom;
+import com.sd.business.entity.bom.po.BomClassify;
 import com.sd.business.entity.bom.po.BomSpec;
 import com.sd.business.entity.purchase.dto.PurchaseBomDetailsSelectDto;
 import com.sd.business.entity.purchase.dto.PurchaseBomDto;
@@ -9,13 +12,21 @@ 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.PurchaseBomInfoVo;
+import com.sd.business.entity.purchase.vo.PurchaseBomSelectVo;
 import com.sd.business.entity.purchase.vo.PurchaseBomVo;
 import com.sd.business.mapper.purchase.PurchaseBomMapper;
+import com.sd.business.service.bom.BomClassifyService;
 import com.sd.business.service.purchase.PurchaseBomService;
 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.util.Map;
+import java.util.stream.Collectors;
+
 
 /**
  * <p>
@@ -28,14 +39,72 @@ import org.springframework.stereotype.Service;
 @Service
 public class PurchaseBomServiceImpl extends ServiceImpl<PurchaseBomMapper, PurchaseBom> implements PurchaseBomService {
 
+    @Autowired
+    private BomClassifyService bomClassifyService;
+
     @Override
-    public Page<PurchaseBomVo> getPage(PurchaseBomSelectDto dto) {
+    public Page<PurchaseBomSelectVo> getPage(PurchaseBomSelectDto dto) {
+        List<Long> childrenIdList = null;
+        if (ObjectUtil.isNotNull(dto.getBomClassifyId())) {
+            childrenIdList = bomClassifyService.getChildrenIdList(dto.getBomClassifyId());
+        }
+        if (ObjectUtil.isNotNull(dto.getBomClassifyIdList())) {
+            childrenIdList = bomClassifyService.getChildrenIdList(dto.getBomClassifyIdList());
+        }
+
+        Page<PurchaseBomSelectVo> page = Sql.create(PurchaseBomSelectVo.class)
+                .selectAs(Bom::getId, PurchaseBomSelectVo::getBomId)
+                .select(Bom::getCode)
+                .select(Bom::getName)
+                .select(Bom::getSpecies)
+                .from(PurchaseBom.class)
+                .innerJoin(BomSpec.class, BomSpec::getId, PurchaseBom::getBomSpecId)
+                .innerJoin(Bom.class, Bom::getId, BomSpec::getBomId)
+                .eq(PurchaseBom::getPurchaseId, dto.getPurchaseId())
+                .eq(Bom::getName, dto.getBomName())
+                .like(Bom::getCode, dto.getBomCode())
+                .eq(Bom::getSpecies, dto.getSpecies())
+                .like(BomSpec::getColour, dto.getColour())
+                .like(BomSpec::getCode, dto.getBomSpecCode())
+                .like(BomSpec::getName, dto.getBomSpecName())
+                .in(Bom::getBomClassifyId, childrenIdList)
+                .orderByDesc(PurchaseBom::getId)
+                .groupBy(Bom::getId)
+                .page(dto);
 
-        Page<PurchaseBomVo> page = Sql.create(PurchaseBomVo.class)
+        List<PurchaseBomSelectVo> records = page.getRecords();
+        if (records.isEmpty()) {
+            return page;
+        }
+        List<Long> bomIdList = records.stream().map(PurchaseBomSelectVo::getBomId).collect(Collectors.toList());
+        List<PurchaseBomInfoVo> list = Sql.create(PurchaseBomInfoVo.class)
                 .selectAll(PurchaseBom.class)
+                .selectAs(BomSpec::getId, PurchaseBomInfoVo::getBomSpecId)
+                .select(BomSpec::getBomId)
+                .select(BomSpec::getName)
+                .select(BomSpec::getCode)
+                .select(BomSpec::getColour)
+                .select(BomSpec::getCostPrice)
+                .select(BomSpec::getInternalSellingPrice)
+                .select(BomSpec::getExternalSellingPrice)
+                .select(BomSpec::getLength)
+                .select(BomSpec::getWidth)
+                .select(BomSpec::getHeight)
+                .select(BomSpec::getNetWeight)
                 .from(PurchaseBom.class)
+                .innerJoin(BomSpec.class, BomSpec::getId, PurchaseBom::getBomSpecId)
+                .eq(PurchaseBom::getPurchaseId, dto.getPurchaseId())
+                .in(BomSpec::getBomId, bomIdList)
+                .like(BomSpec::getColour, dto.getColour())
+                .like(BomSpec::getCode, dto.getBomSpecCode())
+                .like(BomSpec::getName, dto.getBomSpecName())
                 .orderByDesc(PurchaseBom::getId)
-                .page(dto);
+                .list();
+
+        Map<Long, List<PurchaseBomInfoVo>> bomSpecIdMap = list.stream().collect(Collectors.groupingBy(PurchaseBomInfoVo::getBomId));
+        for (PurchaseBomSelectVo record : records) {
+            record.setBomSpecList(bomSpecIdMap.get(record.getBomId()));
+        }
 
         return page;
     }
@@ -84,9 +153,9 @@ public class PurchaseBomServiceImpl extends ServiceImpl<PurchaseBomMapper, Purch
                 .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())
+                .like(Purchase::getCode, dto.getPurchaseCode())
+                .like(BomSpec::getCode, dto.getBomSpecCode())
+                .like(BomSpec::getName, dto.getBomSpecName())
                 .orderByDesc(PurchaseBom::getId)
                 .page(dto);
 

+ 192 - 7
sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseServiceImpl.java

@@ -2,13 +2,19 @@ package com.sd.business.service.purchase.impl;
 
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.file.utils.ObsFileUtil;
 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.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.apply.po.ApplyBuy;
+import com.sd.business.entity.apply.po.ApplyBuyBom;
 import com.sd.business.entity.bom.po.BomSpec;
 import com.sd.business.entity.in.po.InOutStorageBom;
 import com.sd.business.entity.purchase.dto.PurchaseBomImportDataDto;
@@ -17,9 +23,11 @@ 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.PurchaseBomVo;
 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.apply.ApplyBuyBomService;
 import com.sd.business.service.bom.BomSpecService;
 import com.sd.business.service.purchase.PurchaseBomService;
 import com.sd.business.service.purchase.PurchaseService;
@@ -32,10 +40,7 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -51,6 +56,9 @@ import java.util.stream.Collectors;
 public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> implements PurchaseService {
 
     @Autowired
+    private ApplyBuyBomService applyBuyBomService;
+
+    @Autowired
     private PurchaseBomService purchaseBomService;
 
     @Autowired
@@ -64,10 +72,46 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
 
         Page<PurchaseVo> page = Sql.create(PurchaseVo.class)
                 .selectAll(Purchase.class)
+                .selectAs(Supplier::getName, PurchaseVo::getSupplierName)
+                .selectAs(ApplyBuy::getCode, PurchaseVo::getApplyBuyCode)
                 .from(Purchase.class)
+                .leftJoin(Supplier.class, Supplier::getId, Purchase::getSupplierId)
+                .leftJoin(ApplyBuy.class, ApplyBuy::getId, Purchase::getApplyBuyId)
+                .eq(Purchase::getFlowStatus, dto.getFlowStatus())
+                .eq(Purchase::getStatus, dto.getStatus())
+                .eq(Supplier::getName, dto.getSupplierName())
+                .and(StrUtil.isNotBlank(dto.getCode()),
+                        q -> q.like(Purchase::getCode, dto.getCode())
+                                .or().like(Purchase::getErpCode, dto.getCode()))
                 .orderByDesc(Purchase::getId)
                 .page(dto);
 
+        List<PurchaseVo> records = page.getRecords();
+        if (records.size() == 0) {
+            return page;
+        }
+
+        // 赋值采购明细
+        List<Long> idList = records.stream().map(PurchaseVo::getId).collect(Collectors.toList());
+        List<PurchaseBomVo> purchaseBomVoList = Sql.create(PurchaseBomVo.class)
+                .selectAll(PurchaseBom.class)
+                .selectAs(BomSpec::getCode, PurchaseBomVo::getBomSpecCode)
+                .selectAs(BomSpec::getName, PurchaseBomVo::getBomSpecName)
+                .selectAs(BomSpec::getColour, PurchaseBomVo::getBomSpecColour)
+                .selectAs(BomSpec::getLength, PurchaseBomVo::getBomSpecLength)
+                .selectAs(BomSpec::getWidth, PurchaseBomVo::getBomSpecWidth)
+                .selectAs(BomSpec::getHeight, PurchaseBomVo::getBomSpecHeight)
+                .from(PurchaseBom.class)
+                .innerJoin(Purchase.class, Purchase::getId, PurchaseBom::getPurchaseId)
+                .innerJoin(BomSpec.class, BomSpec::getId, PurchaseBom::getBomSpecId)
+                .in(Purchase::getId, idList)
+                .list();
+
+        Map<Long, List<PurchaseBomVo>> map = purchaseBomVoList.stream().collect(Collectors.groupingBy(PurchaseBom::getPurchaseId));
+        for (PurchaseVo record : records) {
+            record.setPurchaseBomList(map.getOrDefault(record.getId(), Collections.emptyList()));
+        }
+
         return page;
     }
 
@@ -82,22 +126,146 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
 
         Assert.notNull(vo, "未知数据");
 
+        List<PurchaseBomVo> purchaseBomVoList = Sql.create(PurchaseBomVo.class)
+                .selectAll(PurchaseBom.class)
+                .selectAs(BomSpec::getCode, PurchaseBomVo::getBomSpecCode)
+                .selectAs(BomSpec::getName, PurchaseBomVo::getBomSpecName)
+                .selectAs(BomSpec::getColour, PurchaseBomVo::getBomSpecColour)
+                .selectAs(BomSpec::getLength, PurchaseBomVo::getBomSpecLength)
+                .selectAs(BomSpec::getWidth, PurchaseBomVo::getBomSpecWidth)
+                .selectAs(BomSpec::getHeight, PurchaseBomVo::getBomSpecHeight)
+                .selectAs("t1.purchase_quantity - t1.arrival_quantity + t1.return_quantity", PurchaseBomVo::getInTransitQuantity)
+                .from(PurchaseBom.class)
+                .innerJoin(Purchase.class, Purchase::getId, PurchaseBom::getPurchaseId)
+                .innerJoin(BomSpec.class, BomSpec::getId, PurchaseBom::getBomSpecId)
+                .eq(Purchase::getId, id)
+                .list();
+
+        vo.setPurchaseBomList(purchaseBomVoList);
+
         return vo;
     }
 
+    @DSTransactional
     @Override
     public void add(PurchaseDto dto) {
-        save(dto);
+
+        // 保存采购合同
+        dto.setCode(CodeEnum.PURCHASE_CODE.getCode());
+        dto.setReturnAmount(BigDecimal.ZERO);
+        dto.setClosedAccountAmount(BigDecimal.ZERO);
+        dto.setDeductibleAmount(BigDecimal.ZERO);
+        dto.setPaymentStatus(StatusConstant.NO);
+        dto.setStorageStatus(StatusConstant.NO);
+        this.save(dto);
+
+        // 保存采购明细
+        Map<Long, ApplyBuyBom> applyBuyBomMap = applyBuyBomService.mapKEntity(
+                BaseIdPo::getId,
+                q -> q.eq(ApplyBuyBom::getApplyBuyId, dto.getApplyBuyId()));
+        List<PurchaseBom> purchaseBomList = dto.getPurchaseBomList();
+        purchaseBomList.forEach(item -> {
+            ApplyBuyBom applyBuyBom = applyBuyBomMap.get(item.getApplyBuyBomId());
+            if (applyBuyBom == null) {
+                throw new ServiceException("存在未知申购明细id");
+            }
+
+            BigDecimal quantity = applyBuyBom.getQuantity();
+            BigDecimal purchaseQuantity = applyBuyBom.getPurchaseQuantity();
+            BigDecimal frozenQuantity = applyBuyBom.getFrozenQuantity();
+            BigDecimal itemPurchaseQuantity = item.getPurchaseQuantity();
+
+            if (quantity.compareTo(purchaseQuantity.add(frozenQuantity).add(itemPurchaseQuantity)) >= 0) {
+                applyBuyBom.setFrozenQuantity(frozenQuantity.add(itemPurchaseQuantity));
+            } else {
+                throw new ServiceException("采购数量超过申购数量");
+            }
+
+            item.setPurchaseId(dto.getId());
+            item.setReturnQuantity(BigDecimal.ZERO);
+            item.setPaidAmount(BigDecimal.ZERO);
+        });
+        purchaseBomService.saveBatch(purchaseBomList);
+
+        // 更新申购明细
+        ArrayList<ApplyBuyBom> applyBuyBomList = new ArrayList<>(applyBuyBomMap.values());
+        applyBuyBomService.updateBatchById(applyBuyBomList);
+
+        ObsFileUtil.saveFile(dto.getFileList(), dto.getId());
     }
 
+    @DSTransactional
     @Override
     public void edit(PurchaseDto dto) {
-        updateById(dto);
+
+        dto.setCode(null);
+
+        // 保存采购合同
+        this.updateById(dto);
+
+        Map<Long, ApplyBuyBom> applyBuyBomMap = applyBuyBomService.mapKEntity(
+                BaseIdPo::getId,
+                q -> q.eq(ApplyBuyBom::getApplyBuyId, dto.getApplyBuyId()));
+
+        Map<Long, PurchaseBom> purchaseBomMap = purchaseBomService.mapKEntity(
+                BaseIdPo::getId,
+                q -> q.eq(PurchaseBom::getPurchaseId, dto.getId()));
+
+        List<PurchaseBom> purchaseBomList = dto.getPurchaseBomList();
+        purchaseBomList.forEach(item -> {
+            item.setPurchaseId(dto.getId());
+
+            ApplyBuyBom applyBuyBom = applyBuyBomMap.get(item.getApplyBuyBomId());
+            if (applyBuyBom == null) {
+                throw new ServiceException("存在未知申购明细id");
+            }
+
+            BigDecimal quantity = applyBuyBom.getQuantity();
+            BigDecimal purchaseQuantity = applyBuyBom.getPurchaseQuantity();
+            BigDecimal frozenQuantity = applyBuyBom.getFrozenQuantity();
+            BigDecimal itemPurchaseQuantity = item.getPurchaseQuantity();
+
+            if (item.getId() != null) {
+                PurchaseBom purchaseBom = purchaseBomMap.get(item.getId());
+                if (purchaseBom == null) {
+                    throw new ServiceException("存在未知采购明细id");
+                }
+                frozenQuantity = frozenQuantity.subtract(purchaseBom.getPurchaseQuantity());
+            }
+
+            if (quantity.compareTo(purchaseQuantity.add(frozenQuantity).add(itemPurchaseQuantity)) >= 0) {
+                applyBuyBom.setFrozenQuantity(frozenQuantity.add(itemPurchaseQuantity));
+            } else {
+                throw new ServiceException("采购数量超过申购数量");
+            }
+
+        });
+        purchaseBomService.editLinked(purchaseBomList, PurchaseBom::getPurchaseId, dto.getId());
+
+        ObsFileUtil.editFile(dto.getFileList(), dto.getId());
     }
 
     @Override
     public void delete(Long id) {
-        removeById(id);
+        this.removeById(id);
+
+        Map<Long, PurchaseBom> purchaseBomMap = purchaseBomService.mapKEntity(
+                PurchaseBom::getApplyBuyBomId,
+                q -> q.eq(PurchaseBom::getPurchaseId, id));
+
+        List<ApplyBuyBom> applyBuyBomList = applyBuyBomService.list(q -> q.eq(ApplyBuyBom::getApplyBuyId, id));
+        applyBuyBomList.forEach(item -> {
+            PurchaseBom purchaseBom = purchaseBomMap.get(item.getId());
+            if (purchaseBom == null) {
+                return;
+            }
+            item.setFrozenQuantity(item.getFrozenQuantity().subtract(purchaseBom.getPurchaseQuantity()));
+        });
+        applyBuyBomService.updateBatchById(applyBuyBomList);
+
+        purchaseBomService.remove(q -> q.eq(PurchaseBom::getPurchaseId, id));
+
+        ObsFileUtil.removeFile(id);
     }
 
     @Override
@@ -135,6 +303,23 @@ public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> i
     }
 
     @Override
+    public List<PurchaseVo> getPurchaseInStorageList() {
+        List<PurchaseVo> list = Sql.create(PurchaseVo.class)
+                .selectAll(Purchase.class)
+                .selectAs(Supplier::getName, PurchaseVo::getSupplierName)
+                .selectAs(ApplyBuy::getCode, PurchaseVo::getApplyBuyCode)
+                .from(Purchase.class)
+                .leftJoin(Supplier.class, Supplier::getId, Purchase::getSupplierId)
+                .leftJoin(ApplyBuy.class, ApplyBuy::getId, Purchase::getApplyBuyId)
+                .eq(Purchase::getFlowStatus, FlowStatusEnum.PASS.getKey())
+                .eq(Purchase::getStorageStatus, StatusConstant.NO)
+                .eq(Purchase::getStatus, PurchaseStatusEnum.UNDER_PURCHASE.getKey())
+                .orderByDesc(Purchase::getId)
+                .list();
+        return list;
+    }
+
+    @Override
     public void purchaseTermination(Long id) {
         Purchase purchase = this.getById(id);
         if (purchase == null) {