From 01b9073569ca07795bfbb06b43aa1b8f1e1e327f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=B1=9F=E7=8E=AE?= Date: Thu, 18 May 2023 17:51:18 +0800 Subject: [PATCH] =?UTF-8?q?rev=20=E6=B7=B7=E6=96=99=E6=9C=BA=E4=B8=8B?= =?UTF-8?q?=E5=B7=A5=E5=8D=95=E4=BE=9D=E6=97=A7=E4=BD=BF=E7=94=A8=E7=89=A9?= =?UTF-8?q?=E6=96=99=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lms/nladmin-system/pom.xml | 12 +- .../java/org/nl/config/DataBaseConfig.java | 62 +++++++++++ .../basedata/service/dto/MaterialbaseDto.java | 22 +++- .../service/impl/MaterialbaseServiceImpl.java | 105 ++++++++++-------- .../nl/wms/basedata/wql/QMD_ME_MATERIAL.wql | 30 ++++- .../acs/service/impl/AcsToWmsServiceImpl.java | 2 +- .../task/call/empty/wql/CALL_EMPTY_TASK.wql | 1 + .../call/material/wql/CALL_MATERIAL_TASK.wql | 7 +- .../send/material/wql/SEND_MATERIAL_TASK.wql | 4 +- .../src/main/java/org/nl/wms/wms.xls | Bin 283136 -> 285184 bytes .../resources/config/application-prod.yml | 8 ++ .../src/test/java/org/nl/test/TempTest.java | 103 ++++++++--------- .../src/views/wms/basedata/bom/index.vue | 4 +- .../src/views/wms/basedata/material/index.vue | 92 ++++++++++++++- .../views/wms/pdm/workerorder/hl/index.vue | 30 ++--- .../src/views/wms/pdm/workerorder/index.vue | 2 +- .../src/views/wms/pub/BOMDialog.vue | 2 +- .../src/views/wms/pub/MaterDialog.vue | 24 +++- .../src/views/wms/sch/point/index.vue | 2 +- 19 files changed, 366 insertions(+), 146 deletions(-) diff --git a/lms/nladmin-system/pom.xml b/lms/nladmin-system/pom.xml index 2d202b6..35ae326 100644 --- a/lms/nladmin-system/pom.xml +++ b/lms/nladmin-system/pom.xml @@ -31,6 +31,16 @@ + + + + com.microsoft.sqlserver + mssql-jdbc + 6.4.0.jre8 + + + + org.redisson redisson-spring-boot-starter @@ -270,7 +280,7 @@ commons-beanutils commons-beanutils-core - 1.8.0 + 1.8.3 diff --git a/lms/nladmin-system/src/main/java/org/nl/config/DataBaseConfig.java b/lms/nladmin-system/src/main/java/org/nl/config/DataBaseConfig.java index f679d3b..0f40b46 100644 --- a/lms/nladmin-system/src/main/java/org/nl/config/DataBaseConfig.java +++ b/lms/nladmin-system/src/main/java/org/nl/config/DataBaseConfig.java @@ -1,18 +1,33 @@ package org.nl.config; +import cn.hutool.core.util.StrUtil; import com.alibaba.druid.pool.DruidDataSource; import lombok.extern.slf4j.Slf4j; +import org.nl.modules.mnt.util.DataTypeEnum; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; +import java.sql.DriverManager; +import java.sql.SQLException; @Configuration @Slf4j public class DataBaseConfig { + @Value("${erp.sqlserver.enabled}") + private boolean sqlserverIsConnect; + @Value("${erp.sqlserver.jdbcurl}") + private String sqlserverJdbcUrl; + @Value("${erp.sqlserver.username}") + private String sqlserverUserName; + @Value("${erp.sqlserver.password}") + private String sqlserverPassword; + @Primary @Bean(name = "dataSource") @ConfigurationProperties(prefix = "spring.datasource.druid") @@ -20,4 +35,51 @@ public class DataBaseConfig { return new DruidDataSource(); } + @Bean("dataSource1") + @ConditionalOnExpression("${erp.sqlserver.enabled:true}") + public DataSource dataSource1() { + log.info("是否连接Sqlserver" + sqlserverIsConnect); + String jdbcUrl = sqlserverJdbcUrl; + String userName = sqlserverUserName; + String password = sqlserverPassword; + DruidDataSource druidDataSource = new DruidDataSource(); + String className; + try { + className = DriverManager.getDriver(jdbcUrl.trim()).getClass().getName(); + } catch (SQLException e) { + throw new RuntimeException("Get class name error: =" + jdbcUrl); + } + if (StrUtil.isEmpty(className)) { + DataTypeEnum dataTypeEnum = DataTypeEnum.urlOf(jdbcUrl); + if (null == dataTypeEnum) { + throw new RuntimeException("Not supported data type: jdbcUrl=" + jdbcUrl); + } + druidDataSource.setDriverClassName(dataTypeEnum.getDriver()); + } else { + druidDataSource.setDriverClassName(className); + } + + + druidDataSource.setUrl(jdbcUrl); + druidDataSource.setUsername(userName); + druidDataSource.setPassword(password); + // 配置获取连接等待超时的时间 + druidDataSource.setMaxWait(3000); + // 配置初始化大小、最小、最大 + druidDataSource.setInitialSize(5); + druidDataSource.setMinIdle(5); + druidDataSource.setMaxActive(10); + + // 如果链接出现异常则直接判定为失败而不是一直重试 + druidDataSource.setBreakAfterAcquireFailure(true); + try { + druidDataSource.init(); + } catch (SQLException e) { + log.error("Exception during pool initialization", e); + throw new RuntimeException(e.getMessage()); + } + + return druidDataSource; + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/dto/MaterialbaseDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/dto/MaterialbaseDto.java index a8a75ff..09fd61a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/dto/MaterialbaseDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/dto/MaterialbaseDto.java @@ -50,11 +50,29 @@ public class MaterialbaseDto implements Serializable { private String update_time; /** - * 是否启用 + * 是否删除 */ - private String is_used; + private String is_delete; private Double weight; private String material_type; + + private Double qty; + + private Double aux_qty; + + private Double current_qty; + + private Double current_aux_qty; + + private String order_code; + + private String furnace; + + private String material_brick_type; + + private String product_grade; + + private Double unqualified_qty; } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/MaterialbaseServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/MaterialbaseServiceImpl.java index bfb04c8..c40f9d8 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/MaterialbaseServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/MaterialbaseServiceImpl.java @@ -30,6 +30,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; /** * @author zhouz @@ -51,6 +52,9 @@ public class MaterialbaseServiceImpl implements MaterialbaseService { map.put("flag", "1"); map.put("search", name); map.put("material_type", MapUtil.getStr(whereJson, "material_type")); + map.put("order_code", MapUtil.getStr(whereJson, "order_code")); + map.put("product_grade", MapUtil.getStr(whereJson, "product_grade")); + map.put("brick_type", MapUtil.getStr(whereJson, "brick_type")); return WQL.getWO("QMD_ME_MATERIAL").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "create_time DESC"); } @@ -106,52 +110,6 @@ public class MaterialbaseServiceImpl implements MaterialbaseService { dto.setCreate_time(now); JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); wo.insert(json); - - // 解析物料编码 - JSONObject material_detail = new JSONObject(); - material_detail.put("material_id", id); - material_detail.put("material_code", material_code); - WQLObject dict_detail_table = WQLObject.getWQLObject("sys_dict_detail"); - String furnace_code = material_code.substring(0, 2); - JSONObject furnace_name = dict_detail_table.query("name = 'furnace' AND value = '" + furnace_code + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(furnace_name)) { - throw new BadRequestException("物料编码解析错误:未知炉型!"); - } - material_detail.put("furnace", furnace_name.getString("label")); - String material_brick_code = material_code.substring(2, 5); - JSONObject material_brick_type = dict_detail_table.query("name = 'material_brick_type' AND value = '" + material_brick_code + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(material_brick_type)) { - throw new BadRequestException("物料编码解析错误:未知物料砖类型!"); - } - material_detail.put("material_brick_type", material_brick_type.getString("label")); - - String bom_code = material_code.substring(5, 11); - JSONObject old_bom = wo.query("material_code = '" + bom_code + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(old_bom)) { - JSONObject bom = new JSONObject(); - bom.put("material_id", IdUtil.getSnowflake(1, 1).nextId()); - bom.put("material_code", bom_code); - bom.put("material_type", "2"); - bom.put("create_id", currentUserId); - bom.put("create_name", nickName); - bom.put("create_time", now); - wo.insert(bom); - } - - material_detail.put("bom_code", bom_code); - material_detail.put("order_code", material_code.substring(11, 16)); - material_detail.put("customer_code", material_code.substring(16, 21)); - String product_grade_code = material_code.substring(21, 23); - JSONObject product_grade = dict_detail_table.query("name = 'product_grade' AND value = '" + product_grade_code + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(product_grade)) { - throw new BadRequestException("物料编码解析错误:未知牌号!"); - } - material_detail.put("product_grade", product_grade.getString("label")); - material_detail.put("brick_type", material_code.substring(23)); - material_detail.put("create_id", currentUserId); - material_detail.put("create_name", nickName); - material_detail.put("create_time", now); - WQLObject.getWQLObject("md_me_material_detail").insert(material_detail); } @Override @@ -199,8 +157,59 @@ public class MaterialbaseServiceImpl implements MaterialbaseService { @Override public void synchronize(Map whereJson) { - /* wmsToErpService.getClassInfo(null); - wmsToErpService.getMaterialInfo(null);*/ + JSONArray erp_materials = WQL.getWO("QMD_ME_MATERIAL").setDbname("dataSource1").addParam("flag", "2").process().getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(erp_materials)) { + WQLObject material_table = WQLObject.getWQLObject("md_me_materialbase"); + List material_codes = material_table.query().getResultJSONArray(0).stream().map(o -> ((JSONObject) o).getString("material_code")).collect(Collectors.toList()); + WQLObject dict_detail_table = WQLObject.getWQLObject("sys_dict_detail"); + + Long user_id = SecurityUtils.getCurrentUserId(); + String nick_name = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + erp_materials.forEach(o -> { + JSONObject erp_material = (JSONObject) o; + String material_code = erp_material.getString("cinvcode").substring(1); + if (!material_codes.contains(material_code)) { + JSONObject material = new JSONObject(); + long id = IdUtil.getSnowflake(1L, 1L).nextId(); + material.put("material_id", id); + material.put("material_code", material_code); + material.put("material_name", erp_material.getString("cinvname")); + material.put("weight", String.format("%.2f", erp_material.getDoubleValue("changerate") * 1000)); + String qty = String.format("%.0f", erp_material.getDoubleValue("qty") * 1000); + material.put("qty", qty); + material.put("surplus_qty", qty); + String aux_qty = String.format("%.0f", erp_material.getDoubleValue("auxqty")); + material.put("aux_qty", aux_qty); + material.put("surplus_aux_qty", aux_qty); + material.put("order_code", erp_material.getString("free1")); + + String furnace_code = material_code.substring(0, 2); + JSONObject furnace_name = dict_detail_table.query("name = 'furnace' AND value = '" + furnace_code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(furnace_name)) { + material.put("furnace", furnace_name.getString("label")); + } else { + material.put("furnace", furnace_code); + } + String material_brick_code = material_code.substring(2, 5); + JSONObject material_brick_type = dict_detail_table.query("name = 'material_brick_type' AND value = '" + material_brick_code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(material_brick_type)) { + material.put("material_brick_type", material_brick_type.getString("label")); + } else { + material.put("material_brick_type", material_brick_code); + } + material.put("product_grade", erp_material.getString("free3")); + material.put("brick_type", erp_material.getString("free4")); + + material.put("create_id", user_id); + material.put("create_name", nick_name); + material.put("create_time", now); + + material_table.insert(material); + } + }); + } } @Override diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/wql/QMD_ME_MATERIAL.wql b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/wql/QMD_ME_MATERIAL.wql index 738919a..b0d7c87 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/wql/QMD_ME_MATERIAL.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/wql/QMD_ME_MATERIAL.wql @@ -18,7 +18,10 @@ 输入.class_code TYPEAS s_string 输入.idssql TYPEAS f_string 输入.classIds TYPEAS f_string - 输入.material_type TYPEAS f_string + 输入.material_type TYPEAS s_string + 输入.order_code TYPEAS s_string + 输入.product_grade TYPEAS s_string + 输入.brick_type TYPEAS s_string [临时表] --这边列出来的临时表就会在运行期动态创建 @@ -55,10 +58,31 @@ ENDOPTION OPTION 输入.material_type <> "" mb.material_type = 输入.material_type + ENDOPTION + OPTION 输入.order_code <> "" + mb.order_code LIKE '%' order_code '%' + ENDOPTION + OPTION 输入.product_grade <> "" + mb.product_grade LIKE '%' 输入.product_grade '%' + ENDOPTION + OPTION 输入.brick_type <> "" + mb.brick_type LIKE '%' 输入.brick_type '%' ENDOPTION ENDSELECT ENDPAGEQUERY ENDIF - - + IF 输入.flag = "2" + QUERY + SELECT + * + FROM + dbo.EFV_MO_ORDER + WHERE + STATUS = 3 + AND AuxQty > QualifiedInNum + AND LEFT ( cinvcode, 1 ) <> '1' + AND cInvCode LIKE 'W%' + ENDSELECT + ENDQUERY + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index 7b9bc3f..2fd7d99 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -915,7 +915,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { throw new BadRequestException("载具编码不能为空!"); } - boolean to_package = false; + boolean to_package = true; WQLObject vd_table = WQLObject.getWQLObject("st_ivt_vehicle_detail"); JSONObject vd = vd_table diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/wql/CALL_EMPTY_TASK.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/wql/CALL_EMPTY_TASK.wql index 6a47352..3c08a04 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/wql/CALL_EMPTY_TASK.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/wql/CALL_EMPTY_TASK.wql @@ -56,6 +56,7 @@ AND vd.is_delete = '0' AND vd.point_code = 输入.point_code AND vd.is_full = '0' + AND vd.is_in_kiln = '0' ENDSELECT ENDQUERY ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/wql/CALL_MATERIAL_TASK.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/wql/CALL_MATERIAL_TASK.wql index 666efde..91fba37 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/wql/CALL_MATERIAL_TASK.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/wql/CALL_MATERIAL_TASK.wql @@ -116,9 +116,6 @@ AND point.vehicle_code = vd.vehicle_code AND vd.is_delete = '0' LEFT JOIN md_me_materialbase mb1 ON vd.material_id = mb1.material_id - LEFT JOIN md_me_material_detail md ON mb1.material_code = md.bom_code - LEFT JOIN md_me_materialbase mb2 ON md.material_id = mb2.material_id - LEFT JOIN pdm_bd_workorder workorder ON vd.workorder_id = workorder.workorder_id WHERE point.is_used = '1' AND point.lock_type = '1' @@ -126,10 +123,10 @@ AND point.point_type = '1' AND point.point_status = '1' AND point.vehicle_type = '1' - AND mb2.material_id = 输入.material_id + AND mb1.material_id = 输入.material_id AND vd.stand_status IN ('3', '4') ORDER BY - workorder.is_urgent DESC, vd.create_time ASC + vd.create_time ASC ENDSELECT ENDQUERY ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/wql/SEND_MATERIAL_TASK.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/wql/SEND_MATERIAL_TASK.wql index 902bf2c..cd44e57 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/wql/SEND_MATERIAL_TASK.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/wql/SEND_MATERIAL_TASK.wql @@ -109,15 +109,13 @@ JOIN pdm_bi_device device ON point.device_code = device.device_code LEFT JOIN pdm_bd_workorder workorder ON device.device_id = workorder.device_id AND workorder.order_status = '3' LEFT JOIN md_me_materialbase mb1 ON workorder.material_id = mb1.material_id AND mb1.material_type = '1' - LEFT JOIN md_me_material_detail md1 ON mb1.material_id = md1.material_id - LEFT JOIN md_me_materialbase mb2 ON md1.bom_code = mb2.material_code AND mb2.material_type = '2' WHERE point.is_used = '1' AND point.lock_type = '1' AND point.region_code = 'KLHJ' AND point.point_type = '2' AND point.point_status = '0' - AND mb2.material_id = 输入.material_id + AND mb1.material_id = 输入.material_id ENDSELECT ENDQUERY ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/wms.xls b/lms/nladmin-system/src/main/java/org/nl/wms/wms.xls index de1dabd5ec63ecadab67d5f6d6b3e4a4a293faf2..63774b2f59d52cd79781a5d4124131ce7c91f8c0 100644 GIT binary patch delta 18384 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 L-)eQP-uC|i-Sd<* delta 16685 zcmaJ|2YeL8_kXjw^g==cA-y+9AiY2m(hVVmP(u+EG>C|T6sd9`iueN*2xLWyihwjx z4CFu%!G_XBiYN+56%Y|Af|UPvW_I^-ME|+ZWNzNhyzlqDnVt8x+~f^jlb3nT?(TYx zh$b=oQ%LoSGPPPi`~@~wF|jA=?3Je!hmT@6);{w}%?Q&prRAoYJEkEXCzHw`ImYCX zx)JsZ8FQ@haLi^@bIRSf;eS6;*o?m2Iwz42Z6HPu%v%*8(KM>*;=+6GaQ5xcpwCsC zKGw0{{HwerwP1!$6H!fsQv!5$aq?}5dmMNV%(Jx3Q`Rq6g-(v2z z)_8gNvaMo`ZLP`oc&H~MCw-2#);!<%sI&FxyAK~Fa^zCadU@rA=7o}jbEs7wWFw#G(XD|+|1n42VAf(utx`~uaGAN1@X3ty;}Xm z;OjFy260(#w3H36e(s406K7O$+5EOrcDjO%4I9E`9@Oe_F0*5Ur-#4T>@nVJ*E6!$ zovOUCeDo_Y`9lkrIk1JD=k+gntjEmmOZ#RF(Q8QYBz!H0QgRiP_Cu z(O=4%QgS7i*|W3#-spd)OLdo;{(SVfgBnbXLQROS zdOAY~Ib6MpBW$>dxY>bq{TH5hs_D1P-|@I3?{uhc(z0%L?rn%&&Bd;#kmJ?JnlMwd zo)7ro27l}9!g0)n_c2YYc(=u~gZC`BJ$(BMf3&>O>j9m!<2#oAx6Upv$N%atkUiY9 zCTL}#c`Xjm{jqF$&rYS?yZGe(G3&keJhF<h=+ec1c*}>Gj(}^)BwxneEIgNkn?_YAx zAOGvYl?lV*y*9fHzUbI(h5g#mu*!uip8A(+>_C9AA2QZodO53(8*_ zncc&F-BSy$r9RR7pkv2YXS0%%=bEo=nB_L$hXd*TUWrP2x99mqix+nqcgJl@*RxOe z9MGZ7s26sPtgenayP$e(?e=|N@Bi(K<8gC?_v})ipSEaCbxQQ+p9AOrI&?<-``5qk ze|l`5_o4?uuazBMIA+-SvxB(h4nbMBLx#i{)-K6hoW zYv~lz`h^K*cBp%7w@dq1^v@mt$@QmiA3h%4tNNwy-+1h+wHxPl_+|9LL7`5j$rD3O zZj_y|XoAy$bE8L$s zd8}i%Un>XYevp>6cxv0PuZ*lpNb&t^?6>bu*y!hTCfokE{;M)BRhF1Hy_`06e%eR5 zZAM=RoLM~Z!^m#Ye?+}{rN`Sr=Qnq{Rrcw+skaxr(Q3lsalZ znp=2l*ZFB@wmyCE)2_pg?3h@zYRg+6t8GVlEQ$Df=H@lE6Z#$N=<#!_6a6C3|NQ2a z`Qz(6&b`hq&(Ge`wu}IEYwChGp8DT`KR23>+x45XbK-;XZ?Atlbo;oWBge&m{MFfU z?e{53iN|^!z5Yd$CCh%fer3y~3tfNmd*q+bj+RE`>|A$fr||Q?_x2qNP*1%1#lX=K>%LufY;Lz+$`&`rPyW2hTZmk-3eCfO;Q@@Zdqso}H;RUw)PS@i!IG%I%=K$}6M%RyZ+}`lTbwt~t7+simnK%P^TA&>h8z z2CN`*!^l5TFGB6ThG-i$o=VjJpx%#qyggCLTJ%BP>;t0h4n*zN5uI}+I*ED)SdRIS zC>)z$i;sxDK>Zo&AubrV9^+7#eoXY2E71?Arvk9rTu0>TjsY7m0QI}5%RPwvHxhk? zdK&5^?3!!qiK-AYy(~mqQBOwQ$_v1#XP_Rl3BXN>W`07H;X^cW3sFonqOM!v4%9~3iav+@j zz+891Ld+gDCp*;~#r$vvc}1}RGYq3WP$-W%0Adfb{WxJ%3xeT|j_hGhbPp*jY{oGx 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 material_codes = material_table.query().getResultJSONArray(0).stream().map(o -> ((JSONObject) o).getString("material_code")).collect(Collectors.toList()); + WQLObject dict_detail_table = WQLObject.getWQLObject("sys_dict_detail"); - if (ObjectUtil.isNotEmpty(vds)) { - ArrayList ids = new ArrayList<>(); - for (int i = 0; i < vds.size(); i++) { - JSONObject vd = vds.getJSONObject(i); - DateTime create_time = DateUtil.parse(vd.getString("create_time")); - DateTime time = DateUtil.offsetMinute(create_time, vd.getIntValue("standing_time")); - int compare = DateUtil.compare(DateUtil.date(), time); - if (compare >= 0) { - ids.add(vd.getLong("vd_id")); - } - } - - JSONObject update = new JSONObject(); - update.put("stand_status", StandStatus.COMPLETED.value()); - WQLObject.getWQLObject("st_ivt_vehicle_detail").update(update, "vd_id IN " + CommonUtils.idsArrayToInStr(ids.toArray(new Long[0]))); - } + Long user_id = 1L; + String nick_name = "管理员"; + String now = DateUtil.now(); - vds = WQL.getWO("MANAGE_QUERY").addParam("flag", "2").process().getResultJSONArray(0); + erp_materials.forEach(o -> { + JSONObject erp_material = (JSONObject) o; + String material_code = erp_material.getString("cinvcode").substring(1); + if (!material_codes.contains(material_code)) { + JSONObject material = new JSONObject(); + long id = IdUtil.getSnowflake(1L, 1L).nextId(); + material.put("material_id", id); + material.put("material_code", material_code); + material.put("material_name", erp_material.getString("cinvname")); + material.put("weight", String.format("%.2f", erp_material.getDoubleValue("changerate") * 1000)); + String qty = String.format("%.0f", erp_material.getDoubleValue("qty") * 1000); + material.put("qty", qty); + material.put("surplus_qty", qty); + String aux_qty = String.format("%.0f", erp_material.getDoubleValue("auxqty")); + material.put("aux_qty", aux_qty); + material.put("surplus_aux_qty", aux_qty); + material.put("order_code", erp_material.getString("free1")); - if (ObjectUtil.isNotEmpty(vds)) { - ArrayList ids = new ArrayList<>(); - for (int i = 0; i < vds.size(); i++) { - JSONObject vd = vds.getJSONObject(i); - DateTime create_time = DateUtil.parse(vd.getString("create_time")); - int threshold_time = vd.getIntValue("threshold_time"); - int standing_time = vd.getIntValue("standing_time"); - if (threshold_time != 0 && threshold_time < standing_time) { - DateTime time = DateUtil.offsetMinute(create_time, threshold_time); - int compare = DateUtil.compare(DateUtil.date(), time); - if (compare >= 0) { - ids.add(vd.getLong("vd_id")); + String furnace_code = material_code.substring(0, 2); + JSONObject furnace_name = dict_detail_table.query("name = 'furnace' AND value = '" + furnace_code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(furnace_name)) { + material.put("furnace", furnace_name.getString("label")); + } else { + material.put("furnace", furnace_code); } - } - } + String material_brick_code = material_code.substring(2, 5); + JSONObject material_brick_type = dict_detail_table.query("name = 'material_brick_type' AND value = '" + material_brick_code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(material_brick_type)) { + material.put("material_brick_type", material_brick_type.getString("label")); + } else { + material.put("material_brick_type", material_brick_code); + } + material.put("product_grade", erp_material.getString("free3")); + material.put("brick_type", erp_material.getString("free4")); - if (!ids.isEmpty()) { - JSONObject update = new JSONObject(); - update.put("stand_status", StandStatus.TIMEOUT.value()); - WQLObject.getWQLObject("st_ivt_vehicle_detail").update(update, "vd_id IN " + CommonUtils.idsArrayToInStr(ids.toArray(new Long[0]))); - } - } + material.put("create_id", user_id); + material.put("create_name", nick_name); + material.put("create_time", now); - JSONArray points = WQL.getWO("MANAGE_QUERY").addParam("flag", "3").process().getResultJSONArray(0); - if (ObjectUtil.isNotEmpty(vds)) { - JSONArray point_codes = new JSONArray(); - for (int i = 0; i < points.size(); i++) { - JSONObject point = points.getJSONObject(i); - point_codes.add(point.getString("point_code")); - } - SpringContextHolder.getBean(WmsToAcsService.class).light(point_codes); + material_table.insert(material); + } + }); } } } diff --git a/lms/nladmin-ui/src/views/wms/basedata/bom/index.vue b/lms/nladmin-ui/src/views/wms/basedata/bom/index.vue index 35b51b4..0edbccb 100644 --- a/lms/nladmin-ui/src/views/wms/basedata/bom/index.vue +++ b/lms/nladmin-ui/src/views/wms/basedata/bom/index.vue @@ -10,11 +10,11 @@ label-width="90px" label-suffix=":" > - + diff --git a/lms/nladmin-ui/src/views/wms/basedata/material/index.vue b/lms/nladmin-ui/src/views/wms/basedata/material/index.vue index b86c221..c763aa0 100644 --- a/lms/nladmin-ui/src/views/wms/basedata/material/index.vue +++ b/lms/nladmin-ui/src/views/wms/basedata/material/index.vue @@ -35,17 +35,80 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 千克 + + + + + + + + + + + 千克 + + + + + + + 分钟 + + + + + + + 分钟 + + + @@ -97,7 +160,21 @@ @selection-change="crud.selectionChangeHandler" > - + + + + + + + + + + + + + + + @@ -159,7 +236,14 @@ const defaultForm = { update_optname: null, update_time: null, weight: null, - material_type: '1' + material_type: '1', + order_code: null, + product_grade: null, + material_brick_type: null, + furnace: null, + qty: 0, + aux_qty: 0, + brick_type: null } export default { name: 'Materialbase', diff --git a/lms/nladmin-ui/src/views/wms/pdm/workerorder/hl/index.vue b/lms/nladmin-ui/src/views/wms/pdm/workerorder/hl/index.vue index 382455c..3aa1789 100644 --- a/lms/nladmin-ui/src/views/wms/pdm/workerorder/hl/index.vue +++ b/lms/nladmin-ui/src/views/wms/pdm/workerorder/hl/index.vue @@ -20,11 +20,11 @@ @keyup.enter.native="crud.toQuery" /> - + @@ -103,7 +103,7 @@ - + @@ -129,7 +129,7 @@ - 千克 + 千克 @@ -143,9 +143,9 @@ - - - + + + @@ -177,7 +177,7 @@ - + - - - - - + + + diff --git a/lms/nladmin-ui/src/views/wms/sch/point/index.vue b/lms/nladmin-ui/src/views/wms/sch/point/index.vue index 29b5727..9f40a2b 100644 --- a/lms/nladmin-ui/src/views/wms/sch/point/index.vue +++ b/lms/nladmin-ui/src/views/wms/sch/point/index.vue @@ -265,7 +265,7 @@ - +