toArray())); //工单已完结,进行结算,结算完成后设置work_pay_status为2,已结算 //获取工单对应的商品id $order_sns = RechargeOrder::where('work_id',$work->id)->column('sn'); $goods_id = OrderGoods::whereIn('sn',$order_sns)->value('goods_id'); $rule = PerformanceRules::whereFindInSet('goods_id',$goods_id)->findOrEmpty(); if($rule->isEmpty()){ $work->work_pay_status = 3; }else{ $work->work_pay_status = 2; } Log::info('calculatePerformance:'.json_encode($rule->toArray())); //工程师金额结算 if(!$rule->isEmpty()){ $coupon_price = RechargeOrder::where('work_id',$work->id)->sum('coupon_price'); switch ($rule['type']){ case 0://按照总金额结算 $settlement_amount = bcmul(bcsub($work->work_total ,$work->spare_total), $rule['rate'],2); break; case 1://按照结算金额结算 $worker_price = bcsub($work->work_amount ,$work->spare_total); $settlement_amount = bcmul($worker_price, $rule['rate'],2); break; case 2://按照服务总费用结算 //搜索所有优惠券 $worker_price = $work->service_fee-$coupon_price; $worker_price = bcsub($worker_price,$work->spare_total); $settlement_amount = bcmul($worker_price, $rule['rate'],2); break; default://按照固定金额结算 $worker_price = $work->service_fee-$coupon_price; $settlement_amount = $rule['rate']; } $work->worker_price = $worker_price; // 缴纳质保金 $masterWorkerInfo = MasterWorker::where('id', $work->master_worker_id)->where('retention_money_status', 1)->findOrEmpty()->toArray(); Log::info('缴纳质保金工程师信息:'.json_encode($masterWorkerInfo)); 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'] = $work->id; $amount = bcmul($worker_price, bcdiv($masterWorkerInfo['installment_ratio'], 100, 4),2); //$amount = bcmul($settlement_amount, bcdiv($masterWorkerInfo['installment_ratio'], 100, 4),2); $retentionData['amount'] = $amount; //$retentionData['remark'] = "分期缴纳质保金:该单实提成--{$settlement_amount},分期每单缴纳比例--{$masterWorkerInfo['installment_ratio']}%,缴纳金额--{$amount}"; $retentionData['remark'] = "分期缴纳质保金:工单提成--{$worker_price},分期每单缴纳比例--{$masterWorkerInfo['installment_ratio']}%,缴纳金额--{$amount}"; $settlement_amount -= (float)$amount; $surplusMoney = RetentionMoneyLogic::retentionPayment($retentionData); Log::info('分期缴纳质保金:'.$surplusMoney,$retentionData); if($surplusMoney === false){ Log::info('分期缴纳质保金支付失败-'.RetentionMoneyLogic::getError(),$retentionData); $settlement_amount += (float)$amount; }else{ $settlement_amount += (float)$surplusMoney; $work->earnest_money = $amount - $surplusMoney;//质保金金额 } } if($settlement_amount<0){ //修改工单为待结算,后台处理 $work->work_pay_status = 3; } //工程师可提现金额 $work->settlement_amount = $settlement_amount; //工程师加单金额判定 //$add_work_amount = 0;测试 $add_work_amount = WorkAddMoneyLogic::checkAddWork($work,$worker_price); $work->add_work_amount = $add_work_amount; //系统回收金额 $work->system_amount = $worker_price-$settlement_amount-$work->earnest_money-$work->add_work_amount; if($work->system_amount < 0){ $work->system_amount = 0; Log::info('system_amount小于0重置为0:'.$work->system_amount.'='.$worker_price.'-'.$settlement_amount.'-'.$work->earnest_money.'-'.$work->add_work_amount); } //门店结算金额 if($work->tenant_id > 0){ $percentage = TenantRatingCommissionLogic::getCommissionByTenantId($work->tenant_id); if($percentage > 0){ $work->system_amount = bcmul($worker_price, bcdiv($percentage, 100, 4),2); $work->tenant_all_amount = $worker_price - $work->system_amount; $work->tenant_amount = $work->tenant_all_amount - $settlement_amount - $work->earnest_money - $work->add_work_amount; } Log::info('平台抽成门店的比例:'.'门店ID:'.$work->tenant_id.',平台抽成:'.$percentage); } //工程师可提现金额,汇总了加单金额 $settlement_amount += (float)$work->add_work_amount; //工程师可提现金额,汇总 配件总金额 $status = ServiceWorkSpareAudit::where("service_work_id", $work->id)->value('status')??0; if((int)$status === 3){ // work_id $retentionMoneyLog = MasterWorkerRetentionMoneyLog::create([ 'sn' => generate_sn(MasterWorkerRetentionMoneyLog::class,'sn'), 'worker_id' => $work->master_worker_id, 'action' => WorkerAccountLogEnum::DEC, 'amount' => (float)$work->spare_total, 'work_id' => $work->id, 'remark' => '配件费超时审核冻结', ])->getData(); Log::info('配件费超时审核冻结:'.$work->master_worker_id.',工单Id:'.$work->id); }else{ $settlement_amount += (float)$work->spare_total; } Log::info('工单'.$work->id.',总服务费:'.$worker_price.'可提现金额:'.$settlement_amount.',加单金额:'.$work->add_work_amount.',缴纳质保金:'.$work->earnest_money.',系统回收金额:'.$work->system_amount.',门店总金额(包含工程师):'.$work->tenant_all_amount . ',门店实际金额:'.$work->tenant_amount); WorkerAccountLogLogic::addAccountLog($work,$settlement_amount,WorkerAccountLogEnum::UM_INC_ADMIN,WorkerAccountLogEnum::INC); } $work->save(); //生成保修卡 EffectiveLogic::receiveEffective($work); } public static function calculatePerformanceCommission($work) { Log::info('calculatePerformanceCommission:'.json_encode($work->toArray())); //工单已完结,进行结算,结算完成后设置work_pay_status为2,已结算 //获取工单对应的商品id $order_sns = RechargeOrder::where('work_id',$work->id)->column('sn'); $goods_id = OrderGoods::whereIn('sn',$order_sns)->value('goods_id'); $commissionConfig = MasterWorkerCommissionConfig::where('master_worker_id',$work->master_worker_id)->where('voucher_status',2)->find()->toArray(); $ratio = MasterWorkerCommissionRatio::where('commission_config_id',$commissionConfig['id'])->where('goods_category_id',$work->goods_category_id)->value('ratio'); Log::info('calculatePerformanceCommission:'.json_encode([$commissionConfig,$ratio])); if($commissionConfig && 0 < $ratio && $ratio < 1){ $work->work_pay_status = 2; //工程师金额结算 //$coupon_price = RechargeOrder::where('work_id',$work->id)->sum('coupon_price'); $work->worker_price = bcsub($work->work_amount,$work->spare_total); //$settlement_amount = bcmul($work->work_total, $ratio,2); // 运营新定 - 配件费不包进总工单金额扣除 $settlement_amount = bcmul($work->worker_price, $ratio,2); // 缴纳质保金 $masterWorkerInfo = MasterWorker::where('id', $work->master_worker_id)->where('retention_money_status', 1)->findOrEmpty()->toArray(); Log::info('缴纳质保金工程师信息:'.json_encode($masterWorkerInfo)); 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'] = $work->id; $amount = bcmul($work->worker_price, bcdiv($masterWorkerInfo['installment_ratio'], 100, 4),2); $retentionData['amount'] = $amount; $retentionData['remark'] = "分期缴纳质保金:工单提成--{$work->worker_price},分期每单缴纳比例--{$masterWorkerInfo['installment_ratio']}%,缴纳金额--{$amount}"; $settlement_amount -= (float)$amount; $surplusMoney = RetentionMoneyLogic::retentionPayment($retentionData); Log::info('Commission-分期缴纳质保金:'.$surplusMoney,$retentionData); if($surplusMoney === false){ Log::info('Commission-分期缴纳质保金支付失败-'.RetentionMoneyLogic::getError(),$retentionData); $settlement_amount += (float)$amount; }else{ $settlement_amount += (float)$surplusMoney; $work->earnest_money = $amount - $surplusMoney;//质保金金额 } } if($settlement_amount<0){ //修改工单为待结算,后台处理 $work->work_pay_status = 3; } //工程师可提现金额 $work->settlement_amount = $settlement_amount; //工程师加单金额判定 //$add_work_amount = 0;测试 $add_work_amount = WorkAddMoneyLogic::checkAddWork($work,$work->worker_price); $work->add_work_amount = $add_work_amount; //系统回收金额 $work->system_amount = $work->worker_price-$settlement_amount-$work->earnest_money-$work->add_work_amount; if($work->system_amount < 0){ $work->system_amount = 0; Log::info('calculatePerformanceCommission:system_amount小于0重置为0:'.$work->system_amount.'='.$work->worker_price.'-'.$settlement_amount.'-'.$work->earnest_money.'-'.$work->add_work_amount); } //门店结算金额 if($work->tenant_id > 0){ $percentage = TenantRatingCommissionLogic::getCommissionByTenantId($work->tenant_id); if($percentage > 0){ $work->system_amount = bcmul($work->worker_price, bcdiv($percentage, 100, 4),2); $work->tenant_all_amount = $work->worker_price - $work->system_amount; $work->tenant_amount = $work->tenant_all_amount - $settlement_amount - $work->earnest_money - $work->add_work_amount; } Log::info('calculatePerformanceCommission:平台抽成门店的比例:'.'门店ID:'.$work->tenant_id.',平台抽成:'.$percentage); } //工程师可提现金额,汇总了加单金额 $settlement_amount += (float)$work->add_work_amount; //工程师可提现金额,汇总 配件总金额 $status = ServiceWorkSpareAudit::where("service_work_id", $work->id)->value('status')??0; if((int)$status === 3){ // work_id $retentionMoneyLog = MasterWorkerRetentionMoneyLog::create([ 'sn' => generate_sn(MasterWorkerRetentionMoneyLog::class,'sn'), 'worker_id' => $work->master_worker_id, 'action' => WorkerAccountLogEnum::DEC, 'amount' => (float)$work->spare_total, 'work_id' => $work->id, 'remark' => '配件费超时审核冻结', ])->getData(); Log::info('配件费超时审核冻结:'.$work->master_worker_id.',工单Id:'.$work->id); }else{ $settlement_amount += (float)$work->spare_total; } Log::info('calculatePerformanceCommission:工单'.$work->id.',总服务费:'.$work->worker_price.'可提现金额:'.$settlement_amount.',加单金额:'.$work->add_work_amount.',缴纳质保金:'.$work->earnest_money.',系统回收金额:'.$work->system_amount.',门店总金额(包含工程师):'.$work->tenant_all_amount . ',门店实际金额:'.$work->tenant_amount); WorkerAccountLogLogic::addAccountLog($work,$settlement_amount,WorkerAccountLogEnum::UM_INC_ADMIN,WorkerAccountLogEnum::INC); } $work->save(); //生成保修卡 EffectiveLogic::receiveEffective($work); } /** * @notes 保修单结算 * @param $work * @return bool|mixed */ public static function effectivePerformance($work) { if(empty($work->order_effective_id)){ return false; } Log::info('effectivePerformance:'.json_encode($work->toArray())); // 判断该工单是否为新工程师 - 保修前工单的工程师是谁 $orderEffectiveLog = OrderEffectiveLog::where('id',$work->order_effective_id)->findOrEmpty(); if($orderEffectiveLog->effective_status == 3){ return false; } // 前工单 $serviceWork = ServiceWork::where('id',$orderEffectiveLog->work_id)->findOrEmpty(); if($serviceWork->master_worker_id != $work->master_worker_id){ // 扣掉 原工单工程师的提成+质保金 to 新工程师余额 + 惩罚金额 $income_fee = \app\adminapi\logic\effective\OrderEffectiveLogLogic::commissionAndAssuranceDeposit($serviceWork); $new_amount = bcadd((string)$income_fee,(string)$orderEffectiveLog->penalty_amount,2); $remark = '工单号:'.$work->work_sn.',扣除金额:'.$new_amount.',扣除原因:保修工单新工程师收益'; RetentionMoneyLogic::refundRetention([ 'remark'=>$remark, 'work_id'=>$work->id, 'worker_id'=>$serviceWork->master_worker_id, 'amount'=>$new_amount ],false); // 新工程师收益: 原工单工程师的提成+质保金 $remark = '保修单结算-工单号:'.$work->work_sn.',收益金额:'.$income_fee.',原因:保修工单新工程师收益'; WorkerAccountLogLogic::addAccountLog($work,$income_fee,WorkerAccountLogEnum::UM_INC_ADMIN,WorkerAccountLogEnum::INC,$remark); Log::info('effectivePerformance:'.$remark); }else{ $new_amount = $orderEffectiveLog->penalty_amount; $remark = '工单号:'.$work->work_sn.',扣除金额:'.$new_amount.',扣除原因:保修工单原工程师差额|罚金'; RetentionMoneyLogic::refundRetention([ 'remark'=>$remark, 'work_id'=>$work->id, 'worker_id'=>$serviceWork->master_worker_id, 'amount'=>$new_amount ],false); } $orderEffectiveLog->effective_status = 3; $orderEffectiveLog->save(); $work->work_pay_status = 2; $work->save(); return true; } /** * @notes 临时 - 计算工程师提成 * @param $work * @return void * @throws \think\Exception * @author liugc <466014217@qq.com> * @date 2025/4/23 10:27 */ public static function calculatePerformanceTmp($work) { Log::info('calculatePerformance:'.json_encode($work->toArray())); Db::startTrans(); try { $masterWorkerAccountLog = MasterWorkerAccountLog::where('action',1)->where('worker_id',$work->master_worker_id)->where('work_sn',$work->work_sn)->findOrEmpty(); $masterWorkerRetentionMoneyLog = MasterWorkerRetentionMoneyLog::where('action',1)->where('work_id',$work->id)->where('worker_id',$work->master_worker_id)->findOrEmpty(); $masterWorker = MasterWorker::where('id', $work->master_worker_id)->findOrEmpty(); if(!$masterWorkerRetentionMoneyLog->isEmpty()){ $masterWorker->earnest_money_usable -= $masterWorkerRetentionMoneyLog->amount; $masterWorkerRetentionMoneyLog->delete(); //MasterWorkerRetentionMoneyLog::destroy(['id'=>$masterWorkerRetentionMoneyLog->id]); } if(!$masterWorkerAccountLog->isEmpty()){ $masterWorker->user_money -= $masterWorkerAccountLog->change_amount; MasterSettlementDetails::where('account_log_id', $masterWorkerAccountLog->id)->delete(); //$masterWorkerAccountLog->delete(); MasterWorkerAccountLog::destroy(['id'=>$masterWorkerAccountLog->id],true); } $masterWorker->save(); //工单已完结,进行结算,结算完成后设置work_pay_status为2,已结算 //获取工单对应的商品id $order_sns = RechargeOrder::where('work_id',$work->id)->column('sn'); $goods_id = OrderGoods::whereIn('sn',$order_sns)->value('goods_id'); $rule = PerformanceRules::whereFindInSet('goods_id',$goods_id)->findOrEmpty(); if($rule->isEmpty()){ $work->work_pay_status = 3; }else{ $work->work_pay_status = 2; } Log::info('calculatePerformance:'.json_encode($rule->toArray())); //工程师金额结算 if(!$rule->isEmpty()){ $coupon_price = RechargeOrder::where('work_id',$work->id)->sum('coupon_price'); switch ($rule['type']){ case 0: case 1://按照结算金额结算 case 2: $worker_price = bcsub($work->work_amount ,$work->spare_total); $settlement_amount = bcmul($worker_price, $rule['rate'],2); break; } $work->worker_price = $worker_price; // 缴纳质保金 $masterWorkerInfo = MasterWorker::where('id', $work->master_worker_id)->where('retention_money_status', 1)->findOrEmpty()->toArray(); Log::info('缴纳质保金工程师信息:'.json_encode($masterWorkerInfo)); 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'] = $work->id; $amount = bcmul($worker_price, bcdiv($masterWorkerInfo['installment_ratio'], 100, 4),2); //$amount = bcmul($settlement_amount, bcdiv($masterWorkerInfo['installment_ratio'], 100, 4),2); $retentionData['amount'] = $amount; //$retentionData['remark'] = "分期缴纳质保金:该单实提成--{$settlement_amount},分期每单缴纳比例--{$masterWorkerInfo['installment_ratio']}%,缴纳金额--{$amount}"; $retentionData['remark'] = "分期缴纳质保金:工单提成--{$worker_price},分期每单缴纳比例--{$masterWorkerInfo['installment_ratio']}%,缴纳金额--{$amount}"; $settlement_amount -= (float)$amount; $surplusMoney = RetentionMoneyLogic::retentionPayment($retentionData); Log::info('分期缴纳质保金:'.$surplusMoney,$retentionData); if($surplusMoney === false){ Log::info('分期缴纳质保金支付失败-'.RetentionMoneyLogic::getError(),$retentionData); $settlement_amount += (float)$amount; }else{ $settlement_amount += (float)$surplusMoney; $work->earnest_money = $amount - $surplusMoney;//质保金金额 } } if($settlement_amount<0){ //修改工单为待结算,后台处理 $work->work_pay_status = 3; } //工程师可提现金额 $work->settlement_amount = $settlement_amount; //工程师加单金额判定 //$add_work_amount = 0;测试 $add_work_amount = WorkAddMoneyLogic::checkAddWork($work,$worker_price); $work->add_work_amount = $add_work_amount; //系统回收金额 $work->system_amount = $worker_price-$settlement_amount-$work->earnest_money-$work->add_work_amount; if($work->system_amount < 0){ $work->system_amount = 0; Log::info('system_amount小于0重置为0:'.$work->system_amount.'='.$worker_price.'-'.$settlement_amount.'-'.$work->earnest_money.'-'.$work->add_work_amount); } //门店结算金额 if($work->tenant_id > 0){ $percentage = TenantRatingCommissionLogic::getCommissionByTenantId($work->tenant_id); if($percentage > 0){ $work->system_amount = bcmul($worker_price, bcdiv($percentage, 100, 4),2); $work->tenant_all_amount = $worker_price - $work->system_amount; $work->tenant_amount = $work->tenant_all_amount - $settlement_amount - $work->earnest_money - $work->add_work_amount; } Log::info('平台抽成门店的比例:'.'门店ID:'.$work->tenant_id.',平台抽成:'.$percentage); } //工程师可提现金额,汇总了加单金额 $settlement_amount += (float)$work->add_work_amount; //工程师可提现金额,汇总 配件总金额 $status = ServiceWorkSpareAudit::where("service_work_id", $work->id)->value('status')??0; if((int)$status === 3){ // work_id $retentionMoneyLog = MasterWorkerRetentionMoneyLog::create([ 'sn' => generate_sn(MasterWorkerRetentionMoneyLog::class,'sn'), 'worker_id' => $work->master_worker_id, 'action' => WorkerAccountLogEnum::DEC, 'amount' => (float)$work->spare_total, 'work_id' => $work->id, 'remark' => '配件费超时审核冻结', ])->getData(); Log::info('配件费超时审核冻结:'.$work->master_worker_id.',工单Id:'.$work->id); }else{ $settlement_amount += (float)$work->spare_total; } Log::info('工单'.$work->id.',总服务费:'.$worker_price.'可提现金额:'.$settlement_amount.',加单金额:'.$work->add_work_amount.',缴纳质保金:'.$work->earnest_money.',系统回收金额:'.$work->system_amount.',门店总金额(包含工程师):'.$work->tenant_all_amount . ',门店实际金额:'.$work->tenant_amount); WorkerAccountLogLogic::addAccountLog($work,$settlement_amount,WorkerAccountLogEnum::UM_INC_ADMIN,WorkerAccountLogEnum::INC); } $work->save(); Db::commit(); } catch (\Exception $e) { Db::rollback(); throw new \Exception($e->getMessage()); } } }