| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441 |
- <?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\model\master_worker;
- use app\common\model\BaseModel;
- use app\common\model\dict\DictData;
- use app\common\model\works\ReturnWork;
- use app\common\model\works\ServiceWork;
- use think\facade\Log;
- /**
- * SalaryItemPermanently模型
- * Class SalaryItemPermanently
- * @package app\common\model
- */
- class SalaryItemPermanently extends BaseModel
- {
-
- protected $name = 'salary_item_permanently';
- public function workerInfo()
- {
- return $this->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;
- }
- }
|