hasOne(MasterWorkerInfo::class, 'worker_id', 'master_worker_id'); } public function getTermTextAttr($value,$data):string { $dictData = DictData::whereIn('type_value', 'salary_item')->column('name','value'); return $dictData[$data['term']] ?? ''; } // 接单服务费 - 每周一次 兼职、保单 不论等级都按 50% public function salary_item_1($permanently_settlement_id,$master_worker_id,$params,$extra = []) { try { if($params['period_type'] == 2 && in_array($params['master_type'],[1,2])){ //$params['start_time'] $params['end_time'] $promotion_level = MasterWorker::where('id',$master_worker_id)->value('promotion_level'); $ratio = 0.5; // 查询时间范围内所有已经完单的工单 $order_list = ServiceWork::where('master_worker_id',$master_worker_id)-> where('finished_time','between',[$params['start_time'],$params['end_time']])-> where('service_status',3)->where('work_pay_status',3)-> field(['id','work_sn','work_amount','spare_total','master_worker_id','finished_time','service_status','work_pay_status'])-> select()->toArray(); $amount = 0.00; $spare_total = 0.00; foreach ($order_list as $item) { $amount += (float)bcsub($item['work_amount'] ,$item['spare_total']);//(float)bcmul(, $ratio,2); $spare_total += $item['spare_total']; } $term_amount = (float)bcmul($amount, $ratio,2); $itemData = [ 'permanently_settlement_id' => $permanently_settlement_id, 'master_worker_id' => $master_worker_id, 'term' => 1, 'term_amount' => $term_amount, 'remark' => $params['item_name'].':配件总金额--'.$spare_total.': 奖励总金额--'.$term_amount.';比例:--'.$ratio, 'extra' => json_encode([ 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'], 'start_time'=>$params['start_time'],'end_time'=>$params['end_time'],'promotion_level'=>$promotion_level,'ratio'=>$ratio, 'amount'=>$amount,'count_order'=>count($order_list),'order_ids'=> array_column($order_list,'id') ]), ]; self::salaryCreateUpdate($itemData); } return true; } catch (\Exception $e) { Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage()); return false; } } // 加单奖励 public function salary_item_2($permanently_settlement_id,$master_worker_id,$params,$extra = []) { try { if(in_array($params['period_type'],[1,2])){ return false; } // work_type = 2 $ratio = 0.1; // 查询时间范围内所有已经完单的工单 $order_list = ServiceWork::where('master_worker_id',$master_worker_id)-> where('finished_time','between',[$params['start_time'],$params['end_time']])-> where('service_status','=',3)->where('work_pay_status','=',3)->where('work_type','=',2)-> field(['id','work_sn','work_amount','spare_total','master_worker_id','finished_time','service_status','work_pay_status'])-> select()->toArray(); $amount = 0.00; foreach ($order_list as $item) { $amount += (float)bcsub($item['work_amount'] ,$item['spare_total']);//(float)bcmul(, $ratio,2); } $term_amount = (float)bcmul($amount, $ratio,2); $itemData = [ 'permanently_settlement_id' => $permanently_settlement_id, 'master_worker_id' => $master_worker_id, 'term' => 2, 'term_amount' => $term_amount, 'remark' => $params['item_name'].': 金额--'.$term_amount.';比例:--'.$ratio, 'extra' => json_encode([ 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'], 'start_time'=>$params['start_time'],'end_time'=>$params['end_time'],'ratio'=>$ratio, 'amount'=>$amount,'count_order'=>count($order_list),'order_ids'=> array_column($order_list,'id') ]), ]; self::salaryCreateUpdate($itemData); return true; } catch (\Exception $e) { Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage()); return false; } } // 月度TOP3 public function salary_item_3($permanently_settlement_id,$master_worker_id,$params,$extra = []) { try { if(in_array($params['period_type'],[1,2])){ return false; } $term_amount = 0; $ranking = 3; // 查询时间范围内所有已经完单的工单工程师排名 - 可以为当月月度 $order_list = ServiceWork:: where('finished_time','between',[$params['start_time'],$params['end_time']])-> where('service_status','=',3)->where('work_pay_status','=',3)-> field('master_worker_id,count(id) as work_counts')-> group('master_worker_id')-> order('work_counts desc')-> limit(3)-> select()->toArray(); $master_worker_ids = array_column($order_list,'master_worker_id'); if(in_array($master_worker_id,$master_worker_ids)){ $term_amount = 500; } $itemData = [ 'permanently_settlement_id' => $permanently_settlement_id, 'master_worker_id' => $master_worker_id, 'term' => 3, 'term_amount' => $term_amount, 'remark' => $params['item_name'].': 金额--'.$term_amount.';排名:前三', 'extra' => json_encode([ 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'], 'start_time'=>$params['start_time'],'end_time'=>$params['end_time'] ]), ]; self::salaryCreateUpdate($itemData); return true; } catch (\Exception $e) { Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage()); return false; } } // ≥4.8分且≥80单 public function salary_item_4($permanently_settlement_id,$master_worker_id,$params,$extra = []) { try { if(in_array($params['period_type'],[1,2])){ return false; } $comprehensive_score = MasterWorkerScore::where('worker_id',$master_worker_id)->value('comprehensive_score'); // 查询时间范围内所有已经完单的工单 $order_count = ServiceWork::where('master_worker_id',$master_worker_id)-> where('finished_time','between',[$params['start_time'],$params['end_time']])-> where('service_status','=',3)->where('work_pay_status','=',3)->count(); $term_amount = 0; if( 4.8 <= (float)$comprehensive_score && 80 <= $order_count){ $term_amount = 500; } $itemData = [ 'permanently_settlement_id' => $permanently_settlement_id, 'master_worker_id' => $master_worker_id, 'term' => 4, 'term_amount' => $term_amount, 'remark' => $params['item_name'].': 金额--'.$term_amount.';评分:--'.$comprehensive_score.';总单量:--'.$order_count, 'extra' => json_encode([ 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'], 'start_time'=>$params['start_time'],'end_time'=>$params['end_time'],'comprehensive_score'=>$comprehensive_score,'order_count'=>$order_count, 'amount'=>$term_amount ]), ]; self::salaryCreateUpdate($itemData); return true; } catch (\Exception $e) { Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage()); return false; } } // 工程师晋升 public function salary_item_5($permanently_settlement_id,$master_worker_id,$params,$extra = []) { try { if(in_array($params['period_type'],[1,2])){ return false; } $title_promotion = MasterWorker::where('id',$master_worker_id)->value('title_promotion'); $amount = 0.00; switch ($title_promotion){ case 2: $amount = 1000; break; case 3: $amount = 1500; break; } $itemData = [ 'permanently_settlement_id' => $permanently_settlement_id, 'master_worker_id' => $master_worker_id, 'term' => 5, 'term_amount' => $amount, 'remark' => $params['item_name'].': 金额--'.$amount.';称号:--'.$title_promotion, 'extra' => json_encode([ 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'], 'title_promotion'=>$title_promotion, 'amount'=>$amount ]), ]; self::salaryCreateUpdate($itemData); return true; } catch (\Exception $e) { Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage()); return false; } } // 投诉订单 public function salary_item_6($permanently_settlement_id,$master_worker_id,$params,$extra = []) { try { if(in_array($params['period_type'],[1,2])){ return false; } // 查询时间范围内所有投诉的工单 $order_count = ReturnWork::where('master_worker_id',$master_worker_id)-> where('finished_time','between',[$params['start_time'],$params['end_time']])-> where('return_work_status','=',4)->count(); $amount = 50.00; $term_amount = -(float)bcmul($order_count, $amount,2); $itemData = [ 'permanently_settlement_id' => $permanently_settlement_id, 'master_worker_id' => $master_worker_id, 'term' => 6, 'term_amount' => $term_amount, 'remark' => $params['item_name'].': 扣减金额--'.$term_amount.';投诉单量:--'.$order_count,// .'xx:--'.$ranking 'extra' => json_encode([ 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'], 'start_time'=>$params['start_time'],'end_time'=>$params['end_time'], 'amount'=>$amount,'order_count'=>$order_count ]), ]; self::salaryCreateUpdate($itemData); return true; } catch (\Exception $e) { Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage()); return false; } } // 全职工程师的当月基础薪资 public function salary_item_7($permanently_settlement_id,$master_worker_id,$params,$extra = []) { try { if($params['period_type'] == 3 && $params['master_type'] == 3){ $itemData = [ 'permanently_settlement_id' => $permanently_settlement_id, 'master_worker_id' => $master_worker_id, 'term' => 7, 'term_amount' => 4500, 'remark' => $params['item_name'].': 底薪--4500',// .'xx:--'.$ranking 'extra' => json_encode([ 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'], 'start_time'=>$params['start_time'],'end_time'=>$params['end_time'], 'amount'=>4500 ]), ]; self::salaryCreateUpdate($itemData); } return true; } catch (\Exception $e) { Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage()); return false; } } // 全职工程师的当月的提成 public function salary_item_8($permanently_settlement_id,$master_worker_id,$params,$extra = []) { try { if($params['period_type'] == 3 && $params['master_type'] == 3){ // 查询时间范围内所有已经完单的工单 $order_list = ServiceWork::where('master_worker_id',$master_worker_id)-> where('finished_time','between',[$params['start_time'],$params['end_time']])-> where('service_status','=',3)->where('work_pay_status','=',3)-> field(['id','work_sn','work_amount','spare_total','master_worker_id','finished_time','service_status','work_pay_status'])-> select()->toArray(); // 15%(单价<300 元时提成15%)至20%(单价>=300元时提成 20%) $term_amount = 0.00; foreach ($order_list as $item) { if((float)$item['work_amount'] < 300){ $ratio = 0.15; }else{ $ratio = 0.2; } $term_amount += (float)bcmul($item['work_amount'], $ratio,2); } $itemData = [ 'permanently_settlement_id' => $permanently_settlement_id, 'master_worker_id' => $master_worker_id, 'term' => 8, 'term_amount' => $term_amount, 'remark' => $params['item_name'].': 金额--'.$term_amount, 'extra' => json_encode([ 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'], 'start_time'=>$params['start_time'],'end_time'=>$params['end_time'],'ratio'=>$ratio, 'amount'=>$term_amount,'count_order'=>count($order_list),'order_ids'=> array_column($order_list,'id') ]), ]; self::salaryCreateUpdate($itemData); } return true; } catch (\Exception $e) { Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage()); return false; } } // 接单服务费 - 每月一次 public function salary_item_9($permanently_settlement_id,$master_worker_id,$params,$extra = []) { try { if($params['period_type'] == 3 && $params['master_type'] == 2){ //$params['start_time'] $params['end_time'] $promotion_level = MasterWorker::where('id',$master_worker_id)->value('promotion_level'); $ratio = 0.00; switch ($promotion_level){ case 1: $ratio = 0.65; break; case 2: $ratio = 0.63; break; case 3: $ratio = 0.61; break; case 4: $ratio = 0.59; break; case 5: $ratio = 0.57; break; case 6: $ratio = 0.55; break; case 7: $ratio = 0.5; break; } $ratio = $ratio - 0.5; if(empty($ratio)) return false; // 查询时间范围内所有已经完单的工单 $order_list = ServiceWork::where('master_worker_id',$master_worker_id)-> where('finished_time','between',[$params['start_time'],$params['end_time']])-> where('service_status',3)->where('work_pay_status',3)-> field(['id','work_sn','work_amount','spare_total','master_worker_id','finished_time','service_status','work_pay_status'])-> select()->toArray(); $amount = 0.00; $spare_total = 0.00; foreach ($order_list as $item) { $amount += (float)bcsub($item['work_amount'] ,$item['spare_total']);//(float)bcmul(, $ratio,2); $spare_total += $item['spare_total']; } $term_amount = (float)bcmul($amount, $ratio,2); $itemData = [ 'permanently_settlement_id' => $permanently_settlement_id, 'master_worker_id' => $master_worker_id, 'term' => 9, 'term_amount' => $term_amount, 'remark' => $params['item_name'].':配件总金额--'.$spare_total.': 奖励总金额--'.$term_amount.';比例:--'.$ratio, 'extra' => json_encode([ 'step_days'=>$params['step_days'],'item_name'=>$params['item_name'], 'start_time'=>$params['start_time'],'end_time'=>$params['end_time'],'promotion_level'=>$promotion_level,'ratio'=>$ratio, 'amount'=>$amount,'count_order'=>count($order_list),'order_ids'=> array_column($order_list,'id') ]), ]; self::salaryCreateUpdate($itemData); } return true; } catch (\Exception $e) { Log::info('permanently_settlement_id:'.$permanently_settlement_id.':'.$e->getFile().':'.$e->getLine().':'.$e->getMessage()); return false; } } public function salaryCreateUpdate($itemData = []) { if(empty($itemData)) return false; $wh = ['permanently_settlement_id' => $itemData['permanently_settlement_id'], 'master_worker_id' => $itemData['master_worker_id'], 'term' => $itemData['term']]; $info = self::where($wh)->findOrEmpty(); if($info->isEmpty()){ self::create($itemData); }else{ self::where($wh)->update($itemData); } return true; } }