validator; } /** * 构造 CrudUtil 查询配置 */ protected function buildQueryConfig(Request $request, string $scene = 'default'): array { $p = $request->all(); $config = []; $config['model'] = $this->modelClass; switch ($scene) { case 'default': $config['where']['status'] = 1; $config['order']['sort'] = 'desc'; $config['order']['id'] = 'desc'; break; case 'index': if(isset($p['status']) && $p['status']){ $config['where']['status'] = $p['status']; } if(isset($p['applicant_id']) && $p['applicant_id'] == 'self'){ $config['where']['applicant_id'] = $request->user->uid; }elseif(isset($p['applicant_id']) && $p['applicant_id']){ $config['where']['applicant_id'] = $p['applicant_id']; } $config['order']['id'] = 'desc'; break; case 'show': $config['where']['id'] = $p['id']; break; case 'store': break; case 'update': $config['where']['id'] = $p['id']; break; case 'destroy': $config['where']['id'] = $p['id']; break; } return $config; } /** * 创建物品申请 前置 * * @param array $data * @param Request $request * @return array */ public function beforeServiceStore($data, Request $request): array { $user = (new UserService())->getUserInfo($request->user->uid, ''); if (empty($user['user']['id']) || empty($user['user']['name'])) { throw new BusinessException('无法获取当前用户信息'); } $data['order_no'] = $this->generateOrderNo(); $data['applicant_id'] = (int)$user['user']['id']; $data['applicant_name'] = (string)$user['user']['name']; $data['leader_id'] = $user['user']['report_to']; $data['status'] = InvRequisition::STATUS_LEADER; //查询物品管理人是否是一个 if(count($data['items'])>=2){ $manage_user = []; foreach ($data['items'] as $item) { $manage_user[] = InvItem::where('id',$item['item_id'])->value('manage_user_id'); } $manage_user = array_unique($manage_user); if(count($manage_user)>1){ throw new BusinessException("物品管理员不是同一人"); } } 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']); $res = $this->postProcess('Store', $created); $manage_user_id = InvItem::where('id',$data['items'][0]['item_id'])->value('manage_user_id'); $approval = [ 'id' => $res['id'], //申请单id 'applicant_id' => $res['applicant_id'], //申请人id 'manage_user_id' => $manage_user_id, ]; $this->startApproval($approval); return $res; }); } catch (\Throwable $e) { throw new BusinessException("创建物品申请失败:"); } } /** * 启动审批 */ public function startApproval($requisition) { // 启动审批 //$appro = new \app\common\utils\approval\service\ApprovalFlowService(); $appro = new \app\common\service\InvRequisitionApproveService(); $formData = [ 'manage_user_id' => $requisition['manage_user_id'], ]; return $appro->start('inv_requisition', 'inv_requisition', $requisition['id'], $formData, $requisition['applicant_id']); } /** * 更新物品申请 * * @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']?? 0, // 修改:使用 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)); } }