Ver Fonte

Merge branch 'master' of e.coding.net:zdap/weixiu/weixiu_api into m--douyin

liugc há 1 ano atrás
pai
commit
de4ffc9df5

+ 20 - 7
app/adminapi/http/middleware/LoginMiddleware.php

@@ -53,17 +53,30 @@ class LoginMiddleware
             //token过期无效并且该地址需要登录才能访问
             return JsonService::fail('登录超时,请重新登录', [], -1);
         }
-
+        $controller = $request->controller();
+        $is_kefu = 0;
         //token临近过期,自动续期
         if ($adminInfo) {
-            //获取临近过期自动续期时长
-            $beExpireDuration = Config::get('project.admin_token.be_expire_duration');
+            //客服派单员
+            if (isset($adminInfo['role_name']) && (strpos($adminInfo['role_name'], '派单') !== false || strpos($adminInfo['role_name'], '客服') !== false)) {  
+                //获取临近过期自动续期时长
+                $beExpireDuration = Config::get('project.kefu_admin_token.be_expire_duration');
+                $is_kefu = 1;
+            } else {
+                //获取临近过期自动续期时长
+                $beExpireDuration = Config::get('project.admin_token.be_expire_duration');
+            }
+
             //token续期
             if (time() > ($adminInfo['expire_time'] - $beExpireDuration)) {
-                $result = AdminTokenService::overtimeToken($token);
-                //续期失败(数据表被删除导致)
-                if (empty($result)) {
-                    return JsonService::fail('登录过期', [], -1);
+                if ($is_kefu == 1 && $controller == 'notice.Notice') {
+                    
+                } else {
+                    $result = AdminTokenService::overtimeToken($token);
+                    //续期失败(数据表被删除导致)
+                    if (empty($result)) {
+                        return JsonService::fail('登录过期', [], -1);
+                    }
                 }
             }
         }

+ 17 - 2
app/adminapi/service/AdminTokenService.php

@@ -17,6 +17,7 @@ namespace app\adminapi\service;
 
 use app\common\cache\AdminTokenCache;
 use app\common\model\auth\AdminSession;
+use app\common\model\auth\AdminRole;
 use think\facade\Config;
 
 /**
@@ -44,7 +45,7 @@ class AdminTokenService
         $adminSession = AdminSession::where([['admin_id', '=', $adminId], ['terminal', '=', $terminal]])->find();
 
         //获取token延长过期的时间
-        $expireTime = $time + Config::get('project.admin_token.expire_duration');
+        $expireTime = $time + self::getExpireDuration($adminId);
         $adminTokenCache = new AdminTokenCache();
 
         //token处理
@@ -90,12 +91,26 @@ class AdminTokenService
             return false;
         }
         //延长token过期时间
-        $adminSession->expire_time = $time + Config::get('project.admin_token.expire_duration');
+        $adminSession->expire_time = $time + self::getExpireDuration($adminSession->admin_id);
         $adminSession->update_time = $time;
         $adminSession->save();
         return (new AdminTokenCache())->setAdminInfo($adminSession->token);
     }
 
+    public static function getExpireDuration($adminId)
+    {
+        $roolName = AdminRole::alias('a')
+            ->join('system_role b', 'a.role_id = b.id')
+            ->where('a.admin_id', $adminId)
+            ->value('b.name');
+
+        if (!empty($roolName) && (strpos($roolName, '客服') !== false || strpos($roolName, '派单') !== false)) {
+            return Config::get('project.kefu_admin_token.expire_duration');
+        } else {
+            return Config::get('project.admin_token.expire_duration');
+        }
+    }
+
     /**
      * @notes 设置token为过期
      * @param $token

+ 5 - 90
app/api/logic/PerformanceLogic.php

@@ -69,7 +69,8 @@ class PerformanceLogic extends BaseLogic
                     break;
                 default://按照固定金额结算
                     $worker_price = $work->service_fee-$coupon_price;
-                    $settlement_amount = $rule['rate'];
+                    $quantity = OrderGoods::whereIn('sn',$order_sns)->value('quantity')??1;
+                    $settlement_amount = bcmul($quantity, $rule['rate'],2);
             }
             $work->worker_price = $worker_price;
 
@@ -300,8 +301,7 @@ class PerformanceLogic extends BaseLogic
         Db::startTrans();
         try {
 
-
-            $masterWorkerAccountLog = MasterWorkerAccountLog::where('action',1)->where('worker_id',$work->master_worker_id)->where('work_sn',$work->work_sn)->findOrEmpty();
+            /*$masterWorkerAccountLog = MasterWorkerAccountLog::where('action',1)->where('worker_id',$work->master_worker_id)->where('work_sn',$work->work_sn)->findOrEmpty();
             $masterWorkerRetentionMoneyLog = MasterWorkerRetentionMoneyLog::where('action',1)->where('work_id',$work->id)->where('worker_id',$work->master_worker_id)->findOrEmpty();
             $masterWorker = MasterWorker::where('id', $work->master_worker_id)->findOrEmpty();
             if(!$masterWorkerRetentionMoneyLog->isEmpty()){
@@ -318,95 +318,10 @@ class PerformanceLogic extends BaseLogic
             }
             $masterWorker->save();
 
+            OrderEffectiveLog::where('work_id',$work->id)->delete();
 
+            self::calculatePerformance($work);*/
 
-            //工单已完结,进行结算,结算完成后设置work_pay_status为2,已结算
-            //获取工单对应的商品id
-            $order_sns = RechargeOrder::where('work_id',$work->id)->column('sn');
-            $goods_id = OrderGoods::whereIn('sn',$order_sns)->value('goods_id');
-            $rule = PerformanceRules::whereFindInSet('goods_id',$goods_id)->findOrEmpty();
-            if($rule->isEmpty()){
-                $work->work_pay_status = 3;
-            }else{
-                $work->work_pay_status = 2;
-            }
-            Log::info('calculatePerformance:'.json_encode($rule->toArray()));
-            //工程师金额结算
-            if(!$rule->isEmpty()){
-                $coupon_price = RechargeOrder::where('work_id',$work->id)->sum('coupon_price');
-                switch ($rule['type']){
-                    case 0:
-                    case 1://按照结算金额结算
-                    case 2:
-                        $worker_price = $work->work_amount;
-                        $settlement_amount = bcmul($worker_price, $rule['rate'],2);
-                        break;
-                }
-                $work->worker_price = $worker_price;
-
-                // 缴纳质保金
-                $masterWorkerInfo = MasterWorker::where('id', $work->master_worker_id)->where('retention_money_status', 1)->findOrEmpty()->toArray();
-                Log::info('缴纳质保金工程师信息:'.json_encode($masterWorkerInfo));
-                if(!empty($masterWorkerInfo) && $masterWorkerInfo['retention_pay_status'] == 2 && ($masterWorkerInfo['earnest_money'] > $masterWorkerInfo['earnest_money_usable'])){
-                    $retentionData['action'] = WorkerAccountLogEnum::INC;
-                    $retentionData['worker_id'] = $work->master_worker_id;
-                    $retentionData['work_id'] = $work->id;
-                    $amount = bcmul($worker_price, bcdiv($masterWorkerInfo['installment_ratio'], 100, 4),2);
-                    //$amount = bcmul($settlement_amount, bcdiv($masterWorkerInfo['installment_ratio'], 100, 4),2);
-                    $retentionData['amount'] = $amount;
-                    //$retentionData['remark'] = "分期缴纳质保金:该单实提成--{$settlement_amount},分期每单缴纳比例--{$masterWorkerInfo['installment_ratio']}%,缴纳金额--{$amount}";
-                    $retentionData['remark'] = "分期缴纳质保金:工单提成--{$worker_price},分期每单缴纳比例--{$masterWorkerInfo['installment_ratio']}%,缴纳金额--{$amount}";
-                    $settlement_amount -= (float)$amount;
-                    $surplusMoney = RetentionMoneyLogic::retentionPayment($retentionData);
-                    Log::info('分期缴纳质保金:'.$surplusMoney,$retentionData);
-                    if($surplusMoney === false){
-                        Log::info('分期缴纳质保金支付失败-'.RetentionMoneyLogic::getError(),$retentionData);
-                        $settlement_amount += (float)$amount;
-                    }else{
-                        $settlement_amount += (float)$surplusMoney;
-
-                        $work->earnest_money = $amount - $surplusMoney;//质保金金额
-                    }
-                }
-
-                if($settlement_amount<0){
-                    //修改工单为待结算,后台处理
-                    $work->work_pay_status = 3;
-                }
-
-                //工程师可提现金额
-                $work->settlement_amount = $settlement_amount;
-
-                //工程师加单金额判定
-                //$add_work_amount = 0;测试
-                $add_work_amount = WorkAddMoneyLogic::checkAddWork($work,$worker_price);
-                $work->add_work_amount = $add_work_amount;
-
-                //系统回收金额
-                $work->system_amount = $worker_price-$settlement_amount-$work->earnest_money-$work->add_work_amount;
-                if($work->system_amount < 0){
-                    $work->system_amount = 0;
-                    Log::info('system_amount小于0重置为0:'.$work->system_amount.'='.$worker_price.'-'.$settlement_amount.'-'.$work->earnest_money.'-'.$work->add_work_amount);
-                }
-                //门店结算金额
-                if($work->tenant_id > 0){
-                    $percentage = TenantRatingCommissionLogic::getCommissionByTenantId($work->tenant_id);
-                    if($percentage > 0){
-                        $work->system_amount = bcmul($worker_price, bcdiv($percentage, 100, 4),2);
-                        $work->tenant_all_amount = $worker_price - $work->system_amount;
-                        $work->tenant_amount = $work->tenant_all_amount - $settlement_amount - $work->earnest_money - $work->add_work_amount;
-                    }
-                    Log::info('平台抽成门店的比例:'.'门店ID:'.$work->tenant_id.',平台抽成:'.$percentage);
-                }
-
-                //工程师可提现金额,汇总了加单金额
-                $settlement_amount += (float)$work->add_work_amount;
-
-                Log::info('工单'.$work->id.',总服务费:'.$worker_price.'可提现金额:'.$settlement_amount.',加单金额:'.$work->add_work_amount.',缴纳质保金:'.$work->earnest_money.',系统回收金额:'.$work->system_amount.',门店总金额(包含工程师):'.$work->tenant_all_amount . ',门店实际金额:'.$work->tenant_amount);
-
-                WorkerAccountLogLogic::addAccountLog($work,$settlement_amount,WorkerAccountLogEnum::UM_INC_ADMIN,WorkerAccountLogEnum::INC);
-            }
-            $work->save();
 
             Db::commit();
         } catch (\Exception $e) {

+ 67 - 14
app/common/command/AutomaticDispatch.php

@@ -47,34 +47,44 @@ class AutomaticDispatch extends Command
     protected function execute(Input $input, Output $output)
     {
         //自动派单
-        $this->autoDispatch();
+        // $this->autoDispatch();
 
-        //执行外呼任务
-        $h = date('H');
-        if ($h >= 8 && $h <= 22) {
-            $this->startTask();
-        }
+        // //执行外呼任务
+        // $h = date('H');
+        // if ($h >= 8 && $h <= 22) {
+        //     $this->startTask();
+        // }
 
-        //异常工单:上门时间超过两小时状态未变更已上门
+        //异常工单:已过预约时间工程师未确认上门
         $this->workAnomalous();
+
+        //异常工单:上门时间超过两小时工单未确认完成
+        $this->unFinishedWorkAnomalous();
     }
 
     /**
-     * 异常工单:上门时间超过两小时状态未变更已上门
+     * 异常工单:已过预约时间工程师未确认上门
      */
     protected function workAnomalous() 
     {
         $size = 100;
-        $startTime = time() - 7200;  // 当前时间减去7200秒(2小时)
+        $startTime = strtotime(date('Y-m-d 00:00:00'));
+        $endTime = time();  // 当前时间戳
+
         $list = ServiceWork::alias("a")
             ->leftJoin('service_work_anomalous b','a.id = b.work_id')
-            ->where('a.work_status',3)
+            ->where('a.work_status','<=',3)
             ->where('a.service_status','<',2)
             ->where('a.refund_approval',0)
             ->where('a.work_pay_status',1)
-            ->where('a.appointment_time','<=', $startTime)
-            ->whereNull('b.id')
-            ->field('a.id,a.appointment_time,b.id as anomalous_id')
+            ->where('a.appointment_time','between', [$startTime, $endTime])
+            ->whereNotExists(function($query) {
+                $query->table('la_service_work_anomalous c')
+                      ->whereRaw('a.id = c.work_id')
+                      ->where('c.reason_type', 3);
+            })
+            ->field('a.id,a.appointment_time,b.id as anomalous_id,b.reason_type')
+            ->group('a.id')
             ->order('a.create_time','asc')
             ->limit($size)
             ->select()
@@ -88,7 +98,50 @@ class AutomaticDispatch extends Command
                 ServiceWorkAnomalous::create([
                     'work_id' => $item['id'],
                     'reason_type' => 3,
-                    'reason' => '上门时间超过两小时状态未变更已上门',
+                    'reason' => '已过预约时间工程师未确认上门',
+                ]);
+            } catch (\Exception $e) {
+                Log::write('异常工单:'.$e->getMessage());
+            }
+        }
+    }
+
+    /**
+     * 异常工单:上门时间超过两小时工单未确认完成
+     */
+    protected function unFinishedWorkAnomalous() 
+    {
+        $size = 100;
+        $startTime = strtotime(date('Y-m-d 00:00:00'));
+        $endTime = time() - 7200;  // 当前时间减去7200秒(2小时)
+        $list = ServiceWork::alias("a")
+            ->leftJoin('service_work_anomalous b','a.id = b.work_id')
+            ->where('a.work_status', '>=', 4)
+            ->where('a.service_status','<',3)
+            ->where('a.refund_approval',0)
+            ->where('a.work_pay_status',1)
+            ->where('a.appointment_time','between', [$startTime, $endTime])
+            ->whereNotExists(function($query) {
+                $query->table('la_service_work_anomalous c')
+                      ->whereRaw('a.id = c.work_id')
+                      ->where('c.reason_type', 4);
+            })
+            ->field('a.id,a.appointment_time,b.id as anomalous_id')
+            ->group('a.id')
+            ->order('a.create_time','asc')
+            ->limit($size)
+            ->select()
+            ->toArray();
+        if (!$list) {
+            return ;
+        }
+
+        foreach($list as $item) {     
+            try {
+                ServiceWorkAnomalous::create([
+                    'work_id' => $item['id'],
+                    'reason_type' => 4,
+                    'reason' => '上门时间超过两小时工单未确认完成',
                 ]);
             } catch (\Exception $e) {
                 Log::write('异常工单:'.$e->getMessage());

+ 32 - 0
app/common/service/call/VirtualCallService.php

@@ -0,0 +1,32 @@
+<?php
+// +----------------------------------------------------------------------
+// | likeadmin快速开发前后端分离管理后台(PHP版)
+// +----------------------------------------------------------------------
+// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
+// | 开源版本可自由商用,可去除界面版权logo
+// | gitee下载:https://gitee.com/likeshop_gitee/likeadmin
+// | github下载:https://github.com/likeshop-github/likeadmin
+// | 访问官网:https://www.likeadmin.cn
+// | likeadmin团队 版权所有 拥有最终解释权
+// +----------------------------------------------------------------------
+// | author: likeadminTeam
+// +----------------------------------------------------------------------
+
+namespace app\common\service\call;
+
+class VirtualCallService
+{
+    /**
+     * @notes 设置配置值
+     * @param $type
+     * @param $name
+     * @param $value
+     * @return mixed
+     * @author 段誉
+     * @date 2021/12/27 15:00
+     */
+    public static function set(string $type, string $name, $value)
+    {
+        return '';
+    }
+}

+ 6 - 0
config/project.php

@@ -58,6 +58,12 @@ return [
         'be_expire_duration' => 3600,//管理后台token临时过期前时长,自动续期
     ],
 
+    //后台客服管理员token(登录令牌)配置
+    'kefu_admin_token' => [
+        'expire_duration' => 30*60,//管理后台token过期时长(单位秒)
+        'be_expire_duration' => 30*60,//管理后台token临时过期前时长,自动续期
+    ],
+
     // 商城用户token(登录令牌)配置
     'user_token' => [
         'expire_duration' => 3600 * 24 * 30,//用户token过期时长(单位秒)