From bf70cf7b23c31bdf84c70d0614938dedac89246a Mon Sep 17 00:00:00 2001 From: "ZHOUZ\\Noble'lift" <1014987728@qq.com> Date: Fri, 18 Aug 2023 18:19:58 +0800 Subject: [PATCH] =?UTF-8?q?rev=EF=BC=9A=E5=9B=9E=E4=BC=A0=E9=A3=9E?= =?UTF-8?q?=E4=B9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../master/rest/DeviceStatusController.java | 10 + .../master/service/DeviceStatusService.java | 8 +- .../service/impl/DeviceStatusServiceImpl.java | 59 ++++- .../service/impl/StructattrServiceImpl.java | 17 ++ .../acs/service/impl/AcsToWmsServiceImpl.java | 21 +- .../mes/service/impl/MesToLmsServiceImpl.java | 10 +- .../mps/service/impl/BakingServiceImpl.java | 2 + .../wms/pda/mps/wql/PDA_OVENINANDOUT_01.wql | 4 +- .../impl/ProductInstorServiceImpl.java | 9 + .../impl/ProductionOutServiceImpl.java | 18 ++ .../src/main/java/org/nl/wms/pdm/wql/em.xls | Bin 169984 -> 182272 bytes .../src/main/java/org/nl/wms/pdm/wql/pdm.xls | Bin 252928 -> 253440 bytes .../nl/wms/sch/manage/AutoQueryBillInfo.java | 81 +++++++ .../nl/wms/sch/manage/AutoQueryUpload.java | 79 +++++++ .../org/nl/wms/sch/manage/AutoSendFeiShu.java | 6 +- .../service/impl/CheckOutBillServiceImpl.java | 11 +- .../service/impl/InBillQueryServiceImpl.java | 8 +- .../nl/wms/stat/wql/ST_IVT_INBILLQUERY.wql | 118 +++++----- .../views/wms/agvrush/devicestatus/index.vue | 219 +++++++++++++++--- .../src/views/wms/st/outbill/index.vue | 4 +- 20 files changed, 562 insertions(+), 122 deletions(-) create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoQueryBillInfo.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoQueryUpload.java diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/DeviceStatusController.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/DeviceStatusController.java index 9e9286112..e92a9b684 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/DeviceStatusController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/DeviceStatusController.java @@ -39,6 +39,16 @@ public class DeviceStatusController { return new ResponseEntity<>(deviceStatusService.queryAll(whereJson, page), HttpStatus.OK); } + @PostMapping + @Log("新增客户基础表") + @ApiOperation("新增客户基础表") + //@PreAuthorize("@el.check('customerbase:add')") + public ResponseEntity create(@RequestBody JSONObject jo) { + deviceStatusService.create(jo); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping @Log("修改客户基础表") @ApiOperation("修改客户基础表") diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/DeviceStatusService.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/DeviceStatusService.java index a77074ce2..1b06ea244 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/DeviceStatusService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/DeviceStatusService.java @@ -30,9 +30,15 @@ public interface DeviceStatusService { */ List queryAll(Map whereJson); + /** + * 新增 + * @param jo / + */ + void create(JSONObject jo); + /** * 编辑 - * @param dto / + * @param jo / */ void update(JSONObject jo); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/DeviceStatusServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/DeviceStatusServiceImpl.java index 6fe25ae2a..3fe8760e8 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/DeviceStatusServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/DeviceStatusServiceImpl.java @@ -3,6 +3,7 @@ package org.nl.wms.basedata.master.service.impl; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; @@ -10,6 +11,7 @@ import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.common.utils.SecurityUtils; +import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.core.bean.ResultBean; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.WqlUtil; @@ -20,6 +22,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.sql.SQLIntegrityConstraintViolationException; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -38,13 +41,21 @@ public class DeviceStatusServiceImpl implements DeviceStatusService { @Override public Map queryAll(Map whereJson, Pageable page) { - String where = ""; + String where = "1=1"; WQLObject wo = WQLObject.getWQLObject("em_bi_devicestatus"); String search = (String) whereJson.get("search"); if (!StrUtil.isEmpty(search)) { - where = "AND (device_code like '%" + search + "%' OR device_name like '%" + search + "%')"; + where += " AND (device_code like '%" + search + "%' OR device_name like '%" + search + "%')"; } - ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), "1=1" + where, "device_code desc"); + String product_area = (String) whereJson.get("product_area"); + if (!StrUtil.isEmpty(product_area)) { + where += " AND product_area = '"+product_area+"'"; + } + String device_type = (String) whereJson.get("device_type"); + if (!StrUtil.isEmpty(device_type)) { + where += " AND device_type = '"+device_type+"'"; + } + ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), where, "device_code desc"); final JSONObject json = rb.pageResult(); return json; } @@ -59,10 +70,9 @@ public class DeviceStatusServiceImpl implements DeviceStatusService { @Override @Transactional(rollbackFor = Exception.class) - public void update(JSONObject jo) { + public void create(JSONObject jo) { WQLObject wo = WQLObject.getWQLObject("em_bi_devicestatus"); - String device_code = jo.getString("device_code"); - if (!jo.containsKey("need_update_flag")){ + if (ObjectUtil.isNotEmpty(jo.getJSONArray("upload_user"))){ JSONArray rows = jo.getJSONArray("upload_user"); HashMap map = new HashMap<>(); String msg = ""; @@ -73,10 +83,39 @@ public class DeviceStatusServiceImpl implements DeviceStatusService { msg += rows.getString(i); } } - map.put("upload_user",msg); - wo.update(map,"device_code = '"+device_code+"'"); - }else { - wo.update(jo); + jo.put("upload_user",msg); + } + try { + wo.insert(jo); + }catch (Exception e){ + throw new BadRequestException("存在相同的设备编码!"); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(JSONObject jo) { + WQLObject wo = WQLObject.getWQLObject("em_bi_devicestatus"); + String device_code = jo.getString("device_code"); + try { + if (!jo.containsKey("need_update_flag")){ + JSONArray rows = jo.getJSONArray("upload_user"); + HashMap map = new HashMap<>(); + String msg = ""; + for (int i = 0; i < rows.size(); i++) { + if (i!=rows.size()-1){ + msg += rows.getString(i)+","; + }else { + msg += rows.getString(i); + } + } + map.put("upload_user",msg); + wo.update(map,"device_code = '"+device_code+"'"); + }else { + wo.update(jo); + } + }catch (Exception e){ + throw new BadRequestException("存在相同的设备编码!"); } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/StructattrServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/StructattrServiceImpl.java index 522400e7c..c62e6d357 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/StructattrServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/service/impl/StructattrServiceImpl.java @@ -371,8 +371,25 @@ public class StructattrServiceImpl implements StructattrService { 1层:解锁当前点位和2层点位 2层:直接解锁当前点位 */ + + //查询对应的包装关系,如果为需要解绑删除的则删除包装关系 + JSONArray sub_rows = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '"+whereJson.getString("vehicle_code")+"'").getResultJSONArray(0); + for (int i = 0; i < sub_rows.size(); i++) { + JSONObject sub_row = sub_rows.getJSONObject(i); + if (StrUtil.isNotEmpty(sub_row.getString("need_delete")) && sub_row.getString("need_delete").equals("1")){ + WQLObject.getWQLObject("pdm_bi_subpackagerelation").delete(sub_row); + } + } if (StrUtil.equals(jsonPoint.getString("layer_num"), "1")) { JSONObject jsonPoint2 = pointTab.query("device_code = '" + jsonPoint.getString("device_code") + "' and layer_num = '2'").uniqueResult(0); + //查询对应的包装关系,如果为需要解绑删除的则删除包装关系 + JSONArray sub_rows2 = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '"+jsonPoint2.getString("vehicle_code")+"'").getResultJSONArray(0); + for (int i = 0; i < sub_rows2.size(); i++) { + JSONObject sub_row = sub_rows2.getJSONObject(i); + if (StrUtil.isNotEmpty(sub_row.getString("need_delete")) && sub_row.getString("need_delete").equals("1")){ + WQLObject.getWQLObject("pdm_bi_subpackagerelation").delete(sub_row); + } + } jsonPoint2.put("point_status", "1"); jsonPoint2.put("lock_type", "1"); jsonPoint2.put("vehicle_code", ""); 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 581347bf2..ffb33fdda 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 @@ -810,6 +810,9 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { public JSONObject sendDeviceStatus(JSONObject whereJson) { WQLObject wo = WQLObject.getWQLObject("em_bi_devicestatus"); String device_code = whereJson.getString("device_code"); + String device_name = whereJson.getString("device_name"); + String product_area = whereJson.getString("product_area"); + String device_type = whereJson.getString("device_type"); if (StrUtil.isEmpty(device_code)) { log.info("未传入设备号,输入参数为:" + whereJson.toString()); JSONObject result = new JSONObject(); @@ -819,7 +822,23 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } else { JSONObject device = wo.query("device_code = '" + device_code + "'").uniqueResult(0); if (ObjectUtil.isEmpty(device)) { - log.info("未查询到对应的设备:" + device_code); + JSONObject jo = new JSONObject(); + jo.put("device_code",device_code); + jo.put("device_name",device_name); + jo.put("product_area",product_area); + jo.put("device_type",device_type); + jo.put("plan","1"); + jo.put("upload_flag","1"); + if (whereJson.containsKey("mode")) { + jo.put("mode", whereJson.getString("mode")); + jo.put("mode_update_time", DateUtil.now()); + } + if (whereJson.containsKey("error")) { + jo.put("error", whereJson.getString("error")); + jo.put("error_msg", whereJson.getString("error_msg")); + jo.put("error_update_time", DateUtil.now()); + } + wo.insert(jo); } else { HashMap map = new HashMap<>(); if (whereJson.containsKey("mode")) { 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 de5206783..bcb28e7f8 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 @@ -9,16 +9,13 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.checkerframework.checker.units.qual.K; -import org.nl.modules.common.exception.BadRequestException; import org.nl.common.utils.SecurityUtils; - +import org.nl.modules.common.exception.BadRequestException; 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.SpringContextHolder; import org.nl.system.service.param.impl.SysParamServiceImpl; -import org.nl.wms.ext.acs.service.impl.WmsToAcsServiceImpl; import org.nl.wms.ext.mes.service.MesToLmsService; import org.nl.wms.pda.mps.service.InService; import org.nl.wms.pda.mps.service.OutService; @@ -256,7 +253,6 @@ public class MesToLmsServiceImpl implements MesToLmsService { * @return */ @Override - @Transactional(rollbackFor = Exception.class) public JSONObject momRollBakeNextSpecTransfer(JSONObject param) { log.info("momRollBakeNextSpecTransfer接口输入参数为:-------------------" + param.toString()); JSONObject result = new JSONObject(); @@ -320,7 +316,7 @@ public class MesToLmsServiceImpl implements MesToLmsService { jsonParam.put("point_code", point_code); // 调用手持接口 - BakingServiceImpl bakingService = new BakingServiceImpl(); + BakingServiceImpl bakingService = SpringContextHolder.getBean(BakingServiceImpl.class); bakingService.ovenInAndOut(jsonParam); } else { /* @@ -346,7 +342,7 @@ public class MesToLmsServiceImpl implements MesToLmsService { jsonParam.put("container_name", containerName); // 调用手持接口 - BakingServiceImpl bakingService = new BakingServiceImpl(); + BakingServiceImpl bakingService = SpringContextHolder.getBean(BakingServiceImpl.class); bakingService.inCoolIvt(jsonParam); } else { log.info("当前AGV启用参数为否"); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/BakingServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/BakingServiceImpl.java index 42805e610..6e41b54a1 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/BakingServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/BakingServiceImpl.java @@ -57,6 +57,8 @@ public class BakingServiceImpl implements BakingService { @Transactional(rollbackFor = Exception.class) public JSONObject ovenInAndOut(JSONObject whereJson) { + //RedisUtils redisUtils = SpringContextHolder.getBean(RedisUtils.class); + String option = whereJson.getString("option"); // 1-入箱 2-出箱 WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); // 点位表 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/wql/PDA_OVENINANDOUT_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/wql/PDA_OVENINANDOUT_01.wql index 7098539c1..21d14871d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/wql/PDA_OVENINANDOUT_01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/wql/PDA_OVENINANDOUT_01.wql @@ -86,7 +86,7 @@ point_code FROM SCH_BASE_Point po - LEFT JOIN sch_base_task task ON task.point_code1 = po.point_code + LEFT JOIN sch_base_task task ON task.point_code2 = po.point_code AND task.task_status < '07' AND task.is_delete = '0' WHERE @@ -112,7 +112,7 @@ point_code FROM SCH_BASE_Point po - LEFT JOIN sch_base_task task ON task.point_code1 = po.point_code + LEFT JOIN sch_base_task task ON task.point_code3 = po.point_code AND task.task_status < '07' AND task.is_delete = '0' WHERE diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/ProductInstorServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/ProductInstorServiceImpl.java index 2f0e33914..bc495abfa 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/ProductInstorServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/ProductInstorServiceImpl.java @@ -402,6 +402,15 @@ public class ProductInstorServiceImpl implements ProductInstorService { if (ObjectUtil.isEmpty(json)) throw new BadRequestException("木箱不存在或任务不存在!"); + //查询对应的包装关系,如果为需要解绑删除的则删除包装关系 + JSONArray sub_rows = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '"+vehicle_code+"'").getResultJSONArray(0); + for (int i = 0; i < sub_rows.size(); i++) { + JSONObject sub_row = sub_rows.getJSONObject(i); + if (StrUtil.isNotEmpty(sub_row.getString("need_delete")) && sub_row.getString("need_delete").equals("1")){ + WQLObject.getWQLObject("pdm_bi_subpackagerelation").delete(sub_row); + } + } + // 下发给acs JSONObject jsonParam = new JSONObject(); jsonParam.put("device_code", json.getString("point_code2")); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/ProductionOutServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/ProductionOutServiceImpl.java index 6dc856523..49acf6c2b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/ProductionOutServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/impl/ProductionOutServiceImpl.java @@ -64,8 +64,26 @@ public class ProductionOutServiceImpl implements ProductionOutService { 1层:解锁当前点位和2层点位 2层:直接解锁当前点位 */ + + //查询对应的包装关系,如果为需要解绑删除的则删除包装关系 + JSONArray sub_rows = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '"+box_no+"'").getResultJSONArray(0); + for (int i = 0; i < sub_rows.size(); i++) { + JSONObject sub_row = sub_rows.getJSONObject(i); + if (StrUtil.isNotEmpty(sub_row.getString("need_delete")) && sub_row.getString("need_delete").equals("1")){ + WQLObject.getWQLObject("pdm_bi_subpackagerelation").delete(sub_row); + } + } + if (StrUtil.equals(jsonPoint.getString("layer_num"), "1")) { JSONObject jsonPoint2 = pointTab.query("device_code = '" + jsonPoint.getString("device_code") + "' and layer_num = '2'").uniqueResult(0); + //查询对应的包装关系,如果为需要解绑删除的则删除包装关系 + JSONArray sub_rows2 = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '"+jsonPoint2.getString("vehicle_code")+"'").getResultJSONArray(0); + for (int i = 0; i < sub_rows2.size(); i++) { + JSONObject sub_row = sub_rows2.getJSONObject(i); + if (StrUtil.isNotEmpty(sub_row.getString("need_delete")) && sub_row.getString("need_delete").equals("1")){ + WQLObject.getWQLObject("pdm_bi_subpackagerelation").delete(sub_row); + } + } jsonPoint2.put("point_status", "1"); jsonPoint2.put("lock_type", "1"); jsonPoint2.put("vehicle_code", ""); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/em.xls b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/em.xls index 59e3a4fd214cd01dca74251f962967f59d75c177..fe344c19dbd89f7158db6d057ef2c0c954e8e70d 100644 GIT binary patch delta 5536 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 Je@z9Y`QII};7tGk delta 4412 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 AzyJUM delta 7083 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 0) { + for (String s : split) { + JSONObject jo = new JSONObject(); + jo.put("User", s); + UserList.add(jo); + } + } else { + return; + } + for (int i = 0; i < send_rows.size(); i++) { + JSONObject row = send_rows.getJSONObject(i); + String bill_code = row.getString("bill_code"); + String Message = "出库单号为:" + bill_code + "的单据还未填写必填的发货信息并回传SAP,请及时回传!"; + JSONObject jo = new JSONObject(); + jo.put("SendType", "L"); + jo.put("Title", "发货信息填写"); + jo.put("WarnType", "string"); + jo.put("MessageType", "P"); + jo.put("UserList", UserList); + jo.put("Message", Message); + + String url = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("FEISHU_URL").getValue(); + String api = "/FeiShuNoticesWebApi/CommunalApi"; + url = url + api; + try { + String resultMsg = HttpRequest.post(url) + .body(String.valueOf(jo)) + .execute().body(); + log.info("飞书输入参数为:-------------------" + jo); + log.info("飞书输出参数为:-------------------" + resultMsg); + } catch (Exception e) { + log.info(e.getMessage()); + } + } + + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoQueryUpload.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoQueryUpload.java new file mode 100644 index 000000000..281da7a4e --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoQueryUpload.java @@ -0,0 +1,79 @@ +package org.nl.wms.sch.manage; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.system.service.param.impl.SysParamServiceImpl; +import org.springframework.stereotype.Component; + +import java.util.HashMap; + +@Slf4j +@Component +@RequiredArgsConstructor +public class AutoQueryUpload { + public void run() { + //查询已经处于分配中、分配完但还未回传给MES的销售出库单 + WQLObject wo = WQLObject.getWQLObject("st_ivt_iostorinv"); + JSONArray send_rows = wo.query("mst.bill_type = '1001' AND mst.bill_status IN ( '30', '40' ) AND mst.stor_code = 'CP01' AND upload_mes = '0' AND is_delete = '0'").getResultJSONArray(0); + this.sendInfo(send_rows); + } + + void sendInfo(JSONArray send_rows) { + WQLObject wo = WQLObject.getWQLObject("em_bi_devicestatus"); + String device_code = "UPLOAD_INFO"; + JSONObject device_jo = wo.query("device_code = '" + device_code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(device_jo.getString("upload_user"))) { + return; + } + String upload_user = device_jo.getString("upload_user"); + String[] split = upload_user.split(","); + JSONArray UserList = new JSONArray(); + if (split.length > 0) { + for (String s : split) { + JSONObject jo = new JSONObject(); + jo.put("User", s); + UserList.add(jo); + } + } else { + return; + } + for (int i = 0; i < send_rows.size(); i++) { + JSONObject row = send_rows.getJSONObject(i); + String bill_code = row.getString("bill_code"); + String Message = "出库单号为:" + bill_code + "的单据还未进行质量报告回传,请及时回传!"; + JSONObject jo = new JSONObject(); + jo.put("SendType", "L"); + jo.put("Title", "质量报告回传信息"); + jo.put("WarnType", "string"); + jo.put("MessageType", "P"); + jo.put("UserList", UserList); + jo.put("Message", Message); + + String url = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("FEISHU_URL").getValue(); + String api = "/FeiShuNoticesWebApi/CommunalApi"; + url = url + api; + try { + String resultMsg = HttpRequest.post(url) + .body(String.valueOf(jo)) + .execute().body(); + log.info("飞书输入参数为:-------------------" + jo); + log.info("飞书输出参数为:-------------------" + resultMsg); + HashMap map = new HashMap<>(); + map.put("is_upload", "1"); + map.put("upload_time", DateUtil.now()); + wo.update(map, "device_code = '" + device_code + "'"); + } catch (Exception e) { + log.info(e.getMessage()); + } + } + + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoSendFeiShu.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoSendFeiShu.java index 2e46d219d..6d08fef08 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoSendFeiShu.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoSendFeiShu.java @@ -30,12 +30,12 @@ public class AutoSendFeiShu { WQLObject wo = WQLObject.getWQLObject("em_bi_devicestatus"); //查询故障了还未发送的 - JSONArray send_rows = wo.query("error = '1' AND is_upload = '0' AND upload_flag = '1'").getResultJSONArray(0); + JSONArray send_rows = wo.query("error > '0' AND is_upload = '0' AND upload_flag = '1'").getResultJSONArray(0); this.sendInfo(send_rows); //查询已经发送了但是还是故障中的 - String resend_time = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("FEISHU_URL").getValue(); - JSONArray resend_rows = wo.query("error = '1' AND is_upload = '1' AND upload_flag = '1' AND TIMESTAMPDIFF(MINUTE,upload_time,NOW()) > " + resend_time).getResultJSONArray(0); + String resend_time = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("RESEND_TIME").getValue(); + JSONArray resend_rows = wo.query("error > '0' AND is_upload = '1' AND upload_flag = '1' AND TIMESTAMPDIFF(MINUTE,upload_time,NOW()) > " + resend_time).getResultJSONArray(0); this.sendInfo(resend_rows); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java index 567e24d00..9314e6035 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java @@ -4344,8 +4344,17 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { JSONArray dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + iostorinv_id + "'").getResultJSONArray(0); for (int i = 0; i < dis_rows.size(); i++) { JSONObject dis_row = dis_rows.getJSONObject(i); + String sect_code = dis_row.getString("sect_code"); + //如果是虚拟区的出库,直接把包装关系删除;如果为立库的包装关系,将解绑删除标识置为1。当发货区解绑时,删除包装关系 String pcsn = dis_row.getString("pcsn"); - WQLObject.getWQLObject("pdm_bi_subpackagerelation").delete("container_name = '"+pcsn+"'"); + if (sect_code.equals("XN01")){ + WQLObject.getWQLObject("pdm_bi_subpackagerelation").delete("container_name = '"+pcsn+"'"); + }else { + HashMap map = new HashMap<>(); + map.put("need_delete","1"); + WQLObject.getWQLObject("pdm_bi_subpackagerelation").update(map,"container_name = '"+pcsn+"'"); + } + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/stat/service/impl/InBillQueryServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/stat/service/impl/InBillQueryServiceImpl.java index 98182133d..fe4b1c664 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/stat/service/impl/InBillQueryServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/stat/service/impl/InBillQueryServiceImpl.java @@ -216,17 +216,17 @@ public class InBillQueryServiceImpl implements InBillQueryService { }else { mp.put("木箱规格/尺寸", ""); } - mp.put("毛重合计", NumberUtil.round(json.getString("box_weight"), 1)); - mp.put("净重(KG)", NumberUtil.round(json.getString("net_weight"), 1)); + mp.put("毛重合计", NumberUtil.round(StrUtil.isEmpty(json.getString("box_weight")) ? "0" : json.getString("box_weight"), 1)); + mp.put("净重(KG)", NumberUtil.round(StrUtil.isEmpty(json.getString("net_weight")) ? "0" : json.getString("net_weight"), 1)); mp.put("卷数", json.getString("quanlity_in_box")); mp.put("品级", "A"); mp.put("小卷号", json.getString("pcsn")); mp.put("箱号", json.getString("box_no")); mp.put("母卷号", json.getString("parent_container_name")); - mp.put("基重(g/m³)(面密度)", NumberUtil.round(json.getString("mass_per_unit_area"), 2)); + mp.put("基重(g/m³)(面密度)", NumberUtil.round(StrUtil.isEmpty(json.getString("mass_per_unit_area")) ? "0" : json.getString("mass_per_unit_area"), 1)); mp.put("居中度(mm)", "±1"); mp.put("塌边(mm)", "≤10"); - mp.put("米数(长度)", NumberUtil.round(json.getString("length"), 1)); + mp.put("米数(长度)", NumberUtil.round(StrUtil.isEmpty(json.getString("length")) ? "0" : json.getString("length"), 1)); mp.put("生产实际抗拉值", json.getString("actual_value")); mp.put("内控标准抗拉下限", json.getString("standard_limit")); mp.put("客户需求抗拉下限", json.getString("demand_limit")); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/stat/wql/ST_IVT_INBILLQUERY.wql b/lms/nladmin-system/src/main/java/org/nl/wms/stat/wql/ST_IVT_INBILLQUERY.wql index a92ccada8..597ec1d50 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/stat/wql/ST_IVT_INBILLQUERY.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/stat/wql/ST_IVT_INBILLQUERY.wql @@ -100,22 +100,19 @@ FROM ( - SELECT - pcsn, - MAX(iostorinv_id) AS iostorinv_id, - MAX(sect_id) AS sect_id, - MAX(material_id) AS material_id, - MAX(box_no) AS box_no, - MAX(sect_name) AS sect_name, - MAX(struct_code) AS struct_code, - MAX(struct_name) AS struct_name, - MAX(qty_unit_name) AS qty_unit_name - FROM - st_ivt_iostorinvdis - WHERE - 1 = 1 - GROUP BY pcsn - ) AS dis + SELECT + MIN( a.iostorinvdis_id ) AS iostorinvdis_id + FROM + st_ivt_iostorinvdis a + LEFT JOIN st_ivt_iostorinv b ON a.iostorinv_id = b.iostorinv_id + WHERE + b.io_type = '0' + AND b.bill_type = 输入.bill_type + AND b.bill_status = '99' + GROUP BY + pcsn + ) AS c + LEFT JOIN st_ivt_iostorinvdis dis ON dis.iostorinvdis_id = c.iostorinvdis_id LEFT JOIN st_ivt_iostorinv mst ON mst.iostorinv_id = dis.iostorinv_id LEFT JOIN st_ivt_sectattr sect ON sect.sect_id = dis.sect_id LEFT JOIN md_me_materialbase mater ON mater.material_id = dis.material_id @@ -213,23 +210,20 @@ END AS confirm_time_class FROM - ( - SELECT - pcsn, - MAX(iostorinv_id) AS iostorinv_id, - MAX(sect_id) AS sect_id, - MAX(material_id) AS material_id, - MAX(box_no) AS box_no, - MAX(sect_name) AS sect_name, - MAX(struct_code) AS struct_code, - MAX(struct_name) AS struct_name, - MAX(qty_unit_name) AS qty_unit_name - FROM - st_ivt_iostorinvdis - WHERE - 1 = 1 - GROUP BY pcsn - ) AS dis + ( + SELECT + MIN( a.iostorinvdis_id ) AS iostorinvdis_id + FROM + st_ivt_iostorinvdis a + LEFT JOIN st_ivt_iostorinv b ON a.iostorinv_id = b.iostorinv_id + WHERE + b.io_type = '0' + AND b.bill_type = 输入.bill_type + AND b.bill_status = '99' + GROUP BY + pcsn + ) AS c + LEFT JOIN st_ivt_iostorinvdis dis ON dis.iostorinvdis_id = c.iostorinvdis_id LEFT JOIN st_ivt_iostorinv mst ON mst.iostorinv_id = dis.iostorinv_id LEFT JOIN st_ivt_sectattr sect ON sect.sect_id = dis.sect_id LEFT JOIN md_me_materialbase mater ON mater.material_id = dis.material_id @@ -343,22 +337,19 @@ FROM ( - SELECT - pcsn, - MAX(iostorinv_id) AS iostorinv_id, - MAX(sect_id) AS sect_id, - MAX(material_id) AS material_id, - MAX(box_no) AS box_no, - MAX(sect_name) AS sect_name, - MAX(struct_code) AS struct_code, - MAX(struct_name) AS struct_name, - MAX(qty_unit_name) AS qty_unit_name - FROM - st_ivt_iostorinvdis - WHERE - 1 = 1 - GROUP BY pcsn - ) AS dis + SELECT + MIN( a.iostorinvdis_id ) AS iostorinvdis_id + FROM + st_ivt_iostorinvdis a + LEFT JOIN st_ivt_iostorinv b ON a.iostorinv_id = b.iostorinv_id + WHERE + b.io_type = '0' + AND b.bill_type = 输入.bill_type + AND b.bill_status = '99' + GROUP BY + pcsn + ) AS c + LEFT JOIN st_ivt_iostorinvdis dis ON dis.iostorinvdis_id = c.iostorinvdis_id LEFT JOIN st_ivt_iostorinv mst ON mst.iostorinv_id = dis.iostorinv_id LEFT JOIN st_ivt_sectattr sect ON sect.sect_id = dis.sect_id LEFT JOIN md_me_materialbase mater ON mater.material_id = dis.material_id @@ -459,22 +450,19 @@ FROM ( - SELECT - pcsn, - MAX(iostorinv_id) AS iostorinv_id, - MAX(sect_id) AS sect_id, - MAX(material_id) AS material_id, - MAX(box_no) AS box_no, - MAX(sect_name) AS sect_name, - MAX(struct_code) AS struct_code, - MAX(struct_name) AS struct_name, - MAX(qty_unit_name) AS qty_unit_name - FROM - st_ivt_iostorinvdis - WHERE - 1 = 1 - GROUP BY pcsn - ) AS dis + SELECT + MIN( a.iostorinvdis_id ) AS iostorinvdis_id + FROM + st_ivt_iostorinvdis a + LEFT JOIN st_ivt_iostorinv b ON a.iostorinv_id = b.iostorinv_id + WHERE + b.io_type = '0' + AND b.bill_type = 输入.bill_type + AND b.bill_status = '99' + GROUP BY + pcsn + ) AS c + LEFT JOIN st_ivt_iostorinvdis dis ON dis.iostorinvdis_id = c.iostorinvdis_id LEFT JOIN st_ivt_iostorinv mst ON mst.iostorinv_id = dis.iostorinv_id LEFT JOIN st_ivt_sectattr sect ON sect.sect_id = dis.sect_id LEFT JOIN md_me_materialbase mater ON mater.material_id = dis.material_id diff --git a/lms/nladmin-ui/src/views/wms/agvrush/devicestatus/index.vue b/lms/nladmin-ui/src/views/wms/agvrush/devicestatus/index.vue index 9dcc5e37c..eb15eff94 100644 --- a/lms/nladmin-ui/src/views/wms/agvrush/devicestatus/index.vue +++ b/lms/nladmin-ui/src/views/wms/agvrush/devicestatus/index.vue @@ -2,36 +2,143 @@
- - + + + + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - + + + + + + + + + + - + - +
@@ -140,6 +247,24 @@ export default { permission: {}, classes: [], userList: [], + agvRegionList: [ + { 'label': 'A1', 'value': 'A1' }, + { 'label': 'A2', 'value': 'A2' }, + { 'label': 'A3', 'value': 'A3' }, + { 'label': 'A4', 'value': 'A4' }, + { 'label': 'LK', 'value': 'LK' } + ], + isOrNot: [ + { 'label': '否', 'value': '0' }, + { 'label': '是', 'value': '1' } + ], + deviceType: [ + { 'label': '输送线', 'value': '1' }, + { 'label': 'RGV', 'value': '2' }, + { 'label': '四向车', 'value': '3' }, + { 'label': 'AGV', 'value': '4' }, + { 'label': '其他', 'value': '5' } + ], rules: {} } }, @@ -150,7 +275,12 @@ export default { }, [CRUD.HOOK.afterToCU](crud, form) { this.getUserList() - form.upload_user = form.upload_user.split(',') + debugger + if (form.upload_user && form.upload_user !== '') { + form.upload_user = form.upload_user.split(',') + } else { + form.upload_user = null + } }, // 改变状态 getUserList() { @@ -158,6 +288,41 @@ export default { this.userList = res }) }, + typeFormatter(row) { + if (row.device_type === '1') { + return '输送线' + } else if (row.device_type === '2') { + return 'RGV' + } else if (row.device_type === '3') { + return '四向车' + } else if (row.device_type === '4') { + return 'AGV' + } else if (row.device_type === '5') { + return '其他' + } else { + return '' + } + }, + modeFormatter(row) { + if (row.mode === '0') { + return '脱机' + } else if (row.mode === '2') { + return '待机' + } else if (row.mode === '3') { + return '运行中' + } else { + return '' + } + }, + erroFormatter(row) { + if (row.error === '0') { + return '无故障' + } else if (row.error > 0) { + return '故障中' + } else { + return '' + } + }, changeEnabled(data, val) { this.$confirm('此操作将 "' + this.dict.label.is_used[val] + '" ' + data.device_code + ', 是否继续?', '提示', { confirmButtonText: '确定', diff --git a/lms/nladmin-ui/src/views/wms/st/outbill/index.vue b/lms/nladmin-ui/src/views/wms/st/outbill/index.vue index 640439d7e..07dcd76a1 100644 --- a/lms/nladmin-ui/src/views/wms/st/outbill/index.vue +++ b/lms/nladmin-ui/src/views/wms/st/outbill/index.vue @@ -200,6 +200,7 @@ :disabled="confirm_flag" icon="el-icon-check" size="mini" + v-permission="permission.confirm" @click="confirm" > 强制确认 @@ -347,7 +348,8 @@ export default { permission: { add: ['admin', 'checkoutbill:add'], edit: ['admin', 'checkoutbill:edit'], - del: ['admin', 'checkoutbill:del'] + del: ['admin', 'checkoutbill:del'], + confirm: ['admin', 'checkoutbill:confirm'] }, openMoneyDialog: false, loadingConfirm: false,