validator; } /** * 创建物品申请 前置 * * @param array $data * @param Request $request * @return array */ public function beforeServiceStore($data, Request $request): array { $user = (new UserService())->getUserInfo($request->user->uid, ''); $data['order_no'] = $this->generateOrderNo(); $data['applicant_id'] = $user['user']['id']; $data['applicant_name'] = $user['user']['name']; $data['leader_id'] = $user['user']['report_to']; $data['status'] = InvRequisition::STATUS_LEADER; return $data; } /** * 处理物品申请 * * @param Request $request * @param array $data * @return array */ public function serviceStore(Request $request, array $data, string $scene = '') { try { // 关联表增加事务处理 return Db::transaction(function () use ($request, $data) { $data = $this->preProcess('Store', $data, $request); $dl = $this->getDataLimitFromRequest($request); $created = $this->logicCreate($data, $dl); // 处理物品申请项 $this->processRequisitionItems($created, $data['items']); // 处理物品申请附件 $this->processRequisitionAttachmentItems($created, $data['attachment']); return $this->postProcess('Store', $created); }); } catch (\Throwable $e) { throw new BusinessException("创建物品申请失败:" . $e->getMessage()); } } /** * 更新物品申请 * * @param Request $request * @param array $data * @return array */ public function serviceUpdate(Request $request, array $data, string $scene = '') { try { // 关联表增加事务处理 return Db::transaction(function () use ($request, $data) { $data = $this->preProcess('Update', $data, $request); $config = $this->buildQueryConfig($request, 'update'); // 获取申请项/附件 $items = $data['items']; $attachment = $data['attachment']; unset($data['items']); unset($data['attachment']); // 执行更新操作 $this->logicUpdateBy($config, $data); // 获取更新后的完整记录 $updated = $this->logicShow($config); // 重新创建新的申请项 $this->processRequisitionItems((object)$updated, $items, true); // 重新创建新的附件 $this->processRequisitionAttachmentItems((object)$updated, $attachment, true); return $this->postProcess('Update', $updated); }); } catch (\Throwable $e) { throw new BusinessException("更新物品申请失败:" . $e->getMessage()."|".$e->getLine()."|".$e->getFile()); } } /** * 处理物品申请项 * * @param Model $created * @param array $items * @return void */ private function processRequisitionItems(Model $created, array $items, bool $isUpdate = false): void { if ($isUpdate) { $this->clearRequisitionItems($created->id); } foreach ($items as $item) { $itemData = [ 'requisition_id' => $created->id, 'item_id' => $item['item_id'], 'item_name_snap' => $item['item_name_snap'], // 修改:使用 snap 字段 'spec_model_snap' => $item['spec_model_snap'], // 修改:使用 snap 字段 'unit_snap' => $item['unit_snap'], // 修改:使用 snap 字段 'is_consumable_snap' => $item['is_consumable_snap'], // 修改:使用 snap 字段 'request_qty' => (int) $item['request_qty'] ?? 1, // 动态获取数量,转为整型 'approved_qty' => (int) $item['request_qty'] ?? 1, // 初始审批数量等于申请数量 'remark' => $item['remark'] ?? '' ]; InvRequisitionItem::create($itemData); } } /** * 处理物品申请项 * * @param Model $created * @param array $items * @return void */ private function processRequisitionAttachmentItems(Model $created, array $attachment, bool $isUpdate = false): void { if ($isUpdate) { $this->clearRequisitionAttachmentItems($created->id); } foreach ($attachment as $file) { $attachmentData = [ 'requisition_id' => $created->id, 'file_name' => $file['original_name'], 'file_path' => $file['file_path'] ]; InvRequisitionAttachment::create($attachmentData); } } /** * 删除申请项 * * @param int $requisitionId * @return void */ public function clearRequisitionItems(int $requisitionId): void { InvRequisitionItem::where('requisition_id', $requisitionId)->delete(); } /** * 删除申请项 * * @param int $requisitionId * @return void */ public function clearRequisitionAttachmentItems(int $requisitionId): void { InvRequisitionAttachment::where('requisition_id', $requisitionId)->delete(); } /** * 生成申请单号 * * @return string */ private function generateOrderNo(): string { return 'RQ' . date('Ymd') . strtoupper(substr(uniqid(), -6)); } }