From 79937af8d521bcfa6f40ca3f368f7321a6c3c7b8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=BC=A0=E6=B1=9F=E7=8E=AE?=
 <zhangjiangwei2000@outlook.com>
Date: Fri, 14 Apr 2023 21:32:09 +0800
Subject: [PATCH 1/2] =?UTF-8?q?=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../pdm/service/impl/DeviceServiceImpl.java   |   2 +-
 .../service/impl/WorkorderServiceImpl.java    |   4 +-
 .../org/nl/wms/pdm/wql/MPS_PRODUCEDURE001.wql |   4 +-
 .../org/nl/wms/sch/rest/TaskController.java   |   1 -
 .../wms/sch/service/impl/TaskServiceImpl.java |   2 +-
 .../sch/task/call/empty/HLCallEmptyTask.java  | 107 +++++++++-
 .../call/material/FJCallMaterialTask.java     | 195 +++++++++++++++++
 .../call/material/SZCallMaterialTask.java     |   2 +-
 .../call/material/wql/CALL_MATERIAL_TASK.wql  |   2 +-
 .../sch/task/send/empty/FJSendEmptyTask.java  | 200 ++++++++++++++++++
 .../task/send/empty/wql/SEND_EMPTY_TASK.wql   |  79 +++++++
 .../send/material/HLSendMaterialTask.java     | 137 +++++++++++-
 .../src/main/java/org/nl/wms/wms.xls          | Bin 266240 -> 266240 bytes
 .../src/views/wms/pdm/workerorder/index.vue   |   2 +-
 14 files changed, 713 insertions(+), 24 deletions(-)
 create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/FJCallMaterialTask.java
 create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/FJSendEmptyTask.java
 create mode 100644 lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/wql/SEND_EMPTY_TASK.wql

diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/DeviceServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/DeviceServiceImpl.java
index 9105e33..14ccae5 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/DeviceServiceImpl.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/DeviceServiceImpl.java
@@ -44,7 +44,7 @@ public class DeviceServiceImpl implements DeviceService {
         if (!StrUtil.isEmpty(search)) {
             map.put("search", "%" + search + "%");
         }
-        JSONObject json = WQL.getWO("PDM_BI_DEVICE01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "device.device_model, device.device_code");
+        JSONObject json = WQL.getWO("PDM_BI_DEVICE01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "device.device_code");
         return json;
     }
 
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java
index c22b728..c690ede 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java
@@ -183,7 +183,7 @@ public class WorkorderServiceImpl implements WorkordeService {
         String workorder_id = param.getString("workorder_id");
         JSONObject submit_obj = WQL
                 .getWO("MPS_PRODUCEDURE001")
-                .addParam("flag", "5")
+                .addParam("flag", "6")
                 .addParam("workorder_id", workorder_id)
                 .process()
                 .uniqueResult(0);
@@ -193,7 +193,7 @@ public class WorkorderServiceImpl implements WorkordeService {
 
         JSONObject workorder = WQLObject
                 .getWQLObject("pdm_bd_workorder")
-                .query("is_delete = '0' AND device_code = '" + submit_obj.getString("workorder_code") + "' AND order_status IN ('2', '3')")
+                .query("is_delete = '0' AND device_id = '" + submit_obj.getString("device_id") + "' AND order_status IN ('2', '3')")
                 .uniqueResult(0);
         if (ObjectUtil.isNotEmpty(workorder)) {
             throw new BadRequestException("该设备正在执行其它工单!");
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/MPS_PRODUCEDURE001.wql b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/MPS_PRODUCEDURE001.wql
index 0f5ba51..9836da1 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/MPS_PRODUCEDURE001.wql
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/MPS_PRODUCEDURE001.wql
@@ -161,8 +161,9 @@
 	        SELECT
             	workorder.workorder_code,
             	workorder.plan_qty,
-            	workorder.device_code,
             	workorder.order_status,
+            	workorder.device_id,
+            	device.device_code,
             	material.material_code,
             	material.product_code,
             	material.a,
@@ -172,6 +173,7 @@
             FROM
             	pdm_bd_workorder workorder
             	LEFT JOIN md_me_materialbase material ON workorder.material_id = material.material_id
+            	LEFT JOIN pdm_bi_device device ON workorder.device_id = device.device_id
             WHERE
             	workorder.is_delete = '0'
             	AND workorder.workorder_id = 输入.workorder_id
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/rest/TaskController.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/rest/TaskController.java
index 90ea8d6..fd6d20a 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/rest/TaskController.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/rest/TaskController.java
@@ -1,4 +1,3 @@
-
 package org.nl.wms.sch.rest;
 
 
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java
index 4f34900..8e04426 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/TaskServiceImpl.java
@@ -124,7 +124,7 @@ public class TaskServiceImpl implements TaskService {
     public void operation(Map<String, Object> map) {
         String task_id = MapUtil.getStr(map, "task_id");
         String method_name = MapUtil.getStr(map, "method_name");
-        JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0);
+        JSONObject taskObj = WQLObject.getWQLObject("sch_base_task").query("task_id = '" + task_id + "'").uniqueResult(0);
         if (taskObj.getString("task_status").equals(TaskStatus.FINISHED.value())) throw new BadRequestException("任务已完成!");
         // 任务处理类
         String processing_class = taskObj.getString("handle_class");
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/HLCallEmptyTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/HLCallEmptyTask.java
index 4d305dc..292c4d1 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/HLCallEmptyTask.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/empty/HLCallEmptyTask.java
@@ -4,14 +4,12 @@ import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import lombok.RequiredArgsConstructor;
+import org.nl.modules.common.exception.BadRequestException;
 import org.nl.modules.wql.WQL;
 import org.nl.modules.wql.core.bean.WQLObject;
 import org.nl.wms.basedata.eum.TrueOrFalse;
 import org.nl.wms.basedata.eum.VehicleType;
-import org.nl.wms.sch.manage.AbstractAcsTask;
-import org.nl.wms.sch.manage.LockType;
-import org.nl.wms.sch.manage.TaskStatus;
-import org.nl.wms.sch.manage.TaskType;
+import org.nl.wms.sch.manage.*;
 import org.nl.wms.sch.task.util.TaskUtils;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
@@ -27,8 +25,16 @@ import org.springframework.transaction.annotation.Transactional;
 public class HLCallEmptyTask extends AbstractAcsTask {
 
     @Override
-    public void updateTaskStatus(JSONObject taskObj, String status) {
-
+    public void updateTaskStatus(JSONObject task, String status) {
+        if (TaskStatus.EXECUTING.value().equals(status)) {
+            task.put("task_status", TaskStatus.EXECUTING.value());
+            TaskUtils.addACSUpdateColum(task);
+            WQLObject.getWQLObject("sch_base_task").update(task);
+        } else if (TaskStatus.FINISHED.value().equals(status)) {
+            this.finishTask(task, OperationType.AUTO);
+        } else if (TaskStatus.CANCELLED.value().equals(status)) {
+            this.cancelTask(task, OperationType.AUTO);
+        }
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -96,13 +102,100 @@ public class HLCallEmptyTask extends AbstractAcsTask {
         }
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void forceFinish(String task_id) {
-
+        JSONObject task = WQLObject.getWQLObject("sch_base_task").query("task_id = " + task_id).uniqueResult(0);
+        if (ObjectUtil.isEmpty(task)) {
+            throw new BadRequestException("未找到任务!");
+        }
+        this.finishTask(task, OperationType.MANUAL);
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void cancel(String task_id) {
+        JSONObject task = WQLObject.getWQLObject("sch_base_task").query("task_id = " + task_id).uniqueResult(0);
+        if (ObjectUtil.isEmpty(task)) {
+            throw new BadRequestException("未找到任务!");
+        }
+        this.cancelTask(task, OperationType.MANUAL);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void cancelTask(JSONObject task, OperationType operation_type) {
+        if (task.getIntValue("task_status") < Integer.parseInt(TaskStatus.FINISHED.value())) {
+            task.put("task_status", TaskStatus.CANCELLED.value());
+            if (operation_type == OperationType.AUTO) {
+                TaskUtils.addACSUpdateColum(task);
+            } else if (operation_type == OperationType.MANUAL) {
+                TaskUtils.addCurrentUpdateColum(task);
+            }
+            WQLObject.getWQLObject("sch_base_task").update(task);
+
+            WQLObject point_table = WQLObject.getWQLObject("sch_base_point");
+            JSONObject point1 = point_table.query("point_code = '" + task.getString("point_code1") + "'").uniqueResult(0);
+            if (ObjectUtil.isNotEmpty(point1)
+                    && LockType.TASK_LOCKED.value().equals(point1.getString("lock_type"))
+                    && task.getString("task_code").equals(point1.getString("task_code"))) {
+                point1.put("lock_type", LockType.UNLOCKED.value());
+                point1.put("task_code", "");
+                if (operation_type == OperationType.AUTO) {
+                    TaskUtils.addACSUpdateColum(point1);
+                } else if (operation_type == OperationType.MANUAL) {
+                    TaskUtils.addCurrentUpdateColum(point1);
+                }
+                point_table.update(point1);
+            }
+
+            JSONObject point2 = new JSONObject();
+            point2.put("lock_type", LockType.UNLOCKED.value());
+            point2.put("task_code", "");
+            if (operation_type == OperationType.AUTO) {
+                TaskUtils.addACSUpdateColum(point2);
+            } else if (operation_type == OperationType.MANUAL) {
+                TaskUtils.addCurrentUpdateColum(point2);
+            }
+            point_table.update(point2, "point_code = '" + task.getString("point_code2") + "'");
+        }
+    }
 
+    @Transactional(rollbackFor = Exception.class)
+    public void finishTask(JSONObject task, OperationType operation_type) {
+        if (task.getIntValue("task_status") < Integer.parseInt(TaskStatus.FINISHED.value())) {
+            task.put("task_status", TaskStatus.FINISHED.value());
+            if (operation_type == OperationType.AUTO) {
+                TaskUtils.addACSUpdateColum(task);
+            } else if (operation_type == OperationType.MANUAL) {
+                TaskUtils.addCurrentUpdateColum(task);
+            }
+            WQLObject.getWQLObject("sch_base_task").update(task);
+
+            WQLObject point_table = WQLObject.getWQLObject("sch_base_point");
+            JSONObject point1 = point_table.query("point_code = '" + task.getString("point_code1") + "'").uniqueResult(0);
+            if (LockType.TASK_LOCKED.value().equals(point1.getString("lock_type"))
+                    && task.getString("task_code").equals(point1.getString("task_code"))) {
+                point1.put("lock_type", LockType.UNLOCKED.value());
+                point1.put("task_code", "");
+                point1.put("vehicle_type", "");
+                point1.put("vehicle_code", "");
+                point1.put("point_status", PointStatus.EMPTY.value());
+                TaskUtils.addCurrentUpdateColum(point1);
+                point_table.update(point1);
+            }
+
+            JSONObject point2 = new JSONObject();
+            point2.put("lock_type", LockType.UNLOCKED.value());
+            point2.put("task_code", "");
+            point2.put("vehicle_type", task.getString("vehicle_type"));
+            point2.put("vehicle_code", task.getString("vehicle_code"));
+            point2.put("point_status", PointStatus.NOT_EMPTY.value());
+            if (operation_type == OperationType.AUTO) {
+                TaskUtils.addACSUpdateColum(point2);
+            } else if (operation_type == OperationType.MANUAL) {
+                TaskUtils.addCurrentUpdateColum(point2);
+            }
+            point_table.update(point2, "point_code = '" + task.getString("point_code2") + "'");
+        }
     }
 }
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/FJCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/FJCallMaterialTask.java
new file mode 100644
index 0000000..75644e7
--- /dev/null
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/FJCallMaterialTask.java
@@ -0,0 +1,195 @@
+package org.nl.wms.sch.task.call.material;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.RequiredArgsConstructor;
+import org.nl.modules.common.exception.BadRequestException;
+import org.nl.modules.wql.WQL;
+import org.nl.modules.wql.core.bean.WQLObject;
+import org.nl.wms.basedata.eum.VehicleType;
+import org.nl.wms.sch.manage.*;
+import org.nl.wms.sch.task.util.TaskUtils;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @author zhangjiangwei
+ * @date 2023/04/14 21:28
+ */
+@RequiredArgsConstructor
+@Component
+public class FJCallMaterialTask  extends AbstractAcsTask {
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void updateTaskStatus(JSONObject task, String status) {
+        if (TaskStatus.EXECUTING.value().equals(status)) {
+            task.put("task_status", TaskStatus.EXECUTING.value());
+            TaskUtils.addACSUpdateColum(task);
+            WQLObject.getWQLObject("sch_base_task").update(task);
+        } else if (TaskStatus.FINISHED.value().equals(status)) {
+            this.finishTask(task, OperationType.AUTO);
+        } else if (TaskStatus.CANCELLED.value().equals(status)) {
+            this.cancelTask(task, OperationType.AUTO);
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public String createTask(JSONObject form) {
+        JSONObject point = form.getJSONObject("point");
+
+        JSONObject task = TaskUtils.buildTask(
+                "烧制区叫料",
+                TaskType.CALL_MATERIAL.value(),
+                TaskStatus.SURE_END.value(),
+                null,
+                point.getString("point_code"),
+                null,
+                VehicleType.STEEL_TRAY.value(),
+                null,
+                "1",
+                SZCallMaterialTask.class.getName(),
+                form.getString("create_mode"),
+                form.getString("request_param"),
+                form.getString("create_id"),
+                form.getString("create_name")
+        );
+        WQLObject.getWQLObject("sch_base_task").insert(task);
+
+        point.put("lock_type", LockType.TASK_LOCKED.value());
+        point.put("task_code", task.getString("task_code"));
+        WQLObject.getWQLObject("sch_base_point").update(point);
+
+        return task.getString("task_id");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void findStartPoint() {
+        WQLObject task_table = WQLObject.getWQLObject("sch_base_task");
+        JSONArray tasks = task_table
+                .query("is_delete = '0' AND task_status = '" + TaskStatus.SURE_END.value() + "' AND handle_class = '" + SZCallMaterialTask.class.getName() + "'", "priority DESC, create_time ASC")
+                .getResultJSONArray(0);
+        WQLObject point_table = WQLObject.getWQLObject("sch_base_point");
+
+        for (int i = 0; i < tasks.size(); i++) {
+            JSONObject task = tasks.getJSONObject(i);
+
+            JSONObject point = WQL
+                    .getWO("CALL_MATERIAL_TASK")
+                    .addParam("flag", "1")
+                    .process()
+                    .uniqueResult(0);
+
+            if (ObjectUtil.isNotEmpty(point)) {
+                task.put("task_status", TaskStatus.START_AND_END.value());
+                task.put("point_code1", point.getString("point_code"));
+                task.put("material_id", point.getString("material_id"));
+                task.put("vehicle_code", TaskUtils.formatVehicleCode(point.getString("vehicle_code")));
+                task.put("remark", "");
+                task_table.update(task);
+
+                JSONObject point_update = new JSONObject();
+                point_update.put("lock_type", LockType.TASK_LOCKED.value());
+                point_update.put("task_code", task.getString("task_code"));
+                point_table.update(point_update, "point_id = " + point.getLongValue("point_id"));
+            }
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void forceFinish(String task_id) {
+        JSONObject task = WQLObject.getWQLObject("sch_base_task").query("task_id = " + task_id).uniqueResult(0);
+        if (ObjectUtil.isEmpty(task)) {
+            throw new BadRequestException("未找到任务!");
+        }
+        this.finishTask(task, OperationType.MANUAL);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void cancel(String task_id) {
+        JSONObject task = WQLObject.getWQLObject("sch_base_task").query("task_id = " + task_id).uniqueResult(0);
+        if (ObjectUtil.isEmpty(task)) {
+            throw new BadRequestException("未找到任务!");
+        }
+        this.cancelTask(task, OperationType.MANUAL);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void cancelTask(JSONObject task, OperationType operation_type) {
+        if (task.getIntValue("task_status") < Integer.parseInt(TaskStatus.FINISHED.value())) {
+            task.put("task_status", TaskStatus.CANCELLED.value());
+            if (operation_type == OperationType.AUTO) {
+                TaskUtils.addACSUpdateColum(task);
+            } else if (operation_type == OperationType.MANUAL) {
+                TaskUtils.addCurrentUpdateColum(task);
+            }
+            WQLObject.getWQLObject("sch_base_task").update(task);
+
+            WQLObject point_table = WQLObject.getWQLObject("sch_base_point");
+            JSONObject point1 = point_table.query("point_code = '" + task.getString("point_code1") + "'").uniqueResult(0);
+            if (ObjectUtil.isNotEmpty(point1)
+                    && LockType.TASK_LOCKED.value().equals(point1.getString("lock_type"))
+                    && task.getString("task_code").equals(point1.getString("task_code"))) {
+                point1.put("lock_type", LockType.UNLOCKED.value());
+                point1.put("task_code", "");
+                if (operation_type == OperationType.AUTO) {
+                    TaskUtils.addACSUpdateColum(point1);
+                } else if (operation_type == OperationType.MANUAL) {
+                    TaskUtils.addCurrentUpdateColum(point1);
+                }
+                point_table.update(point1);
+            }
+
+            JSONObject point2 = new JSONObject();
+            point2.put("lock_type", LockType.UNLOCKED.value());
+            point2.put("task_code", "");
+            if (operation_type == OperationType.AUTO) {
+                TaskUtils.addACSUpdateColum(point2);
+            } else if (operation_type == OperationType.MANUAL) {
+                TaskUtils.addCurrentUpdateColum(point2);
+            }
+            point_table.update(point2, "point_code = '" + task.getString("point_code2") + "'");
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void finishTask(JSONObject task, OperationType operation_type) {
+        if (task.getIntValue("task_status") < Integer.parseInt(TaskStatus.FINISHED.value())) {
+            task.put("task_status", TaskStatus.FINISHED.value());
+            if (operation_type == OperationType.AUTO) {
+                TaskUtils.addACSUpdateColum(task);
+            } else if (operation_type == OperationType.MANUAL) {
+                TaskUtils.addCurrentUpdateColum(task);
+            }
+            WQLObject.getWQLObject("sch_base_task").update(task);
+
+            WQLObject point_table = WQLObject.getWQLObject("sch_base_point");
+            JSONObject point1 = point_table.query("point_code = '" + task.getString("point_code1") + "'").uniqueResult(0);
+            if (LockType.TASK_LOCKED.value().equals(point1.getString("lock_type"))
+                    && task.getString("task_code").equals(point1.getString("task_code"))) {
+                point1.put("lock_type", LockType.UNLOCKED.value());
+                point1.put("task_code", "");
+                point1.put("vehicle_type", "");
+                point1.put("vehicle_code", "");
+                point1.put("point_status", PointStatus.EMPTY.value());
+                TaskUtils.addCurrentUpdateColum(point1);
+                point_table.update(point1);
+            }
+
+            JSONObject point2 = new JSONObject();
+            point2.put("lock_type", LockType.UNLOCKED.value());
+            point2.put("task_code", "");
+            if (operation_type == OperationType.AUTO) {
+                TaskUtils.addACSUpdateColum(point2);
+            } else if (operation_type == OperationType.MANUAL) {
+                TaskUtils.addCurrentUpdateColum(point2);
+            }
+            point_table.update(point2, "point_code = '" + task.getString("point_code2") + "'");
+        }
+    }
+}
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/SZCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/SZCallMaterialTask.java
index 57052c8..add73f9 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/SZCallMaterialTask.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/SZCallMaterialTask.java
@@ -24,7 +24,7 @@ public class SZCallMaterialTask extends AbstractAcsTask {
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void autoCreate() {
-        JSONArray points = WQL.getWO("CALL_MATERIAL_TASK").addParam("flag", "1").process().getResultJSONArray(0);
+        JSONArray points = WQL.getWO("CALL_MATERIAL_TASK").addParam("flag", "2").process().getResultJSONArray(0);
         if (ObjectUtil.isNotEmpty(points) && !points.isEmpty()) {
             JSONObject form = new JSONObject();
             form.put("create_mode", CreateMode.ZDSC.value());
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/wql/CALL_MATERIAL_TASK.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/wql/CALL_MATERIAL_TASK.wql
index 03f14d2..fe07fe8 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/wql/CALL_MATERIAL_TASK.wql
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/wql/CALL_MATERIAL_TASK.wql
@@ -56,7 +56,7 @@
             	AND point.point_status = '1'
             	AND point.vehicle_type = '2'
             	AND vd.is_fire = '0'
-            	AND vd.if_in_kiln = '1'
+            	AND vd.is_in_kiln = '1'
             ORDER BY
             	workorder.is_urgent DESC, vd.create_time ASC
             ENDSELECT
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/FJSendEmptyTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/FJSendEmptyTask.java
new file mode 100644
index 0000000..94f2fa6
--- /dev/null
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/FJSendEmptyTask.java
@@ -0,0 +1,200 @@
+package org.nl.wms.sch.task.send.empty;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import org.nl.modules.common.exception.BadRequestException;
+import org.nl.modules.wql.WQL;
+import org.nl.modules.wql.core.bean.WQLObject;
+import org.nl.wms.basedata.eum.TrueOrFalse;
+import org.nl.wms.basedata.eum.VehicleType;
+import org.nl.wms.sch.manage.*;
+import org.nl.wms.sch.task.send.material.HLSendMaterialTask;
+import org.nl.wms.sch.task.send.material.YZSendMaterialTask;
+import org.nl.wms.sch.task.util.TaskUtils;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @author zhangjiangwei
+ * @date 2023/04/14 21:29
+ */
+public class FJSendEmptyTask  extends AbstractAcsTask {
+
+
+    @Override
+    public void updateTaskStatus(JSONObject task, String status) {
+        if (TaskStatus.EXECUTING.value().equals(status)) {
+            task.put("task_status", TaskStatus.EXECUTING.value());
+            TaskUtils.addACSUpdateColum(task);
+            WQLObject.getWQLObject("sch_base_task").update(task);
+        } else if (TaskStatus.FINISHED.value().equals(status)) {
+            this.finishTask(task, OperationType.AUTO);
+        } else if (TaskStatus.CANCELLED.value().equals(status)) {
+            this.cancelTask(task, OperationType.AUTO);
+        }
+    }
+
+    @Override
+    @Transactional
+    public String createTask(JSONObject form) {
+        JSONObject point = form.getJSONObject("point");
+
+        TaskUtils.isLocked(point);
+        JSONObject work_order = TaskUtils.hasWorkOrder(point);
+
+        String vehicle_code = form.getString("vehicle_code");
+        if ("0000".equals(vehicle_code)) {
+            throw new BadRequestException("载具编码不能为空!");
+        }
+
+        // todo 组盘
+
+        JSONObject task = TaskUtils.buildTask(
+                "混料机送料入库",
+                TaskType.SEND_MATERIAL.value(),
+                TaskStatus.SURE_START.value(),
+                point.getString("point_code"),
+                null,
+                work_order.getString("material_id"),
+                VehicleType.CUP.value(),
+                vehicle_code,
+                TrueOrFalse.trueOrFalse(work_order.getString("is_urgent")) ? "99" : "1",
+                HLSendMaterialTask.class.getName(),
+                form.getString("create_mode"),
+                form.getString("request_param"),
+                form.getString("create_id"),
+                form.getString("create_name")
+        );
+        WQLObject.getWQLObject("sch_base_task").insert(task);
+
+        return task.getString("task_id");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void findNextPoint() {
+        WQLObject task_table = WQLObject.getWQLObject("sch_base_task");
+        JSONArray tasks = task_table
+                .query("is_delete = '0' AND task_status = '" + TaskStatus.SURE_START.value() + "' AND handle_class = '" + YZSendMaterialTask.class.getName() + "'", "priority DESC, create_time ASC")
+                .getResultJSONArray(0);
+        WQLObject point_table = WQLObject.getWQLObject("sch_base_point");
+
+        for (int i = 0; i < tasks.size(); i++) {
+            JSONObject task = tasks.getJSONObject(i);
+
+            JSONObject point = WQL
+                    .getWO("SEND_MATERIAL_TASK")
+                    .addParam("flag", "1")
+                    .process()
+                    .uniqueResult(0);
+
+            if (ObjectUtil.isNotEmpty(point)) {
+                task.put("task_status", TaskStatus.START_AND_END.value());
+                task.put("point_code2", point.getString("point_code"));
+                task.put("remark", "");
+                task_table.update(task);
+
+                point.put("lock_type", LockType.TASK_LOCKED.value());
+                point.put("task_code", task.getString("task_code"));
+                point_table.update(point);
+            }
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void forceFinish(String task_id) {
+        JSONObject task = WQLObject.getWQLObject("sch_base_task").query("task_id = " + task_id).uniqueResult(0);
+        if (ObjectUtil.isEmpty(task)) {
+            throw new BadRequestException("未找到任务!");
+        }
+        this.finishTask(task, OperationType.MANUAL);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void cancel(String task_id) {
+        JSONObject task = WQLObject.getWQLObject("sch_base_task").query("task_id = " + task_id).uniqueResult(0);
+        if (ObjectUtil.isEmpty(task)) {
+            throw new BadRequestException("未找到任务!");
+        }
+        this.cancelTask(task, OperationType.MANUAL);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void cancelTask(JSONObject task, OperationType operation_type) {
+        if (task.getIntValue("task_status") < Integer.parseInt(TaskStatus.FINISHED.value())) {
+            task.put("task_status", TaskStatus.CANCELLED.value());
+            if (operation_type == OperationType.AUTO) {
+                TaskUtils.addACSUpdateColum(task);
+            } else if (operation_type == OperationType.MANUAL) {
+                TaskUtils.addCurrentUpdateColum(task);
+            }
+            WQLObject.getWQLObject("sch_base_task").update(task);
+
+            WQLObject point_table = WQLObject.getWQLObject("sch_base_point");
+            JSONObject point1 = point_table.query("point_code = '" + task.getString("point_code1") + "'").uniqueResult(0);
+            if (LockType.TASK_LOCKED.value().equals(point1.getString("lock_type"))
+                    && task.getString("task_code").equals(point1.getString("task_code"))) {
+                point1.put("lock_type", LockType.UNLOCKED.value());
+                point1.put("task_code", "");
+                if (operation_type == OperationType.AUTO) {
+                    TaskUtils.addACSUpdateColum(point1);
+                } else if (operation_type == OperationType.MANUAL) {
+                    TaskUtils.addCurrentUpdateColum(point1);
+                }
+                point_table.update(point1);
+            }
+
+            JSONObject point2 = new JSONObject();
+            point2.put("lock_type", LockType.UNLOCKED.value());
+            point2.put("task_code", "");
+            if (operation_type == OperationType.AUTO) {
+                TaskUtils.addACSUpdateColum(point2);
+            } else if (operation_type == OperationType.MANUAL) {
+                TaskUtils.addCurrentUpdateColum(point2);
+            }
+            point_table.update(point2, "point_code = '" + task.getString("point_code2") + "'");
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void finishTask(JSONObject task, OperationType operation_type) {
+        if (task.getIntValue("task_status") < Integer.parseInt(TaskStatus.FINISHED.value())) {
+            task.put("task_status", TaskStatus.FINISHED.value());
+            if (operation_type == OperationType.AUTO) {
+                TaskUtils.addACSUpdateColum(task);
+            } else if (operation_type == OperationType.MANUAL) {
+                TaskUtils.addCurrentUpdateColum(task);
+            }
+            WQLObject.getWQLObject("sch_base_task").update(task);
+
+            WQLObject point_table = WQLObject.getWQLObject("sch_base_point");
+            JSONObject point1 = point_table.query("point_code = '" + task.getString("point_code1") + "'").uniqueResult(0);
+            if (ObjectUtil.isNotEmpty(point1)
+                    && LockType.TASK_LOCKED.value().equals(point1.getString("lock_type"))
+                    && task.getString("task_code").equals(point1.getString("task_code"))) {
+                point1.put("lock_type", LockType.UNLOCKED.value());
+                point1.put("task_code", "");
+                point1.put("vehicle_type", "");
+                point1.put("vehicle_code", "");
+                point1.put("point_status", PointStatus.EMPTY.value());
+                TaskUtils.addCurrentUpdateColum(point1);
+                point_table.update(point1);
+            }
+
+            JSONObject point2 = new JSONObject();
+            point2.put("lock_type", LockType.UNLOCKED.value());
+            point2.put("task_code", "");
+            point2.put("vehicle_type", task.getString("vehicle_type"));
+            point2.put("vehicle_code", task.getString("vehicle_code"));
+            point2.put("point_status", PointStatus.NOT_EMPTY.value());
+            if (operation_type == OperationType.AUTO) {
+                TaskUtils.addACSUpdateColum(point2);
+            } else if (operation_type == OperationType.MANUAL) {
+                TaskUtils.addCurrentUpdateColum(point2);
+            }
+            point_table.update(point2, "point_code = '" + task.getString("point_code2") + "'");
+        }
+    }
+}
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/wql/SEND_EMPTY_TASK.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/wql/SEND_EMPTY_TASK.wql
new file mode 100644
index 0000000..fe07fe8
--- /dev/null
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/wql/SEND_EMPTY_TASK.wql
@@ -0,0 +1,79 @@
+[交易说明]
+	交易名:	叫空托盘
+	所属模块:
+	功能简述:
+	版权所有:
+	表引用:
+	版本经历:
+
+[数据库]
+	--指定数据库,为空采用默认值,默认为db.properties中列出的第一个库
+
+[IO定义]
+	#################################################
+	##			表字段对应输入参数
+	#################################################
+	输入.flag                         TYPEAS s_string
+
+[临时表]
+	--这边列出来的临时表就会在运行期动态创建
+
+[临时变量]
+	--所有中间过程变量均可在此处定义
+
+[业务过程]
+
+	##########################################
+	#			1、输入输出检查				 #
+	##########################################
+
+
+	##########################################
+	#			2、主过程前处理				 #
+	##########################################
+
+
+	##########################################
+	#			3、业务主过程			 	     #
+	##########################################
+
+	IF flag = "1"
+	    QUERY
+            SELECT
+            	point.*,
+            	vd.material_id,
+            	workorder.is_urgent
+            FROM
+            	sch_base_point point
+            	JOIN st_ivt_vehicle_detail vd ON point.vehicle_type = vd.vehicle_type
+            	AND point.vehicle_code = vd.vehicle_code
+            	AND vd.is_delete = '0'
+            	LEFT JOIN pdm_bd_workorder workorder ON vd.workorder_id = workorder.workorder_id
+            WHERE
+            	point.is_used = '1'
+            	AND point.lock_type = '1'
+            	AND point.region_code = 'CPHJ'
+            	AND point.point_status = '1'
+            	AND point.vehicle_type = '2'
+            	AND vd.is_fire = '0'
+            	AND vd.is_in_kiln = '1'
+            ORDER BY
+            	workorder.is_urgent DESC, vd.create_time ASC
+            ENDSELECT
+	    ENDQUERY
+	ENDIF
+
+	IF 输入.flag = "2"
+	    QUERY
+            SELECT
+            	*
+            FROM
+            	sch_base_point
+            WHERE
+            	is_used = '1'
+            	AND lock_type = '1'
+            	AND region_code = 'SZ'
+            	AND point_type = '1'
+            ENDSELECT
+	    ENDQUERY
+	ENDIF
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/HLSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/HLSendMaterialTask.java
index 1487abc..c32a3d0 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/HLSendMaterialTask.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/HLSendMaterialTask.java
@@ -1,14 +1,15 @@
 package org.nl.wms.sch.task.send.material;
 
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import lombok.RequiredArgsConstructor;
 import org.nl.modules.common.exception.BadRequestException;
+import org.nl.modules.wql.WQL;
 import org.nl.modules.wql.core.bean.WQLObject;
 import org.nl.wms.basedata.eum.TrueOrFalse;
 import org.nl.wms.basedata.eum.VehicleType;
-import org.nl.wms.sch.manage.AbstractAcsTask;
-import org.nl.wms.sch.manage.TaskStatus;
-import org.nl.wms.sch.manage.TaskType;
+import org.nl.wms.sch.manage.*;
 import org.nl.wms.sch.task.util.TaskUtils;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
@@ -25,8 +26,16 @@ public class HLSendMaterialTask extends AbstractAcsTask {
 
 
     @Override
-    public void updateTaskStatus(JSONObject taskObj, String status) {
-
+    public void updateTaskStatus(JSONObject task, String status) {
+        if (TaskStatus.EXECUTING.value().equals(status)) {
+            task.put("task_status", TaskStatus.EXECUTING.value());
+            TaskUtils.addACSUpdateColum(task);
+            WQLObject.getWQLObject("sch_base_task").update(task);
+        } else if (TaskStatus.FINISHED.value().equals(status)) {
+            this.finishTask(task, OperationType.AUTO);
+        } else if (TaskStatus.CANCELLED.value().equals(status)) {
+            this.cancelTask(task, OperationType.AUTO);
+        }
     }
 
     @Override
@@ -65,19 +74,131 @@ public class HLSendMaterialTask extends AbstractAcsTask {
         return task.getString("task_id");
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
-    @Transactional
     public void findNextPoint() {
-
+        WQLObject task_table = WQLObject.getWQLObject("sch_base_task");
+        JSONArray tasks = task_table
+                .query("is_delete = '0' AND task_status = '" + TaskStatus.SURE_START.value() + "' AND handle_class = '" + YZSendMaterialTask.class.getName() + "'", "priority DESC, create_time ASC")
+                .getResultJSONArray(0);
+        WQLObject point_table = WQLObject.getWQLObject("sch_base_point");
+
+        for (int i = 0; i < tasks.size(); i++) {
+            JSONObject task = tasks.getJSONObject(i);
+
+            JSONObject point = WQL
+                    .getWO("SEND_MATERIAL_TASK")
+                    .addParam("flag", "1")
+                    .process()
+                    .uniqueResult(0);
+
+            if (ObjectUtil.isNotEmpty(point)) {
+                task.put("task_status", TaskStatus.START_AND_END.value());
+                task.put("point_code2", point.getString("point_code"));
+                task.put("remark", "");
+                task_table.update(task);
+
+                point.put("lock_type", LockType.TASK_LOCKED.value());
+                point.put("task_code", task.getString("task_code"));
+                point_table.update(point);
+            }
+        }
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void forceFinish(String task_id) {
-
+        JSONObject task = WQLObject.getWQLObject("sch_base_task").query("task_id = " + task_id).uniqueResult(0);
+        if (ObjectUtil.isEmpty(task)) {
+            throw new BadRequestException("未找到任务!");
+        }
+        this.finishTask(task, OperationType.MANUAL);
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void cancel(String task_id) {
+        JSONObject task = WQLObject.getWQLObject("sch_base_task").query("task_id = " + task_id).uniqueResult(0);
+        if (ObjectUtil.isEmpty(task)) {
+            throw new BadRequestException("未找到任务!");
+        }
+        this.cancelTask(task, OperationType.MANUAL);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void cancelTask(JSONObject task, OperationType operation_type) {
+        if (task.getIntValue("task_status") < Integer.parseInt(TaskStatus.FINISHED.value())) {
+            task.put("task_status", TaskStatus.CANCELLED.value());
+            if (operation_type == OperationType.AUTO) {
+                TaskUtils.addACSUpdateColum(task);
+            } else if (operation_type == OperationType.MANUAL) {
+                TaskUtils.addCurrentUpdateColum(task);
+            }
+            WQLObject.getWQLObject("sch_base_task").update(task);
+
+            WQLObject point_table = WQLObject.getWQLObject("sch_base_point");
+            JSONObject point1 = point_table.query("point_code = '" + task.getString("point_code1") + "'").uniqueResult(0);
+            if (LockType.TASK_LOCKED.value().equals(point1.getString("lock_type"))
+                    && task.getString("task_code").equals(point1.getString("task_code"))) {
+                point1.put("lock_type", LockType.UNLOCKED.value());
+                point1.put("task_code", "");
+                if (operation_type == OperationType.AUTO) {
+                    TaskUtils.addACSUpdateColum(point1);
+                } else if (operation_type == OperationType.MANUAL) {
+                    TaskUtils.addCurrentUpdateColum(point1);
+                }
+                point_table.update(point1);
+            }
+
+            JSONObject point2 = new JSONObject();
+            point2.put("lock_type", LockType.UNLOCKED.value());
+            point2.put("task_code", "");
+            if (operation_type == OperationType.AUTO) {
+                TaskUtils.addACSUpdateColum(point2);
+            } else if (operation_type == OperationType.MANUAL) {
+                TaskUtils.addCurrentUpdateColum(point2);
+            }
+            point_table.update(point2, "point_code = '" + task.getString("point_code2") + "'");
+        }
+    }
 
+    @Transactional(rollbackFor = Exception.class)
+    public void finishTask(JSONObject task, OperationType operation_type) {
+        if (task.getIntValue("task_status") < Integer.parseInt(TaskStatus.FINISHED.value())) {
+            task.put("task_status", TaskStatus.FINISHED.value());
+            if (operation_type == OperationType.AUTO) {
+                TaskUtils.addACSUpdateColum(task);
+            } else if (operation_type == OperationType.MANUAL) {
+                TaskUtils.addCurrentUpdateColum(task);
+            }
+            WQLObject.getWQLObject("sch_base_task").update(task);
+
+            WQLObject point_table = WQLObject.getWQLObject("sch_base_point");
+            JSONObject point1 = point_table.query("point_code = '" + task.getString("point_code1") + "'").uniqueResult(0);
+            if (ObjectUtil.isNotEmpty(point1)
+                    && LockType.TASK_LOCKED.value().equals(point1.getString("lock_type"))
+                    && task.getString("task_code").equals(point1.getString("task_code"))) {
+                point1.put("lock_type", LockType.UNLOCKED.value());
+                point1.put("task_code", "");
+                point1.put("vehicle_type", "");
+                point1.put("vehicle_code", "");
+                point1.put("point_status", PointStatus.EMPTY.value());
+                TaskUtils.addCurrentUpdateColum(point1);
+                point_table.update(point1);
+            }
+
+            JSONObject point2 = new JSONObject();
+            point2.put("lock_type", LockType.UNLOCKED.value());
+            point2.put("task_code", "");
+            point2.put("vehicle_type", task.getString("vehicle_type"));
+            point2.put("vehicle_code", task.getString("vehicle_code"));
+            point2.put("point_status", PointStatus.NOT_EMPTY.value());
+            if (operation_type == OperationType.AUTO) {
+                TaskUtils.addACSUpdateColum(point2);
+            } else if (operation_type == OperationType.MANUAL) {
+                TaskUtils.addCurrentUpdateColum(point2);
+            }
+            point_table.update(point2, "point_code = '" + task.getString("point_code2") + "'");
+        }
     }
 }
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 6a50c5de25dfa40b53d9ce1823682063f78109f7..9de783a1b2c6d2c77acceefadce8be1fcc894166 100644
GIT binary patch
delta 10328
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

delta 10661
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
H^^*Ss%CgSJ

diff --git a/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue b/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue
index 5027529..b952d16 100644
--- a/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue
+++ b/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue
@@ -205,7 +205,6 @@
             {{ dict.label.vehicle_type[scope.row.vehicle_type] }}
           </template>
         </el-table-column>
-        <el-table-column prop="create_name" label="创建人" />
         <el-table-column prop="plan_qty" label="计划数量" />
         <el-table-column prop="is_urgent" label="是否加急">
           <template slot-scope="scope">
@@ -222,6 +221,7 @@
         <el-table-column prop="real_qty" label="实际数量" />
         <el-table-column prop="qualified_qty" label="合格数量" />
         <el-table-column prop="unqualified_qty" label="不合格数量" width="100" />
+        <el-table-column prop="create_name" label="创建人" />
         <el-table-column prop="create_time" label="创建时间" width="150" />
         <el-table-column prop="update_optname" label="修改人" />
         <el-table-column prop="update_time" label="修改时间" width="150" />

From 3b54f3f201e41e8c407ad29f9cc7eec9d049bdfa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=BC=A0=E6=B1=9F=E7=8E=AE?=
 <zhangjiangwei2000@outlook.com>
Date: Sat, 15 Apr 2023 16:12:29 +0800
Subject: [PATCH 2/2] =?UTF-8?q?=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../rest/MobileAuthorizationController.java   |   2 +-
 .../acs/service/impl/AcsToWmsServiceImpl.java |  62 +++---
 .../org/nl/wms/pda/rest/PdaController.java    | 100 +++++++--
 .../org/nl/wms/pda/service/PdaService.java    |  40 +++-
 .../wms/pda/service/impl/PdaServiceImpl.java  | 198 +++++++++++++++---
 .../java/org/nl/wms/pda/util/PdaUtils.java    |   6 +-
 .../src/main/java/org/nl/wms/pda/wql/PDA.wql  |  47 ++++-
 .../service/impl/WorkorderServiceImpl.java    |   5 +-
 .../call/material/FJCallMaterialTask.java     |  18 +-
 .../call/material/wql/CALL_MATERIAL_TASK.wql  |  23 ++
 .../org/nl/wms/sch/task/util/TaskUtils.java   |   6 +-
 .../src/test/java/org/nl/test/PointTest.java  |  24 +--
 12 files changed, 397 insertions(+), 134 deletions(-)

diff --git a/lms/nladmin-system/src/main/java/org/nl/modules/security/rest/MobileAuthorizationController.java b/lms/nladmin-system/src/main/java/org/nl/modules/security/rest/MobileAuthorizationController.java
index bddbc15..ca2e956 100644
--- a/lms/nladmin-system/src/main/java/org/nl/modules/security/rest/MobileAuthorizationController.java
+++ b/lms/nladmin-system/src/main/java/org/nl/modules/security/rest/MobileAuthorizationController.java
@@ -78,7 +78,7 @@ public class MobileAuthorizationController {
         JSONObject jsonObject = new JSONObject();
         jsonObject.put("user", userDto);
         Map<String, Object> authInfo = new HashMap<String, Object>(2) {{
-            put("token", "Bearer "+StpUtil.getTokenValue());
+            put("token", "Bearer " + StpUtil.getTokenValue());
             put("user", jsonObject);
         }};
 
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 0f82680..14b96a9 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
@@ -21,7 +21,9 @@ import org.nl.wms.ext.acs.service.AcsToWmsService;
 import org.nl.wms.sch.manage.*;
 import org.nl.wms.sch.task.call.empty.HLCallEmptyTask;
 import org.nl.wms.sch.task.call.empty.YZCallEmptyTask;
+import org.nl.wms.sch.task.call.material.FJCallMaterialTask;
 import org.nl.wms.sch.task.call.material.SZCallMaterialTask;
+import org.nl.wms.sch.task.send.empty.FJSendEmptyTask;
 import org.nl.wms.sch.task.send.material.HLSendMaterialTask;
 import org.nl.wms.sch.task.send.material.SZSendMaterialTask;
 import org.nl.wms.sch.task.send.material.YZSendMaterialTask;
@@ -53,6 +55,10 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
 
     private final SZSendMaterialTask szSendMaterialTask;
 
+    private final FJCallMaterialTask fjCallMaterialTask;
+
+    private final FJSendEmptyTask fjSendEmptyTask;
+
     /**
      * task_id:任务标识
      * task_code:任务编码
@@ -237,20 +243,28 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
                                 szSendMaterialTask.createTask(method_param);
                                 break;
                             default:
-                                throw new BadRequestException("[" + region.label() + "] 不存在送料任务!");
+                                throw new BadRequestException("[" + region.label() + "] 不能发起送料任务!");
                         }
                         break;
                     case "2":
                         // 叫料
                         switch (region) {
                             case FJ:
+                                fjCallMaterialTask.createTask(method_param);
                                 break;
                             default:
-                                throw new BadRequestException("[" + region.label() + "] 不存在叫料任务!");
+                                throw new BadRequestException("[" + region.label() + "] 不能发起叫料任务!");
                         }
                         break;
                     case "3":
                         // 送空
+                        switch (region) {
+                            case FJ:
+                                fjSendEmptyTask.createTask(method_param);
+                                break;
+                            default:
+                                throw new BadRequestException("[" + region.label() + "] 不能发起送空任务!");
+                        }
                         break;
                     case "4":
                         // 叫空
@@ -264,7 +278,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
                             case GTK:
                                 break;
                             default:
-                                throw new BadRequestException("[" + region.label() + "] 不存在叫空任务!");
+                                throw new BadRequestException("[" + region.label() + "] 不能发起叫空任务!");
                         }
                         break;
                     default:
@@ -326,16 +340,8 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
         TaskUtils.isLocked(point);
 
         JSONObject work_order = TaskUtils.hasWorkOrder(point);
-
-        String vehicle_type = null;
-        if (work_order.getString("device_code").startsWith("FJ")) {
-            vehicle_type = work_order.getString("vehicle_type");
-        } else if (work_order.getString("device_code").startsWith("YZ")) {
-            vehicle_type = VehicleType.STEEL_TRAY.value();
-        } else if (work_order.getString("device_code").startsWith("HL")) {
-            vehicle_type = VehicleType.CUP.value();
-        }
-
+        String device_code = work_order.getString("device_code");
+        String vehicle_type = work_order.getString("vehicle_type");
         WQLObject vd_table = WQLObject.getWQLObject("st_ivt_vehicle_detail");
         JSONObject vd_update = new JSONObject();
         vd_update.put("is_delete", TrueOrFalse.TRUE.value());
@@ -343,7 +349,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
 
         JSONObject vd = new JSONObject();
         vd.put("vd_id", IdUtil.getSnowflake(1, 1).nextId());
-        vd.put("vehicle_type", VehicleType.STEEL_TRAY.value());
+        vd.put("vehicle_type", vehicle_type);
         vd.put("vehicle_code", vehicle_code);
         vd.put("material_id", work_order.getString("material_id"));
         vd.put("qty", qty);
@@ -404,7 +410,14 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
         vd.put("create_time", DateUtil.now());
         vd.put("is_delete", TrueOrFalse.FALSE.value());
         vd.put("is_fire", TrueOrFalse.FALSE.value());
+        if (device_code.startsWith("FJ")) {
+            vd.put("is_fire", TrueOrFalse.TRUE.value());
+        }
         vd.put("is_in_kiln", TrueOrFalse.trueOrFalse(is_full) ? TrueOrFalse.TRUE.value() : TrueOrFalse.FALSE.value());
+        if (device_code.startsWith("FJ")) {
+            vd.put("is_in_kiln", TrueOrFalse.FALSE.value());
+        }
+
         vd_table.insert(vd);
 
         JSONObject vehicle_update = new JSONObject();
@@ -659,21 +672,6 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
         return result;
     }
 
-    private JSONObject getProduceInfoByCode(String code) { // 查找工单
-        //根据 设备点位去找生产任务信息
-        //1 根据点位去找设备,去找对应的设备信息
-        JSONObject pointObj = WQLObject.getWQLObject("sch_base_point").query("point_code ='" + code + "'").uniqueResult(0);
-        String device_code = pointObj.getString("device_code");
-        //2 根据设备去找对应的生产任务 1-未生产、2-已下发、3-生产中、4-暂停、5-完成
-        JSONObject productTaskObj = WQLObject.getWQLObject("PDM_BD_WorkOrder")
-                .query("device_code ='" + device_code + "' and order_status in ('3','2','4')", "workorder_procedure")
-                .uniqueResult(0);
-        if (ObjectUtil.isEmpty(productTaskObj)) {
-            throw new BadRequestException("未找到点位为'" + code + "'的生产任务!");
-        }
-        return productTaskObj;
-    }
-
     @Override
     public JSONObject feedbackVehicleType(JSONObject param) {
         String point_code = param.getString("device_code");
@@ -704,9 +702,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
             throw new BadRequestException("点位不能为空!");
         }
         String vehicle_code = whereJson.getString("vehicle_code");
-        if (StrUtil.isBlank(vehicle_code) || "0".equals(vehicle_code)) {
-            throw new BadRequestException("载具编码不能为空!");
-        }
+        vehicle_code = TaskUtils.formatVehicleCode(vehicle_code);
         JSONObject point = WQLObject
                 .getWQLObject("sch_base_point")
                 .query("is_used = '1' AND point_code = '" + point_code + "'")
@@ -734,7 +730,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
         }
 
         if (StrUtil.isBlank(vehicle_type)) {
-            throw new BadRequestException("未知载具类型! b  ");
+            throw new BadRequestException("未知载具类型!");
         }
 
         JSONObject data = null;
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 1570563..349f3f4 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
@@ -11,6 +11,7 @@ import org.nl.modules.logging.annotation.Log;
 import org.nl.wms.pda.util.PdaUtils;
 import org.nl.wms.pda.anno.PdaAnnotation;
 import org.nl.wms.pda.service.PdaService;
+import org.nl.wms.sch.task.util.TaskUtils;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -31,41 +32,98 @@ public class PdaController {
 
     private final PdaService pdaService;
 
-    @PostMapping("/queryRegion")
+    @PostMapping("/region")
     @Log("查询区域")
     @ApiOperation("查询区域")
     @PdaAnnotation
-    public JSONObject queryRegion() {
-        return PdaUtils.buildSuccessResultJSON(pdaService.queryRegion());
+    public JSONObject region(@RequestBody JSONObject param) {
+        String func = param.getString("func");
+        if (StrUtil.isBlank(func)) {
+            throw new BadRequestException("未知功能!");
+        }
+        return PdaUtils.buildSuccessResultJSON(pdaService.region(func));
+    }
+
+    @PostMapping("/point")
+    @Log("查询点位")
+    @ApiOperation("查询点位")
+    @PdaAnnotation
+    public JSONObject point(@RequestBody JSONObject param) {
+        String func = param.getString("func");
+        if (StrUtil.isBlank(func)) {
+            throw new BadRequestException("未知功能!");
+        }
+        String region_code = param.getString("region_code");
+        if (StrUtil.isBlank(region_code)) {
+            throw new BadRequestException("区域不能为空!");
+        }
+
+        return PdaUtils.buildSuccessResultJSON(pdaService.point(func, region_code));
     }
 
-    @PostMapping("/queryPoint")
-    @Log("查询对接位")
-    @ApiOperation("查询对接位")
+    @PostMapping("/device")
+    @Log("查询设备")
+    @ApiOperation("查询设备")
     @PdaAnnotation
-    public JSONObject queryPoint(@RequestBody JSONObject request_body) {
-        String type = request_body.getString("type");
-        if (StrUtil.isBlank(type)) {
-            throw new BadRequestException("未知界面!");
+    public JSONObject device(@RequestBody JSONObject param) {
+        String func = param.getString("func");
+        if (StrUtil.isBlank(func)) {
+            throw new BadRequestException("未知功能!");
         }
-        return PdaUtils.buildSuccessResultJSON(pdaService.queryPoint(type));
+
+        return PdaUtils.buildSuccessResultJSON(pdaService.device(func));
     }
 
-    @PostMapping("/createTask")
-    @Log("创建任务")
-    @ApiOperation("创建任务")
+    @PostMapping("/report")
+    @Log("查询设备")
+    @ApiOperation("查询设备")
     @PdaAnnotation
-    public JSONObject createTask(@RequestBody JSONObject request_body) {
-        String type = request_body.getString("type");
-        if (StrUtil.isBlank(type)) {
-            throw new BadRequestException("未知任务类型!");
+    public JSONObject report(@RequestBody JSONObject param) {
+        String func = param.getString("func");
+        if (StrUtil.isBlank(func)) {
+            throw new BadRequestException("未知功能!");
+        }
+        String device_code = param.getString("device_code");
+        if (StrUtil.isBlank(device_code)) {
+            throw new BadRequestException("区域不能为空!");
+        }
+        String unqualified_qty = param.getString("unqualified_qty");
+        if (StrUtil.isBlank(unqualified_qty)) {
+            throw new BadRequestException("不合格数量不能为空!");
         }
-        String point_code = request_body.getString("point_code");
+
+        pdaService.report(device_code, unqualified_qty);
+        return PdaUtils.buildSuccessResultJSON(null);
+    }
+
+    @PostMapping("/sendMaterial")
+    @Log("送料")
+    @ApiOperation("送料")
+    @PdaAnnotation
+    public JSONObject sendMaterial(@RequestBody JSONObject param) {
+        String point_code = param.getString("point_code");
         if (StrUtil.isBlank(point_code)) {
-            throw new BadRequestException("点位不能为空!");
+            throw new BadRequestException("点位编码不能为空!");
+        }
+        String vehicle_code = param.getString("vehicle_code");
+        vehicle_code = TaskUtils.formatVehicleCode(vehicle_code);
+        if ("0000".equals(vehicle_code)) {
+            throw new BadRequestException("载具编码不能为空!");
+        }
+        String qty = param.getString("qty");
+        if (StrUtil.isBlank(qty)) {
+            throw new BadRequestException("数量不能为空!");
+        }
+        String weight = param.getString("weight");
+        if (StrUtil.isBlank(weight)) {
+            throw new BadRequestException("重量不能为空!");
+        }
+        String is_full = param.getString("is_full");
+        if (StrUtil.isBlank(is_full)) {
+            throw new BadRequestException("是否满拖不能为空!");
         }
 
-        pdaService.createTask(request_body);
+        pdaService.sendMaterial(point_code, vehicle_code, qty, weight, is_full, param.toJSONString());
         return PdaUtils.buildSuccessResultJSON(null);
     }
 }
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 133fe42..dd25397 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
@@ -1,7 +1,7 @@
 package org.nl.wms.pda.service;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
 
 /**
  * 辽宁晟华手持服务层接口
@@ -11,10 +11,42 @@ import com.alibaba.fastjson.JSONObject;
  */
 public interface PdaService {
 
+    /**
+     * 查询区域
+     * @param func 手持功能
+     * @return 区域编码 区域名称
+     */
+    JSONArray region(String func);
 
-    JSONArray queryRegion();
+    /**
+     * 查询点位
+     * @param func 手持功能
+     * @param region_code 区域编码
+     * @return 点位编码 点位名称
+     */
+    JSONArray point(String func, String region_code);
 
-    JSONArray queryPoint(String type);
+    /**
+     * 查询设备
+     * @param func 手持功能
+     * @return 设备编码 设备名称
+     */
+    JSONArray device(String func);
 
-    void createTask(JSONObject request_param);
+    /**
+     * 不合格品上报
+     * @param device_code 设备编码
+     * @param unqualified_qty 不合格数量
+     */
+    void report(String device_code, String unqualified_qty);
+
+    /**
+     * 送料
+     * @param point_code 点位编码
+     * @param vehicle_code 载具编码
+     * @param qty 数量
+     * @param weight 重量
+     * @param is_full 是否满拖
+     */
+    void sendMaterial(String point_code, String vehicle_code, String qty, String weight, String is_full, String request_param);
 }
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 6d79e68..95f5927 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
@@ -1,6 +1,9 @@
 package org.nl.wms.pda.service.impl;
 
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import lombok.RequiredArgsConstructor;
@@ -9,11 +12,16 @@ import org.nl.modules.common.exception.BadRequestException;
 import org.nl.modules.common.utils.SecurityUtils;
 import org.nl.modules.wql.WQL;
 import org.nl.modules.wql.core.bean.WQLObject;
+import org.nl.wms.basedata.eum.TrueOrFalse;
 import org.nl.wms.pda.service.PdaService;
+import org.nl.wms.sch.manage.ACSSystem;
 import org.nl.wms.sch.manage.CreateMode;
+import org.nl.wms.sch.manage.Region;
 import org.nl.wms.sch.task.send.material.HLSendMaterialTask;
+import org.nl.wms.sch.task.send.material.YZSendMaterialTask;
 import org.nl.wms.sch.task.util.TaskUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * @author 张江玮
@@ -26,63 +34,185 @@ public class PdaServiceImpl implements PdaService {
 
     private final HLSendMaterialTask hlSendMaterialTask;
 
-    /**
-     * 查询所有区域
-     *
-     * @return 所有区域信息
-     */
+    private final YZSendMaterialTask yzSendMaterialTask;
+
     @Override
-    public JSONArray queryRegion() {
-        return WQLObject
-                .getWQLObject("sch_base_region")
-                .query()
-                .getResultJSONArray(0);
+    public JSONArray region(String func) {
+        switch (func) {
+            case "send_material":
+                // 送料
+            case "call_material":
+                // 送料
+                return WQL
+                        .getWO("PDA")
+                        .addParam("flag", "1")
+                        .addParam("where", "('HL', 'YZ', 'FJ')")
+                        .process()
+                        .getResultJSONArray(0);
+            default:
+                throw new BadRequestException("未知功能!");
+        }
+    }
+
+    @Override
+    public JSONArray point(String func, String region_code) {
+        Region region = Region.get(region_code);
+        if (ObjectUtil.isEmpty(region)) {
+            throw new BadRequestException("未知区域!");
+        }
+
+        switch (func) {
+            case "send_material":
+                // 送料
+                switch (region) {
+                    case HL:
+                        return WQL
+                                .getWO("PDA")
+                                .addParam("flag", "2")
+                                .addParam("region_code", region_code)
+                                .addParam("point_type", "('1', '2')")
+                                .process()
+                                .getResultJSONArray(0);
+                    case YZ:
+                        return WQL
+                                .getWO("PDA")
+                                .addParam("flag", "2")
+                                .addParam("region_code", region_code)
+                                .addParam("point_type", "('1')")
+                                .process()
+                                .getResultJSONArray(0);
+                    case FJ:
+                        return WQL
+                                .getWO("PDA")
+                                .addParam("flag", "2")
+                                .addParam("region_code", region_code)
+                                .addParam("point_type", "('2')")
+                                .process()
+                                .getResultJSONArray(0);
+                    default:
+                        throw new BadRequestException(region.label() + "没有送料点位!");
+                }
+            case "call_material":
+                // 叫料
+                switch (region) {
+                    case YZ:
+                        JSONArray result = WQL
+                                .getWO("PDA")
+                                .addParam("flag", "2")
+                                .addParam("region_code", region_code)
+                                .addParam("point_type", "('2')")
+                                .process()
+                                .getResultJSONArray(0);
+                        result.addAll(WQL
+                                .getWO("PDA")
+                                .addParam("flag", "2")
+                                .addParam("region_code", Region.KLHJ.value())
+                                .addParam("point_type", "('2')")
+                                .process()
+                                .getResultJSONArray(0));
+                        return result;
+                    case FJ:
+                        return WQL
+                                .getWO("PDA")
+                                .addParam("flag", "2")
+                                .addParam("region_code", region_code)
+                                .addParam("point_type", "('1')")
+                                .process()
+                                .getResultJSONArray(0);
+                    default:
+                        throw new BadRequestException(region.label() + "没有叫料点位!");
+                }
+            default:
+                throw new BadRequestException("未知功能!");
+        }
     }
 
-    /**
-     * 查询对接位
-     *
-     * @param type 手持界面 HLSL-混料送料
-     * @return 对接位信息
-     */
     @Override
-    public JSONArray queryPoint(String type) {
+    public JSONArray device(String func) {
         return WQL
                 .getWO("PDA")
-                .addParam("flag", "1")
-                .addParam("type", type)
+                .addParam("flag", "3")
                 .process()
                 .getResultJSONArray(0);
     }
 
-    /**
-     * 创建任务
-     *
-     * @param request_param 请求带的参数
-     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void report(String device_code, String unqualified_qty) {
+        WQLObject workorder_table = WQLObject.getWQLObject("pdm_bd_workorder");
+        JSONObject work_order = workorder_table
+                .query("is_delete = '0' AND device_code = '" + device_code + "' AND order_status = '3'")
+                .uniqueResult(0);
+        if (ObjectUtil.isEmpty(work_order)) {
+            throw new BadRequestException("设备 [" + device_code + "] 未开始生产!");
+        }
+
+        int current_qty = work_order.getIntValue("unqualified_qty");
+        work_order.put("unqualified_qty", current_qty + Integer.parseInt(unqualified_qty));
+        workorder_table.update(work_order);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
     @Override
-    public void createTask(JSONObject request_param) {
-        String type = request_param.getString("type");
+    public void sendMaterial(String point_code, String vehicle_code, String qty, String weight, String is_full, String request_param) {
         JSONObject point = WQLObject
                 .getWQLObject("sch_base_point")
-                .query("is_delete = '0' AND is_used = '1' AND point_code = '" + request_param.getString("point_code") + "'")
+                .query("is_used = '1' AND point_code = '" + point_code + "'")
                 .uniqueResult(0);
         if (ObjectUtil.isEmpty(point)) {
-            throw new BadRequestException("点位已删除或未启用!");
+            throw new BadRequestException("[" + point_code + "] 已删除或未启用!");
         }
+        TaskUtils.isLocked(point);
+        JSONObject workorder = TaskUtils.hasWorkOrder(point);
+        String vehicle_type = workorder.getString("vehicle_type");
+        String device_code = workorder.getString("device_code");
+        WQLObject vd_table = WQLObject.getWQLObject("st_ivt_vehicle_detail");
+        JSONObject vd_update = new JSONObject();
+        vd_update.put("is_delete", TrueOrFalse.TRUE.value());
+        vd_table.update(vd_update, "vehicle_type = '" + vehicle_type + "' AND vehicle_code = '" + vehicle_code + "'");
+
+        // 组盘
+        JSONObject vd = new JSONObject();
+        vd.put("vd_id", IdUtil.getSnowflake(1L, 1L).nextId());
+        vd.put("vehicle_type", vehicle_type);
+        vd.put("vehicle_code", vehicle_code);
+        vd.put("material_id", workorder.getString("material_id"));
+        vd.put("qty", qty);
+        vd.put("weight", weight);
+        vd.put("is_full", is_full);
+        vd.put("workorder_id", workorder.getString("workorder_id"));
+        vd.put("point_code", point_code);
+        vd.put("create_id", SecurityUtils.getCurrentUserId());
+        vd.put("create_name", SecurityUtils.getCurrentNickName());
+        vd.put("create_time", DateUtil.now());
+        vd.put("is_delete", "0");
+        if (device_code.startsWith("FJ")) {
+            vd.put("is_fire", TrueOrFalse.TRUE.value());
+        }
+        vd.put("is_in_kiln", TrueOrFalse.trueOrFalse(is_full) ? TrueOrFalse.TRUE.value() : TrueOrFalse.FALSE.value());
+        if (device_code.startsWith("FJ")) {
+            vd.put("is_in_kiln", TrueOrFalse.FALSE.value());
+        }
+        vd_table.insert(vd);
+
+        Region region = Region.get(point.getString("region_code"));
         JSONObject method_param = new JSONObject();
+        method_param.put("point", point);
+        method_param.put("workorder", workorder);
+        method_param.put("vd", vd);
         method_param.put("create_mode", CreateMode.SCCJ.value());
         method_param.put("request_param", request_param);
         method_param.put("create_id", SecurityUtils.getCurrentUserId());
         method_param.put("create_name", SecurityUtils.getCurrentNickName());
-        switch (type) {
-            case "1":
-                // 混料机送料
-                method_param.put("point", point);
-                method_param.put("vehicle_code", TaskUtils.formatVehicleCode(request_param.getString("vehicle_code")));
+        switch (region) {
+            case HL:
                 hlSendMaterialTask.createTask(method_param);
                 break;
-            case "2":
+            case YZ:
+                yzSendMaterialTask.createTask(method_param);
+                break;
+            default:
+                throw new BadRequestException("[" + region.label() + "] 不能发起送料任务!");
         }
     }
 }
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/util/PdaUtils.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/util/PdaUtils.java
index bbd7edf..e770d79 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/util/PdaUtils.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/util/PdaUtils.java
@@ -15,13 +15,13 @@ public final class PdaUtils {
      * 服务层调用方法
      * 创建操作成功的 JSONObject 并携带需要返回的数据
      *
-     * @param result 返回数据, 可为 NULL
+     * @param result 返回数据,可为 NULL
      * @return 携带了返回数据的 JSONObject
      */
     public static JSONObject buildSuccessResultJSON(JSON result) {
         JSONObject resultJSON = new JSONObject();
         resultJSON.put("code", "1");
-        resultJSON.put("desc", "操作成功");
+        resultJSON.put("desc", "操作成功!");
         resultJSON.put("result", result);
         return resultJSON;
     }
@@ -30,7 +30,7 @@ public final class PdaUtils {
      * 服务层调用方法
      * 创建操作失败的 JSONObject
      *
-     * @param desc 错误提示, 可为 NULL
+     * @param desc 错误提示,可为 NULL
      * @return 自定义错误提示的 JSONObject
      */
     public static JSONObject buildFailResultJSON(String desc) {
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 30562c4..0d42136 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
@@ -14,7 +14,9 @@
 	##			表字段对应输入参数
 	#################################################
 	输入.flag                         TYPEAS s_string
-	输入.type                         TYPEAS s_string
+	输入.where                        TYPEAS f_string
+	输入.region_code                  TYPEAS s_string
+	输入.point_type                   TYPEAS f_string
 
 [临时表]
 	--这边列出来的临时表就会在运行期动态创建
@@ -41,19 +43,44 @@
 	IF 输入.flag = "1"
 	    QUERY
 	        SELECT
-            	point_id,
+            	region_code,
+            	region_name
+            FROM
+            	sch_base_region
+            WHERE
+            	region_code IN 输入.where
+            ORDER BY
+                create_time ASC
+            ENDSELECT
+	    ENDQUERY
+	ENDIF
+
+	IF 输入.flag = "2"
+	    QUERY
+	        SELECT
             	point_code,
             	point_name
             FROM
             	sch_base_point
             WHERE
-            	is_delete = '0'
-            	AND is_used = '1'
-            	AND lock_type = '1'
-            	OPTION 输入.type = "HL"
-                    region_code = 'HL'
-                    AND point_type IN ('1', '2')
-            	ENDOPTION
-	        ENDSELECT
+            	is_used = '1'
+            	AND region_code = 输入.region_code
+            	AND point_type IN 输入.point_type
+            ORDER BY
+                point_code ASC
+            ENDSELECT
 	    ENDQUERY
 	ENDIF
+
+	IF 输入.flag = "3"
+        QUERY
+            SELECT
+                device_code,
+                device_name
+            FROM
+                pdm_bi_device
+            ORDER BY
+                device_code ASC
+            ENDSELECT
+        ENDQUERY
+    ENDIF
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java
index c690ede..589bded 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java
@@ -114,14 +114,15 @@ public class WorkorderServiceImpl implements WorkordeService {
         String device_code = dto.getDevice_code();
         String vehicle_type = dto.getVehicle_type();
         if (!device_code.startsWith("FJ")) {
-            if (device_code.startsWith("YZJ")) {
+            if (device_code.startsWith("YZ")) {
                 vehicle_type = VehicleType.STEEL_TRAY.value();
-            } else if (device_code.startsWith("HLJ")) {
+            } else if (device_code.startsWith("HL")) {
                 vehicle_type = VehicleType.CUP.value();
             }
         }
         work_order.put("vehicle_type", vehicle_type);
         work_order.put("device_id", dto.getDevice_id());
+        work_order.put("device_code", dto.getDevice_code());
         work_order.put("order_status", WorkOrderEnum.ORDER_STATUS_UNPRODUCED.value());
         work_order.put("is_urgent", dto.getIs_urgent());
         work_order.put("is_pri", dto.getIs_pri());
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/FJCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/FJCallMaterialTask.java
index 75644e7..17c15c5 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/FJCallMaterialTask.java
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/FJCallMaterialTask.java
@@ -7,6 +7,7 @@ import lombok.RequiredArgsConstructor;
 import org.nl.modules.common.exception.BadRequestException;
 import org.nl.modules.wql.WQL;
 import org.nl.modules.wql.core.bean.WQLObject;
+import org.nl.wms.basedata.eum.TrueOrFalse;
 import org.nl.wms.basedata.eum.VehicleType;
 import org.nl.wms.sch.manage.*;
 import org.nl.wms.sch.task.util.TaskUtils;
@@ -39,18 +40,19 @@ public class FJCallMaterialTask  extends AbstractAcsTask {
     @Override
     public String createTask(JSONObject form) {
         JSONObject point = form.getJSONObject("point");
+        JSONObject workorder = TaskUtils.hasWorkOrder(point);
 
         JSONObject task = TaskUtils.buildTask(
-                "烧制区叫料",
+                "分拣区叫料",
                 TaskType.CALL_MATERIAL.value(),
                 TaskStatus.SURE_END.value(),
                 null,
                 point.getString("point_code"),
-                null,
+                workorder.getString("material_id"),
                 VehicleType.STEEL_TRAY.value(),
                 null,
-                "1",
-                SZCallMaterialTask.class.getName(),
+                TrueOrFalse.trueOrFalse(workorder.getString("is_urgent")) ? "99" : "1",
+                FJCallMaterialTask.class.getName(),
                 form.getString("create_mode"),
                 form.getString("request_param"),
                 form.getString("create_id"),
@@ -70,7 +72,7 @@ public class FJCallMaterialTask  extends AbstractAcsTask {
     public void findStartPoint() {
         WQLObject task_table = WQLObject.getWQLObject("sch_base_task");
         JSONArray tasks = task_table
-                .query("is_delete = '0' AND task_status = '" + TaskStatus.SURE_END.value() + "' AND handle_class = '" + SZCallMaterialTask.class.getName() + "'", "priority DESC, create_time ASC")
+                .query("is_delete = '0' AND task_status = '" + TaskStatus.SURE_END.value() + "' AND handle_class = '" + FJCallMaterialTask.class.getName() + "'", "priority DESC, create_time ASC")
                 .getResultJSONArray(0);
         WQLObject point_table = WQLObject.getWQLObject("sch_base_point");
 
@@ -79,14 +81,13 @@ public class FJCallMaterialTask  extends AbstractAcsTask {
 
             JSONObject point = WQL
                     .getWO("CALL_MATERIAL_TASK")
-                    .addParam("flag", "1")
+                    .addParam("flag", "3")
                     .process()
                     .uniqueResult(0);
 
             if (ObjectUtil.isNotEmpty(point)) {
                 task.put("task_status", TaskStatus.START_AND_END.value());
                 task.put("point_code1", point.getString("point_code"));
-                task.put("material_id", point.getString("material_id"));
                 task.put("vehicle_code", TaskUtils.formatVehicleCode(point.getString("vehicle_code")));
                 task.put("remark", "");
                 task_table.update(task);
@@ -184,6 +185,9 @@ public class FJCallMaterialTask  extends AbstractAcsTask {
             JSONObject point2 = new JSONObject();
             point2.put("lock_type", LockType.UNLOCKED.value());
             point2.put("task_code", "");
+            point2.put("vehicle_type", task.getString("vehicle_type"));
+            point2.put("vehicle_code", task.getString("vehicle_code"));
+            point2.put("point_status", PointStatus.NOT_EMPTY.value());
             if (operation_type == OperationType.AUTO) {
                 TaskUtils.addACSUpdateColum(point2);
             } else if (operation_type == OperationType.MANUAL) {
diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/wql/CALL_MATERIAL_TASK.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/wql/CALL_MATERIAL_TASK.wql
index fe07fe8..ea27da3 100644
--- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/wql/CALL_MATERIAL_TASK.wql
+++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/wql/CALL_MATERIAL_TASK.wql
@@ -77,3 +77,26 @@
             ENDSELECT
 	    ENDQUERY
 	ENDIF
+
+	IF flag = "3"
+        QUERY
+            SELECT
+                point.*
+            FROM
+                sch_base_point point
+                JOIN st_ivt_vehicle_detail vd ON point.vehicle_type = vd.vehicle_type
+                AND point.vehicle_code = vd.vehicle_code
+                AND vd.is_delete = '0'
+                LEFT JOIN pdm_bd_workorder workorder ON vd.workorder_id = workorder.workorder_id
+            WHERE
+                point.is_used = '1'
+                AND point.lock_type = '1'
+                AND point.region_code = 'CPHJ'
+                AND point.point_status = '1'
+                AND point.vehicle_type = '2'
+                AND vd.is_fire = '1'
+            ORDER BY
+                workorder.is_urgent DESC, vd.create_time ASC
+            ENDSELECT
+        ENDQUERY
+    ENDIF
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
index dcc131a..5d9dd27 100644
--- 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
@@ -85,7 +85,11 @@ public class TaskUtils {
     
     public static String formatVehicleCode(String vehicle_code) {
         if (StrUtil.isBlank(vehicle_code)) {
-            return "0000";
+            vehicle_code =  "0000";
+        } else {
+            if (vehicle_code.length() > 4 || vehicle_code.matches("^\\d+$")) {
+                throw new BadRequestException("载具编码错误!");
+            }
         }
 
         StringBuilder vehicle_code_builder = new StringBuilder(vehicle_code);
diff --git a/lms/nladmin-system/src/test/java/org/nl/test/PointTest.java b/lms/nladmin-system/src/test/java/org/nl/test/PointTest.java
index 0f70f58..7247f85 100644
--- a/lms/nladmin-system/src/test/java/org/nl/test/PointTest.java
+++ b/lms/nladmin-system/src/test/java/org/nl/test/PointTest.java
@@ -2,9 +2,11 @@ package org.nl.test;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.IdUtil;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.nl.modules.wql.WQL;
 import org.nl.modules.wql.core.bean.WQLObject;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
@@ -19,23 +21,9 @@ public class PointTest {
 
     @Test
     public void test01() {
-        WQLObject point_table = WQLObject.getWQLObject("sch_base_point");
-
-        JSONObject point = new JSONObject();
-        String now = DateUtil.now();
-        for (int i = 0; i < 52; i++) {
-            point.put("point_id", IdUtil.getSnowflake().nextId());
-            point.put("point_code", "CPHW" + String.format("%02d", i + 1));
-            point.put("point_name", "成品货位" + (i + 1));
-            point.put("region_id", 1643438902574452736L);
-            point.put("region_code", "CPHJ");
-            point.put("region_name", "成品货架");
-            point.put("point_type", "1");
-            point.put("device_code", null);
-            point.put("create_id", 1L);
-            point.put("create_name", "管理员");
-            point.put("create_time", now);
-            point_table.insert(point);
-        }
+        String pattern = "^\\d+$";
+        System.out.println("ddd".matches(pattern));
+        System.out.println("0010".matches(pattern));
+        System.out.println("1232d".matches(pattern));
     }
 }