validator; } protected function buildQueryConfig(Request $request, string $scene = 'index'): array { $p = $request->all(); $config = []; $config['model'] = $this->modelClass; switch ($scene) { case 'index': // ====== ====== 筛选 ====== ====== // 业务id if (isset($p['salesperson_id']) && $p['salesperson_id']) { $config['where']['salesperson_id'] = $p['salesperson_id']; } // 初、终版 $config['where']['is_final'] = $p['is_final'] ?? 0; // 关键字 if (isset($p['keyword']) && $p['keyword']) { $k = '%' . $p['keyword'] . '%'; foreach (['pi_no', 'order_no', 'customer_snapshot'] as $col) { $config['orWhere'][] = [$col, 'like', $k]; } } $config['order']['id'] = 'desc'; break; case 'show': $config['where']['id'] = $p['id']; $config['with'][] = 'items'; $config['with'][] = 'items.options'; $config['with'][] = 'items.moneyValues'; $config['with'][] = 'accounts'; $config['with'][] = 'moneyValues'; break; case 'store': break; case 'update': $config['where']['id'] = $p['id']; break; case 'destroy': $config['where']['id'] = $p['id']; break; } return $config; } public function serviceStore(Request $request, array $data = []) { // 关联表较多,增加事务处理 return Db::transaction(function () use ($request, $data) { $data = $this->preProcess('Store', $data, $request); $dl = $this->getDataLimitFromRequest($request); $created = $this->logicCreate($data, $dl); // 表1 // 车辆 $cifTotalAmount = 0; $cifTotalAmountRate = 0; $cifTotalAmountCurrency = 'CNY'; // $profit = 0; foreach ($data['veh_list'] as $veh) { $veh['order_id'] = $created->id; $item = StockOrderItems::create($veh); // 表2 // 金额 // 表3 $item->addMoney('official_price', $veh['official_price']['currency'], $veh['official_price']['amount'], $veh['official_price']['rate'], '官方指导价'); $item->addMoney('discount_price', $veh['discount_price']['currency'], $veh['discount_price']['amount'], $veh['discount_price']['rate'], '优惠价'); $item->addMoney('unit_price', $veh['unit_price']['currency'], $veh['unit_price']['amount'], $veh['unit_price']['rate'], '单价'); $item->addMoney('total_price', $veh['total_price']['currency'], $veh['total_price']['amount'], $veh['total_price']['rate'], '总价'); $item->addMoney('handling_fee', $veh['handling_fee']['currency'], $veh['handling_fee']['amount'], $veh['handling_fee']['rate'], '手续费'); $item->addMoney('fob_transport_fee', $veh['fob_transport_fee']['currency'], $veh['fob_transport_fee']['amount'], $veh['fob_transport_fee']['rate'], 'FOB运输费'); $item->addMoney('port_misc_fee', $veh['port_misc_fee']['currency'], $veh['port_misc_fee']['amount'], $veh['port_misc_fee']['rate'], '港杂'); $item->addMoney('retrofit_fee', $veh['retrofit_fee']['currency'], $veh['retrofit_fee']['amount'], $veh['retrofit_fee']['rate'], '改装费'); // 利润 $profit = $veh['unit_price']['amount'] - ($veh['official_price']['amount'] / $created->contract_exchange_rate) - $veh['discount_price']['amount'] - $veh['handling_fee']['amount'] - $veh['fob_transport_fee']['amount'] - $veh['port_misc_fee']['amount'] - $veh['retrofit_fee']['amount']; $item->addMoney('profit', $veh['unit_price']['currency'], $profit, $veh['unit_price']['rate'], '利润'); // cif_total_amount $cifTotalAmount += $veh['total_price']['amount']; $cifTotalAmountRate = $veh['retrofit_fee']['rate']; $cifTotalAmountCurrency = $veh['retrofit_fee']['currency']; // 改装 if (count($veh['modify_list']) > 0) { foreach ($veh['modify_list'] as $modify) { $modify['order_item_id'] = $item->id; StockOrderItemOptions::create($modify); // 表4 } } } // 计算&&插入 表1 $created->addMoney('cif_total_amount', $cifTotalAmountCurrency, $cifTotalAmount, $cifTotalAmountRate, '合计到岸价'); // 账户 if (count($data['account_list']) > 0) { foreach ($data['account_list'] as $account) { $account['order_id'] = $created->id; $account['remit_date'] = strtotime($account['remit_date']); StockOrderAccounts::create($account); // 表5 } } return $this->postProcess('Store', $created); }); } public function beforeServiceStore($data, Request $request) { $userId = $request->user->uid; $data['order_no'] = generateStockNo(); $data['biz_date'] = strtotime($data['biz_date']); $data['eta_ship_date'] = strtotime($data['eta_ship_date']); $data['latest_arrival_date'] = strtotime($data['latest_arrival_date']); $data['salesperson_id'] = $userId; $data['salesperson_snapshot'] = User::where('id', $userId)->value('name') ?? ''; return $data; } protected function afterServiceStore($res) { // 处理原单 if ($res->is_final == 1 && $res->object_id > 0) { $order = StockOrders::find($res->object_id); $order->is_use = 1; $order->object_id = $res->id; if (!$order->save()) { flg('备货单【'.$order->order_no.'】创建终版成功,但更新原单失败'); } } return $res; } }