cqp преди 3 месеца
родител
ревизия
256f6250fa

+ 39 - 0
app/Http/Controllers/Api/OrderController.php

@@ -141,6 +141,19 @@ class OrderController extends BaseController
         }
     }
 
+    public function reminderSendWx(Request $request)
+    {
+        $service = new OrderService();
+        $user = $request->userData;
+        list($status,$data) = $service->reminderSendWx($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
     public function toDoEdit(Request $request)
     {
         $service = new OrderService();
@@ -207,4 +220,30 @@ class OrderController extends BaseController
             return $this->json_return(201,$data);
         }
     }
+
+    public function reminderDetail2(Request $request)
+    {
+        $service = new OrderService();
+        $user = $request->userData;
+        list($status,$data) = $service->reminderDetail2($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
+
+    public function reminderSave(Request $request)
+    {
+        $service = new OrderService();
+        $user = $request->userData;
+        list($status,$data) = $service->reminderSave($request->all(),$user);
+
+        if($status){
+            return $this->json_return(200,'',$data);
+        }else{
+            return $this->json_return(201,$data);
+        }
+    }
 }

+ 4 - 3
app/Http/Middleware/CheckWeinxin.php

@@ -20,11 +20,12 @@ class CheckWeinxin
     {
         $token = $request->header('ciphertext');
         if (empty($token)) return response()->json(['code'=>401,'msg'=>'缺少openid','data'=>null]);
+        $employee_id = $request->header('employee_id');
+        if (empty($employee_id)) return response()->json(['code'=>401,'msg'=>'缺少人员id','data'=>null]);
 
         //校验openid是否绑定
-        $employee = new WxEmployeeOfficial();
-        $employee_id = $employee->where('openid',$token)->value('employee_id');
-        if ($employee_id < 0) return response()->json(['code'=>401,'msg'=>'用户信息错误!','data'=>null]);
+        $bool = WxEmployeeOfficial::where('openid',$token)->where('employee_id',$employee_id)->exists();
+        if (! $bool) return response()->json(['code'=>401,'msg'=>'用户信息错误!','data'=>null]);
 
         //校验用户
         $checkResult = EmployeeService::checkWxUser($employee_id);

+ 7 - 0
app/Model/ReminderDetails.php

@@ -15,4 +15,11 @@ class ReminderDetails extends UseScopeBaseModel
         self::is_main_one => '是',
         self::is_main_two => '否',
     ];
+
+    const status_zero = 0;
+    const status_one = 1;
+    public static $status_name = [
+        self::status_zero => '是',
+        self::status_one => '否',
+    ];
 }

+ 21 - 0
app/Model/ReminderRecord.php

@@ -11,4 +11,25 @@ class ReminderRecord extends UseScopeBaseModel
     const employee_column = "crt_id";
 
     public static $field = ['reminder_id','id','tl_type','tl_result','tl_ways','crt_time'];
+
+    const tl_type_one = 1;
+    const tl_type_two = 2;
+    public static $tl_type_name = [
+        self::tl_type_one => '基础应答',
+        self::tl_type_two => '升级应答',
+    ];
+
+    const tl_way_one = 1;
+    const tl_way_two = 2;
+    public static $tl_way_name = [
+        self::tl_way_one => '一次性交付',
+        self::tl_way_two => '分批交付',
+    ];
+
+    const tl_result_one = 1;
+    const tl_result_two = 2;
+    public static $tl_result_name = [
+        self::tl_result_one => '同意',
+        self::tl_result_two => '不同意',
+    ];
 }

+ 1 - 0
app/Model/WxEmployeeOfficial.php

@@ -11,6 +11,7 @@ use Illuminate\Database\Eloquent\Model;
  */
 class WxEmployeeOfficial extends Model
 {
+    protected $guarded = [];
     protected $table = "wx_employee_official"; //指定表
     const CREATED_AT = 'crt_time';
     const UPDATED_AT = 'upd_time';

+ 7 - 0
app/Service/CustomerSupplyService.php

@@ -6,6 +6,7 @@ use App\Model\Employee;
 use App\Model\CustomerSupply;
 use App\Model\CustomerSupplyDetails;
 use App\Model\Organization;
+use App\Service\Weixin\WxEmployeeService;
 use Illuminate\Support\Facades\DB;
 
 class CustomerSupplyService extends Service
@@ -43,6 +44,9 @@ class CustomerSupplyService extends Service
                 ->update(['del_time' => $time]);
             $this->saveDetail($model->id, $time, $data);
 
+            //更新绑定关系
+            (new WxEmployeeService())->updateWxEmployeeOfficial2($data['mobile']);
+
             DB::commit();
         }catch (\Exception $exception){
             DB::rollBack();
@@ -86,6 +90,9 @@ class CustomerSupplyService extends Service
 
             $this->saveDetail($model->id, time(), $data);
 
+            //更新绑定关系
+            (new WxEmployeeService())->updateWxEmployeeOfficial2($data['mobile']);
+
             DB::commit();
         }catch (\Exception $exception){
             DB::rollBack();

+ 5 - 3
app/Service/EmployeeService.php

@@ -2,6 +2,7 @@
 
 namespace App\Service;
 
+use App\Model\CustomerSupply;
 use App\Model\Depart;
 use App\Model\Employee;
 use App\Model\EmployeeDepartPermission;
@@ -1310,10 +1311,11 @@ class EmployeeService extends Service
     }
 
     public static function checkWxUser($userId){
-        $res = Employee::where('id', $userId)
+        $res = CustomerSupply::where('id', $userId)
             ->where('del_time',0)
-            ->where('state',Employee::USE)->get()->first();
-        if(empty($res)) return [false, '该账号无法登录,请联系管理员!'];
+            ->first();
+        if(empty($res)) return [false, '该账号无法登录'];
+        $res = $res->toArray();
 
         return [true, $res];
     }

+ 232 - 7
app/Service/OrderService.php

@@ -7,6 +7,8 @@ use App\Model\Order;
 use App\Model\OrderDetails;
 use App\Model\Reminder;
 use App\Model\ReminderDetails;
+use App\Model\ReminderRecord;
+use App\Model\ReminderRecordDetails;
 use App\Model\TodoList;
 use Illuminate\Support\Facades\DB;
 
@@ -332,21 +334,34 @@ class OrderService extends Service
         }
     }
 
-    private function getDetail1($id){
+    private function getDetail1($id, $user = []){
+        $customer_supply_id = $user['id'] ?? 0;
+
         $data = ReminderDetails::from('reminder_details as a')
             ->leftJoin('customer_supply as b','b.id','a.customer_supply_id')
             ->where('a.del_time',0)
             ->where('a.reminder_id', $id)
-            ->select('a.customer_supply_id','a.is_main','b.title')
+            ->when(! empty($customer_supply_id), function ($query) use ($customer_supply_id) {
+                return $query->where('a.customer_supply_id', $customer_supply_id);
+            })
+            ->select('a.customer_supply_id','a.is_main','b.title','a.status')
             ->get()->toArray();
 
-        $unit = [];
+        $unit = $unit2 = [];
         foreach ($data as $value){
-            $unit[] = [
-                'customer_supply_id' => $value['customer_supply_id'],
-                'is_main' => $value['is_main'],
-            ];
+            if(! empty($customer_supply_id)) {
+                $unit2 = [
+                    'status' => $value['status'],
+                ];
+            }else{
+                $unit[] = [
+                    'customer_supply_id' => $value['customer_supply_id'],
+                    'customer_supply_title' => $value['title'],
+                    'is_main' => $value['is_main'],
+                ];
+            }
         }
+        if(! empty($unit2)) return $unit2;
 
         $detail = [
             'details' => $unit,
@@ -409,6 +424,9 @@ class OrderService extends Service
         $details = $this->getDetail1($data['id']);
         $customer = array_merge($customer, $details);
 
+        $details_s = $this->getDetailOut($data);
+        $customer['cd_details'] = $details_s;
+
         return [true, $customer];
     }
 
@@ -542,6 +560,16 @@ class OrderService extends Service
         return date('YmdHis',time()) . rand(1000,9999);
     }
 
+    public function reminderSendWx($data, $user){
+        if(empty($data['id'])) return [false, 'ID不能为空'];
+
+        $customer = Reminder::where('del_time',0)
+            ->whereIn('id',$data['id'])
+            ->get()->toArray();
+        if(empty($customer)) return [false,'催单数据不存在或已被删除'];
+
+        return [true, ''];
+    }
     //催单管理---------------------------------------------
 
 
@@ -729,4 +757,201 @@ class OrderService extends Service
 
         return $data;
     }
+
+    public function reminderDetail2($data, $user){
+        if($this->isEmpty($data,'id')) return [false,'请选择数据!'];
+        $customer = Reminder::where('del_time',0)
+            ->where('id',$data['id'])
+            ->first();
+        if(empty($customer)) return [false,'催单不存在或已被删除'];
+        $customer = $customer->toArray();
+        $customer['crt_name'] = Employee::where('id',$customer['crt_id'])->value('emp_name');
+        $customer['crt_time'] = $customer['crt_time'] ? date("Y-m-d H:i:s",$customer['crt_time']): '';
+        $customer['order_time'] = $customer['order_time'] ? date("Y-m-d",$customer['order_time']): '';
+        $customer['lt_arrived_time'] = $customer['lt_arrived_time'] ? date("Y-m-d",$customer['lt_arrived_time']): '';
+        $customer['tl_arrived_time'] = $customer['tl_arrived_time'] ? date("Y-m-d",$customer['tl_arrived_time']): '';
+        $customer['df_type_title'] = Reminder::$df_type_name[$customer['df_type']] ?? "";
+        $customer['rule_title'] = Reminder::$rule_name[$customer['rule']] ?? "";
+        $customer['status_title'] = Reminder::$status_name[$customer['status']] ?? "";
+
+        $details_status = $this->getDetail1($data['id'], $user);
+        $customer['reminder_detail_status'] = $details_status['status'];
+
+        $details_s = $this->getDetailOut($data, $user);
+        $customer['cd_details'] = $details_s;
+
+        return [true, $customer];
+    }
+
+    private function getDetailOut($data, $user = []){
+        $user_id = $user['id'] ?? 0;
+
+        $record = ReminderRecord::where('del_time',0)
+            ->where('reminder_id',$data['id'])
+            ->when(! empty($user_id), function ($query) use ($user_id) {
+                return $query->where('crt_id', $user_id);
+            })
+            ->select('id','crt_id','tl_type','crt_time','tl_result','tl_ways')
+            ->orderby('id','desc')
+            ->get()->toArray();
+
+        $record_detail = ReminderRecordDetails::where('del_time',0)
+            ->whereIn('reminder_record_id',array_column($record,'id'))
+            ->select('reminder_record_id','quantity','tl_time')
+            ->get()->toArray();
+        $record_detail_map = [];
+        foreach ($record_detail as $value){
+            $record_detail_map[$value['reminder_record_id']][] = [
+                'quantity' => $value['quantity'],
+                'tl_time' => date("Y-m-d", $value['tl_time']),
+            ];
+        }
+
+        $emp_2 = (new CustomerSupplyService())->getEmployeeMap(array_unique(array_column($record,'crt_id')));
+        foreach ($record as $key => $value){
+            $record[$key]['crt_name'] = $emp_2[$value['crt_id']] ?? "";
+            $record[$key]['crt_time'] = $value['crt_time'] ? date("Y-m-d H:i:s",$value['crt_time']): '';
+            $record[$key]['tl_type_title'] = ReminderRecord::$tl_type_name[$value['tl_type']] ?? "";
+            $record[$key]['tl_ways_title'] = ReminderRecord::$tl_way_name[$value['tl_ways']] ?? "";
+            $record[$key]['tl_result_title'] = ReminderRecord::$tl_result_name[$value['tl_result']] ?? "";
+            $record[$key]['details'] = $record_detail_map[$value['id']] ?? (object)[];
+        }
+
+        return $record ?? (object)[];
+    }
+
+    public function reminderSave($data, $user){
+        list($status, $msg) = $this->reminderSaveRule($data, $user);
+        if(! $status) return [false, $msg];
+
+        list($reminder, $reminder_details) = $msg;
+        try {
+            DB::beginTransaction();
+
+            $reminder_details->status = ReminderDetails::status_one;
+            $reminder_details->save();
+
+            $time = time();
+            $model = new ReminderRecord();
+            $model->reminder_id = $reminder->id;
+            $model->tl_type = $data['tl_type'];
+            $model->tl_result = $data['tl_result'];
+            $model->tl_ways = $data['tl_ways'];
+            $model->crt_id = $user['id'];
+            $model->save();
+
+            if(! empty($data['details'])){
+                $insert = [];
+                foreach ($data['details'] as $value){
+                    $insert[] = [
+                        'reminder_record_id' => $model->id,
+                        'quantity' => $value['quantity'],
+                        'tl_time' => $value['tl_time'],
+                        'crt_time' => $time,
+                    ];
+                }
+                if(! empty($insert)) ReminderRecordDetails::insert($insert);
+            }
+
+            $this->updateReminderStatus($reminder);
+
+            DB::commit();
+        }catch (\Exception $exception){
+            DB::rollBack();
+            return [false, $exception->getMessage()];
+        }
+
+        return [true, ''];
+    }
+
+    private function reminderSaveRule(&$data, $user){
+        if(empty($data['id'])) return [false, '催单id不能为空'];
+        $reminder = Reminder::where('del_time',0)
+            ->where('id', $data['id'])
+            ->first();
+        if(empty($reminder)) return [false, '催单不存在或已被删除'];
+        list($status,$msg) = $this->limitingSendRequestBackgExpire("reminderSave" . $reminder->id);
+        if(! $status) return [false, $msg];
+        if($reminder->status == Reminder::status_one) return [false, '催单已完成,提交失败'];
+        if($reminder->status == Reminder::status_two) return [false, '催单已结束,提交失败'];
+        if(empty($data['tl_type'])) return [false, '提拉类型不能为空'];
+        if(! isset(ReminderRecord::$tl_type_name[$data['tl_type']])) return [false, '提拉类型错误'];
+        if(empty($data['tl_result'])) return [false, '提拉结果不能为空'];
+        if(isset(ReminderRecord::$tl_result_name[$data['tl_result']])) return [false, '提拉结果错误'];
+        if($data['tl_result'] == ReminderRecord::tl_result_one){
+            if(empty($data['tl_ways'])) return [false, '提拉方式不能为空'];
+            if(isset(ReminderRecord::$tl_way_name[$data['tl_ways']])) return [false, '提拉方式错误'];
+            if(empty($data['details'])) return [false, '结果明细不能为空'];
+            foreach ($data['details'] as $key => $value){
+                $res = $this->checkNumber($value['quantity'],2,'positive');
+                if(! $res['valid']) return [false,'提拉应答数量:' . $res['error']];
+                if(empty($value['tl_time'])) return [false, '提拉应答日期不能为空'];
+                $data['details'][$key]['tl_time'] = $this->changeDateToDate($value['tl_time']);
+            }
+        }
+        $order = ReminderDetails::where('del_time',0)
+            ->where('reminder_id', $data['id'])
+            ->where('customer_supply_id', $user['id'])
+            ->first();
+        if(! $order) return [false, '该人员不在本次催单供应商人员内容'];
+        if($order->status) return [false, '催单信息已回复,请勿重复操作'];
+
+        return [true, [$reminder, $order]];
+    }
+
+    public function updateReminderStatus($reminder)
+    {
+        if (empty($reminder)) return;
+
+        $reminder_id = $reminder->id;
+
+        // 查询主要人员
+        $main_users = ReminderDetails::where('reminder_id', $reminder_id)
+            ->where('is_main', ReminderDetails::is_main_one)
+            ->pluck('customer_supply_id')
+            ->toArray();
+
+        // 查询主要人员的最新回复结果
+        $records = ReminderRecord::where('reminder_id', $reminder_id)
+            ->whereIn('crt_id', $main_users)
+            ->orderBy('id', 'desc')
+            ->get()
+            ->groupBy('crt_id')
+            ->map(function ($items) {
+                return $items->first(); // 每人最新一次回复
+            });
+
+        // 如果主要人员都还没回复,不更新
+        if ($records->isEmpty()) return;
+
+        // 统计回复结果
+        $agree_count = $records->where('tl_result', ReminderRecord::tl_result_one)->count();
+        $reject_count = $records->where('tl_result', ReminderRecord::tl_result_two)->count();
+        $total_main = count($main_users);
+
+        // 当前规则判断
+        $new_status = null;
+
+        if ($reminder->rule == Reminder::rule_one) {
+            // 与规则:全同意 -> 1;有一人不同意 -> 2
+            if ($reject_count > 0) {
+                $new_status = Reminder::status_two; // 结束
+            } elseif ($agree_count == $total_main) {
+                $new_status = Reminder::status_one; // 完成
+            }
+        } elseif ($reminder->rule == Reminder::rule_two) {
+            // 或规则:任意同意 -> 1;全不同意 -> 2
+            if ($agree_count > 0) {
+                $new_status = Reminder::status_one; // 完成
+            } elseif ($reject_count == $total_main) {
+                $new_status = Reminder::status_two; // 结束
+            }
+        }
+
+        // 更新状态
+        if ($new_status !== null && $reminder->status != $new_status) {
+            $reminder->status = $new_status;
+            $reminder->save();
+        }
+    }
 }

+ 41 - 0
app/Service/Weixin/WxEmployeeService.php

@@ -39,8 +39,14 @@ class WxEmployeeService extends Service
         list($user, $customer) = $a_data;
 
         try{
+
             $user->employee_id = $customer['id'];
             $user->save();
+
+            //更新绑定关系
+            if($data['login_type'] == WxEmployeeOfficial::login_type_one){
+                $this->updateWxEmployeeOfficial($customer['mobile'], $openid);
+            }
         }catch (\Exception $exception){
             return [false, $exception->getMessage()];
         }
@@ -96,4 +102,39 @@ class WxEmployeeService extends Service
 
         return [true, [$user, $customer]];
     }
+
+    public function updateWxEmployeeOfficial($mobile, $openid){
+        $other = CustomerSupply::where('mobile', $mobile)
+            ->where('type',CustomerSupply::type_two)
+            ->get()->toArray();
+        foreach ($other as $value){
+            WxEmployeeOfficial::firstOrCreate([
+                'appid' => config("wx_msg.f_appid"),
+                'type' => WxEmployeeOfficial::login_type_one,
+                'openid' => $openid,
+                'employee_id' => $value['id'],
+            ]);
+        }
+    }
+
+    public function updateWxEmployeeOfficial2($mobile){
+        $other = CustomerSupply::where('mobile', $mobile)
+            ->where('type',CustomerSupply::type_two)
+            ->get()->toArray();
+        $other_id = array_column($other,'id');
+        $wx = WxEmployeeOfficial::whereIn('employee_id',$other_id)
+            ->where('type', WxEmployeeOfficial::login_type_one)
+            ->first();
+        if(! empty($wx)){
+            $openid = $wx->open_id;
+            foreach ($other as $value){
+                WxEmployeeOfficial::firstOrCreate([
+                    'appid' => config("wx_msg.f_appid"),
+                    'type' => WxEmployeeOfficial::login_type_one,
+                    'openid' => $openid,
+                    'employee_id' => $value['id'],
+                ]);
+            }
+        }
+    }
 }

+ 1 - 0
routes/api.php

@@ -137,6 +137,7 @@ Route::group(['middleware'=> ['checkLogin']],function ($route){
     $route->any('reminderAdd', 'Api\OrderController@reminderAdd');
     $route->any('reminderDel', 'Api\OrderController@reminderDel');
     $route->any('reminderDetail', 'Api\OrderController@reminderDetail');
+    $route->any('reminderSendWx', 'Api\OrderController@reminderSendWx');
 
     //待办
     $route->any('toDoList', 'Api\OrderController@toDoList');

+ 2 - 1
routes/weixin.php

@@ -24,5 +24,6 @@ Route::any('wxLogin', 'Api\WeixinController@login');
 Route::any('getUnionid', 'Api\WeixinController@getUnionid');
 Route::any('getOpenid', 'Api\WeixinController@getOpenid');
 Route::group(['middleware'=> ['checkWeixin']],function ($route){
-
+    $route->any('reminderDetail', 'Api\OrderController@reminderDetail2');
+    $route->any('reminderSave', 'Api\OrderController@reminderSave');
 });