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()){ switch ($rule['type']){ case 0://按照总金额结算 $coupon_price = RechargeOrder::where('work_id',$work->id)->sum('coupon_price'); $worker_price = $work->work_total-$coupon_price; $settlement_amount = bcmul($worker_price, $rule['rate']); break; case 1://按照结算金额结算 $worker_price = $work->work_amount; $settlement_amount = bcmul($worker_price, $rule['rate']); break; case 2://按照服务总费用结算 //搜索所有优惠券 $coupon_price = RechargeOrder::where('work_id',$work->id)->sum('coupon_price'); $worker_price = $work->service_fee-$coupon_price; $settlement_amount = bcmul($worker_price, $rule['rate']); break; default://按照固定金额结算 $worker_price = $rule['rate']; $settlement_amount = $worker_price; } $work->worker_price = $worker_price; // 缴纳质保金 $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'] = $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(); //生成保修卡 EffectiveLogic::receiveEffective($work); } }