validator; } public function getLogic() { return new PurchaseOrdersLogic(); } /** * 获取前置预处理数据 * * @param array $data 原始返回值 * @return array 处理后的返回值 */ public function preQueryData(array $data) { $result = match ($data['scene']) { 'pi_no' => $this->getLogic()->getPiList(), 'order_no' => $this->getLogic()->getOrderNoListByPiNo($data['pi_no']), 'order_items' => $this->getLogic()->getOrderItemsListByOrderNo($data['order_id']), default => $data, }; return $this->postProcess('PreData', $result->toArray()); } public function afterServicePreData(array $data) { foreach ($data as $key => &$item) { if (isset($item['biz_date'])) { $item['biz_date'] = date('Y-m-d', $item['biz_date']); } } unset($item); return $data; } public function beforeServiceStore(array $data, Request $request) { $data['po_no'] = generateStockNo('CG'); $data['buyer_id'] = $request->user->uid; $data['buyer_name'] = User::where('id', $request->user->uid)->value('name'); return $data; } public function serviceStore(Request $request, array $data = [], string $scene = 'store') { // 使用事务确保数据一致性 return Db::transaction(function () use ($request, $data, $scene) { $data = $this->preProcess(ucfirst($scene), $data, $request); $dl = $this->getDataLimitFromRequest($request); // 创建采购单 $created = $this->logicCreate($data, $dl); if (isset($data['stock_order'])) { foreach ($data['stock_order'] as $order) { foreach ($order['stock_items'] as $item) { // 创建采购单明细 PurchaseOrderItems::create([ 'purchase_order_id' => $created->id, 'stock_id' => $order['stock_orders_id'], 'stock_items_id' => $item['stock_order_items_id'], 'stock_items_uqid' => $item['unique_id'], ]); } } } return $this->postProcess(ucfirst($scene), $created); }); } /** * 更新采购单 * * @param Request $request * @param array $data * @return mixed */ public function serviceUpdate(Request $request, array $data = [], string $scene = 'update') { // 使用事务确保数据一致性 return Db::transaction(function () use ($request, $data, $scene) { $data = $this->preProcess(ucfirst($scene), $data, $request); // 构建查询条件 $config = $this->buildQueryConfig($request, $scene); // 更新主表信息 $updated = $this->logicUpdateBy($config, $data); // 获取更新后的数据 $order = $this->logicShow($config); // 更新采购单明细 if (isset($data['stock_order'])) { // 先删除原有的明细 PurchaseOrderItems::where('purchase_order_id', $order->id)->delete(); // 重新创建明细 foreach ($data['stock_order'] as $orderData) { foreach ($orderData['stock_items'] as $item) { PurchaseOrderItems::create([ 'purchase_order_id' => $order->id, 'stock_id' => $orderData['stock_orders_id'], 'stock_items_id' => $item['stock_order_items_id'], 'stock_items_uqid' => $item['unique_id'], ]); } } } return $this->postProcess(ucfirst($scene), $order); }); } /** * 构建查询配置 * * @param Request $request * @param string $scene * @return array */ protected function buildQueryConfig(Request $request, string $scene = 'index'): array { $p = $request->all(); $config = []; $config['model'] = $this->modelClass; switch ($scene) { // case 'index': // // $config['with']['buyer'] = ['name', 'avatar']; // break; case 'update': $config['where']['id'] = $p['id'] ?? 0; break; case 'show': $config['where']['id'] = $p['id']; $config['with'] = [ 'items', 'items.stockOrder', 'items.stockOrderItems' ]; break; } return $config; } /** * 删除采购订单 * * @param Request $request * @return mixed */ public function serviceDestroy(Request $request) { // 使用事务确保数据一致性 return Db::transaction(function () use ($request) { // 构建查询条件 $config = $this->buildQueryConfig($request, 'update'); // 删除采购单明细 $order = $this->logicShow($config); if ($order && $order->items) { PurchaseOrderItems::where('purchase_order_id', $order->id)->delete(); } // 删除采购单主表 $deleted = $this->logicDestroy($config); return $this->postProcess('Destroy', $deleted); }); } // protected function afterServiceShow($item) // { // $item['items'] = $item->items->map(function ($item) { // $item['stock_order'] = $item->stockOrderItems; // return $item; // }); // var_dump($item->toArray()); // return $item; // } }