24282 %!s(int64=2) %!d(string=hai) anos
pai
achega
7ea2def5b2

+ 2 - 2
hx-common/code-generator/src/main/java/com/fjhx/modular/Storage.java

@@ -36,8 +36,8 @@ public class Storage {
     // 模块名称
     public static String MODULAR_NAME = "storage";
 
-    // 需要生成的表名称,多表用,隔开
-    public static String INCLUDE = "test_scan";
+    // 需要生成的表名称
+    public static String INCLUDE = "stock";
 
     // mysql连接
     public static String MYSQL_URL = "rm-wz9f1jcr5466b42415o.mysql.rds.aliyuncs.com:3306";

+ 75 - 0
hx-service-api/storage-api/src/main/java/com/fjhx/entity/stock/Stock.java

@@ -0,0 +1,75 @@
+package com.fjhx.entity.stock;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.Version;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fjhx.base.BasicEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 物料库存
+ * </p>
+ *
+ * @author ${author}
+ * @since 2023-02-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class Stock extends BasicEntity {
+
+
+    /**
+     * 软删除
+     */
+    @TableField("IsDelete")
+    private Boolean IsDelete;
+
+    /**
+     * 创建时间
+     */
+    @TableField("CreatedTime")
+    private Date CreatedTime;
+
+    /**
+     * 修改时间
+     */
+    @TableField("UpdatedTime")
+    private Date UpdatedTime;
+
+    /**
+     * 物料编号
+     */
+    @TableField("MaterialCode")
+    private String MaterialCode;
+
+    /**
+     * 数量
+     */
+    @TableField("Quantity")
+    private BigDecimal Quantity;
+
+    /**
+     * 单价
+     */
+    @TableField("Price")
+    private BigDecimal Price;
+
+    /**
+     * 最近一次盘点
+     */
+    @TableField("CheckRecordDetailId")
+    private String CheckRecordDetailId;
+
+    /**
+     * 是否已经发起盘点
+     */
+    @TableField("IsCheckTag")
+    private Boolean IsCheckTag;
+
+
+}

+ 10 - 7
hx-service-api/storage-api/src/main/java/com/fjhx/entity/stock/StockWater.java

@@ -1,15 +1,13 @@
 package com.fjhx.entity.stock;
 
-import java.math.BigDecimal;
-import com.baomidou.mybatisplus.annotation.IdType;
-import java.util.Date;
-import com.baomidou.mybatisplus.annotation.Version;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.fjhx.base.BaseEntity;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.fjhx.base.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.math.BigDecimal;
+import java.util.Date;
+
 /**
  * <p>
  * 出入库
@@ -27,7 +25,7 @@ public class StockWater extends BaseEntity {
      * 软删除
      */
     @TableField("IsDelete")
-    private Boolean isdelete;
+    private Integer isdelete;
 
     /**
      * 创建时间
@@ -119,5 +117,10 @@ public class StockWater extends BaseEntity {
     @TableField("AbnormalOutState")
     private Integer abnormaloutstate;
 
+    /**
+     * 异常出库是否已处理 (枚举定义:0=否,1=是)
+     */
+    @TableField("NewInterface")
+    private Integer newInterface;
 
 }

+ 8 - 6
hx-service-api/storage-api/src/main/java/com/fjhx/entity/stock/StockWaterdetial.java

@@ -1,15 +1,12 @@
 package com.fjhx.entity.stock;
 
-import java.math.BigDecimal;
-import com.baomidou.mybatisplus.annotation.IdType;
-import java.util.Date;
-import com.baomidou.mybatisplus.annotation.Version;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.fjhx.base.BasicEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.math.BigDecimal;
+
 /**
  * <p>
  * 出入库明细
@@ -27,7 +24,7 @@ public class StockWaterdetial extends BasicEntity {
      * 软删除
      */
     @TableField("IsDelete")
-    private Boolean IsDelete;
+    private Integer IsDelete;
 
     /**
      * 出入库编号
@@ -113,5 +110,10 @@ public class StockWaterdetial extends BasicEntity {
     @TableField("PickingStatus")
     private Integer PickingStatus;
 
+    /**
+     * 异常出库是否已处理 (枚举定义:0=否,1=是)
+     */
+    @TableField("NewInterface")
+    private Integer newInterface;
 
 }

+ 17 - 0
hx-service-api/storage-api/src/main/java/com/fjhx/params/stock/StockEx.java

@@ -0,0 +1,17 @@
+package com.fjhx.params.stock;
+
+import com.fjhx.entity.stock.Stock;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 物料库存
+ *
+ * @author ${author}
+ * @since 2023-02-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class StockEx extends Stock {
+
+}

+ 53 - 0
hx-service-api/storage-api/src/main/java/com/fjhx/params/stock/StockOutDto.java

@@ -0,0 +1,53 @@
+package com.fjhx.params.stock;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.List;
+
+@Getter
+@Setter
+public class StockOutDto {
+
+    @NotBlank(message = "操作人id不能为空")
+    private String operUserId;
+
+    @NotBlank(message = "仓库id不能为空")
+    private String houseId;
+
+    @NotNull(message = "出入库设备类型不能为空")
+    private Integer device;
+
+    @NotNull(message = "出库类型不能为空")
+    private Integer changeType;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    @Valid
+    @NotEmpty(message = "出库明细不能为空")
+    private List<Detail> detailList;
+
+    @Getter
+    @Setter
+    public static class Detail {
+
+        @NotBlank(message = "物料编码不能为空")
+        private String materialCode;
+
+        @NotBlank(message = "rfid不能为空")
+        private String rfidCode;
+
+        @NotBlank(message = "出库数量不能为空")
+        private BigDecimal quantity;
+
+    }
+
+}

+ 17 - 0
hx-service-api/storage-api/src/main/java/com/fjhx/params/stock/StockVo.java

@@ -0,0 +1,17 @@
+package com.fjhx.params.stock;
+
+import com.fjhx.entity.stock.Stock;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 物料库存
+ *
+ * @author ${author}
+ * @since 2023-02-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class StockVo extends Stock {
+
+}

+ 5 - 0
hx-service-api/victoriatourist-api/src/main/java/com/fjhx/entity/check/CheckDetails.java

@@ -48,6 +48,11 @@ public class CheckDetails extends BaseEntity {
     private Integer resultType;
 
     /**
+     * 备注
+     */
+    private String remark;
+
+    /**
      * 逻辑删除 0未删除 1已删除
      */
     @TableField(fill = FieldFill.INSERT)

+ 38 - 0
hx-service/storage/src/main/java/com/fjhx/stock/controller/StockController.java

@@ -0,0 +1,38 @@
+package com.fjhx.stock.controller;
+
+import com.fjhx.params.stock.StockOutDto;
+import com.fjhx.stock.service.StockService;
+import org.springblade.core.tool.api.R;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 物料库存 前端控制器
+ * </p>
+ *
+ * @author ${author}
+ * @since 2023-02-20
+ */
+@RestController
+@RequestMapping("/stock")
+public class StockController {
+
+    @Autowired
+    private StockService stockService;
+
+    /**
+     * 出库接口
+     */
+    @PostMapping("/out")
+    public R out(@Validated @RequestBody StockOutDto dto) {
+        stockService.out(dto);
+        return R.success();
+    }
+
+}
+

+ 16 - 0
hx-service/storage/src/main/java/com/fjhx/stock/mapper/StockMapper.java

@@ -0,0 +1,16 @@
+package com.fjhx.stock.mapper;
+
+import com.fjhx.entity.stock.Stock;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 物料库存 Mapper 接口
+ * </p>
+ *
+ * @author ${author}
+ * @since 2023-02-20
+ */
+public interface StockMapper extends BaseMapper<Stock> {
+
+}

+ 5 - 0
hx-service/storage/src/main/java/com/fjhx/stock/mapper/StockMapper.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.fjhx.stock.mapper.StockMapper">
+
+</mapper>

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

@@ -0,0 +1,19 @@
+package com.fjhx.stock.service;
+
+import com.fjhx.base.BaseService;
+import com.fjhx.entity.stock.Stock;
+import com.fjhx.params.stock.StockOutDto;
+
+/**
+ * <p>
+ * 物料库存 服务类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2023-02-20
+ */
+public interface StockService extends BaseService<Stock> {
+
+    void out(StockOutDto dto);
+
+}

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

@@ -0,0 +1,172 @@
+package com.fjhx.stock.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.entity.stock.Stock;
+import com.fjhx.entity.stock.StockDetail;
+import com.fjhx.entity.stock.StockWater;
+import com.fjhx.entity.stock.StockWaterdetial;
+import com.fjhx.params.stock.StockOutDto;
+import com.fjhx.stock.mapper.StockMapper;
+import com.fjhx.stock.service.StockDetailService;
+import com.fjhx.stock.service.StockService;
+import com.fjhx.stock.service.StockWaterService;
+import com.fjhx.stock.service.StockWaterdetialService;
+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.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 物料库存 服务实现类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2023-02-20
+ */
+@Service
+public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements StockService {
+
+    @Autowired
+    private StockDetailService stockDetailService;
+
+    @Autowired
+    private StockWaterService stockWaterService;
+
+    @Autowired
+    private StockWaterdetialService stockWaterdetialService;
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void out(StockOutDto dto) {
+
+        List<StockOutDto.Detail> detailList = dto.getDetailList();
+
+        // 物料编码集合
+        Set<String> materialCodeList = detailList.stream().map(StockOutDto.Detail::getMaterialCode).collect(Collectors.toSet());
+
+        // 物料编码 出库数量 map
+        Map<String, BigDecimal> warehousingQuantityMap = detailList.stream().collect(Collectors.toMap(
+                StockOutDto.Detail::getMaterialCode,
+                StockOutDto.Detail::getQuantity,
+                BigDecimal::add
+        ));
+
+        // rfid集合
+        Set<String> rfidSet = detailList.stream().map(StockOutDto.Detail::getRfidCode).collect(Collectors.toSet());
+
+        // 查询原有库存
+        List<Stock> stockList = list(Stock::getMaterialCode, materialCodeList);
+
+        // 扣减库存
+        inventoryDeduction(stockList, warehousingQuantityMap);
+
+        // 添加出入库流水
+        addStockWater(dto, stockList, warehousingQuantityMap, rfidSet);
+
+        // 删除库存明细
+        stockDetailService.remove(q -> q.in(StockDetail::getRfidcode, rfidSet));
+
+    }
+
+    /**
+     * 扣减库存
+     */
+    private void inventoryDeduction(List<Stock> stockList, Map<String, BigDecimal> map) {
+
+        for (Stock stock : stockList) {
+            // 出库数量
+            BigDecimal quantity = map.get(stock.getMaterialCode());
+            // 扣减库存后的剩余库存
+            BigDecimal surplusQuantity = stock.getQuantity().subtract(quantity);
+            // 赋值剩余库存
+            stock.setQuantity(surplusQuantity.compareTo(BigDecimal.ZERO) > 0 ? surplusQuantity : BigDecimal.ZERO);
+        }
+
+        // 修改库存数量
+        updateBatchById(stockList);
+    }
+
+    /**
+     * 添加出入库流水
+     */
+    private void addStockWater(StockOutDto dto, List<Stock> stockList, Map<String, BigDecimal> warehousingQuantityMap, Set<String> rfidSet) {
+        // 原库存map
+        Map<String, BigDecimal> oldStockQyantityMap = stockList.stream()
+                .collect(Collectors.toMap(Stock::getMaterialCode, Stock::getQuantity));
+
+        // 当前时间
+        Date date = new Date();
+
+        Map<String, List<StockOutDto.Detail>> map = dto.getDetailList().stream()
+                .collect(Collectors.groupingBy(StockOutDto.Detail::getMaterialCode));
+
+        // 库存明细
+        List<StockDetail> list = stockDetailService.list(q -> q.in(StockDetail::getRfidcode, rfidSet).eq(StockDetail::getIsdelete, 0));
+        Map<String, StockDetail> stockDetailMap = list.stream().collect(Collectors.toMap(StockDetail::getRfidcode, item -> item, (v1, v2) -> v1));
+
+        List<StockWater> stockWaterList = new ArrayList<>();
+        List<StockWaterdetial> stockWaterdetialList = new ArrayList<>();
+        warehousingQuantityMap.forEach((k, v) -> {
+            Long waterNo = IdWorker.getId();
+
+            StockWater stockWater = new StockWater();
+            stockWater.setId(waterNo);
+            stockWater.setIsdelete(0);
+            stockWater.setCreatedtime(date);
+            stockWater.setUpdatedtime(date);
+            stockWater.setWaterno(waterNo + "");
+            stockWater.setOperuserid(dto.getOperUserId());
+            stockWater.setTotalqty(v);
+            stockWater.setStockhouseid(dto.getHouseId());
+            stockWater.setMaterialcode(k);
+            stockWater.setStockchangetype(dto.getChangeType());
+            stockWater.setRemark(dto.getRemark());
+            stockWater.setOldquantity(ObjectUtil.defaultIfNull(oldStockQyantityMap.get(k), BigDecimal.ZERO));
+            stockWater.setAbnormaloutstate(1);
+            stockWater.setNewInterface(1);
+            stockWaterList.add(stockWater);
+
+            List<StockOutDto.Detail> details = map.get(k);
+            List<StockWaterdetial> waterDetailList = getWaterDetailList(dto, details, date, waterNo, stockDetailMap);
+            stockWaterdetialList.addAll(waterDetailList);
+        });
+
+        stockWaterService.saveBatch(stockWaterList);
+        stockWaterdetialService.saveBatch(stockWaterdetialList);
+    }
+
+    private List<StockWaterdetial> getWaterDetailList(StockOutDto dto, List<StockOutDto.Detail> details,
+                                                      Date date, Long waterNo, Map<String, StockDetail> stockDetailMap) {
+        List<StockWaterdetial> stockWaterdetialList = new ArrayList<>();
+        for (StockOutDto.Detail detail : details) {
+            StockDetail stockDetail = stockDetailMap.get(detail.getRfidCode());
+
+            StockWaterdetial stockWaterdetial = new StockWaterdetial();
+            stockWaterdetial.setIsDelete(0);
+            stockWaterdetial.setCreatedTime(date);
+            stockWaterdetial.setUpdatedTime(date);
+            stockWaterdetial.setWaterId(waterNo + "");
+            stockWaterdetial.setOperUserId(dto.getOperUserId());
+            stockWaterdetial.setMaterialCode(detail.getMaterialCode());
+            stockWaterdetial.setChangeNum(detail.getQuantity());
+            stockWaterdetial.setRfidCode(detail.getRfidCode());
+            stockWaterdetial.setStockChangeType(dto.getChangeType());
+            stockWaterdetial.setInOutDevice(dto.getDevice());
+            stockWaterdetial.setNewInterface(1);
+
+            if (stockDetail != null) {
+                stockWaterdetial.setQRCode(stockDetail.getQrcode());
+                stockWaterdetial.setPrice(stockDetail.getPrice());
+            }
+            stockWaterdetialList.add(stockWaterdetial);
+        }
+        return stockWaterdetialList;
+    }
+
+}

+ 2 - 1
hx-service/victoriatourist/src/main/java/com/fjhx/mapper/check/CheckDetailsMapper.xml

@@ -9,7 +9,8 @@
                pi.unit,
                cd.inventory_quantity,
                cd.check_quantity,
-               cd.result_type
+               cd.result_type,
+               cd.remark
         from check_details cd
                  left join product_info pi on cd.product_id = pi.id
         where cd.check_info_id = #{checkInfoId}

+ 1 - 4
hx-service/victoriatourist/src/main/java/com/fjhx/service/check/impl/CheckInfoServiceImpl.java

@@ -87,9 +87,7 @@ public class CheckInfoServiceImpl extends ServiceImpl<CheckInfoMapper, CheckInfo
         // 盘亏金额
         BigDecimal lossAmount = BigDecimal.ZERO;
 
-        /**
-         * 盘点金额
-         */
+        // 盘点金额
         BigDecimal checkAmount = BigDecimal.ZERO;
 
         // 获取商品加权平均价
@@ -102,7 +100,6 @@ public class CheckInfoServiceImpl extends ServiceImpl<CheckInfoMapper, CheckInfo
             BigDecimal checkQuantity = checkDetails.getCheckQuantity();
             BigDecimal inventoryQuantity = checkDetails.getInventoryQuantity();
 
-
             Assert.notEmpty(productId, "产品id不能为空");
             Assert.notEmpty(checkQuantity, "盘点数量不能为空");
             Assert.notEmpty(inventoryQuantity, "现有库存不能为空");