Ver Fonte

代码优化

zgg há 42 minutos atrás
pai
commit
cfe8a6b0f5

+ 188 - 222
application/admin/controller/Orders.php

@@ -1367,12 +1367,13 @@ class Orders extends Auth {
                 ->group('to_user_id')
                 ->select();
             $taskCountMap = array_column($taskCounts, null, 'to_user_id');
-            $addrInfo = Db::name('order_convey')
-                ->alias('cpr')
-                ->join('todo os', 'cpr.order_id = os.order_id')
-                ->field('os.to_user_id, os.todo_mode, cpr.end,cpr.start,os.create_time')
+            $addrInfo = Db::name('todo')
+                ->alias('os')
+                ->join('order_convey cpr', 'cpr.order_id = os.order_id', 'LEFT')
+                ->field('os.to_user_id, os.todo_mode, cpr.end, cpr.start, os.create_time')
                 ->where('os.to_user_id', 'in', $userIds)
                 ->where('os.del', 0)
+                ->whereBetween('os.create_time', [date('Y-m-d 00:00:00', strtotime('-7 days')), date('Y-m-d 23:59:59')])
                 ->select();
             unset($userIds,$taskCounts);
             $addrMap = [];
@@ -1625,238 +1626,203 @@ class Orders extends Auth {
                 ->where($map)
                 ->order(['o.order_mode' => 'asc', 'oc.xq_time' => 'desc'])
                 ->select();
-//            halt($lists);
-            $newret = [];
-            $newret1 = [];
-            $newret2 = [];
-            $newret3 = [];
-            $newret4 = [];
-            foreach ($lists as $k => $v) {
-                $v = $this->model->formatOrder($v);
-
-                $v['bed_number'] = '';
-                $ocp = Db::name('order_convey_patient')
-                    ->where('order_id', $v['id'])
-                    ->find();
-                $v['bed_number'] = !empty($ocp)?$ocp['bed_number']:'';
-
-                $todo = Db::name('todo')
-                    ->alias('t')
-                    ->where('t.order_id', $v['id'])
-                    ->join('user u', 'u.id = t.to_user_id')
-                    ->where('t.todo_mode', 'in', [1, 2, 3, 4])
-                    ->where('t.del', 0)
-                    ->field('u.real_name,u.mobile,t.create_time,t.confirm_time')
-                    ->order('t.id asc')
-                    ->select();
-                $users = [];
-                $confirmtime = '';
-                foreach ($todo as $kk => $vv) {
-                    $users[] = $vv['real_name'].($vv['mobile']?'['.$vv['mobile'].']':'');
-                    if (!$confirmtime && $vv['confirm_time']) {
-                        $confirmtime = $vv['confirm_time'];
-                    }
-                    else {
-                        if ($confirmtime && $vv['confirm_time'] && $vv['confirm_time'] < $confirmtime) {
-                            $confirmtime = $vv['confirm_time'];
-                        }
-                    }
-                }
-                $v['is_todo'] = $todo?1:0;
-                $v['real_names'] = implode(',', $users);
-                $v['confirm_time'] = $confirmtime;
-
-
-
-                $last = strtotime($v['ywc_time']) - time();
-                $v['last_time'] = $last > 0 ? round($last / 60) : 0;
-                //是否有延时
-                $v['delay'] = 0; // 0=未延迟 1=延迟
-                $v['delay_diff'] = 0;
-                $v['delay_reason'] = '';
-                $delays = Db::name('order_delay')
-                    ->where('order_id', $v['id'])
-                    ->select();
-                $delays = $delays ? $delays : [];
-                foreach ($delays as $vv) {
-                    if ($vv['status'] == 0) {
-                        $v['delay'] = 1;
-                        $v['delay_reason'] = $this->gettablefield('delay_reason', ['id' => $vv['delay_reason_id']], 'title');
-                        $vv['diff'] = time() - strtotime($vv['start_time']);
-                    }
-                    $v['delay_diff'] += $vv['diff'];
-                }
-                $v['delay_diff'] = round($v['delay_diff'] / 60);
-                if ($v['delay'] == 1) {
-                    $v['status'] = 3;
-                } else {
-                    if ($v['order_mode'] == 1) {
-                        $v['status'] = 1;
-                    } else {
-                        $v['status'] = 2;
-                    }
-                }
-                $convey = Db::name('convey_cate')
-                    ->alias('oc')
-                    ->join('time ot', 'ot.id = oc.time_id')
-                    ->where('oc.id', $v['type'])
-                    ->field('ot.*')
-                    ->find();
-                $xqtime = strtotime($v['xq_time']);
-                $curtime = time();
-                if ($curtime > $xqtime) {
-                    $ct = round(($curtime - $xqtime) / 60);
-                    if ($ct < $convey['yy_time']) {
-                        $ss = 0;
-                    }
-                    else {
-                        if ($ct >= $convey['yy_time'] && $ct < $convey['bz_time']) {
-                            $ss = 1;
-                        }
-                        else {
-                            if ($ct >= $convey['bz_time'] && $ct < $convey['jg_time']) {
-                                $ss = 2;
-                            }
-                            else {
-                                if ($ct >= $convey['jg_time'] && $ct < $convey['wjjg_time']) {
-                                    $ss = 3;
-                                }
-                                else {
-                                    $ss = 4;
-                                }
-                            }
-                        }
-                    }
-                }else{
-                    $ss = 0;
-                }
-
-                $v['ss'] = $ss;
-                $v['xtime'] = date('H:i', strtotime($v['xq_time']));
-                $v['stime'] = $v['send_time'] ? date('H:i', strtotime($v['send_time'])) : "";
-                $v['ctime'] = $v['confirm_time'] ? date('H:i', strtotime($v['confirm_time'])) : "";
-                $v['starttime'] = '';
-                if($v['confirm_time']){ // 如果确认时间不为空
-                    $todoconvey = Db::name('todo_convey')
-                        ->alias('a')
-                        ->join('todo t','t.id = a.todo_id')
-                        ->where('t.order_id', $v['id'])
-                        ->field('a.*')
-                        ->order('a.id asc')
-                        ->find();
-                    if($todoconvey){
-                        $v['starttime'] = date('H:i', strtotime($todoconvey['start_time']));
-                    }
-                }
-
-                $v['priorityName'] = isset($this->model->priority[$v['priority']])?$this->model->priority[$v['priority']]:'';
-                if ($status == 3 && $v['delay'] == 1) { //延时任务
-                    $newret[] = $v;
-                    $newret1[] = $v;
-                }
-                if ($status == 1 && $v['order_mode'] == 1) { //新任务
-                    $newret[] = $v;
-                    $newret2[] = $v;
-                }
-                if ($status == 2 && $v['order_mode'] == 4) { // 进行中
-                    $newret[] = $v;
-                    $newret3[] = $v;
-                }
-                if (!$status || !in_array($status, [1, 2, 3])) {
-                    $newret[] = $v;
-                    $newret4[] = $v;
-                }
-                $lists[$k] = $v;
-            }
-            if(!empty($newret)){
-                //$newret = arraySequence($newret,'status');//返回数组中指定的一列
-//                $newret1 = $newret1?arraySequence($newret1,'xtime','SORT_DESC'):[];
-//                $newret3 = $newret3?arraySequence($newret3,'xtime','SORT_DESC'):[];
-//                $newret4 = $newret4?arraySequence($newret4,'xtime','SORT_DESC'):[];
-//                $newret = array_merge($newret2,$newret3,$newret4,$newret1);
-                $all = [];
-                $newret2 = $newret2?arraySequence($newret2,'status'):[];
-                $newret3 = $newret3?arraySequence($newret3,'status'):[];
-                //$newret4 = $newret4?arraySequence($newret4,'status'):[];
-                $newret1 = $newret1?arraySequence($newret1,'status'):[];
-
-                $newret2 = $newret2?arraySequence($newret2,'xtime','SORT_DESC'):[];
-                $newret3 = $newret3?arraySequence($newret3,'xtime','SORT_DESC'):[];
-              //  $newret4 = $newret4?arraySequence($newret4,'xtime','SORT_DESC'):[];
-                $newret1 = $newret1?arraySequence($newret1,'xtime','SORT_DESC'):[];
 
-                foreach ($newret2 as $k=>$v){
-                    $all[] = $v;
-                }
-                foreach ($newret3 as $k=>$v){
-                    $all[] = $v;
-                }
-                foreach ($newret1 as $k=>$v){
-                    $all[] = $v;
-                }
+            list($newret,$newret1,$newret2,$newret3,$newret4) = $this->model->formatOrderConvey($lists,$status);
+//            foreach ($lists as $k => $v) {
+//                $v = $this->model->formatOrder($v);
+//
+//                $v['bed_number'] = '';
+//                $ocp = Db::name('order_convey_patient')
+//                    ->where('order_id', $v['id'])
+//                    ->find();
+//                $v['bed_number'] = !empty($ocp)?$ocp['bed_number']:'';
+//
+//                $todo = Db::name('todo')
+//                    ->alias('t')
+//                    ->where('t.order_id', $v['id'])
+//                    ->join('user u', 'u.id = t.to_user_id')
+//                    ->where('t.todo_mode', 'in', [1, 2, 3, 4])
+//                    ->where('t.del', 0)
+//                    ->field('u.real_name,u.mobile,t.create_time,t.confirm_time')
+//                    ->order('t.id asc')
+//                    ->select();
+//                $users = [];
+//                $confirmtime = '';
+//                foreach ($todo as $kk => $vv) {
+//                    $users[] = $vv['real_name'].($vv['mobile']?'['.$vv['mobile'].']':'');
+//                    if (!$confirmtime && $vv['confirm_time']) {
+//                        $confirmtime = $vv['confirm_time'];
+//                    }
+//                    else {
+//                        if ($confirmtime && $vv['confirm_time'] && $vv['confirm_time'] < $confirmtime) {
+//                            $confirmtime = $vv['confirm_time'];
+//                        }
+//                    }
+//                }
+//                $v['is_todo'] = $todo?1:0;
+//                $v['real_names'] = implode(',', $users);
+//                $v['confirm_time'] = $confirmtime;
+//
+//
+//
+//                $last = strtotime($v['ywc_time']) - time();
+//                $v['last_time'] = $last > 0 ? round($last / 60) : 0;
+//                //是否有延时
+//                $v['delay'] = 0; // 0=未延迟 1=延迟
+//                $v['delay_diff'] = 0;
+//                $v['delay_reason'] = '';
+//                $delays = Db::name('order_delay')
+//                    ->where('order_id', $v['id'])
+//                    ->select();
+//                $delays = $delays ? $delays : [];
+//                foreach ($delays as $vv) {
+//                    if ($vv['status'] == 0) {
+//                        $v['delay'] = 1;
+//                        $v['delay_reason'] = $this->gettablefield('delay_reason', ['id' => $vv['delay_reason_id']], 'title');
+//                        $vv['diff'] = time() - strtotime($vv['start_time']);
+//                    }
+//                    $v['delay_diff'] += $vv['diff'];
+//                }
+//                $v['delay_diff'] = round($v['delay_diff'] / 60);
+//                if ($v['delay'] == 1) {
+//                    $v['status'] = 3;
+//                } else {
+//                    if ($v['order_mode'] == 1) {
+//                        $v['status'] = 1;
+//                    } else {
+//                        $v['status'] = 2;
+//                    }
+//                }
+//                $convey = Db::name('convey_cate')
+//                    ->alias('oc')
+//                    ->join('time ot', 'ot.id = oc.time_id')
+//                    ->where('oc.id', $v['type'])
+//                    ->field('ot.*')
+//                    ->find();
+//                $xqtime = strtotime($v['xq_time']);
+//                $curtime = time();
+//                if ($curtime > $xqtime) {
+//                    $ct = round(($curtime - $xqtime) / 60);
+//                    if ($ct < $convey['yy_time']) {
+//                        $ss = 0;
+//                    }
+//                    else {
+//                        if ($ct >= $convey['yy_time'] && $ct < $convey['bz_time']) {
+//                            $ss = 1;
+//                        }
+//                        else {
+//                            if ($ct >= $convey['bz_time'] && $ct < $convey['jg_time']) {
+//                                $ss = 2;
+//                            }
+//                            else {
+//                                if ($ct >= $convey['jg_time'] && $ct < $convey['wjjg_time']) {
+//                                    $ss = 3;
+//                                }
+//                                else {
+//                                    $ss = 4;
+//                                }
+//                            }
+//                        }
+//                    }
+//                }else{
+//                    $ss = 0;
+//                }
+//
+//                $v['ss'] = $ss;
+//                $v['xtime'] = date('H:i', strtotime($v['xq_time']));
+//                $v['stime'] = $v['send_time'] ? date('H:i', strtotime($v['send_time'])) : "";
+//                $v['ctime'] = $v['confirm_time'] ? date('H:i', strtotime($v['confirm_time'])) : "";
+//                $v['starttime'] = '';
+//                if($v['confirm_time']){ // 如果确认时间不为空
+//                    $todoconvey = Db::name('todo_convey')
+//                        ->alias('a')
+//                        ->join('todo t','t.id = a.todo_id')
+//                        ->where('t.order_id', $v['id'])
+//                        ->field('a.*')
+//                        ->order('a.id asc')
+//                        ->find();
+//                    if($todoconvey){
+//                        $v['starttime'] = date('H:i', strtotime($todoconvey['start_time']));
+//                    }
+//                }
+//
+//                $v['priorityName'] = isset($this->model->priority[$v['priority']])?$this->model->priority[$v['priority']]:'';
+//                if ($status == 3 && $v['delay'] == 1) { //延时任务
+//                    $newret[] = $v;
+//                    $newret1[] = $v;
+//                }
+//                if ($status == 1 && $v['order_mode'] == 1) { //新任务
+//                    $newret[] = $v;
+//                    $newret2[] = $v;
+//                }
+//                if ($status == 2 && $v['order_mode'] == 4) { // 进行中
+//                    $newret[] = $v;
+//                    $newret3[] = $v;
+//                }
+//                if (!$status || !in_array($status, [1, 2, 3])) {
+//                    $newret[] = $v;
+//                    $newret4[] = $v;
+//                }
+//                $lists[$k] = $v;
+//            }
+            if (!empty($newret)) {
+                $curtime   = time();
+                $curtime15 = $curtime + 60 * 15;
+                $limitTime = date('Y-m-d H:i:s', $curtime15);
+
+                // 1. 各分组先按 status 升序,再按 xtime 降序(一次 sort 搞定,用 arraySequence 两次是历史写法)
+                $sortFn = function ($list) {
+                    if (!$list) return [];
+                    $list = arraySequence($list, 'status');          // 先按 status 升序
+                    $list = arraySequence($list, 'xtime', 'SORT_DESC'); // 再按 xtime 降序(稳定排序,保持 status 分组)
+                    return $list;
+                };
+
+                $newret2 = $sortFn($newret2);
+                $newret3 = $sortFn($newret3);
+                $newret1 = $sortFn($newret1);
+
+                // 2. 合并主列表
+                $all = array_merge($newret2, $newret3, $newret1);
+
+                // 3. newret4 按 status 拆成三组,统一走同样的过滤逻辑
                 $a1 = $a2 = $a3 = [];
-                foreach ($newret4 as $k=>$v){
-                    if ($v['status'] == 3) { //延时任务
-                        $a1[] = $v;
-                    }
-                    if ($v['status'] == 1) { //新任务
-                        $a2[] = $v;
-                    }
-                    if ($v['status'] == 2) { // 进行中
-                        $a3[] = $v;
-                    }
-
+                foreach ($newret4 as $v) {
+                    if ($v['status'] == 3)      $a1[] = $v; // 延时任务
+                    elseif ($v['status'] == 1)  $a2[] = $v; // 新任务
+                    elseif ($v['status'] == 2)  $a3[] = $v; // 进行中
                 }
-                $a1 = $a1?arraySequence($a1,'status'):[];
-                $a2 = $a2?arraySequence($a2,'status'):[];
-                $a3 = $a3?arraySequence($a3,'status'):[];
-
-                $a1 = $a1?arraySequence($a1,'xtime','SORT_DESC'):[];
-                $a2 = $a2?arraySequence($a2,'xtime','SORT_DESC'):[];
-                $a3 = $a3?arraySequence($a3,'xtime','SORT_DESC'):[];
-
-                // 预约类型-取15分钟后之前的订单
-                $curtime15 = $curtime+60*15;
 
-                foreach ($a2 as $k=>$v){
+                // 4. 三组合并后统一排序 + 统一过滤(priority != 4 且 xq_time < 15分钟后)
+                $a = array_merge($a2, $a3, $a1);   // 保持 新任务 → 进行中 → 延时 的顺序
+                $a = $sortFn($a);
 
-                    if($v['priority'] !=4 && $v['xq_time'] < date('Y-m-d H:i:s',$curtime15) ){
-                        $all[] = $v;
-                    }
-
-                }
-                foreach ($a3 as $k=>$v){
-                    if($v['priority'] !=4 && $v['xq_time'] < date('Y-m-d H:i:s',$curtime15) ){
+                foreach ($a as $v) {
+                    if ($v['priority'] != 4 && $v['xq_time'] < $limitTime) {
                         $all[] = $v;
                     }
                 }
-                foreach ($a1 as $k=>$v){
-                    if($v['priority'] !=4 && $v['xq_time'] < date('Y-m-d H:i:s',$curtime15) ){
-                        $all[] = $v;
-                    }
-                }
-                $newret= $all;
+
+                $newret = $all;
             }
             $sdd[] =['org_id','=',$this->orgId];
             $sdd[] =['del','=',0];
             $sdd[] =['work_type_mode','=',3];
             $sdd[] =['create_yyyymmdd','=',date('Ymd')];
-            $dcl = Db::name('orders')
-                ->where($sdd)
-                ->where('order_mode',1)
-                ->count();
-            $ypf = Db::name('orders')
-                ->where($sdd)
-                ->where('order_mode',4)
-                ->count();
-            $ywc = Db::name('orders')
+            $stat = Db::name('orders')
                 ->where($sdd)
-                ->where('order_mode','in',[5,6])
-                ->count();
-            $yqx = Db::name('orders')
-                ->where($sdd)
-                ->where('order_mode','in',[2,3])
-                ->count();
+                ->field("
+        SUM(CASE WHEN order_mode = 1 THEN 1 ELSE 0 END) AS dcl,
+        SUM(CASE WHEN order_mode = 4 THEN 1 ELSE 0 END) AS ypf,
+        SUM(CASE WHEN order_mode IN (5,6) THEN 1 ELSE 0 END) AS ywc,
+        SUM(CASE WHEN order_mode IN (2,3) THEN 1 ELSE 0 END) AS yqx
+    ")
+                ->find();
+
+            $dcl = (int)($stat['dcl'] ?? 0);
+            $ypf = (int)($stat['ypf'] ?? 0);
+            $ywc = (int)($stat['ywc'] ?? 0);
+            $yqx = (int)($stat['yqx'] ?? 0);
             //数据返回
             $totalCount = count($newret);
             $totalPage = ceil($totalCount / $length);

+ 1 - 1
application/admin/view/common/login.html

@@ -121,7 +121,7 @@
 </div>-->
 <div class="copyright-text" style="color: #ffffff;">
 <!--    Copyright © 2023 明德智慧医院后勤一站式服务平台 版权所有-->
-    备案号: <a href="https://beian.miit.gov.cn"><span style="color: #ffffff;">湘ICP备2021008204号-1</span></a>
+    备案号: <a target="_blank" href="https://beian.miit.gov.cn"><span style="color: #ffffff;">湘ICP备2021008204号</span></a>
 </div>
 <script src="/static/hplus/js/jquery.min.js?v=2.1.4"></script>
 <script src="/static/hplus/js/bootstrap.min.js?v=3.3.7"></script>

+ 250 - 0
application/common/model/Orders.php

@@ -733,6 +733,256 @@ class Orders extends Base {
 
 
     }
+
+    public function formatOrderConvey($lists, $status = 0, $is_list = 0) {
+        $newret  = [];
+        $newret1 = [];
+        $newret2 = [];
+        $newret3 = [];
+        $newret4 = [];
+
+        if (empty($lists)) {
+            return [$newret, $newret1, $newret2, $newret3, $newret4];
+        }
+
+        // 只处理 work_type_mode = 3 的订单
+        $orders = [];
+        foreach ($lists as $v) {
+            if (isset($v['work_type_mode']) && $v['work_type_mode'] == 3) {
+                $orders[$v['id']] = $v;
+            }
+        }
+        if (empty($orders)) {
+            foreach ($lists as $v) {
+                $this->classifyOrder($v, $status, $newret, $newret1, $newret2, $newret3, $newret4);
+            }
+            return [$newret, $newret1, $newret2, $newret3, $newret4];
+        }
+
+        $orderIds = array_keys($orders);
+        $now = time();
+
+        // ===== 1. order_convey(一次) =====
+        $orderConveys = Db::name('order_convey')->whereIn('order_id', $orderIds)->select();
+        $orderConveyMap = [];
+        $deviceIds = [];
+        $addressIds = [];
+        foreach ($orderConveys as $oc) {
+            $orderConveyMap[$oc['order_id']] = $oc;
+            $deviceIds[]  = $oc['device_id'];
+            $addressIds[] = $oc['start'];
+            $addressIds[] = $oc['end'];
+        }
+
+        // ===== 2. convey_cate + time(一次) =====
+        $typeIds = array_column($orders, 'type');
+        foreach ($orderConveys as $oc) {
+            $typeIds[] = $oc['type'];
+        }
+        $typeIds = array_unique(array_filter($typeIds));
+        $conveyMap = [];
+        if ($typeIds) {
+            $conveyMap = Db::name('convey_cate')
+                ->alias('c')
+                ->join('time t', 't.id=c.time_id')
+                ->whereIn('c.id', $typeIds)
+                ->field('c.id,c.cate,c.title,t.yy_time,t.bz_time,t.jg_time,t.wjjg_time')
+                ->column('c.id,c.cate,c.title,t.yy_time,t.bz_time,t.jg_time,t.wjjg_time', 'c.id');
+        }
+
+        // ===== 3. address(一次) =====
+        $addressIds = array_unique(array_filter($addressIds));
+        $addressMap = $addressIds
+            ? Db::name('address')->whereIn('id', $addressIds)->column('title', 'id')
+            : [];
+
+        // ===== 4. convey_device(一次) =====
+        $deviceIds = array_unique(array_filter($deviceIds));
+        $deviceMap = $deviceIds
+            ? Db::name('convey_device')->whereIn('id', $deviceIds)->column('title', 'id')
+            : [];
+
+        // ===== 6. todo + user(一次) =====
+        $todos = Db::name('todo')
+            ->alias('t')
+            ->join('user u', 'u.id=t.to_user_id')
+            ->whereIn('t.order_id', $orderIds)
+            ->where('t.todo_mode', 'in', [1, 2, 3, 4])
+            ->where('t.del', 0)
+            ->field('t.id,t.order_id,u.real_name,u.mobile,t.confirm_time')
+            ->order('t.id asc')
+            ->select();
+        $todoGroup = [];
+        $todoIds = [];
+        foreach ($todos as $t) {
+            $todoGroup[$t['order_id']][] = $t;
+            $todoIds[] = $t['id'];
+        }
+
+        // ===== 7. todo_convey start_time(一次) =====
+        $startTimeMap = $todoIds
+            ? Db::name('todo_convey')->whereIn('todo_id', $todoIds)->column('start_time', 'todo_id')
+            : [];
+
+        // ===== 8. order_delay(一次) =====
+//        $orderDelays = Db::name('order_delay')->whereIn('order_id', $orderIds)->select();
+//        $delayGroup = [];
+//        $delayReasonIds = [];
+//        foreach ($orderDelays as $d) {
+//            $delayGroup[$d['order_id']][] = $d;
+//            if ($d['status'] == 0) {
+//                $delayReasonIds[] = $d['delay_reason_id'];
+//            }
+//        }
+//        $delayReasonIds = array_unique(array_filter($delayReasonIds));
+//        $delayReasonMap = $delayReasonIds
+//            ? Db::name('delay_reason')->whereIn('id', $delayReasonIds)->column('title', 'id')
+//            : [];
+
+        // ===== 9. 床号(一次) =====
+        $bedMap = Db::name('order_convey_patient')->whereIn('order_id', $orderIds)->column('bed_number', 'order_id');
+
+        // ===== 10. 用户(一次,real_name + mobile) =====
+        $userRows = Db::name('user')
+            ->whereIn('id', array_unique(array_filter(array_column($lists, 'user_id'))))
+            ->field('id,real_name')
+            ->select();
+        $userMap = array_column($userRows, null, 'id');
+        $priority = $this->priority ?? [];
+
+
+        // ===== 循环内纯内存组装 + 分类 =====
+        foreach ($orders as $id => $v) {
+            $oc     = $orderConveyMap[$id] ?? [];
+            $convey = $conveyMap[$v['type']] ?? ($conveyMap[$oc['type'] ?? 0] ?? []);
+
+            // ---- 基础字段 ----
+            $v['type_name']   = $convey['title'] ?? '';
+            $v['start_name']  = $addressMap[$oc['start'] ?? 0] ?? '';
+            $v['end_name']    = $addressMap[$oc['end'] ?? 0] ?? '';
+            $v['device_name'] = $deviceMap[$oc['device_id'] ?? 0] ?? '';
+            $v['real_name']   = $userMap[$v['user_id']]['real_name'] ?? '';
+            $v['priorityName']  = $priority[$v['priority']] ?? '';
+
+
+            // ---- last_time ----
+            $last = strtotime($v['ywc_time']) - $now;
+            $v['last_time'] = $last > 0 ? round($last / 60) : 0;
+
+            // ---- todo 汇总 ----
+            $todo = $todoGroup[$id] ?? [];
+            $usersArr = [];
+            $confirmtime = '';
+            foreach ($todo as $t) {
+                $usersArr[] = $t['real_name'] . (!empty($t['mobile']) ? '[' . $t['mobile'] . ']' : '');
+                if ($t['confirm_time']) {
+                    if (!$confirmtime || $t['confirm_time'] < $confirmtime) {
+                        $confirmtime = $t['confirm_time'];
+                    }
+                }
+            }
+            $v['is_todo']      = $todo ? 1 : 0;
+            $v['real_names']   = implode(',', $usersArr);
+            $v['confirm_time'] = $confirmtime;
+
+            // ---- start_time(第一个 todo 的 todo_convey.start_time)----
+            $firstTodoId = $todo[0]['id'] ?? 0;
+            $startTime   = $startTimeMap[$firstTodoId] ?? '';
+            $v['start_time'] = $startTime ? date('H:i', strtotime($startTime)) : '';
+            // 兼容原 foreach 的字段名
+            $v['starttime'] = $v['start_time'];
+
+            // ---- delay ----
+            $v['delay'] = 0;
+            $v['delay_diff'] = 0;
+            $v['delay_reason'] = '';
+//            foreach (($delayGroup[$id] ?? []) as $d) {
+//                $diff = $now - strtotime($d['start_time']);
+//                if ($d['status'] == 0) {
+//                    $v['delay'] = 1;
+//                    $v['delay_reason'] = $delayReasonMap[$d['delay_reason_id']] ?? '';
+//                }
+//                $v['delay_diff'] += $diff;
+//            }
+//            $v['delay_diff'] = round($v['delay_diff'] / 60);
+
+            // ---- status(与原 foreach 完全一致)----
+            if ($v['delay'] == 1) {
+                $v['status'] = 3;
+            } else {
+                $v['status'] = ($v['order_mode'] == 1) ? 1 : 2;
+            }
+
+            // ---- ss(按原 foreach:基于 xq_time,且 curtime > xqtime 才分段)----
+            $xqtime  = strtotime($v['xq_time']);
+            $curtime = time();
+            if ($curtime > $xqtime) {
+                $ct = round(($curtime - $xqtime) / 60);
+                if ($ct < ($convey['yy_time'] ?? 0)) {
+                    $ss = 0;
+                } elseif ($ct < ($convey['bz_time'] ?? 0)) {
+                    $ss = 1;
+                } elseif ($ct < ($convey['jg_time'] ?? 0)) {
+                    $ss = 2;
+                } elseif ($ct < ($convey['wjjg_time'] ?? 0)) {
+                    $ss = 3;
+                } else {
+                    $ss = 4;
+                }
+            } else {
+                $ss = 0;
+            }
+            $v['ss'] = $ss;
+
+            // ---- 时间展示 ----
+            $v['xtime'] = date('H:i', strtotime($v['xq_time']));
+            $v['stime'] = $v['send_time'] ? date('H:i', strtotime($v['send_time'])) : '';
+            $v['ctime'] = $confirmtime ? date('H:i', strtotime($confirmtime)) : '';
+
+            // ---- 床号(cate=1 才取)----
+            $v['bed_number'] = (($convey['cate'] ?? 0) == 1) ? ($bedMap[$id] ?? '') : '';
+
+            $orders[$id] = $v;
+
+            // ---- 分类(用入参 $status,与原 foreach 一致)----
+            $this->classifyOrder($v, $status, $newret, $newret1, $newret2, $newret3, $newret4);
+        }
+
+        // 非 work_type_mode=3 的数据按原字段分类(混合场景兜底)
+        foreach ($lists as $v) {
+            if (!isset($orders[$v['id']])) {
+                $this->classifyOrder($v, $status, $newret, $newret1, $newret2, $newret3, $newret4);
+            }
+        }
+
+        return [$newret, $newret1, $newret2, $newret3, $newret4];
+    }
+    private function classifyOrder($v, $status, &$newret, &$newret1, &$newret2, &$newret3, &$newret4) {
+        $delay     = $v['delay'] ?? 0;
+        $orderMode = $v['order_mode'] ?? 0;
+
+        // 延时任务
+        if ($status == 3 && $delay == 1) {
+            $newret[]  = $v;
+            $newret1[] = $v;
+        }
+        // 新任务
+        if ($status == 1 && $orderMode == 1) {
+            $newret[]  = $v;
+            $newret2[] = $v;
+        }
+        // 进行中
+        if ($status == 2 && $orderMode == 4) {
+            $newret[]  = $v;
+            $newret3[] = $v;
+        }
+        // 其他
+        if (!$status || !in_array($status, [1, 2, 3])) {
+            $newret[]  = $v;
+            $newret4[] = $v;
+        }
+    }
+
     //后台格式化订单详情
     public function formatOrder($v, $is_list = 0) {
         $v['order_type'] = '';