From 4ba04da9c5c94748055c8dbb51247e5a96db586d Mon Sep 17 00:00:00 2001 From: liuxy Date: Fri, 21 Apr 2023 17:38:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/nl/AppRun.java | 4 +- .../master/rest/FaultDeviceController.java | 79 +++++ .../master/service/FaultDeviceService.java | 78 +++++ .../service/impl/FaultDeviceServiceImpl.java | 254 ++++++++++++++ .../wms/basedata/master/wql/QMD_BI_FAULT.wql | 92 ++++++ .../service/impl/StructattrServiceImpl.java | 17 +- .../wms/ext/acs/rest/AcsToWmsController.java | 10 +- .../wms/ext/acs/rest/WmsToAcsController.java | 14 + .../wms/ext/acs/service/AcsToWmsService.java | 5 + .../wms/ext/acs/service/WmsToAcsService.java | 13 + .../acs/service/impl/AcsToWmsServiceImpl.java | 139 +++++++- .../acs/service/impl/WmsToAcsServiceImpl.java | 93 +++++- .../pda/st/rest/ProductInstorController.java | 7 + .../pda/st/rest/ProductionOutController.java | 20 +- .../pda/st/service/ProductInstorService.java | 2 + .../pda/st/service/ProductionOutService.java | 16 +- .../impl/ProductInstorServiceImpl.java | 41 +++ .../impl/ProductionOutServiceImpl.java | 77 +++-- .../nl/wms/pda/st/wql/PDA_PRODUVTIONOUT.wql | 173 ++++++++-- .../java/org/nl/wms/pda/st/wql/PDA_ST_01.wql | 26 ++ .../src/main/java/org/nl/wms/pdm/wql/em.xls | Bin 158720 -> 203776 bytes .../main/java/org/nl/wms/sch/AcsTaskDto.java | 4 + .../org/nl/wms/sch/tasks/SendOutTask.java | 21 +- .../wms/st/inbill/wql/QST_ACSTOLMSTYPE4.wql | 27 +- .../st/inbill/wql/QST_IVT_RAWASSISTISTOR.wql | 2 +- .../service/impl/CheckOutBillServiceImpl.java | 133 +++++++- .../src/views/wms/agvrush/charge/index.vue | 2 +- .../views/wms/agvrush/devicecharge/index.vue | 193 +++++++++++ .../wms/basedata/master/customer/index.vue | 15 +- .../master/faultdevice/faultdevice.js | 42 +++ .../wms/basedata/master/faultdevice/index.vue | 211 ++++++++++++ .../src/views/wms/sendout/outtwo/index.vue | 312 ++++++++++++++++++ .../src/views/wms/st/outbill/DivDialog.vue | 9 +- 33 files changed, 2030 insertions(+), 101 deletions(-) create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/FaultDeviceController.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/FaultDeviceService.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/FaultDeviceServiceImpl.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_BI_FAULT.wql create mode 100644 lms/nladmin-ui/src/views/wms/agvrush/devicecharge/index.vue create mode 100644 lms/nladmin-ui/src/views/wms/basedata/master/faultdevice/faultdevice.js create mode 100644 lms/nladmin-ui/src/views/wms/basedata/master/faultdevice/index.vue create mode 100644 lms/nladmin-ui/src/views/wms/sendout/outtwo/index.vue diff --git a/lms/nladmin-system/src/main/java/org/nl/AppRun.java b/lms/nladmin-system/src/main/java/org/nl/AppRun.java index 01c57210e..25000752d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/AppRun.java +++ b/lms/nladmin-system/src/main/java/org/nl/AppRun.java @@ -201,7 +201,7 @@ public class AppRun { int nodeSizeH = 50; for (int i = 1; i <= 4; i++) { - JSONArray resultJSONArray = attrTab.query("col_num = '" + i + "' and point_type = '9' and layer_num = '1' order by row_num ASC").getResultJSONArray(0); + JSONArray resultJSONArray = attrTab.query("col_num = '" + i + "' and point_type = '9' and layer_num = '2' order by row_num ASC").getResultJSONArray(0); for (int j = 0; j < resultJSONArray.size(); j++) { JSONObject json = resultJSONArray.getJSONObject(j); @@ -229,7 +229,7 @@ public class AppRun { } save.put("nodes", nodes); save.put("edges", edges); - JSONObject jsonObject = stageTab.query("stage_code = 'FS'").uniqueResult(0); + JSONObject jsonObject = stageTab.query("stage_code = 'FS_2'").uniqueResult(0); jsonObject.put("stage_data", save); stageTab.update(jsonObject); return "Backend service started successfully"; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/FaultDeviceController.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/FaultDeviceController.java new file mode 100644 index 000000000..8287fbab3 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/rest/FaultDeviceController.java @@ -0,0 +1,79 @@ + +package org.nl.wms.basedata.master.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.basedata.master.service.FaultDeviceService; +import org.nl.wms.basedata.master.service.dto.CustomerbaseDto; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +/** + * @author liuxy + * @date 2023-04-20 + **/ +@RestController +@RequiredArgsConstructor +@Api(tags = "设备故处理") +@RequestMapping("/api/faultdevice") +@Slf4j +public class FaultDeviceController { + + private final FaultDeviceService faultDeviceService; + + @GetMapping + @Log("查询设备故障处理表") + @ApiOperation("查询设备故障处理表") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(faultDeviceService.queryAll(whereJson, page), HttpStatus.OK); + } + + @GetMapping("/deviceCharge") + @Log("查询说有设备故障") + @ApiOperation("查询说有设备故障") + public ResponseEntity queryDeviceAll(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(faultDeviceService.queryDeviceAll(whereJson, page), HttpStatus.OK); + } + + @PostMapping + @Log("新增设备故障处理表") + @ApiOperation("新增设备故障处理表") + public ResponseEntity create(@Validated @RequestBody CustomerbaseDto dto) { + faultDeviceService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改设备故障处理表") + @ApiOperation("修改设备故障处理表") + public ResponseEntity update(@RequestBody JSONObject whereJson) { + faultDeviceService.update(whereJson); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除设备故障处理表") + @ApiOperation("删除设备故障处理表") + @DeleteMapping + public ResponseEntity delete(@RequestBody Long[] ids) { + faultDeviceService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("同步信息") + @ApiOperation("同步信息") + @PostMapping("/syncInfo") + public ResponseEntity syncInfo() { + faultDeviceService.syncInfo(); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/FaultDeviceService.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/FaultDeviceService.java new file mode 100644 index 000000000..145486056 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/FaultDeviceService.java @@ -0,0 +1,78 @@ + +package org.nl.wms.basedata.master.service; + +import com.alibaba.fastjson.JSONObject; +import org.nl.wms.basedata.master.service.dto.CustomerbaseDto; +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; + +/** + * @description 服务接口 + * @author liuxy + * @date 2023-04-20 + **/ +public interface FaultDeviceService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryDeviceAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param cust_id ID + * @return Customerbase + */ + CustomerbaseDto findById(Long cust_id); + + /** + * 根据编码查询 + * @param code code + * @return Customerbase + */ + CustomerbaseDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(CustomerbaseDto dto); + + /** + * 编辑 + * @param whereJson / + */ + void update(JSONObject whereJson); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(Long[] ids); + + /** + * 同步信息 + */ + void syncInfo(); +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/FaultDeviceServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/FaultDeviceServiceImpl.java new file mode 100644 index 000000000..11cbc6ddc --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/service/impl/FaultDeviceServiceImpl.java @@ -0,0 +1,254 @@ + +package org.nl.wms.basedata.master.service.impl; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +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.common.utils.PageUtil; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.SpringContextHolder; +import org.nl.modules.wql.util.WqlUtil; +import org.nl.wms.basedata.master.service.FaultDeviceService; +import org.nl.wms.basedata.master.service.dto.CustomerbaseDto; +import org.nl.wms.ext.acs.service.impl.WmsToAcsServiceImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @author liuxy + * @description 服务实现 + * @date 2023-04-20 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class FaultDeviceServiceImpl implements FaultDeviceService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String fault_code = MapUtil.getStr(whereJson, "fault_code"); + String fault_type = MapUtil.getStr(whereJson, "fault_type"); + + JSONObject map = new JSONObject(); + map.put("flag","1"); + map.put("fault_code",fault_code); + map.put("fault_type",fault_type); + + JSONObject json = WQL.getWO("QMD_BI_FAULT").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "update_time DESC"); + + return json; + } + + @Override + public Map queryDeviceAll(Map whereJson, Pageable page) { + WQLObject faultTab = WQLObject.getWQLObject("EM_BI_FaultDisposeDevice"); + + String device_code = MapUtil.getStr(whereJson, "device_code"); + String is_fault = MapUtil.getStr(whereJson, "is_fault"); + String region_code = MapUtil.getStr(whereJson, "region_code"); + String plant_code = MapUtil.getStr(whereJson, "plant_code"); + + JSONObject param = new JSONObject(); + if (ObjectUtil.isNotEmpty(device_code)) { + param.put("device_code",device_code); + } + + // 调用acs接口获取设备 + JSONObject result = SpringContextHolder.getBean(WmsToAcsServiceImpl.class).realTimefaultInfo(param); + JSONArray data = result.getJSONArray("data"); + + // 根据入参处理对应数据 + ArrayList objects = new ArrayList<>(); + + for (int i = 0; i < data.size(); i++) { + JSONObject json = data.getJSONObject(i); + + JSONObject map = new JSONObject(); + map.put("flag", "2"); + map.put("region_code", region_code); + map.put("plant_code", plant_code); + map.put("device_code", json.getString("device_code")); + + JSONObject jsonDevice = WQL.getWO("QMD_BI_FAULT").addParamMap(map).process().uniqueResult(0); + + if (ObjectUtil.isEmpty(jsonDevice)) continue; + + // 获取报警码 + JSONObject jsonFault = faultTab.query("fault_type = '" + json.getString("fault_type") + "' and fault_code = '" + json.getString("fault_code") + "'").uniqueResult(0); + + if (ObjectUtil.isNotEmpty(jsonFault)) { + jsonDevice.put("fault_code", jsonFault.getString("fault_code")); + jsonDevice.put("fault_info", jsonFault.getString("fault_info")); + jsonDevice.put("fault_type", jsonFault.getString("fault_type")); + jsonDevice.put("solve_mode", jsonFault.getString("solve_mode")); + } + + // 判断是否异常 + if (!StrUtil.equals(json.getString("fault_code"),"0")) { + jsonDevice.put("is_fault", "1"); + } else { + jsonDevice.put("is_fault", "0"); + } + + if (StrUtil.equals(is_fault, "1")) { + if (!StrUtil.equals(json.getString("fault_code"),"0")) { + objects.add(jsonDevice); + } + } else if (StrUtil.equals(is_fault, "0")) { + if (StrUtil.equals(json.getString("fault_code"),"0")) { + objects.add(jsonDevice); + } + } else { + objects.add(jsonDevice); + } + + } + + // 组织分页查询并返回 + Map json = PageUtil.toPage( + PageUtil.toPage(page.getPageNumber(), page.getPageSize(), objects), + objects.size() + ); + + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("md_cs_customerbase"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = arr.toJavaList(CustomerbaseDto.class); + return list; + } + + @Override + public CustomerbaseDto findById(Long cust_id) { + WQLObject wo = WQLObject.getWQLObject("md_cs_customerbase"); + JSONObject json = wo.query("cust_id =" + cust_id + "").uniqueResult(0); + if (ObjectUtil.isEmpty(json)) return null; + final CustomerbaseDto obj = json.toJavaObject(CustomerbaseDto.class); + return obj; + } + + @Override + public CustomerbaseDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("md_cs_customerbase"); + JSONObject json = wo.query("cust_code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(json)) return null; + final CustomerbaseDto obj = json.toJavaObject(CustomerbaseDto.class); + return obj; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(CustomerbaseDto dto) { + String cust_code = dto.getCust_code(); + CustomerbaseDto customerbaseDto = this.findByCode(cust_code); + if (customerbaseDto != null && customerbaseDto.getIs_delete().equals("0")) { + throw new BadRequestException("存在相同的客户编号"); + } + + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + dto.setCust_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + + WQLObject wo = WQLObject.getWQLObject("md_cs_customerbase"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(JSONObject whereJson) { + WQLObject faultTab = WQLObject.getWQLObject("EM_BI_FaultDisposeDevice"); + + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + whereJson.put("update_id",currentUserId); + whereJson.put("update_name",nickName); + whereJson.put("update_time",DateUtil.now()); + faultTab.update(whereJson); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + String now = DateUtil.now(); + + WQLObject wo = WQLObject.getWQLObject("md_cs_customerbase"); + for (Long cust_id : ids) { + JSONObject param = new JSONObject(); + param.put("cust_id", String.valueOf(cust_id)); + param.put("is_delete", "1"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(param); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void syncInfo() { + WQLObject faultTab = WQLObject.getWQLObject("EM_BI_FaultDisposeDevice"); + String currentUserId = SecurityUtils.getCurrentUserId(); + String nickName = SecurityUtils.getCurrentNickName(); + + // 调用acs接口获取信息 + JSONObject json = SpringContextHolder.getBean(WmsToAcsServiceImpl.class).syncfaultInfo(); + + JSONArray data = json.getJSONArray("data"); + + for (int i = 0; i < data.size(); i++) { + JSONObject jsonDtl = data.getJSONObject(i); + + JSONObject jsonFault = faultTab.query("fault_code = '" + jsonDtl.getString("fault_code") + "' and fault_type = '" + jsonDtl.getString("fault_type") + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonFault)) { + jsonFault.put("fault_info",jsonDtl.getString("fault_info")); + jsonFault.put("create_id",currentUserId); + jsonFault.put("create_name",nickName); + jsonFault.put("create_time",DateUtil.now()); + jsonFault.put("update_id",currentUserId); + jsonFault.put("update_name",nickName); + jsonFault.put("update_time",DateUtil.now()); + faultTab.update(jsonFault); + } else { + jsonDtl.put("fault_id", IdUtil.getSnowflake(1,1).nextId()); + jsonDtl.put("create_id",currentUserId); + jsonDtl.put("create_name",nickName); + jsonDtl.put("create_time",DateUtil.now()); + jsonDtl.put("update_id",currentUserId); + jsonDtl.put("update_name",nickName); + jsonDtl.put("update_time",DateUtil.now()); + faultTab.insert(jsonDtl); + } + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_BI_FAULT.wql b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_BI_FAULT.wql new file mode 100644 index 000000000..1bc5da646 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/master/wql/QMD_BI_FAULT.wql @@ -0,0 +1,92 @@ +[交易说明] + 交易名: 故障分页查询 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.fault_code TYPEAS s_string + 输入.fault_type TYPEAS s_string + 输入.region_code TYPEAS s_string + 输入.plant_code TYPEAS s_string + 输入.device_code TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + * + FROM + EM_BI_FaultDisposeDevice + WHERE + 1 = 1 + + OPTION 输入.fault_code <> "" + fault_code = 输入.fault_code + ENDOPTION + + OPTION 输入.fault_type <> "" + fault_type = 输入.fault_type + ENDOPTION + + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + * + FROM + EM_BI_MonitorDevice + WHERE + is_crux = '1' + + OPTION 输入.region_code <> "" + region_code = 输入.region_code + ENDOPTION + + OPTION 输入.plant_code <> "" + plant_code = 输入.plant_code + ENDOPTION + + OPTION 输入.device_code <> "" + device_code = 输入.device_code + ENDOPTION + + ENDSELECT + ENDQUERY + ENDIF + + + 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 b03984dbc..72ec5e9c8 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 @@ -336,12 +336,23 @@ public class StructattrServiceImpl implements StructattrService { String point_code = whereJson.getString("point_code"); JSONObject jsonPoint = pointTab.query("point_code = '" + point_code + "'").uniqueResult(0); + /* + 判断点位是第几层 + 1层:解锁当前点位和2层点位 + 2层:直接解锁当前点位 + */ + if (StrUtil.equals(jsonPoint.getString("layer_num"), "1")) { + JSONObject jsonPoint2 = pointTab.query("device_code = '" + jsonPoint.getString("device_code") + "' and layer_num = '2'").uniqueResult(0); + jsonPoint2.put("point_status", "1"); + jsonPoint2.put("lock_type", "1"); + jsonPoint2.put("vehicle_code", ""); + pointTab.update(jsonPoint2); + } + jsonPoint.put("point_status", "1"); - jsonPoint.put("vehicle_code", ""); jsonPoint.put("lock_type", "1"); - + jsonPoint.put("vehicle_code", ""); pointTab.update(jsonPoint); - return null; } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java index eb87b30e4..58c77b292 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java @@ -91,11 +91,19 @@ public class AcsToWmsController { @Log(value = "仓位初始化", isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LMS) @ApiOperation("仓位初始化") @SaIgnore - public ResponseEntity initialize(@RequestBody JSONObject json) { acsToWmsService.initialize(json); return new ResponseEntity<>(HttpStatus.OK); } + @PostMapping("/initPoint") + @Log(value = "点位初始化", isInterfaceLog = true,interfaceLogType= InterfaceLogType.ACS_TO_LMS) + @ApiOperation("点位初始化") + @SaIgnore + public ResponseEntity initPoint() { + acsToWmsService.initPoint(); + return new ResponseEntity<>(HttpStatus.OK); + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java index a8b3c735d..28fd0b785 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java @@ -125,5 +125,19 @@ public class WmsToAcsController { return new ResponseEntity<>(wmsToAcsService.sendAgvChargeTask(jo), HttpStatus.OK); } + @PostMapping("/syncfaultInfo") + @Log(value = "LMS同步ACS报警码信息", isInterfaceLog = true, interfaceLogType = InterfaceLogType.LMS_TO_ACS) + @ApiOperation("LMS同步ACS报警码信息") + public ResponseEntity syncfaultInfo() { + return new ResponseEntity<>(wmsToAcsService.syncfaultInfo(), HttpStatus.OK); + } + + @PostMapping("/realTimefaultInfo") + @Log(value = "LMS查看ACS实时报警信息", isInterfaceLog = true, interfaceLogType = InterfaceLogType.LMS_TO_ACS) + @ApiOperation("LMS查看ACS实时报警信息") + public ResponseEntity realTimefaultInfo(@RequestBody JSONObject jo) { + return new ResponseEntity<>(wmsToAcsService.realTimefaultInfo(jo), HttpStatus.OK); + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java index dfce75a90..ddf7eb2cf 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java @@ -82,4 +82,9 @@ public interface AcsToWmsService { * 仓位初始化 */ void initialize(JSONObject json); + + /** + * 点位初始化 + */ + void initPoint(); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java index b3718c660..7fa44078f 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java @@ -97,4 +97,17 @@ public interface WmsToAcsService { * @return JSONObject */ JSONObject sendAgvChargeTask(JSONObject jo); + + /** + * LMS同步ACS报警码信息 + * @return JSONObject + */ + JSONObject syncfaultInfo(); + + /** + * LMS查看ACS实时报警信息 + * @param jo / + * @return JSONObject + */ + JSONObject realTimefaultInfo(JSONObject jo); } 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 87a385b61..ffbe8af0f 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 @@ -2,6 +2,7 @@ package org.nl.wms.ext.acs.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; @@ -429,13 +430,25 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } String sale_order_name = sub_jo.getString("sale_order_name"); + String box_length_1 = sub_jo.getString("box_length"); + String box_width_1 = sub_jo.getString("box_width"); + String box_high_1 = sub_jo.getString("box_high"); + String product_name = sub_jo.getString("product_name"); + + JSONObject param = new JSONObject(); + param.put("flag", "1"); + param.put("sale_order_name",sale_order_name); + param.put("product_name",product_name); + param.put("box_length",box_length_1); + param.put("box_width",box_width_1); + param.put("box_high",box_high_1); //查询是否存在可用的空位 String point_code = ""; JSONArray joArr = new JSONArray(); - // 查找此订单号所在的所有排 - JSONArray joRow = WQL.getWO("QST_ACSTOLMSTYPE4").addParam("flag", "1").addParam("sale_order_name", sale_order_name).process().getResultJSONArray(0); + // 查找此订单号、物料、木箱长宽高相同的一排 + JSONArray joRow = WQL.getWO("QST_ACSTOLMSTYPE4").addParamMap(param).process().getResultJSONArray(0); for (int j = 0; j < joRow.size(); j++) { JSONObject json = joRow.getJSONObject(j); String row_num = json.getString("row_num"); @@ -461,8 +474,8 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { JSONObject point_jo = rowArr.getJSONObject(i); JSONArray pointArr = WQLObject.getWQLObject("sch_base_point").query("row_num = '" + point_jo.getString("row_num") + "' AND point_type ='9' AND is_delete = '0' and lock_type = '1' and IFNULL(vehicle_code,'') = '' order by out_order_seq ASC").getResultJSONArray(0); - if (pointArr.size() == 4) { - JSONObject jsonNewRow = WQLObject.getWQLObject("sch_base_point").query("row_num = '" + point_jo.getString("row_num") + "' AND point_type ='9' AND is_delete = '0' and lock_type = '1' order by out_order_seq ASC").uniqueResult(0); + if (pointArr.size() == 8) { + JSONObject jsonNewRow = WQLObject.getWQLObject("sch_base_point").query("row_num = '" + point_jo.getString("row_num") + "' AND point_type ='9' AND is_delete = '0' and lock_type = '1' order by out_order_seq,layer_num").uniqueResult(0); point_code = jsonNewRow.getString("point_code"); break; } @@ -501,8 +514,8 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { JSONObject point_jo = rowArr.getJSONObject(i); JSONArray pointArr = WQLObject.getWQLObject("sch_base_point").query("row_num = '" + point_jo.getString("row_num") + "' AND point_type ='9' AND is_delete = '0' and lock_type = '1' and IFNULL(vehicle_code,'') = '' order by out_order_seq ASC").getResultJSONArray(0); - if (pointArr.size() == 4) { - JSONObject jsonNewRow = WQLObject.getWQLObject("sch_base_point").query("row_num = '" + point_jo.getString("row_num") + "' AND point_type ='9' AND is_delete = '0' and lock_type = '1' order by out_order_seq ASC").uniqueResult(0); + if (pointArr.size() == 8) { + JSONObject jsonNewRow = WQLObject.getWQLObject("sch_base_point").query("row_num = '" + point_jo.getString("row_num") + "' AND point_type ='9' AND is_delete = '0' and lock_type = '1' order by out_order_seq,layer_num").uniqueResult(0); point_code = jsonNewRow.getString("point_code"); break; } @@ -564,6 +577,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { try { if (tryLock) { if (type.equals("1")) { + //贴标申请 if (StrUtil.isEmpty(vehicle_code)) { throw new BadRequestException("木箱码不能为空!"); } @@ -574,7 +588,21 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { if (ObjectUtil.isEmpty(sub_jo)) { throw new BadRequestException("未查询到该木箱对应的包装关系!"); } - //贴标申请 + + /* + * 判断此客户是否是自动贴标 + */ + // 查询客户 + JSONObject jsonCust = WQLObject.getWQLObject("md_cs_customerbase").query("cust_code = '" + sub_jo.getString("customer_name") + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonCust)) { + throw new BadRequestException("客户不存在请检查!"); + } + + // 判断是否贴标 + if (!StrUtil.equals(jsonCust.getString("is_auto_table"), "1")) { + return result; + } + String print_type = "1"; if (StrUtil.isEmpty(print_type)) { throw new BadRequestException("请指定一台打印机进行打印!"); @@ -591,13 +619,35 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { default: throw new BadRequestException("未查询到对应打印机!"); } + + // 调用打印机进行打印 JSONObject print_info = WQLObject.getWQLObject("pdm_bi_printinfo").query("print_name = '" + print_code + "'").uniqueResult(0); JSONObject print_jo = new JSONObject(); print_jo.put("box_no", vehicle_code); print_jo.put("print_type", print_info.getString("print_id")); print_jo.put("box_weight", weight); new PrintServiceImpl().customerPrint2(print_jo); + + // 贴标成功:更新系统参数贴标次数 + WQLObject paramTab = WQLObject.getWQLObject("sys_param"); + + String label_num_up = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("label_num_up").getValue(); + String now_num = NumberUtil.sub(label_num_up, "1").toString(); + + JSONObject jsonParam = paramTab.query("code = 'label_num_up'").uniqueResult(0); + jsonParam.put("value", now_num); + paramTab.update(jsonParam); + + // 判断是否到达预警值 + String label_num_down = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("label_num_down").getValue(); + + if (Integer.valueOf(label_num_down) >= Integer.valueOf(now_num)) { + result.put("message", "标签纸数量过低,请更换!"); + } + } else if (type.equals("2")) { + //捆扎申请 + if (StrUtil.isEmpty(vehicle_code)) { throw new BadRequestException("木箱码不能为空!"); } @@ -605,7 +655,8 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { if (ObjectUtil.isEmpty(sub_jo)) { throw new BadRequestException("未查询到该木箱对应的包装关系!"); } - //捆扎申请 + + // 计算此木箱需要捆扎几次 String box_length = sub_jo.getString("box_length"); String box_width = sub_jo.getString("box_width"); String box_high = sub_jo.getString("box_high"); @@ -624,7 +675,40 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { data.put("bundle_times", 2); } + // 判断是否需要捆扎 + String is_lash = whereJson.getString("is_lash"); // TODO 此字段未跟acs确认,需要确认 + + if (StrUtil.equals(is_lash, "1")) { + // 获取系统参数:捆扎米数 + String lash_num_up = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("lash_num_up").getValue(); + Double lash_num_up_double = Double.valueOf(lash_num_up); + // 获取系统参数:捆扎一次的米数 + String lash_num_one = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("lash_num_one").getValue(); + Double lash_num_one_double = Double.valueOf(lash_num_one); + // 捆扎次数 + Double bundle_times_double = data.getDoubleValue("bundle_times"); + + // 当前米数 = 捆扎米数 - (捆扎次数 * 捆扎一次的米数) + double now_num = NumberUtil.sub(lash_num_up_double, (Double) NumberUtil.mul(lash_num_one_double, bundle_times_double)); + + // 更新捆扎米数 + WQLObject paramTab = WQLObject.getWQLObject("sys_param"); + + JSONObject jsonParam = paramTab.query("code = 'lash_num_up'").uniqueResult(0); + jsonParam.put("value", String.valueOf(now_num)); + paramTab.update(jsonParam); + + // 判断是否达到预警值 + String lash_num_down = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("lash_num_down").getValue(); + + if (Double.parseDouble(lash_num_down) >= now_num) { + result.put("message", "捆扎带米数过低,请更换!"); + } + + } + result.put("data", data); + } else if (type.equals("3")) { //判断AGV是否启用 String agv_status = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("agv_status").getValue(); @@ -891,4 +975,43 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } } } + + @Override + public void initPoint() { + WQLObject point = WQLObject.getWQLObject("sch_base_point"); + + JSONArray resultJSONArray = point.query("point_type = '9' order by point_code").getResultJSONArray(0); + + for (int i = 0; i < resultJSONArray.size(); i++) { + JSONObject json = resultJSONArray.getJSONObject(i); + json.put("device_code", json.getString("point_code")); + json.put("point_code", json.getString("point_code") + "_1"); + json.put("layer_num", 1); + point.update(json); + + JSONObject jsonTwo = new JSONObject(); + jsonTwo.put("point_id", IdUtil.getSnowflake(1,1).nextId()); + jsonTwo.put("device_code", json.getString("device_code")); + jsonTwo.put("point_code", jsonTwo.getString("device_code") + "_2"); + jsonTwo.put("point_name", json.getString("point_name")); + jsonTwo.put("region_id", json.get("region_id")); + jsonTwo.put("region_code", json.getString("region_code")); + jsonTwo.put("region_name", json.getString("region_name")); + jsonTwo.put("point_type", json.getString("point_type")); + jsonTwo.put("point_status", json.getString("point_status")); + jsonTwo.put("lock_type", json.getString("lock_type")); + jsonTwo.put("row_num", json.get("row_num")); + jsonTwo.put("col_num", json.get("col_num")); + jsonTwo.put("layer_num", 2); + jsonTwo.put("out_order_seq", json.get("out_order_seq")); + jsonTwo.put("is_used", "1"); + jsonTwo.put("is_delete", "0"); + jsonTwo.put("create_id", 1); + jsonTwo.put("create_name", "管理员"); + jsonTwo.put("create_time", DateUtil.now()); + point.insert(jsonTwo); + + } + + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java index 60c10324f..91d89bf4f 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java @@ -279,18 +279,6 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { result.put("message", "下发成功,但未连接ACS!"); result.put("data", new JSONObject()); - /* // 测试数据 - String car_no = whereJson.getString("car_no"); - - JSONObject jsonParam = new JSONObject(); - if ("2,3".contains(car_no)) { - jsonParam.put("avg_system", "2"); - jsonParam.put("car_no", car_no); - } else if ("1".contains(car_no)) { - jsonParam.put("avg_system", "1"); - jsonParam.put("car_no", car_no); - }*/ - return result; } @@ -304,10 +292,10 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { JSONObject jsonParam = new JSONObject(); if ("2,3".contains(car_no)) { - jsonParam.put("avg_system", "2"); + jsonParam.put("agv_system", "2"); jsonParam.put("car_no", car_no); } else if ("1".contains(car_no)) { - jsonParam.put("avg_system", "1"); + jsonParam.put("agv_system", "1"); jsonParam.put("car_no", car_no); } @@ -332,4 +320,81 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { return result; } + @Override + public JSONObject syncfaultInfo() { + JSONObject whereJson = new JSONObject(); + String api = "api/wms/syncfaultInfo"; + //判断是否连接ACS系统 + String isConnect = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("is_connect_acs").getValue(); + JSONObject result = new JSONObject(); + if (StrUtil.equals("0", isConnect)) { + result.put("status", HttpStatus.OK.value()); + result.put("message", "下发成功,但未连接ACS!"); + result.put("data", new JSONArray()); + return result; + } + + //ACS地址:127.0.0.1:8010 + String acsUrl = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("acs_url").getValue(); + + String url = acsUrl + api; + try { + String resultMsg = HttpRequest.post(url) + .body(String.valueOf(whereJson)) + .execute().body(); + result = JSONObject.parseObject(resultMsg); + + } catch (Exception e) { + String msg = e.getMessage(); + //网络不通 + System.out.println(msg); + result.put("status", HttpStatus.BAD_REQUEST); + result.put("message", "网络不通,操作失败!"); + result.put("data", new JSONArray()); + } + //acs抛异常这里 + if (!StrUtil.equals(result.getString("status"), "200")) { + throw new BadRequestException("同步失败:"+result.getString("message")); + } + return result; + } + + @Override + public JSONObject realTimefaultInfo(JSONObject whereJson) { + String api = "api/wms/realTimefaultInfo"; + //判断是否连接ACS系统 + String isConnect = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("is_connect_acs").getValue(); + JSONObject result = new JSONObject(); + if (StrUtil.equals("0", isConnect)) { + result.put("status", HttpStatus.OK.value()); + result.put("message", "下发成功,但未连接ACS!"); + result.put("data", new JSONArray()); + return result; + } + + //ACS地址:127.0.0.1:8010 + String acsUrl = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("acs_url").getValue(); + + String url = acsUrl + api; + try { + String resultMsg = HttpRequest.post(url) + .body(String.valueOf(whereJson)) + .execute().body(); + result = JSONObject.parseObject(resultMsg); + + } catch (Exception e) { + String msg = e.getMessage(); + //网络不通 + System.out.println(msg); + result.put("status", HttpStatus.BAD_REQUEST); + result.put("message", "网络不通,操作失败!"); + result.put("data", new JSONArray()); + } + //acs抛异常这里 + if (!StrUtil.equals(result.getString("status"), "200")) { + throw new BadRequestException("同步失败:"+result.getString("message")); + } + return result; + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/rest/ProductInstorController.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/rest/ProductInstorController.java index a6c507c25..daa24afe0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/rest/ProductInstorController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/rest/ProductInstorController.java @@ -58,4 +58,11 @@ public class ProductInstorController { return new ResponseEntity<>(productInstorService.bale(whereJson),HttpStatus.OK); } + @PostMapping("/abnormalOut") + @Log("异常出口点位解锁") + @ApiOperation("异常出口点位解锁") + public ResponseEntity abnormalOut(@RequestBody JSONObject whereJson){ + return new ResponseEntity<>(productInstorService.abnormalOut(whereJson),HttpStatus.OK); + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/rest/ProductionOutController.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/rest/ProductionOutController.java index 83dadaa74..f68306d7a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/rest/ProductionOutController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/rest/ProductionOutController.java @@ -23,7 +23,7 @@ import org.springframework.web.bind.annotation.RestController; **/ @RestController @RequiredArgsConstructor -@Api(tags = "出库确认") +@Api(tags = "生产区发货") @RequestMapping("/api/pda/st") @Slf4j public class ProductionOutController { @@ -31,12 +31,26 @@ public class ProductionOutController { private final ProductionOutService productionOutService; @PostMapping("/ivtQuery") - @Log("出库初始化查询") - @ApiOperation("出库初始化查询") + @Log("单据初始化查询") + @ApiOperation("单据初始化查询") public ResponseEntity ivtQuery(@RequestBody JSONObject whereJson){ return new ResponseEntity<>(productionOutService.ivtQuery(whereJson),HttpStatus.OK); } + @PostMapping("/ivtDtlQuery") + @Log("查询点位木箱") + @ApiOperation("查询点位木箱") + public ResponseEntity ivtDtlQuery(@RequestBody JSONObject whereJson){ + return new ResponseEntity<>(productionOutService.ivtDtlQuery(whereJson),HttpStatus.OK); + } + + @PostMapping("/ivtbBoxDtlQuery") + @Log("木箱明细") + @ApiOperation("木箱明细") + public ResponseEntity ivtbBoxDtlQuery(@RequestBody JSONObject whereJson){ + return new ResponseEntity<>(productionOutService.ivtbBoxDtlQuery(whereJson),HttpStatus.OK); + } + @PostMapping("/outConfirm") @Log("出库确认") @ApiOperation("出库确认") diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/ProductInstorService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/ProductInstorService.java index abdab87fe..764a56b2a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/ProductInstorService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/ProductInstorService.java @@ -23,4 +23,6 @@ public interface ProductInstorService { JSONObject mendCode(JSONObject whereJson); JSONObject bale(JSONObject whereJson); + + JSONObject abnormalOut(JSONObject whereJson); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/ProductionOutService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/ProductionOutService.java index 790874bf1..33777b4cb 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/ProductionOutService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/service/ProductionOutService.java @@ -11,7 +11,7 @@ import com.alibaba.fastjson.JSONObject; public interface ProductionOutService { /** - * 出库初始化查询 + * 单据初始化查询 * @param whereJson / * @return JSONObject / */ @@ -23,4 +23,18 @@ public interface ProductionOutService { * @return JSONObject / */ JSONObject outConfirm(JSONObject whereJson); + + /** + * 查询点位木箱 + * @param whereJson / + * @return JSONObject / + */ + JSONObject ivtDtlQuery(JSONObject whereJson); + + /** + * 木箱明细 + * @param whereJson / + * @return JSONObject / + */ + JSONObject ivtbBoxDtlQuery(JSONObject whereJson); } 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 c94030965..41eea5306 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 @@ -372,4 +372,45 @@ public class ProductInstorServiceImpl implements ProductInstorService { jo.put("message", "捆扎成功!"); return jo; } + + @Override + @Transactional(rollbackFor = Exception.class) + public JSONObject abnormalOut(JSONObject whereJson) { + + String vehicle_code = whereJson.getString("box_no"); + String device_code = whereJson.getString("point_code"); + + if (ObjectUtil.isEmpty(vehicle_code) && ObjectUtil.isEmpty(device_code)) { + throw new BadRequestException("载具号或木箱号不能为空!"); + } + + JSONObject map = new JSONObject(); + map.put("flag", "9"); + map.put("box_no",vehicle_code); + map.put("point_code",device_code); + + // 查询对应任务 + JSONObject json = WQL.getWO("PDA_ST_01").addParamMap(map).process().uniqueResult(0); + + if (ObjectUtil.isEmpty(json)) throw new BadRequestException("木箱不存在或任务不存在!"); + + // 下发给acs + JSONObject jsonParam = new JSONObject(); + jsonParam.put("device_code", json.getString("point_code2")); + jsonParam.put("vehicle_code", json.getString("vehicle_code")); + jsonParam.put("task_code", json.getString("task_code")); + + JSONObject jo = new JSONObject(); + jo.put("message", "解锁成功!"); + + WmsToAcsServiceImpl bean = SpringContextHolder.getBean(WmsToAcsServiceImpl.class); + + try { + bean.unLock(jsonParam); + } catch (Exception e) { + jo.put("message",e.getMessage()); + } + + return jo; + } } 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 f879fd1fc..6dc856523 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 @@ -2,8 +2,6 @@ package org.nl.wms.pda.st.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.JSONArray; @@ -11,11 +9,8 @@ import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.modules.common.exception.BadRequestException; -import org.nl.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.wms.pda.st.service.CoolInService; import org.nl.wms.pda.st.service.ProductionOutService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -33,24 +28,16 @@ public class ProductionOutServiceImpl implements ProductionOutService { @Override public JSONObject ivtQuery(JSONObject whereJson) { + String box_no = whereJson.getString("box_no"); + String bill_code = whereJson.getString("bill_code"); + JSONObject map = new JSONObject(); map.put("flag", "1"); - map.put("box_no", whereJson.getString("box_no")); - map.put("point_code", whereJson.getString("point_code")); + if (ObjectUtil.isNotEmpty(box_no)) map.put("box_no","%"+box_no+"%"); + if (ObjectUtil.isNotEmpty(bill_code)) map.put("bill_code","%"+bill_code+"%"); + JSONArray resultJSONArray = WQL.getWO("PDA_PRODUVTIONOUT").addParamMap(map).process().getResultJSONArray(0); - for (int i = 0; i < resultJSONArray.size(); i++) { - JSONObject jsonObject = resultJSONArray.getJSONObject(i); - String isRePrintPackageBoxLabel = jsonObject.getString("isRePrintPackageBoxLabel"); - String isUnPackBox = jsonObject.getString("isUnPackBox"); - - if (StrUtil.equals(isRePrintPackageBoxLabel, "1") || StrUtil.equals(isUnPackBox, "1")) { - jsonObject.put("colro_flag", "1"); - } else { - jsonObject.put("colro_flag", "0"); - } - } - JSONObject jo = new JSONObject(); jo.put("data", resultJSONArray); jo.put("message", "查询成功!"); @@ -69,17 +56,25 @@ public class ProductionOutServiceImpl implements ProductionOutService { JSONObject jsonPoint = pointTab.query("vehicle_code = '" + box_no + "' and is_delete = '0' and is_used = '1'").uniqueResult(0); if (ObjectUtil.isEmpty(jsonPoint)) { - throw new BadRequestException("请输入正确的木箱"); + throw new BadRequestException("请输入正确的木箱或查看点位是否存在"); } + /* - * 生产区确认 - * a.解锁出库点位、清除木箱号 + 判断点位是第几层 + 1层:解锁当前点位和2层点位 + 2层:直接解锁当前点位 */ + if (StrUtil.equals(jsonPoint.getString("layer_num"), "1")) { + JSONObject jsonPoint2 = pointTab.query("device_code = '" + jsonPoint.getString("device_code") + "' and layer_num = '2'").uniqueResult(0); + jsonPoint2.put("point_status", "1"); + jsonPoint2.put("lock_type", "1"); + jsonPoint2.put("vehicle_code", ""); + pointTab.update(jsonPoint2); + } + jsonPoint.put("point_status", "1"); jsonPoint.put("lock_type", "1"); jsonPoint.put("vehicle_code", ""); - jsonPoint.put("vehicle_type", ""); - jsonPoint.put("vehicle_qty", 0); pointTab.update(jsonPoint); JSONObject jo = new JSONObject(); @@ -87,4 +82,38 @@ public class ProductionOutServiceImpl implements ProductionOutService { return jo; } + + @Override + public JSONObject ivtDtlQuery(JSONObject whereJson) { + String box_no = whereJson.getString("box_no"); + String bill_code = whereJson.getString("bill_code"); + + JSONObject map = new JSONObject(); + map.put("flag", "2"); + map.put("bill_code", bill_code); + if (ObjectUtil.isNotEmpty(box_no)) map.put("box_no","%"+box_no+"%"); + + JSONArray resultJSONArray = WQL.getWO("PDA_PRODUVTIONOUT").addParamMap(map).process().getResultJSONArray(0); + + JSONObject jo = new JSONObject(); + jo.put("data", resultJSONArray); + jo.put("message", "查询成功!"); + return jo; + } + + @Override + public JSONObject ivtbBoxDtlQuery(JSONObject whereJson) { + String box_no = whereJson.getString("box_no"); + + JSONObject map = new JSONObject(); + map.put("flag", "3"); + map.put("box_no", box_no); + + JSONArray resultJSONArray = WQL.getWO("PDA_PRODUVTIONOUT").addParamMap(map).process().getResultJSONArray(0); + + JSONObject jo = new JSONObject(); + jo.put("data", resultJSONArray); + jo.put("message", "查询成功!"); + return jo; + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/wql/PDA_PRODUVTIONOUT.wql b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/wql/PDA_PRODUVTIONOUT.wql index 91efa0a38..4b71b8280 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/wql/PDA_PRODUVTIONOUT.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/wql/PDA_PRODUVTIONOUT.wql @@ -14,7 +14,7 @@ ## 表字段对应输入参数 ################################################# 输入.flag TYPEAS s_string - 输入.point_code TYPEAS s_string + 输入.bill_code TYPEAS s_string 输入.box_no TYPEAS s_string @@ -42,44 +42,155 @@ IF 输入.flag = "1" QUERY - SELECT - sub.package_box_SN AS package_box_SN, - sub.container_name AS container_name, - sub.product_name AS product_name, - sub.product_description AS product_description, - sub.net_weight AS net_weight, - ( - CASE - sub.isRePrintPackageBoxLabel - WHEN '1' THEN '是' - WHEN '0' THEN '否' - END - ) AS change_out, - ( - CASE - sub.isUnPackBox - WHEN '1' THEN '是' - WHEN '0' THEN '否' - END - ) AS change_in, - - sub.isRePrintPackageBoxLabel, - sub.isUnPackBox, - point.point_code + SELECT DISTINCT + mst.bill_code, + ( + CASE + mst.bill_status + WHEN '10' THEN '生成' + WHEN '20' THEN '提交' + WHEN '30' THEN '分配中' + WHEN '40' THEN '分配完' + WHEN '50' THEN '确认' + WHEN '99' THEN '完成' + END + ) AS bill_status, + ROUND(mst.total_qty, 3) AS total_qty, + mst.detail_count, + mst.cust_code, + cust.cust_name, + mst.source_id, + mst.remark, + mst.input_optname, + mst.input_time, + mst.dis_optname, + mst.dis_time, + mst.confirm_optname, + mst.confirm_time FROM - PDM_BI_SubPackageRelation sub - LEFT JOIN sch_base_point point ON sub.package_box_SN = point.vehicle_code + st_ivt_iostorinv mst + LEFT JOIN ( + SELECT + box_no, + max(iostorinv_id) AS iostorinv_id + FROM + st_ivt_iostorinvdis + WHERE + 1 = 1 + group by box_no + ) dis ON dis.iostorinv_id = mst.iostorinv_id + LEFT JOIN sch_base_point point ON point.vehicle_code = dis.box_no + LEFT JOIN md_cs_customerbase cust ON cust.cust_code = mst.cust_code WHERE - point.point_type = '9' + mst.is_delete = '0' + AND mst.io_type = '1' + AND point.point_type = '9' OPTION 输入.box_no <> "" - point.vehicle_code = 输入.box_no + point.vehicle_code LIKE 输入.box_no ENDOPTION - OPTION 输入.point_code <> "" - point.point_code = 输入.point_code + OPTION 输入.bill_code <> "" + mst.bill_code LIKE 输入.bill_code ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + point.vehicle_code AS package_box_sn, + point.point_code, + point.point_name, + ROUND(sub.box_weight,3) AS box_weight, + sub.product_name, + sub.product_description, + sub.sale_order_name + FROM + sch_base_point point + LEFT JOIN ( + SELECT + box_no, + max(iostorinv_id) AS iostorinv_id + FROM + st_ivt_iostorinvdis + WHERE + 1 = 1 + group by box_no + ) dis ON dis.box_no = point.vehicle_code + LEFT JOIN ( + SELECT + package_box_sn, + MAX(box_weight) AS box_weight, + MAX(product_name) AS product_name, + MAX(product_description) AS product_description, + MAX(sale_order_name) AS sale_order_name + FROM + pdm_bi_subpackagerelation + WHERE + 1 = 1 + group by package_box_sn + ) sub ON sub.package_box_sn = dis.box_no + LEFT JOIN st_ivt_iostorinv mst ON mst.iostorinv_id = dis.iostorinv_id + WHERE + mst.is_delete = '0' + AND mst.io_type = '1' + AND point.point_type = '9' + + OPTION 输入.box_no <> "" + point.vehicle_code LIKE 输入.box_no + ENDOPTION + + OPTION 输入.bill_code <> "" + mst.bill_code = 输入.bill_code + ENDOPTION + + order by point_code + + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "3" + QUERY + SELECT + package_box_sn, + container_name, + sap_pcsn, + ROUND(net_weight,3) AS net_weight, + ( + CASE + status + WHEN '0' THEN '生成' + WHEN '1' THEN '包装' + WHEN '2' THEN '入库' + WHEN '3' THEN '出库' + END + ) AS status, + sale_order_name, + customer_name, + customer_description, + width, + thickness, + ROUND(length,3) AS length, + width_standard, + thickness_request, + quality_guaran_period, + date_of_production, + date_of_fG_inbound + FROM + pdm_bi_subpackagerelation + WHERE + 1 = 1 + + OPTION 输入.box_no <> "" + package_box_sn = 输入.box_no + ENDOPTION + + order by package_box_sn,container_name + ENDSELECT ENDQUERY ENDIF \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/wql/PDA_ST_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/wql/PDA_ST_01.wql index d5f09bbc8..ff3c534d3 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/wql/PDA_ST_01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/wql/PDA_ST_01.wql @@ -15,6 +15,7 @@ ################################################# 输入.flag TYPEAS s_string 输入.box_no TYPEAS s_string + 输入.point_code TYPEAS s_string 输入.stor_id TYPEAS s_string @@ -206,6 +207,31 @@ dis.box_no = 输入.box_no ENDOPTION + ENDSELECT + ENDQUERY + ENDIF + + IF 输入.flag = "9" + QUERY + SELECT + task.* + FROM + sch_base_task task + WHERE + task.is_delete = '0' + AND task.task_status = '07' + AND task.task_type = '010503' + + OPTION 输入.box_no <> "" + task.vehicle_code = 输入.box_no + ENDOPTION + + OPTION 输入.point_code <> "" + task.point_code2 = 输入.point_code + ENDOPTION + + order by update_time DESC + ENDSELECT ENDQUERY ENDIF \ No newline at end of file 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 cece5ded9f88df8457e49b213127778dec6016da..f233bc5333ed6349a96a73044fd57368de06228f 100644 GIT binary patch delta 56204 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

eIBjKl~6pP^Z`dteRSs~QVKfxbC*a_ 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 delta 20048 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 z
  • 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 resultList = new ArrayList<>(); for (int i = 0; i < arr.size(); i++) { JSONObject json = arr.getJSONObject(i); + String start_high = "0"; + String next_high = ""; + + // 判断此木箱是在2层还是1层 + JSONObject jsonPoint = WQLObject.getWQLObject("sch_base_point").query("point_code = '" + json.getString("point_code2") + "'").uniqueResult(0); + + if (ObjectUtil.isEmpty(jsonPoint)) throw new BadRequestException("终点点位不存在!"); + + if (StrUtil.equals(jsonPoint.getString("layer_num"), "2")) { + JSONObject jsonSub = WQLObject.getWQLObject("pdm_bi_subpackagerelation").query("package_box_sn = '" + json.getString("vehicle_code") + "'").uniqueResult(0); + next_high = jsonSub.getString("box_high"); + } else { + next_high = "0"; + } + AcsTaskDto dto = AcsTaskDto.builder() .ext_task_id(json.getString("task_id")) .task_code(json.getString("task_code")) .task_type(json.getString("acs_task_type")) .start_device_code(json.getString("point_code1")) - .next_device_code(json.getString("point_code2")) + .next_device_code(jsonPoint.getString("device_code")) .agv_system_type("1") .vehicle_code(json.getString("vehicle_code")) .priority(json.getString("priority")) .remark(json.getString("remark")) + .start_height(start_high) + .next_height(next_high) .build(); resultList.add(dto); + System.out.println(resultList.toString()); } return resultList; } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_ACSTOLMSTYPE4.wql b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_ACSTOLMSTYPE4.wql index 5e5194ffd..59be55ed4 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_ACSTOLMSTYPE4.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_ACSTOLMSTYPE4.wql @@ -15,6 +15,10 @@ ################################################# 输入.flag TYPEAS s_string 输入.sale_order_name TYPEAS s_string + 输入.product_name TYPEAS s_string + 输入.box_length TYPEAS s_string + 输入.box_width TYPEAS s_string + 输入.box_high TYPEAS s_string 输入.point_code TYPEAS s_string 输入.row_num TYPEAS s_string @@ -50,7 +54,26 @@ LEFT JOIN pdm_bi_subpackagerelation sub ON sub.package_box_sn = po.vehicle_code WHERE po.point_type = '9' - AND sub.sale_order_name = 输入.sale_order_name + + OPTION 输入.sale_order_name <> "" + sub.sale_order_name = 输入.sale_order_name + ENDOPTION + + OPTION 输入.product_name <> "" + sub.product_name = 输入.product_name + ENDOPTION + + OPTION 输入.box_length <> "" + sub.box_length = 输入.box_length + ENDOPTION + + OPTION 输入.box_width <> "" + sub.box_width = 输入.box_width + ENDOPTION + + OPTION 输入.box_high <> "" + sub.box_high = 输入.box_high + ENDOPTION GROUP BY po.row_num @@ -87,7 +110,7 @@ AND is_delete = '0' ) - ORDER BY po.out_order_seq ASC + ORDER BY po.out_order_seq,po.layer_num ENDSELECT ENDQUERY diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_IVT_RAWASSISTISTOR.wql b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_IVT_RAWASSISTISTOR.wql index e101b56ac..04a79af2b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_IVT_RAWASSISTISTOR.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_IVT_RAWASSISTISTOR.wql @@ -447,7 +447,7 @@ AND sa2.is_used = '1' AND - sa.sect_id = 输入.sect_id + sa2.sect_id = 输入.sect_id OPTION 输入.material_code <> "" mb.material_code = 输入.material_code ENDOPTION 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 78f91ea84..12a60f74d 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 @@ -29,6 +29,7 @@ import org.nl.wms.ext.mes.service.impl.LmsToMesServiceImpl; import org.nl.wms.ext.sap.service.impl.LmsToSapServiceImpl; import org.nl.wms.pda.mps.eum.RegionTypeEnum; import org.nl.wms.sch.AcsTaskDto; +import org.nl.wms.sch.AcsUtil; import org.nl.wms.sch.manage.TaskStatusEnum; import org.nl.wms.sch.tasks.OutTask; import org.nl.wms.st.inbill.service.CheckOutBillService; @@ -2574,6 +2575,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { String point_code = whereJson.getString("point_code"); // 终点 String iostorinv_id = whereJson.getString("iostorinv_id"); String iostorinvdtl_id = whereJson.getString("iostorinvdtl_id"); + boolean checked = whereJson.getBoolean("checked"); // 是否异常出库 //查询主表信息 JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); @@ -2608,11 +2610,66 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { } } + if (checked) { + // 查询此明细所有的层 + JSONArray layerArr = WQL.getWO("ST_OUTIVT04") + .addParam("flag", "9") + .addParam("iostorinv_id", iostorinv_id) + .process() + .getResultJSONArray(0); + + for (int i = 0; i < layerArr.size(); i++) { + JSONObject json = layerArr.getJSONObject(i); + + String layer_num = json.getString("layer_num"); + + String out_point = ""; + + switch (layer_num) { + case "1" : + out_point = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("out_point_1").getValue(); + break; + case "2" : + out_point = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("out_point_2").getValue(); + break; + case "3" : + out_point = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("out_point_3").getValue(); + break; + } + + // 将这一巷道的所有木箱进行移库 + JSONObject jsonNextPoint = attrTab.query("struct_code = '" + out_point + "'").uniqueResult(0); + + JSONObject map2 = new JSONObject(); + map2.put("block_num", jsonNextPoint.getString("block_num")); + map2.put("row_num", jsonNextPoint.getString("row_num")); + map2.put("out_order_seq", jsonNextPoint.getString("out_order_seq")); + + map2.put("flag", "7"); + JSONArray paramMoveArr = WQL.getWO("ST_OUTIVT04").addParamMap(map2).process().getResultJSONArray(0); + + if (ObjectUtil.isNotEmpty(paramMoveArr)) { + JSONObject moveParam = new JSONObject(); + moveParam.put("jsonAllBlockPoint", paramMoveArr); + moveParam.put("task_group_id", IdUtil.getSnowflake(1,1).nextId()); + this.createMove(moveParam); + + new HandMoveStorAcsTask().immediateNotifyAcs(null); + + // 更新任务为下发 + JSONObject param = new JSONObject(); + param.put("task_status", TaskStatusEnum.ISSUE.getCode()); + wo_Task.update(param,"task_group_id = '"+moveParam.getString("task_group_id")+"'"); + } + } + } + for (int i = 0; i < allRowArr.size(); i++) { // 调用当前排处理方法 JSONObject jsonRow = allRowArr.getJSONObject(i); jsonRow.put("iostorinv_id", iostorinv_id); jsonRow.put("point_code", point_code); + jsonRow.put("checked", checked); jsonRow.put("iostorinvdtl_id", iostorinvdtl_id); jsonRow.put("point_id", jsonPoint2.getString("point_id")); this.rowDispose(jsonRow); @@ -2625,10 +2682,15 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { WQLObject wo_dis = WQLObject.getWQLObject("ST_IVT_IOStorInvDis"); //任务表 WQLObject wo_Task = WQLObject.getWQLObject("SCH_BASE_Task"); + // 仓位表 + WQLObject attr_tab = WQLObject.getWQLObject("st_ivt_structattr"); + // 点位表 + WQLObject point_tab = WQLObject.getWQLObject("sch_base_point"); String point_code = jsonRow.getString("point_code"); String iostorinvdtl_id = jsonRow.getString("iostorinvdtl_id"); String point_id = jsonRow.getString("point_id"); + Boolean checked = jsonRow.getBoolean("checked"); /* * 查询这一排的要出库的所有分配明细(正序) @@ -2887,6 +2949,29 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { this.createMove(moveParam); } + // 判断是否是异常出库口 + if (checked) { + JSONObject jsonStartPoint = attr_tab.query("struct_code = '" + jsonObject.getString("struct_code") + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonStartPoint)) throw new BadRequestException("起始点位异常!"); + + String layer_num = jsonStartPoint.getString("layer_num"); + + switch (layer_num) { + case "1" : + point_code = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("out_point_1").getValue(); + break; + case "2" : + point_code = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("out_point_2").getValue(); + break; + case "3" : + point_code = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("out_point_3").getValue(); + break; + default: + throw new BadRequestException("起点楼层异常:"+jsonStartPoint.getString("struct_code")); + } + point_id = point_tab.query("point_code = '"+point_code+"'").uniqueResult(0).getString("point_id"); + } + // 创建任务 JSONObject param = new JSONObject(); param.put("task_type", "010503"); @@ -3031,6 +3116,8 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { String iostorinv_id = whereJson.getString("iostorinv_id"); String iostorinvdtl_id = whereJson.getString("iostorinvdtl_id"); String iostorinvdis_id = whereJson.getString("iostorinvdis_id"); + boolean checked = whereJson.getBoolean("checked"); // 是否异常出库 + String point_id = ""; //查询主表信息 JSONObject jo_mst = wo_mst.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); @@ -3043,6 +3130,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { if (ObjectUtil.isEmpty(jsonPoint2)) { throw new BadRequestException("该站点被锁定或者有载具号,不允许设置!"); } + point_id = jsonPoint2.getString("point_id"); // 查询未生成和生成未下发的分配记录 JSONArray disArrOne = WQL.getWO("QST_IVT_CHECKOUTBILL") @@ -3291,6 +3379,29 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { this.createMove(moveParam); } + // 判断是否是异常出库口 + if (checked) { + JSONObject jsonStartPoint = attrTab.query("struct_code = '" + jsonObject.getString("struct_code") + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonStartPoint)) throw new BadRequestException("起始点位异常!"); + + String layer_num = jsonStartPoint.getString("layer_num"); + + switch (layer_num) { + case "1" : + point_code = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("out_point_1").getValue(); + break; + case "2" : + point_code = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("out_point_2").getValue(); + break; + case "3" : + point_code = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("out_point_3").getValue(); + break; + default: + throw new BadRequestException("起点楼层异常:"+jsonStartPoint.getString("struct_code")); + } + point_id = wo_Point.query("point_code = '"+point_code+"'").uniqueResult(0).getString("point_id"); + } + // 创建任务 JSONObject param = new JSONObject(); param.put("task_type", "010503"); @@ -3309,7 +3420,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { JSONObject jsonUpdateMap = new JSONObject(); jsonUpdateMap.put("work_status", "01"); jsonUpdateMap.put("task_id", jsonTask.getLong("task_id")); - jsonUpdateMap.put("point_id", jsonPoint2.getLongValue("point_id")); + jsonUpdateMap.put("point_id", point_id); wo_dis.update(jsonUpdateMap, "iostorinvdis_id = '" + jsonObject.getString("iostorinvdis_id") + "'"); // 1.判断此条分配明细的 ‘仓位’在此主表下的分配明细是否有相同的 ‘仓位’ @@ -3323,7 +3434,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { JSONObject jsonObject2 = disArr.getJSONObject(n); jsonObject2.put("work_status", "01"); jsonObject2.put("task_id", jsonTask.getLong("task_id")); - jsonObject2.put("point_id", jsonPoint2.getLongValue("point_id")); + jsonObject2.put("point_id", point_id); wo_dis.update(jsonObject2); } @@ -3377,7 +3488,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { JSONObject jsonUpdateMap2 = new JSONObject(); jsonUpdateMap2.put("work_status", "01"); jsonUpdateMap2.put("task_id", jsonTask2.getLong("task_id")); - jsonUpdateMap2.put("point_id", jsonPoint2.getLongValue("point_id")); + jsonUpdateMap2.put("point_id", point_id); wo_dis.update(jsonUpdateMap2, "iostorinvdis_id = '" + jsonNext.getString("iostorinvdis_id") + "'"); // 1.判断此条分配明细的 ‘仓位’在此主表下的分配明细是否有相同的 ‘仓位’ @@ -3391,7 +3502,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { JSONObject jsonObject3 = disArr2.getJSONObject(m); jsonObject3.put("work_status", "01"); jsonObject3.put("task_id", jsonTask2.getLong("task_id")); - jsonObject3.put("point_id", jsonPoint2.getLongValue("point_id")); + jsonObject3.put("point_id", point_id); wo_dis.update(jsonObject3); } @@ -3421,6 +3532,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { WQLObject attrTab = WQLObject.getWQLObject("st_ivt_structattr"); JSONArray jsonAllBlockPoint = whereJson.getJSONArray("jsonAllBlockPoint"); + String is_move = whereJson.getString("is_move"); for (int i = 0; i < jsonAllBlockPoint.size(); i++) { JSONObject json = jsonAllBlockPoint.getJSONObject(i); @@ -3429,9 +3541,16 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { JSONObject mapParam = new JSONObject();// 生成移库单传入参数 JSONArray table = new JSONArray(); // 明细参数 - mapParam.put("bill_status", "10"); - mapParam.put("bill_type", "21"); - mapParam.put("buss_type", "21"); + if (ObjectUtil.isNotEmpty(is_move)) { + mapParam.put("bill_type", "28"); + mapParam.put("buss_type", "28"); + mapParam.put("bill_status", "20"); + + } else { + mapParam.put("bill_type", "21"); + mapParam.put("buss_type", "21"); + mapParam.put("bill_status", "10"); + } mapParam.put("biz_date", DateUtil.today()); mapParam.put("stor_code", "CP01"); mapParam.put("stor_id", "1582991156504039424"); diff --git a/lms/nladmin-ui/src/views/wms/agvrush/charge/index.vue b/lms/nladmin-ui/src/views/wms/agvrush/charge/index.vue index 5addd0224..ec0b4c707 100644 --- a/lms/nladmin-ui/src/views/wms/agvrush/charge/index.vue +++ b/lms/nladmin-ui/src/views/wms/agvrush/charge/index.vue @@ -163,7 +163,7 @@ export default { this.timer = setInterval(() => { // 定时刷新 console.log('定时器启动') this.initStatus() - }, 10000) + }, 2000) }, initStatus() { const data = { diff --git a/lms/nladmin-ui/src/views/wms/agvrush/devicecharge/index.vue b/lms/nladmin-ui/src/views/wms/agvrush/devicecharge/index.vue new file mode 100644 index 000000000..af27106bb --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/agvrush/devicecharge/index.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/lms/nladmin-ui/src/views/wms/basedata/master/customer/index.vue b/lms/nladmin-ui/src/views/wms/basedata/master/customer/index.vue index 277a43d76..590122eb0 100644 --- a/lms/nladmin-ui/src/views/wms/basedata/master/customer/index.vue +++ b/lms/nladmin-ui/src/views/wms/basedata/master/customer/index.vue @@ -129,6 +129,14 @@ + + + + + + + + @@ -159,6 +167,7 @@ + @@ -239,7 +248,8 @@ const defaultForm = { class_name: null, zj_print_no: null, bz_print_no: null, - shd_print_no: null + shd_print_no: null, + is_auto_table: '1' } export default { name: 'Customerbase', @@ -369,6 +379,9 @@ export default { }, printTemple(row) { return this.dict.label.print_temple[row.bz_print_no] + }, + autoTable(row) { + return this.dict.label.is_used[row.is_auto_table] } } } diff --git a/lms/nladmin-ui/src/views/wms/basedata/master/faultdevice/faultdevice.js b/lms/nladmin-ui/src/views/wms/basedata/master/faultdevice/faultdevice.js new file mode 100644 index 000000000..1c18dda21 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/basedata/master/faultdevice/faultdevice.js @@ -0,0 +1,42 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/faultdevice', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/faultdevice/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/faultdevice', + method: 'put', + data + }) +} + +export function syncInfo() { + return request({ + url: 'api/faultdevice/syncInfo', + method: 'post' + }) +} + +export function deviceCharge(params) { + return request({ + url: 'api/faultdevice/deviceCharge', + method: 'get', + params + }) +} + +export default { add, edit, del, syncInfo, deviceCharge } diff --git a/lms/nladmin-ui/src/views/wms/basedata/master/faultdevice/index.vue b/lms/nladmin-ui/src/views/wms/basedata/master/faultdevice/index.vue new file mode 100644 index 000000000..189cb6746 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/basedata/master/faultdevice/index.vue @@ -0,0 +1,211 @@ + + + + + diff --git a/lms/nladmin-ui/src/views/wms/sendout/outtwo/index.vue b/lms/nladmin-ui/src/views/wms/sendout/outtwo/index.vue new file mode 100644 index 000000000..2e670e3ff --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/sendout/outtwo/index.vue @@ -0,0 +1,312 @@ + + + + + + diff --git a/lms/nladmin-ui/src/views/wms/st/outbill/DivDialog.vue b/lms/nladmin-ui/src/views/wms/st/outbill/DivDialog.vue index e25810511..296018ece 100644 --- a/lms/nladmin-ui/src/views/wms/st/outbill/DivDialog.vue +++ b/lms/nladmin-ui/src/views/wms/st/outbill/DivDialog.vue @@ -171,6 +171,9 @@ /> + + 是否异常出库 + @@ -317,6 +320,7 @@ export default { tabledis: [], currentRow: {}, currentDis: {}, + checked: false, form: { gender2: '' }, @@ -593,6 +597,7 @@ export default { this.loadingSetPoint = true if (this.currentDis.iostorinvdis_id !== null) { this.currentDis.point_code = this.form2.point_code + this.currentDis.checked = this.checked checkoutbill.oneSetPoint2(this.currentDis).then(res => { this.queryTableDdis(this.currentDis.iostorinvdtl_id) this.crud.notify('设置成功!', CRUD.NOTIFICATION_TYPE.INFO) @@ -614,6 +619,7 @@ export default { } this.loadingSetAllPoint = true this.currentRow.point_code = this.form2.point_code + this.currentRow.checked = this.checked checkoutbill.allSetPoint(this.currentRow).then(res => { this.queryTableDdis(this.currentRow.iostorinvdtl_id) this.crud.notify('设置成功!', CRUD.NOTIFICATION_TYPE.INFO) @@ -630,7 +636,8 @@ export default { this.loadingSetAllPoint = true const data = { 'point_code': this.form2.point_code, - 'iostorinv_id': this.mstrow.iostorinv_id + 'iostorinv_id': this.mstrow.iostorinv_id, + 'checked': this.checked } checkoutbill.allSetPoint(data).then(res => { // this.queryTableDdis(this.currentRow.iostorinvdtl_id)