From eb9f7c7a719a0f155e7fe386f4b4c3020c3346ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=B1=9F=E7=8E=AE?= Date: Fri, 4 Nov 2022 13:56:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AC=A1=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/DeviceServiceImpl.java | 2 +- .../modules/system/rest/UserController.java | 8 + .../tools/rest/LocalStorageController.java | 2 + .../service/impl/LocalStorageServiceImpl.java | 54 +- .../basedata/service/dto/MaterialbaseDto.java | 8 +- .../wms/basedata/service/dto/VehicleDto.java | 3 + .../service/impl/MaterialbaseServiceImpl.java | 32 +- .../service/impl/VehicleServiceImpl.java | 88 +--- .../nl/wms/basedata/wql/QMD_ME_MATERIAL.wql | 33 +- .../nl/wms/basedata/wql/QMD_PB_VEHICLE.wql | 13 +- .../acs/service/impl/AcsToWmsServiceImpl.java | 133 ----- .../acs/service/impl/WmsToAcsServiceImpl.java | 14 +- .../org/nl/wms/ext/auto/AutoQueryTask.java | 141 ----- .../rest/CallMaterialController.java | 39 -- .../service/CallMaterialService.java | 19 - .../service/impl/CallMaterialServiceImpl.java | 61 --- .../callmaterial/wql/PDA_CALLMATERIAL_01.wql | 75 --- .../rest/CallVehicleController.java | 40 -- .../service/CallVehicleService.java | 19 - .../service/impl/CallVehicleServiceImpl.java | 70 --- .../callvehicle/wql/PDA_CALLVEHICLE_01.wql | 75 --- .../main/java/org/nl/wms/pda/login/test.java | 9 - .../nl/wms/pda/login/wql/QPADSTSETSERVICE.wql | 492 ------------------ .../rest/SendMaterialController.java | 39 -- .../service/SendMaterialService.java | 19 - .../service/impl/SendMaterialServiceImpl.java | 70 --- .../sendmaterial/wql/PDA_SENDMATERIAL_01.wql | 75 --- .../rest/SendVehicleController.java | 41 -- .../service/SendVehicleService.java | 19 - .../service/impl/SendVehicleServiceImpl.java | 78 --- .../sendvehicle/wql/PDA_SENDVEHICLE_01.wql | 96 ---- .../wms/sch/{AcsUtil.java => AcsUtils.java} | 2 +- .../org/nl/wms/sch/base/point/LockType.java | 20 + .../nl/wms/sch/base/point/PointStatus.java | 20 + .../nl/wms/sch/base/region/RegionEnum.java | 22 + .../nl/wms/sch/manage/AbstractAcsTask.java | 16 +- .../org/nl/wms/sch/manage/AutoCreateTask.java | 10 +- .../sch/service/impl/PointServiceImpl.java | 2 +- .../sch/service/impl/RegionServiceImpl.java | 22 +- .../nl/wms/sch/task/CallEmptyVehicleTask.java | 173 ++++++ .../java/org/nl/wms/sch/task/CreateMode.java | 24 + .../org/nl/wms/sch/task/TaskFinishedType.java | 22 + .../java/org/nl/wms/sch/task/TaskStatus.java | 27 + .../java/org/nl/wms/sch/task/TaskType.java | 25 + .../dto/AcsTaskDTO.java} | 4 +- .../org/nl/wms/sch/task/util/TaskUtils.java | 50 ++ .../wql/TASK.wql} | 42 +- .../nl/wms/sch/tasks/PointToPointTask.java | 79 --- .../org/nl/wms/sch/tasks/RegionTypeEnum.java | 44 -- .../callEmpty/GjxCallEmpVehicleTask.java | 429 --------------- .../callEmpty/YqxCallEmpVehicleTask.java | 434 --------------- .../wql/QSCH_GjxCallEmpVehicleTask.wql | 60 --- .../wql/QSCH_YqxCallEmpVehicleTask.wql | 60 --- .../callMaterial/YqxCallMaterialTask.java | 258 --------- .../wql/QSCH_yqxCallMAterial_01.wql | 71 --- .../org/nl/wms/sch/tasks/cpOut/CpOutTask.java | 235 --------- .../wms/sch/tasks/cpOut/wql/QSCH_cpOut_01.wql | 59 --- .../tasks/sendEmpty/HtSendEmpVehicleTask.java | 438 ---------------- .../sendEmpty/YqxSendEmpVehicleTask.java | 391 -------------- .../sendMaterial/GjxSendMaterialTask.java | 384 -------------- .../sendMaterial/HkxSendMaterialTask.java | 263 ---------- .../sendMaterial/YqxSendMaterialTask.java | 263 ---------- .../wql/QSCH_gjxSendMaterial_01.wql | 101 ---- .../wql/QSCH_hkxSendMaterial_01.wql | 69 --- .../service/impl/RegionIoServiceImpl.java | 49 +- .../structivt/rest/StructivtController.java | 1 + .../structivt/service/StructivtService.java | 17 +- .../service/impl/StructivtServiceImpl.java | 24 +- .../wms/st/structivt/wql/ST_IVT_STRUCTIVT.wql | 93 ++-- .../org/nl/wms/st/vm/rest/VMController.java | 44 ++ .../org/nl/wms/st/vm/service/VMService.java | 31 ++ .../wms/st/vm/service/impl/VMServiceImpl.java | 52 ++ .../wms/st/vm/wql/ST_IVT_VEHICLE_MATERIAL.wql | 81 +++ .../java/org/nl/wms/util/CommonUtils.java | 45 ++ .../src/main/java/org/nl/wms/wms.xls | Bin 291328 -> 272896 bytes .../src/views/wms/basedata/material/index.vue | 122 +++-- .../src/views/wms/basedata/vehicle/index.vue | 120 ++++- .../src/views/wms/sch/point/index.vue | 111 ++-- .../src/views/wms/sch/region/index.vue | 18 +- .../src/views/wms/sch/task/index.vue | 20 +- lms/nladmin-ui/src/views/wms/st/vm/index.vue | 162 ++++++ lms/nladmin-ui/src/views/wms/st/vm/vm.js | 35 ++ lms/nladmin-ui/src/views/wms/st/ysa/index.vue | 2 +- .../src/views/wms/st/ysa/inventory.vue | 106 ++-- 84 files changed, 1398 insertions(+), 5721 deletions(-) delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/ext/auto/AutoQueryTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/rest/CallMaterialController.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/CallMaterialService.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/impl/CallMaterialServiceImpl.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/wql/PDA_CALLMATERIAL_01.wql delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/rest/CallVehicleController.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/service/CallVehicleService.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/service/impl/CallVehicleServiceImpl.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/wql/PDA_CALLVEHICLE_01.wql delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/login/test.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/login/wql/QPADSTSETSERVICE.wql delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/rest/SendMaterialController.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/service/SendMaterialService.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/service/impl/SendMaterialServiceImpl.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/wql/PDA_SENDMATERIAL_01.wql delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/rest/SendVehicleController.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/SendVehicleService.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/impl/SendVehicleServiceImpl.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/wql/PDA_SENDVEHICLE_01.wql rename lms/nladmin-system/src/main/java/org/nl/wms/sch/{AcsUtil.java => AcsUtils.java} (98%) create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/base/point/LockType.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/base/point/PointStatus.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/base/region/RegionEnum.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/task/CallEmptyVehicleTask.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/task/CreateMode.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/task/TaskFinishedType.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/task/TaskStatus.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/task/TaskType.java rename lms/nladmin-system/src/main/java/org/nl/wms/sch/{tasks/AcsTaskDto.java => task/dto/AcsTaskDTO.java} (91%) create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/task/util/TaskUtils.java rename lms/nladmin-system/src/main/java/org/nl/wms/sch/{tasks/sendMaterial/wql/QSCH_yqxSendMaterial_01.wql => task/wql/TASK.wql} (58%) delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PointToPointTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/RegionTypeEnum.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/GjxCallEmpVehicleTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/YqxCallEmpVehicleTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_GjxCallEmpVehicleTask.wql delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_YqxCallEmpVehicleTask.wql delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yqxCallMAterial_01.wql delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/cpOut/CpOutTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/cpOut/wql/QSCH_cpOut_01.wql delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/HtSendEmpVehicleTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/YqxSendEmpVehicleTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HkxSendMaterialTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/YqxSendMaterialTask.java delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_gjxSendMaterial_01.wql delete mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_hkxSendMaterial_01.wql create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/vm/rest/VMController.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/vm/service/VMService.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/vm/service/impl/VMServiceImpl.java create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/st/vm/wql/ST_IVT_VEHICLE_MATERIAL.wql create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/util/CommonUtils.java create mode 100644 lms/nladmin-ui/src/views/wms/st/vm/index.vue create mode 100644 lms/nladmin-ui/src/views/wms/st/vm/vm.js diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device/service/impl/DeviceServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/device/service/impl/DeviceServiceImpl.java index e836fd3..8a3cdab 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device/service/impl/DeviceServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device/service/impl/DeviceServiceImpl.java @@ -243,7 +243,7 @@ public class DeviceServiceImpl implements DeviceService, ApplicationAutoInitial // allDevice.remove(deviceByCode); log.info("设备删除成功!"); - if (deviceByCode != null) { + if (deviceByCode != null && deviceByCode.getDeviceDriverDefination() != null) { if (StrUtil.equals("storage", deviceByCode.getDeviceDriverDefination().getFitDeviceTypes().get(0).name())) { storageTab.delete("substring_index( storage_code,'-',1)= '" + device_code + "'"); diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/UserController.java b/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/UserController.java index 95e2b74..d82eff0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/UserController.java +++ b/lms/nladmin-system/src/main/java/org/nl/modules/system/rest/UserController.java @@ -25,6 +25,7 @@ import lombok.RequiredArgsConstructor; import org.nl.modules.common.config.RsaProperties; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.common.utils.PageUtil; +import org.nl.modules.common.utils.RedisUtils; import org.nl.modules.common.utils.RsaUtils; import org.nl.modules.common.utils.SecurityUtils; import org.nl.modules.logging.annotation.Log; @@ -67,6 +68,7 @@ public class UserController { private final DataService dataService; private final DeptService deptService; private final RoleService roleService; + private final RedisUtils redisUtils; @ApiOperation("导出用户数据") @GetMapping(value = "/download") @@ -144,6 +146,12 @@ public class UserController { if (currentLevel > optLevel) { throw new BadRequestException("角色权限不足,不能删除:" + userService.findById(id).getUsername()); } + // 删除缓存信息 + UserDto userDto = userService.findById(id); + redisUtils.del("data::user:" + userDto.getId()); + redisUtils.del("menu::user:" + userDto.getId()); + redisUtils.del("role::auth:" + userDto.getId()); + redisUtils.del("user::username:" + userDto.getUsername()); } userService.delete(ids); return new ResponseEntity<>(HttpStatus.OK); diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/tools/rest/LocalStorageController.java b/lms/nladmin-system/src/main/java/org/nl/modules/tools/rest/LocalStorageController.java index 475274e..99ba492 100644 --- a/lms/nladmin-system/src/main/java/org/nl/modules/tools/rest/LocalStorageController.java +++ b/lms/nladmin-system/src/main/java/org/nl/modules/tools/rest/LocalStorageController.java @@ -17,6 +17,7 @@ package org.nl.modules.tools.rest; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.excel.EasyExcel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -34,6 +35,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; +import java.io.File; import java.io.IOException; /** diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/tools/service/impl/LocalStorageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/modules/tools/service/impl/LocalStorageServiceImpl.java index b980e1f..15c556f 100644 --- a/lms/nladmin-system/src/main/java/org/nl/modules/tools/service/impl/LocalStorageServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/modules/tools/service/impl/LocalStorageServiceImpl.java @@ -20,6 +20,8 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelReader; +import com.alibaba.excel.read.metadata.ReadSheet; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import org.nl.modules.common.config.FileProperties; @@ -146,30 +148,38 @@ public class LocalStorageServiceImpl implements LocalStorageService { @Override @Transactional(rollbackFor = Exception.class) public void importExcel(String path) { - WQLObject measureunitTab = WQLObject.getWQLObject("md_pb_measureunit"); - Long currentUserId = SecurityUtils.getCurrentUserId(); + ExcelReader excelReader = EasyExcel.read(path).build(); + List sheets = excelReader.excelExecutor().sheetList(); + + WQLObject materialTable = WQLObject.getWQLObject("md_me_materialbase"); + JSONObject material = new JSONObject(); + Long userId = SecurityUtils.getCurrentUserId(); String nickName = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); - List> listMap = EasyExcel.read(path).sheet().doReadSync(); - listMap.remove(0); - for (int i = 0; i < listMap.size(); i++) { - Map map = listMap.get(i); - String unit_code = String.valueOf(map.get(1)); - String unit_name = String.valueOf(map.get(2)); - JSONObject unit = new JSONObject(); - unit.put("measure_unit_id", IdUtil.getSnowflake(1, 1).nextId()); - unit.put("unit_code", unit_code); - unit.put("unit_name", unit_name); - unit.put("qty_precision", 2); - unit.put("is_used", 1); - unit.put("is_delete", 0); - unit.put("create_id", currentUserId); - unit.put("create_name", nickName); - unit.put("create_time", now); - unit.put("update_optid", currentUserId); - unit.put("update_optname", nickName); - unit.put("update_time", now); - measureunitTab.insert(unit); + + for (ReadSheet sheet : sheets) { + List> materials = EasyExcel.read(path).sheet(sheet.getSheetNo()).doReadSync(); + for (Map materialMap : materials) { + String id = materialMap.get(1); + material.put("material_id", id); + material.put("material_name", materialMap.get(2)); + material.put("base_unit", materialMap.get(3)); + material.put("pack_qty", materialMap.get(4) == null ? 0 : Double.parseDouble(materialMap.get(4))); + + material.put("is_used", '1'); + material.put("is_delete", '0'); + material.put("create_id", userId); + material.put("create_name", nickName); + material.put("create_time", now); + material.put("update_optid", userId); + material.put("update_optname", nickName); + material.put("update_time", now); + if (ObjectUtil.isNotEmpty(materialTable.query("material_id = " + id).uniqueResult(0))) { + materialTable.update(material); + } else { + materialTable.insert(material); + } + } } } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/dto/MaterialbaseDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/dto/MaterialbaseDto.java index b8b4ac8..036b9f5 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/dto/MaterialbaseDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/dto/MaterialbaseDto.java @@ -37,7 +37,7 @@ public class MaterialbaseDto implements Serializable { private String english_name; - private long base_unit_id; + private String base_unit; private long assist_unit_id; private String base_unit_name; @@ -62,9 +62,9 @@ public class MaterialbaseDto implements Serializable { /** * 计量单位 */ - private Long weight_unit_id; + private Long weight_unit; - private BigDecimal gross_weight; + private BigDecimal weight; private BigDecimal net_weight; @@ -101,5 +101,5 @@ public class MaterialbaseDto implements Serializable { private Long product_series; - private Integer standing_time; + private BigDecimal pack_qty; } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/dto/VehicleDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/dto/VehicleDto.java index c8fe954..8816dd7 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/dto/VehicleDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/dto/VehicleDto.java @@ -72,4 +72,7 @@ public class VehicleDto implements Serializable { /** 修改时间 */ private String update_time; + + // 载具状态 + private String vehicle_status; } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/MaterialbaseServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/MaterialbaseServiceImpl.java index 8b69b3f..33ab220 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/MaterialbaseServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/MaterialbaseServiceImpl.java @@ -111,10 +111,7 @@ public class MaterialbaseServiceImpl implements MaterialbaseService { public MaterialbaseDto findById(Long material_id) { WQLObject wo = WQLObject.getWQLObject("md_me_materialbase"); JSONObject json = wo.query("material_id =" + material_id + "").uniqueResult(0); - String unit_name = WQLObject.getWQLObject("md_pb_measureunit").query("measure_unit_id= '" + json.getString("base_unit_id") + "'").uniqueResult(0).getString("unit_name"); - json.put("base_unit_name", unit_name); - final MaterialbaseDto obj = json.toJavaObject(MaterialbaseDto.class); - return obj; + return json.toJavaObject(MaterialbaseDto.class); } @Override @@ -138,7 +135,8 @@ public class MaterialbaseServiceImpl implements MaterialbaseService { String nickName = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); - dto.setMaterial_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setMaterial_id(IdUtil.getSnowflake(1L, 1L).nextId()); + dto.setIs_used("1"); dto.setCreate_id(currentUserId); dto.setCreate_name(nickName); dto.setUpdate_optid(currentUserId); @@ -173,19 +171,17 @@ public class MaterialbaseServiceImpl implements MaterialbaseService { @Override @Transactional(rollbackFor = Exception.class) public void deleteAll(Long[] ids) { - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - - WQLObject wo = WQLObject.getWQLObject("md_me_materialbase"); - for (Long material_id : ids) { - JSONObject param = new JSONObject(); - param.put("material_id", String.valueOf(material_id)); - param.put("is_delete", "1"); - param.put("update_optid", currentUserId); - param.put("update_optname", nickName); - param.put("update_time", now); - wo.update(param); + WQLObject VMTable = WQLObject.getWQLObject("st_ivt_vehicle_material"); + WQLObject vehicleTable = WQLObject.getWQLObject("md_pb_vehicle"); + WQLObject materialTable = WQLObject.getWQLObject("md_me_materialbase"); + for (Long materialId : ids) { + JSONObject vm = VMTable.query("material_id = " + materialId).uniqueResult(0); + if (ObjectUtil.isNotEmpty(vm)) { + throw new BadRequestException("载具号" + + vehicleTable.query("vehicle_id = " + vm.getString("vehicle_id")).uniqueResult(0).getString("vehicle_code") + + "存放了" + materialTable.query("material_id = " + materialId).uniqueResult(0).getString("material_name")); + } + materialTable.delete("material_id = " + materialId); } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/VehicleServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/VehicleServiceImpl.java index 8fdd0c7..776e0af 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/VehicleServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/service/impl/VehicleServiceImpl.java @@ -11,6 +11,7 @@ import org.nl.modules.system.util.CodeUtil; import org.nl.modules.wql.WQL; import org.nl.wms.basedata.service.VehicleService; import org.nl.wms.basedata.service.dto.VehicleDto; +import org.nl.wms.util.CommonUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -43,12 +44,10 @@ public class VehicleServiceImpl implements VehicleService { @Override public Map queryAll(Map whereJson, Pageable page){ - String vehicle_code = MapUtil.getStr(whereJson, "vehicle_code"); - JSONObject map = new JSONObject(); map.put("flag", "1"); - map.put("vehicle_type", MapUtil.getStr(whereJson, "vehicle_type")); - if (ObjectUtil.isNotEmpty(vehicle_code)) map.put("vehicle_code","%"+vehicle_code+"%"); + map.put("vehicle_status", MapUtil.getStr(whereJson, "vehicle_status")); + map.put("vehicle_code", MapUtil.getStr(whereJson, "vehicle_code")); JSONObject json = WQL.getWO("QMD_PB_VEHICLE").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "create_time DESC"); return json; @@ -84,45 +83,16 @@ public class VehicleServiceImpl implements VehicleService { @Override @Transactional(rollbackFor = Exception.class) - public JSONArray create(JSONObject WhereJson) { + public JSONArray create(JSONObject param) { + JSONObject vehicle = new JSONObject(); + vehicle.put("vehicle_id", IdUtil.getSnowflake(1, 1).nextId()); + vehicle.put("vehicle_code", param.getString("vehicle_code")); + vehicle.put("vehicle_status", param.getString("vehicle_status")); + CommonUtils.addCommonColum(vehicle); - WQLObject wo = WQLObject.getWQLObject("md_pb_vehicle"); + WQLObject.getWQLObject("md_pb_vehicle").insert(vehicle); - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - - String vehicle_type = WhereJson.getString("vehicle_type"); - String code = ""; - switch (vehicle_type) { - case "01": - code = "1m3_ttp"; - break; - case "02": - code = "1m6_ttp"; - break; - case "03": - code = "1m9_ttp"; - break; - } - - JSONArray resultCodeArr = new JSONArray(); - int num = WhereJson.getIntValue("num"); - for (int i = 0; i < num; i++) { - VehicleDto dto = new VehicleDto(); - dto.setVehicle_id(IdUtil.getSnowflake(1,1).nextId()); - dto.setVehicle_code(CodeUtil.getNewCode(code)); - dto.setVehicle_name(dto.getVehicle_code()); - dto.setVehicle_type(vehicle_type); - dto.setCreate_id(currentUserId); - dto.setCreate_name(nickName); - dto.setCreate_time(now); - - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - wo.insert(json); - resultCodeArr.add(dto.getVehicle_code()); - } - return resultCodeArr; + return new JSONArray(); } @Override @@ -131,13 +101,9 @@ public class VehicleServiceImpl implements VehicleService { VehicleDto entity = this.findById(dto.getVehicle_id()); if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - - String now = DateUtil.now(); - dto.setUpdate_time(now); - dto.setUpdate_optid(currentUserId); - dto.setUpdate_optname(nickName); + dto.setUpdate_optid(SecurityUtils.getCurrentUserId()); + dto.setUpdate_optname(SecurityUtils.getCurrentNickName()); + dto.setUpdate_time(DateUtil.now()); WQLObject wo = WQLObject.getWQLObject("md_pb_vehicle"); JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); @@ -147,19 +113,19 @@ public class VehicleServiceImpl implements VehicleService { @Override @Transactional(rollbackFor = Exception.class) public void deleteAll(Long[] ids) { - Long currentUserId = SecurityUtils.getCurrentUserId(); - String nickName = SecurityUtils.getCurrentNickName(); - String now = DateUtil.now(); - - WQLObject wo = WQLObject.getWQLObject("md_pb_vehicle"); - for (Long vehicle_id: ids) { - JSONObject param = new JSONObject(); - param.put("vehicle_id", String.valueOf(vehicle_id)); - param.put("is_delete", "1"); - param.put("update_optid", currentUserId); - param.put("update_optname", nickName); - param.put("update_time", now); - wo.update(param); + WQLObject VMTable = WQLObject.getWQLObject("st_ivt_vehicle_material"); + WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); + WQLObject vehicleTable = WQLObject.getWQLObject("md_pb_vehicle"); + for (Long vehicleId: ids) { + JSONObject vm = VMTable.query("vehicle_id = " + vehicleId).uniqueResult(0); + String vehicleCode = vehicleTable.query("vehicle_id = " + vehicleId).uniqueResult(0).getString("vehicle_code"); + if (ObjectUtil.isNotEmpty(vm)) { + throw new BadRequestException("载具号" + vehicleCode + "存在组盘信息"); + } + JSONObject point = new JSONObject(); + point.put("vehicle_code", null); + pointTable.update(point, "vehicle_code = " + vehicleCode); + vehicleTable.delete("vehicle_id = " + vehicleId); } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/wql/QMD_ME_MATERIAL.wql b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/wql/QMD_ME_MATERIAL.wql index fb52826..7a31397 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/wql/QMD_ME_MATERIAL.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/wql/QMD_ME_MATERIAL.wql @@ -44,35 +44,18 @@ IF 输入.flag = "1" PAGEQUERY SELECT - mb.*, - class.class_code, - class.class_name, - unit_name, - '50' as standard_weight, - unit_name as base_unit_id_name, - class2.class_code as product_series_code, - class2.class_name as product_series_name - + mb.* FROM md_me_materialbase mb - LEFT JOIN MD_PB_ClassStandard class ON class.class_id = mb.material_type_id - LEFT JOIN md_pb_measureunit unit ON unit.measure_unit_id = mb.base_unit_id - left join MD_PB_ClassStandard class2 on class2.class_id =mb.product_series WHERE - mb.is_delete = '0' - and 输入.idssql + mb.is_delete = '0' + AND 输入.idssql OPTION 输入.search <> "" - ( - mb.material_code like 输入.search - OR - mb.material_name like 输入.search - ) - ENDOPTION - OPTION 输入.class_code <> "" - class.class_code like 输入.class_code - ENDOPTION - OPTION 输入.classIds <> "" - class.class_id in 输入.classIds + ( + mb.material_id like 输入.search + OR + mb.material_name like 输入.search + ) ENDOPTION ENDSELECT ENDPAGEQUERY diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/wql/QMD_PB_VEHICLE.wql b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/wql/QMD_PB_VEHICLE.wql index 214993c..0c353a2 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/wql/QMD_PB_VEHICLE.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/wql/QMD_PB_VEHICLE.wql @@ -14,8 +14,8 @@ ## 表字段对应输入参数 ################################################# 输入.flag TYPEAS s_string - 输入.vehicle_type TYPEAS s_string 输入.vehicle_code TYPEAS s_string + 输入.vehicle_status TYPEAS s_string [临时表] --这边列出来的临时表就会在运行期动态创建 @@ -46,16 +46,13 @@ FROM md_pb_vehicle WHERE - 1=1 - + 1 = 1 OPTION 输入.vehicle_code <> "" - vehicle_code like 输入.vehicle_code + vehicle_code LIKE CONCAT( '%', 输入.vehicle_code, '%' ) ENDOPTION - - OPTION 输入.vehicle_type <> "" - vehicle_type = 输入.vehicle_type + OPTION 输入.vehicle_status <> "" + vehicle_status = 输入.vehicle_status ENDOPTION - ENDSELECT ENDPAGEQUERY ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index cfff4c4..71ba6cb 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,27 +2,17 @@ package org.nl.wms.ext.acs.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.modules.wql.util.SpringContextHolder; import org.nl.wms.ext.acs.service.AcsToWmsService; import org.nl.wms.log.LokiLog; import org.nl.wms.log.LokiLogType; import org.nl.wms.sch.manage.TaskStatusEnum; import org.nl.wms.sch.service.TaskService; -import org.nl.wms.sch.tasks.callEmpty.GjxCallEmpVehicleTask; -import org.nl.wms.sch.tasks.callEmpty.YqxCallEmpVehicleTask; -import org.nl.wms.sch.tasks.callMaterial.YqxCallMaterialTask; -import org.nl.wms.sch.tasks.sendEmpty.HtSendEmpVehicleTask; -import org.nl.wms.sch.tasks.sendEmpty.YqxSendEmpVehicleTask; -import org.nl.wms.sch.tasks.sendMaterial.GjxSendMaterialTask; -import org.nl.wms.sch.tasks.sendMaterial.HkxSendMaterialTask; -import org.nl.wms.sch.tasks.sendMaterial.YqxSendMaterialTask; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -169,129 +159,6 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { @Override @Transactional(rollbackFor = Exception.class) public JSONObject apply(JSONObject whereJson) { - String type = whereJson.getString("type"); - String point_code = whereJson.getString("point_code"); - String vehicle_type = whereJson.getString("vehicle_type"); - String vehicle_code = whereJson.getString("vehicle_code"); - //载具数量 - String vehicle_num = whereJson.getString("vehicle_num"); - //物料数量 - String material_num = whereJson.getString("material_num"); - - if (ObjectUtil.isEmpty(type)) throw new BadRequestException("类型不能为空"); - if (ObjectUtil.isEmpty(point_code)) throw new BadRequestException("点位不能为空"); - - /* - * 根据type判断是什么业务类型: - * 1.共挤线申请空盘 - * 2.共挤线满托入库 - * 3.油漆线申请空盘 - * 4.油漆线申请物料 - * 5.油漆线空盘入库 - * 6.一楼空盘入库 (有载具号) - * 7.油漆线->输送线(油漆线满料) - * 8.豪凯自动线下料入库 - */ - if (StrUtil.equals(type, "1")) { - // 1.共挤线申请空盘: 调用空托盘出库处理类创建任务 - if (ObjectUtil.isEmpty(vehicle_num)) throw new BadRequestException("数量不能为空"); - - JSONObject param = new JSONObject(); - param.put("point_code2", point_code); - param.put("vehicle_type", vehicle_type); - param.put("qty", material_num); - // 创建任务 - GjxCallEmpVehicleTask taskBean = SpringContextHolder.getBean(GjxCallEmpVehicleTask.class); - taskBean.createTask(param); - - } else if (StrUtil.equals(type, "2")) { - // 2.共挤线满托入库: 调用物料入库处理类创建任务 - if (ObjectUtil.isEmpty(material_num) || (StrUtil.equals(material_num, "0"))) - throw new BadRequestException("物料数量不能为空或者为0"); - - JSONObject param = new JSONObject(); - param.put("point_code1", point_code); // 满料位 - param.put("qty", material_num); // 满料位 - param.put("vehicle_type", vehicle_type); - param.put("vehicle_code", vehicle_code); - - GjxSendMaterialTask taskBean = SpringContextHolder.getBean(GjxSendMaterialTask.class); - String task_id = taskBean.createTask(param); // 创建任务 - } else if (StrUtil.equals(type, "3")) { - // 3.油漆线申请空盘: 调用空托盘出库处理类创建任务 - if (ObjectUtil.isEmpty(vehicle_num)) throw new BadRequestException("数量不能为空"); - - JSONObject param = new JSONObject(); - param.put("point_code2", point_code); - param.put("qty", vehicle_num); - // 创建任务 - YqxCallEmpVehicleTask taskBean = SpringContextHolder.getBean(YqxCallEmpVehicleTask.class); - String task_id = taskBean.createTask(param); - } else if (StrUtil.equals(type, "4")) { - // 4.油漆线申请物料: 调用物料出库库处理类创建任务 - JSONObject param = new JSONObject(); - param.put("point_code2", point_code); // 叫料点 - param.put("io_type", "2"); - param.put("vehicle_type", vehicle_type); - param.put("vehicle_code", vehicle_code); - param.put("material_num", material_num); - // 创建任务 - YqxCallMaterialTask taskBean = SpringContextHolder.getBean(YqxCallMaterialTask.class); - String task_id = taskBean.createTask(param); - - } else if (StrUtil.equals(type, "5")) { - // 5.油漆线空盘入库: 调用空托盘入库处理类创建任务 - if (ObjectUtil.isEmpty(point_code)) throw new BadRequestException("点位不能为空"); - if (ObjectUtil.isEmpty(vehicle_num)) throw new BadRequestException("数量不能为空"); - if (ObjectUtil.isEmpty(vehicle_type)) throw new BadRequestException("载具类型不能为空"); - - JSONObject param = new JSONObject(); - param.put("point_code1", point_code); - param.put("qty", vehicle_num); - param.put("vehicle_type", vehicle_type); - // 创建任务 - YqxSendEmpVehicleTask taskBean = SpringContextHolder.getBean(YqxSendEmpVehicleTask.class); - taskBean.createTask(param); - - - } else if (StrUtil.equals(type, "6")) { - // 6.一楼空盘入库 (有载具号): 调用空托盘入库处理类创建任务 - if (ObjectUtil.isEmpty(vehicle_code)) throw new BadRequestException("载具号不能为空"); - JSONObject param = new JSONObject(); - - // 查询载具号对应的数量 - JSONObject jsonVeQty = new JSONObject(); - if (ObjectUtil.isEmpty(vehicle_num)) { - if (ObjectUtil.isEmpty(jsonVeQty)) throw new BadRequestException("请先手持扫码"); - } else { - jsonVeQty.put("qty", vehicle_num); - } - - param.put("qty", jsonVeQty.getString("qty")); - param.put("point_code1", point_code); - param.put("vehicle_code", vehicle_code); - param.put("vehicle_type", vehicle_type); - // 创建任务 - HtSendEmpVehicleTask taskBean = SpringContextHolder.getBean(HtSendEmpVehicleTask.class); - String task_id = taskBean.createTask(param); - - } else if (StrUtil.equals(type, "7")) { - JSONObject param = new JSONObject(); - param.put("point_code1", point_code); - param.put("qty", material_num); - // 1.生成起点确定的任务 - SpringContextHolder.getBean(YqxSendMaterialTask.class).createTask(param); - } else if (StrUtil.equals(type, "8")) { - // 8.豪凯自动线下料入库 - JSONObject param = new JSONObject(); - param.put("point_code1", point_code); - param.put("vehicle_code", vehicle_code); - param.put("vehicle_type", vehicle_type); - param.put("qty", material_num); - HkxSendMaterialTask taskBean = SpringContextHolder.getBean(HkxSendMaterialTask.class); - String task_id = taskBean.createTask(param); - - } return null; } } 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 9c28278..7d5c153 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 @@ -5,7 +5,7 @@ import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.wms.ext.acs.service.WmsToAcsService; -import org.nl.wms.sch.AcsUtil; +import org.nl.wms.sch.AcsUtils; import org.springframework.stereotype.Service; import java.util.Map; @@ -17,13 +17,13 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { @Override public Map issueTaskToAcs(JSONArray arr) { String api = "api/wms/task"; - return AcsUtil.notifyAcs(api, arr); + return AcsUtils.notifyAcs(api, arr); } @Override public Map cancelToAcs(JSONArray arr) { String api = "api/wms/cancelTask"; - return AcsUtil.notifyAcs(api, arr); + return AcsUtils.notifyAcs(api, arr); } @Override @@ -33,25 +33,25 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { //0,1,2 param.put("has_goods", ""); String api = "api/wms/updateDeviceGoods"; - return AcsUtil.notifyAcs(api, arr); + return AcsUtils.notifyAcs(api, arr); } @Override public Map order(JSONArray arr) { String api = "api/wms/order"; - return AcsUtil.notifyAcs(api, arr); + return AcsUtils.notifyAcs(api, arr); } @Override public Map orderStatusUpdate(JSONArray arr) { String api = "api/wms/orderStatusUpdate"; - return AcsUtil.notifyAcs(api, arr); + return AcsUtils.notifyAcs(api, arr); } @Override public JSONObject getPointStatus(JSONArray whereJson) { String api = "api/wms/querydevice"; - return AcsUtil.notifyAcs(api, whereJson); + return AcsUtils.notifyAcs(api, whereJson); } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/auto/AutoQueryTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/auto/AutoQueryTask.java deleted file mode 100644 index 7614ba1..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/auto/AutoQueryTask.java +++ /dev/null @@ -1,141 +0,0 @@ -package org.nl.wms.ext.auto; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.modules.wql.util.SpringContextHolder; -import org.nl.wms.ext.acs.service.WmsToAcsService; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.PointToPointTask; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@RequiredArgsConstructor -@Slf4j -public class AutoQueryTask { - - private final WmsToAcsService wmsToAcsService; - - @Transactional - public void run() { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - - PointToPointTask pointTaskBean = SpringContextHolder.getBean(PointToPointTask.class); - - // 1.查找起点为油漆线 物料下料位的任务 - JSONArray taskArr = WQL.getWO("AUTO_QUERYTASK").addParam("flag", "1").process().getResultJSONArray(0); - - for (int i = 0; i < taskArr.size(); i++) { - JSONObject jsonTask = taskArr.getJSONObject(i); - /* - * 1.查找输送线有没有空位 输送线1对1关系 调用获取点位状态接口 - * 2.判断有空位的输送线是否有任务:起点和终点都要判断 - * 输送线点位:SSX01A1 - SSX01A2 ,SSX02A1 - SSX02A2 - */ - // 2.查找输送线空位,调用获取点位状态接口 - JSONArray paramArr = new JSONArray(); - - JSONObject pointA1 = new JSONObject(); - pointA1.put("device_code", "SSX01A1"); - paramArr.add(pointA1); - - JSONObject pointA2 = new JSONObject(); - pointA2.put("device_code", "SSX01A2"); - paramArr.add(pointA2); - - JSONObject pointB1 = new JSONObject(); - pointB1.put("device_code", "SSX02A1"); - paramArr.add(pointB1); - - JSONObject pointB2 = new JSONObject(); - pointB2.put("device_code", "SSX02A2"); - paramArr.add(pointB2); - - JSONObject result = wmsToAcsService.getPointStatus(paramArr); - - if (StrUtil.equals(result.getString("status"), "200")) { - JSONObject jsonPointAfter = new JSONObject(); // 处理后的json - - JSONArray dataArr = result.getJSONArray("data"); - // 3.处理返回的数据,处理后为json,key为点位编码,value为状态 - for (int j = 0; j < dataArr.size(); j++) { - JSONObject jsonObject = dataArr.getJSONObject(j); - - String device_code = jsonObject.getString("device_code"); - switch (device_code) { - case "SSX01A1" : - jsonPointAfter.put("SSX01A1",jsonObject.getString("move")); - break; - case "SSX01A2" : - jsonPointAfter.put("SSX01A2",jsonObject.getString("move")); - break; - case "SSX02A1" : - jsonPointAfter.put("SSX02A1",jsonObject.getString("move")); - break; - case "SSX02A2" : - jsonPointAfter.put("SSX02A2",jsonObject.getString("move")); - break; - } - } - JSONObject map = new JSONObject(); - // 4.1判断SSX01A1 、 SSX01A2是否是空位 无任务 - if (StrUtil.equals(jsonPointAfter.getString("SSX01A1"), "0") && StrUtil.equals(jsonPointAfter.getString("SSX01A2"), "0")) { - // 4.2如果都是空位 则判断是否有正在进行的任务 - map.put("flag", "2"); - map.put("point_code1", "('SSX01A1','SSX01A2')"); - // 查找起点是否有任务 - JSONArray is_stara = WQL.getWO("AUTO_QUERYTASK").addParamMap(map).process().getResultJSONArray(0); - // 查询终点是否有任务 - map.put("flag", "3"); - map.put("end_point_code", "('SSX01A1','SSX01A2')"); - JSONArray is_end = WQL.getWO("AUTO_QUERYTASK").addParamMap(map).process().getResultJSONArray(0); - - if (ObjectUtil.isEmpty(is_stara) && ObjectUtil.isEmpty(is_end)) { - // 4.3.更新任务终点点位 - jsonTask.put("point_code2", "SSX01A1"); - taskTab.update(jsonTask); - // 4.4.下发ACS - JSONObject jsonResultAcs = pointTaskBean.notifyAcs(jsonTask.getString("task_id")); - - if (StrUtil.equals(jsonResultAcs.getString("status"), "200")) { - // 4.5.下发成功、更新任务状态 - jsonTask.put("task_status", TaskStatusEnum.ISSUE.getCode()); - taskTab.update(jsonTask); - } - // 5.1判断SSX02A1 、 SSX02A2是否是空位 无任务 - } else if (StrUtil.equals(jsonPointAfter.getString("SSX02A1"), "0") && StrUtil.equals(jsonPointAfter.getString("SSX02A2"), "0")) { - // 5.2如果都是空位 则判断是否有正在进行的任务 - map.put("flag", "2"); - map.put("point_code1", "('SSX02A1','SSX02A2')"); - // 查找起点是否有任务 - JSONArray is_stara2 = WQL.getWO("AUTO_QUERYTASK").addParamMap(map).process().getResultJSONArray(0); - // 查询终点是否有任务 - map.put("flag", "3"); - map.put("end_point_code", "('SSX02A1','SSX02A2')"); - JSONArray is_end2 = WQL.getWO("AUTO_QUERYTASK").addParamMap(map).process().getResultJSONArray(0); - - if (ObjectUtil.isEmpty(is_stara2) && ObjectUtil.isEmpty(is_end2)) { - // 5.3.更新任务终点点位 - jsonTask.put("point_code2", "SSX02A1"); - taskTab.update(jsonTask); - // 5.4.下发ACS - JSONObject jsonResultAcs = pointTaskBean.notifyAcs(jsonTask.getString("task_id")); - - if (StrUtil.equals(jsonResultAcs.getString("status"), "200")) { - // 4.5.下发成功、更新任务状态 - jsonTask.put("task_status", TaskStatusEnum.ISSUE.getCode()); - taskTab.update(jsonTask); - } - } - } - } - } - } - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/rest/CallMaterialController.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/rest/CallMaterialController.java deleted file mode 100644 index 322deb7..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/rest/CallMaterialController.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.nl.wms.pda.callmaterial.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.pda.callmaterial.service.CallMaterialService; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequiredArgsConstructor -@Api(tags = "手持叫料") -@RequestMapping("api/pda/callMaterial") -@Slf4j -public class CallMaterialController { - - private final CallMaterialService callMaterialService; - - @PostMapping("/queryPoint") - @Log("查询区域点位") - @ApiOperation("查询区域点位") - public ResponseEntity queryPoint() { - return new ResponseEntity<>(callMaterialService.queryPoint(), HttpStatus.OK); - } - - @PostMapping("/confirm") - @Log("叫料确定") - @ApiOperation("叫料确定") - public ResponseEntity confirm(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(callMaterialService.confirm(whereJson), HttpStatus.OK); - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/CallMaterialService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/CallMaterialService.java deleted file mode 100644 index e85a64b..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/CallMaterialService.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.nl.wms.pda.callmaterial.service; - -import com.alibaba.fastjson.JSONObject; - -public interface CallMaterialService { - - /** - * 查询区域点位 - * @return json - */ - JSONObject queryPoint(); - - /** - * 叫料确定 - * @param whereJson / - * @return JSONObject - */ - JSONObject confirm(JSONObject whereJson); -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/impl/CallMaterialServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/impl/CallMaterialServiceImpl.java deleted file mode 100644 index 7c1ac15..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/service/impl/CallMaterialServiceImpl.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.nl.wms.pda.callmaterial.service.impl; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.wql.WQL; -import org.nl.wms.ext.acs.service.AcsToWmsService; -import org.nl.wms.pda.callmaterial.service.CallMaterialService; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@RequiredArgsConstructor -@Slf4j -public class CallMaterialServiceImpl implements CallMaterialService { - private final AcsToWmsService acsToWmsService; - - @Override - public JSONObject queryPoint() { - JSONObject result = new JSONObject(); - // 1.查询区域:油漆区域 YQQY01 - JSONArray regionArr = WQL.getWO("PDA_CALLMATERIAL_01").addParam("flag", "1").process().getResultJSONArray(0); - // 2.根据区域查询对应的物料上料位 - JSONObject resultJson = new JSONObject(); - for (int i = 0; i < regionArr.size(); i++) { - JSONObject jsonRegion = regionArr.getJSONObject(i); - JSONArray pointArr = WQL.getWO("PDA_CALLMATERIAL_01").addParam("flag", "2").addParam("region_id", jsonRegion.getString("region_id")).process().getResultJSONArray(0); - jsonRegion.put("pointArr", pointArr); - } - resultJson.put("regionja", regionArr); - result.put("result", resultJson); - result.put("code", "1"); - result.put("desc", "查询成功"); - return result; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public JSONObject confirm(JSONObject whereJson) { - JSONObject result = new JSONObject(); - // 1、准备参数:point_code、type = 4 - JSONObject param = new JSONObject(); - param.put("type", "4"); - param.put("point_code", whereJson.getString("point_code")); - // 2、调用接口 - JSONObject json = acsToWmsService.apply(param); - if (ObjectUtil.isEmpty(json) || StrUtil.equals(json.getString("status"), "200")) { - result.put("result", ""); - result.put("code", "1"); - result.put("desc", "操作成功"); - } else { - result.put("result", ""); - result.put("code", "0"); - result.put("desc", "操作失败:" + json.getString("message")); - } - return result; - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/wql/PDA_CALLMATERIAL_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/wql/PDA_CALLMATERIAL_01.wql deleted file mode 100644 index 41b449f..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callmaterial/wql/PDA_CALLMATERIAL_01.wql +++ /dev/null @@ -1,75 +0,0 @@ -[交易说明] - 交易名: 手持叫料查询 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.region_id TYPEAS s_string - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - QUERY - SELECT - region_id, - region_code, - region_name - FROM - sch_base_region - WHERE - region_code = 'YQQY01' - - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "2" - QUERY - SELECT - point_id, - point_code, - point_name - FROM - sch_base_point - WHERE - is_used = '1' - AND is_delete = '0' - AND point_type = '3' - - OPTION 输入.region_id <> "" - region_id = 输入.region_id - ENDOPTION - - ENDSELECT - ENDQUERY - ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/rest/CallVehicleController.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/rest/CallVehicleController.java deleted file mode 100644 index 41b8b3f..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/rest/CallVehicleController.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.nl.wms.pda.callvehicle.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.pda.callvehicle.service.CallVehicleService; -import org.nl.wms.pda.sendmaterial.service.SendMaterialService; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequiredArgsConstructor -@Api(tags = "手持呼叫空托盘") -@RequestMapping("api/pda/callEmpty") -@Slf4j -public class CallVehicleController { - - private final CallVehicleService callVehicleService; - - @PostMapping("/queryPoint") - @Log("查询区域点位") - @ApiOperation("查询区域点位") - public ResponseEntity queryPoint() { - return new ResponseEntity<>(callVehicleService.queryPoint(), HttpStatus.OK); - } - - @PostMapping("/confirm") - @Log("呼叫空托盘确定") - @ApiOperation("呼叫空托盘确定") - public ResponseEntity confirm(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(callVehicleService.confirm(whereJson), HttpStatus.OK); - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/service/CallVehicleService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/service/CallVehicleService.java deleted file mode 100644 index 66d4c7b..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/service/CallVehicleService.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.nl.wms.pda.callvehicle.service; - -import com.alibaba.fastjson.JSONObject; - -public interface CallVehicleService { - - /** - * 查询区域点位 - * @return JSONObject - */ - JSONObject queryPoint(); - - /** - * 呼叫空托盘确定 - * @param whereJson / - * @return JSONObject - */ - JSONObject confirm(JSONObject whereJson); -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/service/impl/CallVehicleServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/service/impl/CallVehicleServiceImpl.java deleted file mode 100644 index 1f193db..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/service/impl/CallVehicleServiceImpl.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.nl.wms.pda.callvehicle.service.impl; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.ext.acs.service.AcsToWmsService; -import org.nl.wms.pda.callvehicle.service.CallVehicleService; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@RequiredArgsConstructor -@Slf4j -public class CallVehicleServiceImpl implements CallVehicleService { - - private final AcsToWmsService acsToWmsService; - - @Override - public JSONObject queryPoint() { - JSONObject result = new JSONObject(); - // 1.查询区域:油漆区域 YQQY01、共挤区域 GJQY01 - JSONArray regionArr = WQL.getWO("PDA_CALLVEHICLE_01").addParam("flag", "1").process().getResultJSONArray(0); - // 2.根据区域查询对应的物料上料位 - JSONObject resultJson = new JSONObject(); - for (int i = 0; i < regionArr.size(); i++) { - JSONObject jsonRegion = regionArr.getJSONObject(i); - JSONArray pointArr = WQL.getWO("PDA_CALLVEHICLE_01").addParam("flag", "2").addParam("region_id", jsonRegion.getString("region_id")).process().getResultJSONArray(0); - jsonRegion.put("pointArr", pointArr); - } - resultJson.put("regionja", regionArr); - result.put("result", resultJson); - result.put("code", "1"); - result.put("desc", "查询成功"); - return result; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public JSONObject confirm(JSONObject whereJson) { - JSONObject result = new JSONObject(); - // 1、准备参数:point_code、type:1为共挤区域,3为油漆区域 - JSONObject param = new JSONObject(); - - String region_id = whereJson.getString("region_id"); - JSONObject jsonObject = WQLObject.getWQLObject("sch_base_region").query("region_id ='" + region_id + "'").uniqueResult(0); - String region_code = jsonObject.getString("region_code"); - if (StrUtil.equals(region_code, "GJQY01")) param.put("type", "1"); - if (StrUtil.equals(region_code, "YQQY01")) param.put("type", "3"); - - param.put("point_code", whereJson.getString("point_code")); - param.put("vehicle_num", whereJson.getString("qty")); - // 2、调用接口 - JSONObject json = acsToWmsService.apply(param); - if (ObjectUtil.isEmpty(json) || StrUtil.equals(json.getString("status"), "200")) { - result.put("result", ""); - result.put("code", "1"); - result.put("desc", "操作成功"); - } else { - result.put("result", ""); - result.put("code", "0"); - result.put("desc", "操作失败:" + json.getString("message")); - } - return result; - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/wql/PDA_CALLVEHICLE_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/wql/PDA_CALLVEHICLE_01.wql deleted file mode 100644 index 65bdadd..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/callvehicle/wql/PDA_CALLVEHICLE_01.wql +++ /dev/null @@ -1,75 +0,0 @@ -[交易说明] - 交易名: 手持呼叫空托盘查询 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.region_id TYPEAS s_string - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - QUERY - SELECT - region_id, - region_code, - region_name - FROM - sch_base_region - WHERE - region_code in ('YQQY01','GJQY01') - - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "2" - QUERY - SELECT - point_id, - point_code, - point_name - FROM - sch_base_point - WHERE - is_used = '1' - AND is_delete = '0' - AND point_type = '1' - - OPTION 输入.region_id <> "" - region_id = 输入.region_id - ENDOPTION - - ENDSELECT - ENDQUERY - ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/login/test.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/login/test.java deleted file mode 100644 index 6ff556d..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/login/test.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.nl.wms.pda.login; - -/** - * @author: lyd - * @description: - * @Date: 2022/10/22 - */ -public class test { -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/login/wql/QPADSTSETSERVICE.wql b/lms/nladmin-system/src/main/java/org/nl/wms/pda/login/wql/QPADSTSETSERVICE.wql deleted file mode 100644 index a2aece6..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/login/wql/QPADSTSETSERVICE.wql +++ /dev/null @@ -1,492 +0,0 @@ -[交易说明] - 交易名: 库区分页查询 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.searchbar TYPEAS s_string - 输入.option_type TYPEAS s_string - 输入.bag_id TYPEAS s_string - 输入.bucketunique TYPEAS s_string - 输入.class_code TYPEAS s_string - 输入.component TYPEAS s_string - 输入.pid TYPEAS s_string - 输入.accountId TYPEAS s_string - 输入.workprocedure_code TYPEAS s_string - 输入.dict_type TYPEAS s_string - - - - - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - PAGEQUERY - SELECT - class.class_name, - class.class_code, - base.material_id, - base.material_code, - base.material_name, - base.material_spec, - base.material_type_id, - class.class_desc AS material_dtl_scode_name, - base.base_unit_id, - unit.unit_name AS base_unit_id_name, - ext.standard_weight as standard_weight1 , - "50" as standard_weight - FROM - MD_ME_MaterialBase base - LEFT JOIN md_pb_classstandard class ON class.class_id = base.material_type_id - LEFT JOIN MD_PB_MeasureUnit unit ON unit.measure_unit_id = base.base_unit_id - LEFT JOIN MD_ME_ProducMaterialExt ext ON ext.material_id = base.material_id - WHERE - 1 = 1 - OPTION 输入.searchbar <> "" - (base.material_code like "%" 输入.searchbar "%" - OR - base.material_name like "%" 输入.searchbar "%") - ENDOPTION - OPTION 输入.class_code <> "" - class.class_code = 输入.class_code - ENDOPTION - ENDSELECT - ENDPAGEQUERY - ENDIF - - - IF 输入.flag = "2" - QUERY - SELECT - bag.bagrecord_id, - bag.bag_id, - bag.material_id, - material.material_code as material_code , - material.material_name as material_name, - bag.pcsn, - bag.qty_unit_id, - bag.qty_unit_name, - bag.storage_qty, - bag.return_person, - bag.status, - case bag.status when '01' then '生成' - when '02' then '组桶' - when '03' then '清洗' - else '' end as status_name, - bag.waste_type, - dictdtl.label as waste_type_name - FROM - MD_PB_BagRecord AS bag - LEFT JOIN MD_ME_MaterialBase material ON material.material_id = bag.material_id - left join sys_dict_detail dictdtl on dictdtl.value =bag.waste_type and dictdtl.dict_id='46' - WHERE - 1 =1 - OPTION 输入.bag_id <> "" - bag.bag_id = 输入.bag_id - ENDOPTION - ENDSELECT - ENDQUERY - ENDIF - - - IF 输入.flag = "3" - QUERY - SELECT - curdate( ) AS create_date, - bag.bagrecord_id, - bag.bag_id, - bag.material_id, - ext_id, - material.material_code, - material.material_name, - bag.print_type, - bag.return_person, - bag.pcsn, - bag.storage_qty, - bag.print_times, - DATE_FORMAT( bag.input_time, '%Y-%m-%d' ) as input_time - FROM - MD_PB_BagRecord AS bag - LEFT JOIN md_me_materialbase AS material ON material.material_id = bag.material_id - where 1=1 - OPTION 输入.bag_id <> "" - bag.bag_id = 输入.bag_id - ENDOPTION - ENDSELECT - ENDQUERY - ENDIF - - - IF 输入.flag = "4" - QUERY - SELECT - max( sys_user.user_id )as accountId, - max( sys_user.username ) as username, - max( sys_roles_menus.menu_id ) as menu_id, - max( sys_menu.component ) as component, - max( sys_menu.path ) as path, - max( sys_menu.NAME ) as name - FROM - sys_user AS sys_user - LEFT JOIN sys_users_roles AS sys_users_roles ON sys_users_roles.user_id = sys_user.user_id - LEFT JOIN sys_role AS sys_role ON sys_role.role_id = sys_users_roles.role_id - LEFT JOIN sys_roles_menus AS sys_roles_menus ON sys_roles_menus.role_id = sys_role.role_id - LEFT JOIN sys_menu AS sys_menu ON sys_menu.menu_id = sys_roles_menus.menu_id - WHERE - sys_menu.path LIKE 'RF%' - AND sys_menu.hidden = 1 - OPTION 输入.accountId <> "" - sys_user.user_id = 输入.accountId - ENDOPTION - OPTION 输入.component <> "" - sys_menu.component = 输入.component - ENDOPTION - OPTION 输入.pid <> "" - sys_menu.pid = 输入.pid - ENDOPTION - - GROUP BY - sys_menu.menu_id, - sys_menu.title, - sys_menu.component, - sys_menu.path, - sys_menu.NAME, - sys_menu.menu_sort - ORDER BY sys_menu.menu_sort - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "5" - QUERY - SELECT - bucket.bucket_record_id, - bucket.bucketunique, - bucket.material_id, - bucket.print_type, - material_code, - material_name, - bucket.pcsn, - bucket.qty_unit_id, - bucket.qty_unit_name, - bucket.storage_qty, - bucket.STATUS, - bucket.record_order, - DATE_FORMAT( bucket.create_time, '%Y-%m-%d' ) AS date, - DATE_FORMAT( bucket.create_time, '%Y-%m-%d' ) as input_time, - ext_id, - bucket.record_order, - bucket.is_active, - "否" as is_new_name, - "0" as is_new, - case bucket.status when '01' then '生成' - when '02' then '组盘' - when '03' then '入库' - when '04' then '出库' - when '05' then '入立库' - else '' end as status_name - FROM - md_pb_bucketrecord bucket - LEFT JOIN md_me_materialbase material ON material.material_id = bucket.material_id - where 1=1 - OPTION 输入.bucketunique <> "" - bucket.bucketunique = 输入.bucketunique - ENDOPTION - ENDSELECT - ENDQUERY - ENDIF - - - IF 输入.flag = "6" - QUERY - SELECT - bag.bag_id, - bag.material_id, - material.material_code, - material.material_name, - bag.print_type, - bag.storage_qty , - "否" as is_new_name, - "0" as is_new, - bag.pcsn, - bag.return_person, - DATE_FORMAT( bag.input_time, '%Y-%m-%d' ) AS date, - DATE_FORMAT( bag.input_time, '%Y-%m-%d' ) AS input_time, - bag.bucketunique, - ext_id - FROM - MD_PB_BagRecord AS bag - LEFT JOIN md_me_materialbase AS material ON material.material_id = bag.material_id - where 1=1 - OPTION 输入.bucketunique <> "" - bag.bucketunique = 输入.bucketunique - ENDOPTION - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "7" - QUERY - SELECT - bag.bag_id, - bag.material_id, - material.material_code, - material.material_name, - bag.print_type, - bag.storage_qty, - bag.pcsn, - "是" as is_new_name, - "1" as is_new, - bag.bucketunique - FROM - MD_PB_BagRecord AS bag - LEFT JOIN md_me_materialbase AS material ON material.material_id = bag.material_id - where 1=1 - OPTION 输入.bag_id <> "" - bag.bag_id = 输入.bag_id - ENDOPTION - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "8" - QUERY - SELECT - curdate( ) AS create_date, - DATE_FORMAT( bucket.create_time, '%Y-%m-%d' ) as input_time, - ext_id, - bucket.bucket_record_id, - bucket.record_order, - bucket.is_active, - bucket.bucketunique, - bucket.material_id, - material_code, - material_name, - bucket.pcsn, - bucket.qty_unit_id, - bucket.qty_unit_name, - bucket.storage_qty, - bucket.print_type - FROM - md_pb_bucketrecord bucket - LEFT JOIN md_me_materialbase material ON material.material_id = bucket.material_id - WHERE - 1 =1 - OPTION 输入.bucketunique <> "" - bucket.bucketunique = 输入.bucketunique - ENDOPTION - ENDSELECT - ENDQUERY - ENDIF - - - IF 输入.flag = "9" - QUERY - SELECT - bucket.bucket_record_id, - bucket.bucketunique, - bucket.material_id, - material_code, - material_name, - bucket.pcsn, - bucket.qty_unit_id, - bucket.qty_unit_name, - bucket.storage_qty, - bucket.STATUS, - case bucket.status when '01' then '生成' - when '02' then '组盘' - when '03' then '入库' - when '04' then '出库' - when '05' then '入立库' - else '' end as status_name - FROM - md_pb_bucketrecord bucket - LEFT JOIN md_me_materialbase material ON material.material_id = bucket.material_id - where 1=1 - OPTION 输入.bucketunique <> "" - bucket.bucketunique = 输入.bucketunique - ENDOPTION - ENDSELECT - ENDQUERY - ENDIF - - - IF 输入.flag = "10" - QUERY - SELECT - dtl.VALUE AS waste_type, - dtl.label AS waste_type_name - FROM - sys_dict dict - LEFT JOIN sys_dict_detail dtl ON dict.dict_id = dtl.dict_id - WHERE - dict.NAME = 'MD_MATERIAL_WASTE_TYPE' - ENDSELECT - ENDQUERY - ENDIF - - - IF 输入.flag = "11" - PAGEQUERY - SELECT - device.device_id, - device.device_code, - device.device_name, - device.device_model, - device.device_specification, - device.workprocedure_id, - device.workprocedure_code, - device.workprocedure_name - FROM - em_bi_deviceinfo device - WHERE - 1 = 1 - OPTION 输入.searchbar <> "" - (device.device_code like "%" 输入.searchbar "%" - OR - device.device_name like "%" 输入.searchbar "%") - ENDOPTION - OPTION 输入.workprocedure_code <> "" - device.workprocedure_code = 输入.workprocedure_code - ENDOPTION - ENDSELECT - ENDPAGEQUERY - ENDIF - - IF 输入.flag = "12" - QUERY - SELECT - bucket.bucket_record_id, - bucket.bucketunique, - bucket.material_id, - material_code, - material_name, - bucket.pcsn, - bucket.qty_unit_id, - bucket.qty_unit_name, - bucket.storage_qty, - bucket.STATUS, - bucket.record_order, - case bucket.status when '01' then '生成' - when '02' then '组盘' - when '03' then '入库' - when '04' then '出库' - when '05' then '入立库' - when '06' then '线下处理' - else '' end as status_name, - case bucket.status when '06' then '1' - else '0' end as is_offline_hand - FROM - md_pb_bucketrecord bucket - LEFT JOIN md_me_materialbase material ON material.material_id = bucket.material_id - where 1=1 - and bucket.status in(01,02,03,06) - OPTION 输入.bucketunique <> "" - bucket.bucketunique = 输入.bucketunique - ENDOPTION - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "13" - QUERY - SELECT - bucket.*, - mb.material_code, - mb.ext_id, - mb.material_name, - DATE_FORMAT( bucket.create_time, '%Y-%m-%d' ) as input_time - FROM - pdm_bi_formulabucketrecord bucket - LEFT JOIN md_me_materialbase mb ON mb.material_id = bucket.material_id - WHERE - 1=1 - AND - bucket.bucketunique = 输入.bucketunique - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "14" - QUERY - SELECT - bucket.*, - mb.material_code, - mb.material_name, - mb.ext_id, - DATE_FORMAT( bucket.create_time, '%Y-%m-%d' ) as input_time - FROM - md_pb_bucketrecord bucket - LEFT JOIN md_me_materialbase mb ON mb.material_id = bucket.material_id - WHERE - 1=1 - AND - bucket.bucketunique = 输入.bucketunique - AND - bucket.status IN ('01','02','03') - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "15" - QUERY - SELECT - detaial.label, - detaial.`value` - FROM - sys_dict_detail detaial - LEFT JOIN sys_dict dict ON dict.dict_id = detaial.dict_id - WHERE - dict.`name` = 输入.dict_type - OPTION 输入.dict_type = "sch_area_type" - detaial.value IN ('22','23','24') - ENDOPTION - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "16" - QUERY - SELECT - point.point_id, - point.point_code, - point.point_name - FROM - sch_base_point point - WHERE - point_name LIKE '分拣机械手%' - and device_point_type='01' - ENDSELECT - ENDQUERY - ENDIF \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/rest/SendMaterialController.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/rest/SendMaterialController.java deleted file mode 100644 index 4e283d4..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/rest/SendMaterialController.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.nl.wms.pda.sendmaterial.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.pda.sendmaterial.service.SendMaterialService; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequiredArgsConstructor -@Api(tags = "手持送料") -@RequestMapping("api/pda/sendMaterial") -@Slf4j -public class SendMaterialController { - - private final SendMaterialService sendMaterialService; - - @PostMapping("/queryPoint") - @Log("查询区域点位") - @ApiOperation("查询区域点位") - public ResponseEntity queryPoint() { - return new ResponseEntity<>(sendMaterialService.queryPoint(), HttpStatus.OK); - } - - @PostMapping("/confirm") - @Log("送料确定") - @ApiOperation("送料确定") - public ResponseEntity confirm(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(sendMaterialService.confirm(whereJson), HttpStatus.OK); - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/service/SendMaterialService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/service/SendMaterialService.java deleted file mode 100644 index 8e00ec0..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/service/SendMaterialService.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.nl.wms.pda.sendmaterial.service; - -import com.alibaba.fastjson.JSONObject; - -public interface SendMaterialService { - - /** - * 查询区域点位 - * @return JSONObject - */ - JSONObject queryPoint(); - - /** - * 送料确定 - * @param whereJson / - * @return JSONObject - */ - JSONObject confirm(JSONObject whereJson); -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/service/impl/SendMaterialServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/service/impl/SendMaterialServiceImpl.java deleted file mode 100644 index 3253249..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/service/impl/SendMaterialServiceImpl.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.nl.wms.pda.sendmaterial.service.impl; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.ext.acs.service.AcsToWmsService; -import org.nl.wms.pda.sendmaterial.service.SendMaterialService; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@RequiredArgsConstructor -@Slf4j -public class SendMaterialServiceImpl implements SendMaterialService { - - private final AcsToWmsService acsToWmsService; - - @Override - public JSONObject queryPoint() { - JSONObject result = new JSONObject(); - // 1.查询区域:豪凯区域 HKQY01、共挤区域 GJQY01 - JSONArray regionArr = WQL.getWO("PDA_SENDMATERIAL_01").addParam("flag", "1").process().getResultJSONArray(0); - // 2.根据区域查询对应的物料上料位 - JSONObject resultJson = new JSONObject(); - for (int i = 0; i < regionArr.size(); i++) { - JSONObject jsonRegion = regionArr.getJSONObject(i); - JSONArray pointArr = WQL.getWO("PDA_SENDMATERIAL_01").addParam("flag", "2").addParam("region_id", jsonRegion.getString("region_id")).process().getResultJSONArray(0); - jsonRegion.put("pointArr", pointArr); - } - resultJson.put("regionja", regionArr); - result.put("result", resultJson); - result.put("code", "1"); - result.put("desc", "查询成功"); - return result; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public JSONObject confirm(JSONObject whereJson) { - JSONObject result = new JSONObject(); - // 1、准备参数:point_code、type:2为共挤区域,8为豪凯区域 - JSONObject param = new JSONObject(); - - String region_id = whereJson.getString("region_id"); - JSONObject jsonObject = WQLObject.getWQLObject("sch_base_region").query("region_id ='" + region_id + "'").uniqueResult(0); - String region_code = jsonObject.getString("region_code"); - if (StrUtil.equals(region_code, "GJQY01")) param.put("type", "2"); - if (StrUtil.equals(region_code, "HKQY01")) param.put("type", "8"); - - param.put("point_code", whereJson.getString("point_code")); - param.put("material_num", whereJson.getString("qty")); - // 2、调用接口 - JSONObject json = acsToWmsService.apply(param); - if (ObjectUtil.isEmpty(json) || StrUtil.equals(json.getString("status"), "200")) { - result.put("result", ""); - result.put("code", "1"); - result.put("desc", "操作成功"); - } else { - result.put("result", ""); - result.put("code", "0"); - result.put("desc", "操作失败:" + json.getString("message")); - } - return result; - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/wql/PDA_SENDMATERIAL_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/wql/PDA_SENDMATERIAL_01.wql deleted file mode 100644 index 4632d02..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendmaterial/wql/PDA_SENDMATERIAL_01.wql +++ /dev/null @@ -1,75 +0,0 @@ -[交易说明] - 交易名: 手持送料查询 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.region_id TYPEAS s_string - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - QUERY - SELECT - region_id, - region_code, - region_name - FROM - sch_base_region - WHERE - region_code in ('HKQY01','GJQY01') - - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "2" - QUERY - SELECT - point_id, - point_code, - point_name - FROM - sch_base_point - WHERE - is_used = '1' - AND is_delete = '0' - AND point_type = '3' - - OPTION 输入.region_id <> "" - region_id = 输入.region_id - ENDOPTION - - ENDSELECT - ENDQUERY - ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/rest/SendVehicleController.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/rest/SendVehicleController.java deleted file mode 100644 index 150fb22..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/rest/SendVehicleController.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.nl.wms.pda.sendvehicle.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.pda.callvehicle.service.CallVehicleService; -import org.nl.wms.pda.sendmaterial.service.SendMaterialService; -import org.nl.wms.pda.sendvehicle.service.SendVehicleService; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequiredArgsConstructor -@Api(tags = "手持送空托盘") -@RequestMapping("api/pda/sendEmpty") -@Slf4j -public class SendVehicleController { - - private final SendVehicleService sendVehicleService; - - @PostMapping("/queryPoint") - @Log("查询区域点位") - @ApiOperation("查询区域点位") - public ResponseEntity queryPoint() { - return new ResponseEntity<>(sendVehicleService.queryPoint(), HttpStatus.OK); - } - - @PostMapping("/confirm") - @Log("送空托盘确定") - @ApiOperation("送空托盘确定") - public ResponseEntity confirm(@RequestBody JSONObject whereJson) { - return new ResponseEntity<>(sendVehicleService.confirm(whereJson), HttpStatus.OK); - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/SendVehicleService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/SendVehicleService.java deleted file mode 100644 index f4d5ad0..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/SendVehicleService.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.nl.wms.pda.sendvehicle.service; - -import com.alibaba.fastjson.JSONObject; - -public interface SendVehicleService { - - /** - * 查询区域点位 - * @return JSONObject - */ - JSONObject queryPoint(); - - /** - * 送空托盘确定 - * @param whereJson / - * @return JSONObject - */ - JSONObject confirm(JSONObject whereJson); -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/impl/SendVehicleServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/impl/SendVehicleServiceImpl.java deleted file mode 100644 index 6a0f17a..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/service/impl/SendVehicleServiceImpl.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.nl.wms.pda.sendvehicle.service.impl; - -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.ext.acs.service.AcsToWmsService; -import org.nl.wms.pda.sendvehicle.service.SendVehicleService; -import org.nl.wms.sch.tasks.RegionTypeEnum; - - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@RequiredArgsConstructor -@Slf4j -public class SendVehicleServiceImpl implements SendVehicleService { - - private final AcsToWmsService acsToWmsService; - - @Override - public JSONObject queryPoint() { - JSONObject result = new JSONObject(); - // 1.查询区域:输送区域 SSX01、油漆区域 YQQY01 - JSONArray regionArr = WQL.getWO("PDA_SENDVEHICLE_01").addParam("flag", "1").process().getResultJSONArray(0); - // 2.根据区域查询对应的物料上料位 - JSONObject resultJson = new JSONObject(); - for (int i = 0; i < regionArr.size(); i++) { - JSONObject jsonRegion = regionArr.getJSONObject(i); - if (StrUtil.equals(jsonRegion.getString("region_id"), RegionTypeEnum.SSX.getId())) { - JSONArray pointArr = WQL.getWO("PDA_SENDVEHICLE_01").addParam("flag", "2").addParam("region_id", jsonRegion.getString("region_id")).process().getResultJSONArray(0); - jsonRegion.put("pointArr", pointArr); - } else { - JSONArray pointArr = WQL.getWO("PDA_SENDVEHICLE_01").addParam("flag", "3").addParam("region_id", jsonRegion.getString("region_id")).process().getResultJSONArray(0); - jsonRegion.put("pointArr", pointArr); - } - } - resultJson.put("regionja", regionArr); - result.put("result", resultJson); - result.put("code", "1"); - result.put("desc", "查询成功"); - return result; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public JSONObject confirm(JSONObject whereJson) { - JSONObject result = new JSONObject(); - // 1、准备参数:point_code、type:6为输送线区域,5为油漆区域 - JSONObject param = new JSONObject(); - - String region_id = whereJson.getString("region_id"); - JSONObject jsonObject = WQLObject.getWQLObject("sch_base_region").query("region_id ='" + region_id + "'").uniqueResult(0); - String region_code = jsonObject.getString("region_code"); - if (StrUtil.equals(region_code, "SSX01")) param.put("type","6"); - if (StrUtil.equals(region_code, "YQQY01")) param.put("type","5"); - - param.put("point_code",whereJson.getString("point_code")); - param.put("vehicle_code",whereJson.getString("vehicle_code")); - param.put("vehicle_num",whereJson.getString("qty")); - // 2、调用接口 - JSONObject json = acsToWmsService.apply(param); - if (StrUtil.equals(json.getString("status"), "200")) { - result.put("result", ""); - result.put("code", "1"); - result.put("desc", "操作成功"); - } else { - result.put("result", ""); - result.put("code", "0"); - result.put("desc", "操作失败:"+json.getString("message")); - } - return result; - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/wql/PDA_SENDVEHICLE_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/wql/PDA_SENDVEHICLE_01.wql deleted file mode 100644 index b8bb4a3..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/sendvehicle/wql/PDA_SENDVEHICLE_01.wql +++ /dev/null @@ -1,96 +0,0 @@ -[交易说明] - 交易名: 手持送空托盘查询 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.region_id TYPEAS s_string - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - QUERY - SELECT - region_id, - region_code, - region_name - FROM - sch_base_region - WHERE - region_code in ('SSX01','YQQY01') - - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "2" - QUERY - SELECT - point_id, - point_code, - point_name - FROM - sch_base_point - WHERE - is_used = '1' - AND is_delete = '0' - AND point_type = '6' - - OPTION 输入.region_id <> "" - region_id = 输入.region_id - ENDOPTION - - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "3" - QUERY - SELECT - point_id, - point_code, - point_name - FROM - sch_base_point - WHERE - is_used = '1' - AND is_delete = '0' - AND point_type = '4' - - OPTION 输入.region_id <> "" - region_id = 输入.region_id - ENDOPTION - - ENDSELECT - ENDQUERY - ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/AcsUtil.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/AcsUtils.java similarity index 98% rename from lms/nladmin-system/src/main/java/org/nl/wms/sch/AcsUtil.java rename to lms/nladmin-system/src/main/java/org/nl/wms/sch/AcsUtils.java index 6884c31..85a4c26 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/AcsUtil.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/AcsUtils.java @@ -13,7 +13,7 @@ import org.springframework.http.HttpStatus; /** * ACS连接工具类: */ -public class AcsUtil { +public class AcsUtils { public static JSONObject notifyAcs(String api, JSONArray list) { //判断是否连接ACS系统 String isConnect = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("is_connect_acs").getValue(); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/base/point/LockType.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/base/point/LockType.java new file mode 100644 index 0000000..04f16bc --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/base/point/LockType.java @@ -0,0 +1,20 @@ +package org.nl.wms.sch.base.point; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author 张江玮 + * @date 2022/11/04 12:50 + */ +@AllArgsConstructor +@Getter +public enum LockType { + + UNLOCKED("1", "未锁定"), + TASK_LOCKED("2", "任务锁定"); + + private final String code; + + private final String name; +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/base/point/PointStatus.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/base/point/PointStatus.java new file mode 100644 index 0000000..dff3089 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/base/point/PointStatus.java @@ -0,0 +1,20 @@ +package org.nl.wms.sch.base.point; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author 张江玮 + * @date 2022/11/04 12:48 + */ +@AllArgsConstructor +@Getter +public enum PointStatus { + + EMPTY("1", "空位"), + HAS_VEHICLE("2", "有载具"); + + private final String code; + + private final String name; +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/base/region/RegionEnum.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/base/region/RegionEnum.java new file mode 100644 index 0000000..536a2b1 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/base/region/RegionEnum.java @@ -0,0 +1,22 @@ +package org.nl.wms.sch.base.region; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 区域枚举 + */ +@AllArgsConstructor +@Getter +public enum RegionEnum { + + JL("1585920580597714944", "JL", "接料区"), + ZC("1585921595338264576", "ZC", "暂存区"), + JJ("1585921750871445504", "JJ", "交接区"); + + private final String id; + + private final String code; + + private final String name; +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java index 1473a84..a0bfd2d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AbstractAcsTask.java @@ -4,8 +4,8 @@ import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import org.nl.wms.sch.AcsUtil; -import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.sch.AcsUtils; +import org.nl.wms.sch.task.dto.AcsTaskDTO; import java.util.List; @@ -24,7 +24,7 @@ public abstract class AbstractAcsTask { * @author ldjun * @created 2020年6月12日 下午5:55:25 */ - public List schedule() { + public List schedule() { this.autoCreate(); this.findStartPoint(); this.findNextPoint(); @@ -36,7 +36,7 @@ public abstract class AbstractAcsTask { * * @return */ - public abstract List addTask(); + public abstract List addTask(); /** * @param taskObj 代表一条任务对象 @@ -91,7 +91,7 @@ public abstract class AbstractAcsTask { * @created 2020年6月12日 下午5:52:28 */ public JSONObject notifyAcs(String task_id) { - return AcsUtil.notifyAcs("api/wms/task", null); + return AcsUtils.notifyAcs("api/wms/task", null); } /** @@ -101,18 +101,18 @@ public abstract class AbstractAcsTask { * @created 2020年6月12日 下午5:52:28 */ public JSONObject notifyAcs(JSONArray jsonArray) { - return AcsUtil.notifyAcs("api/wms/task", jsonArray); + return AcsUtils.notifyAcs("api/wms/task", jsonArray); } /** * */ public JSONObject immediateNotifyAcs() { - List taskList = this.schedule(); + List taskList = this.schedule(); if (ObjectUtil.isNotEmpty(taskList)) { JSONArray arr = JSONArray.parseArray(JSON.toJSONString(taskList)); - return AcsUtil.notifyAcs("api/wms/task", arr); + return AcsUtils.notifyAcs("api/wms/task", arr); } return null; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCreateTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCreateTask.java index af2d49e..a057372 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCreateTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/AutoCreateTask.java @@ -8,8 +8,8 @@ import com.alibaba.fastjson.JSONObject; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.AcsUtil; -import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.sch.AcsUtils; +import org.nl.wms.sch.task.dto.AcsTaskDTO; import org.reflections.Reflections; import org.springframework.stereotype.Component; @@ -23,7 +23,7 @@ import java.util.Set; @Component public class AutoCreateTask { // 下发acs的任务集合 - private List taskList = null; + private List taskList = null; private Set> subTypes = null; WQLObject taskTab = null; @@ -48,7 +48,7 @@ public class AutoCreateTask { Object obj = clz.newInstance(); //Method m = obj.getClass().getDeclaredMethod("schedule"); Method m = obj.getClass().getMethod("schedule"); - List tasks = (List) m.invoke(obj); + List tasks = (List) m.invoke(obj); if (ObjectUtil.isNotEmpty(tasks)) { taskList.addAll(tasks); } @@ -73,7 +73,7 @@ public class AutoCreateTask { String api = "api/wms/task"; log.info("下发acs任务的参数为:{}", arr.toString()); - JSONObject result = AcsUtil.notifyAcs(api, arr); + JSONObject result = AcsUtils.notifyAcs(api, arr); log.info("下发acs任务的返回结果为:{}", result.toString()); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java index fe130b5..0fe2b78 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java @@ -79,7 +79,7 @@ public class PointServiceImpl implements PointService { String[] types = split[j].split("-"); typeArr.put(types[0], types[1]); } - object.put("point_status_name", typeArr.getString(point_type)); + object.put("point_type_name", typeArr.getString(point_type)); } res.add(object); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/RegionServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/RegionServiceImpl.java index 4faf50e..09766bb 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/RegionServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/RegionServiceImpl.java @@ -142,16 +142,20 @@ public class RegionServiceImpl implements RegionService { * label,value */ JSONArray res = new JSONArray(); - String point_status_explain = findById(region_id).getPoint_status_explain(); - if (ObjectUtil.isEmpty(point_status_explain)) return res; - String[] explain = point_status_explain.split(","); - for (int i = 0; i < explain.length; i++) { - String[] status = explain[i].split("-"); - JSONObject point_status = new JSONObject(); - point_status.put("label", status[1]); - point_status.put("value", status[0]); - res.add(point_status); + RegionDto dto = findById(region_id); + if (ObjectUtil.isNotEmpty(dto)) { + String point_status_explain = dto.getPoint_status_explain(); + if (ObjectUtil.isEmpty(point_status_explain)) return res; + String[] explain = point_status_explain.split(","); + for (int i = 0; i < explain.length; i++) { + String[] status = explain[i].split("-"); + JSONObject point_status = new JSONObject(); + point_status.put("label", status[1]); + point_status.put("value", status[0]); + res.add(point_status); + } } + return res; } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/CallEmptyVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/CallEmptyVehicleTask.java new file mode 100644 index 0000000..b35c271 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/CallEmptyVehicleTask.java @@ -0,0 +1,173 @@ +package org.nl.wms.sch.task; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +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.wms.sch.base.point.LockType; +import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.task.dto.AcsTaskDTO; +import org.nl.wms.sch.task.util.TaskUtils; +import org.nl.wms.util.CommonUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +/** + * 纽迪希亚3叫空载具任务 + * + * @author 张江玮 + * @date 2022/11/01 10:12 + */ +@Service +@NoArgsConstructor +@Slf4j +public class CallEmptyVehicleTask extends AbstractAcsTask { + + private static final String THIS_CLASS_NAME = CallEmptyVehicleTask.class.getName(); + + /** + * 添加任务进行下发 + * + * @return 所有这个类处理的已确认起点和终点任务 + */ + @Override + public List addTask() { + JSONArray tasks = WQLObject + .getWQLObject("sch_base_task") + .query("task_status = " + TaskStatus.START_AND_END.getCode() + " AND handle_class = " + THIS_CLASS_NAME) + .getResultJSONArray(0); + + ArrayList acsTasks = new ArrayList<>(); + for (Object o : tasks) { + JSONObject task = (JSONObject) o; + + AcsTaskDTO acsTask = AcsTaskDTO + .builder() + .task_id(task.getString("task_id")) + .task_code(task.getString("task_code")) + .task_type(task.getString("acs_task_type")) + .start_device_code(task.getString("point_code1")) + .next_device_code(task.getString("point_code2")) + .vehicle_code(task.getString("vehicle_code")) + .vehicle_type(task.getString("vehicle_type")) + .priority(task.getString("priority")) + .remark(task.getString("remark")) + .build(); + + acsTasks.add(acsTask); + } + + return acsTasks; + } + + /** + * acs请求更新任务状态 + * + * @param taskJSON 代表一条任务对象 + * @param status 代表wcs任务完成状态: //0:acs,取消,:执行中,2:完成 + */ + @Override + public void updateTaskStatus(JSONObject taskJSON, String status) { + + } + + /** + * 创建叫空托盘任务 + * + * @param param String point_id 点位标识 + * @return 返回任务标识 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public String createTask(JSONObject param) { + WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); + JSONObject point = pointTable + .query("point_id = " + param.getString("point_id")) + .uniqueResult(0); + if (ObjectUtil.isEmpty(point)) { + throw new BadRequestException("点位不存在"); + } + + JSONObject task = new JSONObject(); + String taskId = IdUtil.getSnowflake(1L, 1L).nextIdStr(); + task.put("task_id", taskId); + task.put("task_code", CodeUtil.getNewCode("TASK_CODE")); + task.put("task_type", TaskType.CALL_EMPTY_VEHICLE.getCode()); + task.put("task_status", TaskStatus.SURE_END.getCode()); + task.put("point_code2", point.getString("point_code")); + task.put("handle_class", THIS_CLASS_NAME); + task.put("create_mode", CreateMode.SCCJ.getCode()); + CommonUtils.addCommonColum(task); + WQLObject.getWQLObject("sch_base_task").insert(task); + + point.put("lock_type", "2"); + CommonUtils.addUpdateColum(point); + pointTable.update(point); + + return taskId; + } + + /** + * 完成任务 + * + * @param taskId 任务标识 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void forceFinish(String taskId) { + + } + + /** + * 取消任务 + * + * @param taskId 任务标识 + */ + @Override + public void cancel(String taskId) { + + } + + /** + * 确定当前处理类创建的任务的起点 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void findStartPoint() { + WQLObject taskTable = WQLObject.getWQLObject("sch_base_task"); + JSONArray tasks = taskTable + .query("task_status = " + TaskStatus.SURE_END.getCode() + " AND handle_class = " + THIS_CLASS_NAME) + .getResultJSONArray(0); + + for (Object o : tasks) { + JSONObject point = WQL.getWO("TASK") + .addParam("flag", "1") + .process() + .uniqueResult(0); + + if (ObjectUtil.isNotEmpty(point)) { + JSONObject task = (JSONObject) o; + + task.put("task_status", TaskStatus.START_AND_END.getCode()); + task.put("point_code1", point.getString("point_code")); + task.put("vehicle_code", point.getString("vehicle_code")); + CommonUtils.addUpdateColum(task); + taskTable.update(task); + + JSONObject lockPoint = new JSONObject(); + lockPoint.put("lock_type", LockType.TASK_LOCKED.getCode()); + WQLObject.getWQLObject("sch_base_point").update(lockPoint, "point_id = " + point.getString("point_id")); + } + } + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/CreateMode.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/CreateMode.java new file mode 100644 index 0000000..0e25f94 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/CreateMode.java @@ -0,0 +1,24 @@ +package org.nl.wms.sch.task; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 生成方式枚举类 + * + * @author 张江玮 + * @date 2022/11/01 15:57 + */ +@AllArgsConstructor +@Getter +public enum CreateMode { + + PCCS("1", "PC产生"), + ACSSQ("2", "ACS申请"), + SCCJ("3", "手持创建"), + WBJK("4", "外部接口"); + + private final String code; + + private final String name; +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/TaskFinishedType.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/TaskFinishedType.java new file mode 100644 index 0000000..8483cf2 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/TaskFinishedType.java @@ -0,0 +1,22 @@ +package org.nl.wms.sch.task; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 任务完成类型枚举类 + * + * @author 张江玮 + * @date 2022/11/04 12:36 + */ +@AllArgsConstructor +@Getter +public enum TaskFinishedType { + + AUTO("1", "自动"), + MANUAL("2", "手动"); + + private final String code; + + private final String name; +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/TaskStatus.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/TaskStatus.java new file mode 100644 index 0000000..3dd21ba --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/TaskStatus.java @@ -0,0 +1,27 @@ +package org.nl.wms.sch.task; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 任务状态枚举类 + * + * @author 张江玮 + * @date 2022/11/01 16:09 + */ +@AllArgsConstructor +@Getter +public enum TaskStatus { + + CREATED("1", "生成"), + SURE_START("2", "确定起点"), + SURE_END("3", "确定终点"), + START_AND_END("4", "起点终点确认"), + ISSUE("5", "下发"), + EXECUTING("6", "执行中"), + FINISHED("7", "完成"); + + private final String code; + + private final String name; +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/TaskType.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/TaskType.java new file mode 100644 index 0000000..b3077d3 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/TaskType.java @@ -0,0 +1,25 @@ +package org.nl.wms.sch.task; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 纽迪希亚3任务类型枚举类 + * + * @author 张江玮 + * @date 2022/11/01 15:20 + */ +@AllArgsConstructor +@Getter +public enum TaskType { + + CALL_EMPTY_VEHICLE("HJKC", "呼叫空车"), + SEND_FULL_VEHICLE("HJSMC", "呼叫送满车"), + CALL_MATERIAL("HJYLCK", "呼叫原料出库"), + SEND_EMPTY_VEHICLE("HJKCRK", "呼叫空车入库"), + SEND_RESIDUES_MATERIAL("HJYLRK", "呼叫余料入库"); + + private final String code; + + private final String name; +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/AcsTaskDto.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/dto/AcsTaskDTO.java similarity index 91% rename from lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/AcsTaskDto.java rename to lms/nladmin-system/src/main/java/org/nl/wms/sch/task/dto/AcsTaskDTO.java index c76d653..7e44bd0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/AcsTaskDto.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/dto/AcsTaskDTO.java @@ -1,11 +1,11 @@ -package org.nl.wms.sch.tasks; +package org.nl.wms.sch.task.dto; import lombok.Builder; import lombok.Data; @Data @Builder -public class AcsTaskDto { +public class AcsTaskDTO { //任务标识 private String task_id; //任务编码 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/util/TaskUtils.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/util/TaskUtils.java new file mode 100644 index 0000000..18ffd7f --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/util/TaskUtils.java @@ -0,0 +1,50 @@ +package org.nl.wms.sch.task.util; + +import com.alibaba.fastjson.JSONObject; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.sch.base.point.LockType; +import org.nl.wms.sch.base.point.PointStatus; +import org.nl.wms.sch.task.TaskFinishedType; +import org.nl.wms.sch.task.TaskStatus; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +/** + * 纽迪希亚3任务工具类 + * + * @author 张江玮 + * @date 2022/11/01 15:11 + */ +@Component +public class TaskUtils { + + @Transactional(rollbackFor = Exception.class) + public void finished(String taskId, TaskFinishedType taskFinishedType) { + WQLObject taskTable = WQLObject.getWQLObject("sch_base_task"); + JSONObject task = taskTable + .query("task_id = " + taskId) + .uniqueResult(0); + + WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); + JSONObject startPoint = pointTable + .query("task_code = " + task.getString("point_code1")) + .uniqueResult(0); + JSONObject nextPoint = pointTable + .query("task_code = " + task.getString("point_code2")) + .uniqueResult(0); + + task.put("finished_type", taskFinishedType.getCode()); + task.put("task_status", TaskStatus.FINISHED.getCode()); + taskTable.update(task); + + nextPoint.put("point_status", PointStatus.HAS_VEHICLE.getCode()); + nextPoint.put("lock_type", LockType.UNLOCKED.getCode()); + nextPoint.put("vehicle_code", startPoint.getString("vehicle_code")); + pointTable.update(nextPoint); + + startPoint.put("point_status", PointStatus.EMPTY.getCode()); + startPoint.put("lock_type", LockType.UNLOCKED.getCode()); + startPoint.put("vehicle_code", ""); + pointTable.update(startPoint); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_yqxSendMaterial_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/wql/TASK.wql similarity index 58% rename from lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_yqxSendMaterial_01.wql rename to lms/nladmin-system/src/main/java/org/nl/wms/sch/task/wql/TASK.wql index 0e1582e..c8c818a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_yqxSendMaterial_01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/wql/TASK.wql @@ -1,5 +1,5 @@ [交易说明] - 交易名: 油漆线送料请求 + 交易名: 任务分页查询 所属模块: 功能简述: 版权所有: @@ -13,11 +13,7 @@ ################################################# ## 表字段对应输入参数 ################################################# - 输入.flag TYPEAS s_string - 输入.region_code TYPEAS s_string - 输入.material_id TYPEAS s_string - 输入.vehicle_type TYPEAS s_string - + 输入.flag TYPEAS s_string [临时表] --这边列出来的临时表就会在运行期动态创建 @@ -41,22 +37,22 @@ # 3、业务主过程 # ########################################## - IF 输入.flag = "1" - QUERY - SELECT - p.point_id, - p.point_code, - p.point_name + IF 输入.flag = "1" + QUERY + SELECT + point.point_id, + point.point_code, + vehicle.vehicle_code FROM - SCH_BASE_Point p + sch_base_point point + LEFT JOIN md_pb_vehicle vehicle ON point.vehicle_code = vehicle.vehicle_code WHERE - lock_type = '1' - AND is_used = '1' - AND is_delete = '0' - and (point_code = 'SSX01A2' or point_code = 'SSX02A1') - ENDSELECT - ENDQUERY - ENDIF - - - + point.is_used = '1' + AND point.is_delete = '0' + AND point.lock_type = '1' + AND point.region_id = 1585921595338264576 + AND point.point_status = '2' + AND vehicle.vehicle_status = '1' + ENDSELECT + ENDQUERY + ENDIF \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PointToPointTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PointToPointTask.java deleted file mode 100644 index 4e6e115..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PointToPointTask.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.nl.wms.sch.tasks; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONObject; -import org.nl.modules.common.utils.SecurityUtils; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -/** - * 普通点对点任务 - */ -@Service -public class PointToPointTask extends AbstractAcsTask { - - @Override - @Transactional - public void updateTaskStatus(JSONObject taskObj, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - - String task_id = taskObj.getString("task_id"); - JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - - if (StrUtil.equals(status,"0")) { - // 取消删除任务 - taskTab.delete("task_id = '"+task_id+"'"); - } - - if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { - // 更新任务状态为执行中 - jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - jsonTask.put("update_time", DateUtil.now()); - jsonTask.put("car_no", taskObj.getString("car_no")); - taskTab.update(jsonTask); - } - - if(StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { - // 完成 - jsonTask.put("task_status",TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("update_optid", SecurityUtils.getCurrentUserId()); - jsonTask.put("update_optname", SecurityUtils.getCurrentUsername()); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); - } - - } - - - - @Override - @Transactional - public String createTask(JSONObject form) { - return null; - } - - @Override - public void forceFinish(String task_id) { - JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); - this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); - } - - @Override - public List addTask() { - return null; - } - - - - - @Override - public void cancel(String task_id) { - - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/RegionTypeEnum.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/RegionTypeEnum.java deleted file mode 100644 index 21ce4b5..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/RegionTypeEnum.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.nl.wms.sch.tasks; - -/** - * 任务状态枚举 - */ -public enum RegionTypeEnum { - CPQYA(1, "CPQYA01", "成品区域A","1557538851726168064"), - YSQA(2, "YSQA01", "养生A区","1557539288307077120"), - YSQB(3, "YSQB01", "养生B区","1557539423292362752"), - GJQY(4, "GJQY01", "共挤区","1557539744848678912"), - YQQY(5, "YQQY01", "油漆区","1557913112412295168"), - DPJQA(6, "DPJQA01", "叠盘架A区","1558015562792177664"), - DPJQB(7, "DPJQB01", "叠盘架B区","1558015634472833024"), - KTPHCQA(8, "KTPHCQA01", "空托盘缓存A区","1558015810096730112"), - KTPHCQB(9, "KTPHCQB01", "空托盘缓存B区","1558015870570205184"), - HKQY(10, "HKQY01", "豪凯区域","1564862312702152704"), - SSX(12, "SSX01", "输送线区域","1559374522581389312"), - YSAQKTPQ01(13, "YSAQKTPQ01", "养生A空托盘区","1582909373552922624"); - - private int index; - private String code; - private String name; - private String id; - - public String getCode() { - return code; - } - - public String getName() { - return name; - } - - public String getId() { - return id; - } - - RegionTypeEnum(int index, String code, String name, String id) { - this.index = index; - this.id = id; - this.code = code; - this.name = name; - } - -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/GjxCallEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/GjxCallEmpVehicleTask.java deleted file mode 100644 index 1e73ff8..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/GjxCallEmpVehicleTask.java +++ /dev/null @@ -1,429 +0,0 @@ -package org.nl.wms.sch.tasks.callEmpty; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.common.utils.SecurityUtils; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.sch.tasks.RegionTypeEnum; -import org.nl.wms.util.IdUtil; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -@Service -@RequiredArgsConstructor -@Slf4j -/** - * 共挤线申请空盘 - */ -public class GjxCallEmpVehicleTask extends AbstractAcsTask { - private final String THIS_CLASS = GjxCallEmpVehicleTask.class.getName(); - - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject taskObj, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - String task_id = taskObj.getString("task_id"); - JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - - if (StrUtil.equals(status, "0")) { - /* - * 取消删除 - * 1.终点为叠盘架更新起点点位、等待点点位、叠盘架点位 - * 2.终点为供给线更新叠盘架点位 - */ - if (StrUtil.equals(jsonTask.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { - throw new BadRequestException("已完成不能取消!"); - } - - String point_code1 = jsonTask.getString("point_code1"); - String point_code2 = jsonTask.getString("point_code2"); - - JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - // 终点在叠盘架 - if (StrUtil.equals(jsonEnd.getString("region_id"), RegionTypeEnum.DPJQB.getId())) { - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - // 判断此起点是否是等待点 - if (!StrUtil.equals(jsonStart.getString("row_num"), "9")) { - // 如果不是等待点更新等待点状态 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + jsonStart.getString("region_id") + - "' and block_num = '" + jsonStart.getString("block_num") + - "' and col_num = '" + jsonStart.getString("col_num") + - "' and row_num = '9'").uniqueResult(0); - - jsonEmpWait.put("lock_type", "1"); - pointTab.update(jsonEmpWait); - } - jsonStart.put("lock_type", "1"); - pointTab.update(jsonStart); - - // 更新终点(叠盘架状态) - jsonEnd.put("lock_type", "1"); - pointTab.update(jsonEnd); - - } else { - // 终点在供给线 - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - jsonStart.put("lock_type", "1"); - pointTab.update(jsonStart); - } - - taskTab.delete("task_id = '" + task_id + "'"); - } - - if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { - // 更新任务状态为执行中 - jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - jsonTask.put("update_time", DateUtil.now()); - jsonTask.put("car_no", taskObj.getString("car_no")); - taskTab.update(jsonTask); - } - - if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { - /* - * 更改任务状态为完成 - * 1.终点为叠盘架更新叠盘架数量、起点点位状态、等待位状态,更新任务组状态 - * 2.终点为供给线,更新起点载数量 - */ - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("update_optid", SecurityUtils.getCurrentUserId()); - jsonTask.put("update_optname", SecurityUtils.getCurrentUsername()); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); - - // 判断终点在哪里 - String point_code1 = jsonTask.getString("point_code1"); - String point_code2 = jsonTask.getString("point_code2"); - - JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - // 终点在叠盘架 - if (StrUtil.equals(jsonEnd.getString("region_id"), RegionTypeEnum.DPJQB.getId())) { - // 更新起点点位状态 - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - // 判断起点是不是养生A区空载具 - if (StrUtil.equals(jsonStart.getString("region_id"), RegionTypeEnum.YSAQKTPQ01.getId())) { - // 判断此起点是否是等待点 - if (!StrUtil.equals(jsonStart.getString("row_num"), "9")) { - // 如果不是等待点更新等待点状态 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + jsonStart.getString("region_id") + - "' and block_num = '" + jsonStart.getString("block_num") + - "' and col_num = '" + jsonStart.getString("col_num") + - "' and row_num = '9'").uniqueResult(0); - - jsonEmpWait.put("lock_type", "1"); - pointTab.update(jsonEmpWait); - } - } - - jsonStart.put("point_status", "1"); - jsonStart.put("lock_type", "1"); - jsonStart.put("vehicle_type", ""); - jsonStart.put("vehicle_code", ""); - jsonStart.put("vehicle_qty", 0); - pointTab.update(jsonStart); - - // 更新终点(叠盘架状态) - jsonEnd.put("vehicle_qty", NumberUtil.add(jsonEnd.getString("vehicle_qty"), jsonTask.getString("vehicle_qty"))); - jsonEnd.put("lock_type", "1"); - jsonEnd.put("point_status", "2"); - jsonEnd.put("vehicle_type", jsonTask.getString("vehicle_type")); - pointTab.update(jsonEnd); - - // 更新任务组状态 - JSONObject jsonTask2 = taskTab.query("task_group_id = '" + jsonTask.getString("task_group_id") + "' and task_id <> '" + jsonTask.getString("task_id") + "'").uniqueResult(0); - jsonTask2.put("point_code1", jsonEnd.getString("point_code")); - jsonTask2.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskTab.update(jsonTask2); - } else { - // 终点在供给线线: 更新起点(叠盘架)数量 - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - jsonStart.put("vehicle_qty", NumberUtil.sub(jsonStart.getString("vehicle_qty"), "1")); - jsonStart.put("lock_type", "1"); - if (StrUtil.equals(jsonStart.getString("vehicle_qty"), "0")) { - jsonStart.put("point_status", "1"); - jsonStart.put("vehicle_type", ""); - } - pointTab.update(jsonStart); - } - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void findStartPoint() { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 - - JSONArray taskArr = taskTab.query("is_delete = '0' and handle_class = '" + this.THIS_CLASS + "' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - // 创建任务 - JSONObject jsonTask = taskArr.getJSONObject(i); - String vehicle_type = jsonTask.getString("vehicle_type"); - - // 找叠盘架是否与对应的载具类型 - JSONObject jsonDpjStart = pointTab.query("region_id = '" + RegionTypeEnum.DPJQB.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and vehicle_qty <> '0'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonDpjStart)) { - // 判断叠盘架是否有任务 有就下一个任务 - boolean is_point = this.isTask(jsonDpjStart.getString("point_code")); - if (!is_point) continue; - - // 更新任务起点 - jsonTask.put("point_code1", jsonDpjStart.getString("point_code")); - jsonTask.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskTab.update(jsonTask); - - } else { - // 判断叠盘架载具数量是否是0 - JSONObject jsonDpjStart2 = pointTab.query("region_id = '" + RegionTypeEnum.DPJQB.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and vehicle_qty = '0'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonDpjStart2)) continue; - - // 判断叠盘架是否有任务 - boolean is_point = this.isTask(jsonDpjStart2.getString("point_code")); - if (!is_point) continue; - - // 找叠盘架暂存位是否有空托盘 - JSONObject map = new JSONObject(); - map.put("flag", "1"); - map.put("vehicle_type", vehicle_type); - - JSONObject jsonZcKtp = WQL.getWO("QSCH_GjxCallEmpVehicleTask").addParamMap(map).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonZcKtp)) { - // 创建任务:空载具暂存位 --> 叠盘架 - SchTaskDto dto = SchTaskDto.builder() - .task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .acs_task_type("2") - .task_name("暂存位->叠盘架空载具") - .task_status(TaskStatusEnum.START_AND_POINT.getCode()) - .point_code1(jsonZcKtp.getString("point_code")) - .point_code2(jsonDpjStart2.getString("point_code")) - .vehicle_code(jsonZcKtp.getString("vehicle_code")) - .vehicle_type(jsonZcKtp.getString("vehicle_type")) - .vehicle_qty(jsonZcKtp.getIntValue("vehicle_qty")) - .task_group_id(jsonTask.getLong("task_group_id")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - // 锁定起点 - jsonZcKtp.put("lock_type", "2"); - pointTab.update(jsonZcKtp); - } else { - // 空托盘暂存区没有就到养生A区找: 先找到出库等待点 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + - "' and row_num = '9' and can_vehicle_type = '" + vehicle_type + - "' and is_used = '1' and is_delete = '0'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonEmpWait)) continue; - - JSONObject jsonStartPoint = pointTab.query("region_id = '" + jsonEmpWait.getString("region_id") + - "' and block_num = '" + jsonEmpWait.getString("block_num") + - "' and col_num = '" + jsonEmpWait.getString("col_num") + - "' and point_status = '2' and lock_type = '1' order by out_empty_seq DESC").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonStartPoint)) continue; - - // 判断找到的空载具点位是否是等待点 - if (StrUtil.equals(jsonEmpWait.getString("point_code"), jsonStartPoint.getString("point_code"))) { - // 创建 养生A区空载具等待点 --> 叠盘架 - SchTaskDto dto = SchTaskDto.builder() - .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .acs_task_type("2") - .task_name("养生A区-> 叠盘架空载具") - .task_status(TaskStatusEnum.START_AND_POINT.getCode()) - .point_code1(jsonStartPoint.getString("point_code")) - .point_code2(jsonDpjStart2.getString("point_code")) - .vehicle_code(jsonStartPoint.getString("vehicle_code")) - .vehicle_type(jsonStartPoint.getString("vehicle_type")) - .vehicle_qty(jsonStartPoint.getIntValue("vehicle_qty")) - .task_group_id(jsonTask.getLong("task_group_id")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - // 锁起点 - jsonStartPoint.put("lock_type", "2"); - pointTab.update(jsonStartPoint); - } else { - // 判断等待点是否是 未锁定、为空载具 - if (StrUtil.equals(jsonEmpWait.getString("lock_type"), "1")) { - // 创建 养生A区空载具 --> 叠盘架 - SchTaskDto dto = SchTaskDto.builder() - .task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .acs_task_type("2") - .task_name("养生A区>叠盘架空载具") - .task_status(TaskStatusEnum.START_AND_POINT.getCode()) - .point_code1(jsonStartPoint.getString("point_code")) - .point_code2(jsonDpjStart2.getString("point_code")) - .vehicle_code(jsonStartPoint.getString("vehicle_code")) - .vehicle_type(jsonStartPoint.getString("vehicle_type")) - .vehicle_qty(jsonStartPoint.getIntValue("vehicle_qty")) - .task_group_id(jsonTask.getLong("task_group_id")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - // 锁起点 - jsonStartPoint.put("lock_type", "2"); - pointTab.update(jsonStartPoint); - // 锁等待点 - jsonEmpWait.put("lock_type", "2"); - pointTab.update(jsonEmpWait); - } else { - continue; - } - } - } - } - } - - } - - - @Override - @Transactional(rollbackFor = Exception.class) -// 虽然是养生A区,应该有二次申请,但是通过判断叠盘架是否有任务来判断做限制 - public String createTask(JSONObject form) { - /* - * 1.先生成确定终点的任务 - * 2.通过findStartPoint()找起点 - * 3.下发给ACS - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); // 生产工单表 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); //点位基础表 - - //任务表【SCH_BASE_Task】 - //判断当前点是否有未完成的任务 - JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + form.getString("point_code2") + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + form.getString("point_code2") + "存在未完成的任务"); - - - - - String point_code2 = form.getString("point_code2"); - String sub_device_code = point_code2.substring(0, point_code2.indexOf("_")); - - String device_code = pointTab.query("point_code = '" + sub_device_code + "'").uniqueResult(0).getString("device_code"); - - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); - - SchTaskDto dto = SchTaskDto.builder().task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .task_name("共挤线叫空载具") - .task_status(TaskStatusEnum.SURE_END.getCode()) - .point_code2(point_code2) - .acs_task_type("2") - .vehicle_code(form.getString("vehicle_code")) - .vehicle_type(workOrderObj.getString("vehicle_type")) - .vehicle_qty(form.getIntValue("qty")) - .task_group_id(IdUtil.getLongId()) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void forceFinish(String task_id) { - JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); - this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); - } - - @Override - public void cancel(String task_id) { - - } - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList resultList = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - - String point_code1 = json.getString("point_code1"); - //判断起点是否属于养生A区 - if (point_code1.startsWith("2")) { - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - point_code1 = point_code1.substring(0, 4) + "1" + point_code1.substring(4, 9); - } - - AcsTaskDto dto = AcsTaskDto.builder() - .task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(point_code1) - .next_device_code(json.getString("point_code3")) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - resultList.add(dto); - } - return resultList; - } - - @Transactional(rollbackFor = Exception.class) - public boolean isTask(String point_code) { - /* - * 判断点位是否有任务存在 - */ - WQLObject tab = WQLObject.getWQLObject("SCH_BASE_Task"); - - boolean result; - - JSONObject jsonPointCode1 = tab.query("point_code1 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode2 = tab.query("point_code2 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode3 = tab.query("point_code3 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode4 = tab.query("point_code4 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonPointCode1) && ObjectUtil.isEmpty(jsonPointCode2) && ObjectUtil.isEmpty(jsonPointCode3) && ObjectUtil.isEmpty(jsonPointCode4)) { - result = true; - } else { - result = false; - } - - return result; - } - - -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/YqxCallEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/YqxCallEmpVehicleTask.java deleted file mode 100644 index 6c70069..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/YqxCallEmpVehicleTask.java +++ /dev/null @@ -1,434 +0,0 @@ -package org.nl.wms.sch.tasks.callEmpty; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.common.utils.SecurityUtils; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.sch.tasks.RegionTypeEnum; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -@Service -@RequiredArgsConstructor -@Slf4j -public class YqxCallEmpVehicleTask extends AbstractAcsTask { - private final String THIS_CLASS = YqxCallEmpVehicleTask.class.getName(); - - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject taskObj, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - String task_id = taskObj.getString("task_id"); - JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - - if (StrUtil.equals(status, "0")) { - /* - * 取消删除 - * 1.终点为叠盘架更新起点点位、等待点点位、叠盘架点位 - * 2.终点为油漆线更新叠盘架点位 - */ - if (StrUtil.equals(jsonTask.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { - throw new BadRequestException("已完成不能取消!"); - } - - String point_code1 = jsonTask.getString("point_code1"); - String point_code2 = jsonTask.getString("point_code2"); - - JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - // 终点在叠盘架 - if (StrUtil.equals(jsonEnd.getString("region_id"), RegionTypeEnum.DPJQB.getId())) { - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - // 判断此起点是否是等待点 - if (!StrUtil.equals(jsonStart.getString("row_num"), "9")) { - // 如果不是等待点更新等待点状态 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + jsonStart.getString("region_id") + - "' and block_num = '" + jsonStart.getString("block_num") + - "' and col_num = '" + jsonStart.getString("col_num") + - "' and row_num = '9'").uniqueResult(0); - - jsonEmpWait.put("lock_type", "1"); - pointTab.update(jsonEmpWait); - } - jsonStart.put("lock_type", "1"); - pointTab.update(jsonStart); - - // 更新终点(叠盘架状态) - jsonEnd.put("lock_type", "1"); - pointTab.update(jsonEnd); - - } else { - // 终点在油漆线 - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - jsonStart.put("lock_type", "1"); - pointTab.update(jsonStart); - } - - taskTab.delete("task_id = '" + task_id + "'"); - } - - if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { - // 更新任务状态为执行中 - jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - jsonTask.put("update_time", DateUtil.now()); - jsonTask.put("car_no", taskObj.getString("car_no")); - taskTab.update(jsonTask); - } - - if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { - /* - * 更改任务状态为完成 - * 1.终点为叠盘架更新叠盘架数量、起点点位状态、等待位状态,更新任务组状态 - * 2.终点为油漆线,更新起点载具数量 - */ - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("update_optid", SecurityUtils.getCurrentUserId()); - jsonTask.put("update_optname", SecurityUtils.getCurrentUsername()); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); - - // 判断终点在哪里 - String point_code1 = jsonTask.getString("point_code1"); - String point_code2 = jsonTask.getString("point_code2"); - - JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - // 终点在叠盘架 - if (StrUtil.equals(jsonEnd.getString("region_id"), RegionTypeEnum.DPJQA.getId())) { - // 更新起点点位状态 - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - // 判断起点是不是养生A区空载具 - if (StrUtil.equals(jsonStart.getString("region_id"), RegionTypeEnum.YSAQKTPQ01.getId())) { - // 判断此起点是否是等待点 - if (!StrUtil.equals(jsonStart.getString("row_num"), "9")) { - // 如果不是等待点更新等待点状态 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + jsonStart.getString("region_id") + - "' and block_num = '" + jsonStart.getString("block_num") + - "' and col_num = '" + jsonStart.getString("col_num") + - "' and row_num = '9'").uniqueResult(0); - - jsonEmpWait.put("lock_type", "1"); - pointTab.update(jsonEmpWait); - } - } - - jsonStart.put("point_status", "1"); - jsonStart.put("lock_type", "1"); - jsonStart.put("vehicle_type", ""); - jsonStart.put("vehicle_code", ""); - jsonStart.put("vehicle_qty", 0); - pointTab.update(jsonStart); - - // 更新终点(叠盘架状态) - jsonEnd.put("vehicle_qty", NumberUtil.add(jsonEnd.getString("vehicle_qty"),jsonTask.getString("vehicle_qty"))); - jsonEnd.put("lock_type", "1"); - jsonEnd.put("point_status", "2"); - jsonEnd.put("vehicle_type", jsonTask.getString("vehicle_type")); - pointTab.update(jsonEnd); - - // 更新任务组状态 - JSONObject jsonTask2 = taskTab.query("task_group_id = '" + jsonTask.getString("task_group_id") + "' and task_id <> '" + jsonTask.getString("task_id") + "'").uniqueResult(0); - // 判断叠盘架数量是否 < 需求数量 (暂时只能<需求数量) - if (jsonEnd.getIntValue("vehicle_qty") < jsonTask2.getIntValue("vehicle_qty")) { - jsonTask2.put("vehicle_qty", jsonEnd.getIntValue("vehicle_qty")); - } - jsonTask2.put("point_code1", jsonEnd.getString("point_code")); - jsonTask2.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskTab.update(jsonTask2); - } else { - // 终点在油漆线: 更新起点(叠盘架)数量 - JSONObject jsonStart = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - jsonStart.put("vehicle_qty",NumberUtil.sub(jsonStart.getString("vehicle_qty"),jsonTask.getString("vehicle_qty"))); - jsonStart.put("lock_type", "1"); - if (StrUtil.equals(jsonStart.getString("vehicle_qty"),"0")) { - jsonStart.put("point_status", "1"); - jsonStart.put("vehicle_type", ""); - } - pointTab.update(jsonStart); - } - } - } - - /** - * 虽然是养生A区,应该有二次申请,但是通过判断叠盘架是否有任务来判断做限制 - */ - @Override - @Transactional(rollbackFor = Exception.class) - public void findStartPoint() { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 - - JSONArray taskArr = taskTab.query("is_delete = '0' and handle_class = '" + this.THIS_CLASS + "' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - // 创建任务 - JSONObject jsonTask = taskArr.getJSONObject(i); - String vehicle_type = jsonTask.getString("vehicle_type"); - - // 找叠盘架是否与对应的载具类型 - JSONObject jsonDpjStart = pointTab.query("region_id = '" + RegionTypeEnum.DPJQA.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and vehicle_qty <> '0'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonDpjStart)) { - // 判断叠盘架是否有任务 有就下一个任务 - boolean is_point = this.isTask(jsonDpjStart.getString("point_code")); - if (!is_point) continue; - - // 判断叠盘架数量是否 < 需求数量 (暂时只能<需求数量) - if (jsonDpjStart.getIntValue("vehicle_qty") < jsonTask.getIntValue("vehicle_qty")) { - jsonTask.put("vehicle_qty", jsonDpjStart.getIntValue("vehicle_qty")); - } - - // 更新任务起点 - jsonTask.put("point_code1", jsonDpjStart.getString("point_code")); - jsonTask.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskTab.update(jsonTask); - - } else { - // 判断叠盘架载具数量是否是0 - JSONObject jsonDpjStart2 = pointTab.query("region_id = '" + RegionTypeEnum.DPJQA.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and vehicle_qty = '0'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonDpjStart2)) continue; - - // 判断叠盘架是否有任务 - boolean is_point = this.isTask(jsonDpjStart2.getString("point_code")); - if (!is_point) continue; - - // 找叠盘架暂存位是否有空托盘 - JSONObject map = new JSONObject(); - map.put("flag", "1"); - map.put("vehicle_type", vehicle_type); - - JSONObject jsonZcKtp = WQL.getWO("QSCH_YqxCallEmpVehicleTask").addParamMap(map).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonZcKtp)) { - // 创建任务:空载具暂存位 --> 叠盘架 - SchTaskDto dto = SchTaskDto.builder() - .task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .acs_task_type("2") - .task_name("暂存位>叠盘架空载具") - .task_status(TaskStatusEnum.START_AND_POINT.getCode()) - .point_code1(jsonZcKtp.getString("point_code")) - .point_code2(jsonDpjStart2.getString("point_code")) - .vehicle_code(jsonZcKtp.getString("vehicle_code")) - .vehicle_type(jsonZcKtp.getString("vehicle_type")) - .vehicle_qty(jsonZcKtp.getIntValue("vehicle_qty")) - .task_group_id(jsonTask.getLong("task_group_id")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - // 锁定起点 - jsonZcKtp.put("lock_type", "2"); - pointTab.update(jsonZcKtp); - } else { - // 空托盘暂存区没有就到养生A区找: 先找到出库等待点 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + - "' and row_num = '9' and can_vehicle_type = '" + vehicle_type + - "' and is_used = '1' and is_delete = '0'").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonEmpWait)) continue; - - JSONObject jsonStartPoint = pointTab.query("region_id = '" + jsonEmpWait.getString("region_id") + - "' and block_num = '" + jsonEmpWait.getString("block_num") + - "' and col_num = '" + jsonEmpWait.getString("col_num") + - "' and point_status = '2' and lock_type = '1' order by out_empty_seq DESC").uniqueResult(0); - if (ObjectUtil.isEmpty(jsonStartPoint)) continue; - - // 判断找到的空载具点位是否是等待点 - if (StrUtil.equals(jsonEmpWait.getString("point_code"), jsonStartPoint.getString("point_code"))) { - // 创建 养生A区空载具等待点 --> 叠盘架 - SchTaskDto dto = SchTaskDto.builder() - .task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .acs_task_type("2") - .task_name("养生A区>叠盘架空载具") - .task_status(TaskStatusEnum.START_AND_POINT.getCode()) - .point_code1(jsonStartPoint.getString("point_code")) - .point_code2(jsonDpjStart2.getString("point_code")) - .vehicle_code(jsonStartPoint.getString("vehicle_code")) - .vehicle_type(jsonStartPoint.getString("vehicle_type")) - .vehicle_qty(jsonStartPoint.getIntValue("vehicle_qty")) - .task_group_id(jsonTask.getLong("task_group_id")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - // 锁起点 - jsonStartPoint.put("lock_type", "2"); - pointTab.update(jsonStartPoint); - } else { - // 判断等待点是否是 未锁定 - if (StrUtil.equals(jsonEmpWait.getString("lock_type"), "1")) { - // 创建 养生A区空载具 --> 叠盘架 - SchTaskDto dto = SchTaskDto.builder() - .task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .acs_task_type("2") - .task_name("养生A区>叠盘架空载具") - .task_status(TaskStatusEnum.START_AND_POINT.getCode()) - .point_code1(jsonStartPoint.getString("point_code")) - .point_code2(jsonDpjStart2.getString("point_code")) - .vehicle_code(jsonStartPoint.getString("vehicle_code")) - .vehicle_type(jsonStartPoint.getString("vehicle_type")) - .vehicle_qty(jsonStartPoint.getIntValue("vehicle_qty")) - .task_group_id(jsonTask.getLong("task_group_id")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - // 锁起点 - jsonStartPoint.put("lock_type", "2"); - pointTab.update(jsonStartPoint); - // 锁等待点 - jsonEmpWait.put("lock_type", "2"); - pointTab.update(jsonEmpWait); - } else { - continue; - - } - } - } - } - } - - } - - @Override - @Transactional(rollbackFor = Exception.class) - public String createTask(JSONObject form) { - /* - * 1.先生成确定终点的任务 - * 2.通过findStartPoint()找起点 - * 3.下发给ACS - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); // 生产工单表 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); //点位基础表 - - //任务表【SCH_BASE_Task】 - //判断当前点是否有未完成的任务 - JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + form.getString("point_code2") + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + form.getString("point_code2") + "存在未完成的任务"); - - - - - String point_code2 = form.getString("point_code2"); - String sub_device_code = point_code2.substring(0, point_code2.indexOf("_")); - - String device_code = pointTab.query("point_code = '" + sub_device_code + "'").uniqueResult(0).getString("device_code"); - - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); - - SchTaskDto dto = SchTaskDto.builder().task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .task_name("油漆线叫空载具") - .task_status(TaskStatusEnum.SURE_END.getCode()) - .point_code2(point_code2) - .acs_task_type("2") - .vehicle_code(form.getString("vehicle_code")) - .vehicle_type(workOrderObj.getString("vehicle_type")) - .vehicle_qty(form.getIntValue("qty")) - .task_group_id(org.nl.wms.util.IdUtil.getLongId()) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void forceFinish(String task_id) { - JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); - this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); - } - - - @Override - public void cancel(String task_id) { - - } - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '"+THIS_CLASS+"' and task_status = '"+TaskStatusEnum.START_AND_POINT.getCode()+"' and is_delete ='0'").getResultJSONArray(0); - - ArrayList resultList = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - String point_code1 = json.getString("point_code1"); - //判断起点是否属于养生A区 - if (point_code1.startsWith("2")) { - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - point_code1 = point_code1.substring(0, 4) + "1" + point_code1.substring(4, 9); - } - - AcsTaskDto dto = AcsTaskDto.builder() - .task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(point_code1) - .next_device_code(json.getString("point_code3")) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - resultList.add(dto); - } - return resultList; - } - - @Transactional(rollbackFor = Exception.class) - public boolean isTask(String point_code) { - /* - * 判断点位是否有任务存在 - */ - WQLObject tab = WQLObject.getWQLObject("SCH_BASE_Task"); - - boolean result; - - JSONObject jsonPointCode1 = tab.query("point_code1 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode2 = tab.query("point_code2 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode3 = tab.query("point_code3 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode4 = tab.query("point_code4 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonPointCode1) && ObjectUtil.isEmpty(jsonPointCode2) && ObjectUtil.isEmpty(jsonPointCode3) && ObjectUtil.isEmpty(jsonPointCode4)) { - result = true; - } else { - result = false; - } - - return result; - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_GjxCallEmpVehicleTask.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_GjxCallEmpVehicleTask.wql deleted file mode 100644 index b76c2fb..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_GjxCallEmpVehicleTask.wql +++ /dev/null @@ -1,60 +0,0 @@ -[交易说明] - 交易名: 共挤线申请空盘 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.vehicle_type TYPEAS s_string - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - QUERY - SELECT - * - FROM - SCH_BASE_Point - WHERE - is_used = '1' - AND is_delete = '0' - AND lock_type = '1' - AND point_status = '2' - AND region_code = 'KTPHCQB01' - - OPTION 输入.vehicle_type <> "" - can_vehicle_type = 输入.vehicle_type - ENDOPTION - - ENDSELECT - ENDQUERY - ENDIF \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_YqxCallEmpVehicleTask.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_YqxCallEmpVehicleTask.wql deleted file mode 100644 index 8163667..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_YqxCallEmpVehicleTask.wql +++ /dev/null @@ -1,60 +0,0 @@ -[交易说明] - 交易名: 油漆线申请空盘 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.vehicle_type TYPEAS s_string - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - QUERY - SELECT - * - FROM - SCH_BASE_Point - WHERE - is_used = '1' - AND is_delete = '0' - AND lock_type = '1' - AND point_status = '2' - AND region_code = 'KTPHCQA01' - - OPTION 输入.vehicle_type <> "" - can_vehicle_type = 输入.vehicle_type - ENDOPTION - - ENDSELECT - ENDQUERY - ENDIF \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java deleted file mode 100644 index be830eb..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java +++ /dev/null @@ -1,258 +0,0 @@ -package org.nl.wms.sch.tasks.callMaterial; - -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; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.common.utils.SecurityUtils; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.util.IdUtil; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - - -/** - *油漆线叫料 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class YqxCallMaterialTask extends AbstractAcsTask { - private final String THIS_CLASS = YqxCallMaterialTask.class.getName(); - - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject task, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - String task_id = task.getString("task_id"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - // 物料点 - JSONObject material_point = pointTab.query("point_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0); - //任务取消 - if (StrUtil.equals(status, "0")) { - // 取消删除任务 - if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { - throw new BadRequestException("已完成不能取消!"); - } - String point_code2 = taskObj.getString("point_code2"); - String point_code3 = taskObj.getString("point_code3"); - //说明未二次申请过 - if (ObjectUtil.isEmpty(point_code3)) { - JSONObject json = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - json.put("lock_type", "1"); - pointTab.update(json); - } - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("remark", "已取消"); - taskTab.update(taskObj); - - // 点位解锁 并设置空位 - material_point.put("lock_type", "1"); - material_point.put("point_status", "1"); - pointTab.update(material_point); - } - - if ("1".equals(status)) { - // 更新任务状态为执行中 - taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskObj.put("car_no", taskObj.getString("car_no")); - taskTab.update(taskObj); - } - - if (StrUtil.equals(status, "2")) { - // 更改任务状态为完成 - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - - JSONObject requestObj = task.getJSONObject("request_param"); - - //区域出入表【st_ivt_regionIO】 - WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); - JSONObject regionIoObj = new JSONObject(); - regionIoObj.put("iostorinv_id", IdUtil.getLongId()); - regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); - regionIoObj.put("buss_date", DateUtil.today()); - regionIoObj.put("io_type", "2"); - regionIoObj.put("region_id", material_point.getString("region_id")); - regionIoObj.put("region_code", material_point.getString("region_code")); - regionIoObj.put("region_name", material_point.getString("region_name")); - regionIoObj.put("material_id", taskObj.getString("material_id")); - regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); - regionIoObj.put("qty", requestObj.getString("material_num")); - regionIoObj.put("bill_status", "3"); - regionIoObj.put("start_point_code", taskObj.getString("point_code1")); - regionIoObj.put("end_point_code", taskObj.getString("point_code2")); - regionIoObj.put("create_mode", "2"); - regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); - regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); - regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); - regionIoObj.put("create_time", DateUtil.now()); - regionIoTab.insert(regionIoObj); - - //完成后将仓位库存删掉 - //仓位库存表【ST_IVT_StructIvt】 - WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); - ivtTab.delete("point_code = '" + taskObj.getString("point_code1") + "'"); - - // 点位解锁 并设置空位 - material_point.put("lock_type", "1"); - material_point.put("point_status", "1"); - pointTab.update(material_point); - } - - } - - @Override - public void findStartPoint() { - /* - * 根据业务找对应的起点 - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 - JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - JSONObject taskObj = taskArr.getJSONObject(i); - String material_id = taskObj.getString("material_id"); - String vehicle_type = taskObj.getString("vehicle_type"); - JSONObject param1 = new JSONObject(); - param1.put("flag", "1"); - param1.put("material_id", material_id); - param1.put("region_code", "YSQA01"); - param1.put("vehicle_type", "%" + vehicle_type + "%"); - //1、根据物料id查找养生A区物料点 - JSONObject json1 = WQL.getWO("QSCH_yqxCallMAterial_01").addParamMap(param1).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(json1)) { - // 拿到点位 - JSONObject material_point = pointTab.query("point_id = '" + json1.getString("point_id") + "' and lock_type = '1'").uniqueResult(0); - if (ObjectUtil.isEmpty(material_point)) throw new BadRequestException("数据错误,请校验!"); - // 物料点位上锁 - material_point.put("lock_type", "2"); - pointTab.update(material_point); - - taskObj.put("point_code1", material_point.getString("point_code")); - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskObj.put("acs_task_type", "2"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } else { - taskObj.put("remark", "养生A区无所需物料"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } - - } - } - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList acsTaskArr = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - String point_code =json.getString("point_code1"); - String newPoint = point_code.substring(0, 4) + "1" + point_code.substring(4, 9); - - AcsTaskDto dto = AcsTaskDto.builder() - .task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("acs_task_type")) - .start_device_code(newPoint) - .next_device_code(json.getString("point_code3")) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - acsTaskArr.add(dto); - } - return acsTaskArr; - } - - @Override - public String createTask(JSONObject whereJson) { - String point_code2 = whereJson.getString("point_code2"); - String vehicle_type = whereJson.getString("vehicle_type"); - String vehicle_code = whereJson.getString("vehicle_code"); - String qty = whereJson.getString("material_num"); - - //生产工单表【PDM_BD_WorkOrder】 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - //任务表【SCH_BASE_Task】 - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - //判断当前点是否有未完成的任务 - JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + point_code2 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code2 + "存在未完成的任务"); - //点位基础表【SCH_BASE_Point】 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); - String device_code = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0).getString("device_code"); - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); - - SchTaskDto dto = SchTaskDto.builder() - .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("task_type") - .task_name("油漆线叫料") - .material_qty(qty) - .task_status(TaskStatusEnum.SURE_END.getCode()) - .point_code2(point_code2) - .vehicle_code(vehicle_code) - .material_info_id(workOrderObj.getLong("workorder_id")) - .material_id(workOrderObj.getLong("material_id")) - .vehicle_type(vehicle_type) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .request_param(whereJson.toJSONString()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - - //创建好立即下发 - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - @Override - public void forceFinish(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"2"); - else { - throw new BadRequestException("未找到该任务或者任务已完成"); - } - } - - - @Override - public void cancel(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"0"); - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yqxCallMAterial_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yqxCallMAterial_01.wql deleted file mode 100644 index 16c4b37..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_yqxCallMAterial_01.wql +++ /dev/null @@ -1,71 +0,0 @@ -[交易说明] - 交易名: 共挤线满料请求 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.region_code TYPEAS s_string - 输入.material_id TYPEAS s_string - 输入.vehicle_type TYPEAS s_string - - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - IF 输入.flag = "1" - QUERY - SELECT - p.point_id, - p.point_code, - p.point_name, - p.block_num, - p.row_num, - p.col_num - FROM - ST_IVT_StructIvt ivt - LEFT JOIN SCH_BASE_Point p on ivt.point_id = p.point_id - WHERE - p.is_used = '1' - AND is_delete = '0' - AND lock_type='1' - OPTION 输入.material_id <> "" - ivt.material_id = 输入.material_id - ENDOPTION - OPTION 输入.region_code <> "" - p.region_code = 输入.region_code - ENDOPTION - OPTION 输入.vehicle_type <> "" - p.can_vehicle_type like 输入.vehicle_type - ENDOPTION - ORDER BY block_num,row_num desc,col_num - ENDSELECT - ENDQUERY - ENDIF \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/cpOut/CpOutTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/cpOut/CpOutTask.java deleted file mode 100644 index 99a4a40..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/cpOut/CpOutTask.java +++ /dev/null @@ -1,235 +0,0 @@ -package org.nl.wms.sch.tasks.cpOut; - -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; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -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.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.util.IdUtil; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - - -/** - *成品出库 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class CpOutTask extends AbstractAcsTask { - private final String THIS_CLASS = CpOutTask.class.getName(); - - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject task, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); - - String task_id = task.getString("task_id"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - - //任务取消 - if (StrUtil.equals(status, "0")) { - // 取消删除任务 - if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { - throw new BadRequestException("已完成不能取消!"); - } - String point_code2 = taskObj.getString("point_code2"); - JSONObject point2Obj = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("remark", "任务已取消"); - taskTab.update(taskObj); - // 释放终点点位 - point2Obj.put("lock_type", "1"); - point2Obj.put("point_status", "1"); - pointTab.update(point2Obj); - } - - if ("1".equals(status)) { - // 更新任务状态为执行中 - taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskObj.put("car_no", taskObj.getString("car_no")); - taskTab.update(taskObj); - } - - if (StrUtil.equals(status, "2")) { - // 更改任务状态为完成 - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - - // 任务表的点位1 - String point_code1 = taskObj.getString("point_code1"); // 起点编码 - JSONObject point1Obj = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0);// 起点 - - //table_fk_id = 单据id - JSONObject regionIoObject = regionIoTab.query("iostorinv_id = '" + taskObj.getString("table_fk_id") + "'").uniqueResult(0); - - String point_code2 = taskObj.getString("point_code2"); // 终点编码:出库点位 - JSONObject point2Obj = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0);// 终点 - - // 修改区域出入库 - 起点点位解锁、点位状态更新 - 终点解锁、更新状态 - //区域出入表【st_ivt_regionIO】 - regionIoObject.put("end_point_code", point_code2); - regionIoObject.put("start_region_id", point1Obj.getString("region_id")); // 终点区域 - regionIoObject.put("end_region_id", point2Obj.getString("region_id")); // 终点区域 - regionIoObject.put("bill_status", "3"); // 单据状态 - regionIoObject.put("task_id", task_id); // 任务id - regionIoTab.update(regionIoObject); - - //完成后将仓位库存删掉 - //仓位库存表【ST_IVT_StructIvt】 - WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); - ivtTab.delete("point_code = '" + taskObj.getString("point_code1") + "'"); - - // 点位解锁 并设置空位 - point1Obj.put("lock_type", "1"); - point1Obj.put("point_status", "1"); - point2Obj.put("lock_type", "1"); - point2Obj.put("point_status", "3"); - pointTab.update(point1Obj); - pointTab.update(point2Obj); - } - - } - - @Override - public void findNextPoint() { - /* - * 根据业务找对应的终点 - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 - JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - JSONObject taskObj = taskArr.getJSONObject(i); - String material_id = taskObj.getString("material_id"); - JSONObject param1 = new JSONObject(); - param1.put("flag", "1"); - param1.put("material_id", material_id); - param1.put("region_code", "CPCKQ01"); - //1、找空位的终点 - JSONObject endPoint = WQL.getWO("QSCH_cpOut_01").addParamMap(param1).process().uniqueResult(0); - if (ObjectUtil.isNotEmpty(endPoint)) { - // 找到终点,上锁 - taskObj.put("update_time", DateUtil.now()); - taskObj.put("point_code2", endPoint.getString("point_code")); - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskTab.update(taskObj); - - //锁住终点 - endPoint.put("task_id", taskObj.getString("task_id")); - endPoint.put("lock_type", "2"); - pointTab.update(endPoint); - } else { - taskObj.put("remark", "成品出库区无可用货位"); - taskObj.put("update_time", DateUtil.now()); - } - - taskTab.update(taskObj); - - } - } - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList acsTaskArr = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - AcsTaskDto dto = AcsTaskDto.builder() - .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_code3")) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - acsTaskArr.add(dto); - } - return acsTaskArr; - } - - @Override - public String createTask(JSONObject whereJson) { - WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); - String point_code1 = whereJson.getString("point_code1"); // 起点 - String vehicle_type = whereJson.getString("vehicle_type"); - String vehicle_code = whereJson.getString("vehicle_code"); - String iostorinv_id = whereJson.getString("iostorinv_id"); - - SchTaskDto dto = SchTaskDto.builder() - .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("task_type") - .task_name("成品区出库") - .task_status(TaskStatusEnum.SURE_END.getCode()) - .point_code1(point_code1) - .vehicle_code(vehicle_code) - .vehicle_type(vehicle_type) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .request_param(whereJson.toJSONString()) - .table_name("st_ivt_regionIO") - .table_fk("iostorinv_id") - .table_fk_id(Long.valueOf(iostorinv_id)) - .build(); - //任务表【SCH_BASE_Task】 - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - - // 单据设置执行中 - JSONObject iostorinv = regionIoTab.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0); - iostorinv.put("bill_status", "2"); - regionIoTab.update(iostorinv); - - //创建好立即下发 - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - @Override - public void forceFinish(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"2"); - else { - throw new BadRequestException("未找到该任务或者任务已完成"); - } - } - - @Override - public void cancel(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"0"); - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/cpOut/wql/QSCH_cpOut_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/cpOut/wql/QSCH_cpOut_01.wql deleted file mode 100644 index 7546033..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/cpOut/wql/QSCH_cpOut_01.wql +++ /dev/null @@ -1,59 +0,0 @@ -[交易说明] - 交易名: 成品出库 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.region_code TYPEAS s_string - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - QUERY - SELECT - * - FROM - SCH_BASE_Point - WHERE - is_used = '1' - AND is_delete = '0' - AND lock_type = '1' - AND is_used = '1' - AND point_status = '1' - OPTION 输入.region_code <> "" - region_code = 输入.region_code - ENDOPTION - ORDER BY point_code - ENDSELECT - ENDQUERY - ENDIF \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/HtSendEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/HtSendEmpVehicleTask.java deleted file mode 100644 index a5bf266..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/HtSendEmpVehicleTask.java +++ /dev/null @@ -1,438 +0,0 @@ -package org.nl.wms.sch.tasks.sendEmpty; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.sch.tasks.RegionTypeEnum; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -/** - * 一楼往二楼送空托盘业务 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class HtSendEmpVehicleTask extends AbstractAcsTask { - private final String THIS_CLASS = HtSendEmpVehicleTask.class.getName(); - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject taskObj, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - String task_id = taskObj.getString("task_id"); - JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - - if (StrUtil.equals(status, "0")) { - // 取消删除任务 - if (StrUtil.equals(jsonTask.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { - throw new BadRequestException("已完成不能取消!"); - } - String point_code3 = jsonTask.getString("point_code3"); - String point_code2 = jsonTask.getString("point_code2"); - if (ObjectUtil.isNotEmpty(point_code3)) { - JSONObject jsonPoint3 = pointTab.query("point_code ='" + point_code3 + "'").uniqueResult(0); - jsonPoint3.put("point_status", "1"); - pointTab.update(jsonPoint3); - } - if (ObjectUtil.isNotEmpty(point_code2)) { - JSONObject jsonPoint2 = pointTab.query("point_code ='" + point_code2 + "'").uniqueResult(0); - jsonPoint2.put("point_status", "1"); - pointTab.update(jsonPoint2); - } - taskTab.delete("task_id = '" + task_id + "'"); - } - - if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { - // 更新任务状态为执行中 - jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - jsonTask.put("update_time", DateUtil.now()); - jsonTask.put("car_no", taskObj.getString("car_no")); - taskTab.update(jsonTask); - } - - if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { - // 更改任务状态为完成 - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); - - String point_code3 = jsonTask.getString("point_code3"); - String point_code = ""; - // 更新终点:判断point_code3是否为空,为空就更新point_code2 - if (ObjectUtil.isNotEmpty(point_code3)) { - point_code = point_code3; - // 更新point_code2:解锁 - JSONObject point2 = pointTab.query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); - point2.put("lock_type", "1"); - point2.put("vehicle_type", ""); - point2.put("vehicle_code", ""); - point2.put("vehicle_qty", 0); - pointTab.update(point2); - } else { - point_code = jsonTask.getString("point_code2"); - } - - JSONObject endPoint = pointTab.query("point_code = '" + point_code + "'").uniqueResult(0); - - //终点是叠盘架 - if (StrUtil.equals(endPoint.getString("region_id"), RegionTypeEnum.DPJQA.getId())) { - Integer vehicle_qty = endPoint.getInteger("vehicle_qty"); - vehicle_qty += jsonTask.getInteger("vehicle_qty"); - endPoint.put("lock_type", "1"); - endPoint.put("vehicle_qty", vehicle_qty); - endPoint.put("point_status", "1"); - endPoint.put("vehicle_type", jsonTask.getString("vehicle_type")); - pointTab.update(endPoint); - } else {//非叠盘架 - endPoint.put("lock_type", "1"); - endPoint.put("vehicle_code", jsonTask.getString("vehicle_code")); - endPoint.put("vehicle_qty", jsonTask.getString("vehicle_qty")); - endPoint.put("vehicle_type", jsonTask.getString("vehicle_type")); - endPoint.put("point_status", "2"); - pointTab.update(endPoint); - } - } - } - - - @Override - @Transactional(rollbackFor = Exception.class) - public String createTask(JSONObject form) { - /* - * 1.先生成确定起点的任务 - * 2.通过findNextPoint()找终点 - * 3.下发给ACS - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - - String point_code1 = form.getString("point_code1"); - - SchTaskDto dto = SchTaskDto.builder().task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .task_name("电梯送空载具") - .task_status(TaskStatusEnum.SURE_START.getCode()) - .point_code1(point_code1) - .vehicle_code(form.getString("vehicle_code")) - .vehicle_type(form.getString("vehicle_type")) - .vehicle_qty(form.getIntValue("qty")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - this.findNextPoint(); -// this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - @Override - public void findNextPoint() { - /* - * 根据业务找对应的终点 - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '2'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - JSONObject jsonTask = taskArr.getJSONObject(i); - String point_code_ht = ""; - - //判断SSX01A1是否有任务没有则判断其他的三个点位 - boolean ssx_1 = this.isTask("SSX01A1"); - if (ssx_1) { - String like = "SSX01%"; - - JSONArray taskArrNum = new JSONArray(); - JSONArray pointArr = pointTab.query("region_id = '" + RegionTypeEnum.SSX.getId() + "' and is_used = '1' and is_delete = '0' and point_code like '" + like + "'").getResultJSONArray(0); - - for (int j = 0; j < pointArr.size(); j++) { - JSONObject json = pointArr.getJSONObject(j); - boolean is_empTask = this.isTask(json.getString("point_code")); - - if (!is_empTask) taskArrNum.add(json); - } - - if (taskArrNum.size() > 0) { - - } else { - point_code_ht = "SSX01A1"; - } - } - - // 判断SSX02A1是否有任务没有则判断其他的三个点位 - if (ObjectUtil.isEmpty(point_code_ht)) { - boolean ssx_2 = this.isTask("SSX02A1"); - if (ssx_2) { - String like = "SSX02%"; - - JSONArray taskArrNum = new JSONArray(); - JSONArray pointArr = pointTab.query("region_id = '" + RegionTypeEnum.SSX.getId() + "' and is_used = '1' and is_delete = '0' and point_code like '" + like + "'").getResultJSONArray(0); - - for (int k = 0; k < pointArr.size(); k++) { - JSONObject json = pointArr.getJSONObject(k); - boolean is_empTask = this.isTask(json.getString("point_code")); - - if (!is_empTask) taskArrNum.add(json); - } - - if (taskArrNum.size() > 0) { - - } else { - point_code_ht = "SSX02A1"; - } - } - } - - // 如果此时point_code_ht为空则循环下一个任务 - if (ObjectUtil.isEmpty(point_code_ht)) { - continue; - } - - // 说明货梯无任务:找终点 - JSONObject param = new JSONObject(); - param.put("vehicle_type", jsonTask.getString("vehicle_type")); - param.put("qty", jsonTask.getString("vehicle_qty")); - String endPoint = this.endPoint(param); - - // 如果此时endPoint为空则循环下一个任务 - if (ObjectUtil.isEmpty(endPoint)) { - continue; - } - - // 更新任务表point_code2 - jsonTask.put("point_code2", endPoint); - jsonTask.put("task_status", "4"); - taskTab.update(jsonTask); - - // 锁定终点 - JSONObject jsonEnd = pointTab.query("point_code = '" + endPoint + "'").uniqueResult(0); - jsonEnd.put("lock_type", "2"); - pointTab.update(jsonEnd); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void forceFinish(String task_id) { - /* - * 强制完成 - */ - JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); - this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); - } - - @Override - public void cancel(String task_id) { - - } - - @Transactional(rollbackFor = Exception.class) - public String endPoint(JSONObject param) { - /* - * 1.叠盘架有A对应货位 规则:如果暂存位能放下则放暂存位如果放不下则走2或3 - * 2.叠盘架A没有货位 则去叠盘架暂存位 - * 3.叠盘架暂存位没有货位则去养生A区 - */ - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); // 点位表 - - String end_code = ""; - - String vehicle_type = param.getString("vehicle_type"); - - // 1.找到对应类型的叠盘架 - JSONObject jsonDpjEnd = pointTab.query("region_id = '" + RegionTypeEnum.DPJQA.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonDpjEnd)) { - // 判断数量 + 叠盘架的数量是否超过此叠盘架的最大数量 - double add_num = NumberUtil.add(param.getIntValue("qty"), jsonDpjEnd.getIntValue("vehicle_qty")); - - if (jsonDpjEnd.getDoubleValue("vehicle_max_qty") >= add_num) { - end_code = jsonDpjEnd.getString("point_code"); - } else { - // 如果数量大于此叠盘架最大数量则查找叠盘架缓存位是否有对应空位 - JSONObject jsonZcwEnd = pointTab.query("region_id = '" + RegionTypeEnum.KTPHCQA.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonZcwEnd)) { - end_code = jsonZcwEnd.getString("point_code"); - } else { - // 为空就去养生A区的等待位 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + "' and row_num = '1' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonEmpWait)) { - // 判断是否有任务 - boolean is_point = this.isTask(jsonEmpWait.getString("point_code")); - if (is_point) { - JSONArray jsonEmpArr = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + "' and col_num = '" + jsonEmpWait.getString("col_num") + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").getResultJSONArray(0); - if (ObjectUtil.isNotEmpty(jsonEmpArr)) end_code = jsonEmpWait.getString("point_code"); - } - } - } - } - } else { - // 2.叠盘架没有空位去找叠盘暂存位 - JSONObject jsonZcwEnd = pointTab.query("region_id = '" + RegionTypeEnum.KTPHCQA.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonZcwEnd)) { - end_code = jsonZcwEnd.getString("point_code"); - } else { - // 为空就去养生A区的等待位 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + "' and row_num = '1' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonEmpWait)) { - // 判断是否有任务 - boolean is_point = this.isTask(jsonEmpWait.getString("point_code")); - if (is_point) { - JSONArray jsonEmpArr = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + "' and col_num = '" + jsonEmpWait.getString("col_num") + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").getResultJSONArray(0); - if (ObjectUtil.isNotEmpty(jsonEmpArr)) end_code = jsonEmpWait.getString("point_code"); - } - } - } - } - - return end_code; - } - - @Transactional(rollbackFor = Exception.class) - public boolean isTask(String point_code) { - /* - * 判断点位是否有任务存在 - */ - WQLObject tab = WQLObject.getWQLObject("SCH_BASE_Task"); - - boolean result; - - JSONObject jsonPointCode1 = tab.query("point_code1 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode2 = tab.query("point_code2 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode3 = tab.query("point_code3 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode4 = tab.query("point_code4 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonPointCode1) && ObjectUtil.isEmpty(jsonPointCode2) && ObjectUtil.isEmpty(jsonPointCode3) && ObjectUtil.isEmpty(jsonPointCode4)) { - result = true; - } else { - result = false; - } - - return result; - } - - @Transactional(rollbackFor = Exception.class) - @Override - public String againApply(String task_id) { - /* - * 再次下发任务处理方法 - * 涉及业务:入空载具、出空载具、入物料、出物料 - */ - - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); // 点位表 - - String point_code = ""; - - JSONObject jsonTask = taskTab.query("task_id ='" + task_id + "'").uniqueResult(0); - JSONObject jsonPoint2 = pointTab.query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); - - // 根据 区域、块、列找到第一个有物料的货位 - JSONObject jsonOnePoint = pointTab.query("region_id = '" + jsonPoint2.getString("region_id") + - "' and block_num = '" + jsonPoint2.getString("block_num") + - "' and col_num = '" + jsonPoint2.getString("col_num") + - "' and point_code <> '" + jsonPoint2.getString("point_code") + - "' and point_status = '2' and lock_type = '1' order by in_empty_seq ASC").uniqueResult(0); - - // 如果为空说明这一列其他货位为空 则入到最后一个货位 - if (ObjectUtil.isEmpty(jsonOnePoint)) { - JSONObject jsonEmpPoint = pointTab.query("region_id = '" + jsonPoint2.getString("region_id") + - "' and block_num = '" + jsonPoint2.getString("block_num") + - "' and col_num = '" + jsonPoint2.getString("col_num") + - "' and point_code <> '" + jsonPoint2.getString("point_code") + - "' and point_status = '1' and lock_type = '1' order by in_empty_seq DESC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonEmpPoint)) { - point_code = jsonEmpPoint.getString("point_code"); - jsonTask.put("point_code3", point_code); - taskTab.update(jsonTask); - } - } else { - // 找前一位的空位 - double in_empty_seq = NumberUtil.sub(jsonOnePoint.getIntValue("in_empty_seq"), 1); - - JSONObject jsonEmpPoint = pointTab.query("region_id = '" + jsonPoint2.getString("region_id") + - "' and block_num = '" + jsonPoint2.getString("block_num") + - "' and col_num = '" + jsonPoint2.getString("col_num") + - "' and point_code <> '" + jsonPoint2.getString("point_code") + - "' and in_empty_seq = '" + in_empty_seq + - "' and point_status = '1' and lock_type = '1'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonEmpPoint)) { - point_code = jsonEmpPoint.getString("point_code"); - jsonTask.put("point_code3", point_code); - taskTab.update(jsonTask); - } - } - - if (ObjectUtil.isNotEmpty(point_code)) { - JSONObject jsonEndPoint = pointTab.query("point_code = '" + point_code + "'").uniqueResult(0); - jsonEndPoint.put("lock_type", "2"); - pointTab.update(jsonEndPoint); - } - //判断点位是否属于养生A区 - if (point_code.startsWith("2")) { - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - point_code = point_code.substring(0, 4) + "1" + point_code.substring(4, 9); - } - return point_code; - } - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '"+THIS_CLASS+"' and task_status = '"+TaskStatusEnum.START_AND_POINT.getCode()+"' and is_delete ='0'").getResultJSONArray(0); - - ArrayList resultList = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - - String point_code3=json.getString("point_code3"); - //判断终点是否属于养生A区 - if (point_code3.startsWith("2")) { - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - point_code3 = point_code3.substring(0, 4) + "1" + point_code3.substring(4, 9); - } - - - AcsTaskDto dto = AcsTaskDto.builder() - .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(point_code3) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - resultList.add(dto); - } - return resultList; - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/YqxSendEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/YqxSendEmpVehicleTask.java deleted file mode 100644 index 4177b9b..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/YqxSendEmpVehicleTask.java +++ /dev/null @@ -1,391 +0,0 @@ -package org.nl.wms.sch.tasks.sendEmpty; - -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.sch.tasks.RegionTypeEnum; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -@Service -@RequiredArgsConstructor -@Slf4j -public class YqxSendEmpVehicleTask extends AbstractAcsTask { - private final String THIS_CLASS = YqxSendEmpVehicleTask.class.getName(); - - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject taskObj, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - String task_id = taskObj.getString("task_id"); - JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - - if (StrUtil.equals(status, "0")) { - // 取消删除任务 - if (StrUtil.equals(jsonTask.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { - throw new BadRequestException("已完成不能取消!"); - } - String point_code3 = jsonTask.getString("point_code3"); - String point_code2 = jsonTask.getString("point_code2"); - if (ObjectUtil.isNotEmpty(point_code3)) { - JSONObject jsonPoint3 = pointTab.query("point_code ='" + point_code3 + "'").uniqueResult(0); - jsonPoint3.put("point_status", "1"); - pointTab.update(jsonPoint3); - } - if (ObjectUtil.isNotEmpty(point_code2)) { - JSONObject jsonPoint2 = pointTab.query("point_code ='" + point_code2 + "'").uniqueResult(0); - jsonPoint2.put("point_status", "1"); - pointTab.update(jsonPoint2); - } - taskTab.delete("task_id = '" + task_id + "'"); - } - - if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { - // 更新任务状态为执行中 - jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - jsonTask.put("update_time", DateUtil.now()); - jsonTask.put("car_no", taskObj.getString("car_no")); - taskTab.update(jsonTask); - } - - if (StrUtil.equals(status, TaskStatusEnum.FINISHED.getCode())) { - // 更改任务状态为完成 - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); - - String point_code3 = jsonTask.getString("point_code3"); - String point_code = ""; - // 更新终点:判断point_code3是否为空,为空就更新point_code2 - if (ObjectUtil.isNotEmpty(point_code3)) { - point_code = point_code3; - // 更新point_code2:解锁 - JSONObject point2 = pointTab.query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); - point2.put("lock_type", "1"); - point2.put("vehicle_type", ""); - point2.put("vehicle_code", ""); - point2.put("vehicle_qty", 0); - pointTab.update(point2); - } else { - point_code = jsonTask.getString("point_code2"); - } - - JSONObject endPoint = pointTab.query("point_code = '" + point_code + "'").uniqueResult(0); - - //终点是叠盘架 - if (StrUtil.equals(endPoint.getString("region_id"), RegionTypeEnum.DPJQB.getId())) { - Integer vehicle_qty = endPoint.getInteger("vehicle_qty"); - vehicle_qty += jsonTask.getInteger("vehicle_qty"); - endPoint.put("lock_type", "1"); - endPoint.put("vehicle_qty", vehicle_qty); - endPoint.put("point_status", "1"); - endPoint.put("vehicle_type", jsonTask.getString("vehicle_type")); - pointTab.update(endPoint); - } else {//非叠盘架 - endPoint.put("lock_type", "1"); - endPoint.put("vehicle_code", jsonTask.getString("vehicle_code")); - endPoint.put("vehicle_qty", jsonTask.getString("vehicle_qty")); - endPoint.put("vehicle_type", jsonTask.getString("vehicle_type")); - endPoint.put("point_status", "2"); - pointTab.update(endPoint); - } - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public String createTask(JSONObject form) { - /* - * 1.先生成确定起点的任务 - * 2.通过findNextPoint()找终点 - * 3.下发给ACS - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - - String point_code1 = form.getString("point_code1"); - - SchTaskDto dto = SchTaskDto.builder().task_id(org.nl.wms.util.IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("") - .task_status(TaskStatusEnum.SURE_START.getCode()) - .point_code1(point_code1) - .vehicle_code(form.getString("vehicle_code")) - .vehicle_type(form.getString("vehicle_type")) - .vehicle_qty(form.getIntValue("qty")) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); -// this.findNextPoint(); - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - /** - * @return - * @discription 确定下一点位 - * @author ldjun - * @created 2020年6月12日 下午6:01:06 - */ - @Override - public void findNextPoint() { - /* - * 根据业务找对应的终点 - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '2'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - JSONObject jsonTask = taskArr.getJSONObject(i); - - // 找终点 - JSONObject param = new JSONObject(); - param.put("vehicle_type", jsonTask.getString("vehicle_type")); - param.put("qty", jsonTask.getString("vehicle_qty")); - String endPoint = this.endPoint(param); - - // 如果此时endPoint为空则循环下一个任务 - if (ObjectUtil.isEmpty(endPoint)) { - continue; - } - - // 更新任务表point_code2 - jsonTask.put("point_code2", endPoint); - jsonTask.put("task_status", "4"); - taskTab.update(jsonTask); - - // 锁定终点 - JSONObject jsonEnd = pointTab.query("point_code = '" + endPoint + "'").uniqueResult(0); - jsonEnd.put("lock_type", "2"); - pointTab.update(jsonEnd); - } - - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void forceFinish(String task_id) { - /* - * 强制完成 - */ - JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); - this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); - } - - - @Override - public void cancel(String task_id) { - - } - - @Transactional(rollbackFor = Exception.class) - public String endPoint(JSONObject param) { - /* - * 1.叠盘架有B对应货位 规则:如果暂存位能放下则放暂存位如果放不下则走2或3 - * 2.叠盘架B没有货位 则去叠盘架暂存位 - * 3.叠盘架暂存位没有货位则去养生A区 - */ - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); // 点位表 - - String end_code = ""; - - String vehicle_type = param.getString("vehicle_type"); - - // 1.找到对应类型的叠盘架 - JSONObject jsonDpjEnd = pointTab.query("region_id = '" + RegionTypeEnum.DPJQB.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonDpjEnd)) { - // 判断数量 + 叠盘架的数量是否超过此叠盘架的最大数量 - double add_num = NumberUtil.add(param.getIntValue("qty"), jsonDpjEnd.getIntValue("vehicle_qty")); - - if (jsonDpjEnd.getDoubleValue("vehicle_max_qty") >= add_num) { - end_code = jsonDpjEnd.getString("point_code"); - } else { - // 如果数量大于此叠盘架最大数量则查找叠盘架缓存位是否有对应空位 - JSONObject jsonZcwEnd = pointTab.query("region_id = '" + RegionTypeEnum.KTPHCQB.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonZcwEnd)) { - end_code = jsonZcwEnd.getString("point_code"); - } else { - // 为空就去养生A区的等待位 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + "' and row_num = '1' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonEmpWait)) { - // 判断是否有任务 - boolean is_point = this.isTask(jsonEmpWait.getString("point_code")); - if (is_point) { - JSONArray jsonEmpArr = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + "' and col_num = '" + jsonEmpWait.getString("col_num") + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").getResultJSONArray(0); - if (ObjectUtil.isNotEmpty(jsonEmpArr)) end_code = jsonEmpWait.getString("point_code"); - } - } - } - } - } else { - // 2.叠盘架没有空位去找叠盘暂存位 - JSONObject jsonZcwEnd = pointTab.query("region_id = '" + RegionTypeEnum.KTPHCQB.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonZcwEnd)) { - end_code = jsonZcwEnd.getString("point_code"); - } else { - // 为空就去养生A区的等待位 - JSONObject jsonEmpWait = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + "' and row_num = '1' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonEmpWait)) { - // 判断是否有任务 - boolean is_point = this.isTask(jsonEmpWait.getString("point_code")); - if (is_point) { - JSONArray jsonEmpArr = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + "' and col_num = '" + jsonEmpWait.getString("col_num") + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").getResultJSONArray(0); - if (ObjectUtil.isNotEmpty(jsonEmpArr)) end_code = jsonEmpWait.getString("point_code"); - } - } - } - } - - return end_code; - } - - @Transactional(rollbackFor = Exception.class) - public boolean isTask(String point_code) { - /* - * 判断点位是否有任务存在 - */ - WQLObject tab = WQLObject.getWQLObject("SCH_BASE_Task"); - - boolean result; - - JSONObject jsonPointCode1 = tab.query("point_code1 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode2 = tab.query("point_code2 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode3 = tab.query("point_code3 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - JSONObject jsonPointCode4 = tab.query("point_code4 = '" + point_code + "' and task_status <> '7' and is_delete = '0'").uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonPointCode1) && ObjectUtil.isEmpty(jsonPointCode2) && ObjectUtil.isEmpty(jsonPointCode3) && ObjectUtil.isEmpty(jsonPointCode4)) { - result = true; - } else { - result = false; - } - - return result; - } - - @Transactional(rollbackFor = Exception.class) - @Override - public String againApply(String task_id) { - /* - * 再次下发任务处理方法 - * 涉及业务:入空载具、出空载具、入物料、出物料 - */ - - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); // 点位表 - - String point_code = ""; - - JSONObject jsonTask = taskTab.query("task_id ='" + task_id + "'").uniqueResult(0); - JSONObject jsonPoint2 = pointTab.query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); - - // 根据 区域、块、列找到第一个有物料的货位 - JSONObject jsonOnePoint = pointTab.query("region_id = '" + jsonPoint2.getString("region_id") + - "' and block_num = '" + jsonPoint2.getString("block_num") + - "' and col_num = '" + jsonPoint2.getString("col_num") + - "' and point_code <> '" + jsonPoint2.getString("point_code") + - "' and point_status = '2' and lock_type = '1' order by in_empty_seq ASC").uniqueResult(0); - - // 如果为空说明这一列其他货位为空 则入到最后一个货位 - if (ObjectUtil.isEmpty(jsonOnePoint)) { - JSONObject jsonEmpPoint = pointTab.query("region_id = '" + jsonPoint2.getString("region_id") + - "' and block_num = '" + jsonPoint2.getString("block_num") + - "' and col_num = '" + jsonPoint2.getString("col_num") + - "' and point_code <> '" + jsonPoint2.getString("point_code") + - "' and point_status = '1' and lock_type = '1' order by in_empty_seq DESC").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonEmpPoint)) { - point_code = jsonEmpPoint.getString("point_code"); - jsonTask.put("point_code3", point_code); - taskTab.update(jsonTask); - } - } else { - // 找前一位的空位 - double in_empty_seq = NumberUtil.sub(jsonOnePoint.getIntValue("in_empty_seq"), 1); - - JSONObject jsonEmpPoint = pointTab.query("region_id = '" + jsonPoint2.getString("region_id") + - "' and block_num = '" + jsonPoint2.getString("block_num") + - "' and col_num = '" + jsonPoint2.getString("col_num") + - "' and point_code <> '" + jsonPoint2.getString("point_code") + - "' and in_empty_seq = '" + in_empty_seq + - "' and point_status = '1' and lock_type = '1'").uniqueResult(0); - - if (ObjectUtil.isNotEmpty(jsonEmpPoint)) { - point_code = jsonEmpPoint.getString("point_code"); - jsonTask.put("point_code3", point_code); - taskTab.update(jsonTask); - } - } - - if (ObjectUtil.isNotEmpty(point_code)) { - JSONObject jsonEndPoint = pointTab.query("point_code = '" + point_code + "'").uniqueResult(0); - jsonEndPoint.put("lock_type", "2"); - pointTab.update(jsonEndPoint); - } - //判断点位是否属于养生A区 - if (point_code.startsWith("2")) { - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - point_code = point_code.substring(0, 4) + "1" + point_code.substring(4, 9); - } - return point_code; - } - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList resultList = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - String point_code3 = json.getString("point_code3"); - //判断终点是否属于养生A区 - if (point_code3.startsWith("2")) { - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - point_code3 = point_code3.substring(0, 4) + "1" + point_code3.substring(4, 9); - } - - - AcsTaskDto dto = AcsTaskDto.builder() - .task_id(json.getString("task_id")) - .task_code(json.getString("task_code")) - .task_type(json.getString("task_type")) - .start_device_code(json.getString("point_code1")) - .next_device_code(point_code3) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - resultList.add(dto); - } - return resultList; - } - - -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java deleted file mode 100644 index b9290ca..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java +++ /dev/null @@ -1,384 +0,0 @@ -package org.nl.wms.sch.tasks.sendMaterial; - -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; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.common.utils.SecurityUtils; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.util.IdUtil; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - - -/** - * 共挤线送料任务服务 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class GjxSendMaterialTask extends AbstractAcsTask { - private final String THIS_CLASS = GjxSendMaterialTask.class.getName(); - - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject task, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - String task_id = task.getString("task_id"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - - //任务取消 - if (StrUtil.equals(status, "0")) { - // 取消删除任务 - if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { - throw new BadRequestException("已完成不能取消!"); - } - - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("remark", "已取消"); - taskTab.update(taskObj); - - //释放相关电位信息 - JSONObject param1 = new JSONObject(); - param1.put("lock_type", "1"); - param1.put("task_id", ""); - param1.put("material_id", ""); - pointTab.update(param1, "task_id = '" + taskObj.getString("task_id") + "'"); - } - - if ("1".equals(status)) { - // 更新任务状态为执行中 - taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskObj.put("car_no", taskObj.getString("car_no")); - taskTab.update(taskObj); - } - - if (StrUtil.equals(status, "2")) { - - //判断状态, - if (StrUtil.equals("2", taskObj.getString("task_status"))) { - // 更改任务状态为完成 - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - return; - } - // 更改任务状态为完成 - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - - - String point_code2 = taskObj.getString("point_code2"); - JSONObject endPoint = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - JSONObject requestObj = task.getJSONObject("request_param"); - //工单标识 - String workorder_id = requestObj.getString("material_info_id"); - //生产工单表【PDM_BD_WorkOrder】 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - JSONObject workorderObj = workOrderTab.query("workorder_id", workorder_id).uniqueResult(0); - - - //区域出入表【st_ivt_regionIO】 - WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); - JSONObject regionIoObj = new JSONObject(); - regionIoObj.put("iostorinv_id", IdUtil.getLongId()); - regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); - regionIoObj.put("buss_date", DateUtil.today()); - regionIoObj.put("io_type", "1"); - regionIoObj.put("region_id", endPoint.getString("region_id")); - regionIoObj.put("region_code", endPoint.getString("region_code")); - regionIoObj.put("region_name", endPoint.getString("region_name")); - regionIoObj.put("material_id", taskObj.getString("material_id")); - regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); - regionIoObj.put("qty", requestObj.getString("qty")); - regionIoObj.put("bill_status", "3"); - regionIoObj.put("start_point_code", taskObj.getString("point_code1")); - regionIoObj.put("end_point_code", taskObj.getString("point_code3")); - regionIoObj.put("create_mode", "2"); - regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); - regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); - regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); - regionIoObj.put("create_time", DateUtil.now()); - regionIoTab.insert(regionIoObj); - - - //完成后入库 - //仓位库存表【ST_IVT_StructIvt】 - WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); - JSONObject ivtObj = new JSONObject(); - ivtObj.put("stockrecord_id", IdUtil.getLongId()); - ivtObj.put("point_id", endPoint.getString("point_id")); - ivtObj.put("point_code", endPoint.getString("point_code")); - ivtObj.put("point_name", endPoint.getString("point_name")); - ivtObj.put("region_id", endPoint.getString("region_id")); - ivtObj.put("region_code", endPoint.getString("region_code")); - ivtObj.put("region_name", endPoint.getString("region_name")); - ivtObj.put("instorage_time", DateUtil.now()); - ivtObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); - ivtObj.put("ivt_qty", requestObj.getString("qty")); - ivtObj.put("standing_time", workorderObj.getString("standing_time")); - ivtObj.put("material_id", workorderObj.getString("material_id")); - ivtTab.insert(ivtObj); - - // 点位解锁 - endPoint.put("lock_type", "1"); - endPoint.put("point_status", "3"); - endPoint.put("material_id", taskObj.getString("material_id")); - pointTab.update(endPoint); - //释放整列货位 - JSONObject param = new JSONObject(); - param.put("lock_type", "1"); - pointTab.update(param, "task_id = '" + task_id + "'"); - - } - - } - - @Override - public void findNextPoint() { - //判断共挤线是否有执行中的任务,如果任务数>=3,则不生成任务 - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - /* - * 根据业务找对应的终点 - */ - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '2'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - JSONObject taskObj = taskArr.getJSONObject(i); - String material_id = taskObj.getString("material_id"); - String vehicle_type = taskObj.getString("vehicle_type"); - JSONObject param1 = new JSONObject(); - param1.put("flag", "1"); - param1.put("material_id", material_id); - param1.put("region_code", "YSQA01"); - param1.put("vehicle_type", "%" + vehicle_type + "%"); - //1、查找库区类是否有响应的载具类型和对应的物料 - JSONObject json1 = WQL.getWO("QSCH_gjxSendMaterial_01").addParamMap(param1).process().uniqueResult(0); - - - //判断是否有到同一列的相同物料SKU的AGV任务,如果有,则等待 - JSONArray taskIngs = taskTab.query("is_delete='0' and material_id = '" + material_id + "' and (task_status = '4' or task_status = '5' or task_status = '6' )").getResultJSONArray(0); - - if (ObjectUtil.isNotEmpty(taskIngs)) { - JSONObject taskIng = taskIngs.getJSONObject(0); - if (ObjectUtil.isNotEmpty(taskIng) && ObjectUtil.isNotEmpty(json1)) { - JSONObject point2 = pointTab.query("point_code = '" + taskIng.getString("point_code2") + "'").uniqueResult(0); - if (StrUtil.equals(point2.getString("block_num"), json1.getString("block_num")) - && StrUtil.equals(point2.getString("col_num"), json1.getString("col_num"))) { - taskObj.put("remark", "相应列有AGV在工作,等待执行!"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } - } - } - - - if (ObjectUtil.isNotEmpty(json1)) { - Integer block_num = json1.getInteger("block_num"); - Integer row_num = json1.getInteger("row_num"); - Integer col_num = json1.getInteger("col_num"); - - JSONObject firstRow = pointTab.query("block_num = '" + block_num + "' and col_num = '" + col_num + "' and row_num ='" + (row_num - 1) + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(firstRow)) throw new BadRequestException("数据错误,请校验!"); - taskObj.put("point_code2", firstRow.getString("point_code")); - taskObj.put("update_time", DateUtil.now()); - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - //二楼普通任务 - taskTab.update(taskObj); - //锁住相关货位 - JSONObject point = new JSONObject(); - point.put("lock_type", "2"); - point.put("task_id", taskObj.getString("task_id")); - pointTab.update(point, "block_num = '" + block_num + "' and col_num = '" + col_num + "' and row_num <= '" + (row_num - 1) + "'"); - - } else {//找空位入 - if (ObjectUtil.isNotEmpty(taskIngs) && taskIngs.size() > 1) { - taskObj.put("remark", "相应列有AGV在工作,等待执行!"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - continue; - } - - JSONObject param2 = new JSONObject(); - param2.put("flag", "2"); - param2.put("region_code", "YSQA01"); - param2.put("vehicle_type", "%" + vehicle_type + "%"); - //1、查找整列为空的货位 - JSONObject json2 = WQL.getWO("QSCH_gjxSendMaterial_01").addParamMap(param2).process().uniqueResult(0); - if (ObjectUtil.isEmpty(json2)) { - taskObj.put("remark", "养生A区无可用货位"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } else { - Integer block_num = json2.getInteger("block_num"); - Integer col_num = json2.getInteger("col_num"); - JSONObject firstRow = pointTab.query("block_num = '" + block_num + "' and col_num = '" + col_num + "' and row_num ='9'").uniqueResult(0); - taskObj.put("point_code2", firstRow.getString("point_code")); - //二楼普通任务 - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - //锁住相关货位 - JSONObject point = new JSONObject(); - point.put("lock_type", "2"); - point.put("task_id", taskObj.getString("task_id")); - pointTab.update(point, "block_num = '" + block_num + "' and col_num = '" + col_num + "' and row_num <= '" + 9 + "'"); - - } - } - - } - } - - @Override - public List addTask() { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = taskTab.query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList acsTaskArr = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - String point_code = json.getString("point_code2"); - String newPoint = point_code.substring(0, 4) + "1" + point_code.substring(4, 9); - - AcsTaskDto dto = AcsTaskDto.builder() - .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(newPoint) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - acsTaskArr.add(dto); - } - return acsTaskArr; - } - - @Override - public String createTask(JSONObject whereJson) { - String point_code1 = whereJson.getString("point_code1"); - String vehicle_type = whereJson.getString("vehicle_type"); - String vehicle_code = whereJson.getString("vehicle_code"); - String qty = whereJson.getString("qty"); - - //生产工单表【PDM_BD_WorkOrder】 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - //点位基础表【SCH_BASE_Point】 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); - - //任务表【SCH_BASE_Task】 - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - //判断当前点是否有未完成的任务 - JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); - - String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code"); - - - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); - - - SchTaskDto dto = SchTaskDto.builder() - .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("task_type") - .task_name("共挤线满料") - .task_status(TaskStatusEnum.SURE_START.getCode()) - .point_code1(point_code1) - .acs_task_type("2")//2楼AGV普通任务 - .vehicle_code(vehicle_code) - .material_qty(qty) - .material_info_id(workOrderObj.getLong("workorder_id")) - .material_id(workOrderObj.getLong("material_id")) - .vehicle_type(vehicle_type) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .request_param(whereJson.toJSONString()) - .build(); - - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - - //创建好立即下发 - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - @Override - public void forceFinish(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status < " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) { - this.updateTaskStatus(taskObj, "2"); - } else { - throw new BadRequestException("任务已删除或者已完成!"); - } - - } - - - @Override - public void cancel(String task_id) { - - } - - //TODO 暂时不用二次申请 - @Transactional(rollbackFor = Exception.class) - @Override - public String againApply(String task_id) { - /* - * 再次下发任务处理方法 - * 涉及业务:入空载具、出空载具、入物料、出物料 - */ - - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); // 点位表 - - JSONObject taskObj = taskTab.query("task_id ='" + task_id + "'").uniqueResult(0); - - JSONObject jsonPoint3 = pointTab.query("point_code = '" + taskObj.getString("point_code3") + "'").uniqueResult(0); - //提前更新这列货位状态,方便生成往这列的任务 - jsonPoint3.put("point_status", "3"); - jsonPoint3.put("material_id", taskObj.getString("material_id")); - pointTab.update(jsonPoint3); - //释放相关货位 - JSONObject point = new JSONObject(); - point.put("lock_type", "1"); - point.put("task_id", ""); - pointTab.update(point, "task_id = '" + taskObj.getString("task_id") + "'"); - - - //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1) - String point_code = taskObj.getString("point_code3"); - String newPoint = point_code.substring(0, 4) + "1" + point_code.substring(4, 9); - return newPoint; - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HkxSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HkxSendMaterialTask.java deleted file mode 100644 index 3848674..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HkxSendMaterialTask.java +++ /dev/null @@ -1,263 +0,0 @@ -package org.nl.wms.sch.tasks.sendMaterial; - -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; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.common.utils.SecurityUtils; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.util.IdUtil; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - - -/** - * 豪凯自动线线送料任务服务 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class HkxSendMaterialTask extends AbstractAcsTask { - - private final String THIS_CLASS = HkxSendMaterialTask.class.getName(); - - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject task, String status) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - - String task_id = task.getString("task_id"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - - //任务取消 - if (StrUtil.equals(status, "0")) { - // 取消删除任务 - if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { - throw new BadRequestException("已完成不能取消!"); - } - String point_code2 = taskObj.getString("point_code2"); - if (ObjectUtil.isEmpty(point_code2)) { - JSONObject endPoint = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - endPoint.put("lock_type", "1"); - pointTab.update(endPoint); - } - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("remark", "已取消"); - taskTab.update(taskObj); - } - - if ("1".equals(status)) { - // 更新任务状态为执行中 - taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskObj.put("car_no", taskObj.getString("car_no")); - taskTab.update(taskObj); - } - - if (StrUtil.equals(status, "2")) { - // 更改任务状态为完成 - taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - - String point_code2 = taskObj.getString("point_code2"); - JSONObject point2Obj = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - JSONObject requestObj = task.getJSONObject("request_param"); - //工单标识 - String workorder_id = requestObj.getString("material_info_id"); - //生产工单表【PDM_BD_WorkOrder】 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - JSONObject workorderObj = workOrderTab.query("workorder_id", workorder_id).uniqueResult(0); - - //区域出入表【st_ivt_regionIO】 - WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); - JSONObject regionIoObj = new JSONObject(); - regionIoObj.put("iostorinv_id", IdUtil.getLongId()); - regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); - regionIoObj.put("buss_date", DateUtil.today()); - regionIoObj.put("io_type", "1"); - regionIoObj.put("region_id", point2Obj.getString("region_id")); - regionIoObj.put("region_code", point2Obj.getString("region_code")); - regionIoObj.put("region_name", point2Obj.getString("region_name")); - regionIoObj.put("material_id", taskObj.getString("material_id")); - regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); - regionIoObj.put("qty", requestObj.getString("qty")); - regionIoObj.put("bill_status", "3"); - regionIoObj.put("start_point_code", taskObj.getString("point_code1")); - regionIoObj.put("end_point_code", taskObj.getString("point_code3")); - regionIoObj.put("create_mode", "2"); - regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); - regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); - regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); - regionIoObj.put("create_time", DateUtil.now()); - regionIoTab.insert(regionIoObj); - - - //完成后入库 - //仓位库存表【ST_IVT_StructIvt】 - WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); - JSONObject ivtObj = new JSONObject(); - ivtObj.put("stockrecord_id", IdUtil.getLongId()); - ivtObj.put("point_id", point2Obj.getString("point_id")); - ivtObj.put("point_code", point2Obj.getString("point_code")); - ivtObj.put("point_name", point2Obj.getString("point_name")); - ivtObj.put("region_id", point2Obj.getString("region_id")); - ivtObj.put("region_code", point2Obj.getString("region_code")); - ivtObj.put("region_name", point2Obj.getString("region_name")); - ivtObj.put("instorage_time", DateUtil.now()); - ivtObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); - ivtObj.put("ivt_qty", requestObj.getString("qty")); - ivtObj.put("standing_time", workorderObj.getString("standing_time")); - ivtObj.put("material_id", workorderObj.getString("material_id")); - ivtTab.insert(ivtObj); - - // 终点解锁 - point2Obj.put("lock_type", "1"); - point2Obj.put("point_status", "3"); - // 载具类型 - point2Obj.put("vehicle_type", taskObj.getString("vehicle_type")); - pointTab.update(point2Obj); - } - - } - - @Override - public void findNextPoint() { - /* - * 根据业务找对应的终点 - */ - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '2'").getResultJSONArray(0); - for (int i = 0; i < taskArr.size(); i++) { - JSONObject taskObj = taskArr.getJSONObject(i); - String vehicle_type = taskObj.getString("vehicle_type"); - JSONObject param1 = new JSONObject(); - param1.put("flag", "1"); - param1.put("region_code", "CPQYA01"); - param1.put("vehicle_type", "%" + vehicle_type + "%"); - //1、查找库区类是否有响应的载具类型和对应的物料 - JSONObject endPoint = WQL.getWO("QSCH_hkxSendMaterial_01").addParamMap(param1).process().uniqueResult(0); - if (ObjectUtil.isEmpty(endPoint)) { - taskObj.put("remark", "成品区无可用货位!"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } else { - taskObj.put("update_time", DateUtil.now()); - taskObj.put("point_code2", endPoint.getString("point_code")); - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskTab.update(taskObj); - - //锁住终点 - endPoint.put("task_id", taskObj.getString("task_id")); - endPoint.put("lock_type", "2"); - pointTab.update(endPoint); - } - - - } - } - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList acsTaskArr = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - AcsTaskDto dto = AcsTaskDto.builder() - .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_code3")) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - acsTaskArr.add(dto); - } - return acsTaskArr; - } - - @Override - public String createTask(JSONObject whereJson) { - String point_code1 = whereJson.getString("point_code1"); - String vehicle_type = whereJson.getString("vehicle_type"); - String vehicle_code = whereJson.getString("vehicle_code"); - String qty = whereJson.getString("qty"); - - - //任务表【SCH_BASE_Task】 - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - //判断当前点是否有未完成的任务 - JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); - - //生产工单表【PDM_BD_WorkOrder】 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - //点位基础表【SCH_BASE_Point】 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); - String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code"); - - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); - - SchTaskDto dto = SchTaskDto.builder() - .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("task_type") - .task_name("豪凯线满料") - .material_qty(qty) - .task_status(TaskStatusEnum.SURE_START.getCode()) - .point_code1(point_code1) - .vehicle_code(vehicle_code) - .material_info_id(workOrderObj.getLong("workorder_id")) - .material_id(workOrderObj.getLong("material_id")) - .vehicle_type(vehicle_type) - .handle_class(THIS_CLASS) - .create_time(DateUtil.now()) - .request_param(whereJson.toJSONString()) - .build(); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - - //创建好立即下发 - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - @Override - public void forceFinish(String task_id) { - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj, "2"); - } - - - @Override - public void cancel(String task_id) { - - } -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/YqxSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/YqxSendMaterialTask.java deleted file mode 100644 index e71d70a..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/YqxSendMaterialTask.java +++ /dev/null @@ -1,263 +0,0 @@ -package org.nl.wms.sch.tasks.sendMaterial; - -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; -import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.common.utils.SecurityUtils; -import org.nl.modules.system.util.CodeUtil; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.modules.wql.util.SpringContextHolder; -import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; -import org.nl.wms.sch.service.PointService; -import org.nl.wms.sch.service.dto.PointDto; -import org.nl.wms.sch.tasks.AcsTaskDto; -import org.nl.wms.sch.tasks.RegionTypeEnum; -import org.nl.wms.util.IdUtil; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - - -/** - * 油漆线送物料 - */ -@Service -@RequiredArgsConstructor -@Slf4j -public class YqxSendMaterialTask extends AbstractAcsTask { - private final String THIS_CLASS = YqxSendMaterialTask.class.getName(); - - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateTaskStatus(JSONObject taskObj, String status) { - /** - *改变任务状态 - **/ - String task_id = taskObj.getString("task_id"); - WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); - //点位基础表【SCH_BASE_Point】 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); - JSONObject jsonTask = taskTab.query("task_id='" + task_id + "'").uniqueResult(0); - - if (StrUtil.equals(status, "0")) { - //取消任务,释放相关点位的锁 - String point_code1 = jsonTask.getString("point_code1"); - String point_code2 = jsonTask.getString("point_code1"); - JSONObject param = new JSONObject(); - param.put("lock_type", "1"); - param.put("task_id", ""); - pointTab.update(param, "point_code = '" + point_code1 + "'"); - pointTab.update(param, "point_code = '" + point_code2 + "'"); - - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("remark", "已取消"); - taskTab.update(jsonTask); - } - - if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { - //更新任务状态为执行中 - jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - jsonTask.put("update_time", DateUtil.now()); - jsonTask.put("car_no", taskObj.getString("car_no")); - taskTab.update(jsonTask); - } - - if (TaskStatusEnum.FINISHED.getCode().equals(status)) { - // 更新任务状态为完成 - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("taskfinish_mode", taskObj.getString("taskfinish_mode")); - jsonTask.put("update_time", DateUtil.now()); - jsonTask.put("remark", "任务执行完成"); - taskTab.update(jsonTask); - - - //取消任务,释放相关点位的锁 - String point_code1 = jsonTask.getString("point_code1"); - String point_code2 = jsonTask.getString("point_code1"); - JSONObject param = new JSONObject(); - param.put("lock_type", "1"); - param.put("task_id", ""); - - pointTab.update(param, "point_code = '" + point_code1 + "'"); - - param.put("point_status", "3"); - pointTab.update(param, "point_code = '" + point_code2 + "'"); - } - - } - - @Override - public void findNextPoint() { - String task_status = TaskStatusEnum.SURE_START.getCode(); - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - //点位基础表【SCH_BASE_Point】 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); - JSONArray taskArry = taskTab.query("task_status='" + task_status + "' AND handle_class='" + THIS_CLASS + "' AND is_delete='0' ").getResultJSONArray(0); - for (int i = 0; i < taskArry.size(); i++) { - JSONObject taskObj = taskArry.getJSONObject(i); - String task_id = taskObj.getString("task_id"); - - JSONObject param = new JSONObject(); - param.put("flag", "1"); - JSONObject endPoint = WQL.getWO("QSCH_yqxSendMaterial_01").addParamMap(param).process().uniqueResult(0); - if (ObjectUtil.isEmpty(endPoint)) { - taskObj.put("remark", "电梯无可用点"); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } else { - //锁住点位 - endPoint.put("lock_type", "2"); - endPoint.put("task_id", task_id); - pointTab.update(endPoint); - - //修改任务状态 - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); - taskObj.put("update_optname", SecurityUtils.getCurrentNickName()); - taskObj.put("update_time", DateUtil.now()); - taskTab.update(taskObj); - } - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public String createTask(JSONObject whereJson) { - String point_code1 = whereJson.getString("point_code1"); - String vehicle_type = whereJson.getString("vehicle_type"); - String vehicle_code = whereJson.getString("vehicle_code"); - String qty = whereJson.getString("qty"); - - //生产工单表【PDM_BD_WorkOrder】 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - //点位基础表【SCH_BASE_Point】 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); - - //任务表【SCH_BASE_Task】 - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - //判断当前点是否有未完成的任务 - JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); - - - String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code"); - - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); - - SchTaskDto dto = SchTaskDto.builder() - .task_id(IdUtil.getLongId()) - .task_code(CodeUtil.getNewCode("TASK_CODE")) - .task_type("task_type") - .task_name("油漆线满料") - .task_status(TaskStatusEnum.SURE_START.getCode()) - .point_code1(point_code1) - .vehicle_code(vehicle_code) - .material_info_id(workOrderObj.getLong("workorder_id")) - .material_id(workOrderObj.getLong("material_id")) - .vehicle_type(vehicle_type) - .handle_class(THIS_CLASS) - .material_qty(qty) - .create_time(DateUtil.now()) - .request_param(whereJson.toJSONString()) - .build(); - //任务表【SCH_BASE_Task】 - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - taskTab.insert(json); - - //创建好立即下发 - this.immediateNotifyAcs(); - return String.valueOf(dto.getTask_id()); - } - - - @Override - public void forceFinish(String task_id) { - JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); - this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); - } - - @Override - public void cancel(String task_id) { - - } - - @Transactional(rollbackFor = Exception.class) - public JSONObject findEndPoint(JSONObject json) { - String point_code1 = json.getString("point_code1"); - - WQLObject regionTab = WQLObject.getWQLObject("SCH_BASE_Region"); - - // 根据起点判断是什么区域 然后要入到什么区 - PointDto startDto = SpringContextHolder.getBean(PointService.class).findByCode(point_code1); - if (ObjectUtil.isEmpty(startDto)) throw new BadRequestException("起点点位不存在"); - JSONObject jsonStartRegion = regionTab.query("region_id = '" + startDto.getRegion_id() + "'").uniqueResult(0); - - /* - * 物料入库业务:目前只有2个业务,如果区域不正确则报错 - * 1.共挤线 --> 养生区A - * 2.豪凯线 --> 成品区 - */ - String point_code2 = ""; - if (StrUtil.equals(jsonStartRegion.getString("region_code"), RegionTypeEnum.GJQY.getCode())) { - JSONObject map = new JSONObject(); - map.put("flag", "2"); - map.put("region_code", RegionTypeEnum.YSQA.getCode()); - JSONObject jsonEndPoint = WQL.getWO("ST_REGION_IN_01").addParamMap(map).process().uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonEndPoint)) throw new BadRequestException("仓位不足"); - point_code2 = jsonEndPoint.getString("point_code"); - } else if (StrUtil.equals(jsonStartRegion.getString("region_code"), RegionTypeEnum.HKQY.getCode())) { - JSONObject map = new JSONObject(); - map.put("flag", "2"); - map.put("region_code", RegionTypeEnum.CPQYA.getCode()); - JSONObject jsonEndPoint = WQL.getWO("ST_REGION_IN_01").addParamMap(map).process().uniqueResult(0); - - if (ObjectUtil.isEmpty(jsonEndPoint)) throw new BadRequestException("仓位不足"); - point_code2 = jsonEndPoint.getString("point_code"); - } - - JSONObject resuft = new JSONObject(); - resuft.put("point_code2", point_code2); - return resuft; - } - - @Override - public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ - JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); - - ArrayList acsTaskArr = new ArrayList<>(); - for (int i = 0; i < arr.size(); i++) { - JSONObject json = arr.getJSONObject(i); - AcsTaskDto dto = AcsTaskDto.builder() - .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_code3")) - .vehicle_code(json.getString("vehicle_code")) - .vehicle_type(json.getString("vehicle_type")) - .priority(json.getString("priority")) - .remark(json.getString("remark")) - .build(); - acsTaskArr.add(dto); - } - return acsTaskArr; - } - -} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_gjxSendMaterial_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_gjxSendMaterial_01.wql deleted file mode 100644 index e968122..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_gjxSendMaterial_01.wql +++ /dev/null @@ -1,101 +0,0 @@ -[交易说明] - 交易名: 共挤线满料请求 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.region_code TYPEAS s_string - 输入.material_id TYPEAS s_string - 输入.vehicle_type TYPEAS s_string - - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - QUERY - SELECT - p.point_id, - p.point_code, - p.point_name, - p.block_num, - p.row_num, - p.col_num - FROM - SCH_BASE_Point p - where - p.is_used = '1' - AND is_delete = '0' - AND lock_type = '1' - AND point_status = '3' - and row_num>1 - OPTION 输入.material_id <> "" - p.material_id = 输入.material_id - ENDOPTION - OPTION 输入.region_code <> "" - p.region_code = 输入.region_code - ENDOPTION - OPTION 输入.vehicle_type <> "" - p.can_vehicle_type like 输入.vehicle_type - ENDOPTION - ORDER BY block_num,col_num,row_num - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "2" - QUERY - SELECT - block_num, - col_num, - COUNT(*) AS sum - FROM - SCH_BASE_Point p - WHERE - p.is_delete = '0' - AND is_used = '1' - AND region_code = 'YSQA01' - AND point_status = '1' - AND lock_type = '1' - AND ( row_num = 1 OR row_num ) - OPTION 输入.vehicle_type <> "" - p.can_vehicle_type like 输入.vehicle_type - ENDOPTION - GROUP BY block_num,col_num - HAVING sum = 9 - ORDER BY block_num,col_num - ENDSELECT - ENDQUERY - ENDIF - - - diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_hkxSendMaterial_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_hkxSendMaterial_01.wql deleted file mode 100644 index 04707a7..0000000 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_hkxSendMaterial_01.wql +++ /dev/null @@ -1,69 +0,0 @@ -[交易说明] - 交易名: 豪凯线送料请求 - 所属模块: - 功能简述: - 版权所有: - 表引用: - 版本经历: - -[数据库] - --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 - -[IO定义] - ################################################# - ## 表字段对应输入参数 - ################################################# - 输入.flag TYPEAS s_string - 输入.region_code TYPEAS s_string - 输入.material_id TYPEAS s_string - 输入.vehicle_type TYPEAS s_string - - -[临时表] - --这边列出来的临时表就会在运行期动态创建 - -[临时变量] - --所有中间过程变量均可在此处定义 - -[业务过程] - - ########################################## - # 1、输入输出检查 # - ########################################## - - - ########################################## - # 2、主过程前处理 # - ########################################## - - - ########################################## - # 3、业务主过程 # - ########################################## - - IF 输入.flag = "1" - QUERY - SELECT - p.point_id, - p.point_code, - p.point_name - FROM - SCH_BASE_Point p - WHERE - lock_type = '1' - AND is_used = '1' - AND is_delete = '0' - AND point_status = '1' - OPTION 输入.vehicle_type <> "" - p.can_vehicle_type like 输入.vehicle_type - ENDOPTION - OPTION 输入.region_code <> "" - p.region_code = 输入.region_code - ENDOPTION - ORDER BY row_num,col_num,layer_num - ENDSELECT - ENDQUERY - ENDIF - - - diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/bill/service/impl/RegionIoServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/bill/service/impl/RegionIoServiceImpl.java index 8a910fc..dcbd890 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/bill/service/impl/RegionIoServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/bill/service/impl/RegionIoServiceImpl.java @@ -1,32 +1,26 @@ package org.nl.wms.st.bill.service.impl; -import com.alibaba.fastjson.JSON; -import lombok.RequiredArgsConstructor; -import org.nl.modules.common.exception.BadRequestException; -import org.nl.modules.wql.WQL; -import org.nl.modules.wql.util.SpringContextHolder; -import org.nl.wms.sch.service.RegionService; -import org.nl.wms.sch.tasks.cpOut.CpOutTask; -import org.nl.wms.sch.tasks.sendMaterial.HkxSendMaterialTask; -import org.nl.wms.st.bill.service.RegionIoService; -import org.nl.wms.st.bill.service.dto.RegionIoDto; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import org.springframework.data.domain.Pageable; -import java.util.List; -import java.util.Map; - import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.common.utils.SecurityUtils; -import org.nl.modules.wql.core.bean.ResultBean; +import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.WqlUtil; -import lombok.extern.slf4j.Slf4j; -import cn.hutool.core.util.ObjectUtil; +import org.nl.wms.st.bill.service.RegionIoService; +import org.nl.wms.st.bill.service.dto.RegionIoDto; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; /** * @description 服务实现 @@ -147,21 +141,6 @@ public class RegionIoServiceImpl implements RegionIoService { */ @Override public void makeTask(JSONArray dto) { - WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); - for (int i = 0; i < dto.size(); i++) { - JSONObject dtoJSONObject = dto.getJSONObject(i); - JSONObject iostorinv = regionIoTab.query("iostorinv_id = '" + dtoJSONObject.getString("iostorinv_id") + "'").uniqueResult(0); - if (ObjectUtil.equal(iostorinv.getString("bill_status"), "3")) - throw new BadRequestException("没有单据或者已出库"); - JSONObject param = new JSONObject(); - param.put("point_code1", dtoJSONObject.getString("start_point_code")); - param.put("vehicle_code", dtoJSONObject.getString("vehicle_code")); -// param.put("vehicle_type", vehicle_type); - param.put("iostorinv_id", dtoJSONObject.getString("iostorinv_id")); - CpOutTask taskBean = SpringContextHolder.getBean(CpOutTask.class); - String task_id = taskBean.createTask(param); - } - } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/rest/StructivtController.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/rest/StructivtController.java index d952baf..5a6f01c 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/rest/StructivtController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/rest/StructivtController.java @@ -1,6 +1,7 @@ package org.nl.wms.st.structivt.rest; import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import org.nl.wms.st.structivt.service.StructivtService; import org.nl.wms.st.structivt.service.dto.StructivtDto; import org.springframework.data.domain.Pageable; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/service/StructivtService.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/service/StructivtService.java index de68ef2..9fc0db3 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/service/StructivtService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/service/StructivtService.java @@ -1,8 +1,10 @@ package org.nl.wms.st.structivt.service; import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import org.nl.wms.st.structivt.service.dto.StructivtDto; import org.springframework.data.domain.Pageable; + import java.util.Map; import java.util.List; import java.io.IOException; @@ -17,14 +19,16 @@ public interface StructivtService { /** * 查询数据分页 + * * @param whereJson 条件 - * @param page 分页参数 - * @return Map + * @param page 分页参数 + * @return Map */ - Map queryAll(Map whereJson, Pageable page); + Map queryAll(Map whereJson, Pageable page); /** * 查询所有数据不分页 + * * @param whereJson 条件参数 * @return List */ @@ -32,6 +36,7 @@ public interface StructivtService { /** * 根据ID查询 + * * @param stockrecord_id ID * @return Structivt */ @@ -39,6 +44,7 @@ public interface StructivtService { /** * 根据编码查询 + * * @param code code * @return Structivt */ @@ -47,30 +53,35 @@ public interface StructivtService { /** * 创建 + * * @param dto / */ void create(StructivtDto dto); /** * 编辑 + * * @param dto / */ void update(StructivtDto dto); /** * 多选删除 + * * @param ids / */ void deleteAll(Long[] ids); /** * 出库 + * * @param jsonArray */ void outInventory(JSONArray jsonArray); /** * 批量修改 + * * @param datas */ void batchEdit(JSONArray datas); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/service/impl/StructivtServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/service/impl/StructivtServiceImpl.java index 32c17e7..fe3fe39 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/service/impl/StructivtServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/service/impl/StructivtServiceImpl.java @@ -45,24 +45,13 @@ public class StructivtServiceImpl implements StructivtService { public Map queryAll(Map whereJson, Pageable page){ JSONObject map = new JSONObject(); map.put("flag", "1"); - map.put("region_code", "(" + whereJson.get("region_code") + ")"); - if (!ObjectUtil.isNull(whereJson.get("point_code"))) { - map.put("point_code", "%" + whereJson.get("point_code") + "%"); - } - if (!ObjectUtil.isNull(whereJson.get("material_code"))) { - map.put("material_code", "%" + whereJson.get("material_code") + "%"); - } - map.put("layer_num", whereJson.get("layer_num")); - map.put("row_num", whereJson.get("row_num")); - map.put("col_num", whereJson.get("col_num")); - map.put("is_used", whereJson.get("is_used")); - map.put("lock_type", whereJson.get("lock_type")); - map.put("point_status", whereJson.get("point_status")); - map.put("vehicle_type", whereJson.get("vehicle_type")); + map.put("region_name", whereJson.get("region_name")); + map.put("point_name", whereJson.get("point_name")); + map.put("vehicle_code", whereJson.get("vehicle_code")); map.put("begin_time", whereJson.get("begin_time")); map.put("end_time", whereJson.get("end_time")); - JSONObject json = WQL.getWO("ST_IVT_STRUCTIVT").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "point_code asc"); - JSONArray content = json.getJSONArray("content"); + return WQL.getWO("ST_IVT_STRUCTIVT").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "instorage_time DESC"); + /*JSONArray content = json.getJSONArray("content"); JSONArray res = new JSONArray(); for (int i = 0; i < content.size(); i++) { JSONObject cppEntry = content.getJSONObject(i); @@ -87,7 +76,7 @@ public class StructivtServiceImpl implements StructivtService { res.add(cppEntry); } json.put("content", res); - return json; + return json;*/ } @Override @@ -350,5 +339,4 @@ public class StructivtServiceImpl implements StructivtService { } } } - } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/wql/ST_IVT_STRUCTIVT.wql b/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/wql/ST_IVT_STRUCTIVT.wql index 057286b..8b6eace 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/wql/ST_IVT_STRUCTIVT.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/structivt/wql/ST_IVT_STRUCTIVT.wql @@ -13,19 +13,13 @@ ################################################# ## 表字段对应输入参数 ################################################# - 输入.flag TYPEAS s_string - 输入.io_region TYPEAS f_string - 输入.region_code TYPEAS f_string - 输入.begin_time TYPEAS s_string - 输入.end_time TYPEAS s_string - 输入.bill_code TYPEAS s_string - 输入.bill_status TYPEAS s_string - 输入.io_type TYPEAS s_string - 输入.lock_type TYPEAS s_string - 输入.material_code TYPEAS s_string - 输入.point_status TYPEAS s_string - 输入.vehicle_type TYPEAS s_string - 输入.is_used TYPEAS s_string + 输入.flag TYPEAS s_string + 输入.point_name TYPEAS s_string + 输入.region_name TYPEAS s_string + 输入.vehicle_code TYPEAS s_string + 输入.begin_time TYPEAS s_string + 输入.end_time TYPEAS s_string + 输入.vehicle_id TYPEAS s_string [临时表] @@ -52,53 +46,38 @@ IF 输入.flag = "1" PAGEQUERY SELECT - point.*, - str.stockrecord_id, - str.pcsn, - str.ivt_qty, - str.qty_unit_id, - str.instorage_time, - str.standing_time + ivt.stockrecord_id, + region.region_name, + point.point_name, + vehicle.vehicle_id, + vehicle.vehicle_code, + SUM( vm.material_qty ) AS qty, + ivt.instorage_time FROM - sch_base_point point - LEFT JOIN st_ivt_structivt str ON str.point_id = point.point_id + st_ivt_structivt ivt + LEFT JOIN sch_base_point point ON ivt.point_id = point.point_id + LEFT JOIN sch_base_region region ON point.region_id = region.region_id + LEFT JOIN md_pb_vehicle vehicle ON point.vehicle_code = vehicle.vehicle_code + LEFT JOIN st_ivt_vehicle_material vm ON vehicle.vehicle_id = vm.vehicle_id WHERE - point.region_code IN 输入.region_code - OPTION 输入.point_code <> "" - point.point_code LIKE 输入.point_code - ENDOPTION - OPTION 输入.point_status <> "" - point.point_status = 输入.point_status - ENDOPTION - OPTION 输入.vehicle_type <> "" - point.vehicle_type = 输入.vehicle_type - ENDOPTION - OPTION 输入.material_code <> "" - point.material_id IN ( - SELECT material_code FROM md_me_materialbase WHERE material_code LIKE 输入.material_code - ) - ENDOPTION - OPTION 输入.layer_num <> "" - point.layer_num = 输入.layer_num - ENDOPTION - OPTION 输入.row_num <> "" - point.row_num = 输入.row_num - ENDOPTION - OPTION 输入.col_num <> "" - point.col_num = 输入.col_num - ENDOPTION - OPTION 输入.lock_type <> "" - point.lock_type = 输入.lock_type - ENDOPTION - OPTION 输入.is_used <> "" - point.is_used = 输入.is_used - ENDOPTION - OPTION 输入.begin_time <> "" - str.instorage_time >= 输入.begin_time - ENDOPTION - OPTION 输入.end_time <> "" - str.instorage_time <= 输入.end_time + 1 = 1 + OPTION 输入.region_name <> "" + region.region_name LIKE CONCAT( '%', 输入.region_name, '%' ) + ENDOPTION + OPTION 输入.point_name <> "" + point.point_name LIKE CONCAT( '%', 输入.point_name, '%' ) ENDOPTION + OPTION 输入.vehicle_code <> "" + vehicle.vehicle_code = 输入.vehicle_code + ENDOPTION + OPTION 输入.begin_time <> "" + ivt.instorage_time >= 输入.begin_time + ENDOPTION + OPTION 输入.end_time <> "" + ivt.instorage_time <= 输入.end_time + ENDOPTION + GROUP BY + ivt.stockrecord_id ENDSELECT ENDPAGEQUERY ENDIF \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/vm/rest/VMController.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/vm/rest/VMController.java new file mode 100644 index 0000000..1fa5d8b --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/vm/rest/VMController.java @@ -0,0 +1,44 @@ +package org.nl.wms.st.vm.rest; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.wms.st.vm.service.VMService; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +/** + * @author 张江玮 + * @date 2022/10/31 16:26 + */ +@RestController +@RequiredArgsConstructor +@Api(tags = "组盘管理") +@RequestMapping("/api/vm") +@Slf4j +public class VMController { + + private final VMService vmService; + + @GetMapping + @Log("查询组盘信息") + @ApiOperation("查询组盘信息") + public ResponseEntity query(@RequestParam Map param, Pageable page) { + return new ResponseEntity<>(vmService.query(param, page), HttpStatus.OK); + } + + @PostMapping("/queryDetail") + @Log("查询组盘详情") + @ApiOperation("查询组盘详情") + public ResponseEntity queryDetail(@RequestBody JSONObject param) { + return new ResponseEntity<>(vmService.queryDetail(param), HttpStatus.OK); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/vm/service/VMService.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/vm/service/VMService.java new file mode 100644 index 0000000..f46e42c --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/vm/service/VMService.java @@ -0,0 +1,31 @@ +package org.nl.wms.st.vm.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.springframework.data.domain.Pageable; + +import java.util.Map; + +/** + * @author 张江玮 + * @date 2022/10/31 16:36 + */ +public interface VMService { + + /** + * 查询组盘信息 + * + * @param param String search 载具编码 + * @param page 分页 + * @return 组盘信息 + */ + JSONObject query(Map param, Pageable page); + + /** + * 查询组盘详情 + * + * @param param String vehicle_id 载具标识 + * @return 所有组盘信息 + */ + JSONArray queryDetail(JSONObject param); +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/vm/service/impl/VMServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/vm/service/impl/VMServiceImpl.java new file mode 100644 index 0000000..41db170 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/vm/service/impl/VMServiceImpl.java @@ -0,0 +1,52 @@ +package org.nl.wms.st.vm.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.wql.WQL; +import org.nl.modules.wql.util.WqlUtil; +import org.nl.wms.st.vm.service.VMService; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * @author 张江玮 + * @date 2022/10/31 16:39 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class VMServiceImpl implements VMService { + + + /** + * 查询组盘信息 + * + * @param param String search 载具编码 + * @param page 分页 + * @return 组盘信息 + */ + @Override + public JSONObject query(Map param, Pageable page) { + param.put("flag", "1"); + return WQL + .getWO("ST_IVT_VEHICLE_MATERIAL") + .addParamMap(param) + .pageQuery(WqlUtil.getHttpContext(page), "create_time DESC"); + } + + /** + * 查询组盘详情 + * + * @param param String vehicle_id 载具标识 + * @return 所有组盘信息 + */ + @Override + public JSONArray queryDetail(JSONObject param) { + param.put("flag", "2"); + return WQL.getWO("ST_IVT_VEHICLE_MATERIAL").addParamMap(param).process().getResultJSONArray(0); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/vm/wql/ST_IVT_VEHICLE_MATERIAL.wql b/lms/nladmin-system/src/main/java/org/nl/wms/st/vm/wql/ST_IVT_VEHICLE_MATERIAL.wql new file mode 100644 index 0000000..3796f96 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/vm/wql/ST_IVT_VEHICLE_MATERIAL.wql @@ -0,0 +1,81 @@ +[交易说明] + 交易名: 仓位库存 + 所属模块: + 功能简述: + 版权所有: + 表引用: + 版本经历: + +[数据库] + --指定数据库,为空采用默认值,默认为db.properties中列出的第一个库 + +[IO定义] + ################################################# + ## 表字段对应输入参数 + ################################################# + 输入.flag TYPEAS s_string + 输入.vehicle_code TYPEAS s_string + 输入.vehicle_id TYPEAS s_string + +[临时表] + --这边列出来的临时表就会在运行期动态创建 + +[临时变量] + --所有中间过程变量均可在此处定义 + +[业务过程] + + ########################################## + # 1、输入输出检查 # + ########################################## + + + ########################################## + # 2、主过程前处理 # + ########################################## + + + ########################################## + # 3、业务主过程 # + ########################################## + + IF 输入.flag = "1" + PAGEQUERY + SELECT + vm.vm_id, + vehicle.vehicle_id, + vehicle.vehicle_code, + SUM( vm.material_qty ) AS qty, + vm.create_name, + vm.create_time + FROM + st_ivt_vehicle_material vm + LEFT JOIN md_pb_vehicle vehicle ON vm.vehicle_id = vehicle.vehicle_id + WHERE + 1 = 1 + OPTION 输入.vehicle_code <> "" + vehicle.vehicle_code LIKE CONCAT( '%', 输入.vehicle_code, '%' ) + ENDOPTION + GROUP BY + vm.vehicle_id + ENDSELECT + ENDPAGEQUERY + ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + material.material_id, + material.material_code, + material.material_name, + material.base_unit, + vm.material_qty, + vm.material_batch + FROM + st_ivt_vehicle_material vm + LEFT JOIN md_me_materialbase material ON vm.material_id = material.material_id + WHERE + vm.vehicle_id = 输入.vehicle_id + ENDSELECT + ENDQUERY + ENDIF \ No newline at end of file diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/util/CommonUtils.java b/lms/nladmin-system/src/main/java/org/nl/wms/util/CommonUtils.java new file mode 100644 index 0000000..6d522e5 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/wms/util/CommonUtils.java @@ -0,0 +1,45 @@ +package org.nl.wms.util; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONObject; +import org.nl.modules.common.utils.SecurityUtils; + +/** + * 公共工具类 + * @author 张江玮 + * @date 2022/11/03 8:45 + */ +public class CommonUtils { + + /** + * 添加公共字段 + * + * @param row 需要添加的行 + */ + public static void addCommonColum(JSONObject row) { + addCreateColum(row); + addUpdateColum(row); + } + + /** + * 添加创建字段 + * + * @param row 需要添加的行 + */ + public static void addCreateColum(JSONObject row) { + row.put("create_id", SecurityUtils.getCurrentUserId()); + row.put("create_name", SecurityUtils.getCurrentNickName()); + row.put("create_time", DateUtil.now()); + } + + /** + * 添加更新字段 + * + * @param row 需要添加的行 + */ + public static void addUpdateColum(JSONObject row) { + row.put("update_optid", SecurityUtils.getCurrentUserId()); + row.put("update_optname", SecurityUtils.getCurrentNickName()); + row.put("update_time", DateUtil.now()); + } +} diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/wms.xls b/lms/nladmin-system/src/main/java/org/nl/wms/wms.xls index 19d2354bfd85d7d85fa9f307756dd234e1738461..2d5f1ffc4fa11f38f681bed983c094e982aa1297 100644 GIT binary patch delta 62627 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 F{{Z(h?TG*Y diff --git a/lms/nladmin-ui/src/views/wms/basedata/material/index.vue b/lms/nladmin-ui/src/views/wms/basedata/material/index.vue index 3908729..02d4887 100644 --- a/lms/nladmin-ui/src/views/wms/basedata/material/index.vue +++ b/lms/nladmin-ui/src/views/wms/basedata/material/index.vue @@ -2,8 +2,30 @@
- - +
+ + + + + + +
+ + 物料类别: @@ -20,13 +42,12 @@ - 模糊查询: @@ -38,6 +59,7 @@ - - - - - - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -101,7 +146,7 @@ - + - + - + @@ -127,8 +172,8 @@ @@ -140,14 +185,17 @@ style="width: 100%;" @selection-change="crud.selectionChangeHandler" > - - - - - - - - + + + + + + + + + + + @@ -126,15 +175,37 @@ import udOperation from '@crud/UD.operation' import pagination from '@crud/Pagination' import { getLodop } from '@/assets/js/lodop/LodopFuncs' -const defaultForm = { num: 1, vehicle_id: null, vehicle_code: null, vehicle_name: null, one_code: null, two_code: null, rfid_code: null, vehicle_type: null, vehicle_width: null, vehicle_long: null, vehicle_height: null, overstruct_type: null, occupystruct_qty: null, ext_id: null, create_id: null, create_name: null, create_time: null, update_optid: null, update_optname: null, update_time: null } +const defaultForm = { + num: 1, + vehicle_id: null, + vehicle_code: null, + vehicle_name: null, + one_code: null, + two_code: null, + rfid_code: null, + vehicle_type: null, + vehicle_width: null, + vehicle_long: null, + vehicle_height: null, + overstruct_type: null, + occupystruct_qty: null, + ext_id: null, + create_id: null, + create_name: null, + create_time: null, + update_optid: null, + update_optname: null, + update_time: null, + vehicle_status: '1' +} export default { name: 'Vehicle', - dicts:['vehicle_type'], + dicts: ['vehicle_type', 'vehicle_status'], components: { pagination, crudOperation, rrOperation, udOperation }, mixins: [presenter(), header(), form(defaultForm), crud()], cruds() { return CRUD({ - title: '载具维护', + title: '载具', url: 'api/vehicle', idField: 'vehicle_id', sort: 'vehicle_id,desc', @@ -142,7 +213,7 @@ export default { optShow: { add: true, edit: false, - del: false, + del: true, download: false, reset: true } @@ -150,8 +221,7 @@ export default { }, data() { return { - permission: { - }, + permission: {}, rules: { vehicle_code: [ { required: true, message: '载具编码不能为空', trigger: 'blur' } @@ -164,8 +234,12 @@ export default { ], occupystruct_qty: [ { required: true, message: '占仓位数不能为空', trigger: 'blur' } + ], + vehicle_status: [ + { required: true, message: '托盘状态不能为空', trigger: 'blur' } ] - }} + } + } }, methods: { // 钩子:在获取表格数据之前执行,false 则代表不获取数据 diff --git a/lms/nladmin-ui/src/views/wms/sch/point/index.vue b/lms/nladmin-ui/src/views/wms/sch/point/index.vue index cfbce62..d0bc51f 100644 --- a/lms/nladmin-ui/src/views/wms/sch/point/index.vue +++ b/lms/nladmin-ui/src/views/wms/sch/point/index.vue @@ -15,7 +15,7 @@ v-model="query.name" clearable size="mini" - placeholder="编码名称" + placeholder="点位编码或名称" @keyup.enter.native="crud.toQuery" /> @@ -69,7 +69,7 @@ /> - + - + - + - + +
- +
@@ -191,7 +192,13 @@ > - + + + + + + + - - - - - + + + + - - - - - - + - + @@ -281,28 +282,28 @@ style="width: 100%;" @selection-change="crud.selectionChangeHandler" > - - - - - - - - + + + + + + + + - - + + - - + + - +
@@ -333,7 +334,25 @@ import crudOperation from '@crud/CRUD.operation' import udOperation from '@crud/UD.operation' import pagination from '@crud/Pagination' -const defaultForm = { point_id: null, point_code: null, point_name: null, point_type: null, point_status: null, lock_type: '1', vehicle_code: null, source_id: null, remark: null, is_used: null, is_delete: null, create_id: null, create_name: null, create_time: null, update_optid: null, update_optname: null, update_time: null } +const defaultForm = { + point_id: null, + point_code: null, + point_name: null, + point_type: null, + point_status: null, + lock_type: '1', + vehicle_code: null, + source_id: null, + remark: null, + is_used: null, + is_delete: null, + create_id: null, + create_name: null, + create_time: null, + update_optid: null, + update_optname: null, + update_time: null +} export default { name: 'Point', dicts: ['vehicle_type', 'd_lock_type', 'SCH_TASK_TYPE_DTL', 'vehicle_type'], @@ -346,7 +365,7 @@ export default { idField: 'point_id', optShow: { add: true, - edit: true, + edit: false, del: true, download: false, reset: true diff --git a/lms/nladmin-ui/src/views/wms/sch/region/index.vue b/lms/nladmin-ui/src/views/wms/sch/region/index.vue index 34e4c3d..0d4f204 100644 --- a/lms/nladmin-ui/src/views/wms/sch/region/index.vue +++ b/lms/nladmin-ui/src/views/wms/sch/region/index.vue @@ -43,8 +43,8 @@ @@ -58,13 +58,13 @@ > - - - - - - - + + + + + + +