From 3a7d82273b1eadeb3ec53e3df42979d35352d63c Mon Sep 17 00:00:00 2001 From: "ZHOUZ\\Noble'lift" <1014987728@qq.com> Date: Mon, 21 Nov 2022 13:53:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/CustomerbaseServiceImpl.java | 3 - .../java/org/nl/wms/basedata/st/wql/stivt.xls | Bin 290816 -> 305152 bytes .../mes/service/impl/MesToLmsServiceImpl.java | 148 ++- .../sap/service/impl/SapToLmsServiceImpl.java | 2 + .../src/main/java/org/nl/wms/pdm/wql/pdm.xls | Bin 291840 -> 281600 bytes .../wms/st/instor/rest/ChangeController.java | 79 ++ .../wms/st/instor/service/ChangeService.java | 86 ++ .../service/impl/ChangeServiceImpl.java | 920 ++++++++++++++++++ .../nl/wms/st/instor/wql/QST_IVT_CHANGE.wql | 257 +++++ .../st/instor/wql/QST_IVT_HANDMOVESTOR.wql | 6 +- .../views/wms/st/inStor/change/AddDialog.vue | 522 ++++++++++ .../src/views/wms/st/inStor/change/AddDtl.vue | 196 ++++ .../src/views/wms/st/inStor/change/change.js | 68 ++ .../src/views/wms/st/inStor/change/index.vue | 308 ++++++ 14 files changed, 2558 insertions(+), 37 deletions(-) create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/instor/rest/ChangeController.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/ChangeService.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/ChangeServiceImpl.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/instor/wql/QST_IVT_CHANGE.wql create mode 100644 lms/nladmin-ui/src/views/wms/st/inStor/change/AddDialog.vue create mode 100644 lms/nladmin-ui/src/views/wms/st/inStor/change/AddDtl.vue create mode 100644 lms/nladmin-ui/src/views/wms/st/inStor/change/change.js create mode 100644 lms/nladmin-ui/src/views/wms/st/inStor/change/index.vue diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/CustomerbaseServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/CustomerbaseServiceImpl.java index 3336b46c0..36bae9b95 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/CustomerbaseServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/CustomerbaseServiceImpl.java @@ -92,9 +92,6 @@ public class CustomerbaseServiceImpl implements CustomerbaseService { String nickName = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); - ClassstandardDto classDto = classstandardService.findById(dto.getClass_id() + ""); - dto.setClass_code(classDto.getClass_code()); - dto.setClass_name(classDto.getClass_name()); dto.setCust_id(IdUtil.getSnowflake(1, 1).nextId()); dto.setCreate_id(currentUserId); dto.setCreate_name(nickName); 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 ee3083c1d1bc8e68f3b4efb20d58cece0210e2e0..9219cebd53cf4311aed6dd308085794293075f3e 100644 GIT binary patch delta 29653 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≫bA5v5*a-nT#?bP){LHQQXZjNjPp>+(6M}}hZ5;9QOdXyw;81s+!OUw z+`J}fprrshovM0IWbjxXYjZ}DVw6xz|a#^4f^HWfRW!gP=mV=J!@U*qSuwJWD)Lz<0)=w@zB-6w!q+L zepB>2$M|-qf!G2h6?aL_0mNsy24V-0WArY1!h3urAU{g)?JOWXpc?9z^y(lJpHf2ViQ6EPAM(Xz9Mia0|Lba5R- zR73%C4j|6?8i=TTztih%#tG`CK#K>|d@r)1vT^BwsB8!Dus@|HyxyQGi^}#py}{=T z9jn()x@r!U75Eq1Cs-CniGF8O?S0KXU0~Oq5|41V zASG3QzEBp#apb7xKv~^^veJP?e0~sO_cK2jr1(2!usX+QTwi4)LT?~~Va$hb6F$0z0v1R2{g2!g;59zh#LYNC3<0}oeGISo$*Sw%MwwFJ7 z*>EM;_)z0jk-XcyW4L1Sv8G!UJ>9BU(oGk(BbVtTK3gC>)`(Rl!V_NbK0;L;p=uF? zsz`o;P&NVx*7f281gsa{F+vuTNfC<4;VRI@G1o_KYWpG-H+_Xvlj1k{9f<4os+zv4 zs%fjruMU=mHL0sZ=OO)DbGbUgb`__|;dPWMMp5xZ@vjbqYxF5!TSp0QYJDhH1A33> zGl+ehaltkbaM}qM;@V+DnpF>D2K84`77Y#^#e2OFS-~~%s z9I1^@f#3vz)&QIYAY_qYkPZbU0&N6Zfe?#N4bT@@K|l(Tv_NPJOR*%*4WtBos4W#j zB}BZrQHoO6!xDvX^NzvFx!@*!@a*ABa+<8f^DObs$V)>*d{fDQ{SWDRpf|-6h!5!( zLGKQ_`PxdQlFg}5*ucPW-`F@3k`P-vJT^4UJ~ZC^tg69Sa>jb4d7wDT zRYxkAaCzYJ#8n=bpqEAKg{z#_uYk4&AF*C3A5jJ${czR9RSTE+t%g6YAY1{s#4j>} zaS50Zw4u1dM1NgpAG)cIp?^&qZ*=dNhol-t+9-&T`Q2BB9LEw4hPL=SvCOp8)c$+k znuiZCw5R;eK*KSk_*)Kf{!x(ixa}eT_ns*k&gSQX42Knbb0y{-!wjJg|0TzRMj2|j zG?UX;8(Gj56B>q}B=jC-NH8`0kWAjatIa&r98XXF+bDyNOQR13c$v|LIxdYrB6k<$ zq>sq!MjK*WntViNV?b{D5xLbEfFyrJo;$|Sl203JXvj0h8Y)l8u(uJXw-nxYtf3Mj z!K;BaC1Wu4kQ8h~f ze694E6V8;cG|#Q!n1H_iZY$~@w$eo#jv?p5Y5esb9YSnrE%TCbhF#Rl@?SAsq@Xcg961BUf 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 f153ea117..cd5793af9 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 @@ -19,14 +19,11 @@ import org.nl.wms.ext.mes.service.MesToLmsService; import org.nl.wms.log.LokiLog; import org.nl.wms.log.LokiLogType; import org.nl.wms.pda.mps.service.OutService; +import org.nl.wms.pda.mps.service.impl.BakingServiceImpl; import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.tasks.CoolCutTask; import org.nl.wms.st.inbill.service.CheckOutBillService; -import org.nl.wms.pda.mps.service.impl.BakingServiceImpl; import org.springframework.stereotype.Service; -import sun.security.krb5.internal.crypto.Des; - -import java.util.HashMap; @Service @RequiredArgsConstructor @@ -224,7 +221,7 @@ public class MesToLmsServiceImpl implements MesToLmsService { result.put("RTDAT", null); } catch (Exception e) { result.put("RTYPE", "1"); - result.put("RTMSG", "操作失败!"+e.getMessage()); + result.put("RTMSG", "操作失败!" + e.getMessage()); result.put("RTOAL", 1); result.put("RTDAT", null); } @@ -308,7 +305,7 @@ public class MesToLmsServiceImpl implements MesToLmsService { result.put("RTDAT", null); } catch (Exception e) { result.put("RTYPE", "1"); - result.put("RTMSG", "操作失败!"+e.getMessage()); + result.put("RTMSG", "操作失败!" + e.getMessage()); result.put("RTOAL", 1); result.put("RTDAT", null); } @@ -549,7 +546,7 @@ public class MesToLmsServiceImpl implements MesToLmsService { String restruct_container_name = plan_jo.getString("restruct_container_name"); //查询该包装关系 - JSONObject sub_jo = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("container_name = '"+restruct_container_name+"'").uniqueResult(0); + JSONObject sub_jo = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("container_name = '" + restruct_container_name + "'").uniqueResult(0); JSONObject struct = WQLObject.getWQLObject("st_ivt_structattr").query("storagevehicle_code = '" + package_box_sn + "'").uniqueResult(0); if (ObjectUtil.isEmpty(struct)) { throw new BadRequestException("该箱子已出库,不在库内!"); @@ -572,21 +569,21 @@ public class MesToLmsServiceImpl implements MesToLmsService { JSONObject dtl = new JSONObject(); //查询该物料 JSONObject mater_jo = WQLObject.getWQLObject("md_me_materialbase").query("material_code = '" + sub_jo.getString("product_name") + "'").uniqueResult(0); - dtl.put("material_id",mater_jo.getString("material_id")); - dtl.put("pcsn",plan_jo.getString("restruct_container_name")); - dtl.put("box_no",package_box_sn); - JSONObject unit = WQLObject.getWQLObject("md_pb_measureunit").query("measure_unit_id = '"+mater_jo.getString("base_unit_id")+"'").uniqueResult(0); - dtl.put("qty_unit_id",unit.getString("measure_unit_id")); - dtl.put("qty_unit_name",unit.getString("unit_name")); - dtl.put("plan_qty",sub_jo.getString("net_weight")); + dtl.put("material_id", mater_jo.getString("material_id")); + dtl.put("pcsn", plan_jo.getString("restruct_container_name")); + dtl.put("box_no", package_box_sn); + JSONObject unit = WQLObject.getWQLObject("md_pb_measureunit").query("measure_unit_id = '" + mater_jo.getString("base_unit_id") + "'").uniqueResult(0); + dtl.put("qty_unit_id", unit.getString("measure_unit_id")); + dtl.put("qty_unit_name", unit.getString("unit_name")); + dtl.put("plan_qty", sub_jo.getString("net_weight")); rows.add(dtl); - mst_jo.put("tableData",rows); - mst_jo.put("user","mes"); + mst_jo.put("tableData", rows); + mst_jo.put("user", "mes"); String iostorinv_id = checkOutBillService.insertDtl(mst_jo); //调用自动分配 JSONObject out_jo = new JSONObject(); - out_jo.put("iostorinv_id",iostorinv_id); + out_jo.put("iostorinv_id", iostorinv_id); checkOutBillService.allDiv(out_jo); } @@ -622,19 +619,19 @@ public class MesToLmsServiceImpl implements MesToLmsService { if (StrUtil.equals(is_mesTolms, "1")) { String Status = param.getJSONObject(0).getString("Status"); - if (Status.equals("1")){ + if (Status.equals("1")) { //更新分切计划表状态 for (int i = 0; i < param.size(); i++) { JSONObject row = param.getJSONObject(i); - JSONObject plan_jo = WQLObject.getWQLObject("pdm_bi_slittingproductionplan").query("container_name = '"+row.getString("ContainerGroup")+"'").uniqueResult(0); - plan_jo.put("status","05"); + JSONObject plan_jo = WQLObject.getWQLObject("pdm_bi_slittingproductionplan").query("container_name = '" + row.getString("ContainerGroup") + "'").uniqueResult(0); + plan_jo.put("status", "05"); WQLObject.getWQLObject("pdm_bi_slittingproductionplan").update(plan_jo); } } - if (Status.equals("2")){ + if (Status.equals("2")) { String ResourceName = param.getJSONObject(0).getString("ResourceName"); - JSONObject cut_jo = WQLObject.getWQLObject("ST_IVT_CutPointIvt").query("ext_code = '"+ResourceName+"'").uniqueResult(0); + JSONObject cut_jo = WQLObject.getWQLObject("ST_IVT_CutPointIvt").query("ext_code = '" + ResourceName + "'").uniqueResult(0); String up_point_code = cut_jo.getString("up_point_code"); String down_point_code = cut_jo.getString("down_point_code"); @@ -643,27 +640,27 @@ public class MesToLmsServiceImpl implements MesToLmsService { for (int i = 0; i < param.size(); i++) { JSONObject row = param.getJSONObject(i); //查询对应的分切计划 - JSONObject plan_jo = WQLObject.getWQLObject("pdm_bi_slittingproductionplan").query("container_name = '"+row.getString("ContainerGroup")+"'").uniqueResult(0); - if (row.getString("ContainerPosition").equals("1")){ + JSONObject plan_jo = WQLObject.getWQLObject("pdm_bi_slittingproductionplan").query("container_name = '" + row.getString("ContainerGroup") + "'").uniqueResult(0); + if (row.getString("ContainerPosition").equals("1")) { up_rows.add(plan_jo); } - if (row.getString("ContainerPosition").equals("2")){ + if (row.getString("ContainerPosition").equals("2")) { down_rows.add(plan_jo); } } - if (up_rows.size()>0){ + if (up_rows.size() > 0) { JSONObject jo = new JSONObject(); - jo.put("point_code",up_point_code); - jo.put("cut_rows",up_rows); - jo.put("is_last","0"); + jo.put("point_code", up_point_code); + jo.put("cut_rows", up_rows); + jo.put("is_last", "0"); outService.confirm(jo); } - if (down_rows.size()>0){ + if (down_rows.size() > 0) { JSONObject jo = new JSONObject(); - jo.put("point_code",down_point_code); - jo.put("cut_rows",down_rows); - jo.put("is_last","0"); + jo.put("point_code", down_point_code); + jo.put("cut_rows", down_rows); + jo.put("is_last", "0"); outService.confirm(jo); } } @@ -775,7 +772,92 @@ public class MesToLmsServiceImpl implements MesToLmsService { log.info("inventoryTransferInfoSync接口输入参数为:-------------------" + param.toString()); String is_mesTolms = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("is_mesTolms").getValue(); if (StrUtil.equals(is_mesTolms, "1")) { + try { + JSONArray rows = param.getJSONArray("item"); + String SaleOrderItem = param.getString("SaleOrderItem"); + String CustomerName = param.getString("CustomerName"); + String DemandDate = param.getString("DemandDate"); + double total_qty = 0; + double detail_count = 0; + String changeinv_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + if (rows.size() == 0) { + throw new BadRequestException("item长度不能为0!"); + } + for (int i = 0; i < rows.size(); i++) { + JSONObject row = rows.getJSONObject(i); + String PackageBoxSN = row.getString("PackageBoxSN"); + String isRePrintPackageBoxLabel = row.getString("isRePrintPackageBoxLabel"); + String isUnPackBox = row.getString("isUnPackBox"); + String UpdatedDateOfProduction = row.getString("UpdatedDateOfProduction"); + //查询该木箱内子卷数量 + JSONArray container_rows = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '" + PackageBoxSN + "'").getResultJSONArray(0); + for (int j = 0; j < container_rows.size(); j++) { + JSONObject container_row = container_rows.getJSONObject(j); + JSONObject change_jo = new JSONObject(); + change_jo.put("changeinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + ""); + change_jo.put("changeinv_id", changeinv_id); + change_jo.put("seq_no", detail_count + 1); + JSONObject mater_jo = WQLObject.getWQLObject("md_me_materialbase").query("material_code = '" + container_row.getString("product_name") + "'").uniqueResult(0); + change_jo.put("material_id", mater_jo.getString("material_id")); + change_jo.put("pcsn", container_row.getString("container_name")); + change_jo.put("package_box_sn", container_row.getString("package_box_sn")); + change_jo.put("mfg_order_name", SaleOrderItem); + change_jo.put("demand_date", DemandDate); + change_jo.put("customer_name", CustomerName); + //查询对应的客户 + JSONObject customer_jo = WQLObject.getWQLObject("md_cs_customerbase").query("cust_code = '" + CustomerName + "'").uniqueResult(0); + change_jo.put("customer_description", customer_jo.getString("cust_name")); + change_jo.put("isRePrintPackageBoxLabel", isRePrintPackageBoxLabel); + change_jo.put("isUnPackBox", isUnPackBox); + change_jo.put("UpdatedDateOfProduction", UpdatedDateOfProduction); + JSONObject unit = WQLObject.getWQLObject("md_pb_measureunit").query("measure_unit_id = '" + mater_jo.getString("base_unit_id") + "'").uniqueResult(0); + change_jo.put("qty_unit_id", mater_jo.getString("base_unit_id")); + change_jo.put("qty_unit_name", unit.getString("unit_name")); + change_jo.put("qty", container_row.getString("net_weight")); + WQLObject.getWQLObject("ST_IVT_StructIvtChangeDtl").insert(change_jo); + total_qty += container_row.getDoubleValue("net_weight"); + detail_count += 1; + } + } + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + JSONObject mst_jo = new JSONObject(); + mst_jo.put("changeinv_id",changeinv_id); + mst_jo.put("bill_code",CodeUtil.getNewCode("CHANGE_CODE")); + mst_jo.put("buss_type","2001"); + mst_jo.put("bill_type","2001"); + mst_jo.put("biz_date", DateUtil.today()); + JSONObject stor = WQLObject.getWQLObject("st_ivt_bsrealstorattr").query("is_delete = '0' AND is_used = '1' AND is_productstore = '1'").uniqueResult(0); + mst_jo.put("stor_id", stor.getString("stor_id")); + mst_jo.put("stor_code", stor.getString("stor_code")); + mst_jo.put("stor_name", stor.getString("stor_name")); + mst_jo.put("total_qty", total_qty); + mst_jo.put("detail_count", detail_count); + mst_jo.put("bill_status", "10"); + mst_jo.put("create_mode", "03"); + mst_jo.put("input_optid", currentUserId + ""); + mst_jo.put("input_optname", nickName); + mst_jo.put("input_time", now); + mst_jo.put("update_optid", currentUserId + ""); + mst_jo.put("update_optname", nickName); + mst_jo.put("update_time", now); + mst_jo.put("is_delete", "0"); + mst_jo.put("is_upload", "0"); + Long deptId = SecurityUtils.getDeptId(); + mst_jo.put("sysdeptid", deptId + ""); + mst_jo.put("syscompanyid", deptId + ""); + WQLObject.getWQLObject("ST_IVT_StructIvtChange").insert(mst_jo); + + } catch (Exception e) { + JSONObject result = new JSONObject(); + result.put("RTYPE", "E"); + result.put("RTMSG", "操作失败!," + e.getMessage()); + result.put("RTDAT", null); + System.out.println(result); + return result; + } } JSONObject result = new JSONObject(); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/SapToLmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/SapToLmsServiceImpl.java index c3f2e82f0..cc16442bd 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/SapToLmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/sap/service/impl/SapToLmsServiceImpl.java @@ -166,6 +166,8 @@ public class SapToLmsServiceImpl implements SapToLmsService { sub_jo.put("create_time", 0); sub_jo.put("status", "0"); sub_jo.put("sap_pcsn", sap_pcsn); + sub_jo.put("vbeln", json.getString("VBELN")); + sub_jo.put("posnr", json.getString("POSNR")); WQLObject.getWQLObject("PDM_BI_SubPackageRelation").insert(sub_jo); } else { //不为空修改子卷包装关系 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 e34efe93eeee3e1602fa4229aa7df1e7effb1b2b..fb101b29b9e791e8cc30843c1a8e046645df8032 100644 GIT binary patch delta 21841 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�TfD}@x!mHIC=iob^HUwCxa`B2(-EZM;P{)Z4 z>Wr{K9n3YTW4H!&xYnQ!q8ik(Qv)l3A`D7pkVxfBDuUGNPU;hCGYC?E6FllpDufc$ z{i2%^jJExROx$N^D4+SlP|@K2tzHsKZS~5*`wgKy&^mp;VU@tImWCWMBy+PIf5_0I zskUcD#;ua7P2YA~h^Y5WX((}!{PK_?9+51E4Zbq$u)&Y}$@s%Is1u$(K5S^ystdY6 z9Qez`J_yyHyC8heRE&G|HV);0_ABchF|5ar{yh2(UfnD`YIsHF95n>;77DNe7|rpn zhJR_8g7-V)j~T{G^KopxU;5JEf%7SUerb4)hs)_-8GhyMWbW67jv|`L(_a~a<({t% z6+D)bvC6LBAW0Se0Y65Zc*1aw*O$${HGGQ~DtEs%JiUf}5k_0*aJ43WdX<5GcogqF*?`J3%hBc)>ZFekEFDd`t(5yzSlp_~a zE7nfm8(uVYAx?pM#c2>m0?_xT^kpr5l}g`A(~nos7p3$mG<^n0zbH$5D%zea82L>;ez1IaN%&laLwSF!-c@LfD45SgKGpwKYKt)w}DT; zT+kLS0xlAcej*?mu00%mYfm54`qccw>^FnhoP;Uj9a^6#;OceRinC%dOTy& zsIj?Od6{9i(wWcwI33c+qJQ!c6?4wI^bbQDzVenq;5DL)tjrKj((jUF;m;e7| z3=Z#veJna*J`i8bXW_31Up-MlyFO6RJU3%73i>KaW-n;0v=Uk=Pr4aH98ec`V_5ir z^EH!>RY}taRgR|_qvUXRmGsl@#vbzu{pB4Gqqls*!#HbRp;0Dz8WZsG2^~EiB0qIE zn&%ZZu0#FBR+A-)*50!H*R2Od&hC^&2RwG(oX{bJ==6TUr~RqCS95M8%yKRJ=<2w) z5^Q+L^K<^#pT9PBU7~g8Ql}xG*zk9UdA^tZO>EK!KaLpbn)oe^0V z`}X9mF<(7&)`qt`u(QMZ5Wo23tq*-S_|%c{=WK*jmmlkVaNL+Ox6f0FMGFcp+HmsI zP=I1p`LFR;nG+97wDziFwDOgI8^jiGBmRTfDcQltm;!}A$4qzyLk2aY-3}Ywl8awb zz!4x;0M1avHp**_jlTF@`R#tjJ-m_gj3`Q4yGT~LoP;~`iIXcD8bf5Mzj3H`@DKt7 z%7n(oAgmqbCykA5WmJ&SkBk>xWXvFdyzOu7Z=us}xZKC#X2waR6x{nkgd+IK_%(@K z2v-Cb24S;sU^NS(5-kcY1w!L+4MLOIG`Rk3G=2k7s2`qMGdVH9xHPQh7oZdym!amDqOwCHW3PcY z@yd|IK&5=0RlNtLI77N6cWB$aZ{Irf0E1tfa?_z)oNTjSM}&N*vC(WX)N68VZnw*a ze3p9R!}fG>Lr=t=ctat7B5E)b{vfEOP!+!y5Hpk*3UR1Bp%9GfnA(V48HgRuT4>qT zF$ny;ii>li!;t}Cmf8_iu zEp^;r#BX}I;A)ChyX}h90`9cd(Ar2=jkb}D>Y`6P2cbY(+jtmNn2M*dDEcV09IYi$ zydtQC6qE&5sM=5=!+EYrAWTy_`uCopwUB|xjQUn8v`reNR+EVaSYUq|1WGq07SZwT z0A231+)c)>5tFdga0?+^CYxkIM5?OVrLze~nf!ktoSC&T+diyu$FfN;Pt9IH$60Z? zkCgX9XQ)p1kp!vWLIfXGymfHZ^v0OQ`uzD{Y;{OcNVi73$7X zY4&wZZ93F+Sf1rFi%GlB{`_F;$ohV~l5irC0E%_k0 z#29I6Dm%ttp2cJiJ%VjfjB%QwU}}`~jWvegcMCej8ebx|&tr|@R1|qL7V#OghO{?M z;KmEHFT2V^9gJq{mJY@knu=R5cQksKc&PPuSL0;fKRP)&DJdp87Oq=TbaaZN3-)yD zp4P2Pa7+}4-J+Agpd9cXNq}Qw+ILHiiB4)4(;+FET(>yuhY7~#xHX}h@hjn49Ai@d RlGRY^V`^qiNH$hD{XeS{5sLr- diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/rest/ChangeController.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/rest/ChangeController.java new file mode 100644 index 000000000..059a83a9a --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/rest/ChangeController.java @@ -0,0 +1,79 @@ +package org.nl.wms.st.instor.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.instor.service.ChangeService; +import org.nl.wms.st.instor.service.HandMoveStorService; +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/change") +@Slf4j +public class ChangeController { + private final ChangeService changeService; + + @GetMapping + @Log("查询库存变更单") + @ApiOperation("查询库存变更单") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(changeService.pageQuery(whereJson, page), HttpStatus.OK); + } + + @GetMapping("/getOutBillDtl") + @Log("查询移库单") + @ApiOperation("查询移库单") + public ResponseEntity getOutBillDtl(@RequestParam Map whereJson) { + return new ResponseEntity<>(changeService.getOutBillDtl(whereJson), HttpStatus.OK); + } + + @Log("删除移库单") + @ApiOperation("删除移库单") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + changeService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @PutMapping + @Log("修改移库单") + @ApiOperation("修改移库单") + public ResponseEntity update(@RequestBody Map whereJson) { + changeService.update(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping() + @Log("新增移库单") + @ApiOperation("新增移库单") + public ResponseEntity insertDtl(@RequestBody Map whereJson) { + changeService.insertDtl(whereJson); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @GetMapping("/getStructIvt") + @Log("查询可分配库存") + @ApiOperation("查询可分配库存") + public ResponseEntity getStructIvt(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(changeService.getStructIvt(whereJson, page), HttpStatus.OK); + } + + @PostMapping("/confirm") + @Log("移库单强制确认") + @ApiOperation("移库单强制确认") + public ResponseEntity confirm(@RequestBody JSONObject whereJson) { + changeService.confirm(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/ChangeService.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/ChangeService.java new file mode 100644 index 000000000..9763d0422 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/ChangeService.java @@ -0,0 +1,86 @@ +package org.nl.wms.st.instor.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.springframework.data.domain.Pageable; + +import java.util.Map; + +public interface ChangeService { + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map pageQuery(Map whereJson, Pageable page); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Long[] ids); + /** + * 新增出库单 + * @param whereJson / + */ + void insertDtl (Map whereJson); + /** + * 新增出库单2 + * @param whereJson / + */ + String insertDtl2 (JSONObject whereJson); + /** + * 查询出库单明细 + * @param whereJson / + * @return + */ + JSONArray getOutBillDtl(Map whereJson); + /** + * 修改出库单 + * @param whereJson / + */ + void update(Map whereJson); + /** + * 全部取消 + * @param whereJson / + */ + void allCancel(JSONObject whereJson); + /** + * 查询可分配库存 + * @param whereJson / + * @return + */ + Map getStructIvt(Map whereJson, Pageable page); + /** + * 出库单强制确认 + * @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 whereJson / + */ + void handdown(JSONObject whereJson); +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/ChangeServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/ChangeServiceImpl.java new file mode 100644 index 000000000..3b130699f --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/service/impl/ChangeServiceImpl.java @@ -0,0 +1,920 @@ +package org.nl.wms.st.instor.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +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.st.inbill.service.StorPublicService; +import org.nl.wms.st.instor.service.ChangeService; +import org.nl.wms.st.instor.service.HandMoveStorService; +import org.nl.wms.st.instor.task.HandMoveStorAcsTask; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +/** + * PC端出入库新增 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class ChangeServiceImpl implements ChangeService { + private final 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("material_code"))) { + map.put("material_code", "%" + map.get("material_code") + "%"); + } + if (StrUtil.isNotEmpty(map.get("buss_type"))) { + map.put("buss_type", whereJson.get("buss_type") + "%"); + } + JSONObject jo = WQL.getWO("QST_IVT_CHANGE").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "bill_code desc"); + return jo; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + for (Long moveinv_id : ids) { + this.deleteById(moveinv_id + ""); + } + } + + /** + * 通过moveinv_id删除明细,还原库存等操作 + * + * @param moveinv_id + */ + void deleteById(String moveinv_id) { + //明细表 + WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_MoveInvDtl"); + //主表 + WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_MoveInv"); + //任务表 + WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + HashMap map = new HashMap<>(); + map.put("is_delete", "1"); + map.put("update_optid", currentUserId + ""); + map.put("update_optname", nickName); + map.put("update_time", now); + JSONObject jo_mst = wo_mst.query("moveinv_id='" + moveinv_id + "'").uniqueResult(0); + JSONArray ja = wo_dtl.query("moveinv_id='" + moveinv_id + "'").getResultJSONArray(0); + for (int i = 0; i < ja.size(); i++) { + JSONObject jo = ja.getJSONObject(i); + //删除任务 + HashMap task_map = new HashMap<>(); + task_map.put("is_delete", "1"); + wo_Task.update(task_map, "task_id='" + jo.getString("task_id") + "'"); + //解锁起点点位、仓位 + JSONObject from_start = new JSONObject(); + from_start.put("lock_type", "1"); + from_start.put("struct_id", jo.getString("turnout_struct_id")); + storPublicService.updateStructAndPoint(from_start); + //解锁终点点位、仓位 + from_start.put("struct_id", jo.getString("turnin_struct_id")); + storPublicService.updateStructAndPoint(from_start); + + //更新移出库存 + jo.put("struct_id", jo.getString("turnout_struct_id")); + jo.put("change_qty", jo.getDoubleValue("qty")); + jo.put("bill_type_scode", jo_mst.getString("bill_type")); + jo.put("inv_id", jo.getString("moveinvdtl_id")); + jo.put("bill_code", jo_mst.getString("bill_code")); + jo.put("bill_table", "ST_IVT_MoveInv"); + storPublicService.IOStor(jo, "12"); + //更新移入库存 + jo.put("struct_id", jo.getString("turnin_struct_id")); + jo.put("bill_type_scode", jo_mst.getString("bill_type")); + jo.put("inv_id", jo.getString("moveinvdtl_id")); + jo.put("bill_code", jo_mst.getString("bill_code")); + jo.put("bill_table", "ST_IVT_MoveInv"); + storPublicService.IOStor(jo, "32"); + //删除明细 + wo_dtl.delete("moveinvdtl_id='" + jo.getString("moveinvdtl_id") + "'"); + } + //更新主表 + wo_mst.update(map, "moveinv_id='" + moveinv_id + "'"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void insertDtl(Map map) { + //主表 + WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_MoveInv"); + ArrayList rows = (ArrayList) map.get("tableData"); + map.remove("tableData"); + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + String changeinv_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + JSONObject mst_jo = new JSONObject(); + mst_jo.put("changeinv_id", changeinv_id); + mst_jo.put("bill_code", CodeUtil.getNewCode("CHANGE_CODE")); + mst_jo.put("buss_type", "2002"); + mst_jo.put("bill_type", "2002"); + mst_jo.put("biz_date", DateUtil.today()); + JSONObject stor = WQLObject.getWQLObject("st_ivt_bsrealstorattr").query("is_delete = '0' AND is_used = '1' AND is_productstore = '1'").uniqueResult(0); + mst_jo.put("stor_id", stor.getString("stor_id")); + mst_jo.put("stor_code", stor.getString("stor_code")); + mst_jo.put("stor_name", stor.getString("stor_name")); + mst_jo.put("bill_status", "10"); + mst_jo.put("create_mode", "03"); + mst_jo.put("input_optid", currentUserId + ""); + mst_jo.put("input_optname", nickName); + mst_jo.put("input_time", now); + mst_jo.put("update_optid", currentUserId + ""); + mst_jo.put("update_optname", nickName); + mst_jo.put("update_time", now); + mst_jo.put("is_delete", "0"); + mst_jo.put("is_upload", "0"); + Long deptId = SecurityUtils.getDeptId(); + mst_jo.put("sysdeptid", deptId + ""); + mst_jo.put("syscompanyid", deptId + ""); + //调用明细处理方法 + JSONObject ret = this.insertDtlByRows(mst_jo, rows); + mst_jo.put("detail_count", ret.getString("detail_count")); + mst_jo.put("total_qty", ret.getString("total_qty")); + WQLObject.getWQLObject("ST_IVT_StructIvtChange").insert(mst_jo); + } + + /** + * 根据传进来的载具物料明细,查询载具所有库存记录,并生成移库明细 + * + * @param rows + */ + @Transactional(rollbackFor = Exception.class) + JSONObject insertDtlByRows(JSONObject jo_mst, ArrayList rows) { + //定义返回数据 + JSONObject ret = new JSONObject(); + double total_qty = 0; + double detail_count = 0; + //定义需要需要插入的库存集合 + for (int j = 0; j < rows.size(); j++) { + HashMap row = rows.get(j); + String SaleOrderItem = (String) row.get("new_sale_order_name"); + String DemandDate = (String) row.get("demand_date"); + String CustomerName = (String) row.get("new_customer_name"); + String isRePrintPackageBoxLabel = (String) row.get("isRePrintPackageBoxLabel"); + String isUnPackBox = (String) row.get("isUnPackBox"); + String UpdatedDateOfProduction = (String) row.get("date_of_FG_inbound"); + //查询该木箱内子卷数量 + JSONArray container_rows = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '" + row.get("storagevehicle_code") + "'").getResultJSONArray(0); + for (int i = 0; i < container_rows.size(); i++) { + JSONObject container_row = container_rows.getJSONObject(i); + JSONObject change_jo = new JSONObject(); + change_jo.put("changeinvdtl_id", IdUtil.getSnowflake(1, 1).nextId() + ""); + change_jo.put("changeinv_id", jo_mst.getString("changeinv_id")); + change_jo.put("seq_no", detail_count + 1); + JSONObject mater_jo = WQLObject.getWQLObject("md_me_materialbase").query("material_code = '" + container_row.getString("product_name") + "'").uniqueResult(0); + change_jo.put("material_id", mater_jo.getString("material_id")); + change_jo.put("pcsn", container_row.getString("container_name")); + change_jo.put("package_box_sn", container_row.getString("package_box_sn")); + change_jo.put("mfg_order_name", SaleOrderItem); + change_jo.put("demand_date", DemandDate); + change_jo.put("customer_name", CustomerName); + //查询对应的客户 + JSONObject customer_jo = WQLObject.getWQLObject("md_cs_customerbase").query("cust_code = '" + CustomerName + "'").uniqueResult(0); + change_jo.put("customer_description", customer_jo.getString("cust_name")); + change_jo.put("isRePrintPackageBoxLabel", isRePrintPackageBoxLabel); + change_jo.put("isUnPackBox", isUnPackBox); + change_jo.put("UpdatedDateOfProduction", UpdatedDateOfProduction); + JSONObject unit = WQLObject.getWQLObject("md_pb_measureunit").query("measure_unit_id = '" + mater_jo.getString("base_unit_id") + "'").uniqueResult(0); + change_jo.put("qty_unit_id", mater_jo.getString("base_unit_id")); + change_jo.put("qty_unit_name", unit.getString("unit_name")); + change_jo.put("qty", container_row.getString("net_weight")); + WQLObject.getWQLObject("ST_IVT_StructIvtChangeDtl").insert(change_jo); + total_qty += container_row.getDoubleValue("net_weight"); + detail_count += 1; + } + } + + ret.put("total_qty", total_qty); + ret.put("detail_count", detail_count); + return ret; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String insertDtl2(JSONObject json) { + //主表 + WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_MoveInv"); + JSONArray rows = json.getJSONArray("tableData"); + json.remove("tableData"); + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + String moveinv_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + String bill_code = CodeUtil.getNewCode("MOVE_CODE"); + json.put("moveinv_id", moveinv_id); + json.put("bill_code", bill_code); + json.put("buss_type", ""); + json.put("create_mode", "01"); + json.put("input_optid", currentUserId + ""); + json.put("input_optname", nickName); + json.put("input_time", now); + json.put("update_optid", currentUserId + ""); + json.put("update_optname", nickName); + json.put("update_time", now); + json.put("is_delete", "0"); + json.put("is_upload", "0"); + Long deptId = SecurityUtils.getDeptId(); + json.put("sysdeptid", deptId); + json.put("syscompanyid", deptId); + //调用明细处理方法 + JSONObject ret = this.insertDtlByRows2(json, rows); + json.put("detail_count", ret.getString("detail_count")); + json.put("total_qty", ret.getString("total_qty")); + wo_mst.insert(json); + return moveinv_id; + } + + @Transactional(rollbackFor = Exception.class) + JSONObject insertDtlByRows2(JSONObject jo_mst, JSONArray rows) { + //明细表 + WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_MoveInvDtl"); + //主表 + WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_MoveInv"); + //任务表 + WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); + //点位表 + WQLObject wo_Point = WQLObject.getWQLObject("SCH_BASE_Point"); + //定义返回数据 + JSONObject ret = new JSONObject(); + + String is_task = jo_mst.getString("is_task"); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + //定义需要需要插入的库存集合 + HashMap Struct_map = new HashMap(); + StringBuffer ids = new StringBuffer(); + for (int i = 0; i < rows.size(); i++) { + JSONObject row = rows.getJSONObject(i); + String storagevehicle_code = row.getString("storagevehicle_code"); + ids.append("'"); + if (!Struct_map.containsKey(storagevehicle_code)) { + Struct_map.put(storagevehicle_code, row); + } + if (i != 0) { + ids.append("','"); + } + ids.append(storagevehicle_code); + } + ids.append("'"); + //查询所有载具的库存 + JSONArray ja = WQL.getWO("QST_IVT_HANDMOVESTOR") + .addParam("flag", "33") + .addParam("ids", ids.toString()) + .process().getResultJSONArray(0); + if (ja.size() == 0) { + throw new BadRequestException("当前所有载具无可移库库存!"); + } + double total_qty = 0; + for (int i = 0; i < ja.size(); i++) { + JSONObject jo = ja.getJSONObject(i); + String moveinvdtl_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + total_qty = total_qty + jo.getDoubleValue("qty"); + jo.put("moveinvdtl_id", moveinvdtl_id); + jo.put("moveinv_id", jo_mst.getString("moveinv_id")); + jo.put("seq_no", (i + 1) + ""); + jo.put("work_status", "01"); + jo.put("is_issued", "0"); + JSONObject row = (JSONObject) Struct_map.get(jo.getString("storagevehicle_code")); + String turnin_struct_id = row.getString("turnin_struct_id"); + jo.put("turnin_sect_id", row.getString("turnin_sect_id")); + jo.put("turnin_sect_code", row.getString("turnin_sect_code")); + jo.put("turnin_sect_name", row.getString("turnin_sect_name")); + jo.put("turnin_struct_id", turnin_struct_id); + jo.put("turnin_struct_code", row.getString("turnin_struct_code")); + jo.put("turnin_struct_name", row.getString("turnin_struct_name")); + //查询移入点位 + JSONObject point = wo_Point.query("source_id='" + turnin_struct_id + "'").uniqueResult(0); + if (point == null) { + throw new BadRequestException(row.getString("turnin_struct_code") + "仓位数据异常,找不到对应点位!"); + } + //判断是否已生成过了任务,无未生成则插入任务 + JSONObject task = wo_Task.query("is_delete = '0' and task_status='04' and point_code1 ='" + jo.getString("start_point_code") + "'").uniqueResult(0); + if (task != null || is_task.equals("0")) { + jo.put("task_id", task.getString("task_id")); + } else { + task = new JSONObject(); + String 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", "05"); + task.put("taskdtl_type", "07"); + task.put("task_status", "01"); + task.put("start_point_code", jo.getString("start_point_code")); + task.put("next_point_code", point.getString("point_code")); + task.put("vehicle_code", jo.getString("storagevehicle_code")); + task.put("handle_class", HandMoveStorAcsTask.class.getName()); + task.put("finished_type", ""); + task.put("is_delete", "0"); + task.put("create_id", currentUserId); + task.put("create_name", nickName); + task.put("create_time", now); + task.put("update_optid", currentUserId); + task.put("update_optname", nickName); + task.put("update_time", now); + task.put("priority", "1"); + wo_Task.insert(task); + jo.put("task_id", task_id); + } + //插入明细表 + wo_dtl.insert(jo); + + //更新移出库存 + jo.put("struct_id", jo.getString("turnout_struct_id")); + jo.put("change_qty", jo.getDoubleValue("qty")); + jo.put("bill_type_scode", jo_mst.getString("bill_type")); + jo.put("inv_id", moveinvdtl_id); + jo.put("bill_code", jo_mst.getString("bill_code")); + jo.put("bill_table", "ST_IVT_MoveInv"); + storPublicService.IOStor(jo, "11"); + //更新移入库存 + jo.put("struct_id", turnin_struct_id); + jo.put("bill_type_scode", jo_mst.getString("bill_type")); + jo.put("inv_id", moveinvdtl_id); + jo.put("bill_code", jo_mst.getString("bill_code")); + jo.put("bill_table", "ST_IVT_MoveInv"); + storPublicService.IOStor(jo, "31"); + //锁定起点点位、仓位 + JSONObject from_start = new JSONObject(); + from_start.put("lock_type", "03"); + from_start.put("struct_id", jo.getString("turnout_struct_id")); + from_start.put("inv_type", jo_mst.getString("bill_type")); + from_start.put("inv_id", jo_mst.getString("moveinv_id")); + from_start.put("inv_code", jo_mst.getString("bill_code")); + from_start.put("taskdtl_type", task.getString("taskdtl_type")); + from_start.put("taskdtl_id", task.getString("taskdtl_id")); + from_start.put("task_code", task.getString("task_code")); + storPublicService.updateStructAndPoint(from_start); + //锁定终点点位、仓位 + from_start.put("struct_id", turnin_struct_id); + storPublicService.updateStructAndPoint(from_start); + } + ret.put("total_qty", total_qty); + ret.put("detail_count", ja.size()); + return ret; + } + + @Override + public JSONArray getOutBillDtl(Map whereJson) { + whereJson.put("flag", "2"); + JSONArray jo = WQL.getWO("QST_IVT_HANDMOVESTOR") + .addParamMap((HashMap) whereJson) + .process() + .getResultJSONArray(0); + return jo; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(Map whereJson) { + //主表 + WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_MoveInv"); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + String moveinv_id = (String) whereJson.get("moveinv_id"); + //查询主表 + JSONObject jo_mst = wo_mst.query("moveinv_id='" + moveinv_id + "'").uniqueResult(0); + //调用删除明细,还原库存方法 + this.deleteById(moveinv_id + ""); + //获取明细 + ArrayList rows = (ArrayList) whereJson.get("tableData"); + //调用明细处理方法 + JSONObject ret = this.insertDtlByRows(jo_mst, rows); + jo_mst.put("remark", whereJson.get("remark")); + jo_mst.put("biz_date", whereJson.get("biz_date")); + jo_mst.put("detail_count", ret.getString("detail_count")); + jo_mst.put("total_qty", ret.getString("total_qty")); + jo_mst.put("update_optid", currentUserId + ""); + jo_mst.put("update_optname", nickName); + jo_mst.put("update_time", now); + //更新主表 + wo_mst.update(jo_mst); + } + + @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("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) { + break; + } + 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 (Double.valueOf(jo_dtl.getDoubleValue("unassign_qty")).equals(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", "1"); + 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", "1"); + 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 + public Map getStructIvt(Map whereJson, Pageable page) { + HashMap map = new HashMap(whereJson); + if (StrUtil.isNotEmpty(map.get("remark"))) { + map.put("remark", "%" + map.get("remark") + "%"); + } + if (StrUtil.isNotEmpty(map.get("struct_code"))) { + map.put("struct_code", "%" + map.get("struct_code") + "%"); + } + if (StrUtil.isNotEmpty(map.get("pcsn"))) { + map.put("pcsn", "%" + map.get("pcsn") + "%"); + } + JSONObject jo = WQL.getWO("QST_IVT_HANDMOVESTOR") + .addParam("flag", "3") + .addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "ivt2.struct_id"); + return jo; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void confirm(JSONObject form) { + //明细表 + WQLObject wo_dtl = WQLObject.getWQLObject("st_ivt_structivtchangedtl"); + //主表 + WQLObject wo_mst = WQLObject.getWQLObject("st_ivt_structivtchange"); + //任务表 + + String changeinv_id = form.getString("changeinv_id"); + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + String now = DateUtil.now(); + //查询主表信息 + JSONObject jo_mst = wo_mst.query("changeinv_id = '" + changeinv_id + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jo_mst)) { + throw new BadRequestException("未查到相关库存转单单"); + } + JSONArray ja = wo_dtl.query("changeinv_id='" + changeinv_id + "'").getResultJSONArray(0); + for (int i = 0; i < ja.size(); i++) { + JSONObject jo = ja.getJSONObject(i); + HashMap map = new HashMap<>(); + map.put("mfg_order_name",jo.getString("mfg_order_name")); + map.put("customer_name",jo.getString("customer_name")); + map.put("customer_description",jo.getString("customer_description")); + map.put("isRePrintPackageBoxLabel",jo.getString("isRePrintPackageBoxLabel")); + map.put("isUnPackBox",jo.getString("isUnPackBox")); + String UpdatedDateOfProduction = jo.getString("isUnPackBox"); + String pcsn = jo.getString("pcsn"); + + JSONObject old_sub = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("container_name = '"+pcsn+"' AND status = '2'").uniqueResult(0); + old_sub.put("change_type_scode","02"); + old_sub.put("change_order_id",jo_mst.getString("changeinv_id")); + old_sub.put("change_order_code",jo_mst.getString("bill_code")); + old_sub.put("create_id",currentUserId); + old_sub.put("create_name",nickName); + old_sub.put("change_time",DateUtil.now()); + old_sub.put("workorder_id",IdUtil.getSnowflake(1, 1).nextId() + ""); + WQLObject.getWQLObject("PDM_BI_SubPackageRelationChangeFlow").insert(old_sub); + + if (StrUtil.isNotEmpty(UpdatedDateOfProduction)){ + map.put("date_of_FG_inbound",jo.getString("date_of_FG_inbound")); + } + WQLObject.getWQLObject("pdm_bi_subpackagerelation").update(map,"container_name = '"+pcsn+"' AND status = '2'"); + + JSONObject new_sub = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("container_name = '"+pcsn+"' AND status = '2'").uniqueResult(0); + new_sub.put("change_type_scode","01"); + new_sub.put("change_order_id",jo_mst.getString("changeinv_id")); + new_sub.put("change_order_code",jo_mst.getString("bill_code")); + new_sub.put("create_id",currentUserId); + new_sub.put("create_name",nickName); + new_sub.put("change_time",DateUtil.now()); + old_sub.put("workorder_id",IdUtil.getSnowflake(1, 1).nextId() + ""); + WQLObject.getWQLObject("PDM_BI_SubPackageRelationChangeFlow").insert(new_sub); + } + 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, "changeinv_id='" + changeinv_id + "'"); + } + + @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(); + +// OutTask checkOutBillAcsTask = new OutTask(); + String task_id = whereJson.getString("task_id"); + String taskdtl_id = whereJson.getString("taskdtl_id"); +// JSONObject result = checkOutBillAcsTask.notifyAcs(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_moveinvdtl"); + //任务表 + WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); + String task_id = whereJson.getString("task_id"); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + JSONObject task = wo_Task.query("task_status<>'99' and task_id='" + task_id + "'").uniqueResult(0); + if (task == null) { + throw new BadRequestException("查询不到操作的任务记录!"); + } + String taskdtl_type = task.getString("taskdtl_type"); + 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, "task_id='" + task_id + "'"); + map.put("work_status", "99"); + wo_dis.update(map, "task_id='" + task_id + "'"); + JSONObject dis = wo_dis.query("task_id='" + task_id + "'").uniqueResult(0); + //判断是否还有未完成的分配 + JSONArray ja = wo_dis.query("work_status<>'99' and moveinv_id='" + dis.getString("moveinv_id") + "'").getResultJSONArray(0); + if (ja.size() == 0) { + this.confirm(dis); + } + } + + @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 + @Transactional(rollbackFor = Exception.class) + public void handdown(JSONObject whereJson) { + //移库单主表 + WQLObject wo_mst = WQLObject.getWQLObject("ST_IVT_MoveInv"); + //移库单明细表 + WQLObject wo_dtl = WQLObject.getWQLObject("ST_IVT_MoveInvDtl"); + //任务表 + WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); + + HandMoveStorAcsTask handMoveStorAcsTask = new HandMoveStorAcsTask(); + + Long currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + String moveinv_id = whereJson.getString("moveinv_id"); + //查询所有载具的库存 + JSONArray ja = WQL.getWO("QST_IVT_HANDMOVESTOR") + .addParam("flag", "4") + .addParam("moveinv_id", moveinv_id) + .process().getResultJSONArray(0); + if (ja.size() == 0) { + throw new BadRequestException("当前移库单无可下发任务!"); + } + for (int i = 0; i < ja.size(); i++) { + JSONObject jo = ja.getJSONObject(i); + String task_id = jo.getString("task_id"); + JSONObject result = handMoveStorAcsTask.notifyAcs(task_id); + JSONObject task = wo_Task.query("task_id='" + task_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(result)) { + String status = result.getString("status"); + if ("200".equals(status)) { + HashMap map = new HashMap<>(); + //更新分配表 + map.put("is_issued", "1"); + map.put("work_status", "02"); + wo_dtl.update(map, "is_issued='0' and task_id='" + task.getString("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, "is_delete ='0' and task_status='01' and task_id='" + task_id + "'"); + } else { + throw new BadRequestException("任务下发失败,请稍后重试!"); + } + } else { + throw new BadRequestException("任务下发失败,请稍后重试!"); + } + } + HashMap map = new HashMap<>(); + map.put("bill_status", "20"); + wo_mst.update(map, "moveinv_id='" + moveinv_id + "'"); + } + + @Override + public JSONArray getInvTypes() { + //查询单据字段类型 + JSONArray ja = WQL.getWO("ST_PUB_QUERY_01") + .addParam("flag", "4") + .process() + .getResultJSONArray(0); + return ja; + } + + /** + * 更新主表状态 + * + * @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); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/wql/QST_IVT_CHANGE.wql b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/wql/QST_IVT_CHANGE.wql new file mode 100644 index 000000000..816b2ed28 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/wql/QST_IVT_CHANGE.wql @@ -0,0 +1,257 @@ +[交易说明] + 交易名: 基础点位分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.material_code TYPEAS s_string + 输入.bill_status TYPEAS s_string + 输入.bill_code TYPEAS s_string + 输入.create_mode TYPEAS s_string + 输入.bill_type TYPEAS s_string + 输入.stor_id TYPEAS s_string + 输入.moveinv_id TYPEAS s_string + 输入.buss_type TYPEAS s_string + 输入.work_status TYPEAS s_string + 输入.end_time TYPEAS s_string + 输入.begin_time TYPEAS s_string + 输入.material_id 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 + 输入.moveinvdtl_id TYPEAS s_string + 输入.struct_id TYPEAS s_string + 输入.is_issued TYPEAS s_string + 输入.remark TYPEAS s_string + 输入.task_id TYPEAS s_string + 输入.struct_code TYPEAS s_string + 输入.ids TYPEAS f_string + 输入.deptIds TYPEAS f_string +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + cg.changeinv_id AS id, + cg.* + FROM + st_ivt_structivtchange cg + WHERE + 1 = 1 + AND cg.is_delete = '0' + OPTION 输入.bill_code <> "" + cg.bill_code like 输入.bill_code + ENDOPTION + OPTION 输入.buss_type <> "" + cg.buss_type like 输入.buss_type + ENDOPTION + OPTION 输入.bill_type <> "" + cg.bill_type = 输入.bill_type + ENDOPTION + OPTION 输入.stor_id <> "" + cg.stor_id = 输入.stor_id + ENDOPTION + OPTION 输入.create_mode <> "" + cg.create_mode = 输入.create_mode + ENDOPTION + OPTION 输入.bill_status <> "" + cg.bill_status = 输入.bill_status + ENDOPTION + OPTION 输入.begin_time <> "" + cg.input_time >= 输入.begin_time + ENDOPTION + OPTION 输入.end_time <> "" + cg.input_time <= 输入.end_time + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + MoveInvDtl.*, + mb.material_code, + mb.material_name + FROM + ST_IVT_MoveInvDtl MoveInvDtl + LEFT JOIN md_me_materialbase mb ON mb.material_id = MoveInvDtl.material_id + WHERE + 1 = 1 + OPTION 输入.moveinv_id <> "" + MoveInvDtl.moveinv_id = 输入.moveinv_id + ENDOPTION + OPTION 输入.moveinvdtl_id <> "" + MoveInvDtl.moveinvdtl_id = 输入.moveinvdtl_id + ENDOPTION + OPTION 输入.work_status <> "" + MoveInvDtl.work_status <= 输入.work_status + ENDOPTION + order by MoveInvDtl.seq_no + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + PAGEQUERY + SELECT + ivt2.stockrecord_id, + ivt2.material_id, + ivt2.pcsn, + ivt2.quality_scode, + ivt2.qty_unit_id, + ivt2.ivt_qty AS qty, + mb.material_code, + mb.material_name, + struct.struct_id AS turnout_struct_id, + struct.struct_code AS turnout_struct_code, + struct.struct_name AS turnout_struct_name, + struct.sect_id AS turnout_sect_id, + struct.sect_name AS turnout_sect_name, + struct.sect_code AS turnout_sect_code, + struct.storagevehicle_id, + struct.storagevehicle_code, + mu.unit_name AS qty_unit_name + FROM + st_ivt_structattr struct + INNER JOIN ST_IVT_StructIvt ivt2 ON struct.struct_id = ivt2.struct_id + LEFT JOIN md_me_materialbase mb ON mb.material_id = ivt2.material_id + LEFT JOIN md_pb_measureunit mu ON mu.measure_unit_id = ivt2.qty_unit_id + WHERE + 1 = 1 + AND struct.lock_type = '1' + OPTION 输入.material_id <> "" + ivt2.material_id = 输入.material_id + ENDOPTION + OPTION 输入.remark <> "" + (mb.material_code like 输入.remark or mb.material_name like 输入.remark) + ENDOPTION + OPTION 输入.ids <> "" + struct.storagevehicle_code in (输入.ids) + ENDOPTION + OPTION 输入.struct_code <> "" + struct.struct_code like 输入.struct_code + ENDOPTION + OPTION 输入.stor_id <> "" + ivt2.stor_id = 输入.stor_id + ENDOPTION + OPTION 输入.sect_id <> "" + struct.sect_id = 输入.sect_id + ENDOPTION + OPTION 输入.pcsn <> "" + ivt2.pcsn like 输入.pcsn + ENDOPTION + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "33" + QUERY + SELECT + ivt2.stockrecord_id, + ivt2.material_id, + ivt2.pcsn, + ivt2.quality_scode, + ivt2.qty_unit_id, + mu.unit_name AS qty_unit_name, + ivt2.ivt_qty AS qty, + mb.material_code, + mb.material_name, + struct.struct_id AS turnout_struct_id, + struct.struct_code AS turnout_struct_code, + struct.struct_name AS turnout_struct_name, + struct.sect_id AS turnout_sect_id, + struct.sect_name AS turnout_sect_name, + struct.sect_code AS turnout_sect_code, + struct.storagevehicle_id, + struct.storagevehicle_code, + point.point_code AS start_point_code + FROM + st_ivt_structattr struct + INNER JOIN ST_IVT_StructIvt ivt2 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 point.source_id = struct.struct_id + LEFT JOIN md_pb_measureunit mu ON mu.measure_unit_id = mb.base_unit_id + WHERE + 1 = 1 + AND struct.lock_type = '1' + AND IFNULL(struct.storagevehicle_code,'') <> '' + OPTION 输入.material_id <> "" + ivt2.material_id = 输入.material_id + ENDOPTION + OPTION 输入.remark <> "" + (mb.material_code like 输入.remark or mb.material_name like 输入.remark) + ENDOPTION + OPTION 输入.ids <> "" + struct.storagevehicle_code in (输入.ids) + ENDOPTION + OPTION 输入.struct_code <> "" + struct.struct_code like 输入.struct_code + ENDOPTION + OPTION 输入.stor_id <> "" + ivt2.stor_id = 输入.stor_id + ENDOPTION + OPTION 输入.sect_id <> "" + struct.sect_id = 输入.sect_id + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "4" + QUERY + SELECT + DISTINCT(task.task_id) + FROM + ST_IVT_MoveInvDtl dtl + INNER JOIN ST_IVT_MoveInv mst ON mst.moveinv_id = dtl.moveinv_id + INNER JOIN SCH_BASE_Task task ON task.task_id = dtl.task_id + WHERE + 1 = 1 + AND mst.bill_status = '10' + AND dtl.work_status = '01' + AND dtl.is_issued = '0' + AND task.task_status = '01' + AND mst.is_delete = '0' + AND task.is_delete = '0' + OPTION 输入.moveinv_id <> "" + dtl.moveinv_id = 输入.moveinv_id + ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + + diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/wql/QST_IVT_HANDMOVESTOR.wql b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/wql/QST_IVT_HANDMOVESTOR.wql index 9c1c91ed1..310cd2a1f 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/wql/QST_IVT_HANDMOVESTOR.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/wql/QST_IVT_HANDMOVESTOR.wql @@ -158,12 +158,16 @@ struct.sect_code AS turnout_sect_code, struct.storagevehicle_id, struct.storagevehicle_code, - mu.unit_name AS qty_unit_name + mu.unit_name AS qty_unit_name, + sub.sale_order_name, + sub.customer_name, + sub.customer_description FROM st_ivt_structattr struct INNER JOIN ST_IVT_StructIvt ivt2 ON struct.struct_id = ivt2.struct_id LEFT JOIN md_me_materialbase mb ON mb.material_id = ivt2.material_id LEFT JOIN md_pb_measureunit mu ON mu.measure_unit_id = ivt2.qty_unit_id + LEFT JOIN pdm_bi_subpackagerelation sub ON sub.container_name = ivt2.pcsn WHERE 1 = 1 AND struct.lock_type = '1' diff --git a/lms/nladmin-ui/src/views/wms/st/inStor/change/AddDialog.vue b/lms/nladmin-ui/src/views/wms/st/inStor/change/AddDialog.vue new file mode 100644 index 000000000..194a7ce4f --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/st/inStor/change/AddDialog.vue @@ -0,0 +1,522 @@ + + + + + + + diff --git a/lms/nladmin-ui/src/views/wms/st/inStor/change/AddDtl.vue b/lms/nladmin-ui/src/views/wms/st/inStor/change/AddDtl.vue new file mode 100644 index 000000000..da3c0a993 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/st/inStor/change/AddDtl.vue @@ -0,0 +1,196 @@ + + + + diff --git a/lms/nladmin-ui/src/views/wms/st/inStor/change/change.js b/lms/nladmin-ui/src/views/wms/st/inStor/change/change.js new file mode 100644 index 000000000..361d8433e --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/st/inStor/change/change.js @@ -0,0 +1,68 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/change', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/change/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/change', + method: 'put', + data + }) +} + +export function getOutBillDtl(params) { + return request({ + url: '/api/change/getOutBillDtl', + method: 'get', + params + }) +} +export function getInvTypes() { + return request({ + url: '/api/change/getInvTypes', + method: 'get' + }) +} +export function insertDtl(data) { + return request({ + url: '/api/change/insertDtl', + method: 'post', + data + }) +} +export function getStructIvt(params) { + return request({ + url: '/api/change/getStructIvt', + method: 'get', + params + }) +} +export function confirm(data) { + return request({ + url: '/api/change/confirm', + method: 'post', + data + }) +} +export function handdown(data) { + return request({ + url: '/api/change/handdown', + method: 'post', + data + }) +} +export default { add, edit, del, getOutBillDtl, getStructIvt, confirm, getInvTypes, handdown } diff --git a/lms/nladmin-ui/src/views/wms/st/inStor/change/index.vue b/lms/nladmin-ui/src/views/wms/st/inStor/change/index.vue new file mode 100644 index 000000000..f48575578 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/st/inStor/change/index.vue @@ -0,0 +1,308 @@ + + + +