From 80c54edf900521057f69c81abb5cf3c056926350 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期一, 29 五月 2023 13:50:58 +0800
Subject: [PATCH] 出库作业-提取后自动选择出库库位
---
src/main/java/com/zy/asrs/mapper/LocDetlMapper.java | 5 +
src/main/java/com/zy/asrs/service/LocDetlService.java | 8 ++
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java | 162 +++++++++++++++++++++++++++++++++++++++
src/main/resources/mapper/LocDetlMapper.xml | 18 ++++
src/main/java/com/zy/asrs/entity/param/StockOutParam.java | 7 +
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java | 19 ++++
6 files changed, 216 insertions(+), 3 deletions(-)
diff --git a/src/main/java/com/zy/asrs/entity/param/StockOutParam.java b/src/main/java/com/zy/asrs/entity/param/StockOutParam.java
index 331d3b0..9a99ca0 100644
--- a/src/main/java/com/zy/asrs/entity/param/StockOutParam.java
+++ b/src/main/java/com/zy/asrs/entity/param/StockOutParam.java
@@ -31,6 +31,13 @@
// 鏁伴噺
private Double count;
+ public LocDetl(String locNo, String matnr, String batch, Double count) {
+ this.locNo = locNo;
+ this.matnr = matnr;
+ this.batch = batch;
+ this.count = count;
+ }
+
}
}
diff --git a/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java b/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
index 0d488d4..18f7a4f 100644
--- a/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
@@ -73,5 +73,10 @@
List<LocDetl> selectByLocNo(@Param("locNo") String locNo);
+ List<LocDetl> selectByLocNosAndMatnr(@Param("locNos") List<String> locNos, String matnr);
+
List<LocDetl> searchByLike(String orderNo, String matnr, String maktx, String specs, String locNo);//閫氳繃璁㈠崟鍙枫�佺墿鏂欏彿銆佺墿鏂欏悕绉般�佽鏍笺�佸簱浣嶅彿杩涜妯$硦鎼滅储
+
+ List<LocDetl> findAreaByMatnr(String matnr,Integer locType2);
+
}
diff --git a/src/main/java/com/zy/asrs/service/LocDetlService.java b/src/main/java/com/zy/asrs/service/LocDetlService.java
index 6f5a09d..20c61df 100644
--- a/src/main/java/com/zy/asrs/service/LocDetlService.java
+++ b/src/main/java/com/zy/asrs/service/LocDetlService.java
@@ -68,5 +68,13 @@
List<LocDetl> selectByLocNo(String locNo);
+ List<LocDetl> selectByLocNosAndMatnr(List<String> locNos, String matnr);
+
List<LocDetl> searchByLike(String orderNo, String matnr, String maktx, String specs, String locNo);//閫氳繃璁㈠崟鍙枫�佺墿鏂欏彿銆佺墿鏂欏悕绉般�佽鏍笺�佸簱浣嶅彿杩涜妯$硦鎼滅储
+
+ List<LocDetl> findHighAreaByMatnr(String matnr);//閫氳繃鐗╂枡鍙锋煡璇㈤珮棰戝尯鍩�
+
+ List<LocDetl> findSingleAreaByMatnr(String matnr);//閫氳繃鐗╂枡鍙锋煡璇㈠崟鍝佸尯鍩�
+
+ List<LocDetl> findLowAreaByMatnr(String matnr);//閫氳繃鐗╂枡鍙锋煡璇綆棰戞贩鏀惧尯
}
diff --git a/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
index 2008981..80f3207 100644
--- a/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
@@ -154,6 +154,10 @@
return this.baseMapper.selectByLocNo(locNo);
}
+ @Override
+ public List<LocDetl> selectByLocNosAndMatnr(List<String> locNos, String matnr) {
+ return this.baseMapper.selectByLocNosAndMatnr(locNos, matnr);
+ }
@Override
public LocDetl selectItem(String locNo, String matnr, String batch) {
@@ -167,4 +171,19 @@
}
return this.baseMapper.searchByLike(orderNo, matnr, maktx, specs, locNo);
}
+
+ @Override
+ public List<LocDetl> findHighAreaByMatnr(String matnr) {
+ return this.baseMapper.findAreaByMatnr(matnr, 2);
+ }
+
+ @Override
+ public List<LocDetl> findSingleAreaByMatnr(String matnr) {
+ return this.baseMapper.findAreaByMatnr(matnr, 1);
+ }
+
+ @Override
+ public List<LocDetl> findLowAreaByMatnr(String matnr) {
+ return this.baseMapper.findAreaByMatnr(matnr, 3);
+ }
}
diff --git a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
index 3f02ed6..ed6eed2 100644
--- a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -160,8 +160,38 @@
@Transactional
public void startupFullTakeStore(StockOutParam param, Long userId) {
ArrayList<String> locNos = new ArrayList<>();
- for (StockOutParam.LocDetl locDetl:param.getLocDetls()){
- if (!locNos.contains(locDetl.getLocNo())){
+ List<StockOutParam.LocDetl> locDetls = new ArrayList<>();
+ ArrayList<String> matnrs = new ArrayList<>();
+ for (StockOutParam.LocDetl locDetl : param.getLocDetls()) {
+ if (!matnrs.contains(locDetl.getMatnr())) {
+ matnrs.add(locDetl.getMatnr());
+
+ //1.鏍规嵁鐗╂枡鍙峰厛鎼滅储楂橀鍖哄煙鏄惁鏈夊簱瀛�
+ List<StockOutParam.LocDetl> locNoStep1 = this.findLocNoStep1(locDetl);
+ if (locNoStep1 != null) {
+ locDetls.addAll(locNoStep1);
+ continue;
+ }
+
+ //楂橀娣锋斁鍖哄煙娌℃湁婊¤冻鐨勫簱浣嶏紝鍦ㄥ崟鍝佸尯鍩熻繘琛屾悳绱�
+ List<StockOutParam.LocDetl> locNoStep2 = this.findLocNoStep2(locDetl);
+ if (locNoStep2 != null) {
+ locDetls.addAll(locNoStep2);
+ continue;
+ }
+
+ //浣庨娣锋斁鍖哄煙杩涜鎼滅储
+ List<StockOutParam.LocDetl> locNoStep3 = this.findLocNoStep3(locDetl);
+ if (locNoStep3 != null) {
+ locDetls.addAll(locNoStep3);
+ continue;
+ }
+
+ }
+ }
+
+ for (StockOutParam.LocDetl locDetl : locDetls) {
+ if (!locNos.contains(locDetl.getLocNo())) {
locNos.add(locDetl.getLocNo());
}
}
@@ -173,7 +203,7 @@
BasDevp staNo = basDevpService.checkSiteStatus(param.getOutSite());
// 鑾峰彇搴撲綅鏄庣粏
List<LocDetlDto> locDetlDtos = new ArrayList<>();
- for (StockOutParam.LocDetl paramLocDetl : param.getLocDetls()) {
+ for (StockOutParam.LocDetl paramLocDetl : locDetls) {
if (!Cools.isEmpty(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getCount())) {
LocDetl one = locDetlService.selectItem(paramLocDetl.getLocNo(), paramLocDetl.getMatnr(), paramLocDetl.getBatch());
if (null != one) locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount()));
@@ -192,6 +222,132 @@
}
}
+ //1.鏍规嵁鐗╂枡鍙峰厛鎼滅储楂橀鍖哄煙鏄惁鏈夊簱瀛�
+ private List<StockOutParam.LocDetl> findLocNoStep1(StockOutParam.LocDetl locDetl) {
+ List<StockOutParam.LocDetl> locDetlList = new ArrayList<>();
+ //1.鏍规嵁鐗╂枡鍙峰厛鎼滅储楂橀鍖哄煙鏄惁鏈夊簱瀛�
+ List<LocDetl> locDetls = locDetlService.findHighAreaByMatnr(locDetl.getMatnr());
+ if (locDetls.size() > 0) {
+ for (LocDetl locDetl0 : locDetls) {
+ if (locDetl0.getAnfme() >= locDetl.getCount()) {
+ //鎵惧埌鐨勫簱瀛� >= 鎵�闇�搴撳瓨锛屾弧瓒虫潯浠�
+ locDetlList.add(new StockOutParam.LocDetl(locDetl0.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), locDetl0.getAnfme()));
+ return locDetlList;
+ } else {
+ //涓嶆弧瓒冲簱瀛樻潯浠�
+ //鍒ゆ柇鏈�澶栦晶搴撲綅鐨勬繁澶勬槸鍚︽湁鐩稿悓鐗╂枡
+ Double useCount = locDetl0.getAnfme();//宸蹭娇鐢ㄧ殑鏁伴噺
+ List<StockOutParam.LocDetl> tmpLocDetlList = new ArrayList<>();//璁板綍缁忚繃鐨勫簱浣�
+ tmpLocDetlList.add(new StockOutParam.LocDetl(locDetl0.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), locDetl0.getAnfme()));
+
+ List<String> insideLoc = Utils.getGroupInsideLoc(locDetl0.getLocNo());
+ List<LocDetl> locDetls1 = locDetlService.selectByLocNosAndMatnr(insideLoc, locDetl.getMatnr());
+ if (locDetls1.size() == 0) {//鍐呬晶搴撲綅娌℃湁鐩稿悓鐨勭墿鏂欙紝璺宠繃
+ continue;
+ }
+
+ for (LocDetl detl : locDetls1) {
+ double lastCount = locDetl.getCount() - useCount;//鍓╀綑鎵�闇�鏁伴噺
+ double realCount = 0;//瀹為檯鎻愪緵鏁伴噺
+ if (detl.getAnfme() >= lastCount) {//瀹為檯鏁伴噺澶т簬鎵�闇�鏁伴噺锛屾寜鎵�闇�鏁伴噺鎻愪緵
+ realCount = lastCount;
+ }else {
+ //瀹為檯灏忎簬鎵�闇�鏁伴噺锛屾寜瀹為檯鏁伴噺鎻愪緵
+ realCount = detl.getAnfme();
+ }
+ useCount += realCount;
+ tmpLocDetlList.add(new StockOutParam.LocDetl(detl.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), realCount));
+ if (useCount >= locDetl.getCount()) {
+ //鎵惧埌鐨勫簱瀛� >= 鎵�闇�搴撳瓨锛屾弧瓒虫潯浠�
+ locDetlList.addAll(tmpLocDetlList);
+ return locDetlList;
+ }
+ }
+
+ }
+ }
+
+ //鏈�澶栦晶鍖呮嫭鍐呬晶閮芥棤婊¤冻搴撲綅锛屽垯鍒ゆ柇鎼滅储鍑烘潵鐨勫叏閮ㄦ渶澶栦晶搴撲綅鍔犺捣鏉ユ槸鍚︽弧瓒冲嚭搴撴暟閲忚姹�
+ Double useCount = 0D;
+ for (LocDetl locDetl0 : locDetls) {
+ double lastCount = locDetl.getCount() - useCount;//鍓╀綑鎵�闇�鏁伴噺
+ double realCount = 0;//瀹為檯鎻愪緵鏁伴噺
+ if (locDetl0.getAnfme() >= lastCount) {//瀹為檯鏁伴噺澶т簬鎵�闇�鏁伴噺锛屾寜鎵�闇�鏁伴噺鎻愪緵
+ realCount = lastCount;
+ }else {
+ //瀹為檯灏忎簬鎵�闇�鏁伴噺锛屾寜瀹為檯鏁伴噺鎻愪緵
+ realCount = locDetl0.getAnfme();
+ }
+ useCount += realCount;//宸蹭娇鐢ㄧ殑鏁伴噺
+ locDetlList.add(new StockOutParam.LocDetl(locDetl0.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), realCount));
+ if (useCount >= locDetl.getCount()) {
+ //鎵惧埌鐨勫簱瀛� >= 鎵�闇�搴撳瓨锛屾弧瓒虫潯浠�
+ return locDetlList;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ //楂橀娣锋斁鍖哄煙娌℃湁婊¤冻鐨勫簱浣嶏紝鍦ㄥ崟鍝佸尯鍩熻繘琛屾悳绱�
+ private List<StockOutParam.LocDetl> findLocNoStep2(StockOutParam.LocDetl locDetl) {
+ List<StockOutParam.LocDetl> locDetlList = new ArrayList<>();
+ //鍦ㄥ崟鍝佸尯鍩熻繘琛屾悳绱�
+ List<LocDetl> locDetls = locDetlService.findSingleAreaByMatnr(locDetl.getMatnr());
+ if (locDetls.size() > 0) {
+ Double useCount = 0D;
+ for (LocDetl locDetl0 : locDetls) {
+ double lastCount = locDetl.getCount() - useCount;//鍓╀綑鎵�闇�鏁伴噺
+ double realCount = 0;//瀹為檯鎻愪緵鏁伴噺
+ if (locDetl0.getAnfme() >= lastCount) {//瀹為檯鏁伴噺澶т簬鎵�闇�鏁伴噺锛屾寜鎵�闇�鏁伴噺鎻愪緵
+ realCount = lastCount;
+ }else {
+ //瀹為檯灏忎簬鎵�闇�鏁伴噺锛屾寜瀹為檯鏁伴噺鎻愪緵
+ realCount = locDetl0.getAnfme();
+ }
+ useCount += realCount;//宸蹭娇鐢ㄧ殑鏁伴噺
+
+ locDetlList.add(new StockOutParam.LocDetl(locDetl0.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), realCount));
+ if (useCount >= locDetl.getCount()) {
+ //鎵惧埌鐨勫簱瀛� >= 鎵�闇�搴撳瓨锛屾弧瓒虫潯浠�
+ return locDetlList;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ //浣庨娣锋斁鍖哄煙杩涜鎼滅储
+ private List<StockOutParam.LocDetl> findLocNoStep3(StockOutParam.LocDetl locDetl) {
+ List<StockOutParam.LocDetl> locDetlList = new ArrayList<>();
+ //鍦ㄥ崟鍝佸尯鍩熻繘琛屾悳绱�
+ List<LocDetl> locDetls = locDetlService.findLowAreaByMatnr(locDetl.getMatnr());
+ if (locDetls.size() > 0) {
+ Double useCount = 0D;
+ for (LocDetl locDetl0 : locDetls) {
+ double lastCount = locDetl.getCount() - useCount;//鍓╀綑鎵�闇�鏁伴噺
+ double realCount = 0;//瀹為檯鎻愪緵鏁伴噺
+ if (locDetl0.getAnfme() >= lastCount) {//瀹為檯鏁伴噺澶т簬鎵�闇�鏁伴噺锛屾寜鎵�闇�鏁伴噺鎻愪緵
+ realCount = lastCount;
+ }else {
+ //瀹為檯灏忎簬鎵�闇�鏁伴噺锛屾寜瀹為檯鏁伴噺鎻愪緵
+ realCount = locDetl0.getAnfme();
+ }
+ useCount += realCount;//宸蹭娇鐢ㄧ殑鏁伴噺
+
+ locDetlList.add(new StockOutParam.LocDetl(locDetl0.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), realCount));
+ if (useCount >= locDetl.getCount()) {
+ //鎵惧埌鐨勫簱瀛� >= 鎵�闇�搴撳瓨锛屾弧瓒虫潯浠�
+ return locDetlList;
+ }
+ }
+ }
+
+ return null;
+ }
+
@Override
@Transactional
public void stockOut(BasDevp staNo, List<LocDetlDto> locDetlDtos, IoWorkType ioWorkType, Long userId) {
diff --git a/src/main/resources/mapper/LocDetlMapper.xml b/src/main/resources/mapper/LocDetlMapper.xml
index 6726429..c605993 100644
--- a/src/main/resources/mapper/LocDetlMapper.xml
+++ b/src/main/resources/mapper/LocDetlMapper.xml
@@ -512,9 +512,17 @@
SELECT * FROM [dbo].[asr_loc_detl_group] WHERE 1 = 1
<include refid="groupListCondition"></include>
</select>
+
<select id="selectByLocNo" resultMap="BaseResultMap">
SELECT * FROM asr_loc_detl WHERE loc_no = #{locNo}
+ </select>
+ <select id="selectByLocNosAndMatnr" resultMap="BaseResultMap">
+ SELECT * FROM asr_loc_detl WHERE loc_no in
+ <foreach item="item" collection="locNos" index="index" separator="," open="(" close=")">
+ #{item}
+ </foreach>
+ and matnr = #{matnr}
</select>
<select id="searchByLike" resultMap="BaseResultMap">
@@ -539,4 +547,14 @@
</if>
</select>
+ <select id="findAreaByMatnr" resultMap="BaseResultMap">
+ select * from asr_loc_detl ld
+ left join asr_loc_mast lm
+ on lm.loc_no = ld.loc_no
+ where matnr = #{matnr}
+ and loc_type2 = #{locType2}
+ and loc_sts = 'F'
+ order by anfme desc,row1,bay1,lev1
+ </select>
+
</mapper>
--
Gitblit v1.9.1