From 1b9407eb6349cc9990ad0af55a474bc4056145a1 Mon Sep 17 00:00:00 2001 From: "hongxi.lian" Date: Wed, 25 Oct 2023 16:39:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=B0=E5=BA=93=E4=BD=8D=E5=AE=B9=E9=87=8F?= =?UTF-8?q?=E6=BB=A1=E8=B6=B3=EF=BC=8C=E4=BB=8E=E5=BA=93=E5=AD=98=E6=9C=AA?= =?UTF-8?q?=E8=A2=AB=E5=85=B6=E5=AE=83=E4=BB=BB=E5=8A=A1=E5=8D=A0=E7=94=A8?= =?UTF-8?q?(=E4=BD=BF=E7=94=A8=E5=AE=A2=E6=88=B7=E5=AF=84=E5=94=AE?= =?UTF-8?q?=E5=BA=93)=EF=BC=8C=E4=BB=8E=E5=BA=93=E5=AD=98=E6=9C=AA?= =?UTF-8?q?=E8=A2=AB=E5=85=B6=E5=AE=83=E4=BB=BB=E5=8A=A1=E5=8D=A0=E7=94=A8?= =?UTF-8?q?=EF=BC=8C=E5=BA=93=E5=AD=98=E4=B8=8D=E5=BA=94=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=EF=BC=88=E5=94=AF=E4=B8=80=E7=A0=81=E7=AE=A1=E7=90=86=EF=BC=89?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../location/LocationController.java | 25 +- .../wms/service/location/LocationService.java | 5 + .../service/location/LocationServiceImpl.java | 16 + .../win/module/wms/until/job/JobUtils.java | 363 ++++++++++++++++++ 4 files changed, 403 insertions(+), 6 deletions(-) diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/location/LocationController.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/location/LocationController.java index 5c39d818..94b74076 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/location/LocationController.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/controller/location/LocationController.java @@ -1,6 +1,7 @@ package com.win.module.wms.controller.location; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.exception.ErrorCode; import com.win.framework.common.pojo.CommonResult; import com.win.framework.common.pojo.PageResult; import com.win.framework.dict.core.util.DictFrameworkUtils; @@ -9,11 +10,17 @@ import com.win.framework.operatelog.core.annotations.OperateLog; import com.win.module.system.api.user.AdminUserApi; import com.win.module.system.api.user.dto.AdminUserRespDTO; import com.win.module.wms.controller.location.vo.*; +import com.win.module.wms.controller.rule.vo.RuleRespVO; import com.win.module.wms.convert.location.LocationConvert; +import com.win.module.wms.dal.dataobject.balance.BalanceDO; +import com.win.module.wms.dal.dataobject.expectout.ExpectoutDO; import com.win.module.wms.dal.dataobject.location.LocationDO; +import com.win.module.wms.dal.mysql.balance.BalanceMapper; +import com.win.module.wms.dal.mysql.expectout.ExpectoutMapper; import com.win.module.wms.dal.mysql.location.LocationMapper; import com.win.module.wms.enums.DictTypeConstants; import com.win.module.wms.service.location.LocationService; +import com.win.module.wms.service.rule.RuleService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; @@ -27,6 +34,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.util.*; @@ -49,6 +57,14 @@ public class LocationController { @Resource private AdminUserApi userApi; + @Resource + private BalanceMapper balanceMapper; + + @Resource + private ExpectoutMapper expectoutMapper ; + @Resource + private RuleService ruleService; + @PostMapping("/create") @Operation(summary = "创建库位") @PreAuthorize("@ss.hasPermission('wms:location:create')") @@ -166,10 +182,7 @@ public class LocationController { } } - //库位号有效,状态正确 - @GetMapping("/iii") - public LocationDO selectLocationExist(String locationCode) { - LocationDO locationDO = selectLocation(locationCode); - return locationDO; - } + + + } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/location/LocationService.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/location/LocationService.java index a2d8cb25..d6a7bf84 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/location/LocationService.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/location/LocationService.java @@ -3,9 +3,11 @@ package com.win.module.wms.service.location; import com.win.framework.common.pojo.PageResult; import com.win.module.wms.controller.location.vo.*; import com.win.module.wms.controller.rule.vo.RuleRespVO; +import com.win.module.wms.dal.dataobject.balance.BalanceDO; import com.win.module.wms.dal.dataobject.location.LocationDO; import javax.validation.Valid; +import java.math.BigDecimal; import java.util.Collection; import java.util.List; @@ -97,5 +99,8 @@ public interface LocationService { * @param pitemCode 物品代码 * @return 上架策略信息 */ + public RuleRespVO selectLocationAndModRelation(String pitemCode); + + } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/location/LocationServiceImpl.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/location/LocationServiceImpl.java index 9be11678..491f0564 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/location/LocationServiceImpl.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/service/location/LocationServiceImpl.java @@ -4,21 +4,28 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.google.common.annotations.VisibleForTesting; +import com.win.framework.common.exception.ErrorCode; import com.win.framework.common.exception.ServiceException; import com.win.framework.common.pojo.PageResult; import com.win.framework.datapermission.core.util.DataPermissionUtils; import com.win.module.wms.controller.location.vo.*; import com.win.module.wms.controller.rule.vo.RuleRespVO; import com.win.module.wms.convert.location.LocationConvert; +import com.win.module.wms.dal.dataobject.balance.BalanceDO; import com.win.module.wms.dal.dataobject.itembasic.ItembasicDO; import com.win.module.wms.dal.dataobject.location.LocationDO; +import com.win.module.wms.dal.dataobject.expectout.ExpectoutDO; +import com.win.module.wms.dal.mysql.balance.BalanceMapper; +import com.win.module.wms.dal.mysql.expectout.ExpectoutMapper; import com.win.module.wms.dal.mysql.location.LocationMapper; import com.win.module.wms.service.rule.RuleService; import org.springframework.stereotype.Service; import org.springframework.transaction.interceptor.TransactionAspectSupport; import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -37,9 +44,16 @@ public class LocationServiceImpl implements LocationService { @Resource private LocationMapper locationMapper; + + @Resource + private BalanceMapper balanceMapper; + + @Resource + private ExpectoutMapper expectoutMapper ; @Resource private RuleService ruleService; + @Override public Long createLocation(LocationCreateReqVO createReqVO) { validateLocationForCreateOrUpdate(createReqVO.getId(),createReqVO.getCode(),createReqVO.getAreaCode(),createReqVO.getWarehouseCode() @@ -247,4 +261,6 @@ public class LocationServiceImpl implements LocationService { throw exception(LOCATION_ITEMCODE_AND_LOCATIONCODE_NOT_EXISTS); } } + + } diff --git a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/until/job/JobUtils.java b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/until/job/JobUtils.java index 29edf519..5daf4dd7 100644 --- a/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/until/job/JobUtils.java +++ b/win-module-wms/win-module-wms-biz/src/main/java/com/win/module/wms/until/job/JobUtils.java @@ -3,11 +3,20 @@ package com.win.module.wms.until.job; import cn.hutool.core.exceptions.UtilException; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.win.framework.common.exception.ErrorCode; +import com.win.module.wms.controller.rule.vo.RuleRespVO; +import com.win.module.wms.dal.dataobject.balance.BalanceDO; import com.win.module.wms.dal.dataobject.businesstype.BusinesstypeDO; +import com.win.module.wms.dal.dataobject.expectout.ExpectoutDO; import com.win.module.wms.dal.dataobject.itembasic.ItembasicDO; import com.win.module.wms.dal.dataobject.location.LocationDO; +import com.win.module.wms.dal.mysql.balance.BalanceMapper; +import com.win.module.wms.dal.mysql.expectout.ExpectoutMapper; +import com.win.module.wms.dal.mysql.location.LocationMapper; import com.win.module.wms.service.itembasic.ItembasicService; import com.win.module.wms.service.location.LocationService; +import com.win.module.wms.service.rule.RuleService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Component; @@ -29,6 +38,17 @@ public class JobUtils { @Resource private LocationService locationService; + + @Resource + private LocationMapper locationMapper; + + @Resource + private BalanceMapper balanceMapper; + + @Resource + private ExpectoutMapper expectoutMapper ; + @Resource + private RuleService ruleService; /** * 解析JSON串,返回两个对象的集合 * @@ -222,4 +242,347 @@ public class JobUtils { throw exception(INVENTORY_STATUS_AND_BUSINESS_OUT_INVENTORY_STATUS_NOT_EQUALS_OR_NULL); } } + //调用公共方法查询库位信息 + public LocationDO selectLocation(String pcode) { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("code",pcode); + LocationDO locationDO = locationMapper.selectOne(queryWrapper); + if(locationDO != null && "TRUE".equals(locationDO.getAvailable())){ + return locationDO; + }else { + throw exception(LOCATION_NOT_EXISTS); + } + } + public LocationDO selectLocationExist(String locationCode) { + LocationDO locationDO = selectLocation(locationCode); + return locationDO; + } + public RuleRespVO selectLocationStrategyRule(String warehouseCode, String areaCode, String locationGroupCode, String plocationCode) { + RuleRespVO ruleRespVO = ruleService.warehouseStorage(warehouseCode,areaCode,locationGroupCode,plocationCode); + return ruleRespVO; + } + public RuleRespVO selectLocationAndModRelation(String pitemCode) { + RuleRespVO grounding = ruleService.grounding(null, null, null, null, null, null, pitemCode, null, null, null, null, null, null); + if(grounding != null){ + return grounding; + }else { + throw exception(LOCATION_ITEMCODE_AND_LOCATIONCODE_NOT_EXISTS); + } + } + + + + //跟据管理模式查詢數量 +//按數量查找 TB2-BY_QUANTITY + public List selectnumber(String itemcode, String inventorystatus, String locationcode){ + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("item_code",itemcode); + queryWrapper.eq("inventory_status",inventorystatus); + queryWrapper.eq("location_code",locationcode); + List balanceDO = balanceMapper.selectList(queryWrapper); + if(!balanceDO.isEmpty()){ + + return balanceDO; + } + else{ + throw exception(new ErrorCode(123,"物料号" + itemcode + "庫存狀態" + inventorystatus + "在"+ locationcode +"庫位中未查找到库存记录" )); + } + + } +//按批次查找 TB2-BY_BATCH + + public List selectbatch(String itemcode, String batch ,String inventorystatus,String locationcode) { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("item_code",itemcode); + queryWrapper.eq("batch",batch); + queryWrapper.eq("inventory_status",inventorystatus); + queryWrapper.eq("location_code",locationcode); + + List balanceDO = balanceMapper.selectList(queryWrapper); + if(!balanceDO.isEmpty()){ + + return balanceDO; + } + else{ + throw exception(new ErrorCode(124,"物料号" + itemcode +"批次"+ batch + "庫存狀態" + inventorystatus + "在"+ locationcode +"庫位中未查找到库存记录" )); + } + + + } + + //按包裝查找 TB2-BY_PACKGING + public List selectpackaging(String itemcode, String packingnumber, String batch ,String inventorystatus,String locationcode) { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("item_code",itemcode); + queryWrapper.eq("packing_number",packingnumber); + queryWrapper.eq("batch",batch); + queryWrapper.eq("inventory_status",inventorystatus); + queryWrapper.eq("location_code",locationcode); + + List balanceDO = balanceMapper.selectList(queryWrapper); + if(!balanceDO.isEmpty()){ + + return balanceDO; + } + else{ + throw exception(new ErrorCode(128,"物料号" + itemcode + "箱码" +packingnumber + "批次"+ batch + "庫存狀態" + inventorystatus + "在"+ locationcode +"庫位中未查找到库存记录" )); + } + + + } + //按唯一码查找 TB2-BY_UNIQUE_ID + public List selectuniqueid(String packingnumber,String locationcode , String inventorystatus){ + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("packing_number",packingnumber); + queryWrapper.eq("inventory_status",inventorystatus); + queryWrapper.eq("location_code",locationcode); + List balanceDO = balanceMapper.selectList(queryWrapper); + if(!balanceDO.isEmpty()){ + + return balanceDO; + } + else{ + throw exception(new ErrorCode(129,"唯一码" + packingnumber + "庫存狀態" + inventorystatus + "在"+ locationcode +"庫位中未查找到库存记录" )); + } + + } + + + + + + + + // TB1 查询库存 + public List selectlocation (String itemcode, String packingnumber, String batch, String locationcode, String status ){ + RuleRespVO managementtRule = ruleService.management( null, null,null,null,null, null,itemcode,null,null, + null, locationcode,null,null); + List balanceDO = null; + if( "{\"ManagementPrecision\":\"BY_QUANTITY\"}".equals( managementtRule.getConfiguration())){ + balanceDO = selectnumber(itemcode, status, locationcode ); + + } + else if("{\"ManagementPrecision\":\"BY_BATCH\"}".equals(managementtRule.getConfiguration())){ + balanceDO = selectbatch(itemcode,batch,status,locationcode); + + } + + else if("{\"ManagementPrecision\":\"BY_PACKAGING\"}".equals(managementtRule.getConfiguration())) { + balanceDO = selectpackaging(itemcode,packingnumber, batch, status, locationcode); + } + + else if("{\"ManagementPrecision\":\"BY_UNIQUE_ID\"}".equals(managementtRule.getConfiguration())) { + balanceDO = selectuniqueid(packingnumber, locationcode,status); + } + + return balanceDO; + + } + + //按數量查找 BY_BATCH + public List selectnumbernew(String itemcode, String inventorystatus, String locationcode ){ + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("item_code",itemcode); + queryWrapper.eq("inventory_status",inventorystatus); + queryWrapper.eq("location_code",locationcode); + List expectoutDO = expectoutMapper.selectList(queryWrapper); + + + if(!expectoutDO.isEmpty()){ + + return expectoutDO; + } + else{ + return null; + } + + + } + //按批次查詢 BY_BATCH + public List selectbatchnew(String itemcode,String batch ,String inventorystatus,String locationcode ){ + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("item_code",itemcode); + queryWrapper.eq("batch",batch); + queryWrapper.eq("inventory_status",inventorystatus); + queryWrapper.eq("location_code",locationcode); + List expectoutDO = expectoutMapper.selectList(queryWrapper); + + + if(!expectoutDO.isEmpty()){ + + return expectoutDO; + } + else{ + return null; + } + + } + //按包裝 BY_PACKAGING + public List selectpackingnew(String itemcode, String packingnumber ,String batch ,String inventorystatus,String locationcode ){ + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("item_code",itemcode); + queryWrapper.eq("batch",batch); + queryWrapper.eq("packing_number",packingnumber); + queryWrapper.eq("inventory_status",inventorystatus); + queryWrapper.eq("location_code",locationcode); + List expectoutDO = expectoutMapper.selectList(queryWrapper); + + + if(!expectoutDO.isEmpty()){ + + return expectoutDO; + } + else{ + return null; + } + + } + //按唯一码查詢 BY_UNIQUE_ID + public List selectuniqeidnew( String packingnumber ,String locationcode ,String inventorystatus ){ + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("packing_number",packingnumber); + queryWrapper.eq("inventory_status",inventorystatus); + queryWrapper.eq("location_code",locationcode); + List expectoutDO = expectoutMapper.selectList(queryWrapper); + + + if(!expectoutDO.isEmpty()){ + + return expectoutDO; + } + else{ + return null; + } + + } + //跟据管理模式查询预计库存 TEO1 + public List selectlocationnew (String itemcode, String packingnumber, String batch, String locationcode, String status ){ + RuleRespVO managementtRule = ruleService.management( null, null,null,null,null, null,itemcode,null,null, + null, locationcode,null,null); + List expectoutDO = null; + if( "{\"ManagementPrecision\":\"BY_QUANTITY\"}".equals( managementtRule.getConfiguration())){ + expectoutDO = selectnumbernew(itemcode, status, locationcode ); + + } + else if("{\"ManagementPrecision\":\"BY_BATCH\"}".equals(managementtRule.getConfiguration())){ + expectoutDO = selectbatchnew(itemcode,batch,status,locationcode); + + } + + else if("{\"ManagementPrecision\":\"BY_PACKAGING\"}".equals(managementtRule.getConfiguration())) { + expectoutDO = selectpackingnew(itemcode,packingnumber, batch, status, locationcode); + } + + else if("{\"ManagementPrecision\":\"BY_UNIQUE_ID\"}".equals(managementtRule.getConfiguration())) { + expectoutDO = selectuniqeidnew(packingnumber, locationcode,status); + } + + return expectoutDO; + + } + + + //查询可用库存 TB3 + + public BigDecimal CountLocaltion(String itemcode,String packingnumber,String batch,String locationcode,String status ){ + List expectoutDO = selectlocationnew(itemcode,packingnumber,batch,locationcode,status); + List balanceDO = selectlocation(itemcode,packingnumber,batch,locationcode,status); + + //double sum = expectoutDO.stream().mapToDouble(ExpectoutDO::getQty).sum(); + BigDecimal esum = BigDecimal.valueOf(expectoutDO.stream().mapToDouble(expectoutDO1 -> expectoutDO1.getQty().doubleValue()).sum()); + BigDecimal bsum =BigDecimal.valueOf(balanceDO.stream().mapToDouble(balanceDO1 -> balanceDO1.getQty().doubleValue()).sum()); + BigDecimal sum = bsum.subtract(esum); + return sum; + } + //有无库存效验 + + public String LocaltionExist(String itemcode, String packingnumber,String batch,String locationcode,String status,BigDecimal requstqty){ + BigDecimal enableqty = CountLocaltion(itemcode,packingnumber,batch,locationcode,status); + if(requstqty.compareTo(enableqty) > 0){ + throw exception(new ErrorCode(1256,"请求数量" + requstqty + "大于库存数量" + enableqty)); + } + else{ + return "成功"; + } + + } + + + + + + //查询储存容量 + + public String selectlocationstrategy(String itemcode, String locationcode){ + RuleRespVO storagecapacityrule = ruleService.storageCapacity(null,null,itemcode,null,null,null,locationcode); + String[] StorageQty = storagecapacityrule.getConfiguration().split(","); + String[] StorageQty1 = StorageQty[1].split(":"); + String StorageQty2 = StorageQty1[1]; + if("-1".equals(StorageQty2)){ + return "不可以存放"; + } + return "可以存放"; + + } + + + //库存不应该存在 + public List locationNoExist(String itemcode,String packingnumber,String locationcode,String inventorystatus){ + RuleRespVO managementtRule = ruleService.management( null, null,null,null,null, null,itemcode,null,null, + null, locationcode,null,null); + List balanceDO = null; + if("{\"ManagementPrecision\":\"BY_UNIQUE_ID\"}".equals(managementtRule.getConfiguration())){ + balanceDO = selectuniqueid(packingnumber, locationcode,inventorystatus); + return balanceDO; + + } + else{ + throw exception(new ErrorCode(1256,"校验通过" )); + } + + + } + //查询库位BQ-QL + public String selectlocation(String code){ + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("code",code); + LocationDO locationDO = locationMapper.selectOne(queryWrapper); + if(locationDO==null&&"TRUE".equals(locationDO.getAvailable())){ + return "TURE"; + } + else{ + return "FALSE"; + } + } + + + + + + + + + + + //从库位未被其他任务占用,有可用库存 + public String locationExistnew(String itemcode, String packingnumber,String batch,String fromlocationcode,String status,BigDecimal requstqty ){ + if(fromlocationcode.isEmpty()){ + return "不需要其他校验"; + } + String Yesorno = selectlocation(fromlocationcode); + if("TURE".equals(Yesorno)){ + + String END = LocaltionExist(itemcode,packingnumber,batch,fromlocationcode,status,requstqty); + return END; + } + else{ + return "效验通过"; + } + + } + + + + + }