浏览代码

杰生重构

home 2 年之前
父节点
当前提交
f2c2daa44c

+ 17 - 0
hx-common/common-tool/src/main/java/com/fjhx/utils/BigDecimalUtil.java

@@ -103,6 +103,23 @@ public class BigDecimalUtil {
         return objToBigDecimal(v1).compareTo(objToBigDecimal(v2)) == 0;
     }
 
+    /**
+     * 取最大值
+     */
+    public static BigDecimal max(Object v1, Object v2) {
+        BigDecimal b1 = objToBigDecimal(v1);
+        BigDecimal b2 = objToBigDecimal(v2);
+        return b1.compareTo(b2) >= 0 ? b1 : b2;
+    }
+
+    /**
+     * 取最小值
+     */
+    public static BigDecimal min(Object v1, Object v2) {
+        BigDecimal b1 = objToBigDecimal(v1);
+        BigDecimal b2 = objToBigDecimal(v2);
+        return b1.compareTo(b2) >= 0 ? b2 : b1;
+    }
 
     /*
      * ==============================================================================================

+ 10 - 0
hx-service-api/storage-restructure-api/src/main/java/com/fjhx/entity/water/WaterTag.java

@@ -47,6 +47,16 @@ public class WaterTag extends StorageBaseEntity {
     private String rfidCode;
 
     /**
+     * 合同id
+     */
+    private Long contractId;
+
+    /**
+     * 合同明细id
+     */
+    private Long contractDetailsId;
+
+    /**
      * 合同批次id
      */
     private Long waterBatchId;

+ 3 - 3
hx-service-api/storage-restructure-api/src/main/java/com/fjhx/enums/DeviceTypeEnum.java

@@ -12,9 +12,9 @@ import java.util.List;
 @Getter
 public enum DeviceTypeEnum {
 
-    ISSUE(20, "出库"),
-    INVENTORY_LOSS(21, "盘亏"),
-    CORRECT(22, "数量减少修正");
+    HANDHELD_MACHINE(0, "一体机"),
+    INTEGRATED_MACHINE(1, "手持机"),
+    WEB(2, "web端");
 
     private final Integer type;
     private final String name;

+ 11 - 0
hx-service/storage-restructure/src/main/java/com/fjhx/service/stock/StockService.java

@@ -2,6 +2,9 @@ package com.fjhx.service.stock;
 
 import com.fjhx.base.StorageBaseService;
 import com.fjhx.entity.stock.Stock;
+import com.fjhx.entity.water.WaterTag;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +16,12 @@ import com.fjhx.entity.stock.Stock;
  */
 public interface StockService extends StorageBaseService<Stock> {
 
+    /**
+     * 跟新库存
+     *
+     * @param typeEnum     出入库类型枚举
+     * @param waterTagList 变更标签列表
+     */
+    void edit(Enum<?> typeEnum, List<WaterTag> waterTagList);
+
 }

+ 70 - 0
hx-service/storage-restructure/src/main/java/com/fjhx/service/stock/impl/StockServiceImpl.java

@@ -1,11 +1,21 @@
 package com.fjhx.service.stock.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.constants.StatusConstant;
 import com.fjhx.entity.stock.Stock;
+import com.fjhx.entity.water.WaterTag;
+import com.fjhx.enums.InTypeEnum;
 import com.fjhx.mapper.stock.StockMapper;
 import com.fjhx.service.stock.StockService;
+import com.fjhx.utils.BigDecimalUtil;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 /**
  * <p>
  * 库存表 服务实现类
@@ -17,4 +27,64 @@ import org.springframework.stereotype.Service;
 @Service
 public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements StockService {
 
+    @Override
+    public synchronized void edit(Enum<?> typeEnum, List<WaterTag> waterTagList) {
+
+        // 标签按物料id分组,统计出改变件数和数量
+        Map<Long, Stock> changeStockMap = waterTagList.stream().collect(Collectors.toMap(
+                WaterTag::getMaterialId,
+                item -> {
+                    Stock stock = new Stock();
+                    stock.setMaterialId(item.getMaterialId());
+                    stock.setNumber(1);
+                    stock.setQuantity(stock.getQuantity());
+                    return stock;
+                },
+                (v1, v2) -> {
+                    v1.setNumber(v1.getNumber() + v2.getNumber());
+                    v1.setQuantity(v1.getQuantity().add(v2.getQuantity()));
+                    return v1;
+                }
+        ));
+
+        Set<Long> changeMaterialId = changeStockMap.keySet();
+
+        // 获取库存信息
+        List<Stock> stockList = listByIds(changeMaterialId);
+        // 库存信息
+        Map<Long, Stock> stockMap = stockList.stream().collect(Collectors.toMap(Stock::getMaterialId, item -> item));
+
+        // 循环改变物料信息
+        for (Stock item : changeStockMap.values()) {
+            Long materialId = item.getMaterialId();
+
+            // 获取库存信息
+            Stock stock = stockMap.get(materialId);
+
+            // 如果是入库
+            if (typeEnum instanceof InTypeEnum) {
+                if (stock != null) {
+                    stock.setQuantity(stock.getQuantity().add(item.getQuantity()));
+                    stock.setNumber(stock.getNumber() + item.getNumber());
+                } else {
+                    item.setCheckStatus(StatusConstant.NO);
+                    stockList.add(item);
+                }
+            }
+            // 如果是出库
+            else {
+                if (stock != null) {
+                    BigDecimal quantity = stock.getQuantity().subtract(item.getQuantity());
+                    stock.setQuantity(BigDecimalUtil.max(quantity, BigDecimal.ZERO));
+
+                    int number = stock.getNumber() - item.getNumber();
+                    stock.setNumber(Math.max(number, 0));
+                }
+            }
+        }
+
+        // 更新库存信息
+        saveOrUpdateBatch(stockList);
+    }
+
 }

+ 2 - 0
hx-service/storage-restructure/src/main/java/com/fjhx/service/water/WaterTagService.java

@@ -36,4 +36,6 @@ public interface WaterTagService extends StorageBaseService<WaterTag> {
 
     Map<String, Object> getDetailsByRfid(String rfidCode);
 
+    void editInHouse(Enum<?> typeEnum, List<WaterTag> waterTagList, Long stockHouseId);
+
 }

+ 55 - 42
hx-service/storage-restructure/src/main/java/com/fjhx/service/water/impl/WaterServiceImpl.java

@@ -1,14 +1,15 @@
 package com.fjhx.service.water.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.fjhx.constants.InOutTypeConstant;
 import com.fjhx.constants.StatusConstant;
 import com.fjhx.entity.water.Water;
 import com.fjhx.entity.water.WaterTag;
+import com.fjhx.enums.DeviceTypeEnum;
 import com.fjhx.enums.InTypeEnum;
 import com.fjhx.enums.OutTypeEnum;
 import com.fjhx.mapper.water.WaterMapper;
 import com.fjhx.params.water.WaterVo;
+import com.fjhx.service.stock.StockService;
 import com.fjhx.service.water.WaterDetailService;
 import com.fjhx.service.water.WaterService;
 import com.fjhx.service.water.WaterTagService;
@@ -37,62 +38,79 @@ public class WaterServiceImpl extends ServiceImpl<WaterMapper, Water> implements
     @Autowired
     private WaterTagService waterTagService;
 
+    @Autowired
+    private StockService stockService;
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void add(WaterVo waterVo) {
-        Integer type = waterVo.getType();
-        List<Long> waterTagIdList = waterVo.getWaterTagIdList();
 
-        Assert.notEmpty(waterVo.getStockHouseId(), "仓库id不能为空");
-        Assert.notEmpty(waterVo.getOperUserId(), "操作人id不能为空");
-        Assert.notEmpty(type, "库存变更类型不能为空");
-        Assert.notEmpty(waterVo.getDevice(), "出入库设备类型不能为空");
-        Assert.notEmpty(waterVo.getWaterTagIdList(), "标签id数组不能为空");
+        // 必填字段校验
+        requiredFieldVerification(waterVo);
 
-        // 出库或入库类型
-        Integer inOutType = getInOutType(type);
+        // 出库或入库类型枚举
+        Enum<?> typeEnum = getInOutType(waterVo.getType());
 
-        // 入库标签id查询标签列表
-        List<WaterTag> waterTagList = waterTagService.listByIds(waterTagIdList);
-        Assert.eqTrue(waterTagIdList.size() != waterTagList.size(), "存在未知标签id");
+        // 获取变更标签
+        List<WaterTag> waterTagList = getWaterTagList(waterVo.getWaterTagIdList());
 
-        // TODO 一体机出库,判断是否异常出库
-        setErrorOutStatus(waterVo);
+        // TODO 如果是一体机出库,判断是否异常出库
+        setErrorOutStatus(typeEnum, waterVo);
 
         // 添加流水
         save(waterVo);
 
-        // 添加流水详情
+        // 添加流水明细
         waterDetailService.add(waterVo, waterTagList);
 
         // 更新库存
+        stockService.edit(typeEnum, waterTagList);
+
+        // 修改标签在库信息
+        waterTagService.editInHouse(typeEnum, waterTagList, waterVo.getStockHouseId());
+
+        // 如果是入库,标签不是本场入库状态,则更新统计信息
 
 
     }
 
-//    // 出入库处理
-//        if (InTypeEnum.get(type) != null) {
-//        inHandel(waterVo);
-//    } else {
-//        outHandel(waterVo);
-//    }
+    /**
+     * 必填字段校验
+     */
+    private void requiredFieldVerification(WaterVo waterVo) {
+        Assert.notEmpty(waterVo.getStockHouseId(), "仓库id不能为空");
+        Assert.notEmpty(waterVo.getOperUserId(), "操作人id不能为空");
+        Assert.notEmpty(waterVo.getType(), "库存变更类型不能为空");
+        Assert.notEmpty(waterVo.getDevice(), "出入库设备类型不能为空");
+        Assert.notEmpty(waterVo.getWaterTagIdList(), "标签id数组不能为空");
+    }
 
     /**
-     * 出库类型处理
-     *
-     * @param waterVo
+     * 获取出入库类型
      */
-    private void outHandel(WaterVo waterVo) {
+    private Enum<?> getInOutType(Integer type) {
+        // 判断是否是入库类型
+        InTypeEnum inTypeEnum = InTypeEnum.get(type);
+        if (inTypeEnum != null) {
+            return inTypeEnum;
+        }
+        // 判断是否是出库类型
+        OutTypeEnum outTypeEnum = OutTypeEnum.get(type);
+        if (outTypeEnum != null) {
+            return outTypeEnum;
+        }
+
+        throw new ServiceException("未知出入库类型");
 
     }
 
     /**
-     * 入库类型处理
-     *
-     * @param waterVo
+     * 获取变更标签
      */
-    private void inHandel(WaterVo waterVo) {
-
+    private List<WaterTag> getWaterTagList(List<Long> waterTagIdList) {
+        List<WaterTag> waterTagList = waterTagService.listByIds(waterTagIdList);
+        Assert.eqTrue(waterTagIdList.size() != waterTagList.size(), "存在未知标签id");
+        return waterTagList;
     }
 
     /**
@@ -100,18 +118,13 @@ public class WaterServiceImpl extends ServiceImpl<WaterMapper, Water> implements
      *
      * @param waterVo
      */
-    private void setErrorOutStatus(WaterVo waterVo) {
-        waterVo.setErrorOutStatus(StatusConstant.NO);
-    }
-
-    private Integer getInOutType(Integer type) {
-        if (InTypeEnum.get(type) != null) {
-            return InOutTypeConstant.IN;
-        } else if (OutTypeEnum.get(type) != null) {
-            return InOutTypeConstant.OUT;
-        } else {
-            throw new ServiceException("未知出入库类型");
+    private void setErrorOutStatus(Enum<?> typeEnum, WaterVo waterVo) {
+        if (typeEnum instanceof InTypeEnum || !DeviceTypeEnum.HANDHELD_MACHINE.getType().equals(waterVo.getDevice())) {
+            waterVo.setErrorOutStatus(StatusConstant.NO);
+            return;
         }
+
+        waterVo.setErrorOutStatus(StatusConstant.NO);
     }
 
 }

+ 70 - 12
hx-service/storage-restructure/src/main/java/com/fjhx/service/water/impl/WaterTagServiceImpl.java

@@ -10,12 +10,15 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.base.Condition;
 import com.fjhx.base.StorageBaseEntity;
 import com.fjhx.constants.StatusConstant;
+import com.fjhx.entity.contract.Contract;
 import com.fjhx.entity.water.WaterBatch;
 import com.fjhx.entity.water.WaterTag;
 import com.fjhx.enums.CheckStateEnum;
+import com.fjhx.enums.InTypeEnum;
 import com.fjhx.enums.PurchaseProgressEnum;
 import com.fjhx.mapper.water.WaterTagMapper;
 import com.fjhx.params.water.WaterTagVo;
+import com.fjhx.service.contract.ContractService;
 import com.fjhx.service.water.WaterBatchService;
 import com.fjhx.service.water.WaterTagService;
 import com.fjhx.utils.Assert;
@@ -25,11 +28,13 @@ import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.InputStream;
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -45,6 +50,9 @@ public class WaterTagServiceImpl extends ServiceImpl<WaterTagMapper, WaterTag> i
     @Autowired
     private WaterBatchService waterBatchService;
 
+    @Autowired
+    private ContractService contractService;
+
     @Override
     public Page<Map<String, Object>> getPage(Condition condition) {
 
@@ -56,6 +64,7 @@ public class WaterTagServiceImpl extends ServiceImpl<WaterTagMapper, WaterTag> i
         return baseMapper.getPage(condition.getPage(), wrapper);
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public synchronized void add(WaterTagVo waterTagVo) {
         BigDecimal quantity = waterTagVo.getQuantity();
@@ -75,6 +84,7 @@ public class WaterTagServiceImpl extends ServiceImpl<WaterTagMapper, WaterTag> i
             Integer number = waterTag.getNumber();
             for (int i = 1; i <= num; i++) {
                 WaterTag waterTagTemp = createWaterTag(waterTag.getMaterialId(), quantity, waterTag.getPrice(),
+                        waterTag.getContractId(), waterTag.getContractDetailsId(),
                         waterTag.getWaterBatchId(), waterTag.getWaterBatchCode(), number + i);
                 waterTagList.add(waterTagTemp);
             }
@@ -82,13 +92,18 @@ public class WaterTagServiceImpl extends ServiceImpl<WaterTagMapper, WaterTag> i
             WaterBatch waterBatch = waterBatchService.getById(waterBatchId);
             for (int i = 1; i <= num; i++) {
                 WaterTag waterTagTemp = createWaterTag(waterBatch.getMaterialId(), quantity, waterBatch.getPrice(),
+                        waterBatch.getContractId(), waterBatch.getContractDetailsId(),
                         waterBatch.getId(), waterBatch.getCode(), i);
                 waterTagList.add(waterTagTemp);
             }
+
+            // 修改合同处理状态为已处理,后续操作不再允许删除合同
+            updateContractProcessed(waterBatch.getContractId());
         }
         saveBatch(waterTagList);
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void uploadTag(MultipartFile file, Long waterBatchId) {
 
@@ -96,18 +111,18 @@ public class WaterTagServiceImpl extends ServiceImpl<WaterTagMapper, WaterTag> i
 
         // 解析excel文件中的数据
         List<BigDecimal> quantityList = getQuantityListByExcel(file);
-
         Assert.gtZero(quantityList.size(), "导入标签数量为空");
 
+        // 获取此批次最新标签
         WaterTag waterTag = getNewestWaterTag(waterBatchId);
 
         List<WaterTag> waterTagList = new ArrayList<>();
-
         if (waterTag != null) {
             Integer number = waterTag.getNumber() + 1;
 
             for (BigDecimal quantity : quantityList) {
                 WaterTag waterTagTemp = createWaterTag(waterTag.getMaterialId(), quantity, waterTag.getPrice(),
+                        waterTag.getContractId(), waterTag.getContractDetailsId(),
                         waterTag.getWaterBatchId(), waterTag.getWaterBatchCode(), number);
                 number++;
                 waterTagList.add(waterTagTemp);
@@ -120,11 +135,14 @@ public class WaterTagServiceImpl extends ServiceImpl<WaterTagMapper, WaterTag> i
 
             for (BigDecimal quantity : quantityList) {
                 WaterTag waterTagTemp = createWaterTag(waterBatch.getMaterialId(), quantity, waterBatch.getPrice(),
+                        waterBatch.getContractId(), waterBatch.getContractDetailsId(),
                         waterBatch.getId(), waterBatch.getCode(), number);
                 number++;
                 waterTagList.add(waterTagTemp);
             }
 
+            // 修改合同处理状态为已处理,后续操作不再允许删除合同
+            updateContractProcessed(waterBatch.getContractId());
         }
         saveBatch(waterTagList);
     }
@@ -172,6 +190,32 @@ public class WaterTagServiceImpl extends ServiceImpl<WaterTagMapper, WaterTag> i
         return baseMapper.getDetailsByRfid(rfidCode);
     }
 
+    @Override
+    public void editInHouse(Enum<?> typeEnum, List<WaterTag> waterTagList, Long stockHouseId) {
+        List<Long> waterTagIdList = waterTagList.stream().map(StorageBaseEntity::getId).collect(Collectors.toList());
+
+        // 入库
+        if (typeEnum instanceof InTypeEnum) {
+            update(Wrappers.<WaterTag>lambdaUpdate()
+                    .in(StorageBaseEntity::getId, waterTagIdList)
+                    .set(WaterTag::getInHouse, StatusConstant.YES)
+                    .set(WaterTag::getStockHouseId, stockHouseId)
+                    .set(WaterTag::getPurchaseProgress, PurchaseProgressEnum.WAREHOUSING.getType())
+                    .set(StorageBaseEntity::getUpdateTime, new Date())
+                    .set(StorageBaseEntity::getUpdateUser, AuthUtil.getUserId())
+            );
+        } else {
+            update(Wrappers.<WaterTag>lambdaUpdate()
+                    .in(StorageBaseEntity::getId, waterTagIdList)
+                    .set(WaterTag::getInHouse, StatusConstant.NO)
+                    .set(WaterTag::getStockHouseId, null)
+                    .set(StorageBaseEntity::getUpdateTime, new Date())
+                    .set(StorageBaseEntity::getUpdateUser, AuthUtil.getUserId())
+            );
+        }
+
+    }
+
     /**
      * 解析excel文件中的数据
      */
@@ -244,20 +288,24 @@ public class WaterTagServiceImpl extends ServiceImpl<WaterTagMapper, WaterTag> i
     /**
      * 创建标签
      *
-     * @param materialId      物料id
-     * @param quantity        数量
-     * @param price           单价
-     * @param waterBatchId    批次id
-     * @param waterBatchCodee 批次编码
-     * @param number          二维码编码
+     * @param materialId        物料id
+     * @param quantity          数量
+     * @param price             单价
+     * @param contractId        合同id
+     * @param contractDetailsId 合同明细id
+     * @param waterBatchId      批次id
+     * @param waterBatchCodee   批次编码
+     * @param number            二维码编码
      */
-    private WaterTag createWaterTag(Long materialId, BigDecimal quantity, BigDecimal price,
-                                    Long waterBatchId, String waterBatchCodee, Integer number) {
+    private WaterTag createWaterTag(Long materialId, BigDecimal quantity, BigDecimal price, Long contractId,
+                                    Long contractDetailsId, Long waterBatchId, String waterBatchCodee, Integer number) {
         WaterTag waterTagTemp = new WaterTag();
         waterTagTemp.setMaterialId(materialId);
         waterTagTemp.setQuantity(quantity);
         waterTagTemp.setPrice(price);
         waterTagTemp.setQrCode(UUID.fastUUID().toString());
+        waterTagTemp.setContractId(contractId);
+        waterTagTemp.setContractDetailsId(contractDetailsId);
         waterTagTemp.setWaterBatchId(waterBatchId);
         waterTagTemp.setWaterBatchCode(waterBatchCodee);
         waterTagTemp.setNumber(number);
@@ -271,8 +319,6 @@ public class WaterTagServiceImpl extends ServiceImpl<WaterTagMapper, WaterTag> i
 
     /**
      * 获取最新添加标签
-     *
-     * @return
      */
     private WaterTag getNewestWaterTag(Long waterBatchId) {
         return getOne(Wrappers.<WaterTag>lambdaQuery()
@@ -281,5 +327,17 @@ public class WaterTagServiceImpl extends ServiceImpl<WaterTagMapper, WaterTag> i
                 .last("limit 1"));
     }
 
+    /**
+     * 修改合同处理状态为已处理,后续操作不再允许删除合同
+     *
+     * @param contractId 合同id
+     */
+    private void updateContractProcessed(Long contractId) {
+        contractService.update(Wrappers.<Contract>lambdaUpdate()
+                .eq(StorageBaseEntity::getId, contractId)
+                .eq(Contract::getProcessed, StatusConstant.NO)
+                .set(Contract::getProcessed, StatusConstant.YES)
+        );
+    }
 
 }