From 6326ec2e3fa82f3d7a900e68e4a587ea88fa8091 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=BC=A0=E6=B1=9F=E7=8E=AE?=
 <zhangjiangwei2000@outlook.com>
Date: Tue, 8 Nov 2022 20:41:58 +0800
Subject: [PATCH] Vesion 1.0

---
 .../org/nl/wms/pda/rest/PdaController.java    |  32 +++-
 .../org/nl/wms/pda/service/PdaService.java    |   8 +-
 .../wms/pda/service/impl/PdaServiceImpl.java  | 165 +++++++++++++++++-
 .../src/main/java/org/nl/wms/pda/wql/PDA.wql  |  29 +++
 .../org/nl/wms/sch/task/CallMaterialTask.java |   4 +-
 5 files changed, 227 insertions(+), 11 deletions(-)

diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/rest/PdaController.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/rest/PdaController.java
index 444b54b..4d494ad 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/rest/PdaController.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/rest/PdaController.java
@@ -67,10 +67,10 @@ public class PdaController {
         return this.success();
     }
 
-    @PostMapping("/vmByVehicle")
+    @PostMapping("/vmByvehicle")
     @Log("查询载具及组盘信息")
     @ApiOperation("查询载具及组盘信息")
-    public ResponseEntity<JSONObject> vmByVehicle(@RequestBody JSONObject param) {
+    public ResponseEntity<JSONArray> vmByVehicle(@RequestBody JSONObject param) {
         return new ResponseEntity<>(pdaService.vmByVehicle(param.getString("vehicle_code")), HttpStatus.OK);
     }
 
@@ -83,6 +83,34 @@ public class PdaController {
         return this.success();
     }
 
+    @PostMapping("/queryMaterial")
+    @Log("查询物料")
+    @ApiOperation("查询物料")
+    public ResponseEntity<JSONArray> queryMaterial() {
+        return new ResponseEntity<>(pdaService.queryMaterial(), HttpStatus.OK);
+    }
+
+    @PostMapping("/queryInventory")
+    @Log("查询可出库信息")
+    @ApiOperation("查询可出库信息")
+    public ResponseEntity<JSONObject> queryInventory(@RequestBody JSONObject param) {
+        return new ResponseEntity<>(pdaService.queryInventory(param.getString("material_code"), param.getString("vehicle_code")), HttpStatus.OK);
+    }
+
+    @PostMapping("/task")
+    @Log("任务生成")
+    @ApiOperation("任务生成")
+    public ResponseEntity<JSONObject> task(@RequestBody JSONObject param) {
+        pdaService.task(
+                param.getString("type"),
+                param.getString("point_id"),
+                param.getString("start_point_id"),
+                param.getString("next_point_id")
+        );
+
+        return this.success();
+    }
+
     private ResponseEntity<JSONObject> success() {
         JSONObject result = new JSONObject();
         result.put("message", "操作成功");
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/service/PdaService.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/service/PdaService.java
index 4701cec..b5c3d96 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/service/PdaService.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/service/PdaService.java
@@ -19,7 +19,13 @@ public interface PdaService {
 
     void vm(String vehicleCode, JSONArray materials);
 
-    JSONObject vmByVehicle(String vehicleCode);
+    JSONArray vmByVehicle(String vehicleCode);
 
     void outbound(String vehicleCode, JSONArray materials);
+
+    JSONArray queryMaterial();
+
+    JSONObject queryInventory(String materialCode, String vehicleCode);
+
+    void task(String type, String pointId, String startPointId, String nextPointId);
 }
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/service/impl/PdaServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/service/impl/PdaServiceImpl.java
index bb664e6..48ab2f8 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/service/impl/PdaServiceImpl.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/service/impl/PdaServiceImpl.java
@@ -15,6 +15,12 @@ import org.nl.wms.pda.service.PdaService;
 import org.nl.wms.sch.base.point.LockType;
 import org.nl.wms.sch.base.point.PointStatus;
 import org.nl.wms.sch.base.point.PointType;
+import org.nl.wms.sch.base.region.RegionEnum;
+import org.nl.wms.sch.task.CallEmptyVehicleTask;
+import org.nl.wms.sch.task.CallMaterialTask;
+import org.nl.wms.sch.task.SendFullVehicleTask;
+import org.nl.wms.sch.task.SendResiduesMaterialTask;
+import org.nl.wms.sch.task.wql.SendEmptyVehicleTask;
 import org.nl.wms.util.CommonUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -28,6 +34,15 @@ import org.springframework.transaction.annotation.Transactional;
 @Slf4j
 public class PdaServiceImpl implements PdaService {
 
+    private final CallEmptyVehicleTask callEmptyVehicleTask;
+
+    private final SendFullVehicleTask sendFullVehicleTask;
+
+    private final CallMaterialTask callMaterialTask;
+
+    private final SendResiduesMaterialTask sendResiduesMaterialTask;
+
+    private final SendEmptyVehicleTask sendEmptyVehicleTask;
 
     @Override
     public JSONArray region() {
@@ -178,17 +193,13 @@ public class PdaServiceImpl implements PdaService {
     }
 
     @Override
-    public JSONObject vmByVehicle(String vehicleCode) {
-        JSONObject result = new JSONObject();
-        JSONArray detail = WQL
+    public JSONArray vmByVehicle(String vehicleCode) {
+        return WQL
                 .getWO("PDA")
                 .addParam("flag", "3")
                 .addParam("vehicle_code", vehicleCode)
                 .process()
                 .getResultJSONArray(0);
-        result.put("detail", detail);
-
-        return result;
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -234,4 +245,146 @@ public class PdaServiceImpl implements PdaService {
         CommonUtils.addUpdateColum(vehicle);
         vehicleTable.update(vehicle);
     }
+
+    @Override
+    public JSONArray queryMaterial() {
+        return WQL.getWO("PDA").addParam("flag", "4").process().getResultJSONArray(0);
+    }
+
+    @Override
+    public JSONObject queryInventory(String materialCode, String vehicleCode) {
+        JSONObject vehicle = WQLObject
+                .getWQLObject("md_pb_vehicle")
+                .query("vehicle_code = '" + vehicleCode + "'")
+                .uniqueResult(0);
+        if (ObjectUtil.isEmpty(vehicle)) {
+            throw new BadRequestException("该载具号不存在,请从组盘功能添加");
+        }
+        if (StrUtil.equals(vehicle.getString("vehicle_status"), VehicleStatus.EMPTY.getCode())) {
+            throw new BadRequestException("该载具为空载具");
+        }
+
+        JSONObject point = WQLObject
+                .getWQLObject("sch_base_point")
+                .query("vehicle_code = '" + vehicleCode + "'")
+                .uniqueResult(0);
+        if (ObjectUtil.isEmpty(point)) {
+            throw new BadRequestException("该载具不存在于点位上");
+        }
+        if (!StrUtil.equals(point.getString("region_id"), RegionEnum.ZC.getCode())) {
+            throw new BadRequestException("该载具不在暂存区");
+        }
+        if (StrUtil.equals(point.getString("is_used"), "0")) {
+            throw new BadRequestException("该载具所在点位已被禁用");
+        }
+
+        JSONObject result = new JSONObject();
+        result.put("point_id", point.getString("point_id"));
+        result.put("point_name", point.getString("point_name"));
+
+        JSONArray detail = WQL
+                .getWO("PDA")
+                .addParam("flag", "5")
+                .addParam("vehicle_id", vehicle.getString("vehicle_id"))
+                .process()
+                .getResultJSONArray(0);
+        result.put("detail", detail);
+
+        return result;
+    }
+
+    @Override
+    public void task(String type, String pointId, String startPointId, String nextPointId) {
+        switch (type) {
+            case "1":
+                JSONObject point = WQLObject.getWQLObject("sch_base_point")
+                        .query("point_id = " + pointId)
+                        .uniqueResult(0);
+                if (ObjectUtil.isEmpty(point)) {
+                    throw new BadRequestException("该点位不存在");
+                }
+                if (StrUtil.equals(point.getString("point_status"), PointStatus.HAS_VEHICLE.getCode())) {
+                    throw new BadRequestException("该点位上有载具");
+                }
+                if (!StrUtil.equals(point.getString("region_id"), RegionEnum.JL.getCode())) {
+                    throw new BadRequestException("只有接料区可以呼叫空载具");
+                }
+
+                JSONObject param = new JSONObject();
+                param.put("point_id", pointId);
+                callEmptyVehicleTask.createTask(param);
+                break;
+            case "2":
+                point = WQLObject.getWQLObject("sch_base_point")
+                        .query("point_id = " + pointId)
+                        .uniqueResult(0);
+                if (ObjectUtil.isEmpty(point)) {
+                    throw new BadRequestException("该点位不存在");
+                }
+                if (StrUtil.equals(point.getString("point_status"), PointStatus.EMPTY.getCode())) {
+                    throw new BadRequestException("该点位为空位");
+                }
+                if (StrUtil.equals(point.getString("region_id"), RegionEnum.ZC.getCode())) {
+                    throw new BadRequestException("暂存区不能生成入库任务");
+                }
+
+                JSONObject vehicle = WQLObject
+                        .getWQLObject("md_pb_vehicle")
+                        .query("vehicle_code = " + point.getString("vehicle_code"))
+                        .uniqueResult(0);
+                param = new JSONObject();
+                param.put("point_id", pointId);
+                if (StrUtil.equals(vehicle.getString("vehicle_status"), VehicleStatus.EMPTY.getCode())) {
+                    sendEmptyVehicleTask.createTask(param);
+                }
+                if (StrUtil.equals(vehicle.getString("vehicle_status"), VehicleStatus.HAS_MATERIAL.getCode())) {
+                    String regionId = point.getString("region_id");
+                    if (StrUtil.equals(regionId, RegionEnum.JL.getCode())) {
+                        sendFullVehicleTask.createTask(param);
+                    }
+                    if (StrUtil.equals(regionId, RegionEnum.JJ.getCode())) {
+                        sendResiduesMaterialTask.createTask(param);
+                    }
+                }
+                break;
+            case "3":
+                JSONObject startPoint = WQLObject
+                        .getWQLObject("sch_base_point")
+                        .query("point_id = " + startPointId)
+                        .uniqueResult(0);
+                if (ObjectUtil.isEmpty(startPoint)) {
+                    throw new BadRequestException("起点不存在");
+                }
+                if (StrUtil.equals(startPoint.getString("point_status"), PointStatus.EMPTY.getCode())) {
+                    throw new BadRequestException("起点为空位");
+                }
+
+                JSONObject startVehicle = WQLObject
+                        .getWQLObject("md_pb_vehicle")
+                        .query("vehicle_code = " + startPoint.getString("vehicle_code"))
+                        .uniqueResult(0);
+                if (StrUtil.equals(startVehicle.getString("vehicle_status"), VehicleStatus.EMPTY.getCode())) {
+                    throw new BadRequestException("起点上的载具为空载具");
+                }
+
+                JSONObject nextPoint = WQLObject
+                        .getWQLObject("sch_base_point")
+                        .query("point_id = " + nextPointId)
+                        .uniqueResult(0);
+                if (ObjectUtil.isEmpty(nextPoint)) {
+                    throw new BadRequestException("终点不存在");
+                }
+                if (StrUtil.equals(nextPoint.getString("point_status"), PointStatus.HAS_VEHICLE.getCode())) {
+                    throw new BadRequestException("终点有载具");
+                }
+                if (StrUtil.equals(nextPoint.getString("region_id"), RegionEnum.JJ.getCode())) {
+                    throw new BadRequestException("只有终点为交接区才能生成出库任务");
+                }
+
+                param = new JSONObject();
+                param.put("start_point_id", startPointId);
+                param.put("next_point_id", nextPointId);
+                callMaterialTask.createTask(param);
+        }
+    }
 }
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/wql/PDA.wql b/lms/nladmin-system/src/main/java/org/nl/wms/pda/wql/PDA.wql
index 5a67c5e..53302a9 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/wql/PDA.wql
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/wql/PDA.wql
@@ -16,6 +16,7 @@
     输入.flag                          TYPEAS s_string
     输入.region_id                     TYPEAS s_string
     输入.vehicle_code                  TYPEAS s_string
+    输入.vehicle_id                    TYPEAS s_string
 
 [临时表]
 	--这边列出来的临时表就会在运行期动态创建
@@ -61,6 +62,7 @@
             	sch_base_point
             WHERE
             	region_id = 输入.region_id
+            ENDSELECT
         ENDQUERY
     ENDIF
 
@@ -80,3 +82,30 @@
             ENDSELECT
         ENDQUERY
     ENDIF
+
+    IF 输入.flag = "4"
+        QUERY
+            SELECT
+                material_code,
+                material_name
+            FROM
+                md_me_materialbase
+            ENDSELECT
+        ENDQUERY
+    ENDIF
+
+    IF 输入.flag = "5"
+        QUERY
+            SELECT
+                material.material_code,
+            	material.material_name,
+            	vm.material_qty,
+            	vm.material_batch AS 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/sch/task/CallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/CallMaterialTask.java
index a8affe3..6cf62e2 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/CallMaterialTask.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/CallMaterialTask.java
@@ -86,14 +86,14 @@ public class CallMaterialTask extends AbstractAcsTask {
     public String createTask(JSONObject param) {
         WQLObject pointTable = WQLObject.getWQLObject("sch_base_point");
         JSONObject nextPoint = pointTable
-                .query("point_id = " + param.getString("point_id"))
+                .query("point_id = " + param.getString("next_point_id"))
                 .uniqueResult(0);
         if (ObjectUtil.isEmpty(nextPoint)) {
             throw new BadRequestException("终点不存在");
         }
 
         JSONObject startPoint = pointTable
-                .query("vehicle_code = " + param.getString("vehicle_code"))
+                .query("point_id = " + param.getString("start_point_id"))
                 .uniqueResult(0);
         if (ObjectUtil.isEmpty(startPoint)) {
             throw new BadRequestException("指定的料车点位不存在");