Kaynağa Gözat

返修的时候,分配给其他工程师 ,计算 工程师的账号余额、质保金可用金额

liugc 1 yıl önce
ebeveyn
işleme
ba18e32155

+ 38 - 0
app/adminapi/logic/master_worker/RetentionMoneyLogic.php

@@ -90,6 +90,44 @@ class RetentionMoneyLogic extends BaseLogic
             }
             $masterWorkerInfo->save();
 
+            Db::commit();
+            return true;
+        } catch (\Exception $e) {
+            Db::rollback();
+            self::setError($e->getMessage());
+            return false;
+        }
+    }
+    public static function refund($params)
+    {
+        Db::startTrans();
+        try {
+            if(isset($params['work_id']) && !empty($params['work_id'])){
+                $workModel = ServiceWork::findOrEmpty($params['work_id']);
+                if($workModel->isEmpty()){
+                    throw new \Exception('工单不存在');
+                }
+            }
+            MasterWorkerRetentionMoneyLog::create([
+                'sn' => generate_sn(MasterWorkerRetentionMoneyLog::class,'sn'),
+                'worker_id' => $params['worker_id'],
+                'action' => WorkerAccountLogEnum::DEC,
+                'amount' => $params['amount'],
+                'work_id' => $params['work_id'],
+                'remark' => $params['remark'],
+                'return_work_id' => isset($params['return_work_id'])?$params['return_work_id']:0,
+            ]);
+
+            // $params['worker_id']
+            $masterWorkerInfo = MasterWorker::where('id', $params['worker_id'])->findOrEmpty();
+            $earnest_money_usable = $masterWorkerInfo->earnest_money_usable - $params['amount'];
+            if($earnest_money_usable < 0){
+                throw new \Exception('退可用质保金不足');
+            }
+            $masterWorkerInfo->earnest_money_usable = $earnest_money_usable;
+            //$masterWorkerInfo->earnest_money_freeze += $params['amount'];
+            $masterWorkerInfo->save();
+
             Db::commit();
             return true;
         } catch (\Exception $e) {

+ 42 - 0
app/adminapi/logic/works/ReturnWorkLogic.php

@@ -15,10 +15,16 @@
 namespace app\adminapi\logic\works;
 
 
+use app\adminapi\logic\master_worker\RetentionMoneyLogic;
+use app\common\enum\worker\WorkerAccountLogEnum;
+use app\common\logic\WorkerAccountLogLogic;
 use app\common\model\master_worker\MasterWorker;
+use app\common\model\master_worker\MasterWorkerAccountLog;
+use app\common\model\master_worker\MasterWorkerRetentionMoneyLog;
 use app\common\model\works\IssueWork;
 use app\common\model\works\ReturnWork;
 use app\common\logic\BaseLogic;
+use app\common\model\works\ServiceWork;
 use think\db\Query;
 use think\facade\Db;
 
@@ -162,10 +168,46 @@ class ReturnWorkLogic extends BaseLogic
             if($flag){
                 MasterWorker::setWorktotal('dec',$model->master_worker_id);
             }
+            $isIdentical = false;
+            if(!empty($model->master_worker_id) && $params['master_worker_id'] != $model->master_worker_id){
+                $isIdentical = true;
+            }
             $model->master_worker_id = $params['master_worker_id'];
             MasterWorker::setWorktotal('inc', $params['master_worker_id']);
             $model->user_id = $issueWork->user_id;
             $model->save();
+
+            // ******** 设置返修-工程师的账号余额、质保金可用金额 对应原工单原工程师 扣减
+            if($isIdentical && $issueWork->is_refunded_payment == 0){
+                $work = ServiceWork::where('id',$issueWork->service_work_id)->findOrEmpty();
+                if(!$work->isEmpty()){
+                    // 退余额
+                    $change_amount = MasterWorkerAccountLog::where([
+                        'change_object'=>WorkerAccountLogEnum::UM,'change_type'=>WorkerAccountLogEnum::UM_INC_ADMIN,
+                        'action'=>WorkerAccountLogEnum::INC,'worker_id'=>$issueWork->master_worker_id,
+                        'work_sn'=>$issueWork->work_sn])->value('change_amount');
+                    if($change_amount){
+                        $extra['ReturnWorkInfo'] = ['id'=>$model->id,'master_worker_id'=>$model->master_worker_id,'service_work_id'=>$model->service_work_id,'issue_work_id'=>$model->issue_work_id];
+                        $remark = '工单号:'.$issueWork->work_sn.',返修单号:'.$model->work_sn.',退款金额:'.$change_amount.',退款原因:返修工单退款';
+                        WorkerAccountLogLogic::addAccountLog($work,$change_amount,WorkerAccountLogEnum::UM_DEC_ADMIN,WorkerAccountLogEnum::DEC,$remark,$extra);
+                    }
+
+                    // 退质保金
+                    $retentionAmount = MasterWorkerRetentionMoneyLog::where(['action'=>WorkerAccountLogEnum::INC,
+                        'worker_id'=>$issueWork->master_worker_id,'work_id'=>$issueWork->service_work_id])
+                        ->value('amount');
+                    if($retentionAmount){
+                        $remark = '工单号:'.$issueWork->work_sn.',返修单号:'.$model->work_sn.',退款金额:'.$retentionAmount.',退款原因:返修工单退款';
+                        RetentionMoneyLogic::refund(['work_id'=>$issueWork->service_work_id,'worker_id'=>$issueWork->master_worker_id,
+                            'amount'=>$retentionAmount,'remark'=>$remark,'return_work_id'=>$model->id
+                        ]);
+                    }
+
+                    // 原工程师返修收成款是否已退 is_refunded_payment
+                    $issueWork->is_refunded_payment = 1;
+                    $issueWork->save();
+                }
+            }
             Db::commit();
             return true;
         } catch (\Exception $e) {

+ 1 - 0
app/api/logic/RetentionMoneyLogic.php

@@ -41,6 +41,7 @@ class RetentionMoneyLogic extends BaseLogic
                 'amount' => ((float)$params['amount']-$surplus_money),
                 'work_id' => $params['work_id'],
                 'remark' => $params['remark'],
+                'return_work_id' => isset($params['return_work_id'])?$params['return_work_id']:0,
             ]);
 
             Db::commit();

+ 50 - 0
app/api/logic/ReturnWorkLogic.php

@@ -1,9 +1,14 @@
 <?php
 namespace app\api\logic;
+use app\common\enum\worker\WorkerAccountLogEnum;
 use app\common\logic\BaseLogic;
+use app\common\logic\WorkerAccountLogLogic;
 use app\common\model\master_worker\MasterWorker;
+use app\common\model\master_worker\MasterWorkerAccountLog;
+use app\common\model\master_worker\MasterWorkerRetentionMoneyLog;
 use app\common\model\works\IssueWork;
 use app\common\model\works\ReturnWork;
+use app\common\model\works\ServiceWork;
 use think\db\Query;
 use think\facade\Db;
 
@@ -61,12 +66,57 @@ class ReturnWorkLogic extends BaseLogic
             //更新投诉状态
             $issue = IssueWork::where('service_work_id',$work->service_work_id)->findOrEmpty();
             if(!$issue->isEmpty()){
+
+                // 返修完成-工程师的账号余额、质保金可用金额 对应原工单 增加
+                if($issue->is_refunded_payment == 1 && $issue->issue_approval != 4){
+                    $serviceWork = ServiceWork::where('id',$work->service_work_id)->findOrEmpty();
+                    if(!$serviceWork->isEmpty()){
+                        // 加余额
+                        $change_amount = MasterWorkerAccountLog::where([
+                            'change_object'=>WorkerAccountLogEnum::UM,'change_type'=>WorkerAccountLogEnum::UM_INC_ADMIN,
+                            'action'=>WorkerAccountLogEnum::INC,'worker_id'=>$issue->master_worker_id,
+                            'work_sn'=>$issue->work_sn])->value('change_amount');
+                        // 加质保金
+                        $retentionAmount = MasterWorkerRetentionMoneyLog::where(['action'=>WorkerAccountLogEnum::INC,
+                            'worker_id'=>$issue->master_worker_id,'work_id'=>$issue->service_work_id])
+                            ->value('amount');
+                        $settlement_amount = $change_amount + $retentionAmount;
+
+
+                        // 返修单-新工程师 缴纳质保金 $work->id    $work->master_worker_id
+                        $masterWorkerInfo = MasterWorker::where('id', $work->master_worker_id)->findOrEmpty()->toArray();
+                        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'] = $issue->service_work_id;
+                            $retentionData['return_work_id'] = $work->id;
+                            $amount = bcmul($settlement_amount, bcdiv($masterWorkerInfo['installment_ratio'], 100, 4),2);
+                            $retentionData['amount'] = $amount;
+                            $retentionData['remark'] = "返修单-分期缴纳质保金:该单实提成--{$settlement_amount},分期每单缴纳比例--{$masterWorkerInfo['installment_ratio']}%,缴纳金额--{$amount}";
+                            $settlement_amount -= (float)$amount;
+                            $surplusMoney = RetentionMoneyLogic::add($retentionData);
+                            if($surplusMoney === false){
+                                Log::info('返修单-分期缴纳质保金支付失败-'.RetentionMoneyLogic::getError(),$retentionData);
+                                $settlement_amount += (float)$amount;
+                            }else{
+                                $settlement_amount += (float)$surplusMoney;
+                            }
+                        }
+                        $extra['ReturnWorkInfo'] = ['id'=>$work->id,'master_worker_id'=>$work->master_worker_id,'service_work_id'=>$work->service_work_id,'issue_work_id'=>$work->issue_work_id];
+                        $remark = '工单号:'.$issue->work_sn.',返修单号:'.$work->work_sn.',收益金额:'.$settlement_amount.',原因:返修工单新工程师收益';
+                        WorkerAccountLogLogic::addAccountLog($serviceWork,$settlement_amount,WorkerAccountLogEnum::UM_INC_ADMIN,WorkerAccountLogEnum::INC,$remark,$extra);
+                    }
+                }
+
                 $issue->issue_approval = 4;
                 $issue->complaint_status = 2;
                 $issue->responsible = 2;
                 $issue->finished_time = time();
                 $issue->save();
             }
+
+
+
             Db::commit();
             return true;
         }catch(\Exception $e){