diff --git a/app/admin/controller/InvItemController.php b/app/admin/controller/InvItemController.php new file mode 100644 index 0000000..287e734 --- /dev/null +++ b/app/admin/controller/InvItemController.php @@ -0,0 +1,33 @@ +service = new InvItemService(); + } + + /** + * 列表页数据格式化 + * + * @param array $data + * @return array + */ + // protected function indexFormat($data) + // { + // if (isset($data['created_at'])) + // $data['created_at'] = date('Y-m-d H:i:s', $data['created_at']); + // if (isset($data['updated_at'])) + // $data['updated_at'] = date('Y-m-d H:i:s', $data['updated_at']); + // return $data; + // } +} \ No newline at end of file diff --git a/app/admin/controller/InvRequisitionController.php b/app/admin/controller/InvRequisitionController.php new file mode 100644 index 0000000..79b4375 --- /dev/null +++ b/app/admin/controller/InvRequisitionController.php @@ -0,0 +1,34 @@ +service = new InvRequisitionService(); + } + + /** + * 列表页数据格式化 + * + * @param array $data + * @return array + */ + // protected function indexFormat($data) + // { + // if (isset($data['created_at'])) + // $data['created_at'] = date('Y-m-d H:i:s', $data['created_at']); + // if (isset($data['updated_at'])) + // $data['updated_at'] = date('Y-m-d H:i:s', $data['updated_at']); + // return $data; + // } +} \ No newline at end of file diff --git a/app/common/controller/InvRequisitionAttachmentController.php b/app/common/controller/InvRequisitionAttachmentController.php new file mode 100644 index 0000000..8ba33e9 --- /dev/null +++ b/app/common/controller/InvRequisitionAttachmentController.php @@ -0,0 +1,33 @@ +service = new InvRequisitionAttachmentService(); + } + + /** + * 列表页数据格式化 + * + * @param array $data + * @return array + */ + // protected function indexFormat($data) + // { + // if (isset($data['created_at'])) + // $data['created_at'] = date('Y-m-d H:i:s', $data['created_at']); + // if (isset($data['updated_at'])) + // $data['updated_at'] = date('Y-m-d H:i:s', $data['updated_at']); + // return $data; + // } +} \ No newline at end of file diff --git a/app/common/controller/InvRequisitionItemController.php b/app/common/controller/InvRequisitionItemController.php new file mode 100644 index 0000000..bf1897c --- /dev/null +++ b/app/common/controller/InvRequisitionItemController.php @@ -0,0 +1,33 @@ +service = new InvRequisitionItemService(); + } + + /** + * 列表页数据格式化 + * + * @param array $data + * @return array + */ + // protected function indexFormat($data) + // { + // if (isset($data['created_at'])) + // $data['created_at'] = date('Y-m-d H:i:s', $data['created_at']); + // if (isset($data['updated_at'])) + // $data['updated_at'] = date('Y-m-d H:i:s', $data['updated_at']); + // return $data; + // } +} \ No newline at end of file diff --git a/app/common/controller/InvRequisitionItemReturnAttachmentController.php b/app/common/controller/InvRequisitionItemReturnAttachmentController.php new file mode 100644 index 0000000..8580b28 --- /dev/null +++ b/app/common/controller/InvRequisitionItemReturnAttachmentController.php @@ -0,0 +1,33 @@ +service = new InvRequisitionItemReturnAttachmentService(); + } + + /** + * 列表页数据格式化 + * + * @param array $data + * @return array + */ + // protected function indexFormat($data) + // { + // if (isset($data['created_at'])) + // $data['created_at'] = date('Y-m-d H:i:s', $data['created_at']); + // if (isset($data['updated_at'])) + // $data['updated_at'] = date('Y-m-d H:i:s', $data['updated_at']); + // return $data; + // } +} \ No newline at end of file diff --git a/app/common/controller/InvRequisitionItemReturnController.php b/app/common/controller/InvRequisitionItemReturnController.php new file mode 100644 index 0000000..7623719 --- /dev/null +++ b/app/common/controller/InvRequisitionItemReturnController.php @@ -0,0 +1,33 @@ +service = new InvRequisitionItemReturnService(); + } + + /** + * 列表页数据格式化 + * + * @param array $data + * @return array + */ + // protected function indexFormat($data) + // { + // if (isset($data['created_at'])) + // $data['created_at'] = date('Y-m-d H:i:s', $data['created_at']); + // if (isset($data['updated_at'])) + // $data['updated_at'] = date('Y-m-d H:i:s', $data['updated_at']); + // return $data; + // } +} \ No newline at end of file diff --git a/app/common/logic/InvItemLogic.php b/app/common/logic/InvItemLogic.php new file mode 100644 index 0000000..364c5c6 --- /dev/null +++ b/app/common/logic/InvItemLogic.php @@ -0,0 +1,17 @@ +validator; + } + + /** + * 生成 8-12 位的物品编码(默认10位) + * + * @param int $length 编码长度,默认为10(范围 8-12) + * @return string 返回大写的字母数字组合编码 + */ + private function generateItemCode($length = 10) + { + // 排除易混淆字符:0, O, o, 1, I, l + $chars = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ'; + $code = ''; + $maxIndex = strlen($chars) - 1; + + for ($i = 0; $i < $length; $i++) { + $code .= $chars[mt_rand(0, $maxIndex)]; + } + + return $code; + } + + + public function beforeServiceStore($data, Request $request): array + { + $data['item_code'] = $this->generateItemCode(); + $data['category_id'] = 0; + $data['spec_model'] = ''; + $data['unit'] = '件'; + $data['is_consumable'] = 0; + $data['stock_qty'] = 1; + $data['location'] = ''; + return $data; + } +} \ No newline at end of file diff --git a/app/common/service/InvRequisitionAttachmentService.php b/app/common/service/InvRequisitionAttachmentService.php new file mode 100644 index 0000000..aeec408 --- /dev/null +++ b/app/common/service/InvRequisitionAttachmentService.php @@ -0,0 +1,31 @@ +validator; + } +} \ No newline at end of file diff --git a/app/common/service/InvRequisitionItemReturnAttachmentService.php b/app/common/service/InvRequisitionItemReturnAttachmentService.php new file mode 100644 index 0000000..fd70cd1 --- /dev/null +++ b/app/common/service/InvRequisitionItemReturnAttachmentService.php @@ -0,0 +1,31 @@ +validator; + } +} \ No newline at end of file diff --git a/app/common/service/InvRequisitionItemReturnService.php b/app/common/service/InvRequisitionItemReturnService.php new file mode 100644 index 0000000..5955a77 --- /dev/null +++ b/app/common/service/InvRequisitionItemReturnService.php @@ -0,0 +1,297 @@ +validator; + } + + /** + * 将二维数组按指定 key 重组为关联数组,该 key 的值作为新数组的键, + * 其余元素组成子数组作为值。 + * + * @param array $array 原始二维数组 + * @param string $keyField 用作新键的字段名(如 'id') + * @return array 重组后的数组 + */ + private function groupArrayByKey($array, $keyField = 'id') + { + $result = []; + foreach ($array as $item) { + if (!isset($item[$keyField])) { + continue; // 跳过没有该 key 的项 + } + $key = $item[$keyField]; + // 移除用作键的字段 + unset($item[$keyField]); + $result[$key] = $item; + } + return $result; + } + + + /** + * 创建物品归还申请前置处理 + * + * @param array $data 归还申请数据 + * @param Request $request 请求对象 + * @return array 处理后的数据 + */ + public function beforeServiceStore($data, Request $request): array + { + try { + // // 模拟数据 + // $data = [ + // [ + // 'requisition_item_id' => 9, + // 'return_qty' => 1, + // 'apply_remark' => '申请备注', + // 'attachment' => [ + // [ + // 'original_name' => '附件1.jpg', + // 'file_path' => '/uploads/2023/07/01/attachment1.jpg' + // ], + // [ + // 'original_name' => '附件2.jpg', + // 'file_path' => '/uploads/2023/07/01/attachment2.jpg' + // ] + // ] + // ] + // ]; + + // 获取所有申请项ID + $reqItemIds = array_column($data, 'requisition_item_id'); + + // 参数校验 + if (empty($reqItemIds)) { + throw new BusinessException('未提供有效的申请项ID'); + } + + // 将申请项按 ID 重组为关联数组 + $newReqItems = $this->groupArrayByKey($data, 'requisition_item_id'); + + // 获取申请项明细 + $reqItemsArr = InvRequisitionItem::whereIn('id', $reqItemIds)->get()->toArray(); + + // 检查是否获取到有效数据 + if (empty($reqItemsArr)) { + throw new BusinessException('未找到对应的申请项'); + } + + // 获取用户信息 + $userService = new UserService(); + $user = $userService->getUserInfo($request->user->uid, ''); + + $arr = []; + foreach ($reqItemsArr as $reqItem) { + $reqItemId = $reqItem['id']; + + // 检查是否有对应的新申请项数据 + if (!isset($newReqItems[$reqItemId])) { + continue; + } + + $arr[] = [ + 'requisition_id' => $reqItem['requisition_id'], + 'requisition_item_id' => $reqItemId, + 'item_id' => $reqItem['item_id'], + 'apply_user_id' => $user['user']['id'], + 'apply_user_name' => $user['user']['name'], + 'return_qty' => $newReqItems[$reqItemId]['return_qty'], + 'apply_remark' => $newReqItems[$reqItemId]['apply_remark'] ?? '', + 'attachment' => $newReqItems[$reqItemId]['attachment'], + 'return_at' => time() + ]; + } + + return $arr; + } catch (BusinessException $e) { + throw $e; + } catch (\Throwable $th) { + throw new BusinessException('创建物品归还申请失败:' . $th->getMessage()); + } + } + + /** + * 处理物品申请 + * + * @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); + foreach ($data as $item) { + $created = $this->logicCreate($item, $dl); + $this->processRequisitionItemReturnAttachment($created, $item['attachment']); + } + return $this->postProcess('Store', $created); + }); + } catch (\Throwable $e) { + throw new BusinessException("创建物品申请失败:" . $e->getMessage()); + } + } + + + /** + * 更新物品归还申请前置处理 + * + * @param array $data 归还申请数据 + * @param Request $request 请求对象 + * @return array 处理后的数据 + */ + public function beforeServiceUpdate($data, Request $request): array + { + // // 模拟数据 + // $data = [ + // 'id' => 1, + // 'requisition_item_id' => 9, + // 'return_qty' => 1, + // 'apply_remark' => '申请备注22', + // 'attachment' => [ + // [ + // 'original_name' => '附件1.jpg', + // 'file_path' => '/uploads/2023/07/01/attachment1.jpg' + // ], + // [ + // 'original_name' => '附件2.jpg', + // 'file_path' => '/uploads/2023/07/01/attachment2.jpg' + // ], + // [ + // 'original_name' => '附件3.jpg', + // 'file_path' => '/uploads/2023/07/01/attachment3.jpg' + // ] + // ] + // ]; + + $data['return_at'] = time(); + return $data; + } + + /** + * 更新物品归还申请 + * + * @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'); + + $attachment = $data['attachment']; + unset($data['attachment']); + + $this->logicUpdateBy($config, $data); + // 获取更新后的完整记录 + $updated = $this->logicShow($config); + // 处理附件更新 + $this->processRequisitionItemReturnAttachment($updated, $attachment, true); + return $this->postProcess('Update', $updated); + }); + } catch (\Throwable $e) { + throw new BusinessException("更新物品归还申请失败:" . $e->getMessage()); + } + } + + /** + * 处理物品申请附件 + * + * @param Model $created + * @param array $items + * @param bool $isUpdate + * @return void + */ + private function processRequisitionItemReturnAttachment(Model $created, array $attachment, bool $isUpdate = false): void + { + if ($isUpdate) { + $this->clearRequisitionItemReturnAttachment($created->id); + } + + foreach ($attachment as $file) { + $attachmentData = [ + 'return_id' => $created->id, + 'file_name' => $file['original_name'], + 'file_path' => $file['file_path'] + ]; + InvRequisitionItemReturnAttachment::create($attachmentData); + } + } + + /** + * 清空物品申请附件 + * + * @param int $returnId + * @return void + */ + private function clearRequisitionItemReturnAttachment(int $returnId): void + { + InvRequisitionItemReturnAttachment::where('return_id', $returnId)->delete(); + } + + + + public function returnConfirm(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'); + + $attachment = $data['attachment']; + unset($data['attachment']); + + $this->logicUpdateBy($config, $data); + // 获取更新后的完整记录 + $updated = $this->logicShow($config); + // 处理附件更新 + $this->processRequisitionItemReturnAttachment($updated, $attachment, true); + return $this->postProcess('Update', $updated); + }); + + } catch (\Throwable $e) { + throw new BusinessException("确认归还物品失败:" . $e->getMessage()); + } + } +} \ No newline at end of file diff --git a/app/common/service/InvRequisitionItemService.php b/app/common/service/InvRequisitionItemService.php new file mode 100644 index 0000000..13206b3 --- /dev/null +++ b/app/common/service/InvRequisitionItemService.php @@ -0,0 +1,31 @@ +validator; + } +} \ No newline at end of file diff --git a/app/common/service/InvRequisitionService.php b/app/common/service/InvRequisitionService.php new file mode 100644 index 0000000..dfff880 --- /dev/null +++ b/app/common/service/InvRequisitionService.php @@ -0,0 +1,208 @@ +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)); + } +} \ No newline at end of file diff --git a/app/common/validate/InvItemValidate.php b/app/common/validate/InvItemValidate.php new file mode 100644 index 0000000..14ebf6d --- /dev/null +++ b/app/common/validate/InvItemValidate.php @@ -0,0 +1,29 @@ + [ + + ], + + 'update' => [ + + ] + ]; +} \ No newline at end of file diff --git a/app/common/validate/InvRequisitionAttachmentValidate.php b/app/common/validate/InvRequisitionAttachmentValidate.php new file mode 100644 index 0000000..b9f685f --- /dev/null +++ b/app/common/validate/InvRequisitionAttachmentValidate.php @@ -0,0 +1,29 @@ + [ + + ], + + 'update' => [ + + ] + ]; +} \ No newline at end of file diff --git a/app/common/validate/InvRequisitionItemReturnAttachmentValidate.php b/app/common/validate/InvRequisitionItemReturnAttachmentValidate.php new file mode 100644 index 0000000..26f3ee0 --- /dev/null +++ b/app/common/validate/InvRequisitionItemReturnAttachmentValidate.php @@ -0,0 +1,29 @@ + [ + + ], + + 'update' => [ + + ] + ]; +} \ No newline at end of file diff --git a/app/common/validate/InvRequisitionItemReturnValidate.php b/app/common/validate/InvRequisitionItemReturnValidate.php new file mode 100644 index 0000000..df63c90 --- /dev/null +++ b/app/common/validate/InvRequisitionItemReturnValidate.php @@ -0,0 +1,29 @@ + [ + + ], + + 'update' => [ + + ] + ]; +} \ No newline at end of file diff --git a/app/common/validate/InvRequisitionItemValidate.php b/app/common/validate/InvRequisitionItemValidate.php new file mode 100644 index 0000000..fed7231 --- /dev/null +++ b/app/common/validate/InvRequisitionItemValidate.php @@ -0,0 +1,29 @@ + [ + + ], + + 'update' => [ + + ] + ]; +} \ No newline at end of file diff --git a/app/common/validate/InvRequisitionValidate.php b/app/common/validate/InvRequisitionValidate.php new file mode 100644 index 0000000..584020d --- /dev/null +++ b/app/common/validate/InvRequisitionValidate.php @@ -0,0 +1,55 @@ + 'number', + 'borrow_reason' => 'require|max:255', + 'use_start_date' => 'require|date', + 'use_end_date' => 'date', + 'items' => 'require|array', + 'items.*.item_id' => 'require|number', + 'items.*.request_qty' => 'require|number|gt:0', + ]; + + // 提示 + protected $message = [ + 'applicant_id.number' => '申请人格式错误', + 'borrow_reason.require' => '领用事由不能为空', + 'borrow_reason.max' => '领用事由最多不能超过255个字符', + 'use_start_date.require' => '使用开始日期不能为空', + 'use_start_date.date' => '使用开始日期格式错误', + 'use_end_date.date' => '预计归还日期格式错误', + 'items.require' => '申请物品明细不能为空', + 'items.array' => '申请物品明细格式错误', + 'items.*.item_id.require' => '物品ID不能为空', + 'items.*.item_id.number' => '物品ID格式错误', + 'items.*.request_qty.require' => '申请数量不能为空', + 'items.*.request_qty.number' => '申请数量格式错误', + 'items.*.request_qty.gt' => '申请数量必须大于0', + ]; + + // 场景 + protected $scene = [ + 'store' => [ + + ], + + 'update' => [ + + ], + + 'apply' => [ + 'applicant_id', + 'borrow_reason', + 'use_start_date', + 'use_end_date', + 'items' + ] + ]; +} \ No newline at end of file diff --git a/app/controller/IndexController.php b/app/controller/IndexController.php index 4b4fb43..08922ab 100644 --- a/app/controller/IndexController.php +++ b/app/controller/IndexController.php @@ -74,25 +74,25 @@ class IndexController $options = [ 'controller' => [ 'module' => 'common', - 'name' => 'usedcar_crawl_results_images' + 'name' => 'inv_requisition_item_return_attachment' ], 'model' => [ 'module' => 'common', - 'name' => 'usedcar_crawl_results_images' + 'name' => 'inv_requisition_item_return_attachment' ], 'service' => [ 'module' => 'common', - 'name' => 'usedcar_crawl_results_images' + 'name' => 'inv_requisition_item_return_attachment' ], 'logic' => [ 'module' => 'common', - 'name' => 'usedcar_crawl_results_images' + 'name' => 'inv_requisition_item_return_attachment' ], 'validate' => [ 'module' => 'common', - 'name' => 'usedcar_crawl_results_images' + 'name' => 'inv_requisition_item_return_attachment' ], - 'table' => 'usedcar_crawl_results_images' + 'table' => 'inv_requisition_item_return_attachment' ]; $result = (new Generate($options))->doGenerate(); diff --git a/app/mobile/controller/InvRequisitionController.php b/app/mobile/controller/InvRequisitionController.php new file mode 100644 index 0000000..21d369e --- /dev/null +++ b/app/mobile/controller/InvRequisitionController.php @@ -0,0 +1,55 @@ +service = new InvRequisitionService(); + } + + /** + * 提交物品申请 + * + * @param Request $request + * @return mixed + */ + public function apply(Request $request) + { + try { + // 验证申请数据 + $data = $this->validate($this->service->getValidator(), $request->post(), 'apply'); + + // 处理申请逻辑 + $result = $this->service->serviceStore($request, $data, 'apply'); + + return $this->success($result, '申请提交成功'); + } catch (\Throwable $e) { + return $this->error($e->getMessage()); + } + } + + /** + * 列表页数据格式化 + * + * @param array $data + * @return array + */ + // protected function indexFormat($data) + // { + // if (isset($data['created_at'])) + // $data['created_at'] = date('Y-m-d H:i:s', $data['created_at']); + // if (isset($data['updated_at'])) + // $data['updated_at'] = date('Y-m-d H:i:s', $data['updated_at']); + // return $data; + // } +} \ No newline at end of file diff --git a/app/mobile/controller/InvRequisitionItemReturnController.php b/app/mobile/controller/InvRequisitionItemReturnController.php new file mode 100644 index 0000000..4a6ebbe --- /dev/null +++ b/app/mobile/controller/InvRequisitionItemReturnController.php @@ -0,0 +1,56 @@ +service = new InvRequisitionItemReturnService(); + } + + /** + * 列表页数据格式化 + * + * @param array $data + * @return array + */ + // protected function indexFormat($data) + // { + // if (isset($data['created_at'])) + // $data['created_at'] = date('Y-m-d H:i:s', $data['created_at']); + // if (isset($data['updated_at'])) + // $data['updated_at'] = date('Y-m-d H:i:s', $data['updated_at']); + // return $data; + // } + + + /** + * 物品兑换确认 + * + * @param Request $request + * @return mixed + */ + public function returnConfirm(Request $request) + { + try { + // 验证申请数据 + $data = $this->validate($this->service->getValidator(), $request->post(), 'returnConfirm'); + + // 处理申请逻辑 + $result = $this->service->returnConfirm($request, $data, 'returnConfirm'); + + return $this->success($result, '申请提交成功'); + } catch (\Throwable $e) { + return $this->error($e->getMessage()); + } + } +} \ No newline at end of file diff --git a/app/process/CheckWeb.php b/app/process/CheckWeb.php index f3439ef..aeca44c 100644 --- a/app/process/CheckWeb.php +++ b/app/process/CheckWeb.php @@ -12,16 +12,6 @@ class CheckWeb public function onWorkerStart() { - // if (getenv('ENVIRONMENT') === 'master') { - // new Crontab('0 */10 * * * *', function(){ - // $result = $this->tocurl('https://magicbridgeauto.com'); - // if (!preg_match('/magicbridgeauto/', $result['body'])) { - // flg("【magicbridgeauto】疑似被篡改"); - // } - // return true; - // }); - // } - // 每秒执行:队列二手车数据处理 new Crontab('* * * * * *', function(){ $service = new \app\common\utils\crawl\service\UsedCarCrawl(); diff --git a/composer.json b/composer.json index a696240..d502105 100644 --- a/composer.json +++ b/composer.json @@ -48,7 +48,8 @@ "webman/gateway-worker": "^1.0", "mpdf/mpdf": "^8.2", "jaeger/querylist": "^4.4", - "zoujingli/ip2region": "^3.0" + "zoujingli/ip2region": "^3.0", + "webman/log": "^2.1" }, "suggest": { "ext-event": "For better performance. " diff --git a/composer.lock b/composer.lock index 2bf0ca9..daaebaa 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ac2fa5a625069729975d072614509e1f", + "content-hash": "bf987c3cd5510fc0637d6b64d460dde1", "packages": [ { "name": "aliyuncs/oss-sdk-php", @@ -18,13 +18,7 @@ "type": "zip", "url": "https://api.github.com/repos/aliyun/aliyun-oss-php-sdk/zipball/483dd0b8bff5d47f0e4ffc99f6077a295c5ccbb5", "reference": "483dd0b8bff5d47f0e4ffc99f6077a295c5ccbb5", - "shasum": "", - "mirrors": [ - { - "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", - "preferred": true - } - ] + "shasum": "" }, "require": { "php": ">=5.3" @@ -59,16 +53,16 @@ }, { "name": "brick/math", - "version": "0.14.0", + "version": "0.14.1", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2" + "reference": "f05858549e5f9d7bb45875a75583240a38a281d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2", - "reference": "113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2", + "url": "https://api.github.com/repos/brick/math/zipball/f05858549e5f9d7bb45875a75583240a38a281d0", + "reference": "f05858549e5f9d7bb45875a75583240a38a281d0", "shasum": "" }, "require": { @@ -107,7 +101,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.14.0" + "source": "https://github.com/brick/math/tree/0.14.1" }, "funding": [ { @@ -115,7 +109,7 @@ "type": "github" } ], - "time": "2025-08-29T12:40:03+00:00" + "time": "2025-11-24T14:40:29+00:00" }, { "name": "carbonphp/carbon-doctrine-types", @@ -964,16 +958,16 @@ }, { "name": "illuminate/bus", - "version": "v12.37.0", + "version": "v12.41.1", "source": { "type": "git", "url": "https://github.com/illuminate/bus.git", - "reference": "797f768b7a52fb98443b8127cda71840cc2dbc5b" + "reference": "fdb568a20ad96461caa83b98ffc36d9e95894491" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/bus/zipball/797f768b7a52fb98443b8127cda71840cc2dbc5b", - "reference": "797f768b7a52fb98443b8127cda71840cc2dbc5b", + "url": "https://api.github.com/repos/illuminate/bus/zipball/fdb568a20ad96461caa83b98ffc36d9e95894491", + "reference": "fdb568a20ad96461caa83b98ffc36d9e95894491", "shasum": "" }, "require": { @@ -1013,20 +1007,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-10-30T12:22:29+00:00" + "time": "2025-11-30T17:14:13+00:00" }, { "name": "illuminate/collections", - "version": "v12.37.0", + "version": "v12.41.1", "source": { "type": "git", "url": "https://github.com/illuminate/collections.git", - "reference": "deb291b109b6f7fd776a3550a120771137b3c5d1" + "reference": "1cf6115f711ff775fcce547dee82d59cac33fedb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/collections/zipball/deb291b109b6f7fd776a3550a120771137b3c5d1", - "reference": "deb291b109b6f7fd776a3550a120771137b3c5d1", + "url": "https://api.github.com/repos/illuminate/collections/zipball/1cf6115f711ff775fcce547dee82d59cac33fedb", + "reference": "1cf6115f711ff775fcce547dee82d59cac33fedb", "shasum": "" }, "require": { @@ -1072,11 +1066,11 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-10-30T12:22:05+00:00" + "time": "2025-11-29T13:55:43+00:00" }, { "name": "illuminate/conditionable", - "version": "v12.37.0", + "version": "v12.41.1", "source": { "type": "git", "url": "https://github.com/illuminate/conditionable.git", @@ -1122,16 +1116,16 @@ }, { "name": "illuminate/container", - "version": "v12.37.0", + "version": "v12.41.1", "source": { "type": "git", "url": "https://github.com/illuminate/container.git", - "reference": "d6eaa8afd48dbe16b6b3c412a87479cad67eeb12" + "reference": "0489bc396de1537537750babec3a03ee7b753d1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/container/zipball/d6eaa8afd48dbe16b6b3c412a87479cad67eeb12", - "reference": "d6eaa8afd48dbe16b6b3c412a87479cad67eeb12", + "url": "https://api.github.com/repos/illuminate/container/zipball/0489bc396de1537537750babec3a03ee7b753d1f", + "reference": "0489bc396de1537537750babec3a03ee7b753d1f", "shasum": "" }, "require": { @@ -1179,20 +1173,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-09-12T14:35:11+00:00" + "time": "2025-11-28T18:51:53+00:00" }, { "name": "illuminate/contracts", - "version": "v12.37.0", + "version": "v12.41.1", "source": { "type": "git", "url": "https://github.com/illuminate/contracts.git", - "reference": "5ab717c8f0dd4e84be703796bbb415ccff8de57a" + "reference": "19e8938edb73047017cfbd443b96844b86da4a59" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/contracts/zipball/5ab717c8f0dd4e84be703796bbb415ccff8de57a", - "reference": "5ab717c8f0dd4e84be703796bbb415ccff8de57a", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/19e8938edb73047017cfbd443b96844b86da4a59", + "reference": "19e8938edb73047017cfbd443b96844b86da4a59", "shasum": "" }, "require": { @@ -1227,20 +1221,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-10-07T19:59:08+00:00" + "time": "2025-11-26T21:36:01+00:00" }, { "name": "illuminate/database", - "version": "v12.37.0", + "version": "v12.41.1", "source": { "type": "git", "url": "https://github.com/illuminate/database.git", - "reference": "e42bec6ad999bcc78ce9f3789f5ef937ee2e5982" + "reference": "199e9200a08c1841a31932e0a36a4094de84b72d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/database/zipball/e42bec6ad999bcc78ce9f3789f5ef937ee2e5982", - "reference": "e42bec6ad999bcc78ce9f3789f5ef937ee2e5982", + "url": "https://api.github.com/repos/illuminate/database/zipball/199e9200a08c1841a31932e0a36a4094de84b72d", + "reference": "199e9200a08c1841a31932e0a36a4094de84b72d", "shasum": "" }, "require": { @@ -1298,20 +1292,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-11-03T14:22:34+00:00" + "time": "2025-12-01T15:01:30+00:00" }, { "name": "illuminate/events", - "version": "v12.37.0", + "version": "v12.41.1", "source": { "type": "git", "url": "https://github.com/illuminate/events.git", - "reference": "e0de667c68040d59a6ffc09e914536a1186870f0" + "reference": "5fbf9a127cb649699071c2fe98ac1d39e4991da3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/events/zipball/e0de667c68040d59a6ffc09e914536a1186870f0", - "reference": "e0de667c68040d59a6ffc09e914536a1186870f0", + "url": "https://api.github.com/repos/illuminate/events/zipball/5fbf9a127cb649699071c2fe98ac1d39e4991da3", + "reference": "5fbf9a127cb649699071c2fe98ac1d39e4991da3", "shasum": "" }, "require": { @@ -1353,11 +1347,11 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-10-21T15:10:34+00:00" + "time": "2025-12-01T15:02:02+00:00" }, { "name": "illuminate/filesystem", - "version": "v12.37.0", + "version": "v12.41.1", "source": { "type": "git", "url": "https://github.com/illuminate/filesystem.git", @@ -1424,16 +1418,16 @@ }, { "name": "illuminate/http", - "version": "v12.37.0", + "version": "v12.41.1", "source": { "type": "git", "url": "https://github.com/illuminate/http.git", - "reference": "5c864f562b2fded08622ee19cd53260aef3db9a0" + "reference": "cdabd462fa50ab057da4807b980c861326c5a345" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/http/zipball/5c864f562b2fded08622ee19cd53260aef3db9a0", - "reference": "5c864f562b2fded08622ee19cd53260aef3db9a0", + "url": "https://api.github.com/repos/illuminate/http/zipball/cdabd462fa50ab057da4807b980c861326c5a345", + "reference": "cdabd462fa50ab057da4807b980c861326c5a345", "shasum": "" }, "require": { @@ -1482,11 +1476,11 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-10-28T14:38:15+00:00" + "time": "2025-11-28T18:00:52+00:00" }, { "name": "illuminate/macroable", - "version": "v12.37.0", + "version": "v12.41.1", "source": { "type": "git", "url": "https://github.com/illuminate/macroable.git", @@ -1532,16 +1526,16 @@ }, { "name": "illuminate/pagination", - "version": "v12.37.0", + "version": "v12.41.1", "source": { "type": "git", "url": "https://github.com/illuminate/pagination.git", - "reference": "1d95e70671177108b202e6ceb61bc7bc9924bdbf" + "reference": "87e7e3e7b02d6809b1bcd41782e1ca2c6d2a413b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/pagination/zipball/1d95e70671177108b202e6ceb61bc7bc9924bdbf", - "reference": "1d95e70671177108b202e6ceb61bc7bc9924bdbf", + "url": "https://api.github.com/repos/illuminate/pagination/zipball/87e7e3e7b02d6809b1bcd41782e1ca2c6d2a413b", + "reference": "87e7e3e7b02d6809b1bcd41782e1ca2c6d2a413b", "shasum": "" }, "require": { @@ -1578,11 +1572,11 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-09-02T15:31:06+00:00" + "time": "2025-11-16T14:36:17+00:00" }, { "name": "illuminate/pipeline", - "version": "v12.37.0", + "version": "v12.41.1", "source": { "type": "git", "url": "https://github.com/illuminate/pipeline.git", @@ -1634,16 +1628,16 @@ }, { "name": "illuminate/redis", - "version": "v12.37.0", + "version": "v12.41.1", "source": { "type": "git", "url": "https://github.com/illuminate/redis.git", - "reference": "8a397f00036974404d5d4d94eacfe8050af8e7f2" + "reference": "8dc6682638100db9feceaac3db206de752dd0f9a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/redis/zipball/8a397f00036974404d5d4d94eacfe8050af8e7f2", - "reference": "8a397f00036974404d5d4d94eacfe8050af8e7f2", + "url": "https://api.github.com/repos/illuminate/redis/zipball/8dc6682638100db9feceaac3db206de752dd0f9a", + "reference": "8dc6682638100db9feceaac3db206de752dd0f9a", "shasum": "" }, "require": { @@ -1684,11 +1678,11 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-10-26T17:11:19+00:00" + "time": "2025-11-20T20:50:40+00:00" }, { "name": "illuminate/session", - "version": "v12.37.0", + "version": "v12.41.1", "source": { "type": "git", "url": "https://github.com/illuminate/session.git", @@ -1745,16 +1739,16 @@ }, { "name": "illuminate/support", - "version": "v12.37.0", + "version": "v12.41.1", "source": { "type": "git", "url": "https://github.com/illuminate/support.git", - "reference": "480df979c8ffe700d6adb6e6e64abe04b32e02e3" + "reference": "c65715d8a41863ee3f2e22dc796b75c62143fca2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/480df979c8ffe700d6adb6e6e64abe04b32e02e3", - "reference": "480df979c8ffe700d6adb6e6e64abe04b32e02e3", + "url": "https://api.github.com/repos/illuminate/support/zipball/c65715d8a41863ee3f2e22dc796b75c62143fca2", + "reference": "c65715d8a41863ee3f2e22dc796b75c62143fca2", "shasum": "" }, "require": { @@ -1820,7 +1814,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-10-31T16:20:10+00:00" + "time": "2025-12-03T01:01:36+00:00" }, { "name": "jaeger/g-http", @@ -1979,16 +1973,16 @@ }, { "name": "laravel/serializable-closure", - "version": "v2.0.6", + "version": "v2.0.7", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "038ce42edee619599a1debb7e81d7b3759492819" + "reference": "cb291e4c998ac50637c7eeb58189c14f5de5b9dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/038ce42edee619599a1debb7e81d7b3759492819", - "reference": "038ce42edee619599a1debb7e81d7b3759492819", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/cb291e4c998ac50637c7eeb58189c14f5de5b9dd", + "reference": "cb291e4c998ac50637c7eeb58189c14f5de5b9dd", "shasum": "" }, "require": { @@ -1997,7 +1991,7 @@ "require-dev": { "illuminate/support": "^10.0|^11.0|^12.0", "nesbot/carbon": "^2.67|^3.0", - "pestphp/pest": "^2.36|^3.0", + "pestphp/pest": "^2.36|^3.0|^4.0", "phpstan/phpstan": "^2.0", "symfony/var-dumper": "^6.2.0|^7.0.0" }, @@ -2036,7 +2030,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2025-10-09T13:42:30+00:00" + "time": "2025-11-21T20:52:36+00:00" }, { "name": "league/flysystem", @@ -2515,16 +2509,16 @@ }, { "name": "mpdf/mpdf", - "version": "v8.2.6", + "version": "v8.2.7", "source": { "type": "git", "url": "https://github.com/mpdf/mpdf.git", - "reference": "dd30e3b01061cf8dfe65e7041ab4cc46d8ebdd44" + "reference": "b59670a09498689c33ce639bac8f5ba26721dab3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mpdf/mpdf/zipball/dd30e3b01061cf8dfe65e7041ab4cc46d8ebdd44", - "reference": "dd30e3b01061cf8dfe65e7041ab4cc46d8ebdd44", + "url": "https://api.github.com/repos/mpdf/mpdf/zipball/b59670a09498689c33ce639bac8f5ba26721dab3", + "reference": "b59670a09498689c33ce639bac8f5ba26721dab3", "shasum": "" }, "require": { @@ -2592,7 +2586,7 @@ "type": "custom" } ], - "time": "2025-08-18T08:51:51+00:00" + "time": "2025-12-01T10:18:02+00:00" }, { "name": "mpdf/psr-http-message-shim", @@ -2748,16 +2742,16 @@ }, { "name": "nesbot/carbon", - "version": "3.10.3", + "version": "3.11.0", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f" + "reference": "bdb375400dcd162624531666db4799b36b64e4a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f", - "reference": "8e3643dcd149ae0fe1d2ff4f2c8e4bbfad7c165f", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/bdb375400dcd162624531666db4799b36b64e4a1", + "reference": "bdb375400dcd162624531666db4799b36b64e4a1", "shasum": "" }, "require": { @@ -2765,9 +2759,9 @@ "ext-json": "*", "php": "^8.1", "psr/clock": "^1.0", - "symfony/clock": "^6.3.12 || ^7.0", + "symfony/clock": "^6.3.12 || ^7.0 || ^8.0", "symfony/polyfill-mbstring": "^1.0", - "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0" + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0" }, "provide": { "psr/clock-implementation": "1.0" @@ -2849,7 +2843,7 @@ "type": "tidelift" } ], - "time": "2025-09-06T13:39:36+00:00" + "time": "2025-12-02T21:04:28+00:00" }, { "name": "nikic/fast-route", @@ -3898,16 +3892,16 @@ }, { "name": "symfony/cache", - "version": "v7.3.6", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "1277a1ec61c8d93ea61b2a59738f1deb9bfb6701" + "reference": "a7a1325a5de2e54ddb45fda002ff528162e48293" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/1277a1ec61c8d93ea61b2a59738f1deb9bfb6701", - "reference": "1277a1ec61c8d93ea61b2a59738f1deb9bfb6701", + "url": "https://api.github.com/repos/symfony/cache/zipball/a7a1325a5de2e54ddb45fda002ff528162e48293", + "reference": "a7a1325a5de2e54ddb45fda002ff528162e48293", "shasum": "" }, "require": { @@ -3915,12 +3909,14 @@ "psr/cache": "^2.0|^3.0", "psr/log": "^1.1|^2|^3", "symfony/cache-contracts": "^3.6", - "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3", - "symfony/var-exporter": "^6.4|^7.0" + "symfony/var-exporter": "^6.4|^7.0|^8.0" }, "conflict": { "doctrine/dbal": "<3.6", + "ext-redis": "<6.1", + "ext-relay": "<0.12.1", "symfony/dependency-injection": "<6.4", "symfony/http-kernel": "<6.4", "symfony/var-dumper": "<6.4" @@ -3935,13 +3931,13 @@ "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "psr/simple-cache": "^1.0|^2.0|^3.0", - "symfony/clock": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/filesystem": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/filesystem": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -3976,7 +3972,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v7.3.6" + "source": "https://github.com/symfony/cache/tree/v7.4.0" }, "funding": [ { @@ -3996,7 +3992,7 @@ "type": "tidelift" } ], - "time": "2025-10-30T13:22:58+00:00" + "time": "2025-11-16T10:14:42+00:00" }, { "name": "symfony/cache-contracts", @@ -4076,16 +4072,16 @@ }, { "name": "symfony/clock", - "version": "v7.3.0", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24" + "reference": "9169f24776edde469914c1e7a1442a50f7a4e110" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", - "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24", + "url": "https://api.github.com/repos/symfony/clock/zipball/9169f24776edde469914c1e7a1442a50f7a4e110", + "reference": "9169f24776edde469914c1e7a1442a50f7a4e110", "shasum": "" }, "require": { @@ -4130,7 +4126,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.3.0" + "source": "https://github.com/symfony/clock/tree/v7.4.0" }, "funding": [ { @@ -4141,25 +4137,29 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2025-11-12T15:39:26+00:00" }, { "name": "symfony/console", - "version": "v7.3.6", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a" + "reference": "0bc0f45254b99c58d45a8fbf9fb955d46cbd1bb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/c28ad91448f86c5f6d9d2c70f0cf68bf135f252a", - "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a", + "url": "https://api.github.com/repos/symfony/console/zipball/0bc0f45254b99c58d45a8fbf9fb955d46cbd1bb8", + "reference": "0bc0f45254b99c58d45a8fbf9fb955d46cbd1bb8", "shasum": "" }, "require": { @@ -4167,7 +4167,7 @@ "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^7.2" + "symfony/string": "^7.2|^8.0" }, "conflict": { "symfony/dependency-injection": "<6.4", @@ -4181,16 +4181,16 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -4224,7 +4224,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.3.6" + "source": "https://github.com/symfony/console/tree/v7.4.0" }, "funding": [ { @@ -4244,7 +4244,7 @@ "type": "tidelift" } ], - "time": "2025-11-04T01:21:42+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { "name": "symfony/deprecation-contracts", @@ -4315,32 +4315,33 @@ }, { "name": "symfony/error-handler", - "version": "v7.3.6", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "bbe40bfab84323d99dab491b716ff142410a92a8" + "reference": "48be2b0653594eea32dcef130cca1c811dcf25c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/bbe40bfab84323d99dab491b716ff142410a92a8", - "reference": "bbe40bfab84323d99dab491b716ff142410a92a8", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/48be2b0653594eea32dcef130cca1c811dcf25c2", + "reference": "48be2b0653594eea32dcef130cca1c811dcf25c2", "shasum": "" }, "require": { "php": ">=8.2", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^6.4|^7.0" + "symfony/polyfill-php85": "^1.32", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "conflict": { "symfony/deprecation-contracts": "<2.5", "symfony/http-kernel": "<6.4" }, "require-dev": { - "symfony/console": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0|^8.0", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0", "symfony/webpack-encore-bundle": "^1.0|^2.0" }, "bin": [ @@ -4372,7 +4373,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.3.6" + "source": "https://github.com/symfony/error-handler/tree/v7.4.0" }, "funding": [ { @@ -4392,20 +4393,20 @@ "type": "tidelift" } ], - "time": "2025-10-31T19:12:50+00:00" + "time": "2025-11-05T14:29:59+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.3.3", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191" + "reference": "9dddcddff1ef974ad87b3708e4b442dc38b2261d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b7dc69e71de420ac04bc9ab830cf3ffebba48191", - "reference": "b7dc69e71de420ac04bc9ab830cf3ffebba48191", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9dddcddff1ef974ad87b3708e4b442dc38b2261d", + "reference": "9dddcddff1ef974ad87b3708e4b442dc38b2261d", "shasum": "" }, "require": { @@ -4422,13 +4423,14 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/error-handler": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^6.4|^7.0" + "symfony/stopwatch": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -4456,7 +4458,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.3" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.0" }, "funding": [ { @@ -4476,7 +4478,7 @@ "type": "tidelift" } ], - "time": "2025-08-13T11:49:31+00:00" + "time": "2025-10-28T09:38:46+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -4556,16 +4558,16 @@ }, { "name": "symfony/filesystem", - "version": "v7.3.6", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "e9bcfd7837928ab656276fe00464092cc9e1826a" + "reference": "d551b38811096d0be9c4691d406991b47c0c630a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/e9bcfd7837928ab656276fe00464092cc9e1826a", - "reference": "e9bcfd7837928ab656276fe00464092cc9e1826a", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/d551b38811096d0be9c4691d406991b47c0c630a", + "reference": "d551b38811096d0be9c4691d406991b47c0c630a", "shasum": "" }, "require": { @@ -4574,7 +4576,7 @@ "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/process": "^6.4|^7.0" + "symfony/process": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -4602,7 +4604,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.3.6" + "source": "https://github.com/symfony/filesystem/tree/v7.4.0" }, "funding": [ { @@ -4622,27 +4624,27 @@ "type": "tidelift" } ], - "time": "2025-11-05T09:52:27+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { "name": "symfony/finder", - "version": "v7.3.5", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "9f696d2f1e340484b4683f7853b273abff94421f" + "reference": "340b9ed7320570f319028a2cbec46d40535e94bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/9f696d2f1e340484b4683f7853b273abff94421f", - "reference": "9f696d2f1e340484b4683f7853b273abff94421f", + "url": "https://api.github.com/repos/symfony/finder/zipball/340b9ed7320570f319028a2cbec46d40535e94bd", + "reference": "340b9ed7320570f319028a2cbec46d40535e94bd", "shasum": "" }, "require": { "php": ">=8.2" }, "require-dev": { - "symfony/filesystem": "^6.4|^7.0" + "symfony/filesystem": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -4670,7 +4672,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.3.5" + "source": "https://github.com/symfony/finder/tree/v7.4.0" }, "funding": [ { @@ -4690,27 +4692,26 @@ "type": "tidelift" } ], - "time": "2025-10-15T18:45:57+00:00" + "time": "2025-11-05T05:42:40+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.3.6", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "6379e490d6ecfc5c4224ff3a754b90495ecd135c" + "reference": "769c1720b68e964b13b58529c17d4a385c62167b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6379e490d6ecfc5c4224ff3a754b90495ecd135c", - "reference": "6379e490d6ecfc5c4224ff3a754b90495ecd135c", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/769c1720b68e964b13b58529c17d4a385c62167b", + "reference": "769c1720b68e964b13b58529c17d4a385c62167b", "shasum": "" }, "require": { "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3.0", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php83": "^1.27" + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "^1.1" }, "conflict": { "doctrine/dbal": "<3.6", @@ -4719,13 +4720,13 @@ "require-dev": { "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.4.12|^7.1.5", - "symfony/clock": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/mime": "^6.4|^7.0", - "symfony/rate-limiter": "^6.4|^7.0" + "symfony/cache": "^6.4.12|^7.1.5|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -4753,7 +4754,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.3.6" + "source": "https://github.com/symfony/http-foundation/tree/v7.4.0" }, "funding": [ { @@ -4773,29 +4774,29 @@ "type": "tidelift" } ], - "time": "2025-11-06T11:05:57+00:00" + "time": "2025-11-13T08:49:24+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.3.6", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "f9a34dc0196677250e3609c2fac9de9e1551a262" + "reference": "7348193cd384495a755554382e4526f27c456085" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f9a34dc0196677250e3609c2fac9de9e1551a262", - "reference": "f9a34dc0196677250e3609c2fac9de9e1551a262", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/7348193cd384495a755554382e4526f27c456085", + "reference": "7348193cd384495a755554382e4526f27c456085", "shasum": "" }, "require": { "php": ">=8.2", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^7.3", - "symfony/http-foundation": "^7.3", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^7.3|^8.0", + "symfony/http-foundation": "^7.4|^8.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -4805,6 +4806,7 @@ "symfony/console": "<6.4", "symfony/dependency-injection": "<6.4", "symfony/doctrine-bridge": "<6.4", + "symfony/flex": "<2.10", "symfony/form": "<6.4", "symfony/http-client": "<6.4", "symfony/http-client-contracts": "<2.5", @@ -4822,27 +4824,27 @@ }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^6.4|^7.0", - "symfony/clock": "^6.4|^7.0", - "symfony/config": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/css-selector": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/dom-crawler": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/dom-crawler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", "symfony/http-client-contracts": "^2.5|^3", - "symfony/process": "^6.4|^7.0", - "symfony/property-access": "^7.1", - "symfony/routing": "^6.4|^7.0", - "symfony/serializer": "^7.1", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^7.1|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/serializer": "^7.1|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", "symfony/translation-contracts": "^2.5|^3", - "symfony/uid": "^6.4|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0", - "symfony/var-exporter": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0", "twig/twig": "^3.12" }, "type": "library", @@ -4871,7 +4873,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.3.6" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.0" }, "funding": [ { @@ -4891,24 +4893,25 @@ "type": "tidelift" } ], - "time": "2025-11-06T20:58:12+00:00" + "time": "2025-11-27T13:38:24+00:00" }, { "name": "symfony/mime", - "version": "v7.3.4", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "b1b828f69cbaf887fa835a091869e55df91d0e35" + "reference": "bdb02729471be5d047a3ac4a69068748f1a6be7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/b1b828f69cbaf887fa835a091869e55df91d0e35", - "reference": "b1b828f69cbaf887fa835a091869e55df91d0e35", + "url": "https://api.github.com/repos/symfony/mime/zipball/bdb02729471be5d047a3ac4a69068748f1a6be7a", + "reference": "bdb02729471be5d047a3ac4a69068748f1a6be7a", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, @@ -4923,11 +4926,11 @@ "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/property-access": "^6.4|^7.0", - "symfony/property-info": "^6.4|^7.0", - "symfony/serializer": "^6.4.3|^7.0.3" + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4.3|^7.0.3|^8.0" }, "type": "library", "autoload": { @@ -4959,7 +4962,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.3.4" + "source": "https://github.com/symfony/mime/tree/v7.4.0" }, "funding": [ { @@ -4979,7 +4982,7 @@ "type": "tidelift" } ], - "time": "2025-09-16T08:38:17+00:00" + "time": "2025-11-16T10:14:42+00:00" }, { "name": "symfony/polyfill-ctype", @@ -5816,22 +5819,23 @@ }, { "name": "symfony/string", - "version": "v7.3.4", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "f96476035142921000338bad71e5247fbc138872" + "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/f96476035142921000338bad71e5247fbc138872", - "reference": "f96476035142921000338bad71e5247fbc138872", + "url": "https://api.github.com/repos/symfony/string/zipball/d50e862cb0a0e0886f73ca1f31b865efbb795003", + "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-grapheme": "~1.33", "symfony/polyfill-intl-normalizer": "~1.0", "symfony/polyfill-mbstring": "~1.0" }, @@ -5839,11 +5843,11 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/emoji": "^7.1", - "symfony/http-client": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4|^7.0" + "symfony/var-exporter": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -5882,7 +5886,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.3.4" + "source": "https://github.com/symfony/string/tree/v7.4.0" }, "funding": [ { @@ -5902,27 +5906,27 @@ "type": "tidelift" } ], - "time": "2025-09-11T14:36:48+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { "name": "symfony/translation", - "version": "v7.3.4", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "ec25870502d0c7072d086e8ffba1420c85965174" + "reference": "2d01ca0da3f092f91eeedb46f24aa30d2fca8f68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/ec25870502d0c7072d086e8ffba1420c85965174", - "reference": "ec25870502d0c7072d086e8ffba1420c85965174", + "url": "https://api.github.com/repos/symfony/translation/zipball/2d01ca0da3f092f91eeedb46f24aa30d2fca8f68", + "reference": "2d01ca0da3f092f91eeedb46f24aa30d2fca8f68", "shasum": "" }, "require": { "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.5|^3.0" + "symfony/translation-contracts": "^2.5.3|^3.3" }, "conflict": { "nikic/php-parser": "<5.0", @@ -5941,17 +5945,17 @@ "require-dev": { "nikic/php-parser": "^5.0", "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/console": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^6.4|^7.0", + "symfony/routing": "^6.4|^7.0|^8.0", "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^6.4|^7.0" + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -5982,7 +5986,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.3.4" + "source": "https://github.com/symfony/translation/tree/v7.4.0" }, "funding": [ { @@ -6002,7 +6006,7 @@ "type": "tidelift" } ], - "time": "2025-09-07T11:39:36+00:00" + "time": "2025-11-27T13:27:24+00:00" }, { "name": "symfony/translation-contracts", @@ -6088,16 +6092,16 @@ }, { "name": "symfony/var-dumper", - "version": "v7.3.5", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "476c4ae17f43a9a36650c69879dcf5b1e6ae724d" + "reference": "41fd6c4ae28c38b294b42af6db61446594a0dece" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/476c4ae17f43a9a36650c69879dcf5b1e6ae724d", - "reference": "476c4ae17f43a9a36650c69879dcf5b1e6ae724d", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/41fd6c4ae28c38b294b42af6db61446594a0dece", + "reference": "41fd6c4ae28c38b294b42af6db61446594a0dece", "shasum": "" }, "require": { @@ -6109,10 +6113,10 @@ "symfony/console": "<6.4" }, "require-dev": { - "symfony/console": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/uid": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", "twig/twig": "^3.12" }, "bin": [ @@ -6151,7 +6155,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.3.5" + "source": "https://github.com/symfony/var-dumper/tree/v7.4.0" }, "funding": [ { @@ -6171,20 +6175,20 @@ "type": "tidelift" } ], - "time": "2025-09-27T09:00:46+00:00" + "time": "2025-10-27T20:36:44+00:00" }, { "name": "symfony/var-exporter", - "version": "v7.3.4", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "0f020b544a30a7fe8ba972e53ee48a74c0bc87f4" + "reference": "03a60f169c79a28513a78c967316fbc8bf17816f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0f020b544a30a7fe8ba972e53ee48a74c0bc87f4", - "reference": "0f020b544a30a7fe8ba972e53ee48a74c0bc87f4", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/03a60f169c79a28513a78c967316fbc8bf17816f", + "reference": "03a60f169c79a28513a78c967316fbc8bf17816f", "shasum": "" }, "require": { @@ -6192,9 +6196,9 @@ "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { - "symfony/property-access": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -6232,7 +6236,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.3.4" + "source": "https://github.com/symfony/var-exporter/tree/v7.4.0" }, "funding": [ { @@ -6252,7 +6256,7 @@ "type": "tidelift" } ], - "time": "2025-09-11T10:12:26+00:00" + "time": "2025-09-11T10:15:23+00:00" }, { "name": "topthink/think-container", @@ -6641,16 +6645,16 @@ }, { "name": "webman/database", - "version": "v2.1.6", + "version": "v2.1.7", "source": { "type": "git", "url": "https://github.com/webman-php/database.git", - "reference": "943c5a0f92d8959d9160c2ee3925112b15c308c8" + "reference": "81a8a834cc8db5a5dbb46fe0073a9d5ac73848f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webman-php/database/zipball/943c5a0f92d8959d9160c2ee3925112b15c308c8", - "reference": "943c5a0f92d8959d9160c2ee3925112b15c308c8", + "url": "https://api.github.com/repos/webman-php/database/zipball/81a8a834cc8db5a5dbb46fe0073a9d5ac73848f6", + "reference": "81a8a834cc8db5a5dbb46fe0073a9d5ac73848f6", "shasum": "" }, "require": { @@ -6673,9 +6677,9 @@ "description": "Webman database", "support": { "issues": "https://github.com/webman-php/database/issues", - "source": "https://github.com/webman-php/database/tree/v2.1.6" + "source": "https://github.com/webman-php/database/tree/v2.1.7" }, - "time": "2025-04-04T13:23:25+00:00" + "time": "2025-11-27T08:09:25+00:00" }, { "name": "webman/gateway-worker", @@ -6710,6 +6714,40 @@ }, "time": "2024-04-30T01:05:42+00:00" }, + { + "name": "webman/log", + "version": "v2.1.3", + "source": { + "type": "git", + "url": "https://github.com/webman-php/log.git", + "reference": "14e3f3e64e87783952417a68cf5205c1293aba69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webman-php/log/zipball/14e3f3e64e87783952417a68cf5205c1293aba69", + "reference": "14e3f3e64e87783952417a68cf5205c1293aba69", + "shasum": "" + }, + "require": { + "workerman/webman-framework": "^2.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Webman\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Webman plugin webman/log", + "support": { + "issues": "https://github.com/webman-php/log/issues", + "source": "https://github.com/webman-php/log/tree/v2.1.3" + }, + "time": "2025-02-26T11:43:36+00:00" + }, { "name": "webman/redis", "version": "v2.1.3", @@ -6748,16 +6786,16 @@ }, { "name": "webman/redis-queue", - "version": "v2.1.0", + "version": "v2.1.1", "source": { "type": "git", "url": "https://github.com/webman-php/redis-queue.git", - "reference": "12e1c9915ec64c91c0c9c255606bd0c7de27334c" + "reference": "ff4791e21f3c324a47e21da7b6f2dae5a7311dcb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webman-php/redis-queue/zipball/12e1c9915ec64c91c0c9c255606bd0c7de27334c", - "reference": "12e1c9915ec64c91c0c9c255606bd0c7de27334c", + "url": "https://api.github.com/repos/webman-php/redis-queue/zipball/ff4791e21f3c324a47e21da7b6f2dae5a7311dcb", + "reference": "ff4791e21f3c324a47e21da7b6f2dae5a7311dcb", "shasum": "" }, "require": { @@ -6776,9 +6814,9 @@ "description": "Redis message queue plugin for webman.", "support": { "issues": "https://github.com/webman-php/redis-queue/issues", - "source": "https://github.com/webman-php/redis-queue/tree/v2.1.0" + "source": "https://github.com/webman-php/redis-queue/tree/v2.1.1" }, - "time": "2025-01-24T12:56:01+00:00" + "time": "2025-11-14T07:12:52+00:00" }, { "name": "workerman/coroutine", @@ -7135,28 +7173,31 @@ "type": "patreon" } ], - "time": "2025-06-12T13:34:04+00:00" + "time": "2025-11-12T01:36:20+00:00" }, { "name": "zoujingli/ip2region", - "version": "v3.0.0", + "version": "v3.0.8", "source": { "type": "git", "url": "https://github.com/zoujingli/ip2region.git", - "reference": "fd31d7a023f28f4e2f3e63f46f1fd51f8b2672f6" + "reference": "4ab4283f4b4ea4222da6cb97fbf7f7167f1ebb53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zoujingli/ip2region/zipball/fd31d7a023f28f4e2f3e63f46f1fd51f8b2672f6", - "reference": "fd31d7a023f28f4e2f3e63f46f1fd51f8b2672f6", + "url": "https://api.github.com/repos/zoujingli/ip2region/zipball/4ab4283f4b4ea4222da6cb97fbf7f7167f1ebb53", + "reference": "4ab4283f4b4ea4222da6cb97fbf7f7167f1ebb53", "shasum": "" }, "require": { - "php": ">=5.4" + "php": ">=7.1.0" }, "suggest": { "ext-opcache": "启用 OPcache 以获得更好的性能" }, + "bin": [ + "bin/ip2down" + ], "type": "library", "extra": { "branch-alias": { @@ -7165,10 +7206,13 @@ }, "autoload": { "files": [ - "ip2region.php" + "src/common.php" ], + "psr-4": { + "ip2region\\": "src/ip2region/" + }, "classmap": [ - "src/" + "src/Ip2Region.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -7182,30 +7226,28 @@ "homepage": "https://thinkadmin.top" } ], - "description": "Ip2Region v3.0 for PHP - 企业级 IP 地理位置查询库,支持 IPv4/IPv6,分片文件管理,智能缓存,零依赖", + "description": "ip2region v3.0 for PHP - 企业级 IP 地理位置查询库,支持 IPv4 和 IPv6,多种缓存策略,零依赖,开箱即用", "homepage": "https://github.com/zoujingli/Ip2Region", "keywords": [ "IP", - "IP定位", "Ip2Region", - "geoip", + "composer", "geolocation", "ipv4", "ipv6", "location", + "php", "企业级", - "分片数据库", - "压缩", - "地理位置", - "地理位置查询", - "缓存", + "智能加载", + "缓存策略", + "零依赖", "高性能" ], "support": { "issues": "https://github.com/zoujingli/ip2region/issues", - "source": "https://github.com/zoujingli/ip2region/tree/v3.0.0" + "source": "https://github.com/zoujingli/ip2region/tree/v3.0.8" }, - "time": "2025-09-15T12:27:22+00:00" + "time": "2025-11-20T11:02:33+00:00" } ], "packages-dev": [], diff --git a/config/plugin/webman/log/app.php b/config/plugin/webman/log/app.php new file mode 100644 index 0000000..6217553 --- /dev/null +++ b/config/plugin/webman/log/app.php @@ -0,0 +1,19 @@ + true, + 'exception' => [ + // 是否记录异常到日志 + 'enable' => true, + // 不会记录到日志的异常类 + 'dontReport' => [ + support\exception\BusinessException::class + ] + ], + 'dontReport' => [ + 'app' => [], + 'controller' => [], + 'action' => [], + 'path' => [] + ], + 'channel' => 'default' // 日志通道(在config/log.php里配置,默认是default) +]; diff --git a/config/plugin/webman/log/middleware.php b/config/plugin/webman/log/middleware.php new file mode 100644 index 0000000..7c7b0a9 --- /dev/null +++ b/config/plugin/webman/log/middleware.php @@ -0,0 +1,21 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Log\Middleware; + +return [ + '@' => [ + Middleware::class + ] +]; diff --git a/config/route.php b/config/route.php index 7b092f3..54f6cce 100644 --- a/config/route.php +++ b/config/route.php @@ -505,6 +505,16 @@ Route::group('/admin', function () { Route::any('/destroy', [app\admin\controller\FinanceReconDubaiFilesController::class, 'destroy']); }); }); + + + // 物品领用 + Route::group('/inv', function () { + Route::any('/item/list', [app\admin\controller\InvItemController::class, 'index']); + Route::any('/item/store', [app\admin\controller\InvItemController::class, 'store']); + Route::any('/item/update', [app\admin\controller\InvItemController::class, 'update']); + Route::any('/item/show', [app\admin\controller\InvItemController::class, 'show']); + Route::any('/item/destroy', [app\admin\controller\InvItemController::class, 'destroy']); + }); }); @@ -624,4 +634,17 @@ Route::group('/crm', function () { Route::any('/update', [app\common\controller\VehModificationController::class, 'update']); Route::any('/destroy', [app\common\controller\VehModificationController::class, 'destroy']); }); +}); + + + +// 移动端 +Route::group('/mobile', function () { + // 物品领用 + Route::group('/inv', function () { + Route::any('/requisition/apply', [app\mobile\controller\InvRequisitionController::class, 'apply']); + Route::any('/requisition/update', [app\mobile\controller\InvRequisitionController::class, 'update']); + Route::any('/requisition/item/return', [app\mobile\controller\InvRequisitionItemReturnController::class, 'store']); + Route::any('/requisition/item/return/update', [app\mobile\controller\InvRequisitionItemReturnController::class, 'update']); + }); }); \ No newline at end of file diff --git a/public/db_log/物品领用.sql b/public/db_log/物品领用.sql new file mode 100644 index 0000000..570a17e --- /dev/null +++ b/public/db_log/物品领用.sql @@ -0,0 +1,174 @@ +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- 1. 物品主数据表:增加 company_id +DROP TABLE IF EXISTS inv_item; +CREATE TABLE inv_item ( + id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', + company_id BIGINT(20) UNSIGNED DEFAULT NULL COMMENT '物品所属公司ID', + item_code VARCHAR(64) NOT NULL COMMENT '物品编号(公司内部编码)', + item_name VARCHAR(128) NOT NULL COMMENT '物品名称', + category_id BIGINT(20) UNSIGNED DEFAULT NULL COMMENT '物品分类ID(可选,指向分类表)', + spec_model VARCHAR(128) DEFAULT NULL COMMENT '规格型号', + unit VARCHAR(32) DEFAULT '件' COMMENT '计量单位,如 件/盒/包', + is_consumable TINYINT(1) DEFAULT 1 COMMENT '是否耗材:1耗材(不需归还),0非耗材(需归还)', + stock_qty INT(11) DEFAULT 0 COMMENT '当前库存数量', + manage_user_id BIGINT(20) UNSIGNED DEFAULT NULL COMMENT '物品管理员用户ID', + location VARCHAR(255) DEFAULT NULL COMMENT '存放位置说明', + remark VARCHAR(255) DEFAULT NULL COMMENT '备注', + created_at INT(11) NOT NULL DEFAULT 0 COMMENT '创建时间时间戳', + updated_at INT(11) NOT NULL DEFAULT 0 COMMENT '更新时间时间戳', + PRIMARY KEY (id), + UNIQUE KEY uk_item_code (item_code), + KEY idx_company (company_id), + KEY idx_category (category_id), + KEY idx_manage_user (manage_user_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='物品主数据表'; + + +-- 2. 物品领用/借用申请单(主表) +DROP TABLE IF EXISTS inv_requisition; +CREATE TABLE inv_requisition ( + id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', + order_no VARCHAR(64) NOT NULL COMMENT '申请单号', + + applicant_company_id BIGINT(20) UNSIGNED DEFAULT NULL COMMENT '申请人所在公司ID(可选)', + dept_id BIGINT(20) UNSIGNED DEFAULT NULL COMMENT '申请人部门ID', + applicant_id BIGINT(20) UNSIGNED NOT NULL COMMENT '申请人用户ID', + applicant_name VARCHAR(64) DEFAULT NULL COMMENT '申请人姓名快照', + leader_id BIGINT(20) UNSIGNED DEFAULT NULL COMMENT '直属上级用户ID', + manager_id BIGINT(20) UNSIGNED DEFAULT NULL COMMENT '物品管理员用户ID(主负责人)', + + borrow_reason VARCHAR(255) NOT NULL COMMENT '领用/借用事由', + use_start_date DATE NOT NULL COMMENT '借用/预计使用开始日期', + use_end_date DATE DEFAULT NULL COMMENT '预计归还日期(耗材可为空)', + + -- 0草稿 10待直属上级审批 20直属上级通过待物品管理员审批 + -- 30全部通过 40已驳回 50已取消 + status TINYINT(3) NOT NULL DEFAULT 10 COMMENT '审批状态', + + is_returned TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否已全部归还(针对需要归还的物品):0否 1是', + + remark VARCHAR(255) DEFAULT NULL COMMENT '备注', + created_at INT(11) NOT NULL DEFAULT 0 COMMENT '创建时间时间戳', + updated_at INT(11) NOT NULL DEFAULT 0 COMMENT '更新时间时间戳', + + PRIMARY KEY (id), + UNIQUE KEY uk_order_no (order_no), + KEY idx_applicant (applicant_id), + KEY idx_status (status) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='物品领用/借用申请单'; + + +-- 3. 申请单明细表:支持部分、多次归还 +DROP TABLE IF EXISTS inv_requisition_item; +CREATE TABLE inv_requisition_item ( + id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', + requisition_id BIGINT(20) UNSIGNED NOT NULL COMMENT '申请单ID', + item_id BIGINT(20) UNSIGNED NOT NULL COMMENT '物品ID', + + item_name_snap VARCHAR(128) DEFAULT NULL COMMENT '物品名称快照', + spec_model_snap VARCHAR(128) DEFAULT NULL COMMENT '规格型号快照', + unit_snap VARCHAR(32) DEFAULT NULL COMMENT '单位快照', + is_consumable_snap TINYINT(1) DEFAULT NULL COMMENT '是否耗材快照:1耗材 0非耗材', + + request_qty INT(11) NOT NULL DEFAULT 1 COMMENT '申请数量', + approved_qty INT(11) DEFAULT NULL COMMENT '实批数量(可与申请数量不同)', + returned_qty INT(11) NOT NULL DEFAULT 0 COMMENT '已归还数量(累加)', + + -- 对于非耗材:returned_qty >= approved_qty 时置为1 + is_finished TINYINT(1) NOT NULL DEFAULT 0 COMMENT '该物品是否已完成归还:0否 1是', + + remark VARCHAR(255) DEFAULT NULL COMMENT '行备注', + created_at INT(11) NOT NULL DEFAULT 0 COMMENT '创建时间时间戳', + updated_at INT(11) NOT NULL DEFAULT 0 COMMENT '更新时间时间戳', + + PRIMARY KEY (id), + KEY idx_req (requisition_id), + KEY idx_item (item_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='物品领用申请明细表'; + + +-- 4. 审批记录表(同上一版,略微无改动) +DROP TABLE IF EXISTS inv_requisition_approve; +CREATE TABLE inv_requisition_approve ( + id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', + requisition_id BIGINT(20) UNSIGNED NOT NULL COMMENT '申请单ID', + node_type VARCHAR(32) NOT NULL COMMENT '审批节点类型:leader=直属上级,manager=物品管理员,other=其他', + approver_id BIGINT(20) UNSIGNED NOT NULL COMMENT '审批人用户ID', + approver_name VARCHAR(64) DEFAULT NULL COMMENT '审批人姓名快照', + action TINYINT(3) NOT NULL COMMENT '审批动作:1通过 2驳回', + comment VARCHAR(255) DEFAULT NULL COMMENT '审批意见', + action_at INT(11) NOT NULL DEFAULT 0 COMMENT '审批时间时间戳', + + created_at INT(11) NOT NULL DEFAULT 0 COMMENT '创建时间时间戳', + updated_at INT(11) NOT NULL DEFAULT 0 COMMENT '更新时间时间戳', + + PRIMARY KEY (id), + KEY idx_req (requisition_id), + KEY idx_node (node_type), + KEY idx_approver (approver_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='物品领用申请审批记录表'; + + +-- 5. 申请单附件表(申请时上传) +DROP TABLE IF EXISTS inv_requisition_attachment; +CREATE TABLE inv_requisition_attachment ( + id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', + requisition_id BIGINT(20) UNSIGNED NOT NULL COMMENT '申请单ID', + file_name VARCHAR(255) NOT NULL COMMENT '文件原始名称', + file_path VARCHAR(255) NOT NULL COMMENT '文件存储路径/URL', + file_size INT(11) DEFAULT NULL COMMENT '文件大小(字节)', + created_at INT(11) NOT NULL DEFAULT 0 COMMENT '创建时间时间戳', + updated_at INT(11) NOT NULL DEFAULT 0 COMMENT '更新时间时间戳', + + PRIMARY KEY (id), + KEY idx_req (requisition_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='物品领用申请附件表'; + + +/* ================= 归 还 相 关 表 ================= */ + +-- 6. 归还记录表:一次归还动作(可归还一个明细的一部分) +DROP TABLE IF EXISTS inv_requisition_item_return; +CREATE TABLE inv_requisition_item_return ( + id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', + requisition_id BIGINT(20) UNSIGNED NOT NULL COMMENT '申请单ID', + requisition_item_id BIGINT(20) UNSIGNED NOT NULL COMMENT '申请单明细ID', + item_id BIGINT(20) UNSIGNED NOT NULL COMMENT '物品ID', + + return_qty INT(11) NOT NULL DEFAULT 0 COMMENT '本次归还数量', + handler_id BIGINT(20) UNSIGNED NOT NULL COMMENT '办理归还的人(通常是物品管理员)', + handler_name VARCHAR(64) DEFAULT NULL COMMENT '办理人姓名快照', + + return_status TINYINT(3) NOT NULL DEFAULT 1 COMMENT '归还状态:1正常归还 2损坏 3其他', + remark VARCHAR(255) DEFAULT NULL COMMENT '归还备注', + + return_at INT(11) NOT NULL DEFAULT 0 COMMENT '归还时间时间戳', + created_at INT(11) NOT NULL DEFAULT 0 COMMENT '创建时间时间戳', + updated_at INT(11) NOT NULL DEFAULT 0 COMMENT '更新时间时间戳', + + PRIMARY KEY (id), + KEY idx_req (requisition_id), + KEY idx_req_item (requisition_item_id), + KEY idx_item (item_id), + KEY idx_handler (handler_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='物品归还记录表(支持多次、部分归还)'; + + +-- 7. 归还附件表:归还时拍照留底 +DROP TABLE IF EXISTS inv_requisition_item_return_attachment; +CREATE TABLE inv_requisition_item_return_attachment ( + id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', + return_id BIGINT(20) UNSIGNED NOT NULL COMMENT '归还记录ID', + file_name VARCHAR(255) NOT NULL COMMENT '文件原始名称', + file_path VARCHAR(255) NOT NULL COMMENT '文件存储路径/URL(通常为照片)', + file_size INT(11) DEFAULT NULL COMMENT '文件大小(字节)', + created_at INT(11) NOT NULL DEFAULT 0 COMMENT '创建时间时间戳', + updated_at INT(11) NOT NULL DEFAULT 0 COMMENT '更新时间时间戳', + + PRIMARY KEY (id), + KEY idx_return (return_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='物品归还记录附件表(归还拍照留底)'; + +SET FOREIGN_KEY_CHECKS = 1;