Selaa lähdekoodia

add - 兼职/长期/全职工程师结算

liugc 11 kuukautta sitten
vanhempi
sitoutus
31b07602a0

+ 284 - 15
app/adminapi/logic/master_worker/EngineerSettlementPermanentlyLogic.php

@@ -20,6 +20,7 @@ use app\common\model\master_worker\EngineerSettlementPermanently;
 use app\common\logic\BaseLogic;
 use app\common\model\master_worker\MasterWorker;
 use app\common\model\master_worker\SalaryItemPermanently;
+use DateTime;
 use think\facade\Db;
 use think\facade\Log;
 
@@ -161,12 +162,12 @@ class EngineerSettlementPermanentlyLogic extends BaseLogic
             Db::commit();
 
             // 删除该日期步进天数内的之前的快照
-            $ids = EngineerSettlementPermanently::where('status',0)->
+            /*$ids = EngineerSettlementPermanently::where('status',0)->
             where('settlement_time','between',[$settlementPermanently->last_settlement_time,$settlementPermanently->settlement_time])->column('id')??[];
             if(!empty($ids)){
                 EngineerSettlementPermanently::where('id',$ids)->delete();
                 SalaryItemPermanently::where('permanently_settlement_id',$ids)->delete();
-            }
+            }*/
 
             return true;
         } catch (\Exception $e) {
@@ -175,9 +176,23 @@ class EngineerSettlementPermanentlyLogic extends BaseLogic
             return false;
         }
     }
-
+    public static function getLastSettlementTime($master_worker_id,$conf_step_days = 7,$conf_days = null)
+    {
+        //查询该工程师上个结算日期
+        $last_settlement_time = EngineerSettlementPermanently::where('master_worker_id',$master_worker_id)->where('status',1)->order('settlement_time','desc')->value('settlement_time');
+        if(empty($last_settlement_time) || $last_settlement_time === '0000-00-00'){
+            return strtotime($conf_days);
+        }
+        $current_time = strtotime(date("Y-m-d",time()));
+        $last_st_time = $current_time - ($conf_step_days * 86400);
+        if(strtotime($last_settlement_time) < $last_st_time){
+            return $last_st_time;
+        }else{
+            return strtotime($last_settlement_time);
+        }
+    }
     /**
-     * @notes 定时任务
+     * @notes 定时任务 - 每天
      * @author likeadmin
      * @date 2025/06/09 10:33
      */
@@ -245,20 +260,274 @@ class EngineerSettlementPermanentlyLogic extends BaseLogic
         }
     }
 
+    /**
+     * @notes 定时任务 - 每周
+     * @author likeadmin
+     * @date 2025/06/09 10:33
+     */
+    public static function settlementRegularWeek($masterWorker_id = 0)
+    {
+        try {
+            // 兼职工程师-每周 period_type = 2
+            self::partTimeMaster($masterWorker_id,2);
 
-    public static function getLastSettlementTime($master_worker_id)
+            // 保单工程师-每周  period_type = 2
+            self::longTermMaster($masterWorker_id,2);
+
+            return true;
+        } catch (\Exception $e) {
+            self::setError($e->getFile().':'.$e->getLine().':'.$e->getMessage());
+            return false;
+        }
+    }
+
+    /**
+     * @notes 定时任务 - 每月
+     * @author likeadmin
+     * @date 2025/06/09 10:33
+     */
+    public static function settlementRegularManth($masterWorker_id = 0)
     {
-        //查询该工程师上个结算日期
-        $last_settlement_time = EngineerSettlementPermanently::where('master_worker_id',$master_worker_id)->where('status',1)->order('settlement_time','desc')->value('settlement_time');
-        if(empty($last_settlement_time) || $last_settlement_time === '0000-00-00'){
-            return strtotime(self::$conf_days);
+
+        try {
+            // 保单工程师 period_type = 3
+            self::longTermMaster($masterWorker_id,3);
+            // 全职工程师
+            self::fullTimeMaster($masterWorker_id,3);
+            return true;
+        } catch (\Exception $e) {
+            self::setError($e->getFile().':'.$e->getLine().':'.$e->getMessage());
+            return false;
         }
-        $current_time = strtotime(date("Y-m-d",time()));
-        $last_st_time = $current_time - (self::$conf_step_days * 86400);
-        if(strtotime($last_settlement_time) < $last_st_time){
-            return $last_st_time;
-        }else{
-            return strtotime($last_settlement_time);
+    }
+
+
+
+    public static function partTimeMaster($masterWorker_id = 0,$period_type = 0)
+    {
+        Db::startTrans();
+        try {
+            $master_type = 1;
+            $wh =  ['type' => $master_type];
+            $masterWorker_id && $wh['id'] = $masterWorker_id;
+            // 获取上周的周一开始与周末结束时间
+            $period_type == 2 && list($startTime,$endTime) = self::lastWeekTime();
+            $period_type == 3 && list($startTime,$endTime) = self::lastManthTime();
+            $conf_step_days = 0;
+            $period_type == 2 && $conf_step_days = 7;
+            $period_type == 3 && $conf_step_days = 30;
+            //$masterWorker_id
+            // audit_state = 1
+            $masterWorkers = MasterWorker::where($wh)->select()->toArray();
+            foreach ($masterWorkers as $masterWorker) {
+                $last_settlement_time = $startTime;
+                $settlement_time = $endTime;
+                $data = [
+                    "period_type"=>$period_type,"master_type"=>$master_type,
+                    'master_worker_id' => $masterWorker['id'],
+                    'last_settlement_time' => date('Y-m-d',$last_settlement_time),
+                    'settlement_time' => date('Y-m-d',$settlement_time),
+                    'step_days' => $conf_step_days,
+                    'status' => 0,
+                    'admin_id' => 0,
+                    'remark' => ''
+                ];
+                $wh = ["period_type"=>$period_type,"master_type"=>$master_type,'master_worker_id' => $masterWorker['id'],'settlement_time' => date('Y-m-d',$settlement_time), 'status' => 0];
+                $info = EngineerSettlementPermanently::where($wh)->findOrEmpty();
+                if($info->isEmpty()){
+                    $settlementPermanently = EngineerSettlementPermanently::create($data);
+                }else{
+                    EngineerSettlementPermanently::where($wh)->where('id',$info->id)->update($data);
+                    $settlementPermanently['id'] =  $info->id;
+                }
+
+                $salary_item_data = DictData::where('type_value','salary_item')->column('name','value');
+                $salaryItemPermanently = new SalaryItemPermanently();
+                foreach ($salary_item_data as $salary_item => $item_name) {
+                    $fu_name = 'salary_item_'.$salary_item;
+                    if(!method_exists(SalaryItemPermanently::class,$fu_name)){
+                        continue;
+                    }
+                    $salaryItemPermanently->$fu_name($settlementPermanently['id'],$masterWorker['id'],[
+                        "period_type"=>$period_type,"master_type"=>$master_type,
+                        'start_time'=>$last_settlement_time,
+                        'end_time'=>$settlement_time,
+                        'step_days'=>$conf_step_days,'item_name'=>$item_name
+                    ]);
+                }
+            }
+            Db::commit();
+            return true;
+        } catch (\Exception $e) {
+            Db::rollback();
+            self::setError($e->getFile().':'.$e->getLine().':'.$e->getMessage());
+            return false;
+        }
+    }
+
+    public static function longTermMaster($masterWorker_id = 0,$period_type = 0)
+    {
+        Db::startTrans();
+        try {
+            $master_type = 1;
+            $wh =  ['type' => $master_type];
+            $masterWorker_id && $wh['id'] = $masterWorker_id;
+            // 获取上周的周一开始与周末结束时间
+            $period_type == 2 && list($startTime,$endTime) = self::lastWeekTime();
+            $period_type == 3 && list($startTime,$endTime) = self::lastManthTime();
+            $conf_step_days = 0;
+            $period_type == 2 && $conf_step_days = 7;
+            $period_type == 3 && $conf_step_days = 30;
+            //$masterWorker_id
+            // audit_state = 1
+            $masterWorkers = MasterWorker::where($wh)->select()->toArray();
+            foreach ($masterWorkers as $masterWorker) {
+                $last_settlement_time = $startTime;
+                $settlement_time = $endTime;
+                $data = [
+                    "period_type"=>$period_type,"master_type"=>$master_type,
+                    'master_worker_id' => $masterWorker['id'],
+                    'last_settlement_time' => date('Y-m-d',$last_settlement_time),
+                    'settlement_time' => date('Y-m-d',$settlement_time),
+                    'step_days' => $conf_step_days,
+                    'status' => 0,
+                    'admin_id' => 0,
+                    'remark' => ''
+                ];
+                $wh = ["period_type"=>$period_type,"master_type"=>$master_type,'master_worker_id' => $masterWorker['id'],'settlement_time' => date('Y-m-d',$settlement_time), 'status' => 0];
+                $info = EngineerSettlementPermanently::where($wh)->findOrEmpty();
+                if($info->isEmpty()){
+                    $settlementPermanently = EngineerSettlementPermanently::create($data);
+                }else{
+                    EngineerSettlementPermanently::where($wh)->where('id',$info->id)->update($data);
+                    $settlementPermanently['id'] =  $info->id;
+                }
+
+                $salary_item_data = DictData::where('type_value','salary_item')->column('name','value');
+                $salaryItemPermanently = new SalaryItemPermanently();
+                foreach ($salary_item_data as $salary_item => $item_name) {
+                    $fu_name = 'salary_item_'.$salary_item;
+                    if(!method_exists(SalaryItemPermanently::class,$fu_name)){
+                        continue;
+                    }
+                    $salaryItemPermanently->$fu_name($settlementPermanently['id'],$masterWorker['id'],[
+                        "period_type"=>$period_type,"master_type"=>$master_type,
+                        'start_time'=>$last_settlement_time,
+                        'end_time'=>$settlement_time,
+                        'step_days'=>$conf_step_days,'item_name'=>$item_name
+                    ]);
+                }
+            }
+            Db::commit();
+            return true;
+        } catch (\Exception $e) {
+            Db::rollback();
+            self::setError($e->getFile().':'.$e->getLine().':'.$e->getMessage());
+            return false;
         }
     }
+
+    public static function fullTimeMaster($masterWorker_id = 0,$period_type = 0)
+    {
+        Db::startTrans();
+        try {
+            $master_type = 1;
+            $wh =  ['type' => $master_type];
+            $masterWorker_id && $wh['id'] = $masterWorker_id;
+            // 获取上周的周一开始与周末结束时间
+            $period_type == 2 && list($startTime,$endTime) = self::lastWeekTime();
+            $period_type == 3 && list($startTime,$endTime) = self::lastManthTime();
+            $conf_step_days = 0;
+            $period_type == 2 && $conf_step_days = 7;
+            $period_type == 3 && $conf_step_days = 30;
+            //$masterWorker_id
+            // audit_state = 1
+            $masterWorkers = MasterWorker::where($wh)->select()->toArray();
+            foreach ($masterWorkers as $masterWorker) {
+                $last_settlement_time = $startTime;
+                $settlement_time = $endTime;
+                $data = [
+                    "period_type"=>$period_type,"master_type"=>$master_type,
+                    'master_worker_id' => $masterWorker['id'],
+                    'last_settlement_time' => date('Y-m-d',$last_settlement_time),
+                    'settlement_time' => date('Y-m-d',$settlement_time),
+                    'step_days' => $conf_step_days,
+                    'status' => 0,
+                    'admin_id' => 0,
+                    'remark' => ''
+                ];
+                $wh = ["period_type"=>$period_type,"master_type"=>$master_type,'master_worker_id' => $masterWorker['id'],'settlement_time' => date('Y-m-d',$settlement_time), 'status' => 0];
+                $info = EngineerSettlementPermanently::where($wh)->findOrEmpty();
+                if($info->isEmpty()){
+                    $settlementPermanently = EngineerSettlementPermanently::create($data);
+                }else{
+                    EngineerSettlementPermanently::where($wh)->where('id',$info->id)->update($data);
+                    $settlementPermanently['id'] =  $info->id;
+                }
+
+                $salary_item_data = DictData::where('type_value','salary_item')->column('name','value');
+                $salaryItemPermanently = new SalaryItemPermanently();
+                foreach ($salary_item_data as $salary_item => $item_name) {
+                    $fu_name = 'salary_item_'.$salary_item;
+                    if(!method_exists(SalaryItemPermanently::class,$fu_name)){
+                        continue;
+                    }
+                    $salaryItemPermanently->$fu_name($settlementPermanently['id'],$masterWorker['id'],[
+                        "period_type"=>$period_type,"master_type"=>$master_type,
+                        'start_time'=>$last_settlement_time,
+                        'end_time'=>$settlement_time,
+                        'step_days'=>$conf_step_days,'item_name'=>$item_name
+                    ]);
+                }
+            }
+            Db::commit();
+            return true;
+        } catch (\Exception $e) {
+            Db::rollback();
+            self::setError($e->getFile().':'.$e->getLine().':'.$e->getMessage());
+            return false;
+        }
+    }
+
+
+
+    public static function lastWeekTime()
+    {
+        $today = new DateTime('today');
+        $last_week_monday = clone $today;
+        $last_week_monday->modify('this week -7 days')->setTime(0, 0, 0);
+        $last_week_sunday = clone $last_week_monday;
+        $last_week_sunday->modify('+6 days');
+        $last_week_start = $last_week_monday->getTimestamp(); // 上周一零点时间戳
+        $last_week_end = $last_week_sunday->getTimestamp()+86399;   // 上周日零点时间戳
+        return [
+            'startTime' => $last_week_start,
+            'endTime' => $last_week_end
+        ];
+    }
+
+    public static function lastManthTime()
+    {
+        $today = new DateTime('today');
+        // 获取上个月的开始与结束时间
+        $last_manth_monday = clone $today;
+        $last_manth_monday->modify('first day of last month')->setTime(0, 0, 0);
+        $last_manth_sunday = clone $last_manth_monday;
+        $last_manth_sunday->modify('last day of last month');
+        $last_manth_start = $last_manth_monday->getTimestamp();
+        $last_manth_end = $last_manth_sunday->getTimestamp()+86399;
+        return [
+            'startTime' => $last_manth_start,
+            'endTime' => $last_manth_end
+        ];
+    }
+
+
+
+
+
+
+
+
+
 }

+ 139 - 147
app/common/model/master_worker/SalaryItemPermanently.php

@@ -43,64 +43,43 @@ class SalaryItemPermanently extends BaseModel
     }
 
 
-    // 接单服务费 - 每周一次 不论等级都按 50%
+    // 接单服务费 - 每周一次 兼职、保单 不论等级都按 50%
     public function salary_item_1($permanently_settlement_id,$master_worker_id,$params,$extra = [])
     {
         try {
-            //$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
-            // 查询时间范围内所有已经完单的工单
-            $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',2)->
-            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);
+            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;
 
-            $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);
+                // 查询时间范围内所有已经完单的工单
+                $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',2)->
+                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());
@@ -256,6 +235,9 @@ class SalaryItemPermanently extends BaseModel
     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']])->
@@ -286,26 +268,21 @@ class SalaryItemPermanently extends BaseModel
     public function salary_item_7($permanently_settlement_id,$master_worker_id,$params,$extra = [])
     {
         try {
-            // 查询时间范围内所有投诉的工单
-            /*$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??[]);
+            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());
@@ -316,26 +293,38 @@ class SalaryItemPermanently extends BaseModel
     public function salary_item_8($permanently_settlement_id,$master_worker_id,$params,$extra = [])
     {
         try {
-            // 查询时间范围内所有投诉的工单
-            /*$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??[]);
+            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','=',2)->
+                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' => 2,
+                    '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());
@@ -346,60 +335,63 @@ class SalaryItemPermanently extends BaseModel
     public function salary_item_9($permanently_settlement_id,$master_worker_id,$params,$extra = [])
     {
         try {
-            //$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
-            // 查询时间范围内所有已经完单的工单
-            $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',2)->
-            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'];
+            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',2)->
+                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);
             }
-            $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());

+ 3 - 2
app/common/model/works/ServiceWork.php

@@ -83,8 +83,9 @@ class ServiceWork extends BaseModel
                 $is_settlement = true;
             }
 
-            // 长期工程师不结算
-            if((int)MasterWorker::where('id',$model->master_worker_id)->value('type') === 2){
+            // 兼职/长期/全职工程师 不立即结算
+            $master_type= (int)MasterWorker::where('id',$model->master_worker_id)->value('type');
+            if(in_array($master_type,[1,2,3])){
                 $is_settlement = false;
                 $model->service_status = 3;
                 $model->work_pay_status = 2;