1
0
liugc 1 жил өмнө
parent
commit
695a56f16f

+ 131 - 72
app/adminapi/logic/master_worker/EngineerSettlementLogic.php

@@ -15,7 +15,10 @@
 namespace app\adminapi\logic\master_worker;
 
 
+use app\common\enum\worker\WorkerAccountLogEnum;
+use app\common\logic\WorkerAccountLogLogic;
 use app\common\model\finance\MasterWorkerCaseOutLog;
+use app\common\model\financial\FinancialPaymentRecords;
 use app\common\model\financial\MasterSettlementDetails;
 use app\common\model\master_worker\EngineerSettlement;
 use app\common\logic\BaseLogic;
@@ -41,20 +44,10 @@ class EngineerSettlementLogic extends BaseLogic
      */
     public static function add(array $params, $adminId): bool
     {
-
-        /*判断表格中打款状态是否已打款:
-            已打款 - 再判断数据表la_engineer_settlement中状态是否真已打 - la_master_settlement_details 更新为 已结算及不参与下批次计算
-                                                                                对已结算的:添加实发扣款记录
-                                                                                            添加直接扣款记录
-        更新|添加xls到详细记录数据表:包括打款状态
-        检查 la_master_settlement_details 中该批号的所有记录,判断打款状态, 更新表格记录 : 已上传、全部已打款*/
-
-
-
         Db::startTrans();
         try {
             foreach ($params as $param) {
-                //$param['payment_status'] == 1
+                //$param['payment_status'] == 1  默认上传的都是已经打款了
                 $engineerSettlement = EngineerSettlement::where('master_worker_id', $param['master_worker_id'])
                     ->where('batch_number', $param['batch_number'])
                     ->where('is_export', 1)
@@ -62,76 +55,112 @@ class EngineerSettlementLogic extends BaseLogic
                     ->where('payment_status', 0)
                     ->findOrEmpty();
                 if(!$engineerSettlement->isEmpty()){
-                    MasterSettlementDetails::where('master_worker_id', $param['master_worker_id'])
-                        ->where('batch_number', $param['batch_number'])
-                        ->where('status', 2)
-                        ->update([
-                            'payment_status' => 1,
-                            'payment_time' => $param['settlement_time']??date('Y-m-d H:i:s'),
-                            'status'=>3, 'remark'=>''
+
+                    $masterWorker = MasterWorker::where('id', $param['master_worker_id'])->where('worker_number', $param['worker_number'])->find();
+                    if($masterWorker && $masterWorker->user_money >= $param['total_settlement_amount']){
+                        //$masterWorker->user_money = $masterWorker->user_money - $param['total_settlement_amount'];
+                        //$masterWorker->save();
+                        //实发扣款
+                        if($param['final_settlement_amount']){
+                            $final_res = WorkerAccountLogLogic::masterAccountLog($param['master_worker_id'],(float)$param['final_settlement_amount'],WorkerAccountLogEnum::UM_DEC_ADMIN,WorkerAccountLogEnum::DEC, '实发扣款','',[
+                                'engineerSettlementId'=>$engineerSettlement->id,
+                                'batch_number'=>$param['batch_number'],
+                            ]);
+                            if($final_res->id){
+                                MasterSettlementDetails::create([
+                                    'account_log_id' => $final_res->id,
+                                    'payment_time' => $param['settlement_time']??date('Y-m-d H:i:s'),
+                                    'batch_number' => $param['batch_number'],
+                                    'status' => 3,
+                                    'master_worker_id' => $param['master_worker_id'],
+                                    'amount_change' => -(float)$param['final_settlement_amount'],
+                                    'change_time' => time(),
+                                    'remark' => '实发扣款'
+                                ]);
+                            }
+                        }
+                        //直接扣款
+                        if($param['deduction_amount']){
+                            $deduction_res = WorkerAccountLogLogic::masterAccountLog($param['master_worker_id'],(float)$param['deduction_amount'],WorkerAccountLogEnum::UM_DEC_ADMIN,WorkerAccountLogEnum::DEC, '直接扣款','',[
+                                'engineerSettlementId'=>$engineerSettlement->id,
+                                'batch_number'=>$param['batch_number'],
+                            ]);
+                            if($deduction_res->id){
+                                MasterSettlementDetails::create([
+                                    'account_log_id' => $deduction_res->id,
+                                    'payment_time' => $param['settlement_time']??date('Y-m-d H:i:s'),
+                                    'batch_number' => $param['batch_number'],
+                                    'status' => 3,
+                                    'master_worker_id' => $param['master_worker_id'],
+                                    'amount_change' => -(float)$param['final_settlement_amount'],
+                                    'change_time' => time(),
+                                    'remark' => '直接扣款'
+                                ]);
+                            }
+                        }
+                        // 提现记录
+                        $case_remark = '应发:'.$param['total_settlement_amount'].($param['deduction_amount']>0?',扣款:'.$param['deduction_amount'].',扣款说明:'.$param['deduction_describe']:'').',实发:'.$param['final_settlement_amount'];
+                        MasterWorkerCaseOutLog::create([
+                            'sn' => generate_sn(MasterWorkerCaseOutLog::class,'sn'),
+                            'worker_id' => $masterWorker->id,
+                            'title' => '财务打款',
+                            'change_amount' => $param['total_settlement_amount'],
+                            'review_status' => 3,
+                            'admin_id' => $adminId,
+                            'remark' => '财务打款-'.$case_remark,
+                            'create_time' => time(),
+                            'update_time' => time(),
                         ]);
 
-                    // 添加实发扣款记录
-                $masterWorker = MasterWorker::where('id', $param['master_worker_id'])->where('worker_number', $param['worker_number'])->find();
-                if($masterWorker && $masterWorker->user_money >= $param['total_settlement_amount']){
-                    $masterWorker->user_money = $masterWorker->user_money - $param['total_settlement_amount'];
-                    $masterWorker->save();
-                    MasterWorkerCaseOutLog::create([
-                        'sn' => generate_sn(MasterWorkerCaseOutLog::class,'sn'),
-                        'worker_id' => $masterWorker->id,
-                        'title' => '财务打款',
-                        'change_amount' => $param['total_settlement_amount'],
-                        'review_status' => 3,
-                        'admin_id' => $adminId,
-                        'remark' => '财务打款',
-                        'create_time' => time(),
-                        'update_time' => time(),
-                    ]);
-                }else{
-                    throw new \Exception('工程师不存在、余额不足');
-                }
-添加直接扣款记录
+                        $engineerSettlement->deduction_amount = $param['deduction_amount']??0;
+                        $engineerSettlement->deduction_describe = $param['deduction_describe']??'';
+                        $engineerSettlement->final_settlement_amount = $param['final_settlement_amount']??0;
+                        $engineerSettlement->settlement_time = $param['settlement_time']??date('Y-m-d H:i:s');
+                        $engineerSettlement->settlement_details_remarks = $param['settlement_details_remarks']??'';
+                        $engineerSettlement->new_balance = $masterWorker->user_money;
+                        $engineerSettlement->payment_status = 1;
+                        $engineerSettlement->is_export = 2;
+                        $engineerSettlement->admin_id = $adminId;
+                        $engineerSettlement->is_deduction = 1;
+                        $engineerSettlement->save();
 
+                        MasterSettlementDetails::where('master_worker_id', $param['master_worker_id'])
+                            ->where('batch_number', $param['batch_number'])
+                            ->where('status', 2)
+                            ->update([
+                                'payment_status' => 1,
+                                'payment_time' => $param['settlement_time']??date('Y-m-d H:i:s'),
+                                'status'=>3, 'remark'=>''
+                            ]);
 
-                }
+                    }else{
 
+                        $engineerSettlement->deduction_amount = $param['deduction_amount']??0;
+                        $engineerSettlement->deduction_describe = $param['deduction_describe']??'';
+                        $engineerSettlement->final_settlement_amount = $param['final_settlement_amount']??0;
+                        $engineerSettlement->settlement_time = $param['settlement_time']??date('Y-m-d H:i:s');
+                        $engineerSettlement->settlement_details_remarks = ($param['settlement_details_remarks']??'').'-余额不足';
+                        $engineerSettlement->new_balance = $masterWorker->user_money;
+                        $engineerSettlement->payment_status = 1;
+                        $engineerSettlement->is_export = 2;
+                        $engineerSettlement->admin_id = $adminId;
+                        $engineerSettlement->is_deduction = 2;
+                        $engineerSettlement->save();
 
-                /*EngineerSettlement::create([
-                    'master_worker_id' => $param['master_worker_id'],
-                    'worker_number' => $param['worker_number'],
-                    'engineer_name' => $param['engineer_name'],
-                    'original_balance' => $param['original_balance'],
-                    'total_settlement_amount' => $param['total_settlement_amount'],
-                    'deduction_amount' => $param['deduction_amount'],
-                    'final_settlement_amount' => $param['final_settlement_amount'],
-                    'settlement_time' => $param['settlement_time'],
-                    'settlement_details_remarks' => $param['settlement_details_remarks'],
-                ]);*/
-
-                $masterWorker = MasterWorker::where('id', $param['master_worker_id'])->where('worker_number', $param['worker_number'])->find();
-                $user_money = $masterWorker->user_money;
-                if($masterWorker && $user_money >= $param['total_settlement_amount']){
-                    $user_money = $user_money - $param['total_settlement_amount'];
-                    $masterWorker->user_money = $user_money;
-                    MasterWorkerCaseOutLog::create([
-                        'sn' => generate_sn(MasterWorkerCaseOutLog::class,'sn'),
-                        'worker_id' => $masterWorker->id,
-                        'title' => '财务打款',
-                        'change_amount' => $param['total_settlement_amount'],
-                        'review_status' => 3,
-                        'admin_id' => $adminId,
-                        'remark' => '财务打款',
-                        'create_time' => time(),
-                        'update_time' => time(),
-                    ]);
-                }else{
-                    throw new \Exception('工程师不存在、余额不足');
+                        //throw new \Exception('工程师不存在、余额不足');
+                    }
                 }
+            }
 
-                $masterWorker->save();
-
+            $payment_num = MasterSettlementDetails::where('batch_number', $params[0]['batch_number'])->where('status','<', 3)->count('id');
+            FinancialPaymentRecords::where('batch_number', $params[0]['batch_number'])
+                ->where('upload_status', 1)
+                ->where('payment_status', 1)
+                ->update([
+                    'upload_status' => 3,
+                    'payment_status'=> $payment_num>0?2:3
+                ]);
 
-            }
             Db::commit();
             return true;
         } catch (\Exception $e) {
@@ -210,9 +239,39 @@ class EngineerSettlementLogic extends BaseLogic
 
     public static function engineerSettlementValidate($params)
     {
+        //
+        //上传表格中所有批号必须相同
+        //$engineerSettlement 中每条都不能为空
+        // $masterWorker->user_money >= $param['total_settlement_amount']
+        //$param['total_settlement_amount'] = $params['final_settlement_amount']+deduction_amount;
+
         try {
             if(empty($params)) throw new \Exception('表格数据为空');
+
+            //上传表格中所有 master_worker_id 不能存在重复
+
+            if(count(array_unique(array_column($params, 'master_worker_id')))>1){
+                throw new \Exception('上传表格中所有 master_worker_id 必须不能存在重复');
+            }
+
+            //上传表格中所有批号必须相同
+            if(count(array_unique(array_column($params, 'batch_number')))>1){
+                throw new \Exception('上传表格中所有批号必须相同');
+            }
+            // 每条数据在表 EngineerSettlement 中不能为空
+            $engineer_worker_ids = EngineerSettlement::where('batch_number', $params[0]['batch_number'])
+                ->where('is_export', 1)
+                ->where('is_deduction', 0)
+                ->where('payment_status', 0)
+                ->column('master_worker_id');
+
+
+
+
             foreach ($params as &$param) {
+                if(!in_array($param['master_worker_id'], $engineer_worker_ids)) throw new \Exception('工程师不存在');
+
+
                 //判断日期时间格式是否正确 2024/1/1 00:00:00 或 2024-1-1 00:00:00
                 if(!preg_match('/^[0-9]{4}\/[0-9]{1,2}\/[0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}$/', $param['settlement_time'])
                     && !preg_match('/^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}$/', $param['settlement_time'])){

+ 37 - 0
app/common/logic/WorkerAccountLogLogic.php

@@ -3,6 +3,7 @@
 namespace app\common\logic;
 
 use app\common\enum\worker\WorkerAccountLogEnum;
+use app\common\model\financial\MasterSettlementDetails;
 use app\common\model\master_worker\MasterWorker;
 use app\common\model\master_worker\MasterWorkerAccountLog;
 use think\Exception;
@@ -57,4 +58,40 @@ class WorkerAccountLogLogic extends BaseLogic
 
         return true;
     }
+    public static function masterAccountLog(int $worker_id,$changeAmount,$changeType,$action, string $title = '', string $remark = '',  array $extra = [])
+    {
+        $worker = MasterWorker::findOrFail($worker_id);
+        if($worker->isEmpty()) {
+            throw new Exception('工程师不存在');
+        }
+
+        $changeObject = WorkerAccountLogEnum::getChangeObject($changeType);
+        if(!$changeObject) {
+            throw new Exception('结算错误');
+        }
+
+        switch ($changeObject) {
+            // 用户余额
+            case WorkerAccountLogEnum::UM:
+                $left_amount = $worker->user_money;
+                break;
+            // 其他
+        }
+        $worker->user_money = $left_amount + ($action==1?$changeAmount:-$changeAmount);
+        $worker->save();
+        $data = [
+            'sn' => generate_sn(MasterWorkerAccountLog::class, 'sn', 20),
+            'title'=>$title,
+            'worker_id' => $worker_id,
+            'change_object' => $changeObject,
+            'change_type' => $changeType,
+            'action' => $action,
+            'left_amount' => $worker->user_money,
+            'change_amount' => $changeAmount,
+            'work_sn' => '',
+            'remark' => $remark,
+            'extra' => $extra ? json_encode($extra, JSON_UNESCAPED_UNICODE) : '',
+        ];
+        return MasterWorkerAccountLog::create($data);
+    }
 }