瀏覽代碼

Merge remote-tracking branch 'origin/master'

fang 1 年之前
父節點
當前提交
f82395f8b4

+ 2 - 0
app/adminapi/controller/works/ServiceWorkController.php

@@ -18,6 +18,7 @@ namespace app\adminapi\controller\works;
 
 use app\adminapi\controller\BaseAdminController;
 use app\adminapi\lists\works\ServiceWorkLists;
+use app\adminapi\logic\equity\UserEquityLogic;
 use app\adminapi\logic\master_worker\MasterWorkerLogic;
 use app\adminapi\logic\works\ServiceWorkLogic;
 use app\adminapi\validate\works\ServiceWorkValidate;
@@ -138,6 +139,7 @@ class ServiceWorkController extends BaseAdminController
         $params = (new ServiceWorkValidate())->post()->goCheck('detail');
         $result = ServiceWorkLogic::cancel($params);
         if (true === $result) {
+            UserEquityLogic::cancelServiceWorkRestoredNumber($params);
             return $this->success('取消工单成功!', [], 1, 1);
         }
         return $this->fail(ServiceWorkLogic::getError());

+ 4 - 1
app/adminapi/lists/master_worker/MasterWorkerLists.php

@@ -36,6 +36,7 @@ class MasterWorkerLists extends BaseAdminDataLists implements ListsSearchInterfa
     public $range = 0;
     public $lon = 0;
     public $lat = 0;
+    public $service_area_id = 0;
     //所有派单限制条件: 工程师保护期  工程师可用金额限制(除去保护期工程师)     工程师接单状态   订单产品分类  订单坐标筛选    订单坐标距离排序
     /**
      * @notes 设置搜索条件
@@ -128,9 +129,10 @@ class MasterWorkerLists extends BaseAdminDataLists implements ListsSearchInterfa
             $where[] =[ 'mw.work_total','<= ',$this->params['max_work_number']];
         }
         if(isset($this->params['order_id']) && $this->params['order_id']){
-            $lon_lat = (ServiceWork::where('id',$this->params['order_id'])->column("lon,lat,goods_category_id"))[0];
+            $lon_lat = (ServiceWork::where('id',$this->params['order_id'])->column("lon,lat,goods_category_id,service_area_id"))[0];
             $this->lon = $lon_lat['lon'];
             $this->lat = $lon_lat['lat'];
+            $this->service_area_id = $lon_lat['service_area_id'];
             $goods_category_id = $lon_lat['goods_category_id'];
             // 派单搜索条件 - 工程师保护期  工程师可用金额限制(除去保护期工程师)  订单产品分类  订单坐标筛选(暂不按距离筛选只按距离排序)
             $ids = DistributeLeafletsService::getIntersection($goods_category_id??0);
@@ -165,6 +167,7 @@ class MasterWorkerLists extends BaseAdminDataLists implements ListsSearchInterfa
             if($this->range){
                 $distanceWhereSql = '('.$user_distance.' <= '.$this->range;
             }
+            $distanceWhereSql .= ' and is_disable=0  AND work_status=0  AND accept_order_status=1 and service_area_id = '.$this->service_area_id;
         }
         $list = MasterWorker::alias('mw')
             ->join('master_worker_register mwr', 'mwr.worker_id = mw.id')

+ 34 - 0
app/adminapi/logic/equity/UserEquityLogic.php

@@ -21,7 +21,9 @@ use app\common\model\equity\UserEquity;
 use app\common\logic\BaseLogic;
 use app\common\model\user\User;
 use app\common\model\works\ServiceWork;
+use app\common\model\works\ServiceWorkLog;
 use think\facade\Db;
+use think\facade\Log;
 use think\facade\Validate;
 
 
@@ -146,4 +148,36 @@ class UserEquityLogic extends BaseLogic
         return ServiceWork::where('user_equity_id',$params['user_equity_id'])->append(['work_status_text'])->select()->toArray();
     }
 
+
+    /**
+     * 取消工单操作-恢复权益次数
+     * @param array $params
+     * @return bool
+     */
+    public static function cancelServiceWorkRestoredNumber(array $params): bool
+    {
+        Db::startTrans();
+        try {
+            $serviceWorkInfo = ServiceWork::find($params['id']);
+            if(empty($serviceWorkInfo['user_equity_id'])){
+                throw new \Exception('该工单非权益卡工单!!!');
+            }
+
+            if((int)$serviceWorkInfo['service_status'] == 4){
+                // 恢复权益次数
+                UserEquity::where('id', $serviceWorkInfo['user_equity_id'])->inc('number')->save();
+            }else{
+                throw new \Exception('该工单非权益卡工单!!!');
+            }
+
+            Db::commit();
+            Log::info('权益卡取消工单'.json_encode([$serviceWorkInfo]));
+            return true;
+        } catch (\Exception $e) {
+            Db::rollback();
+            Log::info('权益卡取消工单-Error'.json_encode([$e->getMessage()]));
+            return false;
+        }
+    }
+
 }

+ 8 - 12
app/common/command/AutomaticDispatch.php

@@ -100,8 +100,8 @@ class AutomaticDispatch extends Command
      */
     protected function platformWorker($item) {
 
-        // 定义地球半径(单位:米)
-        $earthRadius = 6371;
+        // 定义地球半径(单位:米)
+        $earthRadius = 6371000;
 
         // 定义 Haversine 公式计算距离的 SQL 片段
         $distanceCalculation = "{$earthRadius} * 2 * ASIN(SQRT(
@@ -123,6 +123,7 @@ class AutomaticDispatch extends Command
                 ['service_area_id', '=', $item['service_area_id']],
                 ['tenant_id', '=', 0]
             ])
+            ->distinct('a.id')
             ->whereRaw('FIND_IN_SET(' . $item['goods_category_id'] . ', a.category_ids)')
             ->whereRaw("{$distanceCalculation} <= a.distance")
             ->field([
@@ -141,6 +142,7 @@ class AutomaticDispatch extends Command
             ->limit(100)
             ->select()
             ->toArray();
+            //echo MasterWorker::getLastSql();die;
         $queue = [];
         foreach($worker as $key => $value) {  
             //过滤已接过此单的师傅
@@ -150,7 +152,7 @@ class AutomaticDispatch extends Command
             }
         
             //计算地理效率得分
-            $realDistance = ceil($value['real_distance'] / 1000);
+            $realDistance = bcdiv($value['real_distance'],1000,2);
             $travelTime = $realDistance * 2;//预计每公里行驶2分钟
             
             $distanceScore = 100 - ($travelTime * 1.5) - ($realDistance * 5);
@@ -206,8 +208,8 @@ class AutomaticDispatch extends Command
      */
     protected function teamWorker($item) {
        
-        // 地球半径,单位:
-        $earthRadius = 6371;
+        // 地球半径,单位:米
+        $earthRadius = 6371000;
 
         // 定义 Haversine 公式计算距离的 SQL 片段
         $distanceCalculation = "{$earthRadius} * 2 * ASIN(SQRT(
@@ -255,6 +257,7 @@ class AutomaticDispatch extends Command
         ->select()
         ->toArray();
 
+            //echo MasterWorkerTeam::getLastSql();die;
         $minQueue = [];
         $queue = [];
         foreach($worker as $key => $value) {  
@@ -264,13 +267,6 @@ class AutomaticDispatch extends Command
                 continue;
             }
             
-            if ( $value['distance'] > 0) {
-                //校验客户的地址是否在工程师的接单区域内
-                $realDistance = haversineDistance($item['lat'],$item['lon'], $value['lat'],$value['lon'],$value['distance']);
-                if ($realDistance > $value['distance']) {
-                    continue;
-                }
-            }
             if ($value['am_order'] + $value['pm_order'] < $value['min_order']) {
                 $minQueue[] = $value;
             } else {