diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/domain/BaseStock.java b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/domain/BaseStock.java index 9d585491..d5ba0096 100644 --- a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/domain/BaseStock.java +++ b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/domain/BaseStock.java @@ -61,6 +61,8 @@ public class BaseStock extends ExtBaseEntity implements Serializable { */ private String pkgUnitName; + //==================== ↓↓↓↓↓↓ 扩展方法 ↓↓↓↓↓↓ ==================== + //==================== ↓↓↓↓↓↓ 表字段 ↓↓↓↓↓↓ ==================== /** diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/stock/BaseStockServiceImpl.java b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/stock/BaseStockServiceImpl.java index e906f575..bcef5bc2 100644 --- a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/stock/BaseStockServiceImpl.java +++ b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/stock/BaseStockServiceImpl.java @@ -1,16 +1,23 @@ package com.ruoyi.wms.service.stock; +import com.ruoyi.common.core.web.domain.AjaxResult; +import com.ruoyi.common.core.web.domain.ExtBaseEntity; import com.ruoyi.wms.domain.BaseStock; import com.ruoyi.wms.mapper.stock.BaseStockDynamicSqlSupport; import com.ruoyi.wms.mapper.stock.BaseStockExtMapper; import com.ruoyi.wms.mapper.stock.BaseStockMapper; import jakarta.annotation.Resource; import org.mybatis.dynamic.sql.SqlBuilder; -import org.springframework.beans.factory.annotation.Autowired; +import org.mybatis.dynamic.sql.render.RenderingStrategies; +import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.util.List; import java.util.Optional; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; /** * 基本库存Service业务层处理 @@ -21,10 +28,14 @@ import java.util.Optional; @Service public class BaseStockServiceImpl implements IBaseStockService { - @Autowired + @Resource private BaseStockMapper baseStockMapper; @Resource private BaseStockExtMapper baseStockExtMapper; + @Resource + private IInvTransHisService invTransHisService; + + private final Queue dataQueue = new ConcurrentLinkedQueue<>(); /** * 查询基本库存 @@ -35,11 +46,11 @@ public class BaseStockServiceImpl implements IBaseStockService { @Override public BaseStock selectBaseStockByPK(String whsCd, String stgBinCd, String itemCd, String lotNo, String subLotNo) { Optional result = baseStockMapper.selectOne(dsl -> - dsl.where(BaseStockDynamicSqlSupport.whsCd, SqlBuilder.isEqualTo(whsCd)) - .and(BaseStockDynamicSqlSupport.stgBinCd, SqlBuilder.isEqualTo(stgBinCd)) - .and(BaseStockDynamicSqlSupport.itemCd, SqlBuilder.isEqualTo(itemCd)) - .and(BaseStockDynamicSqlSupport.lotNo, SqlBuilder.isEqualTo(lotNo)) - .and(BaseStockDynamicSqlSupport.subLotNo, SqlBuilder.isEqualTo(subLotNo)) + dsl.where(BaseStockDynamicSqlSupport.whsCd, SqlBuilder.isEqualTo(whsCd)) + .and(BaseStockDynamicSqlSupport.stgBinCd, SqlBuilder.isEqualTo(stgBinCd)) + .and(BaseStockDynamicSqlSupport.itemCd, SqlBuilder.isEqualTo(itemCd)) + .and(BaseStockDynamicSqlSupport.lotNo, SqlBuilder.isEqualTo(lotNo)) + .and(BaseStockDynamicSqlSupport.subLotNo, SqlBuilder.isEqualTo(subLotNo)) ); return result.orElse(null); } @@ -55,4 +66,86 @@ public class BaseStockServiceImpl implements IBaseStockService { return baseStockExtMapper.selectPageList(baseStock); } + /** + * 入库 + * + * @param baseStock 库存数据 + * @return 结果 + */ + @Transactional + @Override + public AjaxResult instock(BaseStock baseStock) { + //TODO 参数检查 + + //队列维持数据一致性 + dataQueue.offer(baseStock); + BaseStock data = dataQueue.remove(); + doInoutStock(data); + return AjaxResult.success(); + } + + /** + * 出库 + * + * @param baseStock 库存数据 + * @return 结果 + */ + @Transactional + @Override + public AjaxResult outstock(BaseStock baseStock) { + //TODO 参数检查 + + //队列维持数据一致性 + dataQueue.offer(baseStock); + BaseStock data = dataQueue.remove(); + doInoutStock(data); + return AjaxResult.success(); + } + + /** + * 入出库操作 + */ + private void doInoutStock(BaseStock form) { + //查询库存 + List stockList = queryWhenInoutStock(form); + //更新库存 + if (stockList.isEmpty()) { + + //insert + baseStockMapper.insert(form); + //TODO 写入出库履历 + } else { + //update + BaseStock oldRecord = stockList.getFirst(); + BigDecimal newStdUnitQty = oldRecord.getStdUnitQty().add(form.getStdUnitQty()); + BigDecimal newPkgUnitQty = oldRecord.getPkgUnitQty().add(form.getPkgUnitQty()); + oldRecord.setStdUnitQty(newStdUnitQty); + oldRecord.setPkgUnitQty(newPkgUnitQty); + baseStockMapper.updateByPrimaryKey(oldRecord); + //TODO 写入出库履历 + } + } + + /** + * 入出库时查询库存 + * + * @param form 查询条件 + * @return 库存数据 + */ + private List queryWhenInoutStock(BaseStock form) { + SelectStatementProvider query = SqlBuilder.select(BaseStockMapper.selectList) + .from(BaseStockDynamicSqlSupport.baseStock) + .where(BaseStockDynamicSqlSupport.deleteFlag, SqlBuilder.isEqualTo(ExtBaseEntity.NOT_DELETE)) + .and(BaseStockDynamicSqlSupport.whsCd, SqlBuilder.isEqualTo(form.getWhsCd())) + .and(BaseStockDynamicSqlSupport.stgBinCd, SqlBuilder.isEqualTo(form.getStgBinCd())) + .and(BaseStockDynamicSqlSupport.itemCd, SqlBuilder.isEqualTo(form.getItemCd())) + .and(BaseStockDynamicSqlSupport.lotNo, SqlBuilder.isEqualTo(form.getLotNo())) + .and(BaseStockDynamicSqlSupport.subLotNo, SqlBuilder.isEqualTo(form.getSubLotNo())) + .orderBy(BaseStockDynamicSqlSupport.createTime.descending()) + .limit(1) + .build() + .render(RenderingStrategies.MYBATIS3); + return baseStockMapper.selectMany(query); + } + } diff --git a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/stock/IBaseStockService.java b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/stock/IBaseStockService.java index 2bb8d320..f2b36110 100644 --- a/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/stock/IBaseStockService.java +++ b/ruoyi-modules/ruoyi-wms/src/main/java/com/ruoyi/wms/service/stock/IBaseStockService.java @@ -1,5 +1,6 @@ package com.ruoyi.wms.service.stock; +import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.wms.domain.BaseStock; import java.util.List; @@ -28,4 +29,20 @@ public interface IBaseStockService { */ List selectBaseStockList(BaseStock baseStock); + /** + * 入库 + * + * @param baseStock 库存数据 + * @return 结果 + */ + AjaxResult instock(BaseStock baseStock) throws Exception; + + /** + * 出库 + * + * @param baseStock 库存数据 + * @return 结果 + */ + AjaxResult outstock(BaseStock baseStock) throws Exception; + }