From 2e6a791edfbb1236e88d53c7eb11744a3ee36ba4 Mon Sep 17 00:00:00 2001 From: "ZHOUZ\\Noble'lift" <1014987728@qq.com> Date: Tue, 25 Oct 2022 18:43:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=87=BA=E5=85=A5=E5=BA=93=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basedata/master/wql/QMD_ME_MATERIAL.wql | 17 +- .../org/nl/wms/basedata/master/wql/mdme.xls | Bin 172544 -> 210432 bytes .../java/org/nl/wms/basedata/st/wql/stivt.xls | Bin 238080 -> 257536 bytes .../wms/ext/crm/rest/CrmToLmsController.java | 3 + .../crm/service/impl/CrmToLmsServiceImpl.java | 65 +- .../wms/ext/mes/rest/MesToLmsController.java | 13 +- .../wms/ext/mes/service/MesToLmsService.java | 5 +- .../mes/service/impl/LmsToMesServiceImpl.java | 11 + .../mes/service/impl/MesToLmsServiceImpl.java | 180 ++- .../sap/service/impl/LmsToSapServiceImpl.java | 4 + .../main/java/org/nl/wms/ext/wql/QCRM_001.wql | 89 ++ .../main/java/org/nl/wms/log/LokiLogType.java | 6 +- .../src/main/java/org/nl/wms/pdm/wql/pdm.xls | Bin 245248 -> 280576 bytes ...nController.java => InStorController.java} | 2 +- .../inbill/rest/RawAssistIStorController.java | 225 +++ .../inbill/service/CheckOutBillService.java | 161 ++ .../inbill/service/RawAssistIStorService.java | 63 + .../st/inbill/service/StorPublicService.java | 46 + .../service/impl/InbillServiceImpl.java | 316 ++++ .../impl/RawAssistIStorServiceImpl.java | 1394 +++++++++++++++++ .../service/impl/StorPublicServiceImpl.java | 567 +++++++ .../st/inbill/wql/QST_IVT_RAWASSISTISTOR.wql | 394 +++++ .../nl/wms/st/inbill/wql/ST_PUB_QUERY_01.wql | 145 ++ .../outbill/rest/CheckOutBillController.java | 190 +++ .../service/impl/CheckOutBillServiceImpl.java | 1279 +++++++++++++++ .../st/outbill/wql/QST_IVT_CHECKOUTBILL.wql | 681 ++++++++ .../src/main/resources/logback-spring.xml | 4 +- .../wms/basedata/master/material/index.vue | 3 - .../src/views/wms/pub/StructDialog.vue | 201 +++ .../src/views/wms/st/inbill/AddDialog.vue | 400 +++++ .../src/views/wms/st/inbill/AddDtl.vue | 171 ++ .../views/wms/st/inbill/BucketDtlDialog.vue | 113 ++ .../src/views/wms/st/inbill/DivDialog.vue | 627 ++++++++ .../wms/st/inbill/StructUpdateDialog.vue | 268 ++++ .../src/views/wms/st/inbill/TaskDialog.vue | 401 +++++ .../src/views/wms/st/inbill/ViewDialog.vue | 289 ++++ .../src/views/wms/st/inbill/index.vue | 642 ++++---- .../src/views/wms/st/inbill/rawassist.js | 197 +++ .../src/views/wms/st/inbill/regionioIn.js | 35 - .../src/views/wms/st/outbill/AddDialog.vue | 502 ++++++ .../src/views/wms/st/outbill/AddDtl.vue | 137 ++ .../src/views/wms/st/outbill/DivDialog.vue | 502 ++++++ .../src/views/wms/st/outbill/MaterDialog.vue | 165 -- .../src/views/wms/st/outbill/StructIvt.vue | 245 +++ .../src/views/wms/st/outbill/TaskDialog.vue | 324 ++++ .../src/views/wms/st/outbill/ViewDialog.vue | 289 ++++ .../src/views/wms/st/outbill/checkoutbill.js | 158 ++ .../src/views/wms/st/outbill/index.vue | 625 ++++---- .../src/views/wms/st/outbill/regionioOut.js | 35 - 49 files changed, 11172 insertions(+), 1017 deletions(-) create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/ext/wql/QCRM_001.wql rename lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/rest/{RegionioInController.java => InStorController.java} (98%) create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/rest/RawAssistIStorController.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/CheckOutBillService.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/RawAssistIStorService.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/StorPublicService.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/InbillServiceImpl.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/RawAssistIStorServiceImpl.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/StorPublicServiceImpl.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_IVT_RAWASSISTISTOR.wql create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/ST_PUB_QUERY_01.wql create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/wql/QST_IVT_CHECKOUTBILL.wql create mode 100644 lms/nladmin-ui/src/views/wms/pub/StructDialog.vue create mode 100644 lms/nladmin-ui/src/views/wms/st/inbill/AddDialog.vue create mode 100644 lms/nladmin-ui/src/views/wms/st/inbill/AddDtl.vue create mode 100644 lms/nladmin-ui/src/views/wms/st/inbill/BucketDtlDialog.vue create mode 100644 lms/nladmin-ui/src/views/wms/st/inbill/DivDialog.vue create mode 100644 lms/nladmin-ui/src/views/wms/st/inbill/StructUpdateDialog.vue create mode 100644 lms/nladmin-ui/src/views/wms/st/inbill/TaskDialog.vue create mode 100644 lms/nladmin-ui/src/views/wms/st/inbill/ViewDialog.vue create mode 100644 lms/nladmin-ui/src/views/wms/st/inbill/rawassist.js delete mode 100644 lms/nladmin-ui/src/views/wms/st/inbill/regionioIn.js create mode 100644 lms/nladmin-ui/src/views/wms/st/outbill/AddDialog.vue create mode 100644 lms/nladmin-ui/src/views/wms/st/outbill/AddDtl.vue create mode 100644 lms/nladmin-ui/src/views/wms/st/outbill/DivDialog.vue delete mode 100644 lms/nladmin-ui/src/views/wms/st/outbill/MaterDialog.vue create mode 100644 lms/nladmin-ui/src/views/wms/st/outbill/StructIvt.vue create mode 100644 lms/nladmin-ui/src/views/wms/st/outbill/TaskDialog.vue create mode 100644 lms/nladmin-ui/src/views/wms/st/outbill/ViewDialog.vue create mode 100644 lms/nladmin-ui/src/views/wms/st/outbill/checkoutbill.js delete mode 100644 lms/nladmin-ui/src/views/wms/st/outbill/regionioOut.js diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_ME_MATERIAL.wql b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_ME_MATERIAL.wql index fb52826d0..e42bb7ce0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_ME_MATERIAL.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_ME_MATERIAL.wql @@ -45,34 +45,19 @@ PAGEQUERY SELECT mb.*, - class.class_code, - class.class_name, unit_name, - '50' as standard_weight, - unit_name as base_unit_id_name, - class2.class_code as product_series_code, - class2.class_name as product_series_name - + unit_name as base_unit_id_name FROM md_me_materialbase mb - LEFT JOIN MD_PB_ClassStandard class ON class.class_id = mb.material_type_id LEFT JOIN md_pb_measureunit unit ON unit.measure_unit_id = mb.base_unit_id - left join MD_PB_ClassStandard class2 on class2.class_id =mb.product_series WHERE mb.is_delete = '0' - and 输入.idssql OPTION 输入.search <> "" ( mb.material_code like 输入.search OR mb.material_name like 输入.search ) - ENDOPTION - OPTION 输入.class_code <> "" - class.class_code like 输入.class_code - ENDOPTION - OPTION 输入.classIds <> "" - class.class_id in 输入.classIds ENDOPTION ENDSELECT ENDPAGEQUERY diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/mdme.xls b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/mdme.xls index f9f0f2c94c7af385844ffa3a9a156e528fb21f1a..f03e495c08f8a9d7564007bc8014eae7ce3a5b09 100644 GIT binary patch delta 60538 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
lcLP7BpJlg^`I)6SNBIj}2OS5L$+y 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 Yb9+TrW93^V-|gi(&7%J0cO3iw0Gk*)Hvj+t delta 31094 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 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls index ffdc4110b7aaac60a1078d6be43d9f91fa21028c..5c1cc6a7cfc734a76f9cae718f9cbda512936370 100644 GIT binary patch delta 39494 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≈e4M}O$ZH+^y^d}Yd%m#3Ld9&m4F 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 Uv{^DtSkho_V(IhpCWF=g2a<;F7XSbN delta 35809 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 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/crm/rest/CrmToLmsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/crm/rest/CrmToLmsController.java index 86d1cefbc..c82545800 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/crm/rest/CrmToLmsController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/crm/rest/CrmToLmsController.java @@ -1,5 +1,6 @@ package org.nl.wms.ext.crm.rest; +import cn.dev33.satoken.annotation.SaIgnore; import com.alibaba.fastjson.JSONObject; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -25,6 +26,7 @@ public class CrmToLmsController { @PostMapping("/getCustomerInfo") @Log("CRM给LMS推送客户信息") @ApiOperation("CRM给LMS推送客户信息") + @SaIgnore public ResponseEntity momRollFoilWeighing(@RequestBody JSONObject jo) { return new ResponseEntity<>(crmToLmsService.getCustomerInfo(jo), HttpStatus.OK); } @@ -32,6 +34,7 @@ public class CrmToLmsController { @PostMapping("/getCPIvtInfo") @Log("CRM获取LMS成品库存信息") @ApiOperation("CRM获取LMS成品库存信息") + @SaIgnore public ResponseEntity getCPIvtInfo(@RequestBody JSONObject jo) { return new ResponseEntity<>(crmToLmsService.getCPIvtInfo(jo), HttpStatus.OK); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/crm/service/impl/CrmToLmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/crm/service/impl/CrmToLmsServiceImpl.java index 640db5f33..5cbc290c8 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/crm/service/impl/CrmToLmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/crm/service/impl/CrmToLmsServiceImpl.java @@ -1,19 +1,26 @@ package org.nl.wms.ext.crm.service.impl; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.nl.modules.wql.WQL; import org.nl.wms.ext.crm.service.CrmToLmsService; import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.log.LokiLog; +import org.nl.wms.log.LokiLogType; import org.springframework.stereotype.Service; +import java.util.HashMap; + @Service @RequiredArgsConstructor @Slf4j public class CrmToLmsServiceImpl implements CrmToLmsService { + @LokiLog(type = LokiLogType.CRM_TO_LMS) @Override public JSONObject getCustomerInfo(JSONObject row) { @@ -55,41 +62,49 @@ public class CrmToLmsServiceImpl implements CrmToLmsService { return result; } + @LokiLog(type = LokiLogType.CRM_TO_LMS) @Override public JSONObject getCPIvtInfo(JSONObject jo) { log.info("getCPIvtInfo输入参数为:----------------------" + jo.toString()); - /*String material_code = jo.getString("material_code"); + + String material_code = jo.getString("material_code"); String material_name = jo.getString("material_name"); String mfgordername = jo.getString("mfgordername"); String customername = jo.getString("customername"); String customerdescription = jo.getString("customerdescription"); + String width = jo.getString("width"); - HashMap map = new HashMap<>(); - map.put("")*/ + HashMap map = new HashMap<>(); + if (StrUtil.isNotEmpty(material_code)) { + map.put("material_code", material_code); + } + if (StrUtil.isNotEmpty(material_name)) { + map.put("material_name", material_name); + } + if (StrUtil.isNotEmpty(mfgordername)) { + String[] split = mfgordername.split(","); + String ids = "('"; + for (int i = 0; i < split.length; i++) { + if (i == split.length - 1 || split.length == 1) { + ids += split[i] + "')"; + } else { + ids += split[i] + "','"; + } + } + map.put("mfgordername", ids); + } + if (StrUtil.isNotEmpty(customername)) { + map.put("customername", customername); + } + if (StrUtil.isNotEmpty(customerdescription)) { + map.put("customerdescription", customerdescription); + } + if (StrUtil.isNotEmpty(width)) { + map.put("width", width); + } //将查询条件带入,查询LMS成品库库存信息 - //JSONArray rows = WQL.getWO("").addParamMap(jo).addParam("flag","1").process().getResultJSONArray(0); + JSONArray rows = WQL.getWO("QCRM_001").addParamMap(map).addParam("flag", "1").process().getResultJSONArray(0); - JSONArray rows = new JSONArray(); - - JSONObject row = new JSONObject(); - row.put("material_code", "物料编码"); - row.put("material_name", "物料名称"); - row.put("pcsn", "子卷批次"); - row.put("mfgordername", "销售订单及行号"); - row.put("customername", "客户编号"); - row.put("customerdescription", "客户名称"); - row.put("dateoffginbound", "入库日期"); - row.put("packageboxsn", "木箱唯一码"); - row.put("width", "产品规格(幅宽)"); - row.put("thickness", "产品厚度"); - row.put("netweight", "净重"); - row.put("length", "长度"); - row.put("warehouse_code", "仓库编码"); - row.put("dateofproduction", "生产日期"); - row.put("unplanproductproperty", "物性"); - - rows.add(row); - rows.add(row); JSONObject result = new JSONObject(); result.put("RTYPE", "S"); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToLmsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToLmsController.java index 35ca45bcb..2075eafc1 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToLmsController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/rest/MesToLmsController.java @@ -1,6 +1,7 @@ package org.nl.wms.ext.mes.rest; import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -39,6 +40,14 @@ public class MesToLmsController { return new ResponseEntity<>(mesToLmsService.momRollFoilWeighing(jo), HttpStatus.OK); } + @PostMapping("test") + @Log("MES获取AGV称重信息") + @ApiOperation("MES获取AGV称重信息") + @SaIgnore + public ResponseEntity test(@RequestBody JSONObject jo) { + return new ResponseEntity<>(mesToLmsService.test(jo), HttpStatus.OK); + } + @PostMapping("/momRollFoilComplete") @Log("MES执行下卷动作告诉LMS") @ApiOperation("MES执行下卷动作告诉LMS") @@ -75,8 +84,8 @@ public class MesToLmsController { @Log("当母卷开始分切时,MES系统会将对应的子卷进站信息发送给只能物流系统,一方面物流系统可以预估下个母卷的送达时间,也可以闭环期分切计划指令") @ApiOperation("当母卷开始分切时,MES系统会将对应的子卷进站信息发送给只能物流系统,一方面物流系统可以预估下个母卷的送达时间,也可以闭环期分切计划指令") @SaIgnore - public ResponseEntity childRollCutStartComp(@RequestBody JSONObject jo) { - return new ResponseEntity<>(mesToLmsService.childRollCutStartComp(jo), HttpStatus.OK); + public ResponseEntity childRollCutStartComp(@RequestBody JSONArray ja) { + return new ResponseEntity<>(mesToLmsService.childRollCutStartComp(ja), HttpStatus.OK); } @PostMapping("/childRollPackComplete") diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToLmsService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToLmsService.java index ebdadf3d8..989d15718 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToLmsService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/MesToLmsService.java @@ -1,5 +1,6 @@ package org.nl.wms.ext.mes.service; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; public interface MesToLmsService { @@ -13,6 +14,8 @@ public interface MesToLmsService { */ JSONObject momRollFoilWeighing(JSONObject param); + JSONObject test(JSONObject param); + /** * MES执行下卷动作告诉LMS */ @@ -36,7 +39,7 @@ public interface MesToLmsService { /** * 当母卷开始分切时,MES系统会将对应的子卷进站信息发送给只能物流系统,一方面物流系统可以预估下个母卷的送达时间,也可以闭环期分切计划指令 */ - JSONObject childRollCutStartComp(JSONObject param); + JSONObject childRollCutStartComp(JSONArray param); /** * 包装完成,传智能物流包装箱与子卷关系及子卷属性值,LMS执行入库 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/LmsToMesServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/LmsToMesServiceImpl.java index bb5a897c5..1aa35985c 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/LmsToMesServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/LmsToMesServiceImpl.java @@ -9,6 +9,8 @@ import lombok.extern.slf4j.Slf4j; import org.nl.modules.system.service.impl.ParamServiceImpl; import org.nl.modules.wql.util.SpringContextHolder; import org.nl.wms.ext.mes.service.LmsToMesService; +import org.nl.wms.log.LokiLog; +import org.nl.wms.log.LokiLogType; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; @@ -25,6 +27,7 @@ public class LmsToMesServiceImpl implements LmsToMesService { * * @return */ + @LokiLog(type = LokiLogType.LMS_TO_MES) @Override public JSONObject momRollFoilWeighing(JSONObject param) { log.info("momRollFoilWeighing接口输入参数为:-------------------"+param); @@ -72,6 +75,7 @@ public class LmsToMesServiceImpl implements LmsToMesService { * * @return */ + @LokiLog(type = LokiLogType.LMS_TO_MES) @Override public JSONObject momRollBakeInBound(JSONObject param) { log.info("momRollBakeInBound接口输入参数为:-------------------"+param.toString()); @@ -117,6 +121,7 @@ public class LmsToMesServiceImpl implements LmsToMesService { * * @return */ + @LokiLog(type = LokiLogType.LMS_TO_MES) @Override public JSONObject momRollBakeOutBound(JSONObject param) { log.info("momRollBakeOutBound接口输入参数为:-------------------"+param.toString()); @@ -162,6 +167,7 @@ public class LmsToMesServiceImpl implements LmsToMesService { * * @return */ + @LokiLog(type = LokiLogType.LMS_TO_MES) @Override public JSONObject momRollSemiFGInboundComplete(JSONObject param) { log.info("momRollSemiFGInboundComplete接口输入参数为:-------------------"+param.toString()); @@ -207,6 +213,7 @@ public class LmsToMesServiceImpl implements LmsToMesService { * * @return */ + @LokiLog(type = LokiLogType.LMS_TO_MES) @Override public JSONObject airSwellWithPaperTubeAssComplete(JSONObject param) { log.info("airSwellWithPaperTubeAssComplete接口输入参数为:-------------------"+param.toString()); @@ -252,6 +259,7 @@ public class LmsToMesServiceImpl implements LmsToMesService { * * @return */ + @LokiLog(type = LokiLogType.LMS_TO_MES) @Override public JSONObject cutPlanMomRollDeliveryComplete(JSONObject param) { log.info("cutPlanMomRollDeliveryComplete接口输入参数为:-------------------"+param.toString()); @@ -297,6 +305,7 @@ public class LmsToMesServiceImpl implements LmsToMesService { * * @return */ + @LokiLog(type = LokiLogType.LMS_TO_MES) @Override public JSONObject airSwellWithPaperTubeAssArrival(JSONObject param) { log.info("airSwellWithPaperTubeAssArrival接口输入参数为:-------------------"+param.toString()); @@ -342,6 +351,7 @@ public class LmsToMesServiceImpl implements LmsToMesService { * * @return */ + @LokiLog(type = LokiLogType.LMS_TO_MES) @Override public JSONObject childRollFGInboundComplete(JSONObject param) { log.info("childRollFGInboundComplete接口输入参数为:-------------------"+param.toString()); @@ -387,6 +397,7 @@ public class LmsToMesServiceImpl implements LmsToMesService { * * @return */ + @LokiLog(type = LokiLogType.LMS_TO_MES) @Override public JSONObject childRollFGOutboundComplete(JSONObject param) { log.info("childRollFGOutboundComplete接口输入参数为:-------------------"+param.toString()); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java index ed2d41d1d..23c336677 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToLmsServiceImpl.java @@ -11,7 +11,10 @@ import lombok.extern.slf4j.Slf4j; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.wms.ext.mes.service.MesToLmsService; +import org.nl.wms.log.LokiLog; +import org.nl.wms.log.LokiLogType; import org.springframework.stereotype.Service; +import sun.security.krb5.internal.crypto.Des; @Service @RequiredArgsConstructor @@ -33,6 +36,7 @@ public class MesToLmsServiceImpl implements MesToLmsService { * * @return */ + @LokiLog(type = LokiLogType.MES_TO_LMS) @Override public JSONObject momRollFoilStart(JSONObject param) { log.info("momRollFoilStart接口输入参数为:-------------------" + param.toString()); @@ -61,7 +65,6 @@ public class MesToLmsServiceImpl implements MesToLmsService { if (ObjectUtil.isEmpty(TheoryHeight)) throw new BadRequestException("理论长度不能为空"); if (ObjectUtil.isEmpty(EqpVelocity)) throw new BadRequestException("生产速度不能为空"); if (ObjectUtil.isEmpty(UpCoilerDate)) throw new BadRequestException("开始时间不能为空"); - if (ObjectUtil.isEmpty(IsReloadSend)) throw new BadRequestException("是否重新更新不能为空"); JSONObject jsonPoint = pointTab.query("ext_code ='" + ResourceName + "'").uniqueResult(0); if (ObjectUtil.isEmpty(jsonPoint)) { @@ -100,7 +103,7 @@ public class MesToLmsServiceImpl implements MesToLmsService { System.out.println(result); } catch (Exception e) { // 返回失败 - result.put("RTYPE", "S"); + result.put("RTYPE", "E"); result.put("RTMSG", "操作失败!" + e.getMessage()); result.put("RTOAL", 0); result.put("RTDAT", null); @@ -114,41 +117,96 @@ public class MesToLmsServiceImpl implements MesToLmsService { * * @return */ + @LokiLog(type = LokiLogType.MES_TO_LMS) @Override public JSONObject momRollFoilWeighing(JSONObject param) { log.info("momRollFoilStart接口输入参数为:-------------------" + param.toString()); - String ContainerName = param.getString("ContainerName"); - String ResourceName = param.getString("ResourceName"); - //查询该母卷号、设备号对应的生箔工单 - JSONObject raw_jo = WQLObject.getWQLObject("PDM_BI_RawFoilWorkOrder").query("container_name ='" + ContainerName + "' AND resource_name = '" + ResourceName + "'").uniqueResult(0); - - if (ObjectUtil.isEmpty(raw_jo)) { - throw new BadRequestException("未查询到对应的生箔工单!"); - } - - JSONArray data = new JSONArray(); - JSONObject json = new JSONObject(); - json.put("ContainerName", raw_jo.getString("container_name")); - json.put("ResourceName", raw_jo.getString("resource_name")); - json.put("Weight", String.format("%.2f", raw_jo.getDoubleValue("productin_qty"))); - json.put("WeighDate", DateUtil.now()); - data.add(json); JSONObject result = new JSONObject(); - result.put("RTYPE", "S"); - result.put("RTMSG", "操作成功!"); - result.put("RTOAL", 1); - result.put("RTDAT", data); - System.out.println(result); + try { + String ContainerName = param.getString("ContainerName"); + String ResourceName = param.getString("ResourceName"); + //查询该母卷号、设备号对应的生箔工单 + JSONObject raw_jo = WQLObject.getWQLObject("PDM_BI_RawFoilWorkOrder").query("container_name ='" + ContainerName + "' AND resource_name = '" + ResourceName + "'").uniqueResult(0); + + if (ObjectUtil.isEmpty(raw_jo)) { + throw new BadRequestException("未查询到对应的生箔工单!"); + } + + JSONArray data = new JSONArray(); + JSONObject json = new JSONObject(); + json.put("ContainerName", raw_jo.getString("container_name")); + json.put("ResourceName", raw_jo.getString("resource_name")); + json.put("Weight", String.format("%.2f", raw_jo.getDoubleValue("productin_qty"))); + json.put("WeighDate", DateUtil.now()); + data.add(json); + + result.put("RTYPE", "S"); + result.put("RTMSG", "操作成功!"); + result.put("RTOAL", 1); + result.put("RTDAT", data); + System.out.println(result); + + } catch (Exception e) { + result.put("RTYPE", "E"); + result.put("RTMSG", "操作失败!" + e.getMessage()); + result.put("RTOAL", 0); + result.put("RTDAT", null); + System.out.println(result); + } return result; } + @LokiLog(type = LokiLogType.MES_TO_LMS) + @Override + public JSONObject test(JSONObject param) { + log.info("momRollFoilStart接口输入参数为:-------------------" + param.toString()); + + JSONObject result = new JSONObject(); + try { + String ContainerName = param.getString("ContainerName"); + String ResourceName = param.getString("ResourceName"); + String weight = param.getString("weight"); + //查询该母卷号、设备号对应的生箔工单 + JSONObject raw_jo = WQLObject.getWQLObject("PDM_BI_RawFoilWorkOrder").query("container_name ='" + ContainerName + "' AND resource_name = '" + ResourceName + "'").uniqueResult(0); + + if (ObjectUtil.isEmpty(raw_jo)) { + throw new BadRequestException("未查询到对应的生箔工单!"); + } + + if (StrUtil.isEmpty(weight)) { + throw new BadRequestException("未输入重量!"); + } + + raw_jo.put("productin_qty",weight); + + WQLObject.getWQLObject("PDM_BI_RawFoilWorkOrder").update(raw_jo); + + result.put("RTYPE", "S"); + result.put("RTMSG", "操作成功!"); + result.put("RTOAL", 1); + System.out.println(result); + + } catch (Exception e) { + result.put("RTYPE", "E"); + result.put("RTMSG", "操作失败!" + e.getMessage()); + result.put("RTOAL", 0); + result.put("RTDAT", null); + System.out.println(result); + } + return result; + } + + + + /** * MES执行下卷动作告诉LMS * * @param param * @return */ + @LokiLog(type = LokiLogType.MES_TO_LMS) @Override public JSONObject momRollFoilComplete(JSONObject param) { log.info("momRollFoilComplete接口输入参数为:-------------------" + param.toString()); @@ -168,6 +226,7 @@ public class MesToLmsServiceImpl implements MesToLmsService { * @param param * @return */ + @LokiLog(type = LokiLogType.MES_TO_LMS) @Override public JSONObject momRollBakeNextSpecTransfer(JSONObject param) { log.info("momRollBakeNextSpecTransfer接口输入参数为:-------------------" + param.toString()); @@ -187,6 +246,7 @@ public class MesToLmsServiceImpl implements MesToLmsService { * @param param * @return */ + @LokiLog(type = LokiLogType.MES_TO_LMS) @Override public JSONObject cutPlanTransfer(JSONObject param) { log.info("cutPlanTransfer接口输入参数为:-------------------" + param.toString()); @@ -210,6 +270,7 @@ public class MesToLmsServiceImpl implements MesToLmsService { JSONObject result = new JSONObject(); try { + // 基础校验 if (ObjectUtil.isEmpty(orderType)) throw new BadRequestException("分切订单类型不能为空"); if (ObjectUtil.isEmpty(ContainerName)) throw new BadRequestException("子卷号不能为空"); @@ -281,7 +342,7 @@ public class MesToLmsServiceImpl implements MesToLmsService { json.put("split_height", SplitHeight); json.put("split_weight", SplitWeight); json.put("start_time", DateUtil.now()); - json.put("status", "1"); + json.put("status", "0"); json.put("is_parent_ok", "0"); json.put("is_child_tz_ok", "0"); json.put("is_child_ps_ok", "0"); @@ -294,7 +355,7 @@ public class MesToLmsServiceImpl implements MesToLmsService { result.put("RTDAT", null); System.out.println(result); } catch (Exception e) { - result.put("RTYPE", "S"); + result.put("RTYPE", "E"); result.put("RTMSG", "操作失败!" + e.getMessage()); result.put("RTOAL", 0); result.put("RTDAT", null); @@ -309,6 +370,7 @@ public class MesToLmsServiceImpl implements MesToLmsService { * @param param * @return */ + @LokiLog(type = LokiLogType.MES_TO_LMS) @Override public JSONObject callNextAssAndMomRoll(JSONObject param) { log.info("callNextAssAndMomRoll接口输入参数为:-------------------" + param.toString()); @@ -327,9 +389,11 @@ public class MesToLmsServiceImpl implements MesToLmsService { * @param param * @return */ + @LokiLog(type = LokiLogType.MES_TO_LMS) @Override - public JSONObject childRollCutStartComp(JSONObject param) { + public JSONObject childRollCutStartComp(JSONArray param) { log.info("childRollCutStartComp接口输入参数为:-------------------" + param.toString()); + JSONObject result = new JSONObject(); result.put("RTYPE", "S"); result.put("RTMSG", "操作成功!"); @@ -345,9 +409,71 @@ public class MesToLmsServiceImpl implements MesToLmsService { * @param param * @return */ + @LokiLog(type = LokiLogType.MES_TO_LMS) @Override public JSONObject childRollPackComplete(JSONObject param) { log.info("childRollPackComplete接口输入参数为:-------------------" + param.toString()); + + String isUnPlanProductionBox = param.getString("isUnPlanProductionBox"); // 生产订单 + String QuanlityInBox = param.getString("QuanlityInBox"); // 产品编码 + String BoxWeight = param.getString("BoxWeight"); // 产品名称 + String QualityGuaranPeriod = param.getString("QualityGuaranPeriod"); // 分切机台编码 + String ProductName = param.getString("ProductName"); // 来源卷位置 + String Description = param.getString("Description"); // 来源卷位置 + String DateOfFGInbound = param.getString("DateOfFGInbound"); // 来源卷位置 + + JSONArray details = param.getJSONArray("details"); + + for (int i = 0; i < details.size(); i++) { + JSONObject detail = details.getJSONObject(i); + + String PackageBoxSN = detail.getString("PackageBoxSN"); // 分切订单类型 + String ContainerName = detail.getString("ContainerName"); // 子卷号 + String SaleOrderName = detail.getString("SaleOrderName"); // 产品编码 + String CustomerName = detail.getString("CustomerName"); // 产品名称 + String CustomerDescription = detail.getString("CustomerDescription"); // 来源卷位置 + String Width = detail.getString("Width"); // 分切机台编码 + String Thickness = detail.getString("Thickness"); // 分切组 + String MassPerUnitArea = detail.getString("MassPerUnitArea"); // 生产顺序 + String NetWeight = detail.getString("NetWeight"); // 生产订单 + String Length = detail.getString("Length"); + String DateOfProduction = detail.getString("DateOfProduction"); + String isUnPlanProduction = detail.getString("isUnPlanProduction"); + String UnPlanProductProperty1 = detail.getString("UnPlanProductProperty1"); + String UnPlanProductProperty2 = detail.getString("UnPlanProductProperty2"); + String UnPlanProductProperty3 = detail.getString("UnPlanProductProperty3"); + + JSONObject jo = new JSONObject(); + jo.put("workorder_id", IdUtil.getSnowflake(1, 1).nextId()); + jo.put("package_box_SN", PackageBoxSN); + jo.put("quanlity_in_box", QuanlityInBox); + jo.put("box_weight", BoxWeight); + jo.put("quality_guaran_period", QualityGuaranPeriod); + jo.put("sale_order_name", SaleOrderName); + jo.put("customer_name", CustomerName); + jo.put("customer_description", CustomerDescription); + jo.put("product_name", ProductName); + jo.put("product_description", Description); + jo.put("date_of_FG_inbound", DateOfFGInbound); + jo.put("container_name", ContainerName); + jo.put("width", Width); + jo.put("thickness", Thickness); + jo.put("mass_per_unit_area", MassPerUnitArea); + jo.put("net_weight", NetWeight); + jo.put("length", Length); + jo.put("date_of_production", DateOfProduction); + jo.put("is_un_plan_production", isUnPlanProduction); + jo.put("un_plan_product_property1", UnPlanProductProperty1); + jo.put("un_plan_product_property2", UnPlanProductProperty2); + jo.put("un_plan_product_property3", UnPlanProductProperty3); + jo.put("status", "0"); + jo.put("create_id", "1"); + jo.put("create_name", "管理员"); + jo.put("create_time", DateUtil.now()); + WQLObject tab = WQLObject.getWQLObject("PDM_BI_SubPackageRelation"); + tab.insert(jo); + } + JSONObject result = new JSONObject(); result.put("RTYPE", "S"); result.put("RTMSG", "操作成功!"); @@ -363,6 +489,7 @@ public class MesToLmsServiceImpl implements MesToLmsService { * @param param * @return */ + @LokiLog(type = LokiLogType.MES_TO_LMS) @Override public JSONObject inventoryTransferInfoSync(JSONObject param) { log.info("inventoryTransferInfoSync接口输入参数为:-------------------" + param.toString()); @@ -381,6 +508,7 @@ public class MesToLmsServiceImpl implements MesToLmsService { * @param param * @return */ + @LokiLog(type = LokiLogType.MES_TO_LMS) @Override public JSONObject childRollInfoUpdate(JSONObject param) { log.info("childRollInfoUpdate接口输入参数为:-------------------" + param.toString()); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/LmsToSapServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/LmsToSapServiceImpl.java index e2c0aee75..2c073f472 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/LmsToSapServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/LmsToSapServiceImpl.java @@ -9,6 +9,8 @@ import lombok.extern.slf4j.Slf4j; import org.nl.modules.system.service.impl.ParamServiceImpl; import org.nl.modules.wql.util.SpringContextHolder; import org.nl.wms.ext.sap.service.LmsToSapService; +import org.nl.wms.log.LokiLog; +import org.nl.wms.log.LokiLogType; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; @@ -17,6 +19,7 @@ import org.springframework.stereotype.Service; @Slf4j public class LmsToSapServiceImpl implements LmsToSapService { + @LokiLog(type = LokiLogType.LMS_TO_SAP) @Override public JSONObject returnDelivery(JSONObject jo) { /* @@ -74,6 +77,7 @@ public class LmsToSapServiceImpl implements LmsToSapService { } } + @LokiLog(type = LokiLogType.LMS_TO_SAP) @Override public JSONObject returnMoveDtl(JSONObject jo) { /* diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/wql/QCRM_001.wql b/lms/nladmin-system/src/main/java/org/nl/wms/ext/wql/QCRM_001.wql new file mode 100644 index 000000000..b91477fcf --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/wql/QCRM_001.wql @@ -0,0 +1,89 @@ +[交易说明] + 交易名: 二楼到一楼业务 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.material_code TYPEAS s_string + 输入.material_name TYPEAS s_string + 输入.mfgordername TYPEAS f_string + 输入.customername TYPEAS s_string + 输入.customerdescription TYPEAS s_string + 输入.width TYPEAS f_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + sub.product_name AS material_code, + sub.product_description AS material_name, + sub.container_name AS pcsn, + sub.sale_order_name AS mfgordername, + sub.customer_name AS customername, + sub.customer_description AS customerdescription, + sub.date_of_FG_inbound AS dateoffginbound, + sub.package_box_sn AS packageboxsn, + sub.width, + sub.thickness, + sub.net_weight AS netweight, + sub.length, + 'CP01' AS warehouse_code, + sub.date_of_production AS dateofproduction, + sub.un_plan_product_property1 AS unplanproductproperty + FROM + pdm_bi_subpackagerelation sub + WHERE + sub.`status` = '2' + OPTION 输入.material_code <> "" + product_name = 输入.material_code + ENDOPTION + OPTION 输入.material_name <> "" + product_description = 输入.material_name + ENDOPTION + OPTION 输入.mfgordername <> "" + SUBSTRING_INDEX(sale_order_name, "-", 1) IN 输入.mfgordername + ENDOPTION + OPTION 输入.customername <> "" + customer_name = 输入.customername + ENDOPTION + OPTION 输入.customerdescription <> "" + customer_description = 输入.customerdescription + ENDOPTION + OPTION 输入.width <> "" + width >= 输入.width + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/log/LokiLogType.java b/lms/nladmin-system/src/main/java/org/nl/wms/log/LokiLogType.java index b11dcef89..76e4693a8 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/log/LokiLogType.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/log/LokiLogType.java @@ -9,8 +9,10 @@ public enum LokiLogType { DEFAULT("默认"), LMS_TO_MES("LMS请求MES"), MES_TO_LMS("MES请求LMS"), - LMS_TO_SAP("LMS请求MES"), - SAP_TO_LMS("MES请求LMS"); + LMS_TO_CRM("LMS请求CRM"), + CRM_TO_LMS("CRM请求LMS"), + LMS_TO_SAP("LMS请求SAP"), + SAP_TO_LMS("SAP请求LMS"); private String desc; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/pdm.xls b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/pdm.xls index 1eb9ae262803820fedf0001debb28d978710fc8a..d44f13a7e451f411a29e095f69d9a29722d33860 100644 GIT binary patch delta 52779 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

+=PZN_!UX@*dJLqRYJoJalB{nnuyi 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 query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(rawAssistIStorService.pageQuery(whereJson,page), HttpStatus.OK); + } + + @GetMapping("/getType") + @Log("查询单据类型下拉框") + @ApiOperation("查询单据类型下拉框") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity getType(@RequestParam Map whereJson) { + return new ResponseEntity<>(rawAssistIStorService.getType(whereJson), HttpStatus.OK); + } + + @Log("删除出入库单") + @ApiOperation("删除出入库单") + //@PreAuthorize("@el.check('sectattr:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + rawAssistIStorService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @GetMapping("/getBillDtl") + @Log("查询到货通知单") + @ApiOperation("查询到货通知单") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity getBillDtl(@RequestParam Map whereJson,Pageable page) { + return new ResponseEntity<>(rawAssistIStorService.getBillDtl(whereJson,page), HttpStatus.OK); + } + + @PostMapping() + @Log("新增入库单") + @ApiOperation("新增入库单") + //@PreAuthorize("@el.check('structrelamaterial:edit')") + public ResponseEntity insertDtl(@RequestBody Map whereJson){ + rawAssistIStorService.insertDtl(whereJson); + return new ResponseEntity<>(HttpStatus.CREATED); + } + @PutMapping + @Log("修改入库单") + @ApiOperation("修改入库单") + //@PreAuthorize("@el.check('sectattr:edit')") + public ResponseEntity update(@RequestBody Map whereJson){ + rawAssistIStorService.update(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @GetMapping("/getIODtl") + @Log("查询出入库单明细") + @ApiOperation("查询出入库单明细") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity getIODtl(@RequestParam Map whereJson) { + return new ResponseEntity<>(rawAssistIStorService.getIODtl(whereJson), HttpStatus.OK); + } + + @PostMapping("/commit") + @Log("出入单提交") + @ApiOperation("出入单提交") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity commit(@RequestBody Map whereJson) { + rawAssistIStorService.commit(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping("/confirmvehicle") + @Log("组盘确认") + @ApiOperation("组盘确认") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity confirmvehicle(@RequestBody Map whereJson) { + rawAssistIStorService.confirmvehicle(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping("/deleteDisDtl") + @Log("删除一行") + @ApiOperation("删除一行") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity deleteDisDtl(@RequestBody Map whereJson) { + rawAssistIStorService.deleteDisDtl(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping("/getDisDtl") + @Log("查询入库分配载具明细") + @ApiOperation("查询入库分配载具明细") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity getDisDtl(@RequestBody Map whereJson) { + return new ResponseEntity<>(rawAssistIStorService.getDisDtl(whereJson), HttpStatus.OK); + } + + @PostMapping("/divStruct") + @Log("分配货位") + @ApiOperation("分配货位") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity divStruct(@RequestBody Map whereJson) { + rawAssistIStorService.divStruct(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping("/unDivStruct") + @Log("取消分配货位") + @ApiOperation("取消分配货位") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity unDivStruct(@RequestBody Map whereJson) { + rawAssistIStorService.unDivStruct(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping("/divPoint") + @Log("设置起点") + @ApiOperation("分配货位") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity divPoint(@RequestBody Map whereJson) { + rawAssistIStorService.divPoint(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping("/queryTask") + @Log("查询任务") + @ApiOperation("查询任务") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity queryTask(@RequestBody Map whereJson) { + return new ResponseEntity<>(rawAssistIStorService.queryTask(whereJson), HttpStatus.OK); + } + + @PostMapping("/bucketDtl") + @Log("查询托盘桶明细") + @ApiOperation("查询托盘桶明细") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity bucketDtl(@RequestBody Map whereJson) { + return new ResponseEntity<>(rawAssistIStorService.bucketDtl(whereJson), HttpStatus.OK); + } + + @PostMapping("/updateTask") + @Log("变更任务") + @ApiOperation("变更任务") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity updateTask(@RequestBody Map whereJson) { + rawAssistIStorService.updateTask(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping("/delTask") + @Log("删除任务") + @ApiOperation("删除任务") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity delTask(@RequestBody Map whereJson) { + rawAssistIStorService.delTask(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping("/reIssueTask") + @Log("下发") + @ApiOperation("下发") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity reIssueTask(@RequestBody Map whereJson) { + rawAssistIStorService.reIssueTask(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping("/confirmTask") + @Log("完成任务") + @ApiOperation("完成任务") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity confirmTask(@RequestBody Map whereJson) { + rawAssistIStorService.confirmTask(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping("/cancelTask") + @Log("取消完成任务") + @ApiOperation("取消完成任务") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity cancelTask(@RequestBody Map whereJson) { + rawAssistIStorService.cancelTask(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping("/confirm") + @Log("完成单据") + @ApiOperation("完成单据") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity confirm(@RequestBody Map whereJson) { + rawAssistIStorService.confirm(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping("/backConfirm") + @Log("完成入库负单") + @ApiOperation("完成入库负单") + //@PreAuthorize("@el.check('materialtype:list')") + public ResponseEntity backConfirm(@RequestBody Map whereJson) { + rawAssistIStorService.backConfirm(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/CheckOutBillService.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/CheckOutBillService.java new file mode 100644 index 000000000..6ce038b14 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/CheckOutBillService.java @@ -0,0 +1,161 @@ +package org.nl.wms.st.inbill.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.springframework.data.domain.Pageable; + +import java.util.Map; + +public interface CheckOutBillService { + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map pageQuery(Map whereJson, Pageable page); + + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAddDtl(Map whereJson, Pageable page); + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryDtl(Map whereJson, Pageable page); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Long[] ids); + /** + * 新增出库单 + * @param whereJson + * 参数举例: + * {bill_code=, stor_id=1473161852946092032, stor_code=01, stor_name=原材料库, bill_status=10, total_qty=2, detail_count=1, bill_type=010201, remark=, biz_date=2022-01-08, create_mode=, tableData=[{material_id=1309, material_code=090301010001, bill_status=10, material_name=碳化钨粉 02, pcsn=, quality_scode=02, ivt_level=01, is_active=1, plan_qty=2, qty_unit_name=千克\公斤, qty_unit_id=1, remark=, edit=true}]} + * / + */ + void insertDtl (Map whereJson); + /** + * 新增出库单 + * @param whereJson + * 参数举例: + * {bill_code=, stor_id=1473161852946092032, stor_code=01, stor_name=原材料库, bill_status=10, total_qty=2, detail_count=1, bill_type=010201, remark=, biz_date=2022-01-08, create_mode=, tableData=[{material_id=1309, material_code=090301010001, bill_status=10, material_name=碳化钨粉 02, pcsn=, quality_scode=02, ivt_level=01, is_active=1, plan_qty=2, qty_unit_name=千克\公斤, qty_unit_id=1, remark=, edit=true}]} + * / + */ + void insertDtlByJson(JSONObject whereJson); + /** + * 查询出库单明细 + * @param whereJson / + * @return + */ + JSONArray getOutBillDtl(Map whereJson); + /** + * 查询出库单分配明细 + * @param whereJson / + * @return + */ + JSONArray getOutBillDis(Map whereJson); + /** + * 查询出库单分配明细 + * @param whereJson / + * @return + */ + JSONArray getOutBillDisDtl(Map whereJson); + /** + * 查询出库单分配任务 + * @param whereJson / + * @return + */ + JSONArray getOutBillTask(Map whereJson); + /** + * 修改出库单 + * @param whereJson / + */ + void update(Map whereJson); + /** + * 全部分配,对同一出库单明细进行分配 + * @param whereJson / + */ + void allDiv(JSONObject whereJson); + /** + * 全部取消 + * @param whereJson / + */ + void allCancel(JSONObject whereJson); + /** + * 设置检验站点 + * @param whereJson / + */ + void setPoint(JSONObject whereJson); + /** + * 查询可分配库存 + * @param whereJson / + * @return + */ + JSONArray getStructIvt(Map whereJson); + /** + * 出库单手动分配 + * @param whereJson / + */ + void manualDiv(JSONObject whereJson); + /** + * 出库单强制确认 + * @param whereJson / + */ + void confirm(JSONObject whereJson); + /** + * 出库任务下发 + * @param whereJson / + */ + void issueTask(JSONObject whereJson); + /** + * 出库任务手动完成 + * @param whereJson / + */ + void finishTask(JSONObject whereJson); + /** + * 出库任务手动取消完成 + * @param whereJson / + */ + void cancleTaskfinish(JSONObject whereJson); + /** + * 查询单据字段 + * @return + */ + JSONArray getInvTypes(); + + /** + *查询出库单物料是否限制参数 + * @param form + * @return + */ + JSONObject getParamByCodeType(JSONObject form); + + /** + *查询点位区域类型 + * @param form + * @return + */ + JSONArray schAreaType(JSONObject form); + /** + * 出库单强制确认 + * @param whereJson / + */ + void backConfirm(JSONObject whereJson); + + /** + * 获取全部出入库业务类型 + */ + JSONArray getType(); +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/RawAssistIStorService.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/RawAssistIStorService.java new file mode 100644 index 000000000..599676729 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/RawAssistIStorService.java @@ -0,0 +1,63 @@ +package org.nl.wms.st.inbill.service; + +import com.alibaba.fastjson.JSONArray; +import org.springframework.data.domain.Pageable; + +import java.util.Map; + +public interface RawAssistIStorService { + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map pageQuery(Map whereJson, Pageable page); + + + JSONArray getType(Map whereJson); + + Map getBillDtl(Map whereJson,Pageable page); + + void insertDtl (Map whereJson); + + void deleteAll(Long[] ids); + + void update(Map whereJson); + + void commit(Map whereJson); + + JSONArray getIODtl(Map whereJson); + + void confirmvehicle(Map whereJson); + + void deleteDisDtl(Map whereJson); + + void divStruct(Map whereJson); + + void unDivStruct(Map whereJson); + + void divPoint(Map whereJson); + + void updateTask(Map whereJson); + + void delTask(Map whereJson); + + void reIssueTask(Map whereJson); + + void confirmTask(Map whereJson); + + void cancelTask(Map whereJson); + + void confirm(Map whereJson); + + void backConfirm(Map whereJson); + + JSONArray getDisDtl(Map whereJson); + + JSONArray queryTask(Map whereJson); + + JSONArray bucketDtl(Map whereJson); + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/StorPublicService.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/StorPublicService.java new file mode 100644 index 000000000..23e4b4e45 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/StorPublicService.java @@ -0,0 +1,46 @@ +package org.nl.wms.st.inbill.service; + +import com.alibaba.fastjson.JSONObject; + +public interface StorPublicService { + /** + * 出入库仓位库存修改 + * @param from 仓位库存变动信息 + * { + * struct_id ,仓位标识 + * material_id ,物料标识 + * quality_scode ,品质类型 + * pcsn ,批次 + * ivt_level ,库存等级 + * is_active ,是否可用 + * change_qty ,变动数(必填,大于0) + * bill_type_scode ,单据类型 + * inv_id,单据标识 + * bill_code ,单据编号 + * bill_table ,单据表名(非必填) + * qty_unit_id ,单位标识 + * qty_unit_name ,单位名称 + * } + * @param change_type_scode (变动类型:11-扣减可用; 12-增加可用;21-减库存; 22-加库存; 23-同时加; 24-同时减;25-同时减(配粉出库)31-加待入; 32-减待入;33-减待入加库存加可用;99-其它) + */ + void IOStor(JSONObject from, String change_type_scode); + + /** + * 出入库仓位点位更新 + * @param from 仓位点位变动信息 + * { + * struct_id ,仓位id + * point_code ,点位编码 + * lock_type ,锁定类型 + * storagevehicle_code ,载具编码 + * is_free,是否清除载具(1是,0或缺省为否) + * taskdtl_type锁定任务类型 + * taskdtl_id锁定任务明细标识 + * task_code锁定任务编码 + * inv_type锁定单据类型 + * inv_id锁定单据标识 + * inv_code锁定单据编码 + * } + */ + void updateStructAndPoint(JSONObject from); +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/InbillServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/InbillServiceImpl.java new file mode 100644 index 000000000..b07bd4285 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/InbillServiceImpl.java @@ -0,0 +1,316 @@ +package org.nl.wms.st.inbill.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.st.inbill.service.StorPublicService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; + +/** + * PC端出入库新增 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class InbillServiceImpl { + + private final StorPublicService storPublicService; + + //插入分配表 + public void insertDis(JSONObject jo) { + WQLObject dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); + JSONObject dis_jo = new JSONObject(); + dis_jo.put("iostorinvdisdtl_id", IdUtil.getSnowflake(1, 1).nextId()); + dis_jo.put("iostorinvdis_id", jo.getString("iostorinvdis_id")); + dis_jo.put("iostorinv_id", jo.getString("iostorinv_id")); + dis_jo.put("iostorinvdtl_id", jo.getString("iostorinvdtl_id")); + JSONArray dis_rows = dis.query("iostorinvdtl_id = '" + jo.getString("iostorinvdtl_id") + "'").getResultJSONArray(0); + dis_jo.put("seq_no", (dis_rows.size() + 1) + ""); + dis_jo.put("sect_id", jo.getString("sect_id")); + dis_jo.put("sect_code", jo.getString("sect_code")); + dis_jo.put("sect_name", jo.getString("sect_name")); + dis_jo.put("struct_id", jo.getString("struct_id")); + dis_jo.put("struct_code", jo.getString("struct_code")); + dis_jo.put("struct_name", jo.getString("struct_name")); + dis_jo.put("material_id", jo.getString("material_id")); + dis_jo.put("pcsn", jo.getString("pcsn")); + dis_jo.put("quality_scode", jo.getString("quality_scode")); + dis_jo.put("ivt_level", jo.getString("ivt_level")); + dis_jo.put("is_active", jo.getString("is_active")); + dis_jo.put("is_active", jo.getString("is_active")); + dis_jo.put("work_status", "00"); + dis_jo.put("storagevehicle_id", jo.getString("storagevehicle_id")); + dis_jo.put("storagevehicle_type", jo.getString("storagevehicle_type")); + dis_jo.put("storagevehicle_code", jo.getString("storagevehicle_code")); + dis_jo.put("is_issued", "0"); + dis_jo.put("qty_unit_id", jo.getString("qty_unit_id")); + dis_jo.put("qty_unit_name", jo.getString("qty_unit_name")); + dis_jo.put("plan_qty", "0"); + dis_jo.put("point_id", jo.getString("point_id")); + dis_jo.put("point_code", jo.getString("point_code")); + dis_jo.put("point_name", jo.getString("point_name")); + dis.insert(dis_jo); + } + + //插入分配明细表 + public void insertDisDtl(JSONObject jo) { + WQLObject dis_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDisDtl"); + JSONObject disdtl_jo = new JSONObject(); + disdtl_jo.put("iostorinvdisdtl_id", IdUtil.getSnowflake(1, 1).nextId()); + disdtl_jo.put("iostorinvdis_id", jo.getString("iostorinvdis_id")); + disdtl_jo.put("iostorinv_id", jo.getString("iostorinv_id")); + disdtl_jo.put("iostorinvdtl_id", jo.getString("iostorinvdtl_id")); + disdtl_jo.put("seq_no", jo.getString("seq_no")); + disdtl_jo.put("sect_id", jo.getString("sect_id")); + disdtl_jo.put("sect_code", jo.getString("sect_code")); + disdtl_jo.put("sect_name", jo.getString("sect_name")); + disdtl_jo.put("struct_id", jo.getString("struct_id")); + disdtl_jo.put("struct_code", jo.getString("struct_code")); + disdtl_jo.put("struct_name", jo.getString("struct_name")); + disdtl_jo.put("material_id", jo.getString("material_id")); + disdtl_jo.put("pcsn", jo.getString("pcsn")); + disdtl_jo.put("quality_scode", jo.getString("quality_scode")); + disdtl_jo.put("ivt_level", jo.getString("ivt_level")); + disdtl_jo.put("is_active", jo.getString("is_active")); + disdtl_jo.put("storagevehicle_id", jo.getString("storagevehicle_id")); + disdtl_jo.put("storagevehicle_code", jo.getString("storagevehicle_code")); + disdtl_jo.put("storagevehicle_type", jo.getString("storagevehicle_type")); + disdtl_jo.put("bucketunique", jo.getString("bucketunique")); + disdtl_jo.put("qty_unit_id", jo.getString("qty_unit_id")); + disdtl_jo.put("qty_unit_name", jo.getString("qty_unit_name")); + disdtl_jo.put("real_qty", jo.getString("storage_qty")); + dis_dtl.insert(disdtl_jo); + + //回写分配表数量 + double real_qty = disdtl_jo.getDoubleValue("real_qty"); + JSONObject dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinvdis_id ='" + jo.getString("iostorinvdis_id") + "'").uniqueResult(0); + dis.put("plan_qty", dis.getDoubleValue("plan_qty") + real_qty); + WQLObject.getWQLObject("ST_IVT_IOStorInvDis").update(dis); + + //回写明细表数量 + JSONObject dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinvdtl_id ='" + jo.getString("iostorinvdtl_id") + "'").uniqueResult(0); + dtl.put("assign_qty", dtl.getDoubleValue("assign_qty") + real_qty); + double unassign_qty = dtl.getDoubleValue("unassign_qty") - real_qty; + if (unassign_qty < 0) { + unassign_qty = 0; + } + dtl.put("unassign_qty", unassign_qty); + dtl.put("bill_status", "30"); + WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").update(dtl); + + //更新主表状态 + JSONObject mst = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id ='" + jo.getString("iostorinv_id") + "'").uniqueResult(0); + JSONArray dtl_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinv_id = '" + jo.getString("iostorinv_id") + "' AND bill_status IN ('20','30')").getResultJSONArray(0); + mst.put("bill_status", "30"); + WQLObject.getWQLObject("ST_IVT_IOStorInv").update(mst); + } + + public void operatePoint(String operate, JSONObject form) { + WQLObject point_table = WQLObject.getWQLObject("SCH_BASE_Point"); + WQLObject struct_table = WQLObject.getWQLObject("ST_IVT_StructAttr"); + String end_point = form.getString("end_point"); + HashMap map = new HashMap<>(); + //operate:0生成、1完成、2单据确认 + switch (operate) { + case "0": + //锁定终点 + //锁定单据信息 + map.put("lock_type", "01"); + map.put("inv_type", form.getString("inv_type")); + map.put("inv_id", form.getString("inv_id")); + map.put("inv_code", form.getString("inv_code")); + point_table.update(map, "point_code = '" + end_point + "'"); + struct_table.update(map, "struct_code = '" + end_point + "'"); + break; + case "1": + break; + case "2": + //解锁终点,绑定载具 + String vehicle_code = form.getString("vehicle_code"); + String storagevehicle_id = form.getString("storagevehicle_id"); + String storagevehicle_type = form.getString("storagevehicle_type"); + map.put("lock_type", "00"); + map.put("point_status", "02"); + map.put("vehicle_code", vehicle_code); + map.put("taskdtl_type", ""); + map.put("taskdtl_id", ""); + map.put("task_code", ""); + map.put("inv_type", ""); + map.put("inv_id", ""); + map.put("inv_code", ""); + point_table.update(map, "point_code = '" + end_point + "'"); + HashMap struct_map = new HashMap<>(); + struct_map.put("storagevehicle_id", storagevehicle_id); + struct_map.put("lock_type", "00"); + struct_map.put("storagevehicle_code", vehicle_code); + struct_map.put("storagevehicle_type", storagevehicle_type); + struct_map.put("taskdtl_type", ""); + struct_map.put("taskdtl_id", ""); + struct_map.put("task_code", ""); + struct_map.put("inv_type", ""); + struct_map.put("inv_id", ""); + struct_map.put("inv_code", ""); + struct_table.update(struct_map, "struct_code = '" + end_point + "'"); + break; + } + } + + @Transactional(rollbackFor = Exception.class) + public void confirmDis(JSONObject form) { + WQLObject dis_table = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); + WQLObject dtl_table = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); + WQLObject pcs_if_purchaseorderproc = WQLObject.getWQLObject("pcs_if_purchaseorderproc"); + String task_id = form.getString("task_id"); + + if (StrUtil.isEmpty(task_id)) { + throw new BadRequestException("任务标识为空!"); + } + + JSONArray dis_rows = dis_table.query("task_id = '" + task_id + "'").getResultJSONArray(0); + //回写入库分配表实际数量 + for (int i = 0; i < dis_rows.size(); i++) { + JSONObject dis_row = dis_rows.getJSONObject(i); + dis_row.put("work_status", "99"); + dis_row.put("real_qty", dis_row.getString("plan_qty")); + dis_table.update(dis_row); + + //回写明细表实际数量 + JSONObject dtl_row = dtl_table.query("iostorinvdtl_id = '" + dis_row.getString("iostorinvdtl_id") + "'").uniqueResult(0); + double real_qty = NumberUtil.add(dtl_row.getDoubleValue("real_qty"), dis_row.getDoubleValue("real_qty")); + + //该明细下的所有分配明细都执行完成且未分配数=0,将明细变为99 + JSONArray unfinish_dis = dis_table.query("iostorinvdtl_id = '" + dis_row.getString("iostorinvdtl_id") + "' AND work_status < '99'").getResultJSONArray(0); + if (dtl_row.getDoubleValue("unassign_qty") == 0 && unfinish_dis.size() <= 0) { + dtl_row.put("bill_status", "99"); + } + dtl_row.put("real_qty", real_qty); + dtl_table.update(dtl_row); + + //判断是否为软废采购入库,修改采购入库单 + JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + dis_row.getString("iostorinv_id") + "'").uniqueResult(0); + if (mst_jo.getString("bill_type").equals("000202")) { + String bill_id = dtl_row.getString("base_billdtl_id"); + JSONArray bill_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("base_billdtl_id = '" + bill_id + "' AND bill_status < '99'").getResultJSONArray(0); + if (bill_rows.size() == 0) { + HashMap bill_map = new HashMap<>(); + bill_map.put("proc_status", "09"); + pcs_if_purchaseorderproc.update(bill_map, "id = '" + bill_id + "'"); + } + } + + //判断主表是否改为完成 + JSONArray dtl_rows = dtl_table.query("iostorinv_id = '" + dtl_row.getString("iostorinv_id") + "' AND bill_status < '99'").getResultJSONArray(0); + if (dtl_rows.size() == 0) { + JSONObject data = new JSONObject(); + data.put("iostorinv_id", dtl_row.getString("iostorinv_id")); + this.confirmMst(data); + } + } + } + + public void confirmMst(JSONObject from) { + WQLObject dtl_table = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); + WQLObject dis_table = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); + WQLObject bucket_table = WQLObject.getWQLObject("md_pb_bucketrecord"); + WQLObject reMstTab = WQLObject.getWQLObject("PCS_RC_ReceiveMst"); //到货通知单主表 + WQLObject reDtlTab = WQLObject.getWQLObject("PCS_RC_ReceiveDtl"); //到货通知单明细表 + WQLObject procTab = WQLObject.getWQLObject("PCS_IF_PurchaseOrderProc"); //采购订单接口处理表 + WQLObject dtlTab = WQLObject.getWQLObject("QL_TEST_InspectionSheetDtl"); //质检单明细表 + String iostorinv_id = from.getString("iostorinv_id"); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); + + String bill_type = mst_jo.getString("bill_type"); + + //查询 + JSONArray dtl_rows = dtl_table.query("iostorinv_id = '" + iostorinv_id + "' AND bill_status < '99'").getResultJSONArray(0); + + if (dtl_rows.size() > 0) { + throw new BadRequestException("主表下存在未完成的明细!"); + } + + //更新目的点位,仓位、加库存 + JSONArray dis_rows = dis_table.query("iostorinv_id = '" + iostorinv_id + "'").getResultJSONArray(0); + for (int i = 0; i < dis_rows.size(); i++) { + JSONObject dis_row = dis_rows.getJSONObject(i); + JSONObject point_form = new JSONObject(); + point_form.put("end_point", dis_row.getString("struct_code")); + point_form.put("vehicle_code", dis_row.getString("storagevehicle_code")); + point_form.put("storagevehicle_id", dis_row.getString("storagevehicle_id")); + point_form.put("storagevehicle_type", dis_row.getString("storagevehicle_type")); + //更新目的点位 + this.operatePoint("2", point_form); + + //加库存 + JSONObject i_form = new JSONObject(); + i_form.put("struct_id", dis_row.getString("struct_id")); + i_form.put("material_id", dis_row.getString("material_id")); + i_form.put("quality_scode", dis_row.getString("quality_scode")); + i_form.put("pcsn", dis_row.getString("pcsn")); + i_form.put("ivt_level", dis_row.getString("ivt_level")); + i_form.put("is_active", dis_row.getString("is_active")); + i_form.put("change_qty", dis_row.getString("plan_qty")); + i_form.put("bill_type_scode", mst_jo.getString("bill_type")); + i_form.put("inv_id", mst_jo.getString("iostorinv_id")); + i_form.put("bill_code", mst_jo.getString("bill_code")); + i_form.put("bill_table", "ST_IVT_IOStorInv"); + i_form.put("qty_unit_id", dis_row.getString("qty_unit_id")); + i_form.put("qty_unit_name", dis_row.getString("qty_unit_name")); + storPublicService.IOStor(i_form, "33"); + + //更新桶记录表 + HashMap bucket_map = new HashMap(); + bucket_map.put("status", "03"); + bucket_map.put("instor_optid", currentUserId); + bucket_map.put("instor_optname", nickName); + bucket_map.put("instor_time", now); + bucket_table.update(bucket_map, "storagevehicle_code = '" + dis_row.getString("storagevehicle_code") + "' AND status = '02'"); + + //如果单据为原辅料入库,且为寄样合格,回写到货通知单 + + } + mst_jo.put("bill_status", "99"); + mst_jo.put("confirm_optid", currentUserId); + mst_jo.put("confirm_optname", nickName); + mst_jo.put("confirm_time", now); + if("000101".equals(bill_type)){ + //查询 + dtl_rows = dtl_table.query("iostorinv_id = '" + iostorinv_id + "' AND bill_status = '99'").getResultJSONArray(0); + + for(int i=0; i pageQuery(Map whereJson, Pageable page) { + HashMap map = new HashMap<>(); + map.put("flag", "1"); + map.put("buss_type", (String) whereJson.get("buss_type")); + map.put("stor_id", (String) whereJson.get("stor_id")); + map.put("bill_type", (String) whereJson.get("bill_type")); + map.put("create_mode", (String) whereJson.get("create_mode")); + map.put("bill_status", (String) whereJson.get("bill_status")); + String bill_code = MapUtil.getStr(whereJson, "bill_code"); + if (!ObjectUtil.isEmpty(bill_code)) { + map.put("bill_code", "%" + bill_code + "%"); + } + String begin_time = (String) whereJson.get("begin_time"); + + if (!StrUtil.isEmpty(begin_time)) { + map.put("begin_time", begin_time); + } + String end_time = (String) whereJson.get("end_time"); + if (!StrUtil.isEmpty(end_time)) { + map.put("end_time", end_time); + } + + JSONObject jo = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "input_time desc"); + return jo; + } + + @Override + public JSONArray getType(Map whereJson) { + return null; + } + + @Override + public Map getBillDtl(Map whereJson, Pageable page) { + HashMap map = new HashMap<>(); + String bill_code = (String) whereJson.get("bill_code"); + String material_search = (String) whereJson.get("material_search"); + String begin_time = (String) whereJson.get("begin_time"); + String end_time = (String) whereJson.get("end_time"); + String container_name = (String) whereJson.get("container_name"); + String package_box_sn = (String) whereJson.get("package_box_sn"); + map.put("flag", "2"); + if (StrUtil.isNotEmpty(package_box_sn)) { + map.put("package_box_sn", package_box_sn); + } + if (StrUtil.isNotEmpty(container_name)) { + map.put("container_name", container_name); + } + if (StrUtil.isNotEmpty(bill_code)) { + map.put("bill_code", bill_code); + } + if (StrUtil.isNotEmpty(material_search)) { + map.put("material_search", "%" + material_search + "%"); + } + if (StrUtil.isNotEmpty(begin_time)) { + map.put("begin_time", begin_time); + map.put("end_time", end_time); + } + JSONObject jo = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "date_of_FG_inbound,package_box_sn desc"); + return jo; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertDtl(Map whereJson) { + ArrayList rows = (ArrayList) whereJson.get("tableData"); + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + JSONObject io_mst = new JSONObject(); + String iostorinv_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + String bill_code = CodeUtil.getNewCode("IO_CODE"); + io_mst.put("iostorinv_id", iostorinv_id); + io_mst.put("bill_code", bill_code); + io_mst.put("buss_type", ((String) whereJson.get("bill_type")).substring(0, 4)); + io_mst.put("io_type", "0"); + io_mst.put("bill_type", whereJson.get("bill_type")); + io_mst.put("biz_date", whereJson.get("biz_date").toString().substring(0, 10)); + StorattrDto storattrDto = storattrService.findById(Long.parseLong((String) whereJson.get("stor_id"))); + String stor_code = storattrDto.getStor_code(); + String stor_name = storattrDto.getStor_name(); + io_mst.put("stor_id", whereJson.get("stor_id")); + io_mst.put("stor_code", stor_code); + io_mst.put("stor_name", stor_name); + io_mst.put("total_qty", whereJson.get("total_qty")); + io_mst.put("detail_count", whereJson.get("detail_count")); + io_mst.put("remark", whereJson.get("remark")); + io_mst.put("bill_status", whereJson.get("bill_status")); + io_mst.put("create_mode", "01"); + io_mst.put("input_optid", currentUserId + ""); + io_mst.put("input_optname", nickName); + io_mst.put("input_time", now); + io_mst.put("update_optid", currentUserId + ""); + io_mst.put("update_optname", nickName); + io_mst.put("update_time", now); + io_mst.put("is_delete", "0"); + io_mst.put("is_upload", "0"); + Long deptId = SecurityUtils.getDeptId(); + io_mst.put("sysdeptid", deptId + ""); + io_mst.put("syscompanyid", deptId + ""); + + for (int i = 0; i < rows.size(); i++) { + HashMap row = rows.get(i); + row.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + ""); + row.put("iostorinv_id", iostorinv_id); + row.put("seq_no", (i + 1) + ""); + JSONObject material = WQLObject.getWQLObject("md_me_materialbase").query("material_code = '" + row.get("product_name") + "'").uniqueResult(0); + row.put("material_id", material.getString("material_id")); + row.put("pcsn", row.get("container_name")); + row.put("bill_status", "30"); + row.put("qty_unit_id", "1"); + row.put("qty_unit_name", "KG"); + row.put("assign_qty", row.get("net_weight")); + row.put("plan_qty", row.get("net_weight")); + row.put("box_no", row.get("package_box_sn")); + + WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").insert(row); + + JSONObject dis = new JSONObject(); + dis.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId() + ""); + dis.put("iostorinv_id", iostorinv_id); + dis.put("iostorinvdtl_id", row.get("iostorinvdtl_id")); + dis.put("seq_no", 1); + dis.put("material_id", row.get("material_id")); + dis.put("pcsn", row.get("pcsn")); + dis.put("box_no", row.get("box_no")); + dis.put("quality_scode", row.get("quality_scode")); + dis.put("work_status", "00"); + dis.put("qty_unit_id", "1"); + dis.put("qty_unit_name", "KG"); + dis.put("plan_qty", row.get("plan_qty")); + WQLObject.getWQLObject("ST_IVT_IOStorInvDis").insert(dis); + + //将包装关系中对应的记录状态改为包装 + HashMap map = new HashMap<>(); + map.put("status", "1"); + WQLObject.getWQLObject("PDM_BI_SubPackageRelation").update(map, "package_box_SN = '" + dis.getString("box_no") + "' AND status = '0'"); + } + WQLObject.getWQLObject("ST_IVT_IOStorInv").insert(io_mst); + } + + @Override + public void deleteAll(Long[] ids) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("ST_IVT_IOStorInv"); + for (Long id : ids) { + JSONObject param = new JSONObject(); + param.put("iostorinv_id", String.valueOf(id)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + + JSONArray rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinv_id = '" + String.valueOf(id) + "'").getResultJSONArray(0); + for (int i = 0; i < rows.size(); i++) { + JSONObject row = rows.getJSONObject(i); + String box_no = row.getString("box_no"); + //将状态为包装的改为生成 + HashMap map = new HashMap<>(); + map.put("status", "0"); + WQLObject.getWQLObject("PDM_BI_SubPackageRelation").update(map, "package_box_SN = '" + box_no + "' AND status = '1'"); + WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").delete(row); + } + } + } + + @Override + public void update(Map whereJson) { + JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "'").uniqueResult(0); + if (!mst_jo.getString("bill_status").equals("10")) { + throw new BadRequestException("主表状态必须为生成!"); + } + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + whereJson.put("update_optid", currentUserId + ""); + whereJson.put("update_optname", nickName); + whereJson.put("update_time", now); + + WQLObject wo = WQLObject.getWQLObject("ST_IVT_IOStorInv"); + WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); + wo.update(whereJson); + //先删除该单据下的所有明细 + String iostorinv_id = (String) whereJson.get("iostorinv_id"); + wo_dtl.delete("iostorinv_id = '" + iostorinv_id + "'"); + ArrayList rows = (ArrayList) whereJson.get("tableData"); + for (int i = 0; i < rows.size(); i++) { + HashMap row = rows.get(i); + row.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + ""); + row.put("iostorinv_id", iostorinv_id); + row.put("seq_no", (i + 1) + ""); + row.put("bill_status", "10"); + row.put("unassign_qty", row.get("plan_qty")); + WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").insert(row); + + //如果生成的入库单为软废采购入库需要将采购订单接口处理表改为采购中 + if (whereJson.get("bill_type").equals("000202")) { + HashMap proc_map = new HashMap<>(); + proc_map.put("proc_status", "02"); + proc_map.put("update_optid", currentUserId + ""); + proc_map.put("update_optname", nickName); + proc_map.put("update_time", now); + WQLObject.getWQLObject("PCS_IF_PurchaseOrderProc").update(proc_map, "id = '" + row.get("base_billdtl_id") + "'"); + } + } + } + + @Override + public void commit(Map whereJson) { + String iostorinv_id = (String) whereJson.get("iostorinv_id"); + JSONObject mst = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); + if (!mst.getString("bill_status").equals("10")) { + throw new BadRequestException("请选择单据状态为生成的进行提交!"); + } + HashMap map = new HashMap<>(); + map.put("bill_status", "20"); + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + map.put("update_optid", currentUserId + ""); + map.put("update_optname", nickName); + map.put("update_time", now); + WQLObject.getWQLObject("ST_IVT_IOStorInv").update(map, "iostorinv_id = '" + iostorinv_id + "'"); + WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").update(map, "iostorinv_id = '" + iostorinv_id + "'"); + } + + @Override + public JSONArray getIODtl(Map whereJson) { + String id = (String) whereJson.get("bill_code"); + String open_flag = (String) whereJson.get("open_flag"); + JSONArray ja = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParam("flag", "3").addParam("bill_code", id) + .addParam("open_flag", open_flag).process().getResultJSONArray(0); + return ja; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void confirmvehicle(Map whereJson) { + WQLObject change = WQLObject.getWQLObject("MD_PB_BucketChangeFlow"); + String storagevehicle_code = (String) whereJson.get("storagevehicle_code"); + if (StrUtil.isEmpty(storagevehicle_code)) { + throw new BadRequestException("载具号不能为空!"); + } + + //判断该载具是否已经分配货位或者起点 + JSONArray dis_rows = WQLObject.getWQLObject("st_ivt_iostorinvdis").query("storagevehicle_code = '" + storagevehicle_code + "' AND work_status < '99' AND ((struct_id <> '' AND struct_id is not null) OR (point_id <> '' AND point_code is not null))").getResultJSONArray(0); + if (dis_rows.size() > 0) { + throw new BadRequestException("该载具已经分配货位或起点,无法继续组盘!"); + } + + + HashMap dtl = (HashMap) whereJson.get("dtl_row"); + ArrayList rows = (ArrayList) whereJson.get("tableMater"); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + //插入入库分配表 + StoragevehicleinfoDto vehicle = null; + String iostorinvdis_id = ""; + + //判断该明细是否存在分配 + JSONObject dis_row = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinvdtl_id = '" + dtl.get("iostorinvdtl_id") + "' AND storagevehicle_code = '" + vehicle.getStoragevehicle_code() + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(dis_row)) { + iostorinvdis_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + dtl.put("iostorinvdis_id", iostorinvdis_id); + dtl.put("storagevehicle_id", vehicle.getStoragevehicle_id() + ""); + dtl.put("storagevehicle_code", vehicle.getStoragevehicle_code()); + dtl.put("storagevehicle_type", vehicle.getStoragevehicle_type()); + + + /*//判断入库点是否冲突 + JSONObject point_row = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + dtl.get("iostorinv_id") + "' AND storagevehicle_code = '" + vehicle.getStoragevehicle_code() + "'").uniqueResult(0); + if (!ObjectUtil.isEmpty(point_row) && !point_row.getString("point_code").equals((String) whereJson.get("point_code"))) { + throw new BadRequestException("该载具入库点冲突,请重新选择"); + } + PointDto pointDto = pointService.findByCode((String) whereJson.get("point_code")); + dtl.put("point_code", pointDto.getPoint_code()); + dtl.put("point_id", pointDto.getPoint_id() + ""); + dtl.put("point_name", pointDto.getPoint_name());*/ + inbillService.insertDis(JSONObject.parseObject(JSON.toJSONString(dtl))); + } else { + iostorinvdis_id = dis_row.getString("iostorinvdis_id"); + } + //组盘校验 + //判断该桶是否已经被操作 + for (int i = 0; i < rows.size(); i++) { + HashMap row = rows.get(i); + if (StrUtil.isEmpty(row.get("bucket_record_id"))) { + continue; + } + JSONObject bucket_jo = WQLObject.getWQLObject("MD_PB_BucketRecord").query("bucket_record_id = '" + row.get("bucket_record_id") + "'").uniqueResult(0); + if (bucket_jo == null) { + throw new BadRequestException("桶号:" + row.get("bucketunique") + "不存在,请重新选择!"); + } else { + if (!bucket_jo.getString("status").equals("01")) { + throw new BadRequestException("桶号:" + row.get("bucketunique") + "已经被操作,请重新选择!"); + } + } + + //原来页面可以修改放入重量,经过讨论不修改,不需要动桶变动记录表 + + //判断是否为工序返工入库 + JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + dtl.get("iostorinv_id") + "'").uniqueResult(0); + //更新桶记录表 + HashMap bucket_map = new HashMap<>(); + bucket_map.put("status", "02"); + bucket_map.put("makeup_optid", currentUserId + ""); + bucket_map.put("makeup_optname", nickName); + bucket_map.put("makeup_time", now); + bucket_map.put("storagevehicle_id", vehicle.getStoragevehicle_id() + ""); + bucket_map.put("storagevehicle_code", vehicle.getStoragevehicle_code()); + if (mst_jo.getString("bill_type").equals("000302")) { + bucket_map.put("quality_scode", "02"); + row.put("quality_scode", "02"); + } + WQLObject.getWQLObject("MD_PB_BucketRecord").update(bucket_map, "bucket_record_id = '" + row.get("bucket_record_id") + "'"); + + //插入分配明细表 + row.put("iostorinvdis_id", iostorinvdis_id); + row.put("iostorinv_id", dtl.get("iostorinv_id")); + row.put("iostorinvdtl_id", dtl.get("iostorinvdtl_id")); + row.put("storagevehicle_id", vehicle.getStoragevehicle_id() + ""); + row.put("storagevehicle_code", vehicle.getStoragevehicle_code()); + row.put("storagevehicle_type", vehicle.getStoragevehicle_type()); + row.put("seq_no", (i + 1) + ""); + inbillService.insertDisDtl(JSONObject.parseObject(JSON.toJSONString(row))); + + JSONObject bucket_now = WQLObject.getWQLObject("MD_PB_BucketRecord").query("bucketunique = '" + row.get("bucketunique") + "' AND status = '02'").uniqueResult(0); + if (mst_jo.getString("bill_type").equals("000302")) { + //插入桶物料变动记录表,减待检 + JSONObject change_jo = new JSONObject(); + change_jo.put("change_id", IdUtil.getSnowflake(1, 1).nextId()); + change_jo.put("bucket_code", bucket_now.get("bucketunique")); + change_jo.put("material_id", bucket_now.get("material_id")); + change_jo.put("pcsn", bucket_now.get("pcsn")); + change_jo.put("ivt_level", bucket_now.get("ivt_level")); + change_jo.put("is_active", bucket_now.get("is_active")); + change_jo.put("quality_scode", "00"); + change_jo.put("qty_unit_id", bucket_now.get("qty_unit_id")); + change_jo.put("qty_unit_name", bucket_now.get("qty_unit_name")); + change_jo.put("change_type_scode", "02"); + change_jo.put("change_time", now); + change_jo.put("rec_person", currentUserId); + change_jo.put("change_qty", bucket_now.get("storage_qty")); + change_jo.put("result_qty", "0"); + change.insert(change_jo); + + //插入桶物料变动记录表,加不良 + JSONObject change_jo2 = new JSONObject(); + change_jo2.put("change_id", IdUtil.getSnowflake(1, 1).nextId()); + change_jo2.put("bucket_code", bucket_now.get("bucketunique")); + change_jo2.put("material_id", bucket_now.get("material_id")); + change_jo2.put("pcsn", bucket_now.get("pcsn")); + change_jo2.put("ivt_level", bucket_now.get("ivt_level")); + change_jo2.put("is_active", bucket_now.get("is_active")); + change_jo2.put("quality_scode", "02"); + change_jo2.put("qty_unit_id", bucket_now.get("qty_unit_id")); + change_jo2.put("qty_unit_name", bucket_now.get("qty_unit_name")); + change_jo2.put("change_type_scode", "01"); + change_jo2.put("change_time", now); + change_jo2.put("rec_person", currentUserId); + change_jo2.put("change_qty", bucket_now.get("storage_qty")); + change_jo2.put("result_qty", bucket_now.get("storage_qty")); + change.insert(change_jo2); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteDisDtl(Map row) { + WQLObject change = WQLObject.getWQLObject("MD_PB_BucketChangeFlow"); + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + WQLObject dis_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDisDtl"); + JSONObject dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinvdis_id ='" + row.get("iostorinvdis_id") + "'").uniqueResult(0); + if (StrUtil.isNotEmpty(dis.getString("struct_id"))) { + throw new BadRequestException("该桶已经分配货位,请先取消分配再删除桶!"); + } + dis_dtl.delete("iostorinvdisdtl_id = '" + (String) row.get("iostorinvdisdtl_id") + "'"); + JSONObject mst = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id ='" + row.get("iostorinv_id") + "'").uniqueResult(0); + //更新桶记录表 + HashMap bucket_map = new HashMap<>(); + bucket_map.put("status", "01"); + bucket_map.put("makeup_optid", ""); + bucket_map.put("makeup_optname", ""); + bucket_map.put("makeup_time", ""); + bucket_map.put("storagevehicle_id", ""); + bucket_map.put("storagevehicle_code", ""); + if (mst.getString("bill_type").equals("000302")) { + bucket_map.put("quality_scode", "00"); + } + WQLObject.getWQLObject("MD_PB_BucketRecord").update(bucket_map, "bucketunique = '" + row.get("bucketunique") + "' AND status = '02'"); + + JSONObject bucket_now = WQLObject.getWQLObject("MD_PB_BucketRecord").query("bucketunique = '" + row.get("bucketunique") + "' AND status = '01'").uniqueResult(0); + if (mst.getString("bill_type").equals("000302")) { + //插入桶物料变动记录表,加待检 + JSONObject change_jo = new JSONObject(); + change_jo.put("change_id", IdUtil.getSnowflake(1, 1).nextId()); + change_jo.put("bucket_code", bucket_now.get("bucketunique")); + change_jo.put("material_id", bucket_now.get("material_id")); + change_jo.put("pcsn", bucket_now.get("pcsn")); + change_jo.put("ivt_level", bucket_now.get("ivt_level")); + change_jo.put("is_active", bucket_now.get("is_active")); + change_jo.put("quality_scode", "00"); + change_jo.put("qty_unit_id", bucket_now.get("qty_unit_id")); + change_jo.put("qty_unit_name", bucket_now.get("qty_unit_name")); + change_jo.put("change_type_scode", "01"); + change_jo.put("change_time", now); + change_jo.put("rec_person", currentUserId); + change_jo.put("change_qty", bucket_now.get("storage_qty")); + change_jo.put("result_qty", bucket_now.get("storage_qty")); + change.insert(change_jo); + + //插入桶物料变动记录表,减不良 + JSONObject change_jo2 = new JSONObject(); + change_jo2.put("change_id", IdUtil.getSnowflake(1, 1).nextId()); + change_jo2.put("bucket_code", bucket_now.get("bucketunique")); + change_jo2.put("material_id", bucket_now.get("material_id")); + change_jo2.put("pcsn", bucket_now.get("pcsn")); + change_jo2.put("ivt_level", bucket_now.get("ivt_level")); + change_jo2.put("is_active", bucket_now.get("is_active")); + change_jo2.put("quality_scode", "02"); + change_jo2.put("qty_unit_id", bucket_now.get("qty_unit_id")); + change_jo2.put("qty_unit_name", bucket_now.get("qty_unit_name")); + change_jo2.put("change_type_scode", "02"); + change_jo2.put("change_time", now); + change_jo2.put("rec_person", currentUserId); + change_jo2.put("change_qty", bucket_now.get("storage_qty")); + change_jo2.put("result_qty", "0"); + change.insert(change_jo2); + } + //回写分配表数量 + double real_qty = -Double.parseDouble((String) row.get("real_qty")); + if (NumberUtil.add(real_qty, dis.getDoubleValue("plan_qty")) <= 0) { + WQLObject.getWQLObject("ST_IVT_IOStorInvDis").delete(dis); + } else { + dis.put("plan_qty", (dis.getDoubleValue("plan_qty") + real_qty) + ""); + WQLObject.getWQLObject("ST_IVT_IOStorInvDis").update(dis); + } + //回写明细表数量 + JSONObject dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinvdtl_id ='" + row.get("iostorinvdtl_id") + "'").uniqueResult(0); + double assign_qty = NumberUtil.add(dtl.getDoubleValue("assign_qty"), real_qty); + dtl.put("assign_qty", assign_qty); + double unassign_qty = dtl.getDoubleValue("plan_qty") - assign_qty; + if (unassign_qty < 0) { + unassign_qty = 0; + } + dtl.put("unassign_qty", unassign_qty + ""); + if (assign_qty > 0) { + dtl.put("bill_status", "30"); + } else { + dtl.put("bill_status", "10"); + } + WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").update(dtl); + + //更新主表状态 + JSONArray dtl_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinv_id = '" + row.get("iostorinv_id") + "' AND bill_status IN ('20','30')").getResultJSONArray(0); + if (dtl_rows.size() > 0) { + mst.put("bill_status", "30"); + } else { + mst.put("bill_status", "10"); + } + WQLObject.getWQLObject("ST_IVT_IOStorInv").update(mst); + } + + @Override + public JSONArray getDisDtl(Map whereJson) { + //查询该明细下的所有入库分配载具明细 + String iostorinv_id = (String) whereJson.get("iostorinv_id"); + JSONArray dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinvdtl_id = '" + whereJson.get("iostorinvdtl_id") + "' AND (task_id is null OR task_id = '')").getResultJSONArray(0); + JSONArray dis_dtl_rows = new JSONArray(); + HashSet vehicle_set = new HashSet<>(); + for (int j = 0; j < dis_rows.size(); j++) { + JSONObject dtl_row = dis_rows.getJSONObject(j); + vehicle_set.add(dtl_row.getString("box_no")); + } + for (String vehicle_code : vehicle_set) { + HashMap map = new HashMap<>(); + map.put("flag", "4"); + map.put("iostorinv_id", iostorinv_id); + map.put("package_box_sn", vehicle_code); + JSONArray dtl_rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(map).process().getResultJSONArray(0); + dis_dtl_rows.addAll(dtl_rows); + } + return dis_dtl_rows; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void divStruct(Map whereJson) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + String sect_id = ""; + String sect_code = ""; + String sect_name = ""; + String struct_id = ""; + String struct_code = ""; + String struct_name = ""; + ArrayList rows = (ArrayList) whereJson.get("tableMater"); + JSONObject whereJson2 = JSONObject.parseObject(JSON.toJSONString(whereJson)); + HashMap map = rows.get(0); + + //判断该载具是否已经分配货位或者起点 + JSONArray now_dis_rows = WQLObject.getWQLObject("st_ivt_iostorinvdis").query("storagevehicle_code = '" + map.get("storagevehicle_code") + "' AND work_status < '99' AND (struct_id <> '' AND struct_id is not null)").getResultJSONArray(0); + if (now_dis_rows.size() > 0) { + throw new BadRequestException("该载具已经分配过货位,无法继续分配!"); + } + + String point_code = map.get("point_code"); + if (StrUtil.isNotEmpty(point_code)) { + HashMap point_map = new HashMap<>(); + PointDto pointDto = null; + point_map.put("point_code", pointDto.getPoint_code()); + point_map.put("point_id", pointDto.getPoint_id() + ""); + point_map.put("point_name", pointDto.getPoint_name()); + WQLObject.getWQLObject("ST_IVT_IOStorInvDis").update(point_map, "iostorinv_id = '" + map.get("iostorinv_id") + "' AND storagevehicle_code = '" + map.get("storagevehicle_code") + "'"); + } + + Boolean checked = whereJson2.getBoolean("checked"); + //是否分配货位 + if (ObjectUtil.isNotEmpty(checked) && checked) { + //自动分配一个货位 + MaterialbaseDto materialbaseDto = null; + Long material_type_id = materialbaseDto.getMaterial_type_id(); + BigDecimal height = materialbaseDto.getHeight(); + HashMap struct_map = new HashMap(); + if (StrUtil.isNotEmpty((String) whereJson.get("sect_id"))) { + struct_map.put("sect_id", (String) whereJson.get("sect_id")); + } + if (StrUtil.isNotEmpty((String) whereJson.get("stor_id"))) { + struct_map.put("stor_id", (String) whereJson.get("stor_id")); + } + //struct_map.put("height", height + ""); + struct_map.put("material_type_id", material_type_id + ""); + struct_map.put("flag", "7"); + JSONArray sect_rows = WQLObject.getWQLObject("st_ivt_structrelamaterial").query("material_type_id = '" + material_type_id + "'").getResultJSONArray(0); + if (sect_rows.size() > 0) { + struct_map.put("sect_flag", "1"); + } + JSONObject struct_jo = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(struct_map).process().uniqueResult(0); + if (ObjectUtil.isEmpty(struct_jo)) { + throw new BadRequestException("未查询到适用仓位!"); + } + sect_id = struct_jo.getString("sect_id"); + sect_code = struct_jo.getString("sect_code"); + sect_name = struct_jo.getString("sect_name"); + struct_id = struct_jo.getString("struct_id"); + struct_code = struct_jo.getString("struct_code"); + struct_name = struct_jo.getString("struct_name"); + } else { + //更新入库分配表仓位相关字段 + sect_id = map.get("sect_id"); + sect_code = map.get("sect_code"); + sect_name = map.get("sect_name"); + struct_id = map.get("struct_id"); + struct_code = map.get("struct_code"); + struct_name = map.get("struct_name"); + } + HashMap dis_map = new HashMap(); + dis_map.put("sect_id", sect_id); + dis_map.put("sect_code", sect_code); + dis_map.put("sect_name", sect_name); + dis_map.put("struct_id", struct_id); + dis_map.put("struct_code", struct_code); + dis_map.put("struct_name", struct_name); + + //锁定货位 + JSONObject lock_map = new JSONObject(); + lock_map.put("end_point", struct_code); + //查询主表信息 + JSONObject mst = WQLObject.getWQLObject("st_ivt_iostorinv").query("iostorinv_id = '" + map.get("iostorinv_id") + "'").uniqueResult(0); + lock_map.put("inv_type", mst.get("bill_type")); + lock_map.put("inv_id", mst.get("iostorinv_id")); + lock_map.put("inv_code", mst.get("bill_code")); + inbillService.operatePoint("0", lock_map); + + //判断起点是否不为空 + JSONObject ios_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + map.get("iostorinv_id") + "' AND storagevehicle_code = '" + map.get("storagevehicle_code") + "'").uniqueResult(0); + if (StrUtil.isNotEmpty(ios_dis.getString("point_code"))) { +// Boolean transfer = whereJson2.getBoolean("transfer",false); + Boolean transfer = whereJson2.getBoolean("transfer"); + if (ObjectUtil.isEmpty(transfer)) { + transfer = false; + } + + if (transfer) { + //创建任务 + AbstractAcsTask task = null; + JSONObject task_form = new JSONObject(); + task_form.put("task_type", "03"); + task_form.put("taskdtl_type", "04"); + task_form.put("start_point_code", map.get("point_code")); + task_form.put("next_point_code", struct_code); + task_form.put("storagevehicle_id", map.get("storagevehicle_id")); + task_form.put("vehicle_code", map.get("storagevehicle_code")); + task_form.put("storagevehicle_type", map.get("storagevehicle_type")); + task_form.put("task_id", map.get("task_id")); + String task_id = task.createTask(task_form); + dis_map.put("task_id", map.get("task_id")); + dis_map.put("work_status", "01"); + } else { + //创建任务 + AbstractAcsTask task = null; + JSONObject task_form = new JSONObject(); + task_form.put("task_type", "01"); + task_form.put("taskdtl_type", "01"); + task_form.put("start_device_code", map.get("point_code")); + task_form.put("next_device_code", struct_code); + task_form.put("storagevehicle_id", map.get("storagevehicle_id")); + task_form.put("vehicle_code", map.get("storagevehicle_code")); + task_form.put("storagevehicle_type", map.get("storagevehicle_type")); + String task_id = task.createTask(task_form); + if (whereJson.containsKey("auto_issue")) { + AbstractAcsTask intask = null; + //调用ACS接受任务接口 + JSONObject result = null; + if (ObjectUtil.isNotEmpty(result)) { + String status = result.getString("status"); + if ("200".equals(status)) { + HashMap mapnow = new HashMap<>(); + mapnow.put("task_status", "02"); + WQLObject.getWQLObject("SCH_BASE_Task").update(mapnow, "taskdtl_id = '" + task_id + "'"); + } else { + throw new BadRequestException("任务下发失败:" + result.getString("message")); + } + } + } + dis_map.put("task_id", task_id); + dis_map.put("work_status", "01"); + } + } + + WQLObject.getWQLObject("ST_IVT_IOStorInvDis").update(dis_map, "iostorinv_id = '" + map.get("iostorinv_id") + "' AND storagevehicle_code = '" + map.get("storagevehicle_code") + "'"); + WQLObject.getWQLObject("ST_IVT_IOStorInvDisDtl").update(dis_map, "iostorinv_id = '" + map.get("iostorinv_id") + "' AND storagevehicle_code = '" + map.get("storagevehicle_code") + "'"); + + //修改库存 + //直接取出入库分配表的库存 + JSONArray dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + map.get("iostorinv_id") + "' AND storagevehicle_code = '" + map.get("storagevehicle_code") + "'").getResultJSONArray(0); + JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + map.get("iostorinv_id") + "'").uniqueResult(0); + for (int i = 0; i < dis_rows.size(); i++) { + JSONObject dis_jo = dis_rows.getJSONObject(i); + JSONObject i_form = new JSONObject(); + i_form.put("struct_id", dis_jo.getString("struct_id")); + i_form.put("material_id", dis_jo.getString("material_id")); + i_form.put("quality_scode", dis_jo.getString("quality_scode")); + i_form.put("pcsn", dis_jo.getString("pcsn")); + i_form.put("ivt_level", dis_jo.getString("ivt_level")); + i_form.put("is_active", dis_jo.getString("is_active")); + i_form.put("change_qty", dis_jo.getString("plan_qty")); + i_form.put("bill_type_scode", mst_jo.getString("bill_type")); + i_form.put("inv_id", mst_jo.getString("iostorinv_id")); + i_form.put("bill_code", mst_jo.getString("bill_code")); + i_form.put("bill_table", "ST_IVT_IOStorInv"); + i_form.put("qty_unit_id", dis_jo.getString("qty_unit_id")); + i_form.put("qty_unit_name", dis_jo.getString("qty_unit_name")); + storPublicService.IOStor(i_form, "31"); + + if (StrUtil.isNotEmpty(ios_dis.getString("point_code"))) { + //更新明细表状态 + JSONObject dtl_jo = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinvdtl_id = '" + dis_jo.getString("iostorinvdtl_id") + "'").uniqueResult(0); + if (dtl_jo.getDoubleValue("unassign_qty") == 0) { + //判断该明细下是否还存在未分配货位的分配明细 + JSONArray disdiv_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinvdtl_id = '" + dis_jo.getString("iostorinvdtl_id") + "' AND (struct_id = '' OR struct_id is null) AND (point_code = '' OR point_code is null)").getResultJSONArray(0); + if (disdiv_rows.size() == 0) { + dtl_jo.put("bill_status", "40"); + WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").update(dtl_jo); + //判断主表下的明细是否都为40 + JSONArray dtl_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinv_id = '" + dis_jo.getString("iostorinv_id") + "' AND bill_status < '40'").getResultJSONArray(0); + if (dtl_rows.size() == 0) { + mst_jo.put("bill_status", "40"); + mst_jo.put("dis_optid", currentUserId); + mst_jo.put("dis_optname", nickName); + mst_jo.put("dis_time", now); + WQLObject.getWQLObject("ST_IVT_IOStorInv").update(mst_jo); + } + } + } + } + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void unDivStruct(Map jo) { + WQLObject dis_wql = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); + WQLObject point_table = WQLObject.getWQLObject("SCH_BASE_Point"); + WQLObject struct_table = WQLObject.getWQLObject("ST_IVT_StructAttr"); + + ArrayList rows = (ArrayList) jo.get("tableMater"); + HashMap whereJson = rows.get(0); + + //解锁原货位点位 + HashMap unlock_map = new HashMap(); + unlock_map.put("lock_type", "00"); + unlock_map.put("taskdtl_type", ""); + unlock_map.put("taskdtl_id", ""); + unlock_map.put("task_code", ""); + unlock_map.put("inv_type", ""); + unlock_map.put("inv_id", ""); + unlock_map.put("inv_code", ""); + point_table.update(unlock_map, "point_code = '" + whereJson.get("struct_code") + "'"); + struct_table.update(unlock_map, "struct_code = '" + whereJson.get("struct_code") + "'"); + + //减去原货位的待入数 + JSONArray dis_rows = dis_wql.query("struct_code = '" + whereJson.get("struct_code") + "' AND work_status < '99'").getResultJSONArray(0); + if (dis_rows.size() <= 0) { + throw new BadRequestException("数据参数有误!"); + } + StructattrDto old_struct = structattrService.findByCode((String) whereJson.get("struct_code")); + JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + dis_rows.getJSONObject(0).getString("iostorinv_id") + "'").uniqueResult(0); + for (int i = 0; i < dis_rows.size(); i++) { + JSONObject i_form = new JSONObject(); + JSONObject dis_row = dis_rows.getJSONObject(i); + i_form.put("struct_id", old_struct.getStruct_id()); + i_form.put("material_id", dis_row.getString("material_id")); + i_form.put("quality_scode", dis_row.getString("quality_scode")); + i_form.put("pcsn", dis_row.getString("pcsn")); + i_form.put("ivt_level", dis_row.getString("ivt_level")); + i_form.put("is_active", dis_row.getString("is_active")); + i_form.put("change_qty", dis_row.getString("plan_qty")); + i_form.put("bill_type_scode", mst_jo.getString("bill_type")); + i_form.put("inv_id", mst_jo.getString("iostorinv_id")); + i_form.put("bill_code", mst_jo.getString("bill_code")); + i_form.put("bill_table", "ST_IVT_IOStorInv"); + i_form.put("qty_unit_id", dis_row.getString("qty_unit_id")); + i_form.put("qty_unit_name", dis_row.getString("qty_unit_name")); + storPublicService.IOStor(i_form, "32"); + + //对分配明细进行循环 + JSONArray disdtl_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDisDtl").query("iostorinvdis_id = '" + dis_row.getString("iostorinvdis_id") + "'").getResultJSONArray(0); + for (int j = 0; j < disdtl_rows.size(); j++) { + JSONObject disdtl_row = disdtl_rows.getJSONObject(j); + WQLObject dis_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDisDtl"); + dis_dtl.delete("iostorinvdisdtl_id = '" + (String) disdtl_row.get("iostorinvdisdtl_id") + "'"); + //更新桶记录表,判断单据是否为立库返工入库,如果是则删除桶记录,并还原立库出库确认表 + if (mst_jo.getString("bill_type").equals("000301")) { + WQLObject.getWQLObject("MD_PB_BucketRecord").delete("bucketunique = '" + disdtl_row.get("bucketunique") + "' AND status = '02'"); + HashMap out_map = new HashMap<>(); + out_map.put("status", "0"); + WQLObject.getWQLObject("PDM_LK_OutPalletMateril").update(out_map, "bucketunique = '" + disdtl_row.get("bucketunique") + "' AND status = '1'"); + } else { + HashMap bucket_map = new HashMap<>(); + bucket_map.put("status", "01"); + bucket_map.put("makeup_optid", ""); + bucket_map.put("makeup_optname", ""); + bucket_map.put("makeup_time", ""); + bucket_map.put("storagevehicle_id", ""); + bucket_map.put("storagevehicle_code", ""); + WQLObject.getWQLObject("MD_PB_BucketRecord").update(bucket_map, "bucketunique = '" + disdtl_row.get("bucketunique") + "' AND status = '02'"); + } + } + //回写明细表数量 + double real_qty = -Double.parseDouble((String) dis_row.get("plan_qty")); + JSONObject dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinvdtl_id ='" + dis_row.get("iostorinvdtl_id") + "'").uniqueResult(0); + double assign_qty = NumberUtil.add(dtl.getDoubleValue("assign_qty"), real_qty); + dtl.put("assign_qty", assign_qty); + double unassign_qty = NumberUtil.sub(dtl.getDoubleValue("plan_qty"), assign_qty); + + if (unassign_qty < 0) { + unassign_qty = 0; + } + dtl.put("unassign_qty", unassign_qty); + if (assign_qty > 0) { + dtl.put("bill_status", "30"); + } else { + dtl.put("bill_status", "10"); + } + WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").update(dtl); + + //删除该分配 + dis_wql.delete(dis_row); + } + //更新主表状态 + JSONArray dtl_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinv_id = '" + mst_jo.get("iostorinv_id") + "' AND bill_status IN ('20','30')").getResultJSONArray(0); + if (dtl_rows.size() > 0) { + mst_jo.put("bill_status", "30"); + } else { + mst_jo.put("bill_status", "10"); + } + WQLObject.getWQLObject("ST_IVT_IOStorInv").update(mst_jo); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void divPoint(Map whereJson) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + ArrayList rows = (ArrayList) whereJson.get("tableMater"); + String point_code = (String) whereJson.get("point_code"); + HashMap map = rows.get(0); + + HashMap point_map = new HashMap<>(); + PointDto pointDto = pointService.findByCode(point_code); + point_map.put("point_code", pointDto.getPoint_code()); + point_map.put("point_id", pointDto.getPoint_id() + ""); + point_map.put("point_name", pointDto.getPoint_name()); + + //判断起点终点是否不为空 + JSONObject ios_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + map.get("iostorinv_id") + "' AND storagevehicle_code = '" + map.get("storagevehicle_code") + "'").uniqueResult(0); + if (StrUtil.isNotEmpty(ios_dis.getString("struct_code"))) { + //创建任务 + AbstractAcsTask task = null; + JSONObject task_form = new JSONObject(); + task_form.put("task_type", "01"); + task_form.put("taskdtl_type", "01"); + task_form.put("start_device_code", point_code); + task_form.put("next_device_code", ios_dis.getString("struct_code")); + task_form.put("storagevehicle_id", map.get("storagevehicle_id")); + task_form.put("vehicle_code", map.get("storagevehicle_code")); + task_form.put("storagevehicle_type", map.get("storagevehicle_type")); + //查询主表信息 + JSONObject mst = WQLObject.getWQLObject("st_ivt_iostorinv").query("iostorinv_id = '" + map.get("iostorinv_id") + "'").uniqueResult(0); + task_form.put("inv_type", mst.get("bill_type")); + task_form.put("inv_id", mst.get("iostorinv_id")); + task_form.put("inv_code", mst.get("bill_code")); + String task_id = task.createTask(task_form); + point_map.put("task_id", task_id); + point_map.put("work_status", "01"); + } + WQLObject.getWQLObject("ST_IVT_IOStorInvDis").update(point_map, "iostorinv_id = '" + map.get("iostorinv_id") + "' AND storagevehicle_code = '" + map.get("storagevehicle_code") + "'"); + + if (StrUtil.isNotEmpty(ios_dis.getString("struct_code"))) { + //修改库存 + //直接取出入库分配表的库存 + JSONArray dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + map.get("iostorinv_id") + "' AND storagevehicle_code = '" + map.get("storagevehicle_code") + "'").getResultJSONArray(0); + JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + map.get("iostorinv_id") + "'").uniqueResult(0); + for (int i = 0; i < dis_rows.size(); i++) { + JSONObject dis_jo = dis_rows.getJSONObject(i); + //更新明细表状态 + JSONObject dtl_jo = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinvdtl_id = '" + dis_jo.getString("iostorinvdtl_id") + "'").uniqueResult(0); + if (dtl_jo.getDoubleValue("unassign_qty") == 0) { + //判断该明细下是否还存在未分配货位的分配明细 + JSONArray disdiv_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinvdtl_id = '" + dis_jo.getString("iostorinvdtl_id") + "' AND (struct_id = '' OR struct_id is null) AND (point_code = '' OR point_code is null)").getResultJSONArray(0); + if (disdiv_rows.size() == 0) { + dtl_jo.put("bill_status", "40"); + WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").update(dtl_jo); + //判断主表下的明细是否都为40 + JSONArray dtl_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinv_id = '" + dis_jo.getString("iostorinv_id") + "' AND bill_status < '40'").getResultJSONArray(0); + if (dtl_rows.size() == 0) { + mst_jo.put("bill_status", "40"); + mst_jo.put("dis_optid", currentUserId); + mst_jo.put("dis_optname", nickName); + mst_jo.put("dis_time", now); + WQLObject.getWQLObject("ST_IVT_IOStorInv").update(mst_jo); + } + } + } + } + } + } + + @Override + public JSONArray queryTask(Map whereJson) { + HashMap map = new HashMap<>(); + map.put("flag", "5"); + map.put("iostorinvdtl_id", (String) whereJson.get("iostorinvdtl_id")); + map.put("is_finish", (String) whereJson.get("checked")); + JSONArray rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(map).process().getResultJSONArray(0); + return rows; + } + + @Override + public JSONArray bucketDtl(Map whereJson) { + HashMap map = new HashMap<>(); + map.put("flag", "6"); + map.put("storagevehicle_code", (String) whereJson.get("storagevehicle_code")); + map.put("iostorinv_id", (String) whereJson.get("iostorinv_id")); + JSONArray rows = WQL.getWO("QST_IVT_RAWASSISTISTOR").addParamMap(map).process().getResultJSONArray(0); + return rows; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateTask(Map whereJson) { + WQLObject dis_wql = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); + WQLObject task_wql = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject point_table = WQLObject.getWQLObject("SCH_BASE_Point"); + WQLObject struct_table = WQLObject.getWQLObject("ST_IVT_StructAttr"); + + + //判断指令状态,只能修改生成状态的任务 + String task_code = (String) whereJson.get("task_code"); + TaskDto taskDto = taskService.findByCode(task_code); + if (ObjectUtil.isEmpty(taskDto)) { + throw new BadRequestException("请输入正确的任务号!"); + } + if (!taskDto.getTask_status().equals("01")) { + throw new BadRequestException("只能修改任务状态为生成的任务!"); + } + + //判断入库点是否修改 + if (!whereJson.get("point_code").equals(whereJson.get("new_point_code"))) { + HashMap dis_map = new HashMap<>(); + HashMap task_map = new HashMap<>(); + PointDto pointDto = pointService.findByCode((String) whereJson.get("new_point_code")); + dis_map.put("point_code", pointDto.getPoint_code()); + dis_map.put("point_id", pointDto.getPoint_id() + ""); + dis_map.put("point_name", pointDto.getPoint_name()); + task_map.put("start_point_code", (String) whereJson.get("new_point_code")); + //修改分配表起点,任务表起点 + dis_wql.update(dis_map, "task_id = '" + whereJson.get("task_id") + "'"); + task_wql.update(task_map, "taskdtl_id = '" + whereJson.get("task_id") + "'"); + } + + + //判断目标货位是否修改 + if (!whereJson.get("struct_code").equals(whereJson.get("new_struct_code"))) { + //修改任务表终点 + HashMap task_map = new HashMap<>(); + task_map.put("next_point_code", (String) whereJson.get("new_struct_code")); + task_wql.update(task_map, "taskdtl_id = '" + whereJson.get("task_id") + "'"); + + //更新分配表的目的仓位 + StructattrDto structattrDto = structattrService.findByCode((String) whereJson.get("new_struct_code")); + HashMap str_map = new HashMap<>(); + str_map.put("sect_id", structattrDto.getSect_id()); + str_map.put("sect_code", structattrDto.getSect_code()); + str_map.put("sect_name", structattrDto.getSect_name()); + str_map.put("struct_id", structattrDto.getStruct_id()); + str_map.put("struct_code", structattrDto.getStruct_code()); + str_map.put("struct_name", structattrDto.getStruct_name()); + dis_wql.update(str_map, "task_id = '" + whereJson.get("task_id") + "'"); + + //原货位解锁,新货位加锁 + HashMap unlock_map = new HashMap(); + unlock_map.put("lock_type", "00"); + point_table.update(unlock_map, "point_code = '" + whereJson.get("struct_code") + "'"); + struct_table.update(unlock_map, "struct_code = '" + whereJson.get("struct_code") + "'"); + + HashMap lock_map = new HashMap(); + lock_map.put("lock_type", "01"); + point_table.update(lock_map, "point_code = '" + whereJson.get("new_struct_code") + "'"); + struct_table.update(lock_map, "struct_code = '" + whereJson.get("new_struct_code") + "'"); + + //减去原库位待入数,加上新货位待入数 + //查询为该任务id的入库分配表,进行循环物料修改库存 + JSONArray dis_rows = dis_wql.query("task_id = '" + whereJson.get("task_id") + "'").getResultJSONArray(0); + if (dis_rows.size() <= 0) { + throw new BadRequestException("数据参数有误!"); + } + StructattrDto old_struct = structattrService.findByCode((String) whereJson.get("struct_code")); + JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + dis_rows.getJSONObject(0).getString("iostorinv_id") + "'").uniqueResult(0); + for (int i = 0; i < dis_rows.size(); i++) { + JSONObject i_form = new JSONObject(); + JSONObject dis_row = dis_rows.getJSONObject(i); + i_form.put("struct_id", old_struct.getStruct_id()); + i_form.put("material_id", dis_row.getString("material_id")); + i_form.put("quality_scode", dis_row.getString("quality_scode")); + i_form.put("pcsn", dis_row.getString("pcsn")); + i_form.put("ivt_level", dis_row.getString("ivt_level")); + i_form.put("is_active", dis_row.getString("is_active")); + i_form.put("change_qty", dis_row.getString("plan_qty")); + i_form.put("bill_type_scode", mst_jo.getString("bill_type")); + i_form.put("inv_id", mst_jo.getString("iostorinv_id")); + i_form.put("bill_code", mst_jo.getString("bill_code")); + i_form.put("bill_table", "ST_IVT_IOStorInv"); + i_form.put("qty_unit_id", dis_row.getString("qty_unit_id")); + i_form.put("qty_unit_name", dis_row.getString("qty_unit_name")); + storPublicService.IOStor(i_form, "32"); + + i_form.put("struct_id", structattrDto.getStruct_id()); + storPublicService.IOStor(i_form, "31"); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delTask(Map whereJson) { + WQLObject dis_wql = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); + WQLObject task_wql = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject point_table = WQLObject.getWQLObject("SCH_BASE_Point"); + WQLObject struct_table = WQLObject.getWQLObject("ST_IVT_StructAttr"); + WQLObject change = WQLObject.getWQLObject("MD_PB_BucketChangeFlow"); + + + //判断指令状态,只能修改生成状态的任务 + String taskdtl_id = (String) whereJson.get("taskdtl_id"); + TaskDto taskDto = taskService.findByDtlId(taskdtl_id); + if (ObjectUtil.isEmpty(taskDto)) { + throw new BadRequestException("请输入正确的任务号!"); + } + if (!taskDto.getTask_status().equals("01")) { + throw new BadRequestException("只能修改任务状态为生成的任务!"); + } + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + //更新任务表状态为删除 + HashMap task_map = new HashMap<>(); + task_map.put("is_delete", "1"); + task_map.put("update_optid", currentUserId); + task_map.put("update_optname", nickName); + task_map.put("update_time", now); + //修改分配表起点,任务表起点 + task_wql.update(task_map, "taskdtl_id = '" + taskDto.getTaskdtl_id() + "'"); + + //解锁原货位点位 + HashMap unlock_map = new HashMap(); + unlock_map.put("lock_type", "00"); + unlock_map.put("taskdtl_type", ""); + unlock_map.put("taskdtl_id", ""); + unlock_map.put("task_code", ""); + unlock_map.put("inv_type", ""); + unlock_map.put("inv_id", ""); + unlock_map.put("inv_code", ""); + point_table.update(unlock_map, "point_code = '" + whereJson.get("struct_code") + "'"); + struct_table.update(unlock_map, "struct_code = '" + whereJson.get("struct_code") + "'"); + + //减去原货位的待入数 + JSONArray dis_rows = dis_wql.query("task_id = '" + whereJson.get("task_id") + "'").getResultJSONArray(0); + if (dis_rows.size() <= 0) { + throw new BadRequestException("数据参数有误!"); + } + StructattrDto old_struct = structattrService.findByCode((String) whereJson.get("struct_code")); + JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + dis_rows.getJSONObject(0).getString("iostorinv_id") + "'").uniqueResult(0); + for (int i = 0; i < dis_rows.size(); i++) { + JSONObject i_form = new JSONObject(); + JSONObject dis_row = dis_rows.getJSONObject(i); + i_form.put("struct_id", old_struct.getStruct_id()); + i_form.put("material_id", dis_row.getString("material_id")); + i_form.put("quality_scode", dis_row.getString("quality_scode")); + i_form.put("pcsn", dis_row.getString("pcsn")); + i_form.put("ivt_level", dis_row.getString("ivt_level")); + i_form.put("is_active", dis_row.getString("is_active")); + i_form.put("change_qty", dis_row.getString("plan_qty")); + i_form.put("bill_type_scode", mst_jo.getString("bill_type")); + i_form.put("inv_id", mst_jo.getString("iostorinv_id")); + i_form.put("bill_code", mst_jo.getString("bill_code")); + i_form.put("bill_table", "ST_IVT_IOStorInv"); + i_form.put("qty_unit_id", dis_row.getString("qty_unit_id")); + i_form.put("qty_unit_name", dis_row.getString("qty_unit_name")); + storPublicService.IOStor(i_form, "32"); + + //对分配明细进行循环 + JSONArray disdtl_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDisDtl").query("iostorinvdis_id = '" + dis_row.getString("iostorinvdis_id") + "'").getResultJSONArray(0); + for (int j = 0; j < disdtl_rows.size(); j++) { + JSONObject disdtl_row = disdtl_rows.getJSONObject(j); + WQLObject dis_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDisDtl"); + dis_dtl.delete("iostorinvdisdtl_id = '" + (String) disdtl_row.get("iostorinvdisdtl_id") + "'"); + //更新桶记录表,判断单据是否为立库返工入库,如果是则删除桶记录,并还原立库出库确认表 + if (mst_jo.getString("bill_type").equals("000301")) { + WQLObject.getWQLObject("MD_PB_BucketRecord").delete("bucketunique = '" + disdtl_row.get("bucketunique") + "' AND status = '02'"); + HashMap out_map = new HashMap<>(); + out_map.put("status", "0"); + WQLObject.getWQLObject("PDM_LK_OutPalletMateril").update(out_map, "bucketunique = '" + disdtl_row.get("bucketunique") + "' AND status = '1'"); + } else { + HashMap bucket_map = new HashMap<>(); + bucket_map.put("status", "01"); + bucket_map.put("makeup_optid", ""); + bucket_map.put("makeup_optname", ""); + bucket_map.put("makeup_time", ""); + bucket_map.put("storagevehicle_id", ""); + bucket_map.put("storagevehicle_code", ""); + if (mst_jo.getString("bill_type").equals("000302")) { + bucket_map.put("quality_scode", "00"); + } + WQLObject.getWQLObject("MD_PB_BucketRecord").update(bucket_map, "bucketunique = '" + disdtl_row.get("bucketunique") + "' AND status = '02'"); + + JSONObject bucket_now = WQLObject.getWQLObject("MD_PB_BucketRecord").query("bucketunique = '" + disdtl_row.get("bucketunique") + "' AND status = '01'").uniqueResult(0); + if (mst_jo.getString("bill_type").equals("000302")) { + //插入桶物料变动记录表,加待检 + JSONObject change_jo = new JSONObject(); + change_jo.put("change_id", IdUtil.getSnowflake(1, 1).nextId()); + change_jo.put("bucket_code", bucket_now.get("bucketunique")); + change_jo.put("material_id", bucket_now.get("material_id")); + change_jo.put("pcsn", bucket_now.get("pcsn")); + change_jo.put("ivt_level", bucket_now.get("ivt_level")); + change_jo.put("is_active", bucket_now.get("is_active")); + change_jo.put("quality_scode", "00"); + change_jo.put("qty_unit_id", bucket_now.get("qty_unit_id")); + change_jo.put("qty_unit_name", bucket_now.get("qty_unit_name")); + change_jo.put("change_type_scode", "01"); + change_jo.put("change_time", now); + change_jo.put("rec_person", currentUserId); + change_jo.put("change_qty", bucket_now.get("storage_qty")); + change_jo.put("result_qty", bucket_now.get("storage_qty")); + change.insert(change_jo); + + //插入桶物料变动记录表,减不良 + JSONObject change_jo2 = new JSONObject(); + change_jo2.put("change_id", IdUtil.getSnowflake(1, 1).nextId()); + change_jo2.put("bucket_code", bucket_now.get("bucketunique")); + change_jo2.put("material_id", bucket_now.get("material_id")); + change_jo2.put("pcsn", bucket_now.get("pcsn")); + change_jo2.put("ivt_level", bucket_now.get("ivt_level")); + change_jo2.put("is_active", bucket_now.get("is_active")); + change_jo2.put("quality_scode", "02"); + change_jo2.put("qty_unit_id", bucket_now.get("qty_unit_id")); + change_jo2.put("qty_unit_name", bucket_now.get("qty_unit_name")); + change_jo2.put("change_type_scode", "02"); + change_jo2.put("change_time", now); + change_jo2.put("rec_person", currentUserId); + change_jo2.put("change_qty", bucket_now.get("storage_qty")); + change_jo2.put("result_qty", "0"); + change.insert(change_jo2); + } + } + } + //回写明细表数量 + double real_qty = -Double.parseDouble((String) dis_row.get("plan_qty")); + JSONObject dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinvdtl_id ='" + dis_row.get("iostorinvdtl_id") + "'").uniqueResult(0); + double assign_qty = NumberUtil.add(dtl.getDoubleValue("assign_qty"), real_qty); + dtl.put("assign_qty", assign_qty); + double unassign_qty = NumberUtil.sub(dtl.getDoubleValue("plan_qty"), assign_qty); + + if (unassign_qty < 0) { + unassign_qty = 0; + } + dtl.put("unassign_qty", unassign_qty); + if (assign_qty > 0) { + dtl.put("bill_status", "30"); + } else { + dtl.put("bill_status", "10"); + } + WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").update(dtl); + + //删除该分配 + dis_wql.delete(dis_row); + } + //更新主表状态 + JSONArray dtl_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").query("iostorinv_id = '" + mst_jo.get("iostorinv_id") + "' AND bill_status IN ('20','30')").getResultJSONArray(0); + if (dtl_rows.size() > 0) { + mst_jo.put("bill_status", "30"); + } else { + mst_jo.put("bill_status", "10"); + } + WQLObject.getWQLObject("ST_IVT_IOStorInv").update(mst_jo); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void reIssueTask(Map whereJson) { + //判断指令状态,只能下发生成、执行中状态的任务 + String taskdtl_id = (String) whereJson.get("taskdtl_id"); + String task_id = (String) whereJson.get("task_id"); + TaskDto taskDto = new TaskDto(); + if (StrUtil.isNotEmpty(taskdtl_id)) { + taskDto = taskService.findByDtlId(taskdtl_id); + } else { + taskDto = taskService.findById(task_id); + } + if (ObjectUtil.isEmpty(taskDto)) { + throw new BadRequestException("请输入正确的任务号!"); + } + if (!taskDto.getTask_status().equals("01")) { + throw new BadRequestException("只能修改任务状态为生成的任务!"); + } + AbstractAcsTask task = null; + //调用ACS接受任务接口 + JSONObject result = null; + if (ObjectUtil.isNotEmpty(result)) { + String status = result.getString("status"); + if ("200".equals(status)) { + HashMap map = new HashMap<>(); + //更新任务指令为下发 + JSONObject task_jo = new JSONObject(); + task_jo.put("taskdtl_id", taskDto.getTaskdtl_id()); + task_jo.put("task_id", taskDto.getTask_id()); + task.updateTaskStatus(task_jo, "1"); + } else { + throw new BadRequestException("任务下发失败:" + result.getString("message")); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void confirmTask(Map whereJson) { + WQLObject dis_wql = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); + WQLObject dtl_wql = WQLObject.getWQLObject("st_ivt_iostorinvdtl"); + + //校验主表状态为分配中、分配完 + JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "'").uniqueResult(0); + if (!mst_jo.getString("bill_status").equals("30") && !mst_jo.getString("bill_status").equals("40")) { + throw new BadRequestException("主表状态必须为分配中、分配完!"); + } + + //分配中任务状态必须全部为完成 + JSONArray dis_rows = dis_wql.query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "' AND work_status < '99'").getResultJSONArray(0); + if (dis_rows.size() > 0) { + throw new BadRequestException("存在未完成的作业,或存在组盘记录!"); + } + + //将明细全部变为99 + HashMap map = new HashMap(); + map.put("bill_status", "99"); + dtl_wql.update(map, "iostorinv_id = '" + whereJson.get("iostorinv_id") + "' AND bill_status < '99'").getResultJSONArray(0); + + //完成单据 + inbillService.confirmMst(JSONObject.parseObject(JSON.toJSONString(whereJson))); + } + + @Override + public void cancelTask(Map whereJson) { + WQLObject dis_wql = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); + WQLObject task_wql = WQLObject.getWQLObject("SCH_BASE_Task"); + WQLObject dtl_wql = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); + + + //判断指令状态,只能取消完成状态的任务 + String task_code = (String) whereJson.get("task_code"); + TaskDto taskDto = taskService.findByCode(task_code); + if (ObjectUtil.isEmpty(taskDto)) { + throw new BadRequestException("请输入正确的任务号!"); + } + if (!taskDto.getTask_status().equals("99")) { + throw new BadRequestException("只能取消任务状态为完成中的任务!"); + } + + //判断主表是否为99,如果为99不允许取消 + JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "'").uniqueResult(0); + if (mst_jo.getString("bill_status").equals("99")) { + throw new BadRequestException("单据已完成,无法进行取消任务操作!"); + } + + //变更任务状态 + HashMap task_map = new HashMap(); + task_map.put("task_status", "01"); + task_wql.update(task_map, "taskdtl_id = '" + whereJson.get("task_id") + "'"); + + //更新实际数量 + JSONArray dis_rows = dis_wql.query("task_id = '" + whereJson.get("task_id") + "'").getResultJSONArray(0); + for (int i = 0; i < dis_rows.size(); i++) { + JSONObject dis_row = dis_rows.getJSONObject(i); + double real_qty = dis_row.getDoubleValue("real_qty"); + dis_row.put("real_qty", "0"); + dis_row.put("work_status", "01"); + dis_wql.update(dis_row); + + //更新明细实际数量 + JSONObject dtl_jo = dtl_wql.query("iostorinvdtl_id = '" + dis_row.getString("iostorinvdtl_id") + "'").uniqueResult(0); + double old_real_qty = dtl_jo.getDoubleValue("real_qty"); + dtl_jo.put("real_qty", NumberUtil.sub(old_real_qty, real_qty)); + dtl_wql.update(dtl_jo); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void confirm(Map whereJson) { + WQLObject dis_wql = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); + WQLObject dtl_wql = WQLObject.getWQLObject("st_ivt_iostorinvdtl"); + + //校验主表状态为分配中、分配完 + JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "'").uniqueResult(0); + if (!mst_jo.getString("bill_status").equals("30") && !mst_jo.getString("bill_status").equals("40")) { + throw new BadRequestException("主表状态必须为分配中、分配完!"); + } + + //分配中任务状态必须全部为完成 + JSONArray dis_rows = dis_wql.query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "' AND work_status < '99'").getResultJSONArray(0); + if (dis_rows.size() > 0) { + throw new BadRequestException("存在未完成的作业,或存在组盘记录!"); + } + + //将明细全部变为99 + HashMap map = new HashMap(); + map.put("bill_status", "99"); + dtl_wql.update(map, "iostorinv_id = '" + whereJson.get("iostorinv_id") + "' AND bill_status < '99'").getResultJSONArray(0); + + //完成单据 + inbillService.confirmMst(JSONObject.parseObject(JSON.toJSONString(whereJson))); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void backConfirm(Map whereJson) { + WQLObject dtl_wql = WQLObject.getWQLObject("st_ivt_iostorinvdtl"); + WQLObject mst_wql = WQLObject.getWQLObject("ST_IVT_IOStorInv"); + + //校验主表状态为生成 + JSONObject mst_jo = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "'").uniqueResult(0); + if (!mst_jo.getString("bill_status").equals("10")) { + throw new BadRequestException("主表状态必须为生成!"); + } + + JSONObject mst_row = mst_wql.query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "'").uniqueResult(0); + JSONArray dtl_rows = dtl_wql.query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "'").getResultJSONArray(0); + + //生成手工出库单 + String iostorinv_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + String bill_code = CodeUtil.getNewCode("IO_CODE"); + whereJson.put("iostorinv_id", iostorinv_id); + whereJson.put("bill_code", bill_code); + whereJson.put("io_type", "1"); + whereJson.put("bill_type", "010601"); + whereJson.put("buss_type", ((String) whereJson.get("bill_type")).substring(0, 4)); + mst_wql.insert(whereJson); + for (int i = 0; i < dtl_rows.size(); i++) { + JSONObject dtl_row = dtl_rows.getJSONObject(i); + dtl_row.put("source_billdtl_id", dtl_row.getString("iostorinvdtl_id")); + dtl_row.put("source_bill_type", mst_row.getString("bill_type")); + dtl_row.put("source_bill_code", mst_row.getString("bill_code")); + dtl_row.put("source_bill_table", "ST_IVT_IOStorInvDtl"); + dtl_row.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId()); + dtl_row.put("iostorinv_id", iostorinv_id); + dtl_row.put("bill_status", "10"); + dtl_wql.insert(dtl_row); + } + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + mst_row.put("bill_status", "99"); + mst_row.put("confirm_optid", currentUserId); + mst_row.put("confirm_optname", nickName); + mst_row.put("confirm_time", now); + //更新主表状态为99 + mst_wql.update(mst_row); + + HashMap map = new HashMap<>(); + map.put("bill_status", "99"); + dtl_wql.update(map, "iostorinv_id = '" + mst_row.get("iostorinv_id") + "'"); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/StorPublicServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/StorPublicServiceImpl.java new file mode 100644 index 000000000..730fd1d4a --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/service/impl/StorPublicServiceImpl.java @@ -0,0 +1,567 @@ +package org.nl.wms.st.inbill.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.st.inbill.service.StorPublicService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; + +/** + * PC端出入库新增 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class StorPublicServiceImpl implements StorPublicService { + + @Transactional(rollbackFor = Exception.class) + void createStor(JSONObject from) { + // 货位库存表 + WQLObject wql_StructIvt = WQLObject.getWQLObject("ST_IVT_StructIvt"); + // 查询货位信息 + JSONObject jo = WQL.getWO("ST_PUB_QUERY_01") + .addParam("flag", "1") + .addParam("id", from.getString("struct_id")) + .process().uniqueResult(0); + if (jo == null) { + throw new BadRequestException("仓位不存在或者未启用:" + from.getString("struct_id")); + } + // 查询物料信息 + JSONObject jo_WMSMaterial = WQL.getWO("ST_PUB_QUERY_01") + .addParam("flag", "2") + .addParam("material_id", from.getString("material_id")) + .process() + .uniqueResult(0); + if (ObjectUtil.isEmpty(jo_WMSMaterial)) { + throw new BadRequestException("物料不存在或者未启用:" + from.getString("material_id")); + } + from.put("stockrecord_id", IdUtil.getSnowflake(1, 1).nextId() + ""); + from.put("struct_code", jo.getString("struct_code")); + from.put("struct_name", jo.getString("struct_name")); + from.put("stor_id", jo.getString("stor_id")); + from.put("stor_name", jo.getString("stor_name")); + from.put("instorage_time", DateUtil.now()); + wql_StructIvt.insert(from); + // 更新库存变动日志 + from.put("result_qty", from.getDoubleValue("ivt_qty")); + from.put("stor_code", jo.getString("stor_code")); + this.createStructIvtFlow(from); + } + + @Transactional(rollbackFor = Exception.class) + void createStructIvtFlow(JSONObject from) { + // 仓位库存变动记录表 + WQLObject wql_StructIvtFlow = WQLObject.getWQLObject("ST_IVT_StructIvtFlow"); + // 库区物流日表 + WQLObject wql_IOSectDaily = WQLObject.getWQLObject("ST_IVT_IOStorDaily"); + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + from.put("change_id", IdUtil.getSnowflake(1, 1).nextId() + ""); + from.put("change_time", DateUtil.now()); + from.put("change_person_id", currentUserId + ""); + from.put("change_person_name", nickName); + + String change_type_scode = from.getString("change_type_scode"); + String bill_code = from.getString("bill_code"); + + wql_StructIvtFlow.insert(from); + //拆拼盘不汇总到日表,库存变动记录还是要有记录 + if(bill_code.startsWith("YK") || bill_code.startsWith("CPP") ){ + return; + } + if("22,23,33,21,24,25,34".contains(change_type_scode)){ + String sect_date = DateUtil.today(); + // 出查询更新条件 + String sql_where = "stor_id = '" + from.getString("stor_id") + + "' and sect_date = '" + sect_date + + "' and material_id = '" + from.getString("material_id") + + "' and ivt_level = '" + from.getString("ivt_level") + + "' and is_active = '" + from.getString("is_active") + + "' and pcsn = '" + from.getString("pcsn") + + "' and quality_scode = '" + from.getString("quality_scode") + "'"; + JSONObject jo = wql_IOSectDaily.query(sql_where).uniqueResult(0); + if (jo == null) {// 新增 + String sql_where_before = "stor_id = '" + from.getString("stor_id") + + "' and material_id = '" + from.getString("material_id") + + "' and ivt_level = '" + from.getString("ivt_level") + + "' and is_active = '" + from.getString("is_active") + + "' and pcsn = '" + from.getString("pcsn") + + "' and quality_scode = '" + from.getString("quality_scode") + "'"; + JSONObject jo_before = wql_IOSectDaily.query(sql_where_before, "sect_date desc").uniqueResult(0); + if (jo_before == null) { + from.put("start_num", "0"); + } else { + from.put("start_num", jo_before.getDoubleValue("end_num")); + } + from.put("sect_date", sect_date); + if ("22,33".contains(change_type_scode)) { + from.put("in_num", from.getDoubleValue("change_qty")); + from.put("out_num", "0"); + from.put("end_num", from.getDoubleValue("start_num") + from.getDoubleValue("change_qty")); + from.put("more_num", "0"); + from.put("less_num", "0"); + } else if ("21,25,34".contains(change_type_scode)) { + from.put("in_num", "0"); + from.put("out_num", from.getDoubleValue("change_qty")); + from.put("end_num", from.getDoubleValue("start_num") - from.getDoubleValue("change_qty")); + from.put("more_num", "0"); + from.put("less_num", "0"); + }else if ("23".contains(change_type_scode)) { + from.put("in_num", "0"); + from.put("out_num", "0"); + from.put("end_num", from.getDoubleValue("start_num") + from.getDoubleValue("change_qty")); + from.put("more_num", from.getDoubleValue("change_qty")); + from.put("less_num", "0"); + }else if ("24".contains(change_type_scode)) { + from.put("in_num", "0"); + from.put("out_num", "0"); + from.put("end_num", from.getDoubleValue("start_num") - from.getDoubleValue("change_qty")); + from.put("more_num", "0"); + from.put("less_num", from.getDoubleValue("change_qty")); + } + + from.put("stordaily_id", IdUtil.getSnowflake(1, 1).nextId() + ""); + wql_IOSectDaily.insert(from); + } else {// 更新 + HashMap map = new HashMap(); + if ("22,33".contains(change_type_scode)) { + map.put("in_num", (from.getDoubleValue("change_qty") + jo.getDoubleValue("in_num")) + ""); + map.put("end_num", (from.getDoubleValue("change_qty") + jo.getDoubleValue("end_num")) + ""); + } else if ("21,25,34".contains(change_type_scode)) { + map.put("out_num", (from.getDoubleValue("change_qty") + jo.getDoubleValue("out_num")) + ""); + map.put("end_num", (jo.getDoubleValue("end_num") - from.getDoubleValue("change_qty")) + ""); + }else if ("24".contains(change_type_scode)) { + map.put("less_num", (from.getDoubleValue("change_qty") + jo.getDoubleValue("less_num")) + ""); + map.put("end_num", (jo.getDoubleValue("end_num") - from.getDoubleValue("change_qty")) + ""); + }else if ("23".contains(change_type_scode)) { + map.put("more_num", (from.getDoubleValue("change_qty") + jo.getDoubleValue("more_num")) + ""); + map.put("end_num", (from.getDoubleValue("change_qty") + jo.getDoubleValue("end_num")) + ""); + } + wql_IOSectDaily.update(map, sql_where); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void IOStor(JSONObject from, String change_type_scode) { + // 仓位库存表 + WQLObject wql = WQLObject.getWQLObject("ST_IVT_StructIvt"); + String struct_id_In = ""; + String material_id_In = ""; + String pcsn_In = ""; + String ivt_level_In = ""; + String quality_scode_In = ""; + String is_active_In = ""; + double change_qty = 0; + if (ObjectUtil.isEmpty(from)) { + throw new BadRequestException("输入from异常,请检查"); + } + if (StrUtil.isBlank(change_type_scode)) { + throw new BadRequestException("变动类型不能为空"); + } + from.put("change_type_scode", change_type_scode); + struct_id_In = from.getString("struct_id"); + if (StrUtil.isBlank(struct_id_In)) { + throw new BadRequestException("货位不能为空"); + } + material_id_In = from.getString("material_id"); + if (StrUtil.isBlank(material_id_In)) { + throw new BadRequestException("物料不能为空"); + } + pcsn_In = from.getString("pcsn"); + if (StrUtil.isBlank(pcsn_In)) { + throw new BadRequestException("物料批次不能为空"); + } + ivt_level_In = from.getString("ivt_level"); + if (StrUtil.isBlank(ivt_level_In)) { + throw new BadRequestException("库存等级不能为空"); + } + quality_scode_In = from.getString("quality_scode"); + if (StrUtil.isBlank(quality_scode_In)) { + throw new BadRequestException("品质类型不能为空"); + } + is_active_In = from.getString("is_active"); + if (StrUtil.isBlank(is_active_In)) { + throw new BadRequestException("是否可用不能为空"); + } + change_qty = from.getDoubleValue("change_qty"); + if (change_qty <= 0) { + throw new BadRequestException("变动数异常,请检查"); + } + /*"struct_id = '" + struct_id_In + + "' and material_id = '" + material_id_In + + "' and pcsn = '" + pcsn_In + + "' and ivt_level = '" + ivt_level_In + + "' and is_active = '" + is_active_In + + "' and quality_scode = '" + quality_scode_In + "'";*/ + // 查询条件 + StringBuffer sql_where = new StringBuffer("struct_id = '"); + sql_where.append(struct_id_In); + sql_where.append("' and material_id = '"); + sql_where.append(material_id_In); + sql_where.append("' and pcsn = '"); + sql_where.append(pcsn_In); + sql_where.append("' and ivt_level = '"); + sql_where.append(ivt_level_In); + sql_where.append("' and is_active = '"); + sql_where.append(is_active_In); + sql_where.append("' and quality_scode = '"); + sql_where.append(quality_scode_In); + sql_where.append("'"); + + // 获取仓位物料信息 + JSONObject jo_in = wql.query(sql_where.toString()).uniqueResult(0); + switch (change_type_scode) { + case "11": //11加冻结、减可用:出库分配、移库移出 + if (jo_in != null) { + double ivt_qty = jo_in.getDoubleValue("ivt_qty"); + double canuse_qty = NumberUtil.sub(jo_in.getDoubleValue("canuse_qty"),change_qty); + if (canuse_qty < 0) { + throw new BadRequestException("可用数不允许为负数!"); + } + jo_in.put("canuse_qty", canuse_qty); + jo_in.put("frozen_qty", jo_in.getDoubleValue("frozen_qty") + change_qty); + + double ivt_num_now = jo_in.getDoubleValue("canuse_qty") + jo_in.getDoubleValue("frozen_qty"); + if (ivt_num_now != ivt_qty) { + throw new BadRequestException("输入数据异常,请检查"); + } + + wql.update(jo_in, "stockrecord_id='" + jo_in.getString("stockrecord_id") + "'"); + } else { + throw new BadRequestException(struct_id_In + "仓位库存异常,请检查"); + } + break; + case "12": //12减冻结、加可用:出库分配取消、移库移出取消 + if (jo_in != null) { + double ivt_qty = jo_in.getDoubleValue("ivt_qty"); + jo_in.put("canuse_qty", jo_in.getDoubleValue("canuse_qty") + change_qty); + jo_in.put("frozen_qty", NumberUtil.sub(jo_in.getDoubleValue("frozen_qty"),change_qty)); + + double ivt_num_now = jo_in.getDoubleValue("canuse_qty") + jo_in.getDoubleValue("frozen_qty"); + if (ivt_num_now != ivt_qty) { + throw new BadRequestException("输入数据异常,请检查"); + } + if (jo_in.getDoubleValue("frozen_qty") < 0) { + throw new BadRequestException("冻结数不允许为负数!"); + } + wql.update(jo_in, "stockrecord_id='" + jo_in.getString("stockrecord_id") + "'"); + } else { + throw new BadRequestException(struct_id_In + "仓位库存异常,请检查"); + } + break; + case "21": //21减冻结、减库存:出库确认、移库移出确认 + if (jo_in != null) { + jo_in.put("ivt_qty", NumberUtil.sub(jo_in.getDoubleValue("ivt_qty"),change_qty)); + double ivt_qty = jo_in.getDoubleValue("ivt_qty"); + jo_in.put("frozen_qty", NumberUtil.sub(jo_in.getDoubleValue("frozen_qty"),change_qty)); + + double ivt_num_now = jo_in.getDoubleValue("canuse_qty") + jo_in.getDoubleValue("frozen_qty"); + if (ivt_num_now != ivt_qty) { + throw new BadRequestException("输入数据异常,请检查"); + } + if (jo_in.getDoubleValue("ivt_qty") < 0) { + throw new BadRequestException("库存数不允许为负数!"); + } + if (jo_in.getDoubleValue("frozen_qty") < 0) { + throw new BadRequestException("冻结数不允许为负数!"); + } + wql.update(jo_in, "stockrecord_id='" + jo_in.getString("stockrecord_id") + "'"); + } else { + throw new BadRequestException(struct_id_In + "仓位库存异常,请检查"); + } + break; + case "22": //22加冻结、加库存:出库确认取消、移库移出确认取消 + if (jo_in != null) { + jo_in.put("ivt_qty", jo_in.getDoubleValue("ivt_qty") + change_qty); + double ivt_qty = jo_in.getDoubleValue("ivt_qty"); + jo_in.put("frozen_qty", jo_in.getDoubleValue("frozen_qty") + change_qty); + + double ivt_num_now = jo_in.getDoubleValue("canuse_qty") + jo_in.getDoubleValue("frozen_qty"); + if (ivt_num_now != ivt_qty) { + throw new BadRequestException("输入数据异常,请检查"); + } + wql.update(jo_in, "stockrecord_id='" + jo_in.getString("stockrecord_id") + "'"); + } else { + from.put("canuse_qty", "0"); + from.put("ivt_qty", change_qty); + from.put("frozen_qty", change_qty); + from.put("warehousing_qty", "0"); + this.createStor(from); + } + break; + case "23": //23同时加:质检(新)、损益单(溢)、损益单(损取消) + if (jo_in != null) { + jo_in.put("ivt_qty", jo_in.getDoubleValue("ivt_qty") + change_qty); + double ivt_qty = jo_in.getDoubleValue("ivt_qty"); + jo_in.put("canuse_qty", jo_in.getDoubleValue("canuse_qty") + change_qty); + + double ivt_num_now = jo_in.getDoubleValue("canuse_qty") + jo_in.getDoubleValue("frozen_qty"); + if (ivt_num_now != ivt_qty) { + throw new BadRequestException("输入数据异常,请检查"); + } + if (jo_in.getDoubleValue("canuse_qty") < 0) { + throw new BadRequestException("可用数不允许为负数!"); + } + wql.update(jo_in, "stockrecord_id='" + jo_in.getString("stockrecord_id") + "'"); + } else { + from.put("canuse_qty", change_qty); + from.put("ivt_qty", change_qty); + from.put("frozen_qty", "0"); + from.put("warehousing_qty", "0"); + this.createStor(from); + } + break; + case "24": //24同时减:质检(旧)、损益单(溢取消)、损益单(损) + case "25": //25同时减:配粉出库确认 + if (jo_in != null) { + jo_in.put("ivt_qty", NumberUtil.sub(jo_in.getDoubleValue("ivt_qty"),change_qty)); + double ivt_qty = jo_in.getDoubleValue("ivt_qty"); + jo_in.put("canuse_qty", NumberUtil.sub(jo_in.getDoubleValue("canuse_qty"),change_qty)); + + double ivt_num_now = jo_in.getDoubleValue("canuse_qty") + jo_in.getDoubleValue("frozen_qty"); + if (ivt_num_now != ivt_qty) { + throw new BadRequestException("输入数据异常,请检查"); + } + if (jo_in.getDoubleValue("ivt_qty") < 0) { + throw new BadRequestException("库存数不允许为负数!"); + } + if (jo_in.getDoubleValue("canuse_qty") < 0) { + throw new BadRequestException("可用数不允许为负数!"); + } + wql.update(jo_in, "stockrecord_id='" + jo_in.getString("stockrecord_id") + "'"); + } else { + throw new BadRequestException(struct_id_In + "仓位库存异常,请检查"); + } + break; + case "31": //31加待入:入库分配、移库移入 + if (jo_in != null) { + jo_in.put("warehousing_qty", jo_in.getDoubleValue("warehousing_qty") + change_qty); + wql.update(jo_in, "stockrecord_id='" + jo_in.getString("stockrecord_id") + "'"); + } else { + from.put("canuse_qty", "0"); + from.put("ivt_qty", "0"); + from.put("frozen_qty", "0"); + from.put("warehousing_qty", change_qty); + this.createStor(from); + } + break; + case "32": //32减待入:入库分配取消、移库移入取消 + if (jo_in != null) { + jo_in.put("warehousing_qty", NumberUtil.sub(jo_in.getDoubleValue("warehousing_qty"),change_qty)); + if (jo_in.getDoubleValue("warehousing_qty") < 0) { + throw new BadRequestException("待入数不允许为负数!"); + } + wql.update(jo_in, "stockrecord_id='" + jo_in.getString("stockrecord_id") + "'"); + } else { + throw new BadRequestException(struct_id_In + "仓位库存异常,请检查"); + } + break; + case "33": //33减待入、加库存、加可用:入库确认、移库移入确认 + if (jo_in != null) { + jo_in.put("ivt_qty", jo_in.getDoubleValue("ivt_qty") + change_qty); + double ivt_qty = jo_in.getDoubleValue("ivt_qty"); + jo_in.put("canuse_qty", jo_in.getDoubleValue("canuse_qty") + change_qty); + jo_in.put("warehousing_qty", NumberUtil.sub(jo_in.getDoubleValue("warehousing_qty"),change_qty)); + + double ivt_num_now = jo_in.getDoubleValue("canuse_qty") + jo_in.getDoubleValue("frozen_qty"); + if (ivt_num_now != ivt_qty) { + throw new BadRequestException("输入数据异常,请检查"); + } + if (jo_in.getDoubleValue("warehousing_qty") < 0) { + throw new BadRequestException("待入数不允许为负数!"); + } + wql.update(jo_in, "stockrecord_id='" + jo_in.getString("stockrecord_id") + "'"); + } else { + throw new BadRequestException(struct_id_In + "仓位库存异常,请检查"); + } + break; + case "34": //34加待入、减库存、减可用:入库确认取消、移库移入确认取消 + if (jo_in != null) { + jo_in.put("ivt_qty", NumberUtil.sub(jo_in.getDoubleValue("ivt_qty"),change_qty)); + double ivt_qty = jo_in.getDoubleValue("ivt_qty"); + jo_in.put("canuse_qty", NumberUtil.sub(jo_in.getDoubleValue("canuse_qty"),change_qty)); + jo_in.put("warehousing_qty", jo_in.getDoubleValue("warehousing_qty") + change_qty); + + double ivt_num_now = jo_in.getDoubleValue("canuse_qty") + jo_in.getDoubleValue("frozen_qty"); + if (ivt_num_now != ivt_qty) { + throw new BadRequestException("输入数据异常,请检查"); + } + if (jo_in.getDoubleValue("ivt_qty") < 0) { + throw new BadRequestException("库存数不允许为负数!"); + } + if (jo_in.getDoubleValue("canuse_qty") < 0) { + throw new BadRequestException("可用数不允许为负数!"); + } + wql.update(jo_in, "stockrecord_id='" + jo_in.getString("stockrecord_id") + "'"); + } else { + throw new BadRequestException(struct_id_In + "仓位库存异常,请检查"); + } + break; + default: + throw new BadRequestException("变动类型不存在:" + change_type_scode); + } + if(jo_in!=null) { + if (jo_in.getDoubleValue("ivt_qty") == 0 && jo_in.getDoubleValue("canuse_qty") == 0 && jo_in.getDoubleValue("warehousing_qty") == 0) { + wql.delete(sql_where.toString()); + } + // 更新库存变动日志 + jo_in.put("result_qty", jo_in.getDoubleValue("ivt_qty")); + jo_in.put("change_type_scode", change_type_scode); + jo_in.put("bill_type_scode", from.getString("bill_type_scode")); + jo_in.put("inv_id", from.getString("inv_id")); + jo_in.put("bill_code", from.getString("bill_code")); + jo_in.put("bill_table", from.getString("bill_table")); + jo_in.put("change_qty", from.getString("change_qty")); + // 查询货位信息 + JSONObject jo = WQL.getWO("ST_PUB_QUERY_01") + .addParam("flag", "1") + .addParam("id", from.getString("struct_id")) + .process().uniqueResult(0); + if (jo == null) { + throw new BadRequestException("仓位不存在或者未启用:" + from.getString("struct_id")); + } + jo_in.put("stor_code", jo.getString("stor_code")); + jo_in.put("stor_id", jo.getString("stor_id")); + this.createStructIvtFlow(jo_in); + } +} + + @Override + public void updateStructAndPoint(JSONObject from) { + //货位表 + WQLObject wo_Struct = WQLObject.getWQLObject("ST_IVT_StructAttr"); + //点位表 + WQLObject wo_Point = WQLObject.getWQLObject("SCH_BASE_Point"); + //载具表 + WQLObject wo_Storage = WQLObject.getWQLObject("MD_PB_StorageVehicleInfo"); + //载具表 + WQLObject bucketrecord = WQLObject.getWQLObject("md_pb_bucketrecord"); + String struct_id = from.getString("struct_id"); + String point_code = from.getString("point_code"); + //锁定类型 + String lock_type = from.getString("lock_type"); + //载具编码 + String storagevehicle_code = from.getString("storagevehicle_code"); + if (StrUtil.isEmpty(struct_id) && StrUtil.isEmpty(point_code)) { + throw new BadRequestException("点位仓位更新出入参数异常!"); + } + if (StrUtil.isEmpty(lock_type)) { + throw new BadRequestException("点位仓位更新出入参数异常!"); + } + JSONObject jo = WQL.getWO("ST_PUB_QUERY_01") + .addParam("flag", "3") + .addParam("id", struct_id) + .addParam("point_code", point_code) + .process().uniqueResult(0); + if(jo==null){ + throw new BadRequestException("点位仓位更新未查询到符合条件的点位仓位!"); + } + HashMap map = new HashMap<>(); + if(lock_type.equals("00")){//解锁 + map.put("lock_type",lock_type); + map.put("taskdtl_type",""); + map.put("taskdtl_id",""); + map.put("task_code",""); + map.put("inv_type",""); + map.put("inv_id",""); + map.put("inv_code",""); + String area_type = jo.getString("area_type"); + //是否清空载具 + if("1".equals(from.getString("is_free"))){ + map.put("storagevehicle_code",""); + map.put("vehicle_code",""); + map.put("point_status","00"); + map.put("storagevehicle_qty","0"); + map.put("storagevehicle_type",""); + map.put("storagevehicle_id",""); + map.put("is_emptyvehicle","0"); + }else{ + if (StrUtil.isNotEmpty(storagevehicle_code)) { + JSONObject Storage = wo_Storage.query("storagevehicle_code='"+storagevehicle_code+"'").uniqueResult(0); + if(ObjectUtil.isEmpty(Storage)){ + throw new BadRequestException(storagevehicle_code+"载具参数异常!"); + } + map.put("storagevehicle_code",Storage.getString("storagevehicle_code")); + map.put("storagevehicle_qty","1"); + map.put("storagevehicle_type",Storage.getString("storagevehicle_type")); + map.put("storagevehicle_id",Storage.getString("storagevehicle_id")); + map.put("vehicle_code",Storage.getString("storagevehicle_code")); + map.put("point_status","01"); + JSONArray bus = bucketrecord.query("storagevehicle_code='"+storagevehicle_code+"'").getResultJSONArray(0); + if(bus.size()>0){ + map.put("point_status","02"); + map.put("is_emptyvehicle","0"); + }else{ + map.put("is_emptyvehicle","1"); + } + }else{ + map.put("is_emptyvehicle","0"); + if(StrUtil.isNotEmpty(jo.getString("storagevehicle_code"))){ + String storagevehicle = jo.getString("storagevehicle_code"); + JSONArray bus = bucketrecord.query("storagevehicle_code='"+storagevehicle+"'").getResultJSONArray(0); + if(bus.size()>0){ + map.put("is_emptyvehicle","0"); + }else{ + map.put("is_emptyvehicle","1"); + } + } + } + } + //区域类型非输送线才需解锁 + if(!area_type.equals("21")){ + wo_Point.update(map,"point_id='"+jo.getString("point_id")+"'"); + wo_Struct.update(map,"struct_id='"+jo.getString("struct_id")+"'"); + } + }else{//锁定 + map.put("lock_type",lock_type); + map.put("taskdtl_type",from.getString("taskdtl_type")); + map.put("taskdtl_id",from.getString("taskdtl_id")); + map.put("task_code",from.getString("task_code")); + map.put("inv_type",from.getString("inv_type")); + map.put("inv_id",from.getString("inv_id")); + map.put("inv_code",from.getString("inv_code")); + String area_type = jo.getString("area_type"); + if (StrUtil.isNotEmpty(storagevehicle_code)) { + JSONObject Storage = wo_Storage.query("storagevehicle_code='"+storagevehicle_code+"'").uniqueResult(0); + if(ObjectUtil.isEmpty(Storage)){ + throw new BadRequestException(storagevehicle_code+"载具参数异常!"); + } + map.put("storagevehicle_code",Storage.getString("storagevehicle_code")); + map.put("storagevehicle_qty","1"); + map.put("storagevehicle_type",Storage.getString("storagevehicle_type")); + map.put("storagevehicle_id",Storage.getString("storagevehicle_id")); + map.put("vehicle_code",Storage.getString("storagevehicle_code")); + map.put("point_status","01"); + JSONArray bus = bucketrecord.query("storagevehicle_code='"+storagevehicle_code+"'").getResultJSONArray(0); + if(bus.size()>0){ + map.put("point_status","02"); + map.put("is_emptyvehicle","0"); + }else{ + map.put("is_emptyvehicle","1"); + } + } + //区域类型非输送线才需解锁 + if(!area_type.equals("21")){ + wo_Point.update(map,"point_id='"+jo.getString("point_id")+"'"); + wo_Struct.update(map,"struct_id='"+jo.getString("struct_id")+"'"); + } + } + } + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_IVT_RAWASSISTISTOR.wql b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_IVT_RAWASSISTISTOR.wql new file mode 100644 index 000000000..f6c1a9f06 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_IVT_RAWASSISTISTOR.wql @@ -0,0 +1,394 @@ +[交易说明] + 交易名: 基础点位分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.begin_time TYPEAS s_string + 输入.end_time TYPEAS s_string + 输入.material_search TYPEAS s_string + 输入.bill_code TYPEAS s_string + 输入.create_mode TYPEAS s_string + 输入.stor_id TYPEAS s_string + 输入.bill_status TYPEAS s_string + 输入.bill_type TYPEAS s_string + 输入.container_name TYPEAS s_string + 输入.package_box_sn TYPEAS s_string + + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + ios.* + FROM + ST_IVT_IOStorInv ios + WHERE + ios.is_delete = '0' + OPTION 输入.bill_code <> "" + ios.bill_code like 输入.bill_code + ENDOPTION + OPTION 输入.stor_id <> "" + ios.stor_id = 输入.stor_id + ENDOPTION + OPTION 输入.bill_type <> "" + ios.bill_type = 输入.bill_type + ENDOPTION + OPTION 输入.create_mode <> "" + ios.create_mode = 输入.create_mode + ENDOPTION + OPTION 输入.bill_status <> "" + ios.bill_status = 输入.bill_status + ENDOPTION + OPTION 输入.begin_time <> "" + ios.input_time >= 输入.begin_time + ENDOPTION + OPTION 输入.end_time <> "" + ios.input_time <= 输入.end_time + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "2" + PAGEQUERY + SELECT + sale_order_name, + customer_name, + customer_description, + package_box_sn, + quanlity_in_box, + container_name, + product_name, + product_description, + width, + thickness, + net_weight + FROM + pdm_bi_subpackagerelation sub + WHERE + sub.status = '0' + OPTION 输入.begin_time <> "" + sub.date_of_FG_inbound >= 输入.begin_time + ENDOPTION + OPTION 输入.end_time <> "" + sub.date_of_FG_inbound <= 输入.begin_time + ENDOPTION + OPTION 输入.bill_code <> "" + sub.sale_order_name = 输入.bill_code + ENDOPTION + OPTION 输入.package_box_sn <> "" + sub.package_box_sn = 输入.package_box_sn + ENDOPTION + OPTION 输入.container_name <> "" + sub.container_name = 输入.container_name + ENDOPTION + OPTION 输入.material_search <> "" + ( + sub.product_name like 输入.material_search + OR + sub.product_description like 输入.material_search + ) + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT DISTINCT + dtl.* , + mb.material_code, + mb.material_name, + mst.bill_code + FROM + st_ivt_iostorinvdtl dtl + LEFT JOIN md_me_materialbase mb ON mb.material_id = dtl.material_id + LEFT JOIN ST_IVT_IOStorInv mst ON mst.iostorinv_id = dtl.iostorinv_id + where + mst.bill_code = 输入.bill_code + OPTION 输入.open_flag = "1" + dtl.bill_status < '40' + ENDOPTION + OPTION 输入.open_flag = "2" + dtl.bill_status IN ('30','40') + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "4" + QUERY + SELECT + dis.*, + mb.material_code, + mb.material_name, + FROM + st_ivt_iostorinvdis dis + INNER JOIN md_me_materialbase mb ON mb.material_id = dis.material_id + where + dis.box_no = 输入.package_box_sn + AND + dis.iostorinv_id = 输入.iostorinv_id + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "5" + QUERY + SELECT + dis.iostorinv_id, + dis.material_id, + mb.material_code, + mb.material_name, + dis.pcsn, + dis.seq_no, + dis.storagevehicle_code, + (case when dtl.bucket_num is null then 0 else dtl.bucket_num end) AS bucket_num, + dis.plan_qty, + dis.struct_code, + dis.struct_code AS new_struct_code, + task.task_status AS work_status, + task.task_code, + dis.point_code, + dis.point_code AS new_point_code, + dis.point_name, + dis.iostorinvdis_id, + dis.task_id, + task.taskdtl_id + FROM + st_ivt_iostorinvdis dis + INNER JOIN md_me_materialbase mb ON mb.material_id = dis.material_id + LEFT JOIN ( + SELECT COUNT(disdtl.iostorinvdisdtl_id) AS bucket_num,iostorinvdis_id from st_ivt_iostorinvdisdtl disdtl GROUP BY disdtl.iostorinvdis_id + ) dtl ON dtl.iostorinvdis_id = dis.iostorinvdis_id + LEFT JOIN sch_base_task task ON task.task_id = dis.task_id AND task.is_delete = '0' + WHERE + dis.task_id <> '' + AND + dis.task_id is not null + AND + dis.iostorinvdtl_id = 输入.iostorinvdtl_id + OPTION 输入.is_finish = "1" + dis.work_status < '99' AND task.task_status < '99' + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "6" + QUERY + SELECT + bucket.*, + detail.label, + mb.material_code, + mb.material_name + FROM + st_ivt_iostorinvdisdtl disdtl + LEFT JOIN md_pb_bucketrecord bucket ON bucket.bucketunique = disdtl.bucketunique + LEFT JOIN sys_dict_detail detail ON detail.`value` = bucket.storagevehicle_type + INNER JOIN sys_dict dict ON dict.dict_id = detail.dict_id + AND dict.`name` LIKE 'MD_BUCKET_TYPE%' + INNER JOIN md_me_materialbase mb ON mb.material_id = bucket.material_id + WHERE + disdtl.storagevehicle_code = 输入.storagevehicle_code + AND + disdtl.iostorinv_id = 输入.iostorinv_id + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "7" + QUERY + SELECT DISTINCT + sa.* + FROM + st_ivt_structattr sa + LEFT JOIN st_ivt_sectattr se ON se.sect_id = sa.sect_id + LEFT JOIN st_ivt_structrelamaterial sm ON sm.sect_id = sa.sect_id + WHERE + se.sect_type_attr = '00' + AND sa.lock_type = '00' + AND sa.is_used = '1' + AND sa.is_delete = '0' + AND ( sa.storagevehicle_code IS NULL OR sa.storagevehicle_code = '' ) + AND sa.height = 输入.height + OPTION 输入.sect_flag = "1" + sm.material_type_id = 输入.material_type_id + ENDOPTION + OPTION 输入.sect_id <> "" + sa.sect_id = 输入.sect_id + ENDOPTION + OPTION 输入.stor_id <> "" + sa.stor_id = 输入.stor_id + ENDOPTION + order by sa.struct_code + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "8" + PAGEQUERY + SELECT + pp.CREATE_DATE AS receive_date, + pp.VBILLCODE AS source_bill_code, + mb.material_code, + mb.material_name, + class.class_desc, + mb.material_id, + pp.QTY AS receive_qty, + ( CASE WHEN a.real_qty IS NULL THEN pp.QTY ELSE ( pp.QTY - a.real_qty ) END ) AS need_qty, + mu.unit_name AS qty_unit_name, + '采购订单' AS source_type_name, + mu.measure_unit_id AS qty_unit_id, + pp.id AS source_billdtl_id, + 'PO' AS source_bill_type, + 'PCS_IF_PurchaseOrderProc' AS source_bill_table, + pp.id AS base_billdtl_id, + 'PO' AS base_bill_type, + '' AS base_bill_code, + 'PCS_IF_PurchaseOrderProc' AS base_bill_table + FROM + pcs_if_purchaseorderproc pp + LEFT JOIN md_me_materialbase mb ON mb.ext_id = pp.ITEM_ID + INNER JOIN md_pb_classstandard class ON class.class_id = mb.material_type_id + INNER JOIN md_pb_measureunit mu ON mu.ext_id = pp.M_UNIT_ID + LEFT JOIN ( SELECT dtl.source_billdtl_id, SUM( dtl.real_qty ) AS real_qty FROM st_ivt_iostorinvdtl dtl GROUP BY source_billdtl_id ) a ON a.source_billdtl_id = pp.id + WHERE + pp.proc_status IN ( '01', '02' ) + AND + pp.DR='0' + AND + mb.material_type_id IN 输入.clsss_ids + OPTION 输入.material_search <> "" + (mb.material_code like 输入.material_search + OR + mb.material_name like 输入.material_search) + ENDOPTION + OPTION 输入.bill_code <> "" + pp.VBILLCODE like 输入.bill_code + ENDOPTION + OPTION 输入.begin_time <> "" + pp.CREATE_DATE >= 输入.begin_time + ENDOPTION + OPTION 输入.end_time <> "" + pp.CREATE_DATE <= 输入.end_time + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "9" + PAGEQUERY + SELECT + mst.input_time AS receive_date, + mst.bill_code AS source_bill_code, + mb.material_code, + mb.material_name, + class.class_desc, + mb.material_id, + disdtl.pcsn, + disdtl.real_qty AS need_qty, + disdtl.qty_unit_name, + detail.label AS source_type_name, + disdtl.qty_unit_id, + disdtl.iostorinvdtl_id AS source_billdtl_id, + mst.bill_type AS source_bill_type, + 'st_ivt_iostorinvdtl' AS source_bill_table, + disdtl.bucketunique, + disdtl.storagevehicle_code, + disdtl.quality_scode, + disdtl.ivt_level, + disdtl.is_active, + dtl.base_billdtl_id, + dtl.base_bill_type, + dtl.base_bill_code, + dtl.base_bill_table + + FROM + st_ivt_iostorinvdisdtl disdtl + INNER JOIN st_ivt_iostorinv mst ON mst.iostorinv_id = disdtl.iostorinv_id + LEFT JOIN st_ivt_iostorinvdtl dtl ON dtl.iostorinvdtl_id = disdtl.iostorinvdtl_id + LEFT JOIN sys_dict_detail detail ON detail.`value` = mst.bill_type + LEFT JOIN sys_dict dict ON dict.dict_id = detail.dict_id + AND dict.`name` LIKE 'ST_INV_TYPE%' + INNER JOIN md_me_materialbase mb ON mb.material_id = disdtl.material_id + INNER JOIN md_pb_classstandard class ON class.class_id = mb.material_type_id + WHERE + mst.bill_status = '99' + AND mst.io_type = '0' + AND mst.bill_type not in ('000501','000401','000601') + OPTION 输入.material_search <> "" + (mb.material_code like 输入.material_search + OR + mb.material_name like 输入.material_search) + ENDOPTION + OPTION 输入.bill_code <> "" + mst.bill_code like 输入.bill_code + ENDOPTION + OPTION 输入.query_type <> "" + mst.bill_type = 输入.query_type + ENDOPTION + OPTION 输入.begin_time <> "" + mst.input_time >= 输入.begin_time + ENDOPTION + OPTION 输入.end_time <> "" + mst.input_time <= 输入.end_time + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "10" + QUERY + SELECT + bucket.*, + mb.material_code, + '0' AS is_new, + '' AS bill_code + FROM + md_pb_bucketrecord bucket + LEFT JOIN md_me_materialbase mb ON mb.material_id = bucket.material_id + WHERE + bucket.status = '03' + AND + bucket.storagevehicle_code = 输入.storagevehicle_code + ENDSELECT + ENDQUERY + ENDIF + + + + + diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/ST_PUB_QUERY_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/ST_PUB_QUERY_01.wql new file mode 100644 index 000000000..6683df235 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/ST_PUB_QUERY_01.wql @@ -0,0 +1,145 @@ +[交易说明] + 交易名: 物料更新接口 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + //sql类型 + 输入.flag TYPEAS s_string + // + 输入.id TYPEAS s_string + // + 输入.material_id TYPEAS s_string + // + 输入.point_code TYPEAS s_string + // + 输入.ids TYPEAS f_string +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + QUERY + SELECT + struct.struct_id, + struct.struct_name, + struct.struct_code, + struct.sect_id, + struct.sect_name, + struct.stor_id, + struct.stor_code, + struct.stor_name, + sect.sect_code + FROM + ST_IVT_StructAttr struct + left join ST_IVT_SectAttr sect on sect.sect_id=struct.sect_id + WHERE + struct.is_delete = '0' + AND struct.is_used = '1' + AND sect.is_used='1' + OPTION 输入.id <> "" + struct.struct_id = 输入.id + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + mater.material_id + FROM + md_me_materialbase mater + WHERE + mater.is_delete = '0' + AND mater.is_used = '1' + OPTION 输入.material_id <> "" + mater.material_id = 输入.material_id + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + struct.struct_id, + struct.struct_code, + point.point_code, + point.point_id, + point.area_type, + struct.storagevehicle_code + FROM + SCH_BASE_Point point + left join ST_IVT_StructAttr struct on point.source_id=struct.struct_id + WHERE 1=1 + OPTION 输入.id <> "" + struct.struct_id = 输入.id + ENDOPTION + OPTION 输入.point_code <> "" + point.point_code = 输入.point_code + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "4" + QUERY + SELECT + max(detail.VALUE) AS CODE, + max(detail.label) AS NAME + FROM + sys_dict_detail detail + LEFT JOIN sys_dict dict ON dict.dict_id = detail.dict_id + WHERE + 1 = 1 + AND dict. NAME LIKE '%INV_TYPE%' + group by detail.VALUE + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "5" + QUERY + SELECT + detail.VALUE, + detail.label + FROM + sys_dict_detail detail + inner JOIN sys_dict dict ON dict.dict_id = detail.dict_id and dict.dict_id='6' + WHERE + 1 = 1 + OPTION 输入.ids <> "" + detail.VALUE in (输入.ids) + ENDOPTION + order by detail.dict_sort + ENDSELECT + ENDQUERY + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java new file mode 100644 index 000000000..30a1858c7 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/rest/CheckOutBillController.java @@ -0,0 +1,190 @@ +package org.nl.wms.st.outbill.rest; + +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.st.inbill.service.CheckOutBillService; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +@RestController +@RequiredArgsConstructor +@Api(tags = "检验出库") +@RequestMapping("/api/checkoutbill") +@Slf4j +public class CheckOutBillController { + private final CheckOutBillService checkOutBillService; + + @GetMapping + @Log("查询出库单") + @ApiOperation("查询出库单") + //@PreAuthorize("@el.check('checkoutbill:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(checkOutBillService.pageQuery(whereJson,page), HttpStatus.OK); + } + + @GetMapping("/addDtl") + @Log("查询出库单") + @ApiOperation("查询出库单") + //@PreAuthorize("@el.check('checkoutbill:list')") + public ResponseEntity queryAddDtl(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(checkOutBillService.queryAddDtl(whereJson,page), HttpStatus.OK); + } + + @GetMapping("/queryDtl") + @Log("查询出库单") + @ApiOperation("查询出库单") + //@PreAuthorize("@el.check('checkoutbill:list')") + public ResponseEntity queryDtl(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(checkOutBillService.queryDtl(whereJson,page), HttpStatus.OK); + } + + @GetMapping("/getOutBillDtl") + @Log("查询出库单") + @ApiOperation("查询出库单") + public ResponseEntity getOutBillDtl(@RequestParam Map whereJson){ + return new ResponseEntity<>(checkOutBillService.getOutBillDtl(whereJson), HttpStatus.OK); + } + @Log("删除出库单") + @ApiOperation("删除出库单") + //@PreAuthorize("@el.check('checkoutbill:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + checkOutBillService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PutMapping + @Log("修改出库单") + @ApiOperation("修改出库单") + public ResponseEntity update(@RequestBody Map whereJson){ + checkOutBillService.update(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + @PostMapping() + @Log("新增出库单") + @ApiOperation("新增出库单") + public ResponseEntity insertDtl(@RequestBody Map whereJson){ + checkOutBillService.insertDtl(whereJson); + return new ResponseEntity<>(HttpStatus.CREATED); + } + @PostMapping("/allDiv") + @Log("出库单全部分配") + @ApiOperation("出库单全部分配") + public ResponseEntity allDiv(@RequestBody JSONObject whereJson) { + checkOutBillService.allDiv(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + @PostMapping("/allCancel") + @Log("出库单全部取消") + @ApiOperation("出库单全部取消") + public ResponseEntity allCancel(@RequestBody JSONObject whereJson) { + checkOutBillService.allCancel(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + @GetMapping("/getOutBillDis") + @Log("查询出库单分配") + @ApiOperation("查询出库单分配") + public ResponseEntity getOutBillDis(@RequestParam Map whereJson){ + return new ResponseEntity<>(checkOutBillService.getOutBillDis(whereJson), HttpStatus.OK); + } + @GetMapping("/getOutBillDisDtl") + @Log("查询出库单分配") + @ApiOperation("查询出库单分配") + public ResponseEntity getOutBillDisDtl(@RequestParam Map whereJson){ + return new ResponseEntity<>(checkOutBillService.getOutBillDisDtl(whereJson), HttpStatus.OK); + } + @PostMapping("/setPoint") + @Log("设置检验站点") + @ApiOperation("设置检验站点") + public ResponseEntity setPoint(@RequestBody JSONObject whereJson) { + checkOutBillService.setPoint(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + @GetMapping("/getOutBillTask") + @Log("查询出库单分配任务") + @ApiOperation("查询出库单分配任务") + public ResponseEntity getOutBillTask(@RequestParam Map whereJson){ + return new ResponseEntity<>(checkOutBillService.getOutBillTask(whereJson), HttpStatus.OK); + } + @GetMapping("/getStructIvt") + @Log("查询可分配库存") + @ApiOperation("查询可分配库存") + public ResponseEntity getStructIvt(@RequestParam Map whereJson){ + return new ResponseEntity<>(checkOutBillService.getStructIvt(whereJson), HttpStatus.OK); + } + @PostMapping("/manualDiv") + @Log("出库单手动分配") + @ApiOperation("出库单手动分配") + public ResponseEntity manualDiv(@RequestBody JSONObject whereJson) { + checkOutBillService.manualDiv(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + @PostMapping("/confirm") + @Log("出库单强制确认") + @ApiOperation("出库单强制确认") + public ResponseEntity confirm(@RequestBody JSONObject whereJson) { + checkOutBillService.confirm(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + @PostMapping("/issueTask") + @Log("出库任务下发") + @ApiOperation("出库任务下发") + public ResponseEntity issueTask(@RequestBody JSONObject whereJson) { + checkOutBillService.issueTask(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + @PostMapping("/finishTask") + @Log("出库任务手动完成") + @ApiOperation("出库任务手动完成") + public ResponseEntity finishTask(@RequestBody JSONObject whereJson) { + checkOutBillService.finishTask(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + @PostMapping("/cancleTaskfinish") + @Log("出库任务手动取消完成") + @ApiOperation("出库任务手动取消完成") + public ResponseEntity cancleTaskfinish(@RequestBody JSONObject whereJson) { + checkOutBillService.cancleTaskfinish(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + @GetMapping("/getInvTypes") + @Log("查询单据字段") + @ApiOperation("查询单据字段") + public ResponseEntity getInvTypes(){ + return new ResponseEntity<>(checkOutBillService.getInvTypes(), HttpStatus.OK); + } + + @PostMapping("/paramByCodeType") + @Log("查询出库单物料是否限制参数") + @ApiOperation("查询出库单物料是否限制参数") + public ResponseEntity paramByCodeType(@RequestBody JSONObject whereJson){ + return new ResponseEntity<>(checkOutBillService.getParamByCodeType(whereJson), HttpStatus.OK); + } + @PostMapping("/schAreaType") + @Log("查询点位区域类型") + @ApiOperation("查询点位区域类型") + public ResponseEntity schAreaType(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(checkOutBillService.schAreaType(whereJson), HttpStatus.OK); + } + @PostMapping("/backConfirm") + @Log("出库单强制确认") + @ApiOperation("出库单强制确认") + public ResponseEntity backConfirm(@RequestBody JSONObject whereJson) { + checkOutBillService.backConfirm(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + @GetMapping("/getType") + @Log("获取全部出入库业务类型") + @ApiOperation("获取全部出入库业务类型") + public ResponseEntity getType() { + return new ResponseEntity<>(checkOutBillService.getType(),HttpStatus.OK); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java new file mode 100644 index 000000000..2fe9bf32d --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java @@ -0,0 +1,1279 @@ +package org.nl.wms.st.outbill.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.system.util.CodeUtil; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.service.dto.TaskDto; +import org.nl.wms.st.inbill.service.CheckOutBillService; +import org.nl.wms.st.inbill.service.StorPublicService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * PC端出入库新增 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class CheckOutBillServiceImpl implements CheckOutBillService { + + private StorPublicService storPublicService; + + @Override + public Map pageQuery(Map whereJson, Pageable page) { + HashMap map = new HashMap<>(whereJson); + map.put("flag", "1"); + + if (StrUtil.isNotEmpty(map.get("bill_code"))) { + map.put("bill_code", "%" + map.get("bill_code") + "%"); + } + if (StrUtil.isNotEmpty(map.get("buss_type"))) { + map.put("buss_type", whereJson.get("buss_type") + "%"); + } + if (StrUtil.isNotEmpty(map.get("io_type"))) { + map.put("io_type", map.get("io_type")); + } + if (StrUtil.isNotEmpty(map.get("pcsn"))) { + map.put("pcsn", "%" + map.get("pcsn") + "%"); + } + if (StrUtil.isNotEmpty(map.get("material_code"))) { + map.put("material_code", "%" + map.get("material_code") + "%"); + } + JSONObject jo = WQL.getWO("QST_IVT_CHECKOUTBILL").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "bill_code desc"); + return jo; + } + + @Override + public Map queryAddDtl(Map whereJson, Pageable page) { + HashMap map = new HashMap<>(whereJson); + map.put("flag", "7"); + + if (StrUtil.isNotEmpty(map.get("bill_code"))) { + map.put("bill_code", "%" + map.get("bill_code") + "%"); + } + if (StrUtil.isNotEmpty(map.get("remark"))) { + map.put("remark", "%" + map.get("remark") + "%"); + } + JSONObject jo = WQL.getWO("QST_IVT_CHECKOUTBILL").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), ""); + return jo; + } + + @Override + public Map queryDtl(Map whereJson, Pageable page) { + HashMap map = new HashMap<>(whereJson); + map.put("flag", "12"); + + if (StrUtil.isNotEmpty(map.get("material_code"))) { + map.put("material_code", "%" + map.get("material_code") + "%"); + } + if (StrUtil.isNotEmpty(map.get("username"))) { + map.put("username", "%" + map.get("username") + "%"); + } + if (StrUtil.isNotEmpty(map.get("pcsn"))) { + map.put("pcsn", "%" + map.get("pcsn") + "%"); + } + String begin_time = map.get("begin_time"); + if (StrUtil.isNotEmpty(begin_time)) { + map.put("begin_time", begin_time.substring(0,10)); + } + String end_time = map.get("end_time"); + if (StrUtil.isNotEmpty(end_time)) { + map.put("end_time", end_time.substring(0,10)); + } + String source_bill_code = map.get("source_bill_code"); + if (StrUtil.isNotEmpty(source_bill_code)) { + StringBuilder sb = new StringBuilder(); + String[] strs = source_bill_code.split(","); + for(int i=0;i map = new HashMap<>(); + map.put("is_delete", "1"); + map.put("update_optid", currentUserId + ""); + map.put("update_optname", nickName); + map.put("update_time", now); + wo.update(map, "iostorinv_id='" + iostorinv_id + "'"); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertDtlByJson(JSONObject map) { + //明细另一种写法 + //JSONArray jsonArr = JSONArray.fromObject(whereJson.get("tableData")); + JSONArray rows = map.getJSONArray("tableData"); + map.remove("tableData"); + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + String iostorinv_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + String bill_code = CodeUtil.getNewCode("IO_CODE"); + map.put("iostorinv_id", iostorinv_id); + map.put("bill_code", bill_code); + String bill_type = map.getString("bill_type"); + map.put("buss_type", bill_type.substring(0, 4)); + map.put("io_type", "1"); + map.put("detail_count", rows.size() + ""); + map.put("create_mode", "01"); + map.put("input_optid", currentUserId + ""); + map.put("input_optname", nickName); + map.put("input_time", now); + map.put("update_optid", currentUserId + ""); + map.put("update_optname", nickName); + map.put("update_time", now); + map.put("is_delete", "0"); + map.put("is_upload", "0"); + Long deptId = SecurityUtils.getDeptId(); + map.put("sysdeptid", deptId); + map.put("syscompanyid", deptId); + + for (int i = 0; i < rows.size(); i++) { + JSONObject row = rows.getJSONObject(i); + row.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + ""); + row.put("iostorinv_id", iostorinv_id); + row.put("seq_no", (i + 1) + ""); + row.put("assign_qty", "0"); + row.put("unassign_qty", row.get("plan_qty")); + WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").insert(row); + } + WQLObject.getWQLObject("ST_IVT_IOStorInv").insert(map); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertDtl(Map map) { + //明细另一种写法 + //JSONArray jsonArr = JSONArray.fromObject(whereJson.get("tableData")); + ArrayList rows = (ArrayList) map.get("tableData"); + map.remove("tableData"); + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + String iostorinv_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + String bill_code = CodeUtil.getNewCode("IO_CODE"); + + JSONObject jsonStor = WQLObject.getWQLObject("st_ivt_bsrealstorattr").query("stor_id ='" + MapUtil.getStr(map, "stor_id") + "'").uniqueResult(0); + map.put("iostorinv_id", iostorinv_id); + map.put("bill_code", bill_code); + String bill_type = (String) map.get("bill_type"); + map.put("buss_type", bill_type.substring(0, 4)); + map.put("io_type", "1"); + map.put("detail_count", rows.size() + ""); + map.put("create_mode", "01"); + map.put("stor_code", jsonStor.getString("stor_code")); + map.put("stor_name", jsonStor.getString("stor_name")); + map.put("input_optid", currentUserId + ""); + map.put("input_optname", nickName); + map.put("input_time", now); + map.put("update_optid", currentUserId + ""); + map.put("update_optname", nickName); + map.put("update_time", now); + map.put("is_delete", "0"); + map.put("is_upload", "0"); + Long deptId = SecurityUtils.getDeptId(); + map.put("sysdeptid", deptId); + map.put("syscompanyid", deptId); + + for (int i = 0; i < rows.size(); i++) { + HashMap row = rows.get(i); + row.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + ""); + row.put("iostorinv_id", iostorinv_id); + row.put("seq_no", (i + 1) + ""); + row.put("assign_qty", "0"); + row.put("unassign_qty", row.get("plan_qty")); + WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").insert(row); + } + WQLObject.getWQLObject("ST_IVT_IOStorInv").insert(map); + } + + @Override + public JSONArray getOutBillDtl(Map whereJson) { + whereJson.put("flag", "2"); + JSONArray jo = WQL.getWO("QST_IVT_CHECKOUTBILL") + .addParamMap((HashMap) whereJson) + .process() + .getResultJSONArray(0); + return jo; + } + + @Override + public JSONArray getOutBillDis(Map whereJson) { + whereJson.put("flag", "5"); + JSONArray jo = WQL.getWO("QST_IVT_CHECKOUTBILL") + .addParamMap((HashMap) whereJson) + .process() + .getResultJSONArray(0); + return jo; + } + + @Override + public JSONArray getOutBillDisDtl(Map whereJson) { + whereJson.put("flag", "9"); + JSONArray jo = WQL.getWO("QST_IVT_CHECKOUTBILL") + .addParamMap((HashMap) whereJson) + .process() + .getResultJSONArray(0); + return jo; + } + + @Override + public JSONArray getOutBillTask(Map whereJson) { + HashMap map = new HashMap<>(whereJson); + map.put("flag", "10"); + if ("true".equals(map.get("checked"))) { + map.put("task_status", "99"); + } + JSONArray jo = new JSONArray(); + if (map.containsKey("iostorinvdtl_id")) { + jo = WQL.getWO("QST_IVT_CHECKOUTBILL") + .addParamMap(map) + .process() + .getResultJSONArray(0); + } + return jo; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(Map whereJson) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + whereJson.put("update_optid", currentUserId + ""); + whereJson.put("update_optname", nickName); + whereJson.put("update_time", now); + + WQLObject wo = WQLObject.getWQLObject("ST_IVT_IOStorInv"); + WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); + wo.update(whereJson); + //先删除该单据下的所有明细 + String iostorinv_id = (String) whereJson.get("iostorinv_id"); + wo_dtl.delete("iostorinv_id = '" + iostorinv_id + "'"); + ArrayList rows = (ArrayList) whereJson.get("tableData"); + for (int i = 0; i < rows.size(); i++) { + HashMap row = rows.get(i); + row.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + ""); + row.put("iostorinv_id", iostorinv_id); + row.put("seq_no", (i + 1) + ""); + row.put("bill_status", "10"); + row.put("assign_qty", "0"); + row.put("unassign_qty", row.get("plan_qty")); + WQLObject.getWQLObject("ST_IVT_IOStorInvDtl").insert(row); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void allDiv(JSONObject whereJson) { + //出库分配表 + WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); + //出库明细表 + WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); + //出库主表 + WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); + + //定义需要更新的仓位集合 + HashMap Struct_map = new HashMap(); + String iostorinv_id = whereJson.getString("iostorinv_id"); + //查询主表信息 + JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jo_mst)) { + throw new BadRequestException("查不到出库单信息"); + } + + //查询生成和未分配完的明细 + JSONArray dtls = WQL.getWO("QST_IVT_CHECKOUTBILL") + .addParam("flag", "2") + .addParam("bill_status", "30") + .addParam("unassign_flag", "1") + .addParam("iostorinv_id", iostorinv_id) + .addParam("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id")) + .process() + .getResultJSONArray(0); + if (ObjectUtil.isEmpty(dtls)) { + throw new BadRequestException("当前订单无可分配出库明细"); + } + + for (int i = 0; i < dtls.size(); i++) { + JSONObject dtl = dtls.getJSONObject(i); + double unassign_qty = dtl.getDoubleValue("unassign_qty"); + double plan_qty = dtl.getDoubleValue("plan_qty"); + //查询符合条件的库存 + JSONArray ivts = WQL.getWO("QST_IVT_CHECKOUTBILL") + .addParam("flag", "3") + .addParam("material_id", dtl.getString("material_id")) + .addParam("quality_scode", dtl.getString("quality_scode")) + .addParam("pcsn", dtl.getString("pcsn")) + .addParam("ivt_level", dtl.getString("ivt_level")) + .addParam("is_active", dtl.getString("is_active")) + .addParam("iostorinv_id", whereJson.getString("iostorinv_id")) + .addParam("stor_id", whereJson.getString("stor_id")) + .addParam("sect_id", whereJson.getString("sect_id")) + .process() + .getResultJSONArray(0); + if (ivts.size() != 0) { + for (int j = 0; j < ivts.size(); j++) { + JSONObject ivt = ivts.getJSONObject(j); + double canuse_qty = ivt.getDoubleValue("canuse_qty"); + if (unassign_qty >= canuse_qty) { + unassign_qty = unassign_qty - canuse_qty; + ivt.put("change_qty", canuse_qty + ""); + } else { + ivt.put("change_qty", unassign_qty + ""); + unassign_qty = 0; + } + //更新库存 + ivt.put("bill_type_scode", jo_mst.getString("bill_type")); + ivt.put("inv_id", dtl.getString("iostorinv_id")); + ivt.put("bill_code", jo_mst.getString("bill_code")); + ivt.put("bill_table", "ST_IVT_IOStorInv"); + storPublicService.IOStor(ivt, "11"); + //生成分配明细 + dtl.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId()); + dtl.put("sect_id", ivt.getString("sect_id")); + dtl.put("sect_code", ivt.getString("sect_code")); + dtl.put("sect_name", ivt.getString("sect_name")); + dtl.put("struct_id", ivt.getString("struct_id")); + dtl.put("struct_code", ivt.getString("struct_code")); + dtl.put("struct_name", ivt.getString("struct_name")); + dtl.put("pcsn", ivt.getString("pcsn")); + dtl.put("work_status", "00"); + dtl.put("storagevehicle_id", ivt.getString("storagevehicle_id")); + dtl.put("storagevehicle_code", ivt.getString("storagevehicle_code")); + dtl.put("storagevehicle_type", ivt.getString("storagevehicle_type")); + dtl.put("is_issued", "0"); + dtl.put("plan_qty", ivt.getDoubleValue("change_qty")); + dtl.put("real_qty", "0"); + wo_dis.insert(dtl); + //记录需锁定的仓位 + Struct_map.put(ivt.getString("struct_id"), ivt); + if (unassign_qty == 0) { + break; + } + } + HashMap map_dtl = new HashMap(); + //更新明细 + map_dtl.put("unassign_qty", unassign_qty + ""); + map_dtl.put("assign_qty", (plan_qty - unassign_qty) + ""); + if (unassign_qty == 0) { + map_dtl.put("bill_status", "40"); + } else { + map_dtl.put("bill_status", "30"); + } + wo_dtl.update(map_dtl, "iostorinvdtl_id='" + dtl.getString("iostorinvdtl_id") + "'"); + //更新主表状态 + this.updateMststatus(iostorinv_id); + //锁定起点点位、仓位 + Collection c = Struct_map.values(); + Iterator it = c.iterator(); + JSONObject from_start = new JSONObject(); + from_start.put("lock_type", "01"); + for (; it.hasNext(); ) { + JSONObject Struct = it.next(); + from_start.put("struct_id", Struct.getString("struct_id")); + from_start.put("inv_type", jo_mst.getString("bill_type")); + from_start.put("inv_id", jo_mst.getString("iostorinv_id")); + from_start.put("inv_code", jo_mst.getString("bill_code")); + storPublicService.updateStructAndPoint(from_start); + } + } else { + //对一条明细分配时,需要提示错误 + if (dtls.size() == 1) { + throw new BadRequestException("当前明细无可分配库存"); + } + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void allCancel(JSONObject whereJson) { + //出库分配表 + WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); + //出库明细表 + WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); + //出库主表 + WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); + //任务表 + WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); + + String iostorinv_id = whereJson.getString("iostorinv_id"); + //查询主表信息 + JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); + //查询未生成和生成未下发的分配记录 + JSONArray diss = WQL.getWO("QST_IVT_CHECKOUTBILL") + .addParam("flag", "5") + .addParam("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id")) + .addParam("iostorinvdis_id", whereJson.getString("iostorinvdis_id")) + .addParam("task_id", whereJson.getString("task_id")) + .addParam("iostorinv_id", iostorinv_id) + .addParam("bill_status", "01") + .addParam("is_issued", "0") + .process() + .getResultJSONArray(0); + if (ObjectUtil.isEmpty(diss)) { + throw new BadRequestException("不存在可以取消的出库分配明细"); + } + for (int i = 0; i < diss.size(); i++) { + JSONObject dis = diss.getJSONObject(i); + HashMap map = new HashMap<>(); + + String iostorinvdtl_id = dis.getString("iostorinvdtl_id"); + //统计【出入库单分配表】执行状态大于等于执行中,或【任务指令表】任务状态大于等于下发时的记录和 + JSONArray dtl = WQL.getWO("QST_IVT_CHECKOUTBILL") + .addParam("flag", "4") + .addParam("iostorinvdtl_id", iostorinvdtl_id) + .process() + .getResultJSONArray(0); + //若存在记录,则不可取消该出库明细对应的任何分配记录 + if (dtl.size() != 0) { + throw new BadRequestException("存在出库明细对应任务执行中或完成!"); + } + double plan_qty = dis.getDoubleValue("plan_qty"); + //更新库存 + dis.put("change_qty", plan_qty + ""); + dis.put("bill_type_scode", jo_mst.getString("bill_type")); + dis.put("inv_id", iostorinv_id); + dis.put("bill_code", jo_mst.getString("bill_code")); + dis.put("bill_table", "ST_IVT_IOStorInv"); + storPublicService.IOStor(dis, "12"); + //删除【出入库单分配表】中分配记录 + wo_dis.delete("iostorinvdis_id='" + dis.getString("iostorinvdis_id") + "'"); + //更新【出入库单明细表】中分配记录 + JSONObject jo_dtl = wo_dtl.query("iostorinvdtl_id = '" + iostorinvdtl_id + "'").uniqueResult(0); + + jo_dtl.put("assign_qty", jo_dtl.getDoubleValue("assign_qty") - plan_qty); + jo_dtl.put("unassign_qty", jo_dtl.getDoubleValue("unassign_qty") + plan_qty); + + if (jo_dtl.getDoubleValue("unassign_qty") == jo_dtl.getDoubleValue("plan_qty")) { + jo_dtl.put("bill_status", "10"); + } else { + jo_dtl.put("bill_status", "30"); + } + wo_dtl.update(jo_dtl); + //更新主表状态 + this.updateMststatus(iostorinv_id); + //判断是否存在同单据的同起点仓位的分配 + JSONArray flag = WQL.getWO("QST_IVT_CHECKOUTBILL") + .addParam("flag", "5") + .addParam("is_issued", "0") + .addParam("struct_id", dis.getString("struct_id")) + .addParam("iostorinv_id", iostorinv_id) + .addParam("bill_status", "01") + .process() + .getResultJSONArray(0); + if (flag.size() == 0) {//仓位载具冻结数为0 + //任务号不为空 + if (ObjectUtil.isNotEmpty(dis.getString("task_id"))) { + //更新对应任务为删除 + map.put("is_delete", "1"); + wo_Task.update(map, "task_id='" + dis.getString("task_id") + "'"); + } + //解锁起点仓位点位 + JSONObject from_start = new JSONObject(); + from_start.put("struct_id", dis.getString("struct_id")); + from_start.put("lock_type", "00"); + storPublicService.updateStructAndPoint(from_start); + //解锁终点仓位点位 + if (StrUtil.isNotEmpty(dis.getString("point_code"))) { + JSONObject from_end = new JSONObject(); + from_end.put("point_code", dis.getString("point_code")); + from_end.put("lock_type", "00"); + storPublicService.updateStructAndPoint(from_end); + } + } else {//仓位载具扔有冻结数,需改任务类型为拣选出库 + //任务号不为空 + if (ObjectUtil.isNotEmpty(dis.getString("task_id"))) { + //更新对应任务为拣选出库 + map.put("taskdtl_type", "05"); + wo_Task.update(map, "task_id='" + dis.getString("task_id") + "'"); + } + } + } + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void setPoint(JSONObject whereJson) { + //出库分配表 + WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); + //点位表 + WQLObject wo_Point = WQLObject.getWQLObject("SCH_BASE_Point"); + //任务表 + WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); + //出库主表 + WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); + + String struct_id = whereJson.getString("struct_id"); + String point_code = whereJson.getString("point_code"); + String iostorinv_id = whereJson.getString("iostorinv_id"); + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String nowtime = DateUtil.now(); + //查询主表信息 + JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jo_mst)) { + throw new BadRequestException("未查到相关出库单"); + } + JSONObject point = wo_Point.query("lock_type='00' and (vehicle_code='' or vehicle_code IS NULL) and point_code='" + point_code + "'").uniqueResult(0); + //如果终点站点被锁定或者有载具号,则不允许设置点位 + if (ObjectUtil.isEmpty(point)) { + throw new BadRequestException("该站点被锁定或者有载具号,不允许设置!"); + } + //查询未生成和生成未下发的分配记录 + JSONArray diss = WQL.getWO("QST_IVT_CHECKOUTBILL") + .addParam("flag", "5") + .addParam("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id")) + .addParam("struct_id", struct_id) + .addParam("iostorinv_id", iostorinv_id) + .addParam("bill_status", "01") + .addParam("is_issued", "0") + .process() + .getResultJSONArray(0); + if (ObjectUtil.isEmpty(diss)) { + throw new BadRequestException("不存在可以设置站点的分配明细!"); + } + for (int i = 0; i < diss.size(); i++) { + JSONObject dis = diss.getJSONObject(i); + JSONObject disnow = wo_dis.query("work_status='00' and iostorinvdis_id='" + dis.getString("iostorinvdis_id") + "'").uniqueResult(0); + if (disnow == null) { + continue; + } + HashMap map = new HashMap(); + String work_status = dis.getString("work_status"); + String storagevehicle_code = dis.getString("storagevehicle_code"); + String task_status = dis.getString("task_status"); + String task_id = dis.getString("task_id"); + if ("02,99".contains(work_status) || (StrUtil.isNotEmpty(task_status) && "02,03,99".contains(task_status))) { + throw new BadRequestException("该载具任务已执行,不可重新设置站点!"); + } + JSONObject task = new JSONObject(); + if (!task_id.equals("")) {//若任务不为空,则为变更出库目的站点 + task = wo_Task.query("task_id='" + task_id + "'").uniqueResult(0); + //更新任务 + task.put("next_point_code", point.getString("point_code")); + wo_Task.update(task); + //解锁原终点 + JSONObject from_end = new JSONObject(); + from_end.put("point_code", dis.getString("point_code")); + from_end.put("lock_type", "00"); + storPublicService.updateStructAndPoint(from_end); + } else {//生成任务 + task = new JSONObject(); + task_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + String task_code = CodeUtil.getNewCode("TASK_CODE"); + task.put("taskdtl_id", task_id); + task.put("task_id", task_id); + task.put("task_code", task_code); + task.put("task_type", "02"); + //默认拣选 + task.put("taskdtl_type", "05"); + //根据可用数是否为0设置拣选还是全出 + boolean flag = this.canuse_is_zero(dis.getString("struct_code")); + if (flag) { + task.put("taskdtl_type", "02"); + } + task.put("task_status", "01"); + task.put("start_point_code", dis.getString("start_point_code")); + task.put("next_point_code", point.getString("point_code")); + task.put("vehicle_code", dis.getString("storagevehicle_code")); + task.put("handle_class", ""); + task.put("finished_type", ""); + task.put("is_delete", "0"); + task.put("create_id", currentUserId); + task.put("create_name", nickName); + task.put("create_time", nowtime); + task.put("update_optid", currentUserId); + task.put("update_optname", nickName); + task.put("update_time", nowtime); + task.put("priority", "1"); + wo_Task.insert(task); + } + //更新分配表状态、任务号 + map.put("work_status", "01"); + map.put("task_id", task_id); + map.put("point_id", point.getString("point_id")); + map.put("point_code", point.getString("point_code")); + map.put("point_name", point.getString("point_name")); + wo_dis.update(map, "iostorinv_id='" + iostorinv_id + "' and storagevehicle_code='" + storagevehicle_code + "'"); + //锁定点位仓位 + JSONObject from_end = new JSONObject(); + from_end.put("point_code", point.getString("point_code")); + from_end.put("lock_type", "01"); + from_end.put("inv_type", jo_mst.getString("bill_type")); + from_end.put("inv_id", jo_mst.getString("iostorinv_id")); + from_end.put("inv_code", jo_mst.getString("bill_code")); + from_end.put("taskdtl_type", task.getString("taskdtl_type")); + from_end.put("taskdtl_id", task.getString("taskdtl_id")); + from_end.put("task_code", task.getString("task_code")); + storPublicService.updateStructAndPoint(from_end); + } + } + + @Override + public JSONArray getStructIvt(Map whereJson) { + HashMap map = new HashMap(whereJson); + if (StrUtil.isNotEmpty(map.get("remark"))) { + map.put("remark", "%" + map.get("remark") + "%"); + } + JSONArray jo = WQL.getWO("QST_IVT_CHECKOUTBILL") + .addParam("flag", "3") + .addParam("material_id", map.get("material_id")) + .addParam("quality_scode", map.get("quality_scode")) + .addParam("pcsn", map.get("pcsn")) + .addParam("ivt_level", map.get("ivt_level")) + .addParam("is_active", map.get("is_active")) + .addParam("iostorinv_id", map.get("iostorinv_id")) + .addParam("stor_id", map.get("stor_id")) + .addParam("sect_id", map.get("sect_id")) + .addParam("remark", map.get("remark")) + .process() + .getResultJSONArray(0); + return jo; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void manualDiv(JSONObject form) { + //出库分配表 + WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); + //出库明细表 + WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); + //出库主表 + WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); + + //定义需要更新的仓位集合 + HashMap Struct_map = new HashMap<>(); + JSONObject whereJson = form.getJSONObject("row"); + JSONArray rows = form.getJSONArray("rows"); + String iostorinv_id = whereJson.getString("iostorinv_id"); + //查询主表信息 + JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jo_mst)) { + throw new BadRequestException("当前订单无可分配出库明细"); + } + + //查询生成和未分配完的明细 + JSONArray dtls = WQL.getWO("QST_IVT_CHECKOUTBILL") + .addParam("flag", "2") + .addParam("bill_status", "30") + .addParam("unassign_flag", "1") + .addParam("iostorinv_id", iostorinv_id) + .addParam("iostorinvdtl_id", whereJson.getString("iostorinvdtl_id")) + .process() + .getResultJSONArray(0); + if (ObjectUtil.isEmpty(dtls)) { + throw new BadRequestException("当前订单无可分配出库明细"); + } + + for (int i = 0; i < dtls.size(); i++) { + JSONObject dtl = dtls.getJSONObject(i); + double unassign_qty = dtl.getDoubleValue("unassign_qty"); + double plan_qty = dtl.getDoubleValue("plan_qty"); + if (rows.size() != 0) { + for (int j = 0; j < rows.size(); j++) { + JSONObject ivt = rows.getJSONObject(j); + double canuse_qty = ivt.getDoubleValue("plan_qty"); + if (unassign_qty >= canuse_qty) { + unassign_qty = unassign_qty - canuse_qty; + ivt.put("change_qty", canuse_qty + ""); + } else { + ivt.put("change_qty", unassign_qty + ""); + unassign_qty = 0; + } + //更新库存 + ivt.put("bill_type_scode", jo_mst.getString("bill_type")); + ivt.put("inv_id", dtl.getString("iostorinv_id")); + ivt.put("bill_code", jo_mst.getString("bill_code")); + ivt.put("bill_table", "ST_IVT_IOStorInv"); + storPublicService.IOStor(ivt, "11"); + //生成分配明细 + dtl.put("iostorinvdis_id", IdUtil.getSnowflake(1, 1).nextId()); + dtl.put("sect_id", ivt.getString("sect_id")); + dtl.put("sect_code", ivt.getString("sect_code")); + dtl.put("sect_name", ivt.getString("sect_name")); + dtl.put("struct_id", ivt.getString("struct_id")); + dtl.put("struct_code", ivt.getString("struct_code")); + dtl.put("struct_name", ivt.getString("struct_name")); + dtl.put("pcsn", ivt.getString("pcsn")); + dtl.put("work_status", "00"); + dtl.put("storagevehicle_id", ivt.getString("storagevehicle_id")); + dtl.put("storagevehicle_code", ivt.getString("storagevehicle_code")); + dtl.put("storagevehicle_type", ivt.getString("storagevehicle_type")); + dtl.put("is_issued", "0"); + dtl.put("plan_qty", ivt.getDoubleValue("change_qty")); + dtl.put("real_qty", "0"); + wo_dis.insert(dtl); + //记录需锁定的仓位 + Struct_map.put(ivt.getString("struct_id"), ivt); + if (unassign_qty == 0) { + break; + } + } + HashMap map_dtl = new HashMap(); + //更新明细 + map_dtl.put("unassign_qty", unassign_qty + ""); + map_dtl.put("assign_qty", (plan_qty - unassign_qty) + ""); + if (unassign_qty == 0) { + map_dtl.put("bill_status", "40"); + } else { + map_dtl.put("bill_status", "30"); + } + wo_dtl.update(map_dtl, "iostorinvdtl_id='" + dtl.getString("iostorinvdtl_id") + "'"); + } else { + //对一条明细分配时,需要提示错误 + if (dtls.size() == 1) { + throw new BadRequestException("当前明细无可分配库存"); + } + } + + } + //更新主表状态 + this.updateMststatus(iostorinv_id); + //锁定点位、仓位 + Collection c = Struct_map.values(); + Iterator it = c.iterator(); + for (; it.hasNext(); ) { + JSONObject Struct = it.next(); + //锁定起点仓位点位 + JSONObject from_start = new JSONObject(); + from_start.put("struct_id", Struct.getString("struct_id")); + from_start.put("lock_type", "01"); + from_start.put("inv_type", jo_mst.getString("bill_type")); + from_start.put("inv_id", jo_mst.getString("iostorinv_id")); + from_start.put("inv_code", jo_mst.getString("bill_code")); + storPublicService.updateStructAndPoint(from_start); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void confirm(JSONObject form) { + //出库分配表 + WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); + //出库明细表 + WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); + //出库主表 + WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); + + String iostorinv_id = form.getString("iostorinv_id"); + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + //查询主表信息 + JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jo_mst)) { + throw new BadRequestException("未查到相关出库单"); + } + //判断是否存在未确认状态的分配记录 + JSONObject task = wo_dis.query("work_status <>'99' and iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(task)) { + JSONArray ja00 = wo_dis.query("work_status ='00' and iostorinv_id = '" + iostorinv_id + "'").getResultJSONArray(0); + JSONArray jatotal = wo_dis.query("iostorinv_id = '" + iostorinv_id + "'").getResultJSONArray(0); + if (ja00.size() == jatotal.size()) { + throw new BadRequestException("分配明细全是未生成状态,不需要强制确认,请删除单据!"); + } else { + throw new BadRequestException("存在未确认状态的出库分配记录,不允许强制确认!"); + } + } + //查询生成和未分配完的明细 + JSONArray dtls = WQL.getWO("QST_IVT_CHECKOUTBILL") + .addParam("flag", "2") + .addParam("bill_status", "50") + .addParam("iostorinv_id", iostorinv_id) + .process() + .getResultJSONArray(0); + if (dtls.size() != 0) { + for (int i = 0; i < dtls.size(); i++) { + JSONObject dtl = dtls.getJSONObject(i); + HashMap map_dtl = new HashMap<>(); + //更新明细状态 + map_dtl.put("bill_status", "99"); + wo_dtl.update(map_dtl, "iostorinvdtl_id='" + dtl.getString("iostorinvdtl_id") + "'"); + } + } + HashMap map_mst = new HashMap<>(); + map_mst.put("bill_status", "99"); + map_mst.put("confirm_optid", currentUserId + ""); + map_mst.put("confirm_optname", nickName); + map_mst.put("confirm_time", now); + //更新主表状态 + wo_mst.update(map_mst, "iostorinv_id = '" + iostorinv_id + "'"); + //查询需要更新库存的分配记录 + JSONArray diss = WQL.getWO("QST_IVT_CHECKOUTBILL") + .addParam("flag", "55") + .addParam("iostorinv_id", iostorinv_id) + .process() + .getResultJSONArray(0); + for (int i = 0; i < diss.size(); i++) { + JSONObject dis = diss.getJSONObject(i); + double plan_qty = dis.getDoubleValue("plan_qty"); + double real_qty = dis.getDoubleValue("real_qty"); + //全出判断是否全出 + if ("02".equals(dis.getString("taskdtl_type"))) { + if (plan_qty != real_qty) { + throw new BadRequestException(dis.getString("storagevehicle_code") + "全出载具未完成出库!"); + } + } + //未出部分,按取消分配处理 + if (real_qty != plan_qty) { + dis.put("change_qty", plan_qty - real_qty); + dis.put("bill_type_scode", jo_mst.getString("bill_type")); + dis.put("inv_id", iostorinv_id); + dis.put("bill_code", jo_mst.getString("bill_code")); + dis.put("bill_table", "ST_IVT_IOStorInv"); + storPublicService.IOStor(dis, "12"); + } + //更新已出库重量 + if (real_qty != 0) { + dis.put("change_qty", real_qty); + dis.put("bill_type_scode", jo_mst.getString("bill_type")); + dis.put("inv_id", iostorinv_id); + dis.put("bill_code", jo_mst.getString("bill_code")); + dis.put("bill_table", "ST_IVT_IOStorInv"); + storPublicService.IOStor(dis, "21"); + } + //解锁起点 + JSONObject from_start = new JSONObject(); + from_start.put("struct_id", dis.getString("struct_id")); + from_start.put("lock_type", "00"); + if ("02".equals(dis.getString("taskdtl_type"))) { + from_start.put("is_free", "1"); + } + storPublicService.updateStructAndPoint(from_start); + //解锁终点 + JSONObject from_end = new JSONObject(); + from_end.put("point_code", dis.getString("point_code")); + from_end.put("lock_type", "00"); + storPublicService.updateStructAndPoint(from_end); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void issueTask(JSONObject whereJson) { + //出库分配表 + WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); + //任务表 + WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + TaskDto checkOutBillAcsTask = null; + String task_id = whereJson.getString("task_id"); + String taskdtl_id = whereJson.getString("taskdtl_id"); + JSONObject result = null; + if (ObjectUtil.isNotEmpty(result)) { + String status = result.getString("status"); + if ("200".equals(status)) { + HashMap map = new HashMap<>(); + //更新分配表 + map.put("is_issued", "1"); + wo_dis.update(map, "task_id='" + task_id + "'"); + //更新任务为已下发 + map.put("task_status", "02"); + map.put("update_optid", currentUserId + ""); + map.put("update_optname", nickName); + map.put("update_time", now); + wo_Task.update(map, "taskdtl_id='" + taskdtl_id + "'"); + } else { + throw new BadRequestException("任务下发失败,请稍后重试!"); + } + } else { + throw new BadRequestException("任务下发失败,请稍后重试!"); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void finishTask(JSONObject whereJson) { + //出库分配表 + WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); + //出库明细表 + WQLObject wo_dtl = WQLObject.getWQLObject("st_ivt_iostorinvdtl"); + //任务表 + WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); + String taskdtl_id = whereJson.getString("taskdtl_id"); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + JSONObject task = wo_Task.query("task_status<>'99' and taskdtl_id='" + taskdtl_id + "'").uniqueResult(0); + + if (task == null) { + throw new BadRequestException("查询不到操作的任务记录!"); + } + + String taskdtl_type = task.getString("taskdtl_type"); + String task_id = task.getString("task_id"); + JSONObject dtljo = wo_dis.query("task_id='" + task_id + "'").uniqueResult(0); + whereJson.put("iostorinv_id", dtljo.getString("iostorinv_id")); + HashMap map = new HashMap<>(); + //更新任务为完成 + map.put("task_status", TaskStatusEnum.FINISHED.getCode()); + map.put("finished_type", "01"); + map.put("update_optid", currentUserId + ""); + map.put("update_optname", nickName); + map.put("update_time", now); + wo_Task.update(map, "taskdtl_id='" + taskdtl_id + "'"); + if ("05".equals(taskdtl_type)) {//拣选出库 + //更新分配表 + map.put("work_status", "02"); + wo_dis.update(map, "task_id='" + task_id + "'"); + } else if ("06".equals(taskdtl_type)) {//拣选回库 + map.put("work_status", "99"); + wo_dis.update(map, "task_id='" + task_id + "'"); + //判断是否还有未完成的明细 + JSONArray ja = wo_dtl.query("bill_status<>'99' and iostorinv_id='" + whereJson.getString("iostorinv_id") + "'").getResultJSONArray(0); + if (ja.size() == 0) { + this.confirm(whereJson); + } + } else {//全出 + map.put("work_status", "99"); + wo_dis.update(map, "task_id='" + task_id + "'"); + //判断是否还有未完成的明细 + JSONArray ja = wo_dtl.query("bill_status<>'99' and iostorinv_id='" + whereJson.getString("iostorinv_id") + "'").getResultJSONArray(0); + if (ja.size() == 0) { + this.confirm(whereJson); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cancleTaskfinish(JSONObject whereJson) { + //出库明细表 + WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); + //出库分配表 + WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); + //出库分配明细表 + WQLObject wo_DisDtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDisDtl"); + //任务表 + WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); + //出库主表 + WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); + //桶物料变动记录表 + WQLObject wo_BucketChangeFlow = WQLObject.getWQLObject("MD_PB_BucketChangeFlow"); + //桶记录表 + WQLObject wo_BucketRecord = WQLObject.getWQLObject("MD_PB_BucketRecord"); + + String iostorinv_id = whereJson.getString("iostorinv_id"); + String taskdtl_id = whereJson.getString("taskdtl_id"); + HashMap map = new HashMap(); + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + //查询主表信息 + JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jo_mst)) { + throw new BadRequestException("未查到相关出库单"); + } + if (jo_mst.getString("bill_status").equals("99")) { + throw new BadRequestException("已审核单据不允许取消完成!"); + } + JSONObject task = wo_Task.query("taskdtl_id='" + taskdtl_id + "'").uniqueResult(0); + String taskdtl_type = task.getString("taskdtl_type"); + String task_id = task.getString("task_id"); + if ("05".contains(taskdtl_type)) { + //查询拣选出库对应的拣选回库有没有先取消完成 + JSONObject task06 = wo_Task.query("task_status='99' and taskdtl_type='06' and task_id='" + task_id + "'").uniqueResult(0); + if (task06 != null) { + throw new BadRequestException("请先取消拣选出库对应的拣选回库指令!"); + } + } + //如果为拣选出库05 + if ("05,02".contains(taskdtl_type)) { + //更新任务为已下发 + map.put("task_status", "01"); + map.put("finished_type", ""); + map.put("update_optid", currentUserId + ""); + map.put("update_optname", nickName); + map.put("update_time", now); + wo_Task.update(map, "taskdtl_type='" + taskdtl_type + "' and task_id='" + task_id + "'"); + //查询生成和未分配完的明细 + JSONArray disdtls = WQL.getWO("QST_IVT_CHECKOUTBILL") + .addParam("flag", "8") + .addParam("task_id", task_id) + .process() + .getResultJSONArray(0); + if (disdtls.size() != 0) { + for (int i = 0; i < disdtls.size(); i++) { + JSONObject disdtl = disdtls.getJSONObject(i); + //更新桶记录相关表 + double real_qty_disDtl = disdtl.getDoubleValue("real_qty"); + String bucketunique = disdtl.getString("bucketunique"); + //查询桶记录 + JSONObject bucket = wo_BucketRecord.query("status='04' and bucketunique='" + bucketunique + "'").uniqueResult(0); + double storage_qty = bucket.getDoubleValue("storage_qty"); + //重量加回去 + storage_qty = storage_qty + real_qty_disDtl; + bucket.put("storage_qty", storage_qty); + bucket.put("outstor_optid", currentUserId); + bucket.put("outstor_optname", nickName); + bucket.put("outstor_time", now); + //更新桶记录表 + wo_BucketRecord.update(bucket); + //插入一条变动记录 + bucket.put("change_id", IdUtil.getSnowflake(1, 1).nextId() + ""); + bucket.put("bucket_code", bucketunique); + bucket.put("change_type_scode", "01"); + bucket.put("change_time", now); + bucket.put("rec_person", currentUserId); + bucket.put("change_qty", real_qty_disDtl); + bucket.put("result_qty", storage_qty); + wo_BucketChangeFlow.insert(bucket); + //清空分配明细表 + wo_DisDtl.delete("iostorinvdisdtl_id='" + disdtl.getString("iostorinvdisdtl_id") + "'"); + //倒推明细表、分配表实际数量 + JSONObject dis = wo_dis.query("iostorinvdis_id='" + disdtl.getString("iostorinvdis_id") + "'").uniqueResult(0); + dis.put("real_qty", dis.getDoubleValue("real_qty") - real_qty_disDtl); + dis.put("work_status", "01"); + dis.put("is_issued", "0"); + wo_dis.update(dis); + + JSONObject dtl = wo_dtl.query("iostorinvdtl_id='" + disdtl.getString("iostorinvdtl_id") + "'").uniqueResult(0); + double real_qty = dtl.getDoubleValue("real_qty") - real_qty_disDtl; + if (real_qty == 0) { + dtl.put("bill_status", "40"); + } + wo_dtl.update(dtl); + } + } else { + map.put("work_status", "01"); + map.put("is_issued", "0"); + wo_dis.update(map, "task_id='" + task_id + "'"); + } + //更新主表状态 + this.updateMststatus(whereJson.getString("iostorinv_id")); + } else if ("06".equals(taskdtl_type)) {//如果为拣选回库 + //更新任务为已下发 + map.put("task_status", "01"); + map.put("finished_type", ""); + map.put("update_optid", currentUserId + ""); + map.put("update_optname", nickName); + map.put("update_time", now); + wo_Task.update(map, "taskdtl_type='06' and task_id='" + task_id + "'"); + } + } + + @Override + public JSONArray getInvTypes() { + //查询单据字段类型 + JSONArray ja = WQL.getWO("ST_PUB_QUERY_01") + .addParam("flag", "4") + .process() + .getResultJSONArray(0); + return ja; + } + + @Override + public JSONObject getParamByCodeType(JSONObject form) { + String bill_type = form.getString("bill_type"); + if (StrUtil.isEmpty(bill_type)) { + throw new BadRequestException("出库单类型不能为空!"); + } + Map whereJson = new HashMap(); + String io_flag = form.getString("io_flag"); + whereJson.put("io_code", bill_type.substring(0, 4)); + whereJson.put("io_flag", "01"); + if (StrUtil.isNotEmpty(bill_type)) { + whereJson.put("io_flag", io_flag); + } + JSONArray ja = null; + JSONObject ret = new JSONObject(); + if (ja.size() != 0) { + for (int i = 0; i < ja.size(); i++) { + JSONObject jo = ja.getJSONObject(i); + if (bill_type.equals(jo.getString("code"))) { + ret = jo; + break; + } + } + } else { + throw new BadRequestException("出库类型系统参数查询失败!"); + } + return ret; + } + + @Override + public JSONArray schAreaType(JSONObject form) { + String ids = form.getString("ids"); + //查询单据字段类型 + JSONArray ja = WQL.getWO("ST_PUB_QUERY_01") + .addParam("flag", "5") + .addParam("ids", ids) + .process() + .getResultJSONArray(0); + return ja; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void backConfirm(JSONObject whereJson) { + WQLObject dtl_wql = WQLObject.getWQLObject("st_ivt_iostorinvdtl"); + WQLObject mst_wql = WQLObject.getWQLObject("ST_IVT_IOStorInv"); + + JSONObject mst_row = mst_wql.query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "'").uniqueResult(0); + //校验主表状态为生成 + String bill_status = mst_row.getString("bill_status"); + if (!bill_status.equals("10")) { + throw new BadRequestException("主表状态必须为生成状态!"); + } + JSONArray dtl_rows = dtl_wql.query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "'").getResultJSONArray(0); + + //生成手工入库库单 + String iostorinv_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + String bill_code = CodeUtil.getNewCode("IO_CODE"); + + for (int i = 0; i < dtl_rows.size(); i++) { + JSONObject dtl_row = dtl_rows.getJSONObject(i); + dtl_row.put("source_billdtl_id", dtl_row.getString("iostorinvdtl_id")); + dtl_row.put("source_bill_type", mst_row.getString("bill_type")); + dtl_row.put("source_bill_code", mst_row.getString("bill_code")); + dtl_row.put("source_bill_table", "ST_IVT_IOStorInvDtl"); + dtl_row.put("iostorinvdtl_id", IdUtil.getSnowflake(1, 1).nextId()); + dtl_row.put("iostorinv_id", iostorinv_id); + dtl_wql.insert(dtl_row); + } + + mst_row.put("iostorinv_id", iostorinv_id); + mst_row.put("bill_code", bill_code); + mst_row.put("io_type", "0"); + mst_row.put("bill_type", "000401"); + mst_row.put("buss_type", ((String) mst_row.get("bill_type")).substring(0, 4)); + mst_wql.insert(mst_row); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + JSONObject mst_row2 = mst_wql.query("iostorinv_id = '" + whereJson.get("iostorinv_id") + "'").uniqueResult(0); + + mst_row2.put("bill_status", "99"); + mst_row2.put("confirm_optid", currentUserId); + mst_row2.put("confirm_optname", nickName); + mst_row2.put("confirm_time", now); + //更新主表状态为99 + mst_wql.update(mst_row2); + + HashMap map = new HashMap<>(); + map.put("bill_status", "99"); + dtl_wql.update(map, "iostorinv_id = '" + whereJson.get("iostorinv_id") + "'"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public JSONArray getType() { + JSONArray jsonArr = WQL.getWO("QST_IVT_CHECKOUTBILL").addParam("flag", "11").process().getResultJSONArray(0); + return jsonArr; + } + + /** + * 更新主表状态 + * + * @param iostorinv_id + */ + void updateMststatus(String iostorinv_id) { + //出库主表 + WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv"); + //出库明细表 + WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_IOStorInvDtl"); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + //查询主表信息 + JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); + jo_mst.put("update_optid", currentUserId + ""); + jo_mst.put("update_optname", nickName); + jo_mst.put("update_time", now); + //更新主表状态 + JSONArray dtls_40 = wo_dtl.query("bill_status='40' and iostorinv_id = '" + iostorinv_id + "'").getResultJSONArray(0); + //已分配完明细数小于总明细数 + if (dtls_40.size() < jo_mst.getInteger("detail_count")) { + JSONArray dtls_30 = wo_dtl.query("bill_status='30' and iostorinv_id = '" + iostorinv_id + "'").getResultJSONArray(0); + //存在分配完的明细 + if (dtls_40.size() != 0) {//分配中明细数不为0 + jo_mst.put("bill_status", "30"); + } else if (dtls_40.size() == 0) { + //不存在分配中和分配完的明细 + if (dtls_30.size() == 0) { + jo_mst.put("bill_status", "10"); + }//存在分配中的明细 + else if (dtls_30.size() != 0) { + jo_mst.put("bill_status", "30"); + } + } + } else {//已分配完明细数等于总明细数 + jo_mst.put("bill_status", "40"); + } + wo_mst.update(jo_mst); + } + + /** + * 判断仓位上可用数是否为0,0返回true,非0返回false + * + * @param code 载具编码或者仓位编码 + */ + boolean canuse_is_zero(String code) { + //仓位库存表 + WQLObject wo_StructIvt = WQLObject.getWQLObject("ST_IVT_StructIvt"); + //仓位表 + WQLObject wo_Struct = WQLObject.getWQLObject("ST_IVT_StructAttr"); + if (StrUtil.isEmpty(code)) { + throw new BadRequestException("仓位编码不能为空!"); + } + //查询仓位信息 + JSONObject jo_mst = wo_Struct.query("struct_code = '" + code + "'").uniqueResult(0); + if (jo_mst != null) { + //查询可用数大于0的记录数 + JSONArray ja = wo_StructIvt.query("canuse_qty>0 and struct_code = '" + code + "'").getResultJSONArray(0); + if (ja.size() != 0) { + return false; + } + } else { + throw new BadRequestException("查询不到相关仓位!"); + } + return true; + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/wql/QST_IVT_CHECKOUTBILL.wql b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/wql/QST_IVT_CHECKOUTBILL.wql new file mode 100644 index 000000000..cd09a6af1 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/wql/QST_IVT_CHECKOUTBILL.wql @@ -0,0 +1,681 @@ +[交易说明] + 交易名: 基础点位分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.bill_status TYPEAS s_string + 输入.bill_code TYPEAS s_string + 输入.source_bill_code TYPEAS f_string + 输入.username TYPEAS s_string + 输入.create_mode TYPEAS s_string + 输入.bill_type TYPEAS s_string + 输入.stor_id TYPEAS s_string + 输入.iostorinv_id TYPEAS s_string + 输入.buss_type TYPEAS s_string + 输入.end_time TYPEAS s_string + 输入.begin_time TYPEAS s_string + 输入.material_id TYPEAS s_string + 输入.material_code TYPEAS s_string + 输入.quality_scode TYPEAS s_string + 输入.pcsn TYPEAS s_string + 输入.ivt_level TYPEAS s_string + 输入.is_active TYPEAS s_string + 输入.sect_id TYPEAS s_string + 输入.io_type TYPEAS s_string + 输入.iostorinvdtl_id TYPEAS s_string + 输入.unassign_flag TYPEAS s_string + 输入.struct_id TYPEAS s_string + 输入.iostorinvdis_id TYPEAS s_string + 输入.is_issued TYPEAS s_string + 输入.remark TYPEAS s_string + 输入.task_id TYPEAS s_string + 输入.task_status TYPEAS s_string + 输入.deptIds TYPEAS f_string +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + ios.iostorinv_id AS id, + ios.*, + user.nick_name AS upload_optname + FROM + ST_IVT_IOStorInv ios + inner join (SELECT + invdtl.iostorinv_id + FROM + st_ivt_iostorinvdtl invdtl + LEFT JOIN md_me_materialbase mb ON mb.material_id = invdtl.material_id + where 1=1 + OPTION 输入.quality_scode <> "" + invdtl.quality_scode = 输入.quality_scode + ENDOPTION + OPTION 输入.pcsn <> "" + invdtl.pcsn like 输入.pcsn + ENDOPTION + OPTION 输入.material_code <> "" + (mb.material_code like 输入.material_code or mb.material_name like 输入.material_code) + ENDOPTION + group by iostorinv_id) dtlcopy on dtlcopy.iostorinv_id = ios.iostorinv_id + LEFT JOIN sys_user user ON user.user_id = ios.upload_optid + WHERE 1=1 + and ios.is_delete='0' + OPTION 输入.bill_code <> "" + ios.bill_code like 输入.bill_code + ENDOPTION + OPTION 输入.io_type <> "" + ios.io_type = 输入.io_type + ENDOPTION + OPTION 输入.buss_type <> "" + ios.buss_type like 输入.buss_type + ENDOPTION + OPTION 输入.bill_type <> "" + ios.bill_type = 输入.bill_type + ENDOPTION + OPTION 输入.stor_id <> "" + ios.stor_id = 输入.stor_id + ENDOPTION + OPTION 输入.deptIds <> "" + ios.sysdeptid in 输入.deptIds + ENDOPTION + OPTION 输入.create_mode <> "" + ios.create_mode = 输入.create_mode + ENDOPTION + OPTION 输入.bill_status <> "" + ios.bill_status = 输入.bill_status + ENDOPTION + OPTION 输入.begin_time <> "" + ios.input_time >= 输入.begin_time + ENDOPTION + OPTION 输入.end_time <> "" + ios.input_time <= 输入.end_time + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + iosdtl.*, + ios.bill_code, + mb.material_code, + mb.material_name + FROM + ST_IVT_IOStorInvDtl iosdtl + LEFT JOIN md_me_materialbase mb ON mb.material_id = iosdtl.material_id + LEFT JOIN ST_IVT_IOStorInv ios ON ios.iostorinv_id = iosdtl.iostorinv_id + WHERE + 1=1 + OPTION 输入.iostorinv_id <> "" + iosdtl.iostorinv_id = 输入.iostorinv_id + ENDOPTION + OPTION 输入.iostorinvdtl_id <> "" + iosdtl.iostorinvdtl_id = 输入.iostorinvdtl_id + ENDOPTION + OPTION 输入.bill_status <> "" + iosdtl.bill_status <= 输入.bill_status + ENDOPTION + OPTION 输入.unassign_flag <> "" + iosdtl.unassign_qty >0 + ENDOPTION + order by iosdtl.seq_no + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT * FROM ( + SELECT + ivt.*, + '0' AS plan_qty, + mb.material_code, + mb.material_name, + struct.sect_id, + struct.sect_name, + struct.sect_code, + struct.storagevehicle_id, + struct.storagevehicle_code, + struct.storagevehicle_type, + point.point_id + FROM + ST_IVT_StructIvt ivt + LEFT JOIN st_ivt_structattr struct ON struct.struct_id = ivt.struct_id + LEFT JOIN md_me_materialbase mb ON mb.material_id = ivt.material_id + LEFT JOIN SCH_BASE_Point point ON struct.struct_id = point.source_id + WHERE + 1 = 1 and struct.lock_type='01' + and struct.struct_id in ( + SELECT + dis.struct_id + FROM + ST_IVT_IOStorInvDis dis + WHERE 1=1 + and dis.work_status = '00' + OPTION 输入.iostorinv_id <> "" + dis.iostorinv_id = 输入.iostorinv_id + ENDOPTION + ) + OPTION 输入.material_id <> "" + ivt.material_id = 输入.material_id + ENDOPTION + OPTION 输入.quality_scode <> "" + ivt.quality_scode = 输入.quality_scode + ENDOPTION + OPTION 输入.pcsn <> "" + ivt.pcsn = 输入.pcsn + ENDOPTION + OPTION 输入.remark <> "" + (mb.material_code like 输入.remark or mb.material_name like 输入.remark or struct.storagevehicle_code like 输入.remark) + ENDOPTION + OPTION 输入.ivt_level <> "" + ivt.ivt_level = 输入.ivt_level + ENDOPTION + OPTION 输入.is_active <> "" + ivt.is_active = 输入.is_active + ENDOPTION + OPTION 输入.stor_id <> "" + ivt.stor_id = 输入.stor_id + ENDOPTION + OPTION 输入.sect_id <> "" + struct.sect_id = 输入.sect_id + ENDOPTION + order by ivt.canuse_qty,ivt.pcsn desc + ) t1 + UNION + SELECT * FROM ( + SELECT + ivt2.*, + '0' AS plan_qty, + mb.material_code, + mb.material_name, + struct.sect_id, + struct.sect_name, + struct.sect_code, + struct.storagevehicle_id, + struct.storagevehicle_code, + struct.storagevehicle_type, + point.point_id + FROM + ST_IVT_StructIvt ivt2 + LEFT JOIN st_ivt_structattr struct ON struct.struct_id = ivt2.struct_id + LEFT JOIN md_me_materialbase mb ON mb.material_id = ivt2.material_id + LEFT JOIN SCH_BASE_Point point ON struct.struct_id = point.source_id + WHERE + 1 = 1 and struct.lock_type='00' + OPTION 输入.material_id <> "" + ivt2.material_id = 输入.material_id + ENDOPTION + OPTION 输入.quality_scode <> "" + ivt2.quality_scode = 输入.quality_scode + ENDOPTION + OPTION 输入.pcsn <> "" + ivt2.pcsn = 输入.pcsn + ENDOPTION + OPTION 输入.remark <> "" + (mb.material_code like 输入.remark or mb.material_name like 输入.remark or struct.storagevehicle_code like 输入.remark) + ENDOPTION + OPTION 输入.ivt_level <> "" + ivt2.ivt_level = 输入.ivt_level + ENDOPTION + OPTION 输入.is_active <> "" + ivt2.is_active = 输入.is_active + ENDOPTION + OPTION 输入.stor_id <> "" + ivt2.stor_id = 输入.stor_id + ENDOPTION + OPTION 输入.sect_id <> "" + struct.sect_id = 输入.sect_id + ENDOPTION + order by ivt2.canuse_qty,ivt2.pcsn desc + ) t2 + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "4" + QUERY + SELECT + dis.iostorinvdis_id + FROM + ST_IVT_IOStorInvDis dis + WHERE + 1 = 1 + AND dis.work_status IN ('02', '99') + OPTION 输入.iostorinvdtl_id <> "" + dis.iostorinvdtl_id = 输入.iostorinvdtl_id + ENDOPTION + UNION + SELECT + dis.iostorinvdis_id + FROM + ST_IVT_IOStorInvDis dis + LEFT JOIN SCH_BASE_Task task ON dis.task_id = task.task_id + AND task.is_delete = '0' + WHERE + 1 = 1 + AND dis.work_status = '01' + AND task.task_status IN ('02', '03', '99') + OPTION 输入.iostorinvdtl_id <> "" + dis.iostorinvdtl_id = 输入.iostorinvdtl_id + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "5" + QUERY + SELECT + dis.*, + ios.io_type, + ios.bill_code, + mb.material_code, + mb.material_name, + task.task_code, + task.task_status, + task.taskdtl_type, + point.point_code AS start_point_code, + point2.area_type, + point2.source_id + FROM + ST_IVT_IOStorInvDis dis + LEFT JOIN ST_IVT_IOStorInv ios ON ios.iostorinv_id = dis.iostorinv_id + LEFT JOIN md_me_materialbase mb ON mb.material_id = dis.material_id + LEFT JOIN SCH_BASE_Task task ON task.task_id = dis.task_id AND task.is_delete = '0' and task.vehicle_code = dis.storagevehicle_code + LEFT JOIN SCH_BASE_Point point ON point.source_id = dis.struct_id + LEFT JOIN SCH_BASE_Point point2 ON point2.point_id = dis.point_id + WHERE + 1 = 1 + OPTION 输入.iostorinvdtl_id <> "" + dis.iostorinvdtl_id = 输入.iostorinvdtl_id + ENDOPTION + OPTION 输入.task_id <> "" + dis.task_id = 输入.task_id + ENDOPTION + OPTION 输入.iostorinv_id <> "" + dis.iostorinv_id = 输入.iostorinv_id + ENDOPTION + OPTION 输入.iostorinvdis_id <> "" + dis.iostorinvdis_id = 输入.iostorinvdis_id + ENDOPTION + OPTION 输入.is_issued <> "" + dis.is_issued = 输入.is_issued + ENDOPTION + OPTION 输入.struct_id <> "" + dis.struct_id = 输入.struct_id + ENDOPTION + OPTION 输入.bill_status <> "" + dis.work_status <= 输入.bill_status + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "55" + QUERY + SELECT + dis.*, + mb.material_code, + mb.material_name, + task.task_code, + task.task_status, + task.taskdtl_type, + point.point_code AS start_point_code, + point2.area_type, + point2.source_id + FROM + ST_IVT_IOStorInvDis dis + LEFT JOIN md_me_materialbase mb ON mb.material_id = dis.material_id + LEFT JOIN SCH_BASE_Task task ON task.task_id = dis.task_id AND task.is_delete = '0' and task.vehicle_code = dis.storagevehicle_code + LEFT JOIN SCH_BASE_Point point ON point.source_id = dis.struct_id + LEFT JOIN SCH_BASE_Point point2 ON point2.point_id = dis.point_id + WHERE + 1 = 1 and task.taskdtl_type in('05','02') + OPTION 输入.iostorinvdtl_id <> "" + dis.iostorinvdtl_id = 输入.iostorinvdtl_id + ENDOPTION + OPTION 输入.task_id <> "" + dis.task_id = 输入.task_id + ENDOPTION + OPTION 输入.iostorinv_id <> "" + dis.iostorinv_id = 输入.iostorinv_id + ENDOPTION + OPTION 输入.iostorinvdis_id <> "" + dis.iostorinvdis_id = 输入.iostorinvdis_id + ENDOPTION + OPTION 输入.is_issued <> "" + dis.is_issued = 输入.is_issued + ENDOPTION + OPTION 输入.struct_id <> "" + dis.struct_id = 输入.struct_id + ENDOPTION + OPTION 输入.bill_status <> "" + dis.work_status <= 输入.bill_status + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "6" + QUERY + SELECT + dis.iostorinv_id, + dis.is_issued, + dis.pcsn, + dis.storagevehicle_code, + mb.material_code, + mb.material_name, + task.taskdtl_id, + task.task_id, + task.task_code, + task.task_status, + task.taskdtl_type, + task.start_point_code, + task.next_point_code, + point2.area_type, + point2.source_id, + bucket.bucket_num, + bucket.total_storage_qty + FROM + ST_IVT_IOStorInvDis dis + LEFT JOIN md_me_materialbase mb ON mb.material_id = dis.material_id + LEFT JOIN SCH_BASE_Task task ON task.task_id = dis.task_id AND task.is_delete = '0' and task.vehicle_code = dis.storagevehicle_code + LEFT JOIN SCH_BASE_Point point2 ON point2.point_id = dis.point_id + LEFT JOIN ( + SELECT + sum(storage_qty) AS total_storage_qty, + COUNT(*) AS bucket_num, + br.storagevehicle_code + FROM + MD_PB_BucketRecord br + WHERE 1=1 + GROUP BY + br.storagevehicle_code + ) bucket ON bucket.storagevehicle_code = dis.storagevehicle_code + WHERE + 1 = 1 + OPTION 输入.iostorinvdtl_id <> "" + dis.iostorinvdtl_id = 输入.iostorinvdtl_id + ENDOPTION + OPTION 输入.iostorinv_id <> "" + dis.iostorinv_id = 输入.iostorinv_id + ENDOPTION + OPTION 输入.is_issued <> "" + dis.is_issued = 输入.is_issued + ENDOPTION + OPTION 输入.struct_id <> "" + dis.struct_id = 输入.struct_id + ENDOPTION + OPTION 输入.task_status <> "" + task.task_status <> 输入.task_status + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "7" + PAGEQUERY + SELECT + qldtl.inspectiondtl_id AS source_billdtl_id, + qlmst.inspection_type AS source_bill_type, + qlmst.inspection_code AS source_bill_code, + 'QL_TEST_InspectionSheetMst' AS source_bill_table, + qldtl.base_bill_code, + qldtl.base_bill_id, + qldtl.base_bill_table, + qldtl.base_bill_type, + qlmst.biz_date, + mb.material_code, + mb.material_name, + qldtl.pcsn, + '2' AS plan_qty, + qldtl.material_id, + qldtl.qty_unit_id, + qldtl.qty_unit_name + FROM + ql_test_inspectionsheetdtl qldtl + LEFT JOIN ql_test_inspectionsheetmst qlmst ON qlmst.inspection_id = qldtl.inspection_id + LEFT JOIN md_me_materialbase mb ON mb.material_id = qldtl.material_id + WHERE + qlmst.is_delete = '0' + AND qldtl.bill_status IN ('10', '20', '30', '40', '50') + AND qlmst.inspection_type IN ('10', '20') + OPTION 输入.remark <> "" + (mb.material_code like 输入.remark or mb.material_name like 输入.remark) + ENDOPTION + OPTION 输入.bill_code <> "" + qlmst.inspection_code like 输入.bill_code + ENDOPTION + OPTION 输入.begin_time <> "" + qlmst.biz_date >= 输入.begin_time + ENDOPTION + OPTION 输入.end_time <> "" + qlmst.biz_date <= 输入.end_time + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "8" + QUERY + SELECT + disdtl.* + FROM + ST_IVT_IOStorInvDisDtl disdtl + LEFT JOIN ST_IVT_IOStorInvDis dis ON dis.iostorinvdis_id = disdtl.iostorinvdis_id + WHERE + 1 = 1 + OPTION 输入.task_id <> "" + dis.task_id = 输入.task_id + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "9" + QUERY + SELECT + disdtl.*, + mb.material_code, + mb.material_name, + task.task_code, + task.task_status, + task.taskdtl_type, + dis.point_code, + point.point_code AS start_point_code, + point2.area_type, + point2.source_id + FROM + ST_IVT_IOStorInvDisDtl disdtl + inner JOIN ST_IVT_IOStorInvDis dis ON disdtl.iostorinvdtl_id = dis.iostorinvdtl_id + LEFT JOIN md_me_materialbase mb ON mb.material_id = dis.material_id + LEFT JOIN SCH_BASE_Task task ON task.task_id = dis.task_id AND task.is_delete = '0' and task.vehicle_code = dis.storagevehicle_code + LEFT JOIN SCH_BASE_Point point ON point.source_id = dis.struct_id + LEFT JOIN SCH_BASE_Point point2 ON point2.point_id = dis.point_id + WHERE + 1 = 1 + OPTION 输入.iostorinvdtl_id <> "" + dis.iostorinvdtl_id = 输入.iostorinvdtl_id + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "10" + QUERY + SELECT + dis.*, + disdtl.real_qty AS total_storage_qty, + disdtl.bucket_num, + mater.material_code, + mater.material_name, + task.start_point_code, + task.next_point_code, + task.taskdtl_id, + task.task_id, + task.task_code, + task.taskdtl_type, + task.task_status + FROM + st_ivt_iostorinvdis dis + LEFT JOIN md_me_materialbase mater ON dis.material_id = mater.material_id + LEFT JOIN sch_base_task task ON dis.task_id = task.task_id and task.vehicle_code = dis.storagevehicle_code AND task.is_delete = '0' + LEFT JOIN ( + SELECT + sum( real_qty ) AS real_qty, + count(iostorinvdtl_id) AS bucket_num, + iostorinvdtl_id, + storagevehicle_id + FROM + st_ivt_iostorinvdisdtl + GROUP BY + storagevehicle_id,iostorinvdtl_id + ) AS disdtl ON dis.iostorinvdtl_id = disdtl.iostorinvdtl_id + AND dis.storagevehicle_id = disdtl.storagevehicle_id + WHERE + 1=1 + OPTION 输入.iostorinvdtl_id <> "" + dis.iostorinvdtl_id = 输入.iostorinvdtl_id + ENDOPTION + OPTION 输入.iostorinv_id <> "" + dis.iostorinv_id = 输入.iostorinv_id + ENDOPTION + OPTION 输入.is_issued <> "" + dis.is_issued = 输入.is_issued + ENDOPTION + OPTION 输入.struct_id <> "" + dis.struct_id = 输入.struct_id + ENDOPTION + OPTION 输入.task_status <> "" + task.task_status <> 输入.task_status + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "11" + QUERY + SELECT + detail.value AS code, + detail.label AS name + FROM + sys_dict_detail detail + INNER JOIN sys_dict dict ON detail.dict_id = dict.dict_id + WHERE + dict.name = 'ST_INV_TYPE_IO' + AND detail.name = 'IO_BUSS_TYPE' + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "12" + PAGEQUERY + SELECT + SUM( iosdtl2.real_qty ) AS sum_real_qty, + SUM( iosdtl2.plan_qty ) AS sum_plan_qty, + iosdtl2.qty_unit_id, + iosdtl2.qty_unit_name, + iosdtl2.material_name, + iosdtl2.material_code, + iosdtl2.material_id, + iosdtl2.pcsn, + iosdtl2.is_active, + iosdtl2.ivt_level, + iosdtl2.quality_scode + FROM + ( + SELECT + iosdtl.material_id, + iosdtl.pcsn, + iosdtl.quality_scode, + iosdtl.ivt_level, + iosdtl.is_active, + iosdtl.plan_qty, + iosdtl.real_qty, + iosdtl.qty_unit_id, + iosdtl.qty_unit_name, + mb.material_name, + mb.material_code + FROM + ST_IVT_IOStorInvDtl iosdtl + LEFT JOIN md_me_materialbase mb ON mb.material_id = iosdtl.material_id + LEFT JOIN ST_IVT_IOStorInv ios ON ios.iostorinv_id = iosdtl.iostorinv_id + LEFT JOIN sys_user user ON ios.input_optid = user.user_id + WHERE + 1 = 1 + AND ios.is_delete = '0' + AND ios.bill_type in ('010301','010302') + OPTION 输入.material_code <> "" + (mb.material_code like 输入.material_code or mb.material_name like 输入.material_code) + ENDOPTION + OPTION 输入.username <> "" + (user.username like 输入.username or ios.input_optname like 输入.username) + ENDOPTION + OPTION 输入.pcsn <> "" + iosdtl.pcsn like 输入.pcsn + ENDOPTION + OPTION 输入.source_bill_code <> "" + iosdtl.source_bill_code in 输入.source_bill_code + ENDOPTION + OPTION 输入.begin_time <> "" + ios.biz_date >= 输入.begin_time + ENDOPTION + OPTION 输入.end_time <> "" + ios.biz_date <= 输入.end_time + ENDOPTION + OPTION 输入.bill_type <> "" + ios.bill_type = 输入.bill_type + ENDOPTION + OPTION 输入.stor_id <> "" + ios.stor_id = 输入.stor_id + ENDOPTION + ) iosdtl2 + where 1=1 + GROUP BY + iosdtl2.material_id, + iosdtl2.pcsn, + iosdtl2.is_active, + iosdtl2.ivt_level, + iosdtl2.quality_scode, + iosdtl2.material_name, + iosdtl2.material_code, + iosdtl2.qty_unit_id, + iosdtl2.qty_unit_name + ENDSELECT + ENDPAGEQUERY + ENDIF + + + diff --git a/lms/nladmin-system/src/main/resources/logback-spring.xml b/lms/nladmin-system/src/main/resources/logback-spring.xml index f8547a761..be0616438 100644 --- a/lms/nladmin-system/src/main/resources/logback-spring.xml +++ b/lms/nladmin-system/src/main/resources/logback-spring.xml @@ -88,7 +88,7 @@ https://juejin.cn/post/6844903775631572999 - + @@ -97,7 +97,7 @@ https://juejin.cn/post/6844903775631572999 - + diff --git a/lms/nladmin-ui/src/views/wms/basedata/master/material/index.vue b/lms/nladmin-ui/src/views/wms/basedata/master/material/index.vue index 46c32a441..13a7cd9a5 100644 --- a/lms/nladmin-ui/src/views/wms/basedata/master/material/index.vue +++ b/lms/nladmin-ui/src/views/wms/basedata/master/material/index.vue @@ -264,9 +264,6 @@ export default { material_name: [ { required: true, message: '物料名称不能为空', trigger: 'blur' } ], - material_type_id: [ - { required: true, message: '物料分类不能为空', trigger: 'blur' } - ], create_id: [ { required: true, message: '不能为空', trigger: 'blur' } ], diff --git a/lms/nladmin-ui/src/views/wms/pub/StructDialog.vue b/lms/nladmin-ui/src/views/wms/pub/StructDialog.vue new file mode 100644 index 000000000..c651e3dbc --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/pub/StructDialog.vue @@ -0,0 +1,201 @@ + + + + diff --git a/lms/nladmin-ui/src/views/wms/st/inbill/AddDialog.vue b/lms/nladmin-ui/src/views/wms/st/inbill/AddDialog.vue new file mode 100644 index 000000000..f8bcfffa9 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/st/inbill/AddDialog.vue @@ -0,0 +1,400 @@ + + + + + diff --git a/lms/nladmin-ui/src/views/wms/st/inbill/AddDtl.vue b/lms/nladmin-ui/src/views/wms/st/inbill/AddDtl.vue new file mode 100644 index 000000000..cd3631df5 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/st/inbill/AddDtl.vue @@ -0,0 +1,171 @@ + + + + diff --git a/lms/nladmin-ui/src/views/wms/st/inbill/BucketDtlDialog.vue b/lms/nladmin-ui/src/views/wms/st/inbill/BucketDtlDialog.vue new file mode 100644 index 000000000..f1f15982c --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/st/inbill/BucketDtlDialog.vue @@ -0,0 +1,113 @@ + + + + diff --git a/lms/nladmin-ui/src/views/wms/st/inbill/DivDialog.vue b/lms/nladmin-ui/src/views/wms/st/inbill/DivDialog.vue new file mode 100644 index 000000000..0197be380 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/st/inbill/DivDialog.vue @@ -0,0 +1,627 @@ + + + + + diff --git a/lms/nladmin-ui/src/views/wms/st/inbill/StructUpdateDialog.vue b/lms/nladmin-ui/src/views/wms/st/inbill/StructUpdateDialog.vue new file mode 100644 index 000000000..8b303c36c --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/st/inbill/StructUpdateDialog.vue @@ -0,0 +1,268 @@ + + + + + + diff --git a/lms/nladmin-ui/src/views/wms/st/inbill/TaskDialog.vue b/lms/nladmin-ui/src/views/wms/st/inbill/TaskDialog.vue new file mode 100644 index 000000000..48db4879d --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/st/inbill/TaskDialog.vue @@ -0,0 +1,401 @@ + + + + + diff --git a/lms/nladmin-ui/src/views/wms/st/inbill/ViewDialog.vue b/lms/nladmin-ui/src/views/wms/st/inbill/ViewDialog.vue new file mode 100644 index 000000000..93c1cc984 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/st/inbill/ViewDialog.vue @@ -0,0 +1,289 @@ + + + + + diff --git a/lms/nladmin-ui/src/views/wms/st/inbill/index.vue b/lms/nladmin-ui/src/views/wms/st/inbill/index.vue index b9a753ff7..ec1396cfa 100644 --- a/lms/nladmin-ui/src/views/wms/st/inbill/index.vue +++ b/lms/nladmin-ui/src/views/wms/st/inbill/index.vue @@ -8,442 +8,386 @@ :inline="true" class="demo-form-inline" label-position="right" - label-width="90px" + label-width="80px" label-suffix=":" > - + - - - - - - - - - - + + + + + + + + + + - - + + @change="crud.toQuery" + > + + - - + + @change="crud.toQuery" + > + + - - - - - - - + + - 生成任务 + 分配 + + + 作业任务 + + + 强制确认 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - + + + + - - diff --git a/lms/nladmin-ui/src/views/wms/st/inbill/rawassist.js b/lms/nladmin-ui/src/views/wms/st/inbill/rawassist.js new file mode 100644 index 000000000..af4b7b187 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/st/inbill/rawassist.js @@ -0,0 +1,197 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: '/api/in/rawAssist', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: '/api/in/rawAssist', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: '/api/in/rawAssist', + method: 'put', + data + }) +} + +export function getType(params) { + return request({ + url: '/api/in/rawAssist/getType', + method: 'get', + params + }) +} + +export function getBillDtl(params) { + return request({ + url: '/api/in/rawAssist/getBillDtl', + method: 'get', + params + }) +} + +export function getIODtl(params) { + return request({ + url: '/api/in/rawAssist/getIODtl', + method: 'get', + params + }) +} + +export function insertDtl(data) { + return request({ + url: '/api/in/rawAssist/insertDtl', + method: 'post', + data + }) +} + +export function commit(data) { + return request({ + url: '/api/in/rawAssist/commit', + method: 'post', + data + }) +} + +export function checkVehicle(data) { + return request({ + url: '/api/in/rawAssist/checkVehicle', + method: 'post', + data + }) +} + +export function confirmvehicle(data) { + return request({ + url: '/api/in/rawAssist/confirmvehicle', + method: 'post', + data + }) +} + +export function deleteDisDtl(data) { + return request({ + url: '/api/in/rawAssist/deleteDisDtl', + method: 'post', + data + }) +} + +export function getDisDtl(data) { + return request({ + url: '/api/in/rawAssist/getDisDtl', + method: 'post', + data + }) +} + +export function divStruct(data) { + return request({ + url: '/api/in/rawAssist/divStruct', + method: 'post', + data + }) +} + +export function unDivStruct(data) { + return request({ + url: '/api/in/rawAssist/unDivStruct', + method: 'post', + data + }) +} + +export function divPoint(data) { + return request({ + url: '/api/in/rawAssist/divPoint', + method: 'post', + data + }) +} + +export function queryTask(data) { + return request({ + url: '/api/in/rawAssist/queryTask', + method: 'post', + data + }) +} + +export function bucketDtl(data) { + return request({ + url: '/api/in/rawAssist/bucketDtl', + method: 'post', + data + }) +} + +export function updateTask(data) { + return request({ + url: '/api/in/rawAssist/updateTask', + method: 'post', + data + }) +} + +export function delTask(data) { + return request({ + url: '/api/in/rawAssist/delTask', + method: 'post', + data + }) +} + +export function reIssueTask(data) { + return request({ + url: '/api/in/rawAssist/reIssueTask', + method: 'post', + data + }) +} + +export function confirmTask(data) { + return request({ + url: '/api/in/rawAssist/confirmTask', + method: 'post', + data + }) +} + +export function cancelTask(data) { + return request({ + url: '/api/in/rawAssist/cancelTask', + method: 'post', + data + }) +} + +export function confirm(data) { + return request({ + url: '/api/in/rawAssist/confirm', + method: 'post', + data + }) +} + +export function backConfirm(data) { + return request({ + url: '/api/in/rawAssist/backConfirm', + method: 'post', + data + }) +} + +export default { add, edit, del, getType, getBillDtl, insertDtl, getIODtl, commit, checkVehicle, + confirmvehicle, deleteDisDtl, getDisDtl, divStruct, unDivStruct, divPoint, + queryTask, bucketDtl, updateTask, delTask, reIssueTask, confirmTask, cancelTask, confirm, backConfirm } diff --git a/lms/nladmin-ui/src/views/wms/st/inbill/regionioIn.js b/lms/nladmin-ui/src/views/wms/st/inbill/regionioIn.js deleted file mode 100644 index 0bb1ff811..000000000 --- a/lms/nladmin-ui/src/views/wms/st/inbill/regionioIn.js +++ /dev/null @@ -1,35 +0,0 @@ -import request from '@/utils/request' - -export function add(data) { - return request({ - url: 'api/regionioIn', - method: 'post', - data - }) -} - -export function del(ids) { - return request({ - url: 'api/regionioIn/', - method: 'delete', - data: ids - }) -} - -export function edit(data) { - return request({ - url: 'api/regionioIn', - method: 'put', - data - }) -} - -export function createTask(data) { - return request({ - url: 'api/regionioIn/createTask', - method: 'post', - data - }) -} - -export default { add, edit, del, createTask } diff --git a/lms/nladmin-ui/src/views/wms/st/outbill/AddDialog.vue b/lms/nladmin-ui/src/views/wms/st/outbill/AddDialog.vue new file mode 100644 index 000000000..ed13416fd --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/st/outbill/AddDialog.vue @@ -0,0 +1,502 @@ + + + + + diff --git a/lms/nladmin-ui/src/views/wms/st/outbill/AddDtl.vue b/lms/nladmin-ui/src/views/wms/st/outbill/AddDtl.vue new file mode 100644 index 000000000..1526fbc87 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/st/outbill/AddDtl.vue @@ -0,0 +1,137 @@ + + + + diff --git a/lms/nladmin-ui/src/views/wms/st/outbill/DivDialog.vue b/lms/nladmin-ui/src/views/wms/st/outbill/DivDialog.vue new file mode 100644 index 000000000..328521282 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/st/outbill/DivDialog.vue @@ -0,0 +1,502 @@ + + + + + diff --git a/lms/nladmin-ui/src/views/wms/st/outbill/MaterDialog.vue b/lms/nladmin-ui/src/views/wms/st/outbill/MaterDialog.vue deleted file mode 100644 index 6a90bc566..000000000 --- a/lms/nladmin-ui/src/views/wms/st/outbill/MaterDialog.vue +++ /dev/null @@ -1,165 +0,0 @@ - - - - - diff --git a/lms/nladmin-ui/src/views/wms/st/outbill/StructIvt.vue b/lms/nladmin-ui/src/views/wms/st/outbill/StructIvt.vue new file mode 100644 index 000000000..15694bf26 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/st/outbill/StructIvt.vue @@ -0,0 +1,245 @@ + + + diff --git a/lms/nladmin-ui/src/views/wms/st/outbill/TaskDialog.vue b/lms/nladmin-ui/src/views/wms/st/outbill/TaskDialog.vue new file mode 100644 index 000000000..34cf30c22 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/st/outbill/TaskDialog.vue @@ -0,0 +1,324 @@ + + + + + diff --git a/lms/nladmin-ui/src/views/wms/st/outbill/ViewDialog.vue b/lms/nladmin-ui/src/views/wms/st/outbill/ViewDialog.vue new file mode 100644 index 000000000..79d2d17dc --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/st/outbill/ViewDialog.vue @@ -0,0 +1,289 @@ + + + + + diff --git a/lms/nladmin-ui/src/views/wms/st/outbill/checkoutbill.js b/lms/nladmin-ui/src/views/wms/st/outbill/checkoutbill.js new file mode 100644 index 000000000..4af94a5e0 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/st/outbill/checkoutbill.js @@ -0,0 +1,158 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/checkoutbill', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/checkoutbill/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/checkoutbill', + method: 'put', + data + }) +} + +export function getOutBillDtl(params) { + return request({ + url: '/api/checkoutbill/getOutBillDtl', + method: 'get', + params + }) +} +export function getOutBillDis(params) { + return request({ + url: '/api/checkoutbill/getOutBillDis', + method: 'get', + params + }) +} +export function getOutBillDisDtl(params) { + return request({ + url: '/api/checkoutbill/getOutBillDisDtl', + method: 'get', + params + }) +} +export function getOutBillTask(params) { + return request({ + url: '/api/checkoutbill/getOutBillTask', + method: 'get', + params + }) +} +export function getInvTypes() { + return request({ + url: '/api/checkoutbill/getInvTypes', + method: 'get' + }) +} +export function insertDtl(data) { + return request({ + url: '/api/checkoutbill/insertDtl', + method: 'post', + data + }) +} +export function allDiv(data) { + return request({ + url: '/api/checkoutbill/allDiv', + method: 'post', + data + }) +} +export function allCancel(data) { + return request({ + url: '/api/checkoutbill/allCancel', + method: 'post', + data + }) +} +export function setPoint(data) { + return request({ + url: '/api/checkoutbill/setPoint', + method: 'post', + data + }) +} +export function getStructIvt(params) { + return request({ + url: '/api/checkoutbill/getStructIvt', + method: 'get', + params + }) +} +export function manualDiv(data) { + return request({ + url: '/api/checkoutbill/manualDiv', + method: 'post', + data + }) +} +export function confirm(data) { + return request({ + url: '/api/checkoutbill/confirm', + method: 'post', + data + }) +} +export function issueTask(data) { + return request({ + url: '/api/checkoutbill/issueTask', + method: 'post', + data + }) +} +export function finishTask(data) { + return request({ + url: '/api/checkoutbill/finishTask', + method: 'post', + data + }) +} +export function cancleTaskfinish(data) { + return request({ + url: '/api/checkoutbill/cancleTaskfinish', + method: 'post', + data + }) +} +export function paramByCodeType(data) { + return request({ + url: '/api/checkoutbill/paramByCodeType', + method: 'post', + data + }) +} +export function schAreaType(data) { + return request({ + url: '/api/checkoutbill/schAreaType', + method: 'post', + data + }) +} +export function backConfirm(data) { + return request({ + url: '/api/checkoutbill/backConfirm', + method: 'post', + data + }) +} +export function getType() { + return request({ + url: '/api/checkoutbill/getType', + method: 'get' + }) +} +export default { add, edit, del, allDiv, allCancel, getOutBillDtl, getOutBillDis, setPoint, getOutBillTask, getStructIvt, manualDiv, confirm, issueTask, finishTask, cancleTaskfinish, getInvTypes, paramByCodeType, schAreaType,backConfirm, getOutBillDisDtl, getType } diff --git a/lms/nladmin-ui/src/views/wms/st/outbill/index.vue b/lms/nladmin-ui/src/views/wms/st/outbill/index.vue index 3c4f931c7..14837f0dc 100644 --- a/lms/nladmin-ui/src/views/wms/st/outbill/index.vue +++ b/lms/nladmin-ui/src/views/wms/st/outbill/index.vue @@ -8,99 +8,102 @@ :inline="true" class="demo-form-inline" label-position="right" - label-width="90px" + label-width="80px" label-suffix=":" > - + - - - - - - - - - - + + + + + + + + + + - - + + @change="crud.toQuery" + > + + - - + + @change="crud.toQuery" + > + + - - - - - - - + @@ -111,341 +114,253 @@ type="success" icon="el-icon-position" size="mini" - :loading="loading" - :disabled="crud.selections.length !== 1" - @click="createTask" + :disabled="dis_flag" + @click="divOpen" > - 生成任务 + 分配 + + + 作业任务 + + + 强制确认 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + - - + + + + - - diff --git a/lms/nladmin-ui/src/views/wms/st/outbill/regionioOut.js b/lms/nladmin-ui/src/views/wms/st/outbill/regionioOut.js deleted file mode 100644 index 8b82168bb..000000000 --- a/lms/nladmin-ui/src/views/wms/st/outbill/regionioOut.js +++ /dev/null @@ -1,35 +0,0 @@ -import request from '@/utils/request' - -export function add(data) { - return request({ - url: 'api/regionioOut', - method: 'post', - data - }) -} - -export function del(ids) { - return request({ - url: 'api/regionioOut/', - method: 'delete', - data: ids - }) -} - -export function edit(data) { - return request({ - url: 'api/regionioOut', - method: 'put', - data - }) -} - -export function createTask(data) { - return request({ - url: 'api/regionioOut/createTask', - method: 'post', - data - }) -} - -export default { add, edit, del, createTask }