Преглед изворни кода

add - 质保金后台配置 / 已分成金额按比例缴纳质保金

liugc пре 1 година
родитељ
комит
e4dc1d9b50

+ 6 - 2
app/adminapi/logic/master_worker/MasterWorkerLogic.php

@@ -104,13 +104,17 @@ class MasterWorkerLogic extends BaseLogic
                 'is_new_user' => $params['is_new_user'],
                 'estimate_money' => $params['estimate_money'],
                 'user_money' => $params['user_money'],
-                'earnest_money' => $params['earnest_money'],
                 'exp' => $params['exp'],
                 'lon' => $params['lon'],
                 'lat' => $params['lat'],
                 'distance' => $params['distance'],
+                'earnest_money' => $params['earnest_money'],
+                'earnest_money_usable' => $params['earnest_money_usable'],
+                'earnest_money_freeze' => $params['earnest_money_freeze'],
+                'installment_ratio' => $params['installment_ratio'],
+                'retention_pay_status' => $params['retention_pay_status'],
+                'retention_money_status' => $params['retention_money_status'],
             ]);
-
             Db::commit();
             return true;
         } catch (\Exception $e) {

+ 27 - 5
app/adminapi/logic/master_worker/RetentionMoneyLogic.php

@@ -26,13 +26,17 @@ class RetentionMoneyLogic extends BaseLogic
             $incWhere =$where;
             $incWhere[] = ['action', '=',WorkerAccountLogEnum::INC];
             $data = [];
-            $data['amount_inc_total'] = MasterWorkerRetentionMoneyLog::where($incWhere)
-                ->sum('amount');
+            //$data['amount_inc_total'] = MasterWorkerRetentionMoneyLog::where($incWhere)->sum('amount');
+            $data['amount_inc_total'] = $model->earnest_money;
+
             $outWhere = $where;
             $outWhere[] =['action', '=',WorkerAccountLogEnum::DEC];
-            $data['amount_dec_total'] = MasterWorkerRetentionMoneyLog::where($outWhere)
-                ->sum('amount');
-            $data['amount_available_total'] = $data['amount_inc_total'] - $data['amount_dec_total'];
+            //$data['amount_dec_total'] = MasterWorkerRetentionMoneyLog::where($outWhere)->sum('amount');
+            $data['amount_dec_total'] = $model->earnest_money_freeze;
+            //$data['amount_available_total'] = $data['amount_inc_total'] - $data['amount_dec_total'];
+            $data['amount_available_total'] = $model->earnest_money_usable;
+
+
             $data['retention_money_status'] = $model->retention_money_status;
             $data['retention_money_status_text'] = $model->retention_money_status_text;
             $data['retention_pay_status'] = $model->retention_pay_status;
@@ -65,6 +69,24 @@ class RetentionMoneyLogic extends BaseLogic
                 'work_id' => $params['work_id'],
                 'remark' => $params['remark'],
             ]);
+
+            // $params['worker_id']
+            $masterWorkerInfo = MasterWorker::where('id', $params['worker_id'])->findOrEmpty();
+            if($params['action'] == WorkerAccountLogEnum::INC){
+                $masterWorkerInfo->earnest_money_usable += $params['earnest_money_usable'];
+                if($masterWorkerInfo->earnest_money_usable > $masterWorkerInfo->earnest_money){
+                    throw new \Exception('可用质保金超过配置质保金');
+                }
+            }
+            if($params['action'] == WorkerAccountLogEnum::DEC){
+                $masterWorkerInfo->earnest_money_usable -= $params['earnest_money_usable'];
+                $masterWorkerInfo->earnest_money_freeze += $params['earnest_money_freeze'];
+                if($masterWorkerInfo->earnest_money_usable < 0){
+                    throw new \Exception('可用质保金不足');
+                }
+            }
+            $masterWorkerInfo->save();
+
             Db::commit();
             return true;
         } catch (\Exception $e) {

+ 22 - 0
app/api/logic/PerformanceLogic.php

@@ -6,9 +6,11 @@ use app\common\enum\worker\WorkerAccountLogEnum;
 use app\common\logic\BaseLogic;
 use app\common\logic\EffectiveLogic;
 use app\common\logic\WorkerAccountLogLogic;
+use app\common\model\master_worker\MasterWorker;
 use app\common\model\orders\RechargeOrder;
 use app\common\model\performance\PerformanceRules;
 use think\facade\Db;
+use think\facade\Log;
 
 
 /**
@@ -49,6 +51,26 @@ class PerformanceLogic extends BaseLogic
             $work->worker_price = $worker_price;
 
             $settlement_amount = bcmul($worker_price, $rule['rate']);
+
+            // 缴纳质保金
+            $masterWorkerInfo = MasterWorker::where('id', $work->master_worker_id)->findOrEmpty()->toArray();
+            if( $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'] = $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;
+                }
+            }
+
             WorkerAccountLogLogic::addAccountLog($work,$settlement_amount,WorkerAccountLogEnum::UM_INC_ADMIN,WorkerAccountLogEnum::INC);
         }
         $work->save();

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

@@ -0,0 +1,51 @@
+<?php
+namespace app\api\logic;
+
+use app\common\enum\worker\WorkerAccountLogEnum;
+use app\common\logic\BaseLogic;
+use app\common\model\master_worker\MasterWorker;
+use app\common\model\master_worker\MasterWorkerRetentionMoneyLog;
+use app\common\model\works\ServiceWork;
+use think\facade\Db;
+
+class RetentionMoneyLogic extends BaseLogic
+{
+
+    public static function add($params)
+    {
+        Db::startTrans();
+        try {
+            $surplus_money = 0;
+            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' => $params['action'],
+                'amount' => $params['amount'],
+                'work_id' => $params['work_id'],
+                'remark' => $params['remark'],
+            ]);
+
+            // $params['worker_id']
+            $masterWorkerInfo = MasterWorker::where('id', $params['worker_id'])->findOrEmpty();
+            $masterWorkerInfo->earnest_money_usable += $params['earnest_money_usable'];
+            if($masterWorkerInfo->earnest_money_usable > $masterWorkerInfo->earnest_money){
+                $surplus_money = $masterWorkerInfo->earnest_money_usable - $masterWorkerInfo->earnest_money;
+                $masterWorkerInfo->earnest_money_usable += ($params['earnest_money_usable']-$surplus_money);
+            }
+            $masterWorkerInfo->save();
+
+            Db::commit();
+            return $surplus_money;
+        } catch (\Exception $e) {
+            Db::rollback();
+            self::setError($e->getMessage());
+            return false;
+        }
+    }
+}