From 54b4f53323d0833cbac86fd18932c5fa5a5447a8 Mon Sep 17 00:00:00 2001
From: zjj <3272660260@qq.com>
Date: 星期一, 17 二月 2025 14:19:17 +0800
Subject: [PATCH] #移库任务

---
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/MainProcess.java                  |    2 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java |   35 +++++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/MotionTimer.java            |   67 +++++++++++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java        |   85 +++++++++++++++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/TaskMapper.java            |    5 +
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/OpenUtils.java              |   48 +++++++++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/TaskService.java          |    5 +
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/TaskServiceImpl.java |   14 ++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/TaskStsType.java      |    5 +
 zy-asrs-wcs/src/main/resources/mapper/core/TaskMapper.xml                        |   16 +++
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/TaskTimer.java              |    3 
 zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/OpenController.java    |    6 +
 12 files changed, 290 insertions(+), 1 deletions(-)

diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/MainProcess.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/MainProcess.java
index 6f0c851..934ccfd 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/MainProcess.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/MainProcess.java
@@ -55,6 +55,8 @@
                     mainService.analyzeInBoundTask();
                     // 瑙f瀽灏忚溅绉诲姩宸ヤ綔妗�
                     mainService.analyzeMoveTask();
+                    // 瑙f瀽灏忚溅杞借揣绉诲姩宸ヤ綔妗�
+                    mainService.analyzeLadenMoveTask();
                     // 鍑哄簱  ===>> 宸ヤ綔妗d俊鎭啓鍏ed鏄剧ず鍣�
                     mainService.ledExecute();
                     // 鍏朵粬  ===>> LED鏄剧ず鍣ㄥ浣嶏紝鏄剧ず榛樿淇℃伅
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/OpenController.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/OpenController.java
index bb0d670..455181d 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/OpenController.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/controller/OpenController.java
@@ -39,6 +39,12 @@
         return openUtils.createManualTakeTask(param);
     }
 
+    //鐢熸垚杞借揣绉诲姩浠诲姟
+    @PostMapping("/createLadenMoveTakeTask")
+    public R createLadenMoveTakeTask(@RequestBody CreateManualTakeTaskParam param) {
+        return openUtils.createLadenMoveTakeTask(param);
+    }
+
     //鐢熸垚灏忚溅绉诲姩浠诲姟
     @PostMapping("/createMoveTask")
     public R createMoveTask(@RequestBody CreateMoveTaskParam param) {
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java
index e645221..a04b0ba 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/kernel/AnalyzeService.java
@@ -1605,4 +1605,89 @@
         return motionList;
     }
 
+    /**
+     * 鐢熸垚灏忚溅杞借揣杩佺Щ鍔ㄤ綔
+     */
+    public List<Motion> generateShuttleLadenMoveMotion(Task task) {
+        List<Motion> motionList = new ArrayList<>();
+        if (task.getTaskSts() != TaskStsType.NEW_LADEN_MOVE.sts) {
+            return motionList;
+        }
+        //originLoc 婧愬簱浣�
+        String originLoc =  task.getOriginLoc();
+        // locNo 鐩爣搴撲綅
+        String locNo = task.getDestLoc();
+
+        Device shuttleDevice = deviceService.getOne(new LambdaQueryWrapper<Device>()
+                .eq(Device::getDeviceNo, task.getShuttleNo())
+                .eq(Device::getDeviceType, DeviceCtgType.SHUTTLE.val())
+                .eq(Device::getHostId, task.getHostId())
+                .eq(Device::getStatus, 1));
+        if (shuttleDevice == null) {
+            return motionList;
+        }
+
+        ShuttleThread shuttleThread = (ShuttleThread) SlaveConnection.get(SlaveType.Shuttle, shuttleDevice.getId().intValue());
+        if (shuttleThread == null) {
+            return motionList;
+        }
+
+        ShuttleProtocol shuttleProtocol = shuttleThread.getStatus();
+        if (shuttleProtocol == null || shuttleProtocol.getShuttleNo() == null) {
+            return motionList;
+        }
+
+        String shuttleLocNo = shuttleProtocol.getCurrentLocNo();
+
+        // 鍒ゆ柇绌挎杞︽槸鍚﹀湪鐩爣灞�
+        if (Utils.getLev(shuttleLocNo) == Utils.getLev(locNo)) {
+
+            if (!shuttleLocNo.equals(locNo)) {//灏忚溅涓嶅湪鐩爣搴撲綅
+                // 绌挎杞﹁蛋琛岃嚦婧愬簱浣�
+                motionList.addAll(kernelService.shuttleMove(
+                        MotionDto.build((dto -> {
+                            dto.setShuttleNo(shuttleDevice.getId().intValue());
+                            dto.setLocNo(shuttleLocNo);
+                        })),
+                        MotionDto.build((dto -> {
+                            dto.setShuttleNo(shuttleDevice.getId().intValue());
+                            dto.setLocNo(originLoc);
+                        })),
+                        MotionCtgType.SHUTTLE_MOVE
+                ));
+
+                // 绌挎杞﹂《鍗�
+                motionList.add(Motion.build(motion -> {
+                    motion.setDeviceCtg(DeviceCtgType.SHUTTLE.val());
+                    motion.setDevice(String.valueOf(shuttleDevice.getId()));
+                    motion.setMotionCtg(MotionCtgType.SHUTTLE_PALLET_LIFT.val());
+                }));
+
+                // 绌挎杞﹁蛋琛岃嚦鐩爣搴撲綅
+                motionList.addAll(kernelService.shuttleMove(
+                        MotionDto.build((dto -> {
+                            dto.setShuttleNo(shuttleDevice.getId().intValue());
+                            dto.setLocNo(originLoc);
+                        })),
+                        MotionDto.build((dto -> {
+                            dto.setShuttleNo(shuttleDevice.getId().intValue());
+                            dto.setLocNo(locNo);
+                        })),
+                        MotionCtgType.SHUTTLE_MOVE
+                ));
+
+                //绌挎杞︽墭鐩樹笅闄�
+                motionList.add(Motion.build(motion -> {
+                    motion.setDeviceCtg(DeviceCtgType.SHUTTLE.val());
+                    motion.setDevice(String.valueOf(shuttleDevice.getId()));
+                    motion.setMotionCtg(MotionCtgType.SHUTTLE_PALLET_DOWN.val());
+                }));
+
+            }
+
+        } else {
+            //灏忚溅璺ㄥ眰
+        }
+        return motionList;
+    }
 }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/TaskMapper.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/TaskMapper.java
index ec0fd46..8a99bf8 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/TaskMapper.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/mapper/TaskMapper.java
@@ -48,4 +48,9 @@
 
     Task selectChargeWorking(Integer shuttleNo);
 
+    List<Task> selectWaitAnalyzeLadenMoveTask();
+
+    List<Task> selectLadenMoveByAnalyzeSts();
+
+    List<Task> selectLadenMoveByExecuteSts();
 }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/TaskStsType.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/TaskStsType.java
index 405119c..697ba67 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/TaskStsType.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/model/enums/TaskStsType.java
@@ -31,6 +31,11 @@
     ANALYZE_MANUAL(402, "鎵嬪姩浠诲姟瑙f瀽"),
     EXECUTE_MANUAL(403, "鎵ц鎵嬪姩浠诲姟"),
     COMPLETE_MANUAL(410, "鎵嬪姩浠诲姟瀹屾垚"),
+
+    NEW_LADEN_MOVE(501,"鐢熸垚绉诲簱浠诲姟"),
+    ANALYZE_LADEN_MOVE(502, "绉诲簱浠诲姟瑙f瀽"),
+    EXECUTE_LADEN_MOVE(503, "鎵ц绉诲簱浠诲姟"),
+    COMPLETE_LADEN_MOVE(504, "绉诲簱浠诲姟瀹屾垚"),
     ;
 
 
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/TaskService.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/TaskService.java
index fbdde05..0e7fdda 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/TaskService.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/TaskService.java
@@ -46,4 +46,9 @@
 
     Task selectChargeWorking(Integer shuttleNo);
 
+    List<Task> selectWaitAnalyzeLadenMoveTask();
+
+    List<Task> selectLadenMoveByAnalyzeSts();
+
+    List<Task> selectLadenMoveByExecuteSts();
 }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java
index 2b00511..a0abfe3 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java
@@ -1290,4 +1290,39 @@
         }
     }
 
+    // 瑙f瀽灏忚溅杞借揣绉诲姩宸ヤ綔妗�
+    public synchronized void analyzeLadenMoveTask() {
+        for (Task task : taskService.selectWaitAnalyzeLadenMoveTask()) {
+            if (Cools.isEmpty(task.getShuttleNo())) {
+                //鍒嗛厤灏忚溅
+                //鎼滅储绌洪棽杞�
+                ShuttleThread shuttleThread = shuttleDispatcher.searchIdleShuttle(task);
+                if (shuttleThread == null) {
+                    News.info("{}浠诲姟鏈壘鍒扮┖闂茬┛姊溅", task.getTaskNo());
+                    continue;
+                }
+
+                task.setShuttleNo(Integer.valueOf(shuttleThread.getDevice().getDeviceNo()));//淇濆瓨绌挎杞﹀彿
+                task.setUpdateTime(new Date());
+                if (!taskService.updateById(task)) {
+                    News.info("{}浠诲姟鏇存柊绌挎杞﹀彿澶辫触", task.getTaskNo());
+                }
+                continue;
+            }
+
+            // generate motion list
+            List<Motion> motionList = analyzeService.generateShuttleLadenMoveMotion(task);
+            if (motionList.isEmpty()) {
+                continue;
+            }
+            motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()), task.getHostId());
+
+            // 鏇存柊宸ヤ綔涓绘。
+            task.setTaskSts(TaskStsType.ANALYZE_LADEN_MOVE.sts); // 宸ヤ綔鐘舵��
+            task.setUpdateTime(new Date());
+            if (!taskService.updateById(task)) {
+                News.error("鏇存柊宸ヤ綔妗eけ璐ワ紒锛侊紒 [宸ヤ綔鍙凤細{}]", task.getTaskNo());
+            }
+        }
+    }
 }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/TaskServiceImpl.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/TaskServiceImpl.java
index 89b2b24..bc13c7f 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/TaskServiceImpl.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/TaskServiceImpl.java
@@ -140,4 +140,18 @@
     public Task selectChargeWorking(Integer shuttleNo) {
         return this.baseMapper.selectChargeWorking(shuttleNo);
     }
+    @Override
+    public List<Task> selectWaitAnalyzeLadenMoveTask() {
+        return this.baseMapper.selectWaitAnalyzeLadenMoveTask();
+    }
+
+    @Override
+    public List<Task> selectLadenMoveByAnalyzeSts() {
+        return this.baseMapper.selectLadenMoveByAnalyzeSts();
+    }
+
+    @Override
+    public List<Task> selectLadenMoveByExecuteSts() {
+        return this.baseMapper.selectLadenMoveByExecuteSts();
+    }
 }
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/MotionTimer.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/MotionTimer.java
index d81e150..f7ac1cb 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/MotionTimer.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/MotionTimer.java
@@ -245,6 +245,73 @@
     }
 
     @Scheduled(cron = "0/1 * * * * ? ")
+    public synchronized void executeLadenMoveTask() {
+        Date now = new Date();
+        // ANALYZE_CHARGE
+        for (Task taskCharge : taskService.selectLadenMoveByAnalyzeSts()) {
+            Motion executingMotion = motionService.selectOfTop1(taskCharge.getUuid(), MotionStsType.EXECUTING.val(), taskCharge.getHostId());
+            if (executingMotion != null) {//瀛樺湪姝e湪鎵ц鐨刴otion
+                if (executingMotion.getSync() == 1) {//褰撳墠鎵ц涓殑鍔ㄤ綔鏄悓姝ュ姩浣滐紝绛夊緟鎵ц瀹屾垚鍚庡啀鎵ц涓嬩竴涓姩浣�
+                    continue;
+                }
+
+                //寮傛鍔ㄤ綔锛屽彧鍏佽涓嬩竴鏉″姩浣滆鎵ц
+                Motion nextMotion = motionService.getOne(new LambdaQueryWrapper<Motion>().eq(Motion::getUuid, executingMotion.getUuid()).eq(Motion::getPriority, executingMotion.getPriority() - 1));
+                if (nextMotion != null) {
+                    if (!(nextMotion.getMotionSts() == MotionStsType.INIT.val() || nextMotion.getMotionSts() == MotionStsType.WAITING.val())) {
+                        continue;//涓嬩竴鏉″姩浣滃凡缁忚鎵ц锛屼笉鍏佽鍐嶆墽琛屽悗缁姩浣�
+                    }
+                }
+            }
+
+            Motion motion = motionService.selectOfTop1(taskCharge.getUuid(), MotionStsType.INIT.val(), taskCharge.getHostId());
+            if (null != motion) {
+                boolean result = this.executeMotion(motion);
+                if (!result) {
+                    continue;
+                }
+                // 鏇存柊Task
+                switch (TaskStsType.query(taskCharge.getTaskSts())) {
+                    case ANALYZE_LADEN_MOVE:
+                        taskCharge.setTaskSts(TaskStsType.EXECUTE_LADEN_MOVE.sts);
+                        break;
+                }
+                taskCharge.setUpdateTime(now);
+                if (!taskService.updateById(taskCharge)) {
+                    log.error("{}鍏朵粬宸ヤ綔妗f洿鏂扮姸鎬佸け璐ワ紒", taskCharge.getTaskNo());
+                }
+            }
+        }
+        // EXECUTE_CHARGE
+        for (Task taskCharge : taskService.selectLadenMoveByExecuteSts()) {
+            if (!motionService.hasRunningMotion(taskCharge.getUuid(), taskCharge.getHostId())) {
+                Motion motion = motionService.selectOfTop1(taskCharge.getUuid(), MotionStsType.WAITING.val(), taskCharge.getHostId());
+                if (null != motion) {
+                    boolean result = this.executeMotion(motion);
+                    if (!result) {
+                        continue;
+                    }
+                } else {
+                    if (motionService.selectOfTop1(taskCharge.getUuid(), MotionStsType.EXECUTING.val(), taskCharge.getHostId()) != null) {
+                        continue;
+                    }
+
+                    // 鏇存柊Task
+                    switch (TaskStsType.query(taskCharge.getTaskSts())) {
+                        case EXECUTE_LADEN_MOVE:
+                            taskCharge.setTaskSts(TaskStsType.COMPLETE_LADEN_MOVE.sts);
+                            break;
+                    }
+                    taskCharge.setUpdateTime(now);
+                    if (!taskService.updateById(taskCharge)) {
+                        log.error("{}浠栧伐浣滄。鏇存柊鐘舵�佸け璐ワ紒", taskCharge.getTaskNo());
+                    }
+                }
+            }
+        }
+    }
+
+    @Scheduled(cron = "0/1 * * * * ? ")
     public synchronized void executeMoveTask() {
         Date now = new Date();
         // ANALYZE_MOVE
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/TaskTimer.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/TaskTimer.java
index bd25e79..487a6b8 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/TaskTimer.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/timer/TaskTimer.java
@@ -74,7 +74,8 @@
         taskSts.add(TaskStsType.COMPLETE_OUTBOUND.sts);
 //        taskSts.add(TaskStsType.COMPLETE_CHARGE.sts);
 //        taskSts.add(TaskStsType.COMPLETE_MOVE.sts);
-        taskSts.add(TaskStsType.COMPLETE_MANUAL.sts);
+//        taskSts.add(TaskStsType.COMPLETE_MANUAL.sts);
+        taskSts.add(TaskStsType.COMPLETE_LADEN_MOVE.sts);
 
         Dict reportWms = dictService.getOne(new LambdaQueryWrapper<Dict>().eq(Dict::getFlag, "reportWms"));
 
diff --git a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/OpenUtils.java b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/OpenUtils.java
index a666960..e5b014c 100644
--- a/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/OpenUtils.java
+++ b/zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/utils/OpenUtils.java
@@ -435,4 +435,52 @@
         return R.ok();
     }
 
+    public R createLadenMoveTakeTask(CreateManualTakeTaskParam param) {
+        //鑾峰彇鎵嬪姩浠诲姟绫诲瀷
+        TaskCtg taskCtg = taskCtgService.getOne(new LambdaQueryWrapper<TaskCtg>()
+                .eq(TaskCtg::getFlag, String.valueOf(TaskCtgType.MOVE))
+                .eq(TaskCtg::getStatus, 1));
+        if (taskCtg == null) {
+            return R.error("浠诲姟绫诲瀷寮傚父");
+        }
+
+        Task one = taskService.getOne(new LambdaQueryWrapper<Task>()
+                .eq(Task::getTaskCtg, taskCtg.getId())
+                .eq(Task::getOriginLoc, param.getOriginLoc())
+                .eq(Task::getDestLoc, param.getDestLoc()));
+        if (one != null) {
+            return R.error("浠诲姟宸插瓨鍦�");
+        }
+
+        //浼樺厛绾�
+        Integer priority = 10;
+        if (param.getPriority() != null) {
+            priority = param.getPriority();
+        }
+
+        Task task = new Task();
+        task.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
+        task.setTaskNo(String.valueOf(Utils.getTaskNo("OUT")));
+        task.setWmsTaskNo(param.getTaskNo());
+        task.setTaskSts(TaskStsType.NEW_LADEN_MOVE.sts);
+        task.setTaskCtg(taskCtg.getId());
+        task.setPriority(priority);
+        task.setOriginSite(null);
+        task.setOriginLoc(param.getOriginLoc());//婧愬簱浣�
+        task.setDestSite(null);
+        task.setDestLoc(param.getDestLoc());//鐩爣搴撲綅
+        task.setIoTime(new Date());
+        task.setStartTime(new Date());
+        task.setStatus(1);
+        task.setMemo("");
+        task.setShuttleNo(null);//绛夊緟涓荤嚎绋嬪垎閰嶅皬杞�
+        task.setRecordLoc(param.getRecord() ? "Y" : "N");//璁板綍搴撳瓨淇℃伅
+        task.setHostId(1L);//涓存椂鎺у埗鍙厑璁竓ost涓�1
+
+        boolean result = taskService.save(task);
+        if (!result) {
+            return R.error("鐢熸垚鎵嬪姩鍙栨斁璐т换鍔″け璐ワ紒");
+        }
+        return R.ok();
+    }
 }
diff --git a/zy-asrs-wcs/src/main/resources/mapper/core/TaskMapper.xml b/zy-asrs-wcs/src/main/resources/mapper/core/TaskMapper.xml
index 33b6eef..75256bc 100644
--- a/zy-asrs-wcs/src/main/resources/mapper/core/TaskMapper.xml
+++ b/zy-asrs-wcs/src/main/resources/mapper/core/TaskMapper.xml
@@ -129,5 +129,21 @@
         and shuttle_no = #{shuttleNo}
         order by priority desc,start_time,task_no asc
     </select>
+    <select id="selectWaitAnalyzeLadenMoveTask" resultType="com.zy.asrs.wcs.core.entity.Task">
+        select * from wcs_task where task_sts = 501
+        order by priority desc,start_time,task_no asc
+    </select>
+    <select id="selectLadenMoveByAnalyzeSts" resultType="com.zy.asrs.wcs.core.entity.Task">
+        select * from wcs_task
+        where 1=1
+          and task_sts in (502)
+        order by priority desc,start_time,task_no asc
+    </select>
 
+    <select id="selectLadenMoveByExecuteSts" resultType="com.zy.asrs.wcs.core.entity.Task">
+        select * from wcs_task
+        where 1=1
+          and task_sts in (503)
+        order by priority desc,start_time,task_no asc
+    </select>
 </mapper>

--
Gitblit v1.9.1