Parcourir la source

Merge remote-tracking branch 'origin/master'

24282 il y a 1 an
Parent
commit
d8ab3610aa

+ 31 - 0
sd-business/src/main/java/com/sd/business/controller/purchase/purchaseBomBoardController.java

@@ -0,0 +1,31 @@
+package com.sd.business.controller.purchase;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sd.business.entity.purchase.dto.PurchaseBoardSelectDto;
+import com.sd.business.entity.purchase.vo.PurchaseBomBoardVo;
+import com.sd.business.service.purchase.PurchaseBomService;
+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;
+
+/**
+ * 采购看板
+ */
+@RestController
+@RequestMapping("/purchaseBomBoard")
+public class purchaseBomBoardController {
+
+    @Autowired
+    private PurchaseBomService purchaseBomService;
+
+
+    /**
+     * 采购看板 分页
+     */
+    @PostMapping("/page")
+    public Page<PurchaseBomBoardVo> page(@RequestBody PurchaseBoardSelectDto dto) {
+        return purchaseBomService.getPurchaseBoardPage(dto);
+    }
+}

+ 8 - 0
sd-business/src/main/java/com/sd/business/entity/bom/dto/BomSpecSelectDto.java

@@ -13,5 +13,13 @@ import lombok.Setter;
 @Getter
 @Setter
 public class BomSpecSelectDto extends BaseSelectDto {
+    /**
+     * 名称
+     */
+    private String name;
 
+    /**
+     * 品号
+     */
+    private String code;
 }

+ 23 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/dto/PurchaseBoardSelectDto.java

@@ -0,0 +1,23 @@
+package com.sd.business.entity.purchase.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 采购看板入参实体
+ */
+@Getter
+@Setter
+public class PurchaseBoardSelectDto extends BaseSelectDto {
+
+    /**
+     * 规格品名
+     */
+    private String bomSpecName;
+
+    /**
+     * 规格品号
+     */
+    private String bomSpecCode;
+}

+ 81 - 0
sd-business/src/main/java/com/sd/business/entity/purchase/vo/PurchaseBomBoardVo.java

@@ -0,0 +1,81 @@
+package com.sd.business.entity.purchase.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 采购看板返回值实体
+ */
+@Getter
+@Setter
+public class PurchaseBomBoardVo {
+
+
+    /**
+     * bomSpec id
+     */
+    private Long bomSpecId;
+
+    /**
+     * 规格品名
+     */
+    private String bomSpecName;
+
+    /**
+     * 规格品号
+     */
+    private String bomSpecCode;
+
+    /**
+     * 当前库存数量
+     */
+    private BigDecimal inventoryQuantity;
+
+    /**
+     * 安全库存数量
+     */
+    private BigDecimal safetyInventoryQuantity;
+
+
+    /**
+     * 消耗数量近七天
+     */
+    private BigDecimal outStorageQuantitySevenDays;
+
+    /**
+     * 消耗数量近十五天
+     */
+    private BigDecimal outStorageQuantityFifteenDays;
+
+    /**
+     * 消耗数量近三十天
+     */
+    private BigDecimal outStorageQuantityThirtyDays;
+
+    /**
+     * 消耗数量近六十天
+     */
+    private BigDecimal outStorageQuantitySixtyDays;
+
+    /**
+     * 周环比消量
+     */
+    private BigDecimal outStorageWeekOnWeekRatio;
+
+    /**
+     * 预计消耗天
+     */
+    private Integer predictOutStorageDays;
+
+    /**
+     * 在途总数
+     */
+    private BigDecimal inTransitSum;
+
+    /**
+     * 下一批到货天数
+     */
+    private Integer nextDeliveryDays;
+}

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

@@ -6,6 +6,9 @@ import lombok.Setter;
 
 import java.math.BigDecimal;
 
+/**
+ * 采购合同bom列表详情查询返回值实体
+ */
 @Getter
 @Setter
 public class PurchaseBomInfoVo extends PurchaseBom {

+ 8 - 0
sd-business/src/main/java/com/sd/business/mapper/in/InOutStorageMapper.java

@@ -7,6 +7,8 @@ import com.sd.business.entity.in.po.InOutStorage;
 import com.sd.business.entity.in.vo.InOutStorageVo;
 import org.apache.ibatis.annotations.Param;
 
+import java.math.BigDecimal;
+
 
 /**
  * <p>
@@ -23,4 +25,10 @@ public interface InOutStorageMapper extends BaseMapper<InOutStorage> {
      */
     Page<InOutStorageVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<InOutStorage> wrapper);
 
+    /**
+     * 查询bom消耗量
+     * @param wrapper
+     * @return
+     */
+    BigDecimal getOutStorageQuantity(@Param("ew") IWrapper<InOutStorage> wrapper);
 }

+ 16 - 0
sd-business/src/main/java/com/sd/business/mapper/purchase/PurchaseBomMapper.java

@@ -10,6 +10,8 @@ import com.sd.business.entity.purchase.vo.PurchaseBomVo;
 import com.sd.business.entity.purchase.vo.PurchaseInTransitBomVo;
 import org.apache.ibatis.annotations.Param;
 
+import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 
 
@@ -47,4 +49,18 @@ public interface PurchaseBomMapper extends BaseMapper<PurchaseBom> {
      * @return
      */
     List<PurchaseBomInfoVo> getPurchaseBomInfoList(@Param("ew") IWrapper<PurchaseBom> wrapper);
+
+    /**
+     * 获取在途总数
+     * @param wrapper
+     * @return
+     */
+    BigDecimal getPurchaseBomInTransitSum(@Param("ew") IWrapper<PurchaseBom> wrapper);
+
+    /**
+     * 获取采购bom的到货时间
+     * @param wrapper
+     * @return
+     */
+    Date getPurchaseBomDeliveryDate(@Param("ew") IWrapper<PurchaseBom> wrapper);
 }

+ 2 - 0
sd-business/src/main/java/com/sd/business/service/bom/impl/BomSpecServiceImpl.java

@@ -27,6 +27,8 @@ public class BomSpecServiceImpl extends ServiceImpl<BomSpecMapper, BomSpec> impl
     @Override
     public Page<BomSpecVo> getPage(BomSpecSelectDto dto) {
         IWrapper<BomSpec> wrapper = getWrapper();
+        wrapper.like("bs", BomSpec::getName, dto.getName());
+        wrapper.like("bs", BomSpec::getCode, dto.getCode());
         wrapper.orderByDesc("bs", BomSpec::getId);
         Page<BomSpecVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
         return page;

+ 8 - 0
sd-business/src/main/java/com/sd/business/service/in/InOutStorageService.java

@@ -8,6 +8,8 @@ import com.sd.business.entity.in.dto.InOutStorageSelectDto;
 import com.sd.business.entity.in.po.InOutStorage;
 import com.sd.business.entity.in.vo.InOutStorageVo;
 
+import java.math.BigDecimal;
+
 
 /**
  * <p>
@@ -39,4 +41,10 @@ public interface InOutStorageService extends BaseService<InOutStorage> {
      */
     void addAllot(AddAllotDto dto);
 
+    /**
+     * 查询bom消耗数量
+     * @param bomSpecId
+     * @param days 天数
+     */
+    BigDecimal getOutStorageQuantityByBomSpecIdAndDays(Long bomSpecId, Integer days);
 }

+ 15 - 1
sd-business/src/main/java/com/sd/business/service/in/impl/InOutStorageServiceImpl.java

@@ -1,6 +1,7 @@
 package com.sd.business.service.in.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -26,6 +27,8 @@ 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.Date;
 import java.util.List;
 
 
@@ -120,4 +123,15 @@ public class InOutStorageServiceImpl extends ServiceImpl<InOutStorageMapper, InO
         add(outStorageDto);
     }
 
-}
+    @Override
+    public BigDecimal getOutStorageQuantityByBomSpecIdAndDays(Long bomSpecId, Integer days) {
+        Date date = DateUtil.date();
+        Date offsetDay = DateUtil.offsetDay(date, -days);
+        IWrapper<InOutStorage> wrapper = getWrapper();
+        wrapper.eq("ios", InOutStorage::getType, InOutTypeEnum.OUT.getKey());
+        wrapper.eq("ios", InOutStorage::getDetailType, OutDetailTypeEnum.PRODUCTION.getKey());
+        wrapper.eq("iosb", InOutStorageBom::getBomSpecId, bomSpecId);
+        wrapper.ge("iosb", InOutStorageBom::getCreateTime, offsetDay);
+        return this.baseMapper.getOutStorageQuantity(wrapper);
+    }
+}

+ 9 - 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.PurchaseBoardSelectDto;
 import com.sd.business.entity.purchase.dto.PurchaseBomSelectDto;
 import com.sd.business.entity.purchase.dto.PurchaseInTransitBomSelectDto;
 import com.sd.business.entity.purchase.po.PurchaseBom;
+import com.sd.business.entity.purchase.vo.PurchaseBomBoardVo;
 import com.sd.business.entity.purchase.vo.PurchaseBomSelectVo;
 import com.sd.business.entity.purchase.vo.PurchaseBomVo;
 import com.sd.business.entity.purchase.vo.PurchaseInTransitBomVo;
@@ -41,4 +43,11 @@ public interface PurchaseBomService extends BaseService<PurchaseBom> {
      * @return
      */
     Page<PurchaseInTransitBomVo> getPurchaseInTransitBomPage(PurchaseInTransitBomSelectDto dto);
+
+    /**
+     * 采购看板 分页
+     * @param dto
+     * @return
+     */
+    Page<PurchaseBomBoardVo> getPurchaseBoardPage(PurchaseBoardSelectDto dto);
 }

+ 110 - 5
sd-business/src/main/java/com/sd/business/service/purchase/impl/PurchaseBomServiceImpl.java

@@ -1,28 +1,38 @@
 package com.sd.business.service.purchase.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.constant.StatusConstant;
 import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.bom.dto.BomSpecSelectDto;
 import com.sd.business.entity.bom.po.Bom;
 import com.sd.business.entity.bom.po.BomSpec;
+import com.sd.business.entity.bom.vo.BomSpecVo;
+import com.sd.business.entity.inventory.po.Inventory;
+import com.sd.business.entity.purchase.dto.PurchaseBoardSelectDto;
 import com.sd.business.entity.purchase.dto.PurchaseBomSelectDto;
 import com.sd.business.entity.purchase.dto.PurchaseInTransitBomSelectDto;
 import com.sd.business.entity.purchase.po.Purchase;
 import com.sd.business.entity.purchase.po.PurchaseBom;
-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.entity.purchase.vo.PurchaseInTransitBomVo;
+import com.sd.business.entity.purchase.vo.*;
 import com.sd.business.mapper.purchase.PurchaseBomMapper;
 import com.sd.business.service.bom.BomClassifyService;
 import com.sd.business.service.bom.BomSpecService;
+import com.sd.business.service.in.InOutStorageService;
+import com.sd.business.service.inventory.InventoryService;
 import com.sd.business.service.purchase.PurchaseBomService;
 import com.sd.framework.util.Assert;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -45,6 +55,11 @@ public class PurchaseBomServiceImpl extends ServiceImpl<PurchaseBomMapper, Purch
     @Autowired
     private BomClassifyService bomClassifyService;
 
+    @Autowired
+    private InOutStorageService inOutStorageService;
+
+    @Autowired
+    private InventoryService inventoryService;
 
     @Override
     public Page<PurchaseBomSelectVo> getPage(PurchaseBomSelectDto dto) {
@@ -113,7 +128,97 @@ public class PurchaseBomServiceImpl extends ServiceImpl<PurchaseBomMapper, Purch
         wrapper.like("bs", BomSpec::getCode, dto.getBomSpecCode());
         wrapper.like("bs", BomSpec::getName, dto.getBomSpecName());
         wrapper.apply("pb.purchase_quantity > pb.arrival_quantity");
-        wrapper.orderByAsc("p", PurchaseInTransitBomVo::getDeliveryDate);
+        wrapper.orderByAsc("bs", BomSpec::getCode)
+                .orderByDesc("bs", BomSpec::getLength)
+                .orderByAsc("bs", BomSpec::getWidth)
+                .orderByDesc("bs", BomSpec::getHeight);
         return this.baseMapper.getPurchaseInTransitBomPage(dto.getPage(), wrapper);
     }
+
+    @Override
+    public Page<PurchaseBomBoardVo> getPurchaseBoardPage(PurchaseBoardSelectDto dto) {
+        BomSpecSelectDto bomSpecSelectDto = new BomSpecSelectDto();
+        bomSpecSelectDto.setName(dto.getBomSpecName());
+        bomSpecSelectDto.setCode(dto.getBomSpecCode());
+        Page<BomSpecVo> bomSpecVoPage = bomSpecService.getPage(bomSpecSelectDto);
+        List<BomSpecVo> records = bomSpecVoPage.getRecords();
+        Page<PurchaseBomBoardVo> page = new Page<>();
+        page.setSize(bomSpecVoPage.getSize());
+        page.setTotal(bomSpecVoPage.getTotal());
+        List<PurchaseBomBoardVo> list = new ArrayList<>();
+        for (BomSpecVo record : records) {
+            PurchaseBomBoardVo purchaseBomBoard = new PurchaseBomBoardVo();
+            Long bomSpecId = record.getId();
+            Inventory inventory = inventoryService.getOne(q -> q.eq(Inventory::getBomSpecId, bomSpecId));
+
+            // 当前库存数
+            BigDecimal inventoryQuantity = ObjectUtil.isEmpty(inventory) ? new BigDecimal("0") : inventory.getQuantity();
+            // 近7天消耗量
+            BigDecimal quantitySevenDays = inOutStorageService.getOutStorageQuantityByBomSpecIdAndDays(record.getId(), 7);
+            // 近30天消耗量
+            BigDecimal quantityThirtyDays = inOutStorageService.getOutStorageQuantityByBomSpecIdAndDays(record.getId(), 30);
+
+            // 40天安全库存
+            BigDecimal safetyInventoryQuantity = quantityThirtyDays.divide(new BigDecimal("30"), 2, RoundingMode.HALF_UP)
+                    .multiply(new BigDecimal("40")).setScale(0, RoundingMode.HALF_UP);
+
+
+            // 近14天消耗量
+            BigDecimal quantityTwoWeek = inOutStorageService.getOutStorageQuantityByBomSpecIdAndDays(record.getId(), 14);
+            // 近两周减去近一周的消耗量为上周数量
+            BigDecimal quantityLastWeek = quantityTwoWeek.subtract(quantitySevenDays);
+            // 周环比率
+            BigDecimal weekOnWeekRatio;
+            if (quantityLastWeek.compareTo(BigDecimal.ZERO) == 0) {
+                weekOnWeekRatio = quantitySevenDays;
+            } else {
+                weekOnWeekRatio = quantitySevenDays.subtract(quantityLastWeek).divide(quantityLastWeek, 2, RoundingMode.HALF_UP);
+            }
+
+            // 预计消耗天数
+            int predictOutStorageDays = 0;
+            if (quantitySevenDays.compareTo(BigDecimal.ZERO) != 0) {
+                predictOutStorageDays = inventoryQuantity.divide(quantitySevenDays
+                        .divide(new BigDecimal("7"), 2, RoundingMode.HALF_UP), 2, RoundingMode.HALF_UP).intValue();
+            }
+
+            // 获取在途总数
+            IWrapper<PurchaseBom> wrapper = getWrapper();
+            wrapper.eq("pb", PurchaseBom::getBomSpecId, bomSpecId);
+            wrapper.apply("pb.purchase_quantity > pb.arrival_quantity");
+            purchaseBomBoard.setInTransitSum(this.baseMapper.getPurchaseBomInTransitSum(wrapper));
+
+            // 获取下一批到货天数
+            wrapper = IWrapper.getWrapper();
+            Date date = new Date();
+            wrapper.eq("pb", PurchaseBom::getBomSpecId, bomSpecId);
+            wrapper.apply("pb.purchase_quantity > pb.arrival_quantity");
+            wrapper.eq("p", Purchase::getStorageStatus, StatusConstant.NO);
+            wrapper.gt("p", Purchase::getDeliveryDate, date);
+            wrapper.orderByAsc("p", Purchase::getDeliveryDate);
+            wrapper.last("limit 1");
+            Date deliveryDate = this.baseMapper.getPurchaseBomDeliveryDate(wrapper);
+            long nextDeliveryDays = 0L;
+            if (ObjectUtil.isNotEmpty(deliveryDate)) {
+                nextDeliveryDays = DateUtil.between(date, deliveryDate, DateUnit.DAY);
+            }
+
+            // 赋值
+            purchaseBomBoard.setBomSpecName(record.getName());
+            purchaseBomBoard.setBomSpecCode(record.getCode());
+            purchaseBomBoard.setBomSpecId(bomSpecId);
+            purchaseBomBoard.setInventoryQuantity(inventoryQuantity);
+            purchaseBomBoard.setPredictOutStorageDays(predictOutStorageDays);
+            purchaseBomBoard.setSafetyInventoryQuantity(safetyInventoryQuantity);
+            purchaseBomBoard.setOutStorageQuantitySevenDays(quantitySevenDays);
+            purchaseBomBoard.setOutStorageQuantityThirtyDays(quantityThirtyDays);
+            purchaseBomBoard.setOutStorageQuantityFifteenDays(inOutStorageService.getOutStorageQuantityByBomSpecIdAndDays(record.getId(), 15));
+            purchaseBomBoard.setOutStorageQuantitySixtyDays(inOutStorageService.getOutStorageQuantityByBomSpecIdAndDays(record.getId(), 60));
+            purchaseBomBoard.setOutStorageWeekOnWeekRatio(weekOnWeekRatio);
+            purchaseBomBoard.setNextDeliveryDays((int) nextDeliveryDays);
+            list.add(purchaseBomBoard);
+        }
+        page.setRecords(list);
+        return page;
+    }
 }

+ 8 - 0
sd-business/src/main/resources/mapper/in/InOutStorageMapper.xml

@@ -26,4 +26,12 @@
             ${ew.customSqlSegment}
     </select>
 
+    <select id="getOutStorageQuantity" resultType="java.math.BigDecimal">
+        select
+            ifnull(sum(iosb.quantity), 0)
+        from in_out_storage ios
+                 left join in_out_storage_bom iosb on ios.id = iosb.in_out_storage_id
+            ${ew.customSqlSegment}
+    </select>
+
 </mapper>

+ 18 - 0
sd-business/src/main/resources/mapper/purchase/PurchaseBomMapper.xml

@@ -90,4 +90,22 @@
             LEFT JOIN supplier s on p.supplier_id = s.id
             ${ew.customSqlSegment}
     </select>
+
+    <select id="getPurchaseBomInTransitSum" resultType="java.math.BigDecimal">
+        select
+            ifnull(sum(pb.purchase_quantity - pb.arrival_quantity), 0)
+        from
+            purchase_bom pb
+            ${ew.customSqlSegment}
+    </select>
+
+    <select id="getPurchaseBomDeliveryDate" resultType="java.util.Date">
+        select
+            p.delivery_date
+        from
+            purchase_bom pb
+            LEFT JOIN purchase p on pb.purchase_id = p.id
+            ${ew.customSqlSegment}
+    </select>
+
 </mapper>

+ 1 - 1
sd-starter/src/test/java/A5_SyncApplyBuyTest.java

@@ -52,7 +52,7 @@ public class A5_SyncApplyBuyTest {
                 "\t subscriber_name applyName,\n" +
                 "\t subscription_time applyTime,\n" +
                 "\t subscription_remarks remark,\n" +
-                "\t IF(status = '30','2','4') flowStatus,\n" +
+                "\t IF(status = '30','2','10') flowStatus,\n" +
                 "\t create_time createTime,\n" +
                 "\t update_time updateTime\n" +
                 "\t\n" +