diff --git a/.gitea/workflows/validate-changelog-filenames.yml b/.gitea/workflows/validate-changelog-filenames.yml deleted file mode 100644 index 9965474..0000000 --- a/.gitea/workflows/validate-changelog-filenames.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: changelog-filename-gate - -on: - workflow_dispatch: - pull_request: - branches: - - main - types: - - opened - - reopened - - synchronize - - edited - push: - branches: - - main - -jobs: - validate: - name: validate - runs-on: ubuntu-latest - steps: - # Keep the gate self-contained: the test environment cannot reliably clone GitHub Actions repositories. - - name: Checkout full history - run: | - git init -q . - git remote add origin "${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}.git" - git fetch --no-tags --prune origin \ - "+refs/heads/*:refs/remotes/origin/*" \ - "+refs/pull/*/head:refs/remotes/pull/*/head" \ - "+refs/pull/*/merge:refs/remotes/pull/*/merge" - git checkout --detach "$GITHUB_SHA" - - - name: Verify Node.js runtime - run: | - node --version - npm --version - node -e "if (Number(process.versions.node.split('.')[0]) < 20) process.exit(1)" - - - name: Run regression tests - run: npm test - - - name: Validate new changelog filenames - run: npm run check:filenames -- --event "$GITHUB_EVENT_PATH" - - - name: Validate changelog frontmatter - run: npm run check:frontmatter -- --event "$GITHUB_EVENT_PATH" diff --git a/.swagger/dict_data.json b/.swagger/dict_data.json deleted file mode 100644 index 029a748..0000000 --- a/.swagger/dict_data.json +++ /dev/null @@ -1,5807 +0,0 @@ -{ - "activity_billing_type": { - "name": "\u6e38\u73a9\u9879\u76ee\u8ba1\u8d39\u65b9\u5f0f", - "category": "BUSINESS", - "remark": "\u6e38\u73a9\u9879\u76ee\u8ba1\u8d39\u65b9\u5f0f\u5b57\u5178", - "items": [ - { - "value": "PER_PERSON", - "label": "\u6309\u4eba", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "PER_GROUP", - "label": "\u6309\u7ec4/\u573a", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "PER_HOUR", - "label": "\u6309\u5c0f\u65f6", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "PER_SESSION", - "label": "\u6309\u573a\u6b21", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "activity_category": { - "name": "\u6e38\u73a9\u9879\u76ee\u5206\u7c7b", - "category": "BUSINESS", - "remark": "\u6e38\u73a9\u9879\u76ee\u5206\u7c7b\u5b57\u5178", - "items": [ - { - "value": "horse_riding", - "label": "\u9a6c\u672f\u9a91\u884c", - "sort": 1, - "status": "INACTIVE" - }, - { - "value": "HORSEBACK", - "label": "\u9a6c\u672f\u9a91\u884c", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "MOTOR_SPORT", - "label": "\u673a\u52a8\u8d8a\u91ce", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "WATER_SPORT", - "label": "\u6c34\u4e0a\u9879\u76ee", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "ARCHERY_COMBAT", - "label": "\u5c04\u7bad\u640f\u51fb", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "CULTURAL", - "label": "\u6587\u5316\u4f53\u9a8c", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "cultural_experience", - "label": "\u6c11\u4fd7\u6587\u5316", - "sort": 5, - "status": "INACTIVE" - }, - { - "value": "FOOD_CRAFT", - "label": "\u7f8e\u98df\u624b\u4f5c", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "NATURE_EXPLORE", - "label": "\u81ea\u7136\u63a2\u7d22", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "CAMPFIRE_PARTY", - "label": "\u7bdd\u706b\u805a\u4f1a", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "WINTER_SPORT", - "label": "\u51ac\u5b63\u9879\u76ee", - "sort": 9, - "status": "ACTIVE" - }, - { - "value": "PARENT_CHILD", - "label": "\u4eb2\u5b50\u4e92\u52a8", - "sort": 10, - "status": "ACTIVE" - }, - { - "value": "OUTDOOR", - "label": "\u6237\u5916\u8fd0\u52a8", - "sort": 11, - "status": "ACTIVE" - }, - { - "value": "OUTDOOR_SPORT", - "label": "\u6237\u5916\u7ade\u6280", - "sort": 12, - "status": "ACTIVE" - }, - { - "value": "ENTERTAINMENT", - "label": "\u4f11\u95f2\u5a31\u4e50", - "sort": 13, - "status": "ACTIVE" - }, - { - "value": "ANIMAL", - "label": "\u52a8\u7269\u4e92\u52a8", - "sort": 14, - "status": "ACTIVE" - }, - { - "value": "EXTREME", - "label": "\u6781\u9650\u8fd0\u52a8", - "sort": 15, - "status": "ACTIVE" - }, - { - "value": "EDUCATION", - "label": "\u7814\u5b66\u6559\u80b2", - "sort": 16, - "status": "ACTIVE" - }, - { - "value": "PHOTOGRAPHY", - "label": "\u6444\u5f71\u5199\u771f", - "sort": 17, - "status": "ACTIVE" - }, - { - "value": "PERFORMANCE", - "label": "\u6f14\u51fa\u8868\u6f14", - "sort": 18, - "status": "ACTIVE" - }, - { - "value": "CATERING", - "label": "\u9910\u996e\u670d\u52a1", - "sort": 19, - "status": "ACTIVE" - }, - { - "value": "DINING", - "label": "\u7528\u9910\u4f53\u9a8c", - "sort": 20, - "status": "ACTIVE" - } - ] - }, - "activity_environment_type": { - "name": "\u6e38\u73a9\u9879\u76ee\u73af\u5883\u7c7b\u578b", - "category": "BUSINESS", - "remark": "\u6e38\u73a9\u9879\u76ee\u73af\u5883\u7c7b\u578b\u5b57\u5178", - "items": [ - { - "value": "INDOOR", - "label": "\u5ba4\u5185", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "OUTDOOR", - "label": "\u6237\u5916", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "MIXED", - "label": "\u6df7\u5408", - "sort": 3, - "status": "ACTIVE" - } - ] - }, - "activity_physical_level": { - "name": "\u6e38\u73a9\u9879\u76ee\u4f53\u529b\u7b49\u7ea7", - "category": "BUSINESS", - "remark": "\u6e38\u73a9\u9879\u76ee\u4f53\u529b\u7b49\u7ea7\u5b57\u5178", - "items": [ - { - "value": "EASY", - "label": "\u4f11\u95f2", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "MODERATE", - "label": "\u9002\u4e2d", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "HARD", - "label": "\u8f83\u5f3a", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "EXTREME", - "label": "\u9ad8\u5f3a\u5ea6", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "admin_status": { - "name": "\u7ba1\u7406\u5458\u72b6\u6001", - "category": "BASE", - "remark": "", - "items": [ - { - "value": "ACTIVE", - "label": "\u6b63\u5e38", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "INACTIVE", - "label": "\u7981\u7528", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "LOCKED", - "label": "\u9501\u5b9a", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "DELETED", - "label": "\u5df2\u5220\u9664", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "approval_sp_status": { - "name": "\u5ba1\u6279\u72b6\u6001", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "1", - "label": "\u5ba1\u6279\u4e2d", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "2", - "label": "\u5df2\u901a\u8fc7", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "3", - "label": "\u5df2\u9a73\u56de", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "4", - "label": "\u5df2\u64a4\u9500", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "6", - "label": "\u901a\u8fc7\u540e\u64a4\u9500", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "7", - "label": "\u5df2\u5220\u9664", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "10", - "label": "\u5df2\u652f\u4ed8", - "sort": 7, - "status": "ACTIVE" - } - ] - }, - "banner_link_type": { - "name": "Banner\u94fe\u63a5\u7c7b\u578b", - "category": "BUSINESS", - "remark": "\u9996\u9875Banner\u70b9\u51fb\u8df3\u8f6c\u7684\u94fe\u63a5\u7c7b\u578b", - "items": [ - { - "value": "PRODUCT", - "label": "\u4ea7\u54c1\u8be6\u60c5", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "ARTICLE", - "label": "\u6587\u7ae0\u8be6\u60c5", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "URL", - "label": "\u5916\u90e8\u94fe\u63a5", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "MINI_PAGE", - "label": "\u5c0f\u7a0b\u5e8f\u9875\u9762", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "NONE", - "label": "\u65e0\u8df3\u8f6c", - "sort": 5, - "status": "ACTIVE" - } - ] - }, - "banner_media_type": { - "name": "Banner\u5a92\u4f53\u7c7b\u578b", - "category": "BUSINESS", - "remark": "\u9996\u9875Banner\u652f\u6301\u7684\u5a92\u4f53\u7c7b\u578b", - "items": [ - { - "value": "IMAGE", - "label": "\u56fe\u7247", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "VIDEO", - "label": "\u89c6\u9891", - "sort": 2, - "status": "ACTIVE" - } - ] - }, - "batch_status": { - "name": "\u56e2\u671f\u72b6\u6001", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "PENDING", - "label": "\u5f85\u5f00\u653e", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "ENROLLING", - "label": "\u62a5\u540d\u4e2d", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "CONFIRMED", - "label": "\u5df2\u6210\u56e2", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "FULL", - "label": "\u5df2\u6ee1\u5458", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "CLOSED", - "label": "\u5df2\u622a\u6b62", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "DISBANDED", - "label": "\u5df2\u6563\u56e2", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "IN_PROGRESS", - "label": "\u51fa\u884c\u4e2d", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "FINISHED", - "label": "\u5df2\u7ed3\u675f", - "sort": 8, - "status": "ACTIVE" - } - ] - }, - "bathroom_type": { - "name": "\u536b\u6d74\u7c7b\u578b", - "category": "BUSINESS", - "remark": "Bathroom types", - "items": [ - { - "value": "PRIVATE", - "label": "\u72ec\u7acb\u536b\u6d74", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "SHARED", - "label": "\u516c\u5171\u536b\u6d74", - "sort": 2, - "status": "ACTIVE" - } - ] - }, - "bed_type": { - "name": "\u5e8a\u578b", - "category": "BUSINESS", - "remark": "Bed types", - "items": [ - { - "value": "SINGLE_BED", - "label": "\u5355\u4eba\u5e8a", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "DOUBLE_BED", - "label": "\u53cc\u4eba\u5e8a", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "TWIN_BED", - "label": "\u53cc\u5e8a", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "KING_BED", - "label": "\u5927\u5e8a", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "TATAMI", - "label": "\u69bb\u69bb\u7c73", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "KANG", - "label": "\u706b\u7095", - "sort": 6, - "status": "ACTIVE" - } - ] - }, - "billing_type": { - "name": "\u8ba1\u8d39\u65b9\u5f0f", - "category": "BUSINESS", - "remark": "\u5907\u54c1\u8ba1\u8d39\u65b9\u5f0f", - "items": [ - { - "value": "BY_PERSON", - "label": "\u6309\u4eba\u5934", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "BY_COUNT", - "label": "\u6309\u4ef6", - "sort": 2, - "status": "ACTIVE" - } - ] - }, - "billing_type_service": { - "name": "\u670d\u52a1\u8ba1\u8d39\u65b9\u5f0f", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "FLAT_RATE", - "label": "\u4e00\u53e3\u4ef7", - "sort": 10, - "status": "ACTIVE" - }, - { - "value": "PER_PERSON", - "label": "\u6309\u4eba\u5934", - "sort": 20, - "status": "ACTIVE" - }, - { - "value": "PER_HOUR", - "label": "\u6309\u5c0f\u65f6", - "sort": 30, - "status": "ACTIVE" - }, - { - "value": "PER_DAY", - "label": "\u6309\u5929", - "sort": 40, - "status": "ACTIVE" - }, - { - "value": "PER_DISTANCE", - "label": "\u6309\u8ddd\u79bb", - "sort": 50, - "status": "ACTIVE" - }, - { - "value": "CUSTOM", - "label": "\u81ea\u5b9a\u4e49", - "sort": 60, - "status": "ACTIVE" - } - ] - }, - "calendar_status": { - "name": "\u65e5\u5386\u72b6\u6001", - "category": "BUSINESS", - "remark": "\u4ef7\u683c\u65e5\u5386\u4e2d\u6bcf\u65e5\u7684\u72b6\u6001", - "items": [ - { - "value": "AVAILABLE", - "label": "\u53ef\u552e", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "SOLD_OUT", - "label": "\u5df2\u552e\u7f44", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "CLOSED", - "label": "\u5df2\u5173\u95ed", - "sort": 3, - "status": "ACTIVE" - } - ] - }, - "cities": { - "name": "\u57ce\u5e02", - "category": "BASE", - "remark": "", - "items": [ - { - "value": "hailar", - "label": "\u822a\u73ed", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "manzhouli", - "label": "\u706b\u8f66", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "eergu", - "label": "\u989d\u5c14\u53e4\u7eb3", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "genhe", - "label": "\u6839\u6cb3", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "yakeshi", - "label": "\u7259\u514b\u77f3", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "zhalantun", - "label": "\u624e\u5170\u5c6f", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "aershan", - "label": "\u963f\u5c14\u5c71", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "shiwei", - "label": "\u5ba4\u97e6", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "enhe", - "label": "\u6069\u548c", - "sort": 9, - "status": "ACTIVE" - }, - { - "value": "heishantou", - "label": "\u9ed1\u5c71\u5934", - "sort": 10, - "status": "ACTIVE" - }, - { - "value": "chenbaerhu", - "label": "\u9648\u5df4\u5c14\u864e\u65d7", - "sort": 11, - "status": "ACTIVE" - }, - { - "value": "xinbaerhuzuo", - "label": "\u65b0\u5df4\u5c14\u864e\u5de6\u65d7", - "sort": 12, - "status": "ACTIVE" - }, - { - "value": "xinbaerhuyou", - "label": "\u65b0\u5df4\u5c14\u864e\u53f3\u65d7", - "sort": 13, - "status": "ACTIVE" - }, - { - "value": "ewenke", - "label": "\u9102\u6e29\u514b\u65d7", - "sort": 14, - "status": "ACTIVE" - }, - { - "value": "moerdaoga", - "label": "\u83ab\u5c14\u9053\u560e", - "sort": 15, - "status": "ACTIVE" - } - ] - }, - "city": { - "name": "\u57ce\u5e02\u7b5b\u9009", - "category": "BASE", - "remark": "", - "items": [ - { - "value": "hailar", - "label": "\u5168\u56fd\u65c5\u6e38\u76d1\u7ba1\u5e73\u53f0", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "manzhouli", - "label": "\u6cd5\u5927\u5927", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "eergu", - "label": "e\u7b7e\u5b9d", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "genhe", - "label": "\u817e\u8baf\u7535\u5b50\u7b7e", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "aershan", - "label": "\u963f\u5c14\u5c71", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "shiwei", - "label": "\u5ba4\u97e6", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "enhe", - "label": "\u6069\u548c", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "heishantou", - "label": "\u9ed1\u5c71\u5934", - "sort": 8, - "status": "ACTIVE" - } - ] - }, - "common_status": { - "name": "\u901a\u7528\u72b6\u6001", - "category": "BASE", - "remark": "", - "items": [ - { - "value": "ACTIVE", - "label": "\u542f\u7528", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "INACTIVE", - "label": "\u505c\u7528", - "sort": 2, - "status": "ACTIVE" - } - ] - }, - "contact_channel_type": { - "name": "\u8054\u7cfb\u6211\u4eec\u6e20\u9053\u7c7b\u578b", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "ABOUT", - "label": "\u5173\u4e8e\u6211\u4eec", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "ONLINE_CS", - "label": "\u5728\u7ebf\u5ba2\u670d", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "PHONE", - "label": "\u7535\u8bdd\u54a8\u8be2", - "sort": 3, - "status": "ACTIVE" - } - ] - }, - "contract_mode": { - "name": "\u5408\u540c\u6a21\u5f0f", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "STANDARD", - "label": "\u7535\u5b50\u7b7e\u7f72", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "SYNC", - "label": "\u7eb8\u8d28\u4e0a\u62a5", - "sort": 2, - "status": "ACTIVE" - } - ] - }, - "contract_platform": { - "name": "\u5408\u540c\u5e73\u53f0", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "12301", - "label": "12301", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "FADADA", - "label": "\u6cd5\u5927\u5927", - "sort": 2, - "status": "ACTIVE" - } - ] - }, - "contract_status": { - "name": "\u5408\u540c\u72b6\u6001", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "PENDING", - "label": "\u5f85\u751f\u6210", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "GENERATED", - "label": "\u5df2\u751f\u6210", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "SIGNING", - "label": "\u7b7e\u7f72\u4e2d", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "PENDING_SIGN", - "label": "\u5f85\u7b7e\u7f72", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "SIGNED", - "label": "\u5df2\u7b7e\u7f72", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "VOIDING", - "label": "\u4f5c\u5e9f\u4e2d", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "VOIDED", - "label": "\u5df2\u4f5c\u5e9f", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "REPORTED", - "label": "\u5df2\u4e0a\u62a5", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "UPLOADED", - "label": "\u5df2\u4e0a\u4f20", - "sort": 9, - "status": "ACTIVE" - } - ] - }, - "cost_apply_role": { - "name": "\u8d39\u7528\u9002\u7528\u89d2\u8272", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "DRIVER", - "label": "\u53f8\u673a", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "GUIDE", - "label": "\u5bfc\u6e38", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "VEHICLE", - "label": "\u8f66\u8f86", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "THIRD_PARTY", - "label": "\u7b2c\u4e09\u65b9", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "COMPANY", - "label": "\u516c\u53f8", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "OTHER", - "label": "\u5176\u4ed6", - "sort": 6, - "status": "ACTIVE" - } - ] - }, - "cost_category": { - "name": "\u6210\u672c\u5206\u7c7b", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "ACCOMMODATION", - "label": "\u4f4f\u5bbf", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "TRANSPORT", - "label": "\u4ea4\u901a", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "TICKET", - "label": "\u95e8\u7968", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "ACTIVITY", - "label": "\u6d3b\u52a8", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "DINING", - "label": "\u9910\u996e", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "PERSONAL", - "label": "\u4e2a\u4eba\u6d88\u8d39", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "VEHICLE_EXTRA", - "label": "\u8f66\u8f86\u9644\u52a0", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "SELF_PAY", - "label": "\u81ea\u8d39\u9879\u76ee", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "meal_subsidy", - "label": "\u9910\u8865", - "sort": 10, - "status": "ACTIVE" - }, - { - "value": "accommodation_subsidy", - "label": "\u4f4f\u5bbf\u8865\u8d34", - "sort": 11, - "status": "ACTIVE" - }, - { - "value": "fuel_cost", - "label": "\u6cb9\u8d39", - "sort": 12, - "status": "ACTIVE" - }, - { - "value": "guide_fee", - "label": "\u5bfc\u6e38\u8d39", - "sort": 13, - "status": "ACTIVE" - }, - { - "value": "insurance", - "label": "\u4fdd\u9669", - "sort": 14, - "status": "ACTIVE" - }, - { - "value": "parking_fee", - "label": "\u505c\u8f66\u8d39", - "sort": 15, - "status": "ACTIVE" - }, - { - "value": "tip", - "label": "\u5c0f\u8d39", - "sort": 16, - "status": "ACTIVE" - } - ] - }, - "cost_item_category": { - "name": "\u8d39\u7528\u9879\u5206\u7c7b", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "meal_subsidy", - "label": "\u9910\u996e\u8865\u8d34", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "accommodation_subsidy", - "label": "\u4f4f\u5bbf\u8865\u8d34", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "fuel_cost", - "label": "\u6cb9\u8d39/\u80fd\u6e90", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "toll_fee", - "label": "\u8fc7\u8def\u8fc7\u6865\u8d39", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "parking_fee", - "label": "\u505c\u8f66\u8d39", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "guide_fee", - "label": "\u8bb2\u89e3\u8d39", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "insurance", - "label": "\u4fdd\u9669\u8d39", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "tip", - "label": "\u5c0f\u8d39/\u5956\u52b1", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "other", - "label": "\u5176\u4ed6", - "sort": 9, - "status": "ACTIVE" - } - ] - }, - "cost_unit": { - "name": "\u8d39\u7528\u8ba1\u4ef7\u5355\u4f4d", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "PER_PERSON", - "label": "\u5143/\u4eba", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "PER_VEHICLE", - "label": "\u5143/\u53f0", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "PER_DAY", - "label": "\u5143/\u5929", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "PER_TIME", - "label": "\u5143/\u6b21", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "PER_ROOM", - "label": "\u5143/\u95f4", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "PER_TABLE", - "label": "\u5143/\u684c", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "FIXED", - "label": "\u56fa\u5b9a\u91d1\u989d", - "sort": 7, - "status": "ACTIVE" - } - ] - }, - "cuisine_type": { - "name": "\u83dc\u7cfb\u7c7b\u578b", - "category": "BUSINESS", - "remark": "\u9910\u5385\u83dc\u7cfb\u7c7b\u578b", - "items": [ - { - "value": "local", - "label": "\u672c\u5730\u83dc", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "mongolian", - "label": "\u8499\u9910", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "northeastern", - "label": "\u4e1c\u5317\u83dc", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "sichuan", - "label": "\u5ddd\u83dc", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "halal", - "label": "\u6e05\u771f", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "russian", - "label": "\u4fc4\u9910", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "western", - "label": "\u897f\u9910", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "japanese_korean", - "label": "\u65e5\u97e9\u6599\u7406", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "fusion", - "label": "\u878d\u5408\u83dc", - "sort": 9, - "status": "ACTIVE" - }, - { - "value": "vegetarian", - "label": "\u7d20\u98df", - "sort": 10, - "status": "ACTIVE" - } - ] - }, - "customize_budget": { - "name": "\u9884\u7b97\u8303\u56f4", - "category": "ORDER", - "remark": "", - "items": [ - { - "value": "UNDER_3000", - "label": "3000\u5143\u4ee5\u4e0b/\u4eba", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "BUDGET_3000_5000", - "label": "3000-5000\u5143/\u4eba", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "BUDGET_5000_10000", - "label": "5000-10000\u5143/\u4eba", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "BUDGET_10000_20000", - "label": "10000-20000\u5143/\u4eba", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "ABOVE_20000", - "label": "20000\u5143\u4ee5\u4e0a/\u4eba", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "NO_LIMIT", - "label": "\u4e0d\u9650\u9884\u7b97", - "sort": 6, - "status": "ACTIVE" - } - ] - }, - "customize_request_status": { - "name": "\u5b9a\u5236\u8bf7\u6c42\u72b6\u6001", - "category": "ORDER", - "remark": "", - "items": [ - { - "value": "PENDING", - "label": "\u5f85\u5904\u7406", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "ACCEPTED", - "label": "\u5df2\u63a5\u53d7", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "DESIGNING", - "label": "\u8bbe\u8ba1\u4e2d", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "QUOTED", - "label": "\u5df2\u62a5\u4ef7", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "COMPLETED", - "label": "\u5df2\u5b8c\u6210", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "CANCELLED", - "label": "\u5df2\u53d6\u6d88", - "sort": 6, - "status": "ACTIVE" - } - ] - }, - "customize_request_type": { - "name": "\u5b9a\u5236\u9700\u6c42\u7c7b\u578b", - "category": "ORDER", - "remark": "", - "items": [ - { - "value": "FAMILY_TRIP", - "label": "\u4eb2\u5b50\u6e38", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "HONEYMOON", - "label": "\u871c\u6708\u6e38", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "GROUP_TRIP", - "label": "\u56e2\u5efa\u6e38", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "SENIOR_TRIP", - "label": "\u94f6\u53d1\u6e38", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "ADVENTURE", - "label": "\u63a2\u9669\u6e38", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "PHOTOGRAPHY", - "label": "\u6444\u5f71\u6e38", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "CULTURE", - "label": "\u6587\u5316\u6e38", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "OTHER", - "label": "\u5176\u4ed6", - "sort": 99, - "status": "ACTIVE" - } - ] - }, - "dept_status": { - "name": "\u90e8\u95e8\u72b6\u6001", - "category": "BASE", - "remark": "", - "items": [ - { - "value": "ACTIVE", - "label": "\u6b63\u5e38", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "DELETED", - "label": "\u5df2\u5220\u9664", - "sort": 2, - "status": "ACTIVE" - } - ] - }, - "dict_category": { - "name": "\u5b57\u5178\u5206\u7c7b", - "category": "BASE", - "remark": "", - "items": [ - { - "value": "BASE", - "label": "\u57fa\u7840\u5b57\u5178", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "BUSINESS", - "label": "\u4e1a\u52a1\u5b57\u5178", - "sort": 2, - "status": "ACTIVE" - } - ] - }, - "drive_type": { - "name": "\u9a71\u52a8\u65b9\u5f0f", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "2WD", - "label": "\u4e24\u9a71", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "4WD", - "label": "\u56db\u9a71", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "AWD", - "label": "\u5168\u65f6\u56db\u9a71", - "sort": 3, - "status": "ACTIVE" - } - ] - }, - "driver_license_type": { - "name": "\u9a7e\u7167\u7c7b\u578b", - "category": "BUSINESS", - "remark": "\u53f8\u673a\u7684\u9a7e\u9a76\u8bc1\u7c7b\u578b", - "items": [ - { - "value": "C1", - "label": "C1", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "C2", - "label": "C2", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "B1", - "label": "B1", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "B2", - "label": "B2", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "A1", - "label": "A1", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "A2", - "label": "A2", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "A3", - "label": "A3", - "sort": 7, - "status": "ACTIVE" - } - ] - }, - "engine_type": { - "name": "\u52a8\u529b\u7c7b\u578b", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "GASOLINE", - "label": "\u6c7d\u6cb9", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "DIESEL", - "label": "\u67f4\u6cb9", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "HYBRID", - "label": "\u6df7\u52a8", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "ELECTRIC", - "label": "\u7eaf\u7535", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "environment_type": { - "name": "\u73af\u5883\u7c7b\u578b", - "category": "BASE", - "remark": "", - "items": [ - { - "value": "INDOOR", - "label": "\u5ba4\u5185", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "OUTDOOR", - "label": "\u6237\u5916", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "MIXED", - "label": "\u6df7\u5408", - "sort": 3, - "status": "ACTIVE" - } - ] - }, - "ethnicity": { - "name": "\u6c11\u65cf", - "category": "BASE", - "remark": "", - "items": [ - { - "value": "\u6c49\u65cf", - "label": "\u6c49\u65cf", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "\u85cf\u65cf", - "label": "\u85cf\u65cf", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "\u8499\u53e4\u65cf", - "label": "\u8499\u53e4\u65cf", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "\u56de\u65cf", - "label": "\u56de\u65cf", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "\u7ef4\u543e\u5c14\u65cf", - "label": "\u7ef4\u543e\u5c14\u65cf", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "\u82d7\u65cf", - "label": "\u82d7\u65cf", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "\u5f5d\u65cf", - "label": "\u5f5d\u65cf", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "\u58ee\u65cf", - "label": "\u58ee\u65cf", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "\u5e03\u4f9d\u65cf", - "label": "\u5e03\u4f9d\u65cf", - "sort": 9, - "status": "ACTIVE" - }, - { - "value": "\u671d\u9c9c\u65cf", - "label": "\u671d\u9c9c\u65cf", - "sort": 10, - "status": "ACTIVE" - }, - { - "value": "\u6ee1\u65cf", - "label": "\u6ee1\u65cf", - "sort": 11, - "status": "ACTIVE" - }, - { - "value": "\u4f97\u65cf", - "label": "\u4f97\u65cf", - "sort": 12, - "status": "ACTIVE" - }, - { - "value": "\u7476\u65cf", - "label": "\u7476\u65cf", - "sort": 13, - "status": "ACTIVE" - }, - { - "value": "\u767d\u65cf", - "label": "\u767d\u65cf", - "sort": 14, - "status": "ACTIVE" - }, - { - "value": "\u571f\u5bb6\u65cf", - "label": "\u571f\u5bb6\u65cf", - "sort": 15, - "status": "ACTIVE" - }, - { - "value": "\u54c8\u5c3c\u65cf", - "label": "\u54c8\u5c3c\u65cf", - "sort": 16, - "status": "ACTIVE" - }, - { - "value": "\u54c8\u8428\u514b\u65cf", - "label": "\u54c8\u8428\u514b\u65cf", - "sort": 17, - "status": "ACTIVE" - }, - { - "value": "\u50a3\u65cf", - "label": "\u50a3\u65cf", - "sort": 18, - "status": "ACTIVE" - }, - { - "value": "\u9ece\u65cf", - "label": "\u9ece\u65cf", - "sort": 19, - "status": "ACTIVE" - }, - { - "value": "\u5088\u50f3\u65cf", - "label": "\u5088\u50f3\u65cf", - "sort": 20, - "status": "ACTIVE" - }, - { - "value": "\u4f64\u65cf", - "label": "\u4f64\u65cf", - "sort": 21, - "status": "ACTIVE" - }, - { - "value": "\u7572\u65cf", - "label": "\u7572\u65cf", - "sort": 22, - "status": "ACTIVE" - }, - { - "value": "\u9ad8\u5c71\u65cf", - "label": "\u9ad8\u5c71\u65cf", - "sort": 23, - "status": "ACTIVE" - }, - { - "value": "\u62c9\u795c\u65cf", - "label": "\u62c9\u795c\u65cf", - "sort": 24, - "status": "ACTIVE" - }, - { - "value": "\u6c34\u65cf", - "label": "\u6c34\u65cf", - "sort": 25, - "status": "ACTIVE" - }, - { - "value": "\u4e1c\u4e61\u65cf", - "label": "\u4e1c\u4e61\u65cf", - "sort": 26, - "status": "ACTIVE" - }, - { - "value": "\u7eb3\u897f\u65cf", - "label": "\u7eb3\u897f\u65cf", - "sort": 27, - "status": "ACTIVE" - }, - { - "value": "\u666f\u9887\u65cf", - "label": "\u666f\u9887\u65cf", - "sort": 28, - "status": "ACTIVE" - }, - { - "value": "\u67ef\u5c14\u514b\u5b5c\u65cf", - "label": "\u67ef\u5c14\u514b\u5b5c\u65cf", - "sort": 29, - "status": "ACTIVE" - }, - { - "value": "\u571f\u65cf", - "label": "\u571f\u65cf", - "sort": 30, - "status": "ACTIVE" - }, - { - "value": "\u8fbe\u65a1\u5c14\u65cf", - "label": "\u8fbe\u65a1\u5c14\u65cf", - "sort": 31, - "status": "ACTIVE" - }, - { - "value": "\u4eeb\u4f6c\u65cf", - "label": "\u4eeb\u4f6c\u65cf", - "sort": 32, - "status": "ACTIVE" - }, - { - "value": "\u7f8c\u65cf", - "label": "\u7f8c\u65cf", - "sort": 33, - "status": "ACTIVE" - }, - { - "value": "\u5e03\u6717\u65cf", - "label": "\u5e03\u6717\u65cf", - "sort": 34, - "status": "ACTIVE" - }, - { - "value": "\u6492\u62c9\u65cf", - "label": "\u6492\u62c9\u65cf", - "sort": 35, - "status": "ACTIVE" - }, - { - "value": "\u6bdb\u5357\u65cf", - "label": "\u6bdb\u5357\u65cf", - "sort": 36, - "status": "ACTIVE" - }, - { - "value": "\u4ee1\u4f6c\u65cf", - "label": "\u4ee1\u4f6c\u65cf", - "sort": 37, - "status": "ACTIVE" - }, - { - "value": "\u9521\u4f2f\u65cf", - "label": "\u9521\u4f2f\u65cf", - "sort": 38, - "status": "ACTIVE" - }, - { - "value": "\u963f\u660c\u65cf", - "label": "\u963f\u660c\u65cf", - "sort": 39, - "status": "ACTIVE" - }, - { - "value": "\u666e\u7c73\u65cf", - "label": "\u666e\u7c73\u65cf", - "sort": 40, - "status": "ACTIVE" - }, - { - "value": "\u5854\u5409\u514b\u65cf", - "label": "\u5854\u5409\u514b\u65cf", - "sort": 41, - "status": "ACTIVE" - }, - { - "value": "\u6012\u65cf", - "label": "\u6012\u65cf", - "sort": 42, - "status": "ACTIVE" - }, - { - "value": "\u4e4c\u5b5c\u522b\u514b\u65cf", - "label": "\u4e4c\u5b5c\u522b\u514b\u65cf", - "sort": 43, - "status": "ACTIVE" - }, - { - "value": "\u4fc4\u7f57\u65af\u65cf", - "label": "\u4fc4\u7f57\u65af\u65cf", - "sort": 44, - "status": "ACTIVE" - }, - { - "value": "\u9102\u6e29\u514b\u65cf", - "label": "\u9102\u6e29\u514b\u65cf", - "sort": 45, - "status": "ACTIVE" - }, - { - "value": "\u5fb7\u6602\u65cf", - "label": "\u5fb7\u6602\u65cf", - "sort": 46, - "status": "ACTIVE" - }, - { - "value": "\u4fdd\u5b89\u65cf", - "label": "\u4fdd\u5b89\u65cf", - "sort": 47, - "status": "ACTIVE" - }, - { - "value": "\u88d5\u56fa\u65cf", - "label": "\u88d5\u56fa\u65cf", - "sort": 48, - "status": "ACTIVE" - }, - { - "value": "\u4eac\u65cf", - "label": "\u4eac\u65cf", - "sort": 49, - "status": "ACTIVE" - }, - { - "value": "\u5854\u5854\u5c14\u65cf", - "label": "\u5854\u5854\u5c14\u65cf", - "sort": 50, - "status": "ACTIVE" - }, - { - "value": "\u72ec\u9f99\u65cf", - "label": "\u72ec\u9f99\u65cf", - "sort": 51, - "status": "ACTIVE" - }, - { - "value": "\u9102\u4f26\u6625\u65cf", - "label": "\u9102\u4f26\u6625\u65cf", - "sort": 52, - "status": "ACTIVE" - }, - { - "value": "\u8d6b\u54f2\u65cf", - "label": "\u8d6b\u54f2\u65cf", - "sort": 53, - "status": "ACTIVE" - }, - { - "value": "\u95e8\u5df4\u65cf", - "label": "\u95e8\u5df4\u65cf", - "sort": 54, - "status": "ACTIVE" - }, - { - "value": "\u73de\u5df4\u65cf", - "label": "\u73de\u5df4\u65cf", - "sort": 55, - "status": "ACTIVE" - }, - { - "value": "\u57fa\u8bfa\u65cf", - "label": "\u57fa\u8bfa\u65cf", - "sort": 56, - "status": "ACTIVE" - } - ] - }, - "favorite_resource_type": { - "name": "\u6536\u85cf\u8d44\u6e90\u7c7b\u578b", - "category": "BASE", - "remark": "\u5c0f\u7a0b\u5e8f\u6536\u85cf\u9875Tab\u7b5b\u9009", - "items": [ - { - "value": "PRODUCT", - "label": "\u4ea7\u54c1", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "SCENIC", - "label": "\u666f\u533a", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "RESTAURANT", - "label": "\u9910\u5385", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "ACTIVITY", - "label": "\u6d3b\u52a8", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "HOTEL", - "label": "\u9152\u5e97", - "sort": 5, - "status": "ACTIVE" - } - ] - }, - "file_group": { - "name": "\u6587\u4ef6\u5206\u7ec4", - "category": "BUSINESS", - "remark": "Business group for files", - "items": [ - { - "value": "scenic", - "label": "\u666f\u70b9", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "hotel", - "label": "\u9152\u5e97", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "activity", - "label": "\u6d3b\u52a8", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "product", - "label": "\u4ea7\u54c1", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "content", - "label": "\u5185\u5bb9", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "user", - "label": "\u7528\u6237", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "admin", - "label": "\u7ba1\u7406\u5458", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "system", - "label": "\u7cfb\u7edf", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "other", - "label": "\u5176\u4ed6", - "sort": 9, - "status": "ACTIVE" - }, - { - "value": "avatar", - "label": "\u5934\u50cf", - "sort": 10, - "status": "ACTIVE" - }, - { - "value": "material", - "label": "\u7d20\u6750", - "sort": 11, - "status": "ACTIVE" - }, - { - "value": "restaurant", - "label": "\u9910\u5385", - "sort": 12, - "status": "ACTIVE" - } - ] - }, - "file_status": { - "name": "\u6587\u4ef6\u72b6\u6001", - "category": "BUSINESS", - "remark": "File lifecycle status", - "items": [ - { - "value": "UPLOADING", - "label": "\u4e0a\u4f20\u4e2d", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "ACTIVE", - "label": "\u6b63\u5e38", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "DELETED", - "label": "\u5df2\u5220\u9664", - "sort": 3, - "status": "ACTIVE" - } - ] - }, - "file_type": { - "name": "\u6587\u4ef6\u7c7b\u578b", - "category": "BUSINESS", - "remark": "File category types", - "items": [ - { - "value": "IMAGE", - "label": "\u56fe\u7247", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "VIDEO", - "label": "\u89c6\u9891", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "AUDIO", - "label": "\u97f3\u9891", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "DOCUMENT", - "label": "\u6587\u6863", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "OTHER", - "label": "\u5176\u4ed6", - "sort": 5, - "status": "ACTIVE" - } - ] - }, - "footprint_resource_type": { - "name": "\u6d4f\u89c8\u5386\u53f2\u8d44\u6e90\u7c7b\u578b", - "category": "BUSINESS", - "remark": "\u5c0f\u7a0b\u5e8f\u6d4f\u89c8\u5386\u53f2\u9875\u9762Tab\u5206\u7c7b", - "items": [ - { - "value": "PRODUCT", - "label": "\u4ea7\u54c1", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "SCENIC", - "label": "\u666f\u533a", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "RESTAURANT", - "label": "\u9910\u5385", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "ACTIVITY", - "label": "\u6d3b\u52a8", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "HOTEL", - "label": "\u9152\u5e97", - "sort": 5, - "status": "ACTIVE" - } - ] - }, - "frontend_config_group": { - "name": "\u524d\u7aef\u914d\u7f6e\u5206\u7ec4", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "MP_COLOR", - "label": "\u5c0f\u7a0b\u5e8f-\u989c\u8272", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "MP_PAGE", - "label": "\u5c0f\u7a0b\u5e8f-\u9875\u9762", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "MP_GENERAL", - "label": "\u5c0f\u7a0b\u5e8f-\u901a\u7528", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "ADMIN_PAGE", - "label": "\u540e\u53f0-\u9875\u9762", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "ADMIN_GENERAL", - "label": "\u540e\u53f0-\u901a\u7528", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "SECRET", - "label": "\u7b2c\u4e09\u65b9Key", - "sort": 6, - "status": "ACTIVE" - } - ] - }, - "gender": { - "name": "\u6027\u522b", - "category": "BASE", - "remark": "", - "items": [ - { - "value": "1", - "label": "\u7537", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "2", - "label": "\u5973", - "sort": 2, - "status": "ACTIVE" - } - ] - }, - "guide_level": { - "name": "\u5bfc\u6e38\u7b49\u7ea7", - "category": "BUSINESS", - "remark": "\u5bfc\u6e38\u7684\u8d44\u8d28\u7b49\u7ea7", - "items": [ - { - "value": "PRIMARY", - "label": "\u521d\u7ea7\u5bfc\u6e38", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "INTERMEDIATE", - "label": "\u4e2d\u7ea7\u5bfc\u6e38", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "SENIOR", - "label": "\u9ad8\u7ea7\u5bfc\u6e38", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "SPECIAL", - "label": "\u7279\u7ea7\u5bfc\u6e38", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "guide_service_area": { - "name": "\u5bfc\u6e38\u670d\u52a1\u533a\u57df", - "category": "BUSINESS", - "remark": "\u5bfc\u6e38\u63d0\u4f9b\u670d\u52a1\u7684\u5730\u7406\u533a\u57df", - "items": [ - { - "value": "YUNNAN", - "label": "\u4e91\u5357", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "SICHUAN", - "label": "\u56db\u5ddd", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "GUIZHOU", - "label": "\u8d35\u5dde", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "TIBET", - "label": "\u897f\u85cf", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "XINJIANG", - "label": "\u65b0\u7586", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "GANSU", - "label": "\u7518\u8083", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "QINGHAI", - "label": "\u9752\u6d77", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "HAINAN", - "label": "\u6d77\u5357", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "NATIONWIDE", - "label": "\u5168\u56fd", - "sort": 9, - "status": "ACTIVE" - } - ] - }, - "guide_specialty": { - "name": "\u5bfc\u6e38\u4e13\u957f", - "category": "BUSINESS", - "remark": "\u5bfc\u6e38\u7684\u64c5\u957f\u9886\u57df", - "items": [ - { - "value": "HISTORY", - "label": "\u5386\u53f2\u6587\u5316", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "NATURE", - "label": "\u81ea\u7136\u98ce\u5149", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "FOOD", - "label": "\u7f8e\u98df\u63a2\u7d22", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "ADVENTURE", - "label": "\u6237\u5916\u63a2\u9669", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "PHOTOGRAPHY", - "label": "\u6444\u5f71\u65c5\u62cd", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "FAMILY", - "label": "\u4eb2\u5b50\u6e38", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "BUSINESS", - "label": "\u5546\u52a1\u63a5\u5f85", - "sort": 7, - "status": "ACTIVE" - } - ] - }, - "hotel_facility": { - "name": "\u9152\u5e97\u914d\u5957\u8bbe\u65bd", - "category": "BUSINESS", - "remark": "Hotel-level facilities", - "items": [ - { - "value": "parking", - "label": "\u505c\u8f66\u573a", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "breakfast", - "label": "\u65e9\u9910", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "free_wifi", - "label": "\u514d\u8d39WiFi", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "gym", - "label": "\u5065\u8eab\u623f", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "laundry", - "label": "\u6d17\u8863\u623f", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "laundry_service", - "label": "\u4ee3\u6d17\u670d\u52a1", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "screen_cast", - "label": "\u624b\u673a\u6295\u5c4f", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "robot", - "label": "\u667a\u80fd\u673a\u5668\u4eba", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "elevator", - "label": "\u7535\u68af", - "sort": 9, - "status": "ACTIVE" - }, - { - "value": "luggage_storage", - "label": "\u884c\u674e\u5bc4\u5b58", - "sort": 10, - "status": "ACTIVE" - }, - { - "value": "front_desk_24h", - "label": "24\u5c0f\u65f6\u524d\u53f0", - "sort": 11, - "status": "ACTIVE" - }, - { - "value": "business_center", - "label": "\u5546\u52a1\u4e2d\u5fc3", - "sort": 12, - "status": "ACTIVE" - }, - { - "value": "meeting_room", - "label": "\u4f1a\u8bae\u5ba4", - "sort": 13, - "status": "ACTIVE" - }, - { - "value": "pool", - "label": "\u6e38\u6cf3\u6c60", - "sort": 14, - "status": "ACTIVE" - }, - { - "value": "spa", - "label": "SPA", - "sort": 15, - "status": "ACTIVE" - }, - { - "value": "shuttle", - "label": "\u63a5\u9a73\u670d\u52a1", - "sort": 16, - "status": "ACTIVE" - }, - { - "value": "kids_area", - "label": "\u513f\u7ae5\u4e50\u56ed", - "sort": 17, - "status": "ACTIVE" - }, - { - "value": "accessibility", - "label": "\u65e0\u969c\u788d\u8bbe\u65bd", - "sort": 18, - "status": "ACTIVE" - }, - { - "value": "pet_friendly", - "label": "\u5ba0\u7269\u53cb\u597d", - "sort": 19, - "status": "ACTIVE" - }, - { - "value": "ev_charging", - "label": "\u5145\u7535\u6869", - "sort": 20, - "status": "ACTIVE" - } - ] - }, - "hotel_star_level": { - "name": "\u9152\u5e97\u661f\u7ea7", - "category": "BUSINESS", - "remark": "\u9152\u5e97\u7684\u661f\u7ea7\u7b49\u7ea7\u8bc4\u5b9a", - "items": [ - { - "value": "ECONOMY", - "label": "\u7ecf\u6d4e\u578b", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "TWO_STAR", - "label": "\u4e8c\u661f\u7ea7", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "THREE_STAR", - "label": "\u4e09\u661f\u7ea7", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "FOUR_STAR", - "label": "\u56db\u661f\u7ea7", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "FIVE_STAR", - "label": "\u4e94\u661f\u7ea7", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "LUXURY", - "label": "\u8c6a\u534e\u578b", - "sort": 6, - "status": "ACTIVE" - } - ] - }, - "hotel_type": { - "name": "\u4f4f\u5bbf\u7c7b\u578b", - "category": "BASE", - "remark": "Hotel accommodation types", - "items": [ - { - "value": "HOTEL", - "label": "\u9152\u5e97", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "HOMESTAY", - "label": "\u6c11\u5bbf", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "YURT", - "label": "\u8499\u53e4\u5305", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "RESORT", - "label": "\u5ea6\u5047\u6751", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "SPECIAL", - "label": "\u7279\u8272\u4f4f\u5bbf", - "sort": 5, - "status": "ACTIVE" - } - ] - }, - "id_card_type": { - "name": "\u8bc1\u4ef6\u7c7b\u578b", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "ID_CARD", - "label": "\u8eab\u4efd\u8bc1", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "PASSPORT", - "label": "\u62a4\u7167", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "HK_MACAU_PASS", - "label": "\u6e2f\u6fb3\u901a\u884c\u8bc1", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "TAIWAN_PASS", - "label": "\u53f0\u6e7e\u901a\u884c\u8bc1", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "MILITARY_ID", - "label": "\u519b\u5b98\u8bc1", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "OTHER", - "label": "\u5176\u4ed6", - "sort": 6, - "status": "ACTIVE" - } - ] - }, - "insurance_status": { - "name": "\u4fdd\u9669\u72b6\u6001", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "INSURED", - "label": "\u5df2\u6295\u4fdd", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "PENDING", - "label": "\u5f85\u6295\u4fdd", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "CANCELLED", - "label": "\u5df2\u53d6\u6d88", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "FAILED", - "label": "\u5931\u8d25", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "invoice_status": { - "name": "\u53d1\u7968\u72b6\u6001", - "category": "ORDER", - "remark": "", - "items": [ - { - "value": "PENDING", - "label": "\u5f85\u5f00\u7968", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "ISSUED", - "label": "\u5df2\u5f00\u7968", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "FAILED", - "label": "\u5f00\u7968\u5931\u8d25", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "VOIDED", - "label": "\u5df2\u4f5c\u5e9f", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "job_group": { - "name": "\u4efb\u52a1\u5206\u7ec4", - "category": "BASE", - "remark": "", - "items": [ - { - "value": "DEFAULT", - "label": "\u9ed8\u8ba4\u5206\u7ec4", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "SYSTEM", - "label": "\u7cfb\u7edf\u4efb\u52a1", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "WECHAT", - "label": "\u4f01\u5fae\u540c\u6b65", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "INSURANCE", - "label": "\u4fdd\u9669\u540c\u6b65", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "job_log_status": { - "name": "\u4efb\u52a1\u65e5\u5fd7\u72b6\u6001", - "category": "BASE", - "remark": "", - "items": [ - { - "value": "SUCCESS", - "label": "\u6210\u529f", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "FAIL", - "label": "\u5931\u8d25", - "sort": 2, - "status": "ACTIVE" - } - ] - }, - "job_misfire_policy": { - "name": "\u4efb\u52a1\u8865\u507f\u7b56\u7565", - "category": "BASE", - "remark": "", - "items": [ - { - "value": "DEFAULT", - "label": "\u9ed8\u8ba4\u7b56\u7565", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "FIRE_ONCE", - "label": "\u7acb\u5373\u89e6\u53d1\u4e00\u6b21", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "DO_NOTHING", - "label": "\u4e0d\u89e6\u53d1", - "sort": 3, - "status": "ACTIVE" - } - ] - }, - "job_status": { - "name": "\u4efb\u52a1\u72b6\u6001", - "category": "BASE", - "remark": "", - "items": [ - { - "value": "ACTIVE", - "label": "\u542f\u7528", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "PAUSED", - "label": "\u5df2\u6682\u505c", - "sort": 2, - "status": "ACTIVE" - } - ] - }, - "language": { - "name": "\u8bed\u8a00\u80fd\u529b", - "category": "BUSINESS", - "remark": "\u4eba\u5458\u638c\u63e1\u7684\u8bed\u8a00", - "items": [ - { - "value": "MANDARIN", - "label": "\u666e\u901a\u8bdd", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "ENGLISH", - "label": "\u82f1\u8bed", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "JAPANESE", - "label": "\u65e5\u8bed", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "KOREAN", - "label": "\u97e9\u8bed", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "FRENCH", - "label": "\u6cd5\u8bed", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "SPANISH", - "label": "\u897f\u73ed\u7259\u8bed", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "CANTONESE", - "label": "\u7ca4\u8bed", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "OTHER", - "label": "\u5176\u4ed6", - "sort": 8, - "status": "ACTIVE" - } - ] - }, - "login_status": { - "name": "\u767b\u5f55\u72b6\u6001", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "SUCCESS", - "label": "\u6210\u529f", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "FAILED", - "label": "\u5931\u8d25", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "LOCKED", - "label": "\u9501\u5b9a", - "sort": 3, - "status": "ACTIVE" - } - ] - }, - "material_category": { - "name": "\u7d20\u6750\u5206\u7c7b", - "category": "BUSINESS", - "remark": "\u7d20\u6750\u5e93\u7684\u4e1a\u52a1\u5206\u7c7b", - "items": [ - { - "value": "scenic", - "label": "\u666f\u533a\u7ba1\u7406", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "hotel", - "label": "\u9152\u5e97\u7ba1\u7406", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "activity", - "label": "\u6e38\u73a9\u9879\u76ee", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "extra_service", - "label": "\u989d\u5916\u670d\u52a1", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "extra_fee", - "label": "\u989d\u5916\u8d39\u7528", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "vehicle", - "label": "\u8f66\u8f86\u7ba1\u7406", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "guide", - "label": "\u653b\u7565\u7ba1\u7406", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "personnel", - "label": "\u4eba\u5458\u7ba1\u7406", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "restaurant", - "label": "\u9910\u5385\u7ba1\u7406", - "sort": 9, - "status": "ACTIVE" - }, - { - "value": "supplies", - "label": "\u5907\u54c1\u7ba1\u7406", - "sort": 10, - "status": "ACTIVE" - }, - { - "value": "service", - "label": "\u670d\u52a1\u7ba1\u7406", - "sort": 11, - "status": "ACTIVE" - }, - { - "value": "product", - "label": "\u4ea7\u54c1\u7ba1\u7406", - "sort": 12, - "status": "ACTIVE" - }, - { - "value": "meal", - "label": "\u9910\u98df", - "sort": 13, - "status": "ACTIVE" - }, - { - "value": "miniprogram", - "label": "\u5c0f\u7a0b\u5e8f", - "sort": 14, - "status": "ACTIVE" - }, - { - "value": "system", - "label": "\u7cfb\u7edf\u7d20\u6750", - "sort": 99, - "status": "ACTIVE" - } - ] - }, - "material_review_status": { - "name": "\u7d20\u6750\u5ba1\u6838\u72b6\u6001", - "category": "BUSINESS", - "remark": "\u7d20\u6750\u4e0a\u4f20\u5ba1\u6838\u72b6\u6001", - "items": [ - { - "value": "PENDING", - "label": "\u5f85\u5ba1\u6838", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "APPROVED", - "label": "\u5df2\u901a\u8fc7", - "sort": 2, - "status": "ACTIVE" - } - ] - }, - "material_tag": { - "name": "\u7d20\u6750\u6807\u7b7e", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "landscape", - "label": "\u98ce\u666f", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "portrait", - "label": "\u4eba\u7269", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "food", - "label": "\u7f8e\u98df", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "hotel", - "label": "\u4f4f\u5bbf", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "transport", - "label": "\u4ea4\u901a", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "activity", - "label": "\u6d3b\u52a8", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "winter", - "label": "\u51ac\u5b63", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "summer", - "label": "\u590f\u5b63", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "grassland", - "label": "\u8349\u539f", - "sort": 9, - "status": "ACTIVE" - }, - { - "value": "forest", - "label": "\u68ee\u6797", - "sort": 10, - "status": "ACTIVE" - } - ] - }, - "meal_type": { - "name": "\u9910\u996e\u7c7b\u578b", - "category": "BUSINESS", - "remark": "\u884c\u7a0b\u4e2d\u7684\u7528\u9910\u5b89\u6392\u7c7b\u578b", - "items": [ - { - "value": "BREAKFAST", - "label": "\u65e9\u9910", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "LUNCH", - "label": "\u5348\u9910", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "DINNER", - "label": "\u665a\u9910", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "SELF", - "label": "\u81ea\u7406", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "menu_type": { - "name": "\u83dc\u5355\u7c7b\u578b", - "category": "BASE", - "remark": "", - "items": [ - { - "value": "D", - "label": "\u76ee\u5f55", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "M", - "label": "\u83dc\u5355", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "B", - "label": "\u6309\u94ae", - "sort": 3, - "status": "ACTIVE" - } - ] - }, - "notification_channel": { - "name": "\u901a\u77e5\u6e20\u9053", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "SMS", - "label": "\u77ed\u4fe1", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "MINIAPP", - "label": "\u5c0f\u7a0b\u5e8f", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "OA", - "label": "\u516c\u4f17\u53f7", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "INAPP", - "label": "\u7ad9\u5185\u4fe1", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "WECHAT_WORK", - "label": "\u4f01\u4e1a\u5fae\u4fe1", - "sort": 5, - "status": "ACTIVE" - } - ] - }, - "notification_event_category": { - "name": "\u901a\u77e5\u4e8b\u4ef6\u5206\u7c7b", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "ORDER", - "label": "\u8ba2\u5355", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "REFUND", - "label": "\u9000\u6b3e", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "TRIP", - "label": "\u884c\u7a0b", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "CONTRACT", - "label": "\u5408\u540c", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "INSURANCE", - "label": "\u4fdd\u9669", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "ADMIN", - "label": "\u7ba1\u7406", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "SYSTEM", - "label": "\u7cfb\u7edf", - "sort": 7, - "status": "ACTIVE" - } - ] - }, - "notification_send_status": { - "name": "\u901a\u77e5\u53d1\u9001\u72b6\u6001", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "0", - "label": "\u6210\u529f", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "1", - "label": "\u5931\u8d25", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "2", - "label": "\u5df2\u8fc7\u6ee4", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "3", - "label": "\u5df2\u8df3\u8fc7(\u5df2\u7981\u7528)", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "notification_type": { - "name": "\u901a\u77e5\u7c7b\u578b", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "ADD_EXTERNAL_CONTACT", - "label": "\u65b0\u589e\u5ba2\u6237", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "DEL_FOLLOW_USER", - "label": "\u5ba2\u6237\u6d41\u5931", - "sort": 2, - "status": "ACTIVE" - } - ] - }, - "online_status": { - "name": "\u5728\u7ebf\u72b6\u6001", - "category": "BASE", - "remark": "\u670d\u52a1\u6216\u8282\u70b9\u7684\u5728\u7ebf\u72b6\u6001", - "items": [ - { - "value": "ONLINE", - "label": "\u5728\u7ebf", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "OFFLINE", - "label": "\u79bb\u7ebf", - "sort": 2, - "status": "ACTIVE" - } - ] - }, - "order_change_reason": { - "name": "\u8ba2\u5355\u53d8\u66f4\u539f\u56e0", - "category": "BUSINESS", - "remark": "\u884c\u7a0b\u4fee\u6539/\u623f\u578b\u53d8\u66f4/\u8f66\u578b\u53d8\u66f4\u7b49\u573a\u666f\u7684\u53d8\u66f4\u539f\u56e0", - "items": [ - { - "value": "CUSTOMER_REQUEST", - "label": "\u5ba2\u6237\u8981\u6c42", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "FREE_UPGRADE", - "label": "\u514d\u8d39\u5347\u7ea7", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "HOTEL_FULL", - "label": "\u9152\u5e97\u6ee1\u623f", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "VEHICLE_UNAVAILABLE", - "label": "\u8f66\u8f86\u4e0d\u53ef\u7528", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "WEATHER", - "label": "\u5929\u6c14\u539f\u56e0", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "ITINERARY_ADJUST", - "label": "\u884c\u7a0b\u8c03\u6574", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "OTHER", - "label": "\u5176\u4ed6", - "sort": 99, - "status": "ACTIVE" - } - ] - }, - "order_display_status": { - "name": "\u8ba2\u5355\u663e\u793a\u72b6\u6001(C\u7aef)", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "PENDING_PAY", - "label": "\u5f85\u652f\u4ed8", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "PENDING_DEPARTURE", - "label": "\u5f85\u51fa\u884c", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "TRAVELLING", - "label": "\u51fa\u884c\u4e2d", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "PENDING_REVIEW", - "label": "\u5f85\u8bc4\u4ef7", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "AFTER_SALE", - "label": "\u552e\u540e", - "sort": 5, - "status": "ACTIVE" - } - ] - }, - "order_process_status": { - "name": "\u8ba2\u5355\u5185\u90e8\u6d41\u7a0b\u72b6\u6001", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "PENDING_INFO", - "label": "\u5f85\u8865\u5168\u4fe1\u606f", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "PROCESSING", - "label": "\u5f85\u5185\u90e8\u6d41\u7a0b", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "PENDING_INSURANCE", - "label": "\u5f85\u914d\u4fdd\u9669", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "PENDING_CONTRACT", - "label": "\u5f85\u7b7e\u5408\u540c", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "PENDING_ROOM", - "label": "\u5f85\u914d\u623f", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "PENDING_VEHICLE", - "label": "\u5f85\u914d\u8f66", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "PENDING_FINANCE", - "label": "\u5f85\u786e\u8ba4\u6e05\u5355", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "READY", - "label": "\u5c31\u7eea", - "sort": 8, - "status": "ACTIVE" - } - ] - }, - "order_status": { - "name": "\u8ba2\u5355\u72b6\u6001", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "PENDING_PAY", - "label": "\u5f85\u652f\u4ed8", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "DEPOSIT_PAID", - "label": "\u5df2\u4ed8\u5b9a\u91d1", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "PAID", - "label": "\u5df2\u5168\u989d\u652f\u4ed8", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "CONFIRMED", - "label": "\u5df2\u786e\u8ba4", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "PENDING_BALANCE", - "label": "\u5f85\u4ed8\u5c3e\u6b3e", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "PENDING_DEPARTURE", - "label": "\u5f85\u51fa\u884c", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "TRAVELLING", - "label": "\u65c5\u884c\u4e2d", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "COMPLETED", - "label": "\u5df2\u5b8c\u6210", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "AFTER_SALES", - "label": "\u552e\u540e\u4e2d", - "sort": 9, - "status": "ACTIVE" - }, - { - "value": "CANCELLED", - "label": "\u5df2\u53d6\u6d88", - "sort": 10, - "status": "ACTIVE" - }, - { - "value": "REFUNDING", - "label": "\u9000\u6b3e\u4e2d", - "sort": 11, - "status": "ACTIVE" - }, - { - "value": "REFUNDED", - "label": "\u5df2\u9000\u6b3e", - "sort": 12, - "status": "ACTIVE" - } - ] - }, - "order_timeline_action": { - "name": "\u8ba2\u5355\u64cd\u4f5c\u7c7b\u578b", - "category": "BUSINESS", - "remark": "\u8ba2\u5355\u64cd\u4f5c\u8bb0\u5f55\u4e2d\u7684action\u7c7b\u578b", - "items": [ - { - "value": "CREATED", - "label": "\u521b\u5efa\u8ba2\u5355", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "EDITED", - "label": "\u7f16\u8f91\u8ba2\u5355", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "CONFIRMED", - "label": "\u8ba2\u5355\u786e\u8ba4", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "PAYMENT_SUCCESS", - "label": "\u652f\u4ed8\u6210\u529f", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "DEPOSIT_UPDATED", - "label": "\u5b9a\u91d1\u53d8\u66f4", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "STATUS_CHANGE", - "label": "\u72b6\u6001\u53d8\u66f4", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "PROCESS_CHANGE", - "label": "\u6d41\u7a0b\u63a8\u8fdb", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "TODO_COMPLETED", - "label": "\u5f85\u529e\u5b8c\u6210", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "ITINERARY_EDITED", - "label": "\u884c\u7a0b\u7f16\u8f91", - "sort": 9, - "status": "ACTIVE" - }, - { - "value": "EDIT_CONFIRMED", - "label": "\u4fee\u6539\u786e\u8ba4", - "sort": 10, - "status": "ACTIVE" - }, - { - "value": "ADD_DAY", - "label": "\u65b0\u589e\u5929\u6570", - "sort": 11, - "status": "ACTIVE" - }, - { - "value": "ROOM_ADJUSTED", - "label": "\u623f\u578b\u8c03\u6574", - "sort": 12, - "status": "ACTIVE" - }, - { - "value": "VEHICLE_ADJUSTED", - "label": "\u8f66\u578b\u8c03\u6574", - "sort": 13, - "status": "ACTIVE" - }, - { - "value": "CHECKLIST_CONFIRMED", - "label": "\u6e05\u5355\u786e\u8ba4", - "sort": 14, - "status": "ACTIVE" - }, - { - "value": "CANCELLED", - "label": "\u53d6\u6d88\u8ba2\u5355", - "sort": 15, - "status": "ACTIVE" - }, - { - "value": "AUTO_CANCELLED", - "label": "\u81ea\u52a8\u53d6\u6d88", - "sort": 16, - "status": "ACTIVE" - }, - { - "value": "AUTO_COMPLETED", - "label": "\u81ea\u52a8\u5b8c\u6210", - "sort": 17, - "status": "ACTIVE" - }, - { - "value": "AUTO_TRAVEL_START", - "label": "\u81ea\u52a8\u51fa\u884c", - "sort": 18, - "status": "ACTIVE" - }, - { - "value": "DELETED", - "label": "\u5220\u9664\u8ba2\u5355", - "sort": 19, - "status": "ACTIVE" - }, - { - "value": "REFUND_APPLIED", - "label": "\u7533\u8bf7\u9000\u6b3e", - "sort": 20, - "status": "ACTIVE" - }, - { - "value": "REFUND_APPROVED", - "label": "\u9000\u6b3e\u901a\u8fc7", - "sort": 21, - "status": "ACTIVE" - }, - { - "value": "REFUND_REJECTED", - "label": "\u9000\u6b3e\u9a73\u56de", - "sort": 22, - "status": "ACTIVE" - }, - { - "value": "REFUND_SUCCESS", - "label": "\u9000\u6b3e\u6210\u529f", - "sort": 23, - "status": "ACTIVE" - }, - { - "value": "REFUND_APPEALED", - "label": "\u9000\u6b3e\u7533\u8bc9", - "sort": 24, - "status": "ACTIVE" - }, - { - "value": "REFUND_OA_APPROVED", - "label": "\u5ba1\u6279\u901a\u8fc7\u9000\u6b3e", - "sort": 25, - "status": "ACTIVE" - }, - { - "value": "REFUND_OA_REJECTED", - "label": "\u5ba1\u6279\u9a73\u56de\u9000\u6b3e", - "sort": 26, - "status": "ACTIVE" - } - ] - }, - "order_todo_type": { - "name": "\u8ba2\u5355\u5f85\u529e\u7c7b\u578b", - "category": "BUSINESS", - "remark": "\u8ba2\u5355\u5f85\u529e\u4e8b\u9879\u7684\u7c7b\u578b", - "items": [ - { - "value": "CONFIRM_ORDER", - "label": "\u786e\u8ba4\u8ba2\u5355", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "INSURANCE", - "label": "\u914d\u7f6e\u4fdd\u9669", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "CONTRACT", - "label": "\u7b7e\u8ba2\u5408\u540c", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "ARRANGE_ROOM", - "label": "\u5b89\u6392\u4f4f\u5bbf", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "ARRANGE_VEHICLE", - "label": "\u5b89\u6392\u8f66\u8f86", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "CONFIRM_CHECKLIST", - "label": "\u786e\u8ba4\u6e05\u5355", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "PROCESS_REFUND", - "label": "\u5904\u7406\u9000\u6b3e", - "sort": 7, - "status": "ACTIVE" - } - ] - }, - "payment_mode": { - "name": "\u652f\u4ed8\u6a21\u5f0f", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "FULL", - "label": "\u5168\u6b3e", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "DEPOSIT", - "label": "\u5b9a\u91d1+\u5c3e\u6b3e", - "sort": 2, - "status": "ACTIVE" - } - ] - }, - "photography_tag": { - "name": "\u6444\u5f71\u8ddf\u62cd\u6807\u7b7e", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "full_follow", - "label": "\u5168\u7a0b\u8ddf\u62cd", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "retouched", - "label": "\u7cbe\u4fee\u5e95\u7247", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "drone", - "label": "\u822a\u62cd", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "family_portrait", - "label": "\u4eb2\u5b50\u5199\u771f", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "travel_mv", - "label": "\u65c5\u62cdMV", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "instant_share", - "label": "\u5373\u65f6\u5206\u4eab", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "ethnic_costume", - "label": "\u6c11\u65cf\u670d\u9970", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "starry_sky", - "label": "\u661f\u7a7a\u6444\u5f71", - "sort": 8, - "status": "ACTIVE" - } - ] - }, - "product_approval_status": { - "name": "\u4ea7\u54c1\u5ba1\u6838\u72b6\u6001", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "NONE", - "label": "\u65e0\u5ba1\u6838", - "sort": 0, - "status": "ACTIVE" - }, - { - "value": "PENDING", - "label": "\u5ba1\u6838\u4e2d", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "PUBLISH_APPROVED", - "label": "\u4e0a\u67b6\u901a\u8fc7", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "PUBLISH_REJECTED", - "label": "\u4e0a\u67b6\u9a73\u56de", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "UNPUBLISH_APPROVED", - "label": "\u4e0b\u67b6\u901a\u8fc7", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "UNPUBLISH_REJECTED", - "label": "\u4e0b\u67b6\u9a73\u56de", - "sort": 5, - "status": "ACTIVE" - } - ] - }, - "product_category": { - "name": "\u4ea7\u54c1\u5206\u7c7b", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "family", - "label": "\u4eb2\u5b50\u6e38", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "honeymoon", - "label": "\u871c\u6708\u65c5\u884c", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "photography", - "label": "\u6444\u5f71\u4e4b\u65c5", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "experience", - "label": "\u6df1\u5ea6\u4f53\u9a8c", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "driving", - "label": "\u81ea\u9a7e\u8d8a\u91ce", - "sort": 5, - "status": "ACTIVE" - } - ] - }, - "product_grade": { - "name": "\u4ea7\u54c1\u7b49\u7ea7", - "category": "PRODUCT", - "remark": "", - "items": [ - { - "value": "LIGHT_LUXURY", - "label": "\u8f7b\u5962", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "HIGH_END", - "label": "\u9ad8\u6863", - "sort": 2, - "status": "ACTIVE" - } - ] - }, - "product_node_type": { - "name": "\u884c\u7a0b\u8282\u70b9\u7c7b\u578b", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "TRANSPORT", - "label": "\u4ea4\u901a", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "SCENIC", - "label": "\u666f\u533a", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "RESTAURANT", - "label": "\u9910\u5385", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "ACTIVITY", - "label": "\u6d3b\u52a8", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "PHOTOGRAPHY", - "label": "\u62cd\u6444", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "HOTEL", - "label": "\u4f4f\u5bbf", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "FREE", - "label": "\u81ea\u7531\u6d3b\u52a8", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "CUSTOM", - "label": "\u81ea\u5b9a\u4e49", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "SERVICE", - "label": "\u670d\u52a1", - "sort": 9, - "status": "ACTIVE" - }, - { - "value": "NOTE", - "label": "\u5907\u6ce8", - "sort": 10, - "status": "ACTIVE" - } - ] - }, - "product_status": { - "name": "\u4ea7\u54c1\u72b6\u6001", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "DRAFT", - "label": "\u8349\u7a3f", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "PUBLISHED", - "label": "\u5df2\u4e0a\u67b6", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "UNPUBLISHED", - "label": "\u5df2\u4e0b\u67b6", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "COMPLETED", - "label": "\u5df2\u5b8c\u6210", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "PENDING_REVIEW", - "label": "\u5f85\u5ba1\u6838", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "REJECTED", - "label": "\u5df2\u9a73\u56de", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "ORDERED", - "label": "\u5df2\u4e0b\u5355", - "sort": 7, - "status": "ACTIVE" - } - ] - }, - "product_type": { - "name": "\u4ea7\u54c1\u7c7b\u578b", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "CORE", - "label": "\u6838\u5fc3\u4ea7\u54c1", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "ROUTE", - "label": "\u81ea\u9a7e\u8def\u4e66", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "CUSTOM", - "label": "\u79c1\u4eba\u5b9a\u5236", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "GROUP", - "label": "\u5c0f\u8499\u9a6c", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "push_task_status": { - "name": "\u63a8\u9001\u4efb\u52a1\u72b6\u6001", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "PENDING", - "label": "\u5f85\u53d1\u9001", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "SENDING", - "label": "\u53d1\u9001\u4e2d", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "COMPLETED", - "label": "\u5df2\u5b8c\u6210", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "FAILED", - "label": "\u5df2\u5931\u8d25", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "rating_level": { - "name": "\u8bc4\u4ef7\u7b49\u7ea7", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "GOOD", - "label": "\u597d\u8bc4", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "MEDIUM", - "label": "\u4e2d\u8bc4", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "BAD", - "label": "\u5dee\u8bc4", - "sort": 3, - "status": "ACTIVE" - } - ] - }, - "refund_reason": { - "name": "\u9000\u6b3e\u539f\u56e0", - "category": "BASE", - "remark": "\u9000\u6b3e\u7533\u8bf7\u65f6\u9009\u62e9\u7684\u9000\u6b3e\u539f\u56e0", - "items": [ - { - "value": "schedule_conflict", - "label": "\u884c\u7a0b\u51b2\u7a81/\u65f6\u95f4\u53d8\u52a8", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "personal_reason", - "label": "\u4e2a\u4eba\u539f\u56e0\uff08\u8eab\u4f53\u4e0d\u9002\u3001\u5bb6\u5ead\u7a81\u53d1\u60c5\u51b5\uff09", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "companion_unavailable", - "label": "\u540c\u884c\u4eba\u65e0\u6cd5\u51fa\u884c", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "better_price", - "label": "\u627e\u5230\u66f4\u5408\u9002\u7684\u4ea7\u54c1/\u4ef7\u683c", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "duplicate_order", - "label": "\u91cd\u590d\u4e0b\u5355/\u8bef\u64cd\u4f5c\u4e0b\u5355", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "product_mismatch", - "label": "\u4ea7\u54c1\u4fe1\u606f\u63cf\u8ff0\u4e0d\u7b26", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "itinerary_change", - "label": "\u884c\u7a0b\u53d8\u66f4", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "supplier_unavailable", - "label": "\u4f9b\u5e94\u5546\u8d44\u6e90\u4e0d\u53ef\u7528\uff08\u9152\u5e97\u6ee1\u623f\u3001\u8f66\u8f86\u8c03\u5ea6\u95ee\u9898\uff09", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "customer_service", - "label": "\u5ba2\u670d\u6c9f\u901a\u95ee\u9898", - "sort": 9, - "status": "ACTIVE" - }, - { - "value": "promise_unmet", - "label": "\u670d\u52a1\u627f\u8bfa\u672a\u5151\u73b0", - "sort": 10, - "status": "ACTIVE" - }, - { - "value": "service_mismatch", - "label": "\u5b9e\u9645\u670d\u52a1\u4e0e\u7ea6\u5b9a\u4e0d\u7b26\uff08\u4f4f\u5bbf\u964d\u7ea7\u3001\u9910\u6807\u7f29\u6c34\uff09", - "sort": 11, - "status": "ACTIVE" - } - ] - }, - "refund_reason_category": { - "name": "\u9000\u6b3e\u539f\u56e0\u5206\u7c7b", - "category": "BUSINESS", - "remark": "\u9000\u6b3e\u539f\u56e0\u7684\u5206\u7c7b", - "items": [ - { - "value": "GENERAL", - "label": "\u901a\u7528\u539f\u56e0", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "PRODUCT", - "label": "\u4ea7\u54c1\u76f8\u5173", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "SERVICE", - "label": "\u670d\u52a1\u76f8\u5173", - "sort": 3, - "status": "ACTIVE" - } - ] - }, - "refund_status": { - "name": "\u9000\u6b3e\u72b6\u6001", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "PENDING", - "label": "\u5f85\u5ba1\u6279", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "APPROVED", - "label": "\u5df2\u901a\u8fc7", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "REJECTED", - "label": "\u5df2\u9a73\u56de", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "REFUNDING", - "label": "\u9000\u6b3e\u4e2d", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "REFUNDED", - "label": "\u5df2\u9000\u6b3e", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "APPEALING", - "label": "\u7533\u8bc9\u4e2d", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "APPEAL_APPROVED", - "label": "\u7533\u8bc9\u901a\u8fc7", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "APPEAL_REJECTED", - "label": "\u7533\u8bc9\u9a73\u56de", - "sort": 8, - "status": "ACTIVE" - } - ] - }, - "refund_type": { - "name": "\u9000\u6b3e\u7c7b\u578b", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "DEPOSIT", - "label": "\u5b9a\u91d1", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "BALANCE", - "label": "\u5c3e\u6b3e", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "FULL", - "label": "\u5168\u6b3e", - "sort": 3, - "status": "ACTIVE" - } - ] - }, - "restaurant_category": { - "name": "\u9910\u5385\u5206\u7c7b", - "category": "BUSINESS", - "remark": "\u63a8\u8350\u9910\u5385\u7684\u5206\u7c7b", - "items": [ - { - "value": "local_specialty", - "label": "\u672c\u5730\u7279\u8272", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "ethnic_cuisine", - "label": "\u6c11\u65cf\u98ce\u5473", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "farmhouse", - "label": "\u519c\u5bb6\u4e50", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "hotel_dining", - "label": "\u9152\u5e97\u9910\u5385", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "internet_famous", - "label": "\u7f51\u7ea2\u6253\u5361", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "bbq_hotpot", - "label": "\u70e7\u70e4\u706b\u9505", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "western", - "label": "\u897f\u9910\u5496\u5561", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "snack_street", - "label": "\u5c0f\u5403\u8857", - "sort": 8, - "status": "ACTIVE" - } - ] - }, - "restaurant_facility": { - "name": "\u9910\u5385\u8bbe\u65bd", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "wifi", - "label": "WiFi", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "parking", - "label": "\u505c\u8f66\u573a", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "private_room", - "label": "\u5305\u95f4", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "child_seat", - "label": "\u513f\u7ae5\u5ea7\u6905", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "wheelchair", - "label": "\u8f6e\u6905\u901a\u9053", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "restroom", - "label": "\u6d17\u624b\u95f4", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "air_conditioning", - "label": "\u7a7a\u8c03", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "outdoor_seating", - "label": "\u6237\u5916\u5ea7\u4f4d", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "charging", - "label": "\u5145\u7535\u63d2\u5ea7", - "sort": 9, - "status": "ACTIVE" - }, - { - "value": "tv", - "label": "\u7535\u89c6", - "sort": 10, - "status": "ACTIVE" - } - ] - }, - "review_rating_category": { - "name": "\u8bc4\u5206\u7c7b\u522b", - "category": "BUSINESS", - "remark": "\u8bc4\u4ef7\u65f6\u9700\u8981\u586b\u5199\u7684\u8bc4\u5206\u7ef4\u5ea6", - "items": [ - { - "value": "ratingOverall", - "label": "\u6574\u4f53\u6ee1\u610f\u5ea6", - "sort": 0, - "status": "ACTIVE" - }, - { - "value": "customizerRating", - "label": "\u5b9a\u5236\u5e08\u670d\u52a1", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "ratingItinerary", - "label": "\u884c\u7a0b\u5b89\u6392", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "ratingAccommodation", - "label": "\u4f4f\u5bbf\u5b89\u6392", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "ratingDining", - "label": "\u9910\u996e\u8d28\u91cf", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "ratingDriver", - "label": "\u53f8\u673a\u670d\u52a1", - "sort": 5, - "status": "ACTIVE" - } - ] - }, - "review_status": { - "name": "\u8bc4\u4ef7\u5ba1\u6838\u72b6\u6001", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "PENDING_REVIEW", - "label": "\u5f85\u5ba1\u6838", - "sort": 0, - "status": "ACTIVE" - }, - { - "value": "PENDING_MODERATION", - "label": "\u673a\u5668\u5ba1\u6838\u4e2d", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "PENDING_MANUAL", - "label": "\u5f85\u4eba\u5de5\u5ba1\u6838", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "MACHINE_REJECTED", - "label": "\u673a\u5668\u62d2\u7edd", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "APPROVED", - "label": "\u5df2\u901a\u8fc7", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "REJECTED", - "label": "\u5df2\u62d2\u7edd", - "sort": 5, - "status": "ACTIVE" - } - ] - }, - "review_target_type": { - "name": "\u8bc4\u4ef7\u76ee\u6807\u7c7b\u578b", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "PRODUCT", - "label": "\u4ea7\u54c1", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "CUSTOMIZER", - "label": "\u5b9a\u5236\u5e08", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "SCENIC", - "label": "\u666f\u533a", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "ACTIVITY", - "label": "\u6d3b\u52a8", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "HOTEL", - "label": "\u9152\u5e97", - "sort": 5, - "status": "ACTIVE" - } - ] - }, - "room_category": { - "name": "\u623f\u578b\u5206\u7c7b", - "category": "BUSINESS", - "remark": "Room type categories", - "items": [ - { - "value": "STANDARD", - "label": "\u6807\u95f4", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "SINGLE", - "label": "\u5355\u4eba\u95f4", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "TWIN", - "label": "\u53cc\u5e8a\u623f", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "QUEEN", - "label": "\u5927\u5e8a\u623f", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "KING", - "label": "\u8c6a\u534e\u5927\u5e8a", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "DELUXE", - "label": "\u8c6a\u534e\u623f", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "SUITE", - "label": "\u5957\u623f", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "FAMILY", - "label": "\u5bb6\u5ead\u623f", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "YURT", - "label": "\u8499\u53e4\u5305", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "SPECIAL", - "label": "\u7279\u8272\u623f", - "sort": 9, - "status": "ACTIVE" - }, - { - "value": "PARENT_CHILD", - "label": "\u4eb2\u5b50\u623f", - "sort": 10, - "status": "ACTIVE" - } - ] - }, - "room_facility": { - "name": "\u623f\u578b\u8bbe\u65bd", - "category": "BUSINESS", - "remark": "Room-level facilities", - "items": [ - { - "value": "slippers", - "label": "\u62d6\u978b", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "wardrobe", - "label": "\u8863\u67dc/\u8863\u67b6", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "baby_bed", - "label": "\u5a74\u513f\u5e8a", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "wifi", - "label": "WiFi", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "wired_net", - "label": "\u6709\u7ebf\u5bbd\u5e26", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "kettle", - "label": "\u70ed\u6c34\u58f6", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "air_cond", - "label": "\u7a7a\u8c03", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "shower", - "label": "\u72ec\u7acb\u6dcb\u6d74\u82b1\u6d12", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "mosquito_net", - "label": "\u7eb1\u7a97/\u868a\u5e10", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "smart_tv", - "label": "\u667a\u80fd\u7535\u89c6", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "safe", - "label": "\u4fdd\u9669\u7bb1", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "mini_fridge", - "label": "\u5c0f\u51b0\u7bb1", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "free_water", - "label": "\u514d\u8d39\u74f6\u88c5\u6c34", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "heating", - "label": "\u6696\u6c14", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "phone", - "label": "\u72ec\u7acb\u7535\u8bdd", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "desk", - "label": "\u4e66\u684c", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "kids_toiletry", - "label": "\u513f\u7ae5\u6d17\u6f31\u7528\u54c1", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "toiletries", - "label": "\u514d\u8d39\u6d17\u6f31\u7528\u54c1", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "minibar", - "label": "\u8ff7\u4f60\u5427", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "hairdryer", - "label": "\u5439\u98ce\u673a", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "charger", - "label": "\u624b\u673a\u5145\u7535\u5668", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "corner_guard", - "label": "\u9632\u649e\u89d2", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "sofa", - "label": "\u6c99\u53d1", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "floor_heat", - "label": "\u5730\u6696", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "usb_port", - "label": "USB\u5145\u7535\u53e3", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "coffee", - "label": "\u5496\u5561\u673a", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "bath_towel", - "label": "\u6d74\u5dfe", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "private_bath", - "label": "\u72ec\u7acb\u536b\u6d74", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "luggage_rack", - "label": "\u884c\u674e\u67b6", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "bt_speaker", - "label": "\u84dd\u7259\u97f3\u7bb1", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "smart_toilet", - "label": "\u667a\u80fd\u9a6c\u6876", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "bathtub", - "label": "\u6d74\u7f38", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "tea_set", - "label": "\u8336\u5177", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "blackout", - "label": "\u906e\u5149\u7a97\u5e18", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "mirror", - "label": "\u5168\u8eab\u955c", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "balcony", - "label": "\u9633\u53f0", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "iron", - "label": "\u71a8\u6597", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "bathrobe", - "label": "\u6d74\u888d", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "air_purifier", - "label": "\u7a7a\u6c14\u51c0\u5316\u5668", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "power_220v", - "label": "220V\u7535\u6e90\u63d2\u5ea7", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "stargazing", - "label": "\u53ef\u770b\u661f\u7a7a", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "face_wash", - "label": "\u6d17\u9762\u4e73", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "body_wash", - "label": "\u6c90\u6d74\u9732", - "sort": 9, - "status": "ACTIVE" - }, - { - "value": "screen_cast", - "label": "\u624b\u673a\u6295\u5c4f", - "sort": 9, - "status": "ACTIVE" - } - ] - }, - "scenic_facility": { - "name": "\u666f\u533a\u8bbe\u65bd", - "category": "BUSINESS", - "remark": "\u666f\u533a\u914d\u5957\u8bbe\u65bd", - "items": [ - { - "value": "parking", - "label": "\u505c\u8f66\u573a", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "toilet", - "label": "\u536b\u751f\u95f4", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "restaurant", - "label": "\u9910\u996e", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "wifi", - "label": "WiFi", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "accessible", - "label": "\u65e0\u969c\u788d", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "guide_service", - "label": "\u5bfc\u6e38\u670d\u52a1", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "locker", - "label": "\u50a8\u7269\u67dc", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "medical", - "label": "\u533b\u52a1\u5ba4", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "gift_shop", - "label": "\u7eaa\u5ff5\u54c1\u5e97", - "sort": 9, - "status": "ACTIVE" - }, - { - "value": "rest_area", - "label": "\u4f11\u606f\u533a", - "sort": 10, - "status": "ACTIVE" - }, - { - "value": "ev_charging", - "label": "\u5145\u7535\u6869", - "sort": 11, - "status": "ACTIVE" - }, - { - "value": "baby_care", - "label": "\u6bcd\u5a74\u5ba4", - "sort": 12, - "status": "ACTIVE" - } - ] - }, - "scenic_honor": { - "name": "\u666f\u533a\u8363\u8a89\u79f0\u53f7", - "category": "BUSINESS", - "remark": "\u666f\u533a\u8363\u8a89\u79f0\u53f7\uff08\u591a\u9009\uff09", - "items": [ - { - "value": "5A", - "label": "5A\u7ea7\u666f\u533a", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "4A", - "label": "4A\u7ea7\u666f\u533a", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "3A", - "label": "3A\u7ea7\u666f\u533a", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "2A", - "label": "2A\u7ea7\u666f\u533a", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "1A", - "label": "1A\u7ea7\u666f\u533a", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "WORLD_HERITAGE", - "label": "\u4e16\u754c\u9057\u4ea7", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "NATIONAL_SCENIC", - "label": "\u56fd\u5bb6\u7ea7\u98ce\u666f\u540d\u80dc\u533a", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "NATIONAL_RESERVE", - "label": "\u56fd\u5bb6\u7ea7\u81ea\u7136\u4fdd\u62a4\u533a", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "NATIONAL_FOREST", - "label": "\u56fd\u5bb6\u68ee\u6797\u516c\u56ed", - "sort": 9, - "status": "ACTIVE" - }, - { - "value": "NATIONAL_GEOPARK", - "label": "\u56fd\u5bb6\u5730\u8d28\u516c\u56ed", - "sort": 10, - "status": "ACTIVE" - } - ] - }, - "season": { - "name": "\u5b63\u8282", - "category": "BASE", - "remark": "\u4e00\u5e74\u56db\u5b63", - "items": [ - { - "value": "SPRING", - "label": "\u6625\u5b63", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "SUMMER", - "label": "\u590f\u5b63", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "AUTUMN", - "label": "\u79cb\u5b63", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "WINTER", - "label": "\u51ac\u5b63", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "service_billing_type": { - "name": "\u670d\u52a1\u9879\u8ba1\u8d39\u65b9\u5f0f", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "FLAT_RATE", - "label": "\u4e00\u53e3\u4ef7", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "PER_PERSON", - "label": "\u6309\u4eba\u5934", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "PER_HOUR", - "label": "\u6309\u5c0f\u65f6", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "PER_DAY", - "label": "\u6309\u5929", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "PER_DISTANCE", - "label": "\u6309\u8ddd\u79bb", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "CUSTOM", - "label": "\u81ea\u5b9a\u4e49", - "sort": 6, - "status": "ACTIVE" - } - ] - }, - "service_category": { - "name": "\u670d\u52a1\u5206\u7c7b", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "airport_transfer", - "label": "\u673a\u573a\u63a5\u9001", - "sort": 10, - "status": "ACTIVE" - }, - { - "value": "station_transfer", - "label": "\u8f66\u7ad9\u63a5\u9001", - "sort": 20, - "status": "ACTIVE" - }, - { - "value": "ceremony", - "label": "\u4eea\u5f0f\u6d3b\u52a8", - "sort": 30, - "status": "ACTIVE" - }, - { - "value": "guide", - "label": "\u5bfc\u6e38\u670d\u52a1", - "sort": 40, - "status": "ACTIVE" - }, - { - "value": "photography", - "label": "\u6444\u5f71\u8ddf\u62cd", - "sort": 50, - "status": "ACTIVE" - }, - { - "value": "charter", - "label": "\u5305\u8f66\u670d\u52a1", - "sort": 60, - "status": "ACTIVE" - }, - { - "value": "logistics", - "label": "\u540e\u52e4\u4fdd\u969c", - "sort": 70, - "status": "ACTIVE" - }, - { - "value": "vip", - "label": "\u8d35\u5bbe\u670d\u52a1", - "sort": 80, - "status": "ACTIVE" - }, - { - "value": "free_gift", - "label": "\u514d\u8d39\u8d60\u9001", - "sort": 90, - "status": "ACTIVE" - } - ] - }, - "service_unit": { - "name": "\u670d\u52a1\u8ba1\u4ef7\u5355\u4f4d", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "PER_PERSON", - "label": "\u5143/\u4eba", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "PER_TIME", - "label": "\u5143/\u6b21", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "PER_DAY", - "label": "\u5143/\u5929", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "PER_VEHICLE", - "label": "\u5143/\u53f0", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "FIXED", - "label": "\u56fa\u5b9a\u91d1\u989d", - "sort": 5, - "status": "ACTIVE" - } - ] - }, - "settle_status": { - "name": "\u7ed3\u7b97\u72b6\u6001", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "pending", - "label": "\u5f85\u7ed3\u7b97", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "settled", - "label": "\u5df2\u7ed3\u7b97", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "processing", - "label": "\u7ed3\u7b97\u4e2d", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "cancelled", - "label": "\u5df2\u53d6\u6d88", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "staff_role": { - "name": "\u56e2\u671f\u4eba\u5458\u89d2\u8272", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "LEADER", - "label": "\u9886\u961f", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "PHOTOGRAPHER", - "label": "\u6444\u5f71\u5e08", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "DRIVER", - "label": "\u53f8\u673a", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "OTHER", - "label": "\u5176\u4ed6", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "staff_type": { - "name": "\u4eba\u5458\u7c7b\u578b", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "GUIDE", - "label": "\u5bfc\u6e38", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "GUIDE_ASSISTANT", - "label": "\u5bfc\u6e38\u52a9\u7406", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "PHOTOGRAPHER", - "label": "\u6444\u5f71\u5e08", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "LEADER", - "label": "\u9886\u961f", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "OTHER", - "label": "\u5176\u4ed6", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "STUDY_TEACHER", - "label": "\u7814\u5b66\u8001\u5e08", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "LIFE_TEACHER", - "label": "\u751f\u6d3b\u8001\u5e08", - "sort": 7, - "status": "ACTIVE" - } - ] - }, - "study_gain_category": { - "name": "\u7814\u5b66\u6536\u83b7\u5206\u7c7b", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "horsemanship", - "label": "\u9a6c\u672f\u4f53\u9a8c", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "stargazing", - "label": "\u661f\u7a7a\u5b66\u5802", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "music", - "label": "\u8499\u53e4\u97f3\u4e50", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "ecology", - "label": "\u8349\u539f\u751f\u6001", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "dairy_diy", - "label": "\u5976\u5236\u54c1DIY", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "certificate", - "label": "\u7814\u5b66\u8bc1\u4e66", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "folk_culture", - "label": "\u6c11\u4fd7\u6587\u5316", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "nature_explore", - "label": "\u81ea\u7136\u63a2\u7d22", - "sort": 8, - "status": "ACTIVE" - }, - { - "value": "handicraft", - "label": "\u624b\u5de5\u5236\u4f5c", - "sort": 9, - "status": "ACTIVE" - }, - { - "value": "history", - "label": "\u5386\u53f2\u4eba\u6587", - "sort": 10, - "status": "ACTIVE" - } - ] - }, - "supplies_category": { - "name": "\u5907\u54c1\u5206\u7c7b", - "category": "BUSINESS", - "remark": "\u5907\u54c1\u79df\u8d41\u7684\u5206\u7c7b", - "items": [ - { - "value": "personal_gear", - "label": "\u4e2a\u4eba\u88c5\u5907", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "camping_equipment", - "label": "\u9732\u8425\u8bbe\u5907", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "riding_gear", - "label": "\u9a91\u884c\u88c5\u5907", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "electronics", - "label": "\u7535\u5b50\u8bbe\u5907", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "safety_protection", - "label": "\u5b89\u5168\u9632\u62a4", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "entertainment", - "label": "\u5a31\u4e50\u5668\u6750", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "warmth_gear", - "label": "\u4fdd\u6696\u88c5\u5907", - "sort": 7, - "status": "ACTIVE" - }, - { - "value": "vehicle_accessories", - "label": "\u8f66\u8f7d\u88c5\u5907", - "sort": 8, - "status": "ACTIVE" - } - ] - }, - "sys_yes_no": { - "name": "\u662f\u5426", - "category": "BASE", - "remark": "\u901a\u7528\u662f\u5426\u9009\u62e9", - "items": [ - { - "value": "1", - "label": "\u662f", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "0", - "label": "\u5426", - "sort": 2, - "status": "ACTIVE" - } - ] - }, - "task_priority": { - "name": "\u4efb\u52a1\u4f18\u5148\u7ea7", - "category": "BUSINESS", - "remark": "\u4efb\u52a1\u770b\u677f\u4e2d\u4efb\u52a1\u7684\u4f18\u5148\u7ea7", - "items": [ - { - "value": "LOW", - "label": "\u4f4e", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "MEDIUM", - "label": "\u4e2d", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "HIGH", - "label": "\u9ad8", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "URGENT", - "label": "\u7d27\u6025", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "transmission": { - "name": "\u53d8\u901f\u7bb1", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "AUTO", - "label": "\u81ea\u52a8\u6321", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "MANUAL", - "label": "\u624b\u52a8\u6321", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "DCT", - "label": "\u53cc\u79bb\u5408", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "CVT", - "label": "\u65e0\u7ea7\u53d8\u901f", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "transport_type": { - "name": "\u4ea4\u901a\u7c7b\u578b", - "category": "ORDER", - "remark": "\u8ba2\u5355\u4ea4\u901a\u4fe1\u606f\u7c7b\u578b\uff1a\u822a\u73ed/\u706b\u8f66", - "items": [ - { - "value": "FLIGHT", - "label": "\u822a\u73ed", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "TRAIN", - "label": "\u706b\u8f66", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "BUS", - "label": "\u5927\u5df4", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "SELF_DRIVE", - "label": "\u81ea\u9a7e", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "travel_purpose": { - "name": "\u65c5\u6e38\u76ee\u7684", - "category": "ORDER", - "remark": "", - "items": [ - { - "value": "LEISURE", - "label": "\u4f11\u95f2\u5ea6\u5047", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "ADVENTURE", - "label": "\u63a2\u9669\u4f53\u9a8c", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "CULTURE", - "label": "\u6587\u5316\u63a2\u8bbf", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "FAMILY", - "label": "\u4eb2\u5b50\u966a\u4f34", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "ROMANCE", - "label": "\u6d6a\u6f2b\u65c5\u884c", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "TEAM", - "label": "\u56e2\u961f\u5efa\u8bbe", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "OTHER", - "label": "\u5176\u4ed6", - "sort": 99, - "status": "ACTIVE" - } - ] - }, - "traveler_type": { - "name": "\u51fa\u884c\u4eba\u7c7b\u578b", - "category": "BUSINESS", - "remark": "\u51fa\u884c\u4eba\u5e74\u9f84\u5206\u7c7b\uff0c\u7528\u4e8e\u8ba2\u5355\u548c\u51fa\u884c\u4eba\u7ba1\u7406", - "items": [ - { - "value": "ADULT", - "label": "\u6210\u4eba", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "CHILD", - "label": "\u513f\u7ae5", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "YOUNG_CHILD", - "label": "\u5c0f\u7ae5", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "BABY", - "label": "\u5e7c\u7ae5", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "traveler_type_age_rule": { - "name": "\u51fa\u884c\u4eba\u5e74\u9f84\u89c4\u5219", - "category": "BUSINESS", - "remark": "\u6839\u636e\u51fa\u751f\u65e5\u671f\u81ea\u52a8\u5224\u65ad\u51fa\u884c\u4eba\u7c7b\u578b\uff0cremark\u5b58JSON\u683c\u5f0f\u5e74\u9f84\u8303\u56f4{\"minAge\":\u4e0b\u9650,\"maxAge\":\u4e0a\u9650}\uff0c\u542b\u4e0b\u9650\u4e0d\u542b\u4e0a\u9650", - "items": [ - { - "value": "BABY", - "label": "\u5e7c\u7ae5", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "YOUNG_CHILD", - "label": "\u5c0f\u7ae5", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "CHILD", - "label": "\u513f\u7ae5", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "ADULT", - "label": "\u6210\u4eba", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "trip_status": { - "name": "\u884c\u7a0b\u72b6\u6001", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "draft", - "label": "\u8349\u7a3f", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "online", - "label": "\u5df2\u4e0a\u7ebf", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "offline", - "label": "\u5df2\u4e0b\u7ebf", - "sort": 3, - "status": "ACTIVE" - } - ] - }, - "trip_type": { - "name": "\u884c\u7a0b\u7c7b\u578b", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "group", - "label": "\u8ddf\u56e2\u6e38", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "free", - "label": "\u81ea\u7531\u884c", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "custom", - "label": "\u5b9a\u5236\u6e38", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "semi_free", - "label": "\u534a\u81ea\u7531\u884c", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "user_status": { - "name": "\u7528\u6237\u72b6\u6001", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "ACTIVE", - "label": "\u6b63\u5e38", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "INACTIVE", - "label": "\u672a\u6fc0\u6d3b", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "BANNED", - "label": "\u5df2\u5c01\u7981", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "DELETED", - "label": "\u5df2\u6ce8\u9500", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "vehicle_type": { - "name": "\u8f66\u578b", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "SUV", - "label": "\u8d8a\u91ce\u8f66", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "SEDAN", - "label": "5\u5ea7\u8f7f\u8f66", - "sort": 10, - "status": "ACTIVE" - }, - { - "value": "MPV", - "label": "7\u5ea7\u5546\u52a1\u8f66", - "sort": 20, - "status": "ACTIVE" - }, - { - "value": "MINIBUS", - "label": "9-15\u5ea7\u5c0f\u5df4", - "sort": 30, - "status": "ACTIVE" - }, - { - "value": "BUS", - "label": "\u5927\u5df4", - "sort": 40, - "status": "ACTIVE" - }, - { - "value": "GROUP", - "label": "\u5c0f\u8499\u9a6c\u4e13\u7528", - "sort": 60, - "status": "ACTIVE" - } - ] - }, - "wiki_category": { - "name": "\u767e\u79d1\u5206\u7c7b", - "category": "BUSINESS", - "remark": "\u767e\u79d1\u6587\u7ae0\u5206\u7c7b", - "items": [ - { - "value": "scenery", - "label": "\u7edd\u7f8e\u98ce\u5149", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "food", - "label": "\u7279\u8272\u7f8e\u98df", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "culture", - "label": "\u6c11\u4fd7\u6587\u5316", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "travel_guide", - "label": "\u65c5\u884c\u653b\u7565", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "accommodation", - "label": "\u4f4f\u5bbf\u63a8\u8350", - "sort": 5, - "status": "ACTIVE" - }, - { - "value": "transport", - "label": "\u4ea4\u901a\u51fa\u884c", - "sort": 6, - "status": "ACTIVE" - }, - { - "value": "tips", - "label": "\u6ce8\u610f\u4e8b\u9879", - "sort": 7, - "status": "ACTIVE" - } - ] - }, - "wiki_status": { - "name": "\u6587\u7ae0\u72b6\u6001", - "category": "BUSINESS", - "remark": "", - "items": [ - { - "value": "0", - "label": "\u8349\u7a3f", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "1", - "label": "\u5df2\u53d1\u5e03", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "2", - "label": "\u5df2\u4e0b\u67b6", - "sort": 3, - "status": "ACTIVE" - } - ] - }, - "window_type": { - "name": "\u7a97\u6237\u7c7b\u578b", - "category": "BUSINESS", - "remark": "Window types", - "items": [ - { - "value": "NO_WINDOW", - "label": "\u65e0\u7a97", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "WINDOW", - "label": "\u6709\u7a97", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "SCENIC", - "label": "\u666f\u89c2\u7a97", - "sort": 3, - "status": "ACTIVE" - } - ] - }, - "work_order_priority": { - "name": "\u5de5\u5355\u4f18\u5148\u7ea7", - "category": "BUSINESS", - "remark": "\u5ba2\u6237\u5de5\u5355\u7684\u7d27\u6025\u7a0b\u5ea6", - "items": [ - { - "value": "LOW", - "label": "\u4f4e", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "MEDIUM", - "label": "\u4e2d", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "HIGH", - "label": "\u9ad8", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "URGENT", - "label": "\u7d27\u6025", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "work_order_status": { - "name": "\u5de5\u5355\u72b6\u6001", - "category": "BUSINESS", - "remark": "\u5ba2\u6237\u5de5\u5355\u7684\u5904\u7406\u72b6\u6001", - "items": [ - { - "value": "PENDING", - "label": "\u5f85\u5904\u7406", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "PROCESSING", - "label": "\u5904\u7406\u4e2d", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "COMPLETED", - "label": "\u5df2\u5b8c\u6210", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "CLOSED", - "label": "\u5df2\u5173\u95ed", - "sort": 4, - "status": "ACTIVE" - } - ] - }, - "work_order_type": { - "name": "\u5de5\u5355\u7c7b\u578b", - "category": "BUSINESS", - "remark": "\u5ba2\u6237\u5de5\u5355\u7684\u4e1a\u52a1\u5206\u7c7b", - "items": [ - { - "value": "REFUND", - "label": "\u9000\u6b3e\u7533\u8bf7", - "sort": 1, - "status": "ACTIVE" - }, - { - "value": "ITINERARY_CHANGE", - "label": "\u884c\u7a0b\u53d8\u66f4", - "sort": 2, - "status": "ACTIVE" - }, - { - "value": "COMPLAINT", - "label": "\u6295\u8bc9\u5efa\u8bae", - "sort": 3, - "status": "ACTIVE" - }, - { - "value": "INQUIRY", - "label": "\u54a8\u8be2", - "sort": 4, - "status": "ACTIVE" - }, - { - "value": "OTHER", - "label": "\u5176\u4ed6", - "sort": 5, - "status": "ACTIVE" - } - ] - } -} \ No newline at end of file diff --git a/.swagger/hl-contract-service.json b/.swagger/hl-contract-service.json deleted file mode 100644 index 5583184..0000000 --- a/.swagger/hl-contract-service.json +++ /dev/null @@ -1,2428 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "合同服务", - "version": "1.0.0" - }, - "basePath": "/", - "paths": { - "/admin/contract/active-by-order/{orderId}": { - "get": { - "tags": [ - "合同管理" - ], - "summary": "获取订单有效合同", - "description": "返回订单当前有效的合同(非作废状态的最新合同),用于检查订单是否已有签署中或已签署的合同。\n\n**权限**:需管理员登录。\n\n**关联字典**:\n- contract_status:合同状态(显示)", - "operationId": "getActiveByOrderUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«合同信息»", - "$ref": "#/definitions/统一响应结果«合同信息»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«合同信息»", - "$ref": "#/definitions/统一响应结果«合同信息»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/contract/agencies": { - "get": { - "tags": [ - "合同管理" - ], - "summary": "可用旅行社列表", - "description": "返回系统配置的旅行社列表,创建合同时选择签约旅行社", - "operationId": "listAgenciesUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«旅行社信息»»", - "$ref": "#/definitions/统一响应结果«List«旅行社信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«旅行社信息»»", - "$ref": "#/definitions/统一响应结果«List«旅行社信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/contract/by-order/{orderId}": { - "get": { - "tags": [ - "合同管理" - ], - "summary": "按订单查询合同", - "description": "查询指定订单下的所有合同记录(含已作废),按创建时间倒序排列。用于订单详情页展示合同历史。\n\n**权限**:需管理员登录。\n\n**关联字典**:\n- contract_status:合同状态(列表显示)", - "operationId": "getByOrderUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«合同信息»»", - "$ref": "#/definitions/统一响应结果«List«合同信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«合同信息»»", - "$ref": "#/definitions/统一响应结果«List«合同信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/contract/clause-template": { - "post": { - "tags": [ - "补充约定模板管理" - ], - "summary": "创建补充约定模板", - "description": "创建合同补充约定的模板,支持变量占位符。创建后默认启用", - "operationId": "createUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "originalRef": "补充约定模板请求", - "$ref": "#/definitions/补充约定模板请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«补充约定模板»", - "$ref": "#/definitions/统一响应结果«补充约定模板»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«补充约定模板»", - "$ref": "#/definitions/统一响应结果«补充约定模板»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/contract/clause-template/list": { - "get": { - "tags": [ - "补充约定模板管理" - ], - "summary": "获取启用的补充约定模板列表(创建合同用)", - "description": "返回所有启用状态的补充约定模板,创建合同时选择需要附加的补充约定条款。\n\n**权限**:需管理员登录。", - "operationId": "listActiveUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«补充约定模板»»", - "$ref": "#/definitions/统一响应结果«List«补充约定模板»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«补充约定模板»»", - "$ref": "#/definitions/统一响应结果«List«补充约定模板»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/contract/clause-template/list-all": { - "get": { - "tags": [ - "补充约定模板管理" - ], - "summary": "获取全部补充约定模板(管理页用)", - "description": "**关联字典**:\n- common_status:通用状态(列表显示,ACTIVE=启用/INACTIVE=停用)", - "operationId": "listAllUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«补充约定模板»»", - "$ref": "#/definitions/统一响应结果«List«补充约定模板»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«补充约定模板»»", - "$ref": "#/definitions/统一响应结果«List«补充约定模板»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/contract/clause-template/{id}": { - "put": { - "tags": [ - "补充约定模板管理" - ], - "summary": "更新补充约定模板", - "description": "更新模板的标题和内容。已被合同引用的模板更新不影响已创建的合同(合同记录的是快照内容)。\n\n**权限**:需管理员登录。", - "operationId": "updateUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "模板ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "originalRef": "补充约定模板请求", - "$ref": "#/definitions/补充约定模板请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«补充约定模板»", - "$ref": "#/definitions/统一响应结果«补充约定模板»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«补充约定模板»", - "$ref": "#/definitions/统一响应结果«补充约定模板»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "补充约定模板管理" - ], - "summary": "删除补充约定模板", - "description": "软删除模板。已被合同引用的模板仍可删除,不影响已创建的合同", - "operationId": "deleteUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "模板ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/contract/clause-template/{id}/toggle-status": { - "put": { - "tags": [ - "补充约定模板管理" - ], - "summary": "切换模板启用/停用状态", - "description": "**关联字典**:\n- common_status:通用状态(状态切换,ACTIVE=启用/INACTIVE=停用)", - "operationId": "toggleStatusUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "模板ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«补充约定模板»", - "$ref": "#/definitions/统一响应结果«补充约定模板»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«补充约定模板»", - "$ref": "#/definitions/统一响应结果«补充约定模板»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/contract/create": { - "post": { - "tags": [ - "合同管理" - ], - "summary": "创建合同(标准模式)", - "description": "标准电子签约流程:创建合同 → 平台生成合同PDF → 发送签署短信给出行人 → 出行人在线签署 → 回调更新状态。状态流转:CREATED → SIGNING → SIGNED", - "operationId": "createContractUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "创建合同请求", - "required": false, - "schema": { - "originalRef": "创建合同请求", - "$ref": "#/definitions/创建合同请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«合同详情»", - "$ref": "#/definitions/统一响应结果«合同详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«合同详情»", - "$ref": "#/definitions/统一响应结果«合同详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/contract/list": { - "get": { - "tags": [ - "合同管理" - ], - "summary": "合同列表", - "description": "分页查询合同记录,支持按订单号、合同状态、旅行社筛选\n\n**关联字典**:\n- contract_status:合同状态(列表筛选+显示)", - "operationId": "listContractsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "query", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64", - "x-example": 1001 - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 20 - }, - { - "name": "platform", - "in": "query", - "description": "签约平台", - "required": false, - "type": "string", - "x-example": "TOURAGE" - }, - { - "name": "status", - "in": "query", - "description": "合同状态", - "required": false, - "type": "string", - "x-example": "SIGNED" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«合同信息»»", - "$ref": "#/definitions/统一响应结果«分页结果«合同信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«合同信息»»", - "$ref": "#/definitions/统一响应结果«分页结果«合同信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/contract/platforms": { - "get": { - "tags": [ - "合同管理" - ], - "summary": "可用合同平台列表", - "description": "返回系统已对接的合同平台列表及可用状态。\n前端在合同配置页面据此展示可选平台(如12301/法大大/e签宝/腾讯电子签)\n\n【关联字典】\n- 返回字段 platformName → 字典:contract_platform(合同平台)", - "operationId": "listPlatformsUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«ContractPlatformInfo»»", - "$ref": "#/definitions/统一响应结果«List«ContractPlatformInfo»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«ContractPlatformInfo»»", - "$ref": "#/definitions/统一响应结果«List«ContractPlatformInfo»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/contract/report": { - "post": { - "tags": [ - "合同管理" - ], - "summary": "报备合同(同步模式)", - "description": "线下签约模式:创建合同记录 → 管理员上传已签署的PDF → 同步到12301报备平台。状态流转:CREATED → UPLOADED → REPORTED", - "operationId": "reportContractUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "报备合同请求", - "required": false, - "schema": { - "originalRef": "报备合同请求(同步模式)", - "$ref": "#/definitions/报备合同请求(同步模式)" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«合同详情»", - "$ref": "#/definitions/统一响应结果«合同详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«合同详情»", - "$ref": "#/definitions/统一响应结果«合同详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/contract/templates": { - "get": { - "tags": [ - "合同管理" - ], - "summary": "合同模板列表", - "description": "返回合同平台可用的合同模板列表,创建合同时选择模板", - "operationId": "listTemplatesUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«合同模板信息»»", - "$ref": "#/definitions/统一响应结果«List«合同模板信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«合同模板信息»»", - "$ref": "#/definitions/统一响应结果«List«合同模板信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/contract/{id}": { - "get": { - "tags": [ - "合同管理" - ], - "summary": "合同详情", - "description": "**关联字典**:\n- contract_status:合同状态(显示)", - "operationId": "getContractDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "合同ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«合同详情»", - "$ref": "#/definitions/统一响应结果«合同详情»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«合同详情»", - "$ref": "#/definitions/统一响应结果«合同详情»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/contract/{id}/invalidate": { - "post": { - "tags": [ - "合同管理" - ], - "summary": "作废合同", - "description": "将合同标记为作废状态(不可恢复)。作废后该合同不再有效,可重新为订单创建新合同", - "operationId": "invalidateContractUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "合同ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«合同信息»", - "$ref": "#/definitions/统一响应结果«合同信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«合同信息»", - "$ref": "#/definitions/统一响应结果«合同信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/contract/{id}/resend-sms": { - "post": { - "tags": [ - "合同管理" - ], - "summary": "重发签署短信", - "description": "重新发送签署短信给出行人,用于签署短信过期或未收到的场景。仅SIGNING状态的合同可操作", - "operationId": "resendSmsUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "合同ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«boolean»", - "$ref": "#/definitions/统一响应结果«boolean»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«boolean»", - "$ref": "#/definitions/统一响应结果«boolean»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/contract/{id}/status": { - "get": { - "tags": [ - "合同管理" - ], - "summary": "刷新合同状态(从平台同步)", - "description": "主动查询合同平台的最新签署状态并同步到本地,适用于回调未到达的场景", - "operationId": "refreshStatusUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "合同ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«合同信息»", - "$ref": "#/definitions/统一响应结果«合同信息»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«合同信息»", - "$ref": "#/definitions/统一响应结果«合同信息»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/contract/{id}/upload-pdf": { - "post": { - "tags": [ - "合同管理" - ], - "summary": "上传已签署PDF(同步模式)", - "description": "同步模式专用:上传线下签署完成的合同PDF文件,上传后合同状态变为UPLOADED,可进一步报备", - "operationId": "uploadPdfUsingPOST", - "consumes": [ - "multipart/form-data" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "file", - "in": "formData", - "description": "签署PDF文件", - "required": false, - "type": "file" - }, - { - "name": "id", - "in": "path", - "description": "合同ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«合同信息»", - "$ref": "#/definitions/统一响应结果«合同信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«合同信息»", - "$ref": "#/definitions/统一响应结果«合同信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - } - }, - "definitions": { - "ContractPlatformInfo": { - "type": "object", - "properties": { - "available": { - "type": "boolean" - }, - "displayName": { - "type": "string" - }, - "platformName": { - "type": "string" - } - }, - "title": "ContractPlatformInfo" - }, - "分页结果«合同信息»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "originalRef": "合同信息", - "$ref": "#/definitions/合同信息" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«合同信息»" - }, - "创建合同请求": { - "type": "object", - "required": [ - "adultCost", - "contactName", - "contactPhone", - "departureDate", - "destination", - "returnDate", - "routeName", - "signatoryIdNumber", - "signatoryName", - "signatoryPhone", - "templateCode", - "totalAmount", - "travelers" - ], - "properties": { - "adultCost": { - "type": "number", - "example": 2980.0, - "description": "成人费用" - }, - "agencyCode": { - "type": "string", - "example": "L-FJ-100005", - "description": "旅行社编号(可选,默认使用配置值)" - }, - "childCost": { - "type": "number", - "example": 1490.0, - "description": "儿童费用" - }, - "contactName": { - "type": "string", - "example": "李四", - "description": "联系人姓名" - }, - "contactPhone": { - "type": "string", - "example": 13900139000, - "description": "联系人电话" - }, - "contractType": { - "type": "string", - "example": "TOUR", - "description": "合同类型: TOUR-旅游合同(默认), INSURANCE-保险单" - }, - "days": { - "type": "integer", - "format": "int32", - "example": 3, - "description": "行程天数" - }, - "departureCity": { - "type": "string", - "example": "成都", - "description": "出发城市" - }, - "departureDate": { - "type": "string", - "format": "date", - "example": "2026-04-01", - "description": "出发日期" - }, - "destination": { - "type": "string", - "example": "九寨沟", - "description": "目的地" - }, - "disputeResolution": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "争议解决方式: 1-仲裁 2-诉讼" - }, - "groupId": { - "type": "string", - "example": "GRP20260401001", - "description": "团号" - }, - "leastCustomerNumber": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "最低成团人数" - }, - "nights": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "住宿晚数" - }, - "orderId": { - "type": "integer", - "format": "int64", - "example": 1001, - "description": "订单ID" - }, - "paymentMethod": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "付款方式: 1-现金 2-转账 3-在线" - }, - "platform": { - "type": "string", - "example": 12301, - "description": "合同平台(字典:contract_platform): 12301-全国旅游监管平台, FADADA-法大大, ESIGN-e签宝, TENCENT_ESS-腾讯电子签。不传则根据模板自动确定" - }, - "returnDate": { - "type": "string", - "format": "date", - "example": "2026-04-03", - "description": "返回日期" - }, - "routeName": { - "type": "string", - "example": "九寨沟三日游", - "description": "线路名称" - }, - "signatoryIdNumber": { - "type": "string", - "example": 110101199001011234, - "description": "签署人证件号码" - }, - "signatoryIdType": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "签署人证件类型: 1-身份证" - }, - "signatoryMode": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "签署模式: 1-短信 2-现场 3-线下" - }, - "signatoryName": { - "type": "string", - "example": "李四", - "description": "签署人姓名" - }, - "signatoryPhone": { - "type": "string", - "example": 13900139000, - "description": "签署人电话" - }, - "signingPlace": { - "type": "string", - "example": "成都市武侯区", - "description": "签约地点" - }, - "supplementaryClause": { - "type": "string", - "example": "夏季补充约定...", - "description": "补充约定内容" - }, - "templateCode": { - "type": "string", - "example": "TOURAGE_STANDARD", - "description": "模板编码" - }, - "totalAmount": { - "type": "number", - "example": 5960.0, - "description": "合同总金额" - }, - "transactorName": { - "type": "string", - "example": "张三", - "description": "经办人姓名" - }, - "transactorPhone": { - "type": "string", - "example": 13800138000, - "description": "经办人电话" - }, - "travelers": { - "type": "array", - "description": "出行人列表", - "items": { - "originalRef": "合同出行人请求", - "$ref": "#/definitions/合同出行人请求" - } - }, - "vehicleModel": { - "type": "string", - "example": "考斯特19座", - "description": "车型名称(产品快照)" - } - }, - "title": "创建合同请求" - }, - "合同信息": { - "type": "object", - "properties": { - "agencyCode": { - "type": "string", - "description": "旅行社编号" - }, - "contactName": { - "type": "string", - "description": "联系人姓名" - }, - "contactPhone": { - "type": "string", - "description": "联系人电话" - }, - "contractId": { - "type": "integer", - "format": "int64", - "description": "合同ID" - }, - "contractNumber": { - "type": "string", - "description": "合同编号" - }, - "contractType": { - "type": "string", - "description": "合同类型: TOUR-旅游合同, INSURANCE-保险单" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "departureDate": { - "type": "string", - "format": "date", - "description": "出发日期" - }, - "destination": { - "type": "string", - "description": "目的地" - }, - "fileUrl": { - "type": "string", - "description": "合同文件URL" - }, - "mode": { - "type": "string", - "description": "签约模式: STANDARD/SYNC" - }, - "orderId": { - "type": "integer", - "format": "int64", - "description": "订单ID" - }, - "platform": { - "type": "string", - "description": "签约平台" - }, - "qrCodeUrl": { - "type": "string", - "description": "二维码URL" - }, - "returnDate": { - "type": "string", - "format": "date", - "description": "返回日期" - }, - "signUrl": { - "type": "string", - "description": "签署URL" - }, - "status": { - "type": "string", - "description": "合同状态" - }, - "statusLabel": { - "type": "string", - "description": "合同状态标签" - }, - "templateCode": { - "type": "string", - "description": "模板编码" - }, - "templateName": { - "type": "string", - "description": "模板名称" - }, - "totalAmount": { - "type": "number", - "description": "合同总金额" - }, - "touristCount": { - "type": "integer", - "format": "int32", - "description": "出行人数" - }, - "travelAgencyName": { - "type": "string", - "description": "旅行社名称" - } - }, - "title": "合同信息" - }, - "合同出行人信息": { - "type": "object", - "properties": { - "idCardNo": { - "type": "string", - "description": "证件号码" - }, - "idCardType": { - "type": "string", - "description": "证件类型" - }, - "isSigner": { - "type": "boolean", - "description": "是否签署人" - }, - "name": { - "type": "string", - "description": "姓名" - }, - "phone": { - "type": "string", - "description": "手机号" - }, - "travelerId": { - "type": "integer", - "format": "int64", - "description": "出行人ID" - } - }, - "title": "合同出行人信息" - }, - "合同出行人请求": { - "type": "object", - "required": [ - "idCardNo", - "name" - ], - "properties": { - "age": { - "type": "integer", - "format": "int32", - "example": 30, - "description": "年龄" - }, - "gender": { - "type": "string", - "example": "male", - "description": "性别: male/female" - }, - "health": { - "type": "string", - "example": "健康", - "description": "健康信息" - }, - "idCardNo": { - "type": "string", - "example": 110101199001011234, - "description": "证件号码" - }, - "idCardType": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "证件类型: 1-身份证 2-护照" - }, - "isChild": { - "type": "boolean", - "example": false, - "description": "是否儿童" - }, - "isSigner": { - "type": "boolean", - "example": false, - "description": "是否签署人" - }, - "name": { - "type": "string", - "example": "王五", - "description": "姓名" - }, - "phone": { - "type": "string", - "example": 13800138000, - "description": "手机号" - } - }, - "title": "合同出行人请求" - }, - "合同模板信息": { - "type": "object", - "properties": { - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "description": { - "type": "string", - "description": "模板描述" - }, - "mode": { - "type": "string", - "description": "签约模式: STANDARD/SYNC" - }, - "platform": { - "type": "string", - "description": "签约平台" - }, - "status": { - "type": "string", - "description": "模板状态" - }, - "templateCode": { - "type": "string", - "description": "模板编码" - }, - "templateId": { - "type": "integer", - "format": "int64", - "description": "模板ID" - }, - "templateName": { - "type": "string", - "description": "模板名称" - } - }, - "title": "合同模板信息" - }, - "合同状态变更日志": { - "type": "object", - "properties": { - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "logId": { - "type": "integer", - "format": "int64", - "description": "日志ID" - }, - "newStatus": { - "type": "string", - "description": "新状态" - }, - "oldStatus": { - "type": "string", - "description": "旧状态" - }, - "source": { - "type": "string", - "description": "变更来源" - } - }, - "title": "合同状态变更日志" - }, - "合同详情": { - "type": "object", - "properties": { - "agencyCode": { - "type": "string", - "description": "旅行社编号" - }, - "contactName": { - "type": "string", - "description": "联系人姓名" - }, - "contactPhone": { - "type": "string", - "description": "联系人电话" - }, - "contractId": { - "type": "integer", - "format": "int64", - "description": "合同ID" - }, - "contractNumber": { - "type": "string", - "description": "合同编号" - }, - "contractType": { - "type": "string", - "description": "合同类型: TOUR-旅游合同, INSURANCE-保险单" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "departureDate": { - "type": "string", - "format": "date", - "description": "出发日期" - }, - "destination": { - "type": "string", - "description": "目的地" - }, - "fileUrl": { - "type": "string", - "description": "合同文件URL" - }, - "mode": { - "type": "string", - "description": "签约模式: STANDARD/SYNC" - }, - "orderId": { - "type": "integer", - "format": "int64", - "description": "订单ID" - }, - "platform": { - "type": "string", - "description": "签约平台" - }, - "qrCodeUrl": { - "type": "string", - "description": "二维码URL" - }, - "returnDate": { - "type": "string", - "format": "date", - "description": "返回日期" - }, - "signUrl": { - "type": "string", - "description": "签署URL" - }, - "status": { - "type": "string", - "description": "合同状态" - }, - "statusLabel": { - "type": "string", - "description": "合同状态标签" - }, - "statusLogs": { - "type": "array", - "description": "状态变更日志", - "items": { - "originalRef": "合同状态变更日志", - "$ref": "#/definitions/合同状态变更日志" - } - }, - "supplementaryClause": { - "type": "string", - "description": "补充约定内容" - }, - "templateCode": { - "type": "string", - "description": "模板编码" - }, - "templateName": { - "type": "string", - "description": "模板名称" - }, - "totalAmount": { - "type": "number", - "description": "合同总金额" - }, - "touristCount": { - "type": "integer", - "format": "int32", - "description": "出行人数" - }, - "travelAgencyName": { - "type": "string", - "description": "旅行社名称" - }, - "travelers": { - "type": "array", - "description": "出行人列表", - "items": { - "originalRef": "合同出行人信息", - "$ref": "#/definitions/合同出行人信息" - } - } - }, - "title": "合同详情" - }, - "报备合同请求(同步模式)": { - "type": "object", - "required": [ - "adultCost", - "contactName", - "contactPhone", - "departureDate", - "destination", - "returnDate", - "routeName", - "signatoryIdNumber", - "signatoryName", - "signatoryPhone", - "templateCode", - "totalAmount", - "travelers" - ], - "properties": { - "adultCost": { - "type": "number", - "example": 2980.0, - "description": "成人费用" - }, - "agencyCode": { - "type": "string", - "example": "L-FJ-100005", - "description": "旅行社编号" - }, - "childCost": { - "type": "number", - "example": 1490.0, - "description": "儿童费用" - }, - "contactName": { - "type": "string", - "example": "李四", - "description": "联系人姓名" - }, - "contactPhone": { - "type": "string", - "example": 13900139000, - "description": "联系人电话" - }, - "contractType": { - "type": "string", - "example": "TOUR", - "description": "合同类型: TOUR-旅游合同(默认), INSURANCE-保险单" - }, - "days": { - "type": "integer", - "format": "int32", - "example": 3, - "description": "行程天数" - }, - "departureCity": { - "type": "string", - "example": "成都", - "description": "出发城市" - }, - "departureDate": { - "type": "string", - "format": "date", - "example": "2026-04-01", - "description": "出发日期" - }, - "destination": { - "type": "string", - "example": "九寨沟", - "description": "目的地" - }, - "disputeResolution": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "争议解决方式: 1-仲裁 2-诉讼" - }, - "groupId": { - "type": "string", - "example": "GRP20260401001", - "description": "团号" - }, - "leastCustomerNumber": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "最低成团人数" - }, - "nights": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "住宿晚数" - }, - "orderId": { - "type": "integer", - "format": "int64", - "example": 1001, - "description": "订单ID" - }, - "paymentMethod": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "付款方式: 1-现金 2-转账 3-在线" - }, - "platform": { - "type": "string", - "example": 12301, - "description": "合同平台(字典:contract_platform): 12301-全国旅游监管平台, FADADA-法大大, ESIGN-e签宝, TENCENT_ESS-腾讯电子签" - }, - "returnDate": { - "type": "string", - "format": "date", - "example": "2026-04-03", - "description": "返回日期" - }, - "routeName": { - "type": "string", - "example": "九寨沟三日游", - "description": "线路名称" - }, - "signatoryIdNumber": { - "type": "string", - "example": 110101199001011234, - "description": "签署人证件号码" - }, - "signatoryIdType": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "签署人证件类型: 1-身份证" - }, - "signatoryMode": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "签署模式(同步模式默认2-现场)" - }, - "signatoryName": { - "type": "string", - "example": "李四", - "description": "签署人姓名" - }, - "signatoryPhone": { - "type": "string", - "example": 13900139000, - "description": "签署人电话" - }, - "signingPlace": { - "type": "string", - "example": "成都市武侯区", - "description": "签约地点" - }, - "supplementaryClause": { - "type": "string", - "example": "冬季补充约定...", - "description": "补充约定内容" - }, - "templateCode": { - "type": "string", - "example": "TOURAGE_SYNC", - "description": "模板编码" - }, - "totalAmount": { - "type": "number", - "example": 5960.0, - "description": "合同总金额" - }, - "transactorName": { - "type": "string", - "example": "张三", - "description": "经办人姓名" - }, - "transactorPhone": { - "type": "string", - "example": 13800138000, - "description": "经办人电话" - }, - "travelers": { - "type": "array", - "description": "出行人列表", - "items": { - "originalRef": "合同出行人请求", - "$ref": "#/definitions/合同出行人请求" - } - } - }, - "title": "报备合同请求(同步模式)" - }, - "旅行社信息": { - "type": "object", - "properties": { - "agencyAddress": { - "type": "string", - "description": "旅行社地址" - }, - "agencyName": { - "type": "string", - "example": "呼籁旅行社", - "description": "旅行社名称" - }, - "businessLicenseNumber": { - "type": "string", - "description": "营业执照号" - }, - "businessScope": { - "type": "string", - "example": "国内旅游", - "description": "经营范围" - }, - "code": { - "type": "string", - "example": "hulai", - "description": "旅行社编码" - }, - "licenseNumber": { - "type": "string", - "example": "L-FJ-100005", - "description": "旅行社许可证号" - }, - "regionId": { - "type": "string", - "example": 350200, - "description": "地区ID" - }, - "transactorName": { - "type": "string", - "example": "张三", - "description": "经办人姓名" - }, - "transactorPhone": { - "type": "string", - "example": 13800138000, - "description": "经办人电话" - }, - "zjParentId": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "属地管理机构ID" - } - }, - "title": "旅行社信息" - }, - "统一响应结果«List«ContractPlatformInfo»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "ContractPlatformInfo", - "$ref": "#/definitions/ContractPlatformInfo" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«ContractPlatformInfo»»" - }, - "统一响应结果«List«合同信息»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "合同信息", - "$ref": "#/definitions/合同信息" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«合同信息»»" - }, - "统一响应结果«List«合同模板信息»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "合同模板信息", - "$ref": "#/definitions/合同模板信息" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«合同模板信息»»" - }, - "统一响应结果«List«旅行社信息»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "旅行社信息", - "$ref": "#/definitions/旅行社信息" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«旅行社信息»»" - }, - "统一响应结果«List«补充约定模板»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "补充约定模板", - "$ref": "#/definitions/补充约定模板" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«补充约定模板»»" - }, - "统一响应结果«Void»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Void»" - }, - "统一响应结果«boolean»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "boolean", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«boolean»" - }, - "统一响应结果«分页结果«合同信息»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分页结果«合同信息»", - "$ref": "#/definitions/分页结果«合同信息»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«合同信息»»" - }, - "统一响应结果«合同信息»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "合同信息", - "$ref": "#/definitions/合同信息" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«合同信息»" - }, - "统一响应结果«合同详情»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "合同详情", - "$ref": "#/definitions/合同详情" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«合同详情»" - }, - "统一响应结果«补充约定模板»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "补充约定模板", - "$ref": "#/definitions/补充约定模板" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«补充约定模板»" - }, - "补充约定模板": { - "type": "object", - "properties": { - "content": { - "type": "string", - "description": "模板内容" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "name": { - "type": "string", - "description": "模板名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序" - }, - "status": { - "type": "string", - "description": "状态: ACTIVE/INACTIVE" - }, - "templateId": { - "type": "integer", - "format": "int64", - "description": "模板ID" - } - }, - "title": "补充约定模板" - }, - "补充约定模板请求": { - "type": "object", - "required": [ - "content", - "name" - ], - "properties": { - "content": { - "type": "string", - "example": "夏季补充约定...", - "description": "模板内容" - }, - "name": { - "type": "string", - "example": "夏季小团", - "description": "模板名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序(升序)" - } - }, - "title": "补充约定模板请求" - } - } -} \ No newline at end of file diff --git a/.swagger/hl-file-service.json b/.swagger/hl-file-service.json deleted file mode 100644 index d1cf7c5..0000000 --- a/.swagger/hl-file-service.json +++ /dev/null @@ -1,1145 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "文件服务", - "version": "1.0.0" - }, - "basePath": "/", - "paths": { - "/admin/file/list": { - "get": { - "tags": [ - "文件管理" - ], - "summary": "文件列表(分页)", - "description": "支持按文件类型、分组、上传者等条件筛选,按上传时间倒序分页返回\n\n**关联字典**:\n- file_type:文件类型(列表筛选+显示)\n- file_status:文件状态(显示)", - "operationId": "listFilesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "endDate", - "in": "query", - "description": "结束日期", - "required": false, - "type": "string", - "x-example": "2026-12-31" - }, - { - "name": "fileType", - "in": "query", - "description": "文件类型", - "required": false, - "type": "string", - "x-example": "image" - }, - { - "name": "groupKey", - "in": "query", - "description": "业务分组", - "required": false, - "type": "string", - "x-example": "scenic" - }, - { - "name": "keyword", - "in": "query", - "description": "搜索关键词", - "required": false, - "type": "string", - "x-example": "风景" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 20 - }, - { - "name": "startDate", - "in": "query", - "description": "开始日期", - "required": false, - "type": "string", - "x-example": "2026-01-01" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«IPage«文件信息»»", - "$ref": "#/definitions/统一响应结果«IPage«文件信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«IPage«文件信息»»", - "$ref": "#/definitions/统一响应结果«IPage«文件信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/file/stats": { - "get": { - "tags": [ - "文件管理" - ], - "summary": "存储统计", - "description": "返回文件总数、总存储空间、各类型文件占比等统计信息", - "operationId": "getStatsUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«文件统计信息»", - "$ref": "#/definitions/统一响应结果«文件统计信息»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«文件统计信息»", - "$ref": "#/definitions/统一响应结果«文件统计信息»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/file/upload/confirm": { - "post": { - "tags": [ - "文件管理" - ], - "summary": "确认上传完成", - "description": "上传流程第二步:前端直传OSS完成后调用此接口,系统验证文件存在性并创建文件记录。支持MD5去重,相同文件不会重复存储", - "operationId": "confirmUploadUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "确认上传请求", - "required": false, - "schema": { - "originalRef": "上传确认请求", - "$ref": "#/definitions/上传确认请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«文件信息»", - "$ref": "#/definitions/统一响应结果«文件信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«文件信息»", - "$ref": "#/definitions/统一响应结果«文件信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/file/upload/token": { - "post": { - "tags": [ - "文件管理" - ], - "summary": "请求上传凭证", - "description": "上传流程第一步:前端请求上传凭证 → 获取OSS预签名URL和临时凭证 → 前端直传OSS → 调用确认上传接口。凭证有效期有限,过期需重新请求", - "operationId": "requestUploadTokenUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "上传凭证请求", - "required": false, - "schema": { - "originalRef": "上传令牌请求", - "$ref": "#/definitions/上传令牌请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«上传令牌信息»", - "$ref": "#/definitions/统一响应结果«上传令牌信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«上传令牌信息»", - "$ref": "#/definitions/统一响应结果«上传令牌信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/file/{fileId}": { - "get": { - "tags": [ - "文件管理" - ], - "summary": "文件详情", - "description": "**关联字典**:\n- file_type:文件类型(显示)\n- file_status:文件状态(显示)", - "operationId": "getFileDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "fileId", - "in": "path", - "description": "文件ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«文件信息»", - "$ref": "#/definitions/统一响应结果«文件信息»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«文件信息»", - "$ref": "#/definitions/统一响应结果«文件信息»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "文件管理" - ], - "summary": "删除文件", - "description": "软删除文件记录,如果文件存在引用关系则不允许删除。OSS上的物理文件由定时任务清理", - "operationId": "deleteFileUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "fileId", - "in": "path", - "description": "文件ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/file/{fileId}/preview": { - "get": { - "tags": [ - "文件管理" - ], - "summary": "文件内容流式预览", - "description": "流式输出文件内容,设置正确的Content-Type头,支持浏览器直接预览图片和PDF等文件", - "operationId": "previewContentUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "fileId", - "in": "path", - "description": "文件ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/file/{fileId}/refs": { - "get": { - "tags": [ - "文件管理" - ], - "summary": "文件引用列表", - "description": "查看文件被哪些业务实体引用(如景区封面、酒店图片等),用于判断文件是否可安全删除", - "operationId": "getFileRefsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "fileId", - "in": "path", - "description": "文件ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«文件引用信息»»", - "$ref": "#/definitions/统一响应结果«List«文件引用信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«文件引用信息»»", - "$ref": "#/definitions/统一响应结果«List«文件引用信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/file/preview-by-url": { - "get": { - "tags": [ - "C端文件上传" - ], - "summary": "文件在线预览", - "description": "返回HTML预览页面,小程序通过web-view打开。支持PDF、图片、Office文档", - "operationId": "previewByUrlUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "url", - "in": "query", - "description": "文件完整URL", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/file/upload": { - "post": { - "tags": [ - "C端文件上传" - ], - "summary": "上传文件(C端用户)", - "description": "小程序端直接上传文件,支持头像、评价图片等场景。groupKey决定存储路径和文件策略,默认为avatar", - "operationId": "uploadUsingPOST", - "consumes": [ - "multipart/form-data" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "file", - "in": "formData", - "description": "上传文件", - "required": false, - "type": "file" - }, - { - "name": "groupKey", - "in": "query", - "description": "文件分组标识", - "required": false, - "type": "string", - "default": "avatar", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«文件信息»", - "$ref": "#/definitions/统一响应结果«文件信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«文件信息»", - "$ref": "#/definitions/统一响应结果«文件信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/file/{fileId}/preview": { - "get": { - "tags": [ - "C端文件上传" - ], - "summary": "文件内容流式预览", - "description": "流式输出文件内容,设置正确的Content-Type头。用于小程序端通过web-view直接预览图片和PDF等文件。", - "operationId": "previewContentUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "fileId", - "in": "path", - "description": "文件ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - } - }, - "definitions": { - "IPage«文件信息»": { - "type": "object", - "properties": { - "current": { - "type": "integer", - "format": "int64" - }, - "pages": { - "type": "integer", - "format": "int64" - }, - "records": { - "type": "array", - "items": { - "originalRef": "文件信息", - "$ref": "#/definitions/文件信息" - } - }, - "size": { - "type": "integer", - "format": "int64" - }, - "total": { - "type": "integer", - "format": "int64" - } - }, - "title": "IPage«文件信息»" - }, - "STS临时凭证信息": { - "type": "object", - "properties": { - "accessKeyId": { - "type": "string", - "description": "AccessKey ID" - }, - "accessKeySecret": { - "type": "string", - "description": "AccessKey Secret" - }, - "expiration": { - "type": "string", - "description": "过期时间" - }, - "securityToken": { - "type": "string", - "description": "安全令牌" - } - }, - "title": "STS临时凭证信息" - }, - "上传令牌信息": { - "type": "object", - "properties": { - "bucket": { - "type": "string", - "description": "OSS Bucket名称" - }, - "contentType": { - "type": "string", - "description": "上传时必须使用的Content-Type(与预签名URL签名一致)" - }, - "expireAt": { - "type": "string", - "format": "date-time", - "description": "过期时间" - }, - "file": { - "description": "秒传文件信息", - "originalRef": "文件信息", - "$ref": "#/definitions/文件信息" - }, - "fileId": { - "type": "string", - "description": "文件ID" - }, - "ossKey": { - "type": "string", - "description": "OSS对象Key" - }, - "presignedUrl": { - "type": "string", - "description": "预签名上传URL" - }, - "region": { - "type": "string", - "description": "OSS Region" - }, - "stsToken": { - "description": "STS临时凭证", - "originalRef": "STS临时凭证信息", - "$ref": "#/definitions/STS临时凭证信息" - }, - "uploadMode": { - "type": "string", - "description": "上传模式: PRESIGNED_URL/STS_MULTIPART/INSTANT" - } - }, - "title": "上传令牌信息" - }, - "上传令牌请求": { - "type": "object", - "required": [ - "fileHash", - "fileName", - "fileSize" - ], - "properties": { - "fileHash": { - "type": "string", - "example": "d41d8cd98f00b204e9800998ecf8427e", - "description": "文件MD5哈希" - }, - "fileName": { - "type": "string", - "example": "photo.jpg", - "description": "文件名" - }, - "fileSize": { - "type": "integer", - "format": "int64", - "example": 1048576, - "description": "文件大小(字节)" - }, - "forcePresigned": { - "type": "boolean", - "example": false, - "description": "强制使用预签名URL(跳过STS分片模式)" - }, - "groupKey": { - "type": "string", - "example": "scenic", - "description": "业务分组" - } - }, - "title": "上传令牌请求" - }, - "上传确认请求": { - "type": "object", - "required": [ - "fileId" - ], - "properties": { - "fileId": { - "type": "string", - "example": 1234567890, - "description": "文件ID" - } - }, - "title": "上传确认请求" - }, - "文件信息": { - "type": "object", - "properties": { - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "fileHash": { - "type": "string", - "description": "文件MD5哈希" - }, - "fileId": { - "type": "string", - "description": "文件ID" - }, - "fileName": { - "type": "string", - "description": "文件名" - }, - "fileSize": { - "type": "integer", - "format": "int64", - "description": "文件大小(字节)" - }, - "fileType": { - "type": "string", - "description": "文件类型" - }, - "groupKey": { - "type": "string", - "description": "业务分组" - }, - "mimeType": { - "type": "string", - "description": "MIME类型" - }, - "ossUrl": { - "type": "string", - "description": "OSS地址" - }, - "previewUrl": { - "type": "string", - "description": "预览地址" - }, - "refCount": { - "type": "integer", - "format": "int32", - "description": "引用次数" - }, - "status": { - "type": "string", - "description": "文件状态" - }, - "thumbnailUrl": { - "type": "string", - "description": "缩略图地址" - } - }, - "title": "文件信息" - }, - "文件引用信息": { - "type": "object", - "properties": { - "bizId": { - "type": "string", - "description": "业务ID" - }, - "bizType": { - "type": "string", - "description": "业务类型" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "fileId": { - "type": "string", - "description": "文件ID" - }, - "refId": { - "type": "string", - "description": "引用ID" - } - }, - "title": "文件引用信息" - }, - "文件统计信息": { - "type": "object", - "properties": { - "countByGroup": { - "type": "object", - "description": "按分组统计文件数量", - "additionalProperties": { - "type": "integer", - "format": "int64" - } - }, - "countByType": { - "type": "object", - "description": "按类型统计文件数量", - "additionalProperties": { - "type": "integer", - "format": "int64" - } - }, - "sizeByType": { - "type": "object", - "description": "按类型统计文件大小", - "additionalProperties": { - "type": "integer", - "format": "int64" - } - }, - "totalCount": { - "type": "integer", - "format": "int64", - "description": "文件总数" - }, - "totalSize": { - "type": "integer", - "format": "int64", - "description": "文件总大小(字节)" - } - }, - "title": "文件统计信息" - }, - "统一响应结果«IPage«文件信息»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "IPage«文件信息»", - "$ref": "#/definitions/IPage«文件信息»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«IPage«文件信息»»" - }, - "统一响应结果«List«文件引用信息»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "文件引用信息", - "$ref": "#/definitions/文件引用信息" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«文件引用信息»»" - }, - "统一响应结果«Void»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Void»" - }, - "统一响应结果«上传令牌信息»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "上传令牌信息", - "$ref": "#/definitions/上传令牌信息" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«上传令牌信息»" - }, - "统一响应结果«文件信息»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "文件信息", - "$ref": "#/definitions/文件信息" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«文件信息»" - }, - "统一响应结果«文件统计信息»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "文件统计信息", - "$ref": "#/definitions/文件统计信息" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«文件统计信息»" - } - } -} \ No newline at end of file diff --git a/.swagger/hl-guide-service.json b/.swagger/hl-guide-service.json deleted file mode 100644 index 72deeed..0000000 --- a/.swagger/hl-guide-service.json +++ /dev/null @@ -1,2364 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "攻略服务", - "version": "1.0.0" - }, - "basePath": "/", - "paths": { - "/admin/guide/category": { - "post": { - "tags": [ - "攻略分类管理" - ], - "summary": "创建分类", - "description": "创建攻略分类,分类名称不可重复。创建后默认启用,排序值越小越靠前。\n\n**权限**:需管理员登录。", - "operationId": "createCategoryUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/CategoryCreateRequest", - "originalRef": "CategoryCreateRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«攻略分类»", - "originalRef": "统一响应结果«攻略分类»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«攻略分类»", - "originalRef": "统一响应结果«攻略分类»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/guide/category/enabled": { - "get": { - "tags": [ - "攻略分类管理" - ], - "summary": "启用的分类列表", - "description": "仅返回状态为启用的分类,创建文章时用于选择分类", - "operationId": "listEnabledCategoriesUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«攻略分类»»", - "originalRef": "统一响应结果«List«攻略分类»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«攻略分类»»", - "originalRef": "统一响应结果«List«攻略分类»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/guide/category/list": { - "get": { - "tags": [ - "攻略分类管理" - ], - "summary": "分类列表", - "description": "返回全部攻略分类(含启用和停用),按排序值升序排列\n\n**关联字典**:\n- common_status:通用状态(列表显示,ACTIVE=启用/INACTIVE=停用)", - "operationId": "listCategoriesUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«攻略分类»»", - "originalRef": "统一响应结果«List«攻略分类»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«攻略分类»»", - "originalRef": "统一响应结果«List«攻略分类»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/guide/category/{categoryId}": { - "put": { - "tags": [ - "攻略分类管理" - ], - "summary": "更新分类", - "description": "更新攻略分类的名称、图标、描述等信息。\n\n**权限**:需管理员登录。", - "operationId": "updateCategoryUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "categoryId", - "in": "path", - "description": "categoryId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/CategoryUpdateRequest", - "originalRef": "CategoryUpdateRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«攻略分类»", - "originalRef": "统一响应结果«攻略分类»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«攻略分类»", - "originalRef": "统一响应结果«攻略分类»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "攻略分类管理" - ], - "summary": "删除分类", - "description": "删除分类前需确保分类下无文章,否则删除失败", - "operationId": "deleteCategoryUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "categoryId", - "in": "path", - "description": "categoryId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/guide/category/{categoryId}/sort": { - "put": { - "tags": [ - "攻略分类管理" - ], - "summary": "更新分类排序", - "description": "更新分类的排序值,排序值越小越靠前。影响小程序端分类导航的展示顺序。\n\n**权限**:需管理员登录。", - "operationId": "updateSortUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "categoryId", - "in": "path", - "description": "categoryId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/CategorySortRequest", - "originalRef": "CategorySortRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/guide/category/{categoryId}/status": { - "put": { - "tags": [ - "攻略分类管理" - ], - "summary": "更新分类状态", - "description": "启用或停用分类。停用后该分类下的文章不会在小程序端展示,但不影响已有文章\n\n**关联字典**:\n- common_status:通用状态(状态切换,ACTIVE=启用/INACTIVE=停用)", - "operationId": "updateStatusUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "categoryId", - "in": "path", - "description": "categoryId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/StatusRequest", - "originalRef": "StatusRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/guide/article": { - "post": { - "tags": [ - "攻略文章管理" - ], - "summary": "创建文章", - "description": "创建攻略文章,需指定分类。创建后默认为草稿状态,需手动发布后小程序端才可见。\n\n**权限**:需管理员登录。\n\n**关联字典**:\n- wiki_status:文章状态(创建后默认DRAFT)", - "operationId": "createArticleUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/ArticleCreateRequest", - "originalRef": "ArticleCreateRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«攻略文章详情»", - "originalRef": "统一响应结果«攻略文章详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«攻略文章详情»", - "originalRef": "统一响应结果«攻略文章详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/guide/article/list": { - "get": { - "tags": [ - "攻略文章管理" - ], - "summary": "文章列表", - "description": "分页查询攻略文章,支持按分类、状态、关键词筛选\n\n**关联字典**:\n- wiki_status:文章状态(列表筛选+显示)", - "operationId": "listArticlesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "categoryId", - "in": "query", - "description": "分类ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "isRecommend", - "in": "query", - "description": "是否推荐:0=否,1=是", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "isTop", - "in": "query", - "description": "是否置顶:0=否,1=是", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "keyword", - "in": "query", - "description": "关键词(搜索标题/摘要)", - "required": false, - "type": "string" - }, - { - "name": "orderBy", - "in": "query", - "description": "排序字段:sortOrder/publishTime/viewCount/createdAt(默认createdAt)", - "required": false, - "type": "string" - }, - { - "name": "orderDir", - "in": "query", - "description": "排序方向:asc/desc(默认desc)", - "required": false, - "type": "string" - }, - { - "name": "page", - "in": "query", - "description": "页码(默认1)", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "pageSize", - "in": "query", - "description": "每页数量(默认20,最大100)", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "status", - "in": "query", - "description": "状态:0=草稿,1=已发布,2=已下架", - "required": false, - "type": "integer", - "format": "int32" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«攻略文章列表项»»", - "originalRef": "统一响应结果«分页结果«攻略文章列表项»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«攻略文章列表项»»", - "originalRef": "统一响应结果«分页结果«攻略文章列表项»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/guide/article/{articleId}": { - "get": { - "tags": [ - "攻略文章管理" - ], - "summary": "文章详情", - "description": "**关联字典**:\n- wiki_status:文章状态(显示)", - "operationId": "getArticleUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "articleId", - "in": "path", - "description": "articleId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«攻略文章详情»", - "originalRef": "统一响应结果«攻略文章详情»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«攻略文章详情»", - "originalRef": "统一响应结果«攻略文章详情»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "攻略文章管理" - ], - "summary": "更新文章", - "description": "更新攻略文章的标题、内容、封面图、分类等信息。已发布的文章更新后立即生效。\n\n**权限**:需管理员登录。", - "operationId": "updateArticleUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "articleId", - "in": "path", - "description": "articleId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/ArticleUpdateRequest", - "originalRef": "ArticleUpdateRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«攻略文章详情»", - "originalRef": "统一响应结果«攻略文章详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«攻略文章详情»", - "originalRef": "统一响应结果«攻略文章详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "攻略文章管理" - ], - "summary": "删除文章", - "description": "软删除攻略文章,同时清除文章的标签关联。\n\n**权限**:需管理员登录。", - "operationId": "deleteArticleUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "articleId", - "in": "path", - "description": "articleId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/guide/article/{articleId}/recommend": { - "put": { - "tags": [ - "攻略文章管理" - ], - "summary": "设置推荐", - "description": "设置/取消文章推荐。推荐文章会在小程序首页和推荐列表中优先展示", - "operationId": "updateRecommendUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "articleId", - "in": "path", - "description": "articleId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/RecommendRequest", - "originalRef": "RecommendRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/guide/article/{articleId}/status": { - "put": { - "tags": [ - "攻略文章管理" - ], - "summary": "发布/下架", - "description": "切换文章发布状态。发布后小程序端可见,下架后小程序端不再展示但管理端仍可查看\n\n**关联字典**:\n- wiki_status:文章状态(状态切换)", - "operationId": "updateStatusUsingPUT_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "articleId", - "in": "path", - "description": "articleId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/StatusRequest", - "originalRef": "StatusRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/guide/article/{articleId}/top": { - "put": { - "tags": [ - "攻略文章管理" - ], - "summary": "设置置顶", - "description": "设置/取消文章置顶。置顶文章在分类列表中始终排在最前面", - "operationId": "updateTopUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "articleId", - "in": "path", - "description": "articleId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/TopRequest", - "originalRef": "TopRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/guide/tag": { - "post": { - "tags": [ - "攻略标签管理" - ], - "summary": "创建标签", - "description": "创建攻略系统标签,标签名称不可重复。创建后可用于文章分类和筛选。\n\n**权限**:需管理员登录。", - "operationId": "createTagUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/TagCreateRequest", - "originalRef": "TagCreateRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«攻略标签»", - "originalRef": "统一响应结果«攻略标签»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«攻略标签»", - "originalRef": "统一响应结果«攻略标签»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/guide/tag/all": { - "get": { - "tags": [ - "攻略标签管理" - ], - "summary": "所有标签列表", - "description": "返回全部标签(含系统标签和用户自定义标签),用于文章编辑时的标签选择器", - "operationId": "listAllTagsUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«攻略标签»»", - "originalRef": "统一响应结果«List«攻略标签»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«攻略标签»»", - "originalRef": "统一响应结果«List«攻略标签»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/guide/tag/article/{articleId}": { - "put": { - "tags": [ - "攻略标签管理" - ], - "summary": "更新文章标签", - "description": "全量替换文章的标签关联,传入新的标签ID列表(空数组表示清除所有标签)", - "operationId": "updateArticleTagsUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "articleId", - "in": "path", - "description": "articleId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/ArticleTagUpdateRequest", - "originalRef": "ArticleTagUpdateRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/guide/tag/managed": { - "get": { - "tags": [ - "攻略标签管理" - ], - "summary": "系统标签列表", - "description": "返回管理员创建的系统标签(不含用户自定义标签),用于标签管理页", - "operationId": "listManagedTagsUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«攻略标签»»", - "originalRef": "统一响应结果«List«攻略标签»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«攻略标签»»", - "originalRef": "统一响应结果«List«攻略标签»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/guide/tag/{tagId}": { - "put": { - "tags": [ - "攻略标签管理" - ], - "summary": "更新标签", - "description": "更新标签名称。标签名称不可与其他已有标签重复。\n\n**权限**:需管理员登录。", - "operationId": "updateTagUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/TagUpdateRequest", - "originalRef": "TagUpdateRequest" - } - }, - { - "name": "tagId", - "in": "path", - "description": "tagId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«攻略标签»", - "originalRef": "统一响应结果«攻略标签»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«攻略标签»", - "originalRef": "统一响应结果«攻略标签»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "攻略标签管理" - ], - "summary": "删除标签", - "description": "删除标签并自动解除与所有文章的关联关系。\n\n**权限**:需管理员登录。", - "operationId": "deleteTagUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "tagId", - "in": "path", - "description": "tagId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - } - }, - "definitions": { - "CategoryCreateRequest": { - "type": "object", - "required": [ - "categoryName" - ], - "properties": { - "categoryName": { - "type": "string", - "description": "分类名称" - }, - "coverMaterialId": { - "type": "integer", - "format": "int64", - "description": "封面素材ID" - }, - "coverUrl": { - "type": "string", - "description": "封面URL" - }, - "description": { - "type": "string", - "description": "描述" - }, - "icon": { - "type": "string", - "description": "图标" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序(默认0)" - } - }, - "title": "CategoryCreateRequest" - }, - "CategorySortRequest": { - "type": "object", - "required": [ - "sortOrder" - ], - "properties": { - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序值" - } - }, - "title": "CategorySortRequest" - }, - "CategoryUpdateRequest": { - "type": "object", - "properties": { - "categoryName": { - "type": "string", - "description": "分类名称" - }, - "coverMaterialId": { - "type": "integer", - "format": "int64", - "description": "封面素材ID" - }, - "coverUrl": { - "type": "string", - "description": "封面URL" - }, - "description": { - "type": "string", - "description": "描述" - }, - "icon": { - "type": "string", - "description": "图标" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序" - } - }, - "title": "CategoryUpdateRequest" - }, - "StatusRequest": { - "type": "object", - "required": [ - "status" - ], - "properties": { - "status": { - "type": "integer", - "format": "int32", - "description": "状态值" - } - }, - "title": "StatusRequest" - }, - "攻略分类": { - "type": "object", - "properties": { - "articleCount": { - "type": "integer", - "format": "int32", - "description": "文章数量" - }, - "categoryId": { - "type": "integer", - "format": "int64", - "description": "分类ID" - }, - "categoryName": { - "type": "string", - "description": "分类名称" - }, - "coverMaterialId": { - "type": "integer", - "format": "int64", - "description": "封面素材ID" - }, - "coverUrl": { - "type": "string", - "description": "封面URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "description": { - "type": "string", - "description": "描述" - }, - "icon": { - "type": "string", - "description": "图标" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=禁用,1=启用" - } - }, - "title": "攻略分类" - }, - "统一响应结果«List«攻略分类»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/攻略分类", - "originalRef": "攻略分类" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«攻略分类»»" - }, - "统一响应结果«Void»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Void»" - }, - "统一响应结果«攻略分类»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/攻略分类", - "originalRef": "攻略分类" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«攻略分类»" - }, - "ArticleCreateRequest": { - "type": "object", - "required": [ - "categoryId", - "title" - ], - "properties": { - "authorName": { - "type": "string", - "description": "作者名称" - }, - "bannerMaterialIds": { - "type": "array", - "description": "轮播图素材ID列表", - "items": { - "type": "integer", - "format": "int64" - } - }, - "categoryId": { - "type": "integer", - "format": "int64", - "description": "分类ID" - }, - "content": { - "type": "string", - "description": "正文内容" - }, - "coverMaterialId": { - "type": "integer", - "format": "int64", - "description": "封面素材ID" - }, - "coverUrl": { - "type": "string", - "description": "封面URL" - }, - "resources": { - "type": "array", - "description": "关联资源列表", - "items": { - "$ref": "#/definitions/ArticleResourceItem", - "originalRef": "ArticleResourceItem" - } - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序(默认0)" - }, - "source": { - "type": "string", - "description": "来源" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "summary": { - "type": "string", - "description": "摘要" - }, - "tagIds": { - "type": "array", - "description": "标签ID列表", - "items": { - "type": "integer", - "format": "int64" - } - }, - "title": { - "type": "string", - "description": "标题" - } - }, - "title": "ArticleCreateRequest" - }, - "ArticleResourceItem": { - "type": "object", - "required": [ - "resourceId", - "resourceName", - "resourceType" - ], - "properties": { - "resourceId": { - "type": "integer", - "format": "int64", - "description": "资源ID" - }, - "resourceName": { - "type": "string", - "description": "资源名称" - }, - "resourceType": { - "type": "string", - "description": "资源类型:SCENIC/RESTAURANT/HOTEL/ACTIVITY/PRODUCT" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序" - } - }, - "title": "ArticleResourceItem" - }, - "ArticleUpdateRequest": { - "type": "object", - "properties": { - "authorName": { - "type": "string", - "description": "作者名称" - }, - "bannerMaterialIds": { - "type": "array", - "description": "轮播图素材ID列表", - "items": { - "type": "integer", - "format": "int64" - } - }, - "categoryId": { - "type": "integer", - "format": "int64", - "description": "分类ID" - }, - "content": { - "type": "string", - "description": "正文内容" - }, - "coverMaterialId": { - "type": "integer", - "format": "int64", - "description": "封面素材ID" - }, - "coverUrl": { - "type": "string", - "description": "封面URL" - }, - "resources": { - "type": "array", - "description": "关联资源列表", - "items": { - "$ref": "#/definitions/ArticleResourceItem", - "originalRef": "ArticleResourceItem" - } - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序" - }, - "source": { - "type": "string", - "description": "来源" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "summary": { - "type": "string", - "description": "摘要" - }, - "tagIds": { - "type": "array", - "description": "标签ID列表", - "items": { - "type": "integer", - "format": "int64" - } - }, - "title": { - "type": "string", - "description": "标题" - } - }, - "title": "ArticleUpdateRequest" - }, - "RecommendRequest": { - "type": "object", - "required": [ - "isRecommend" - ], - "properties": { - "isRecommend": { - "type": "integer", - "format": "int32", - "description": "是否推荐:0=否,1=是" - } - }, - "title": "RecommendRequest" - }, - "TopRequest": { - "type": "object", - "required": [ - "isTop" - ], - "properties": { - "isTop": { - "type": "integer", - "format": "int32", - "description": "是否置顶:0=否,1=是" - } - }, - "title": "TopRequest" - }, - "分页结果«攻略文章列表项»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/攻略文章列表项", - "originalRef": "攻略文章列表项" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«攻略文章列表项»" - }, - "攻略文章列表项": { - "type": "object", - "properties": { - "articleId": { - "type": "integer", - "format": "int64", - "description": "文章ID" - }, - "categoryId": { - "type": "integer", - "format": "int64", - "description": "分类ID" - }, - "categoryName": { - "type": "string", - "description": "分类名称" - }, - "coverUrl": { - "type": "string", - "description": "封面URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "isRecommend": { - "type": "integer", - "format": "int32", - "description": "是否推荐:0=否,1=是" - }, - "isTop": { - "type": "integer", - "format": "int32", - "description": "是否置顶:0=否,1=是" - }, - "publishTime": { - "type": "string", - "format": "date-time", - "description": "发布时间" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=草稿,1=已发布,2=已下架" - }, - "summary": { - "type": "string", - "description": "摘要" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "$ref": "#/definitions/攻略标签", - "originalRef": "攻略标签" - } - }, - "title": { - "type": "string", - "description": "标题" - }, - "viewCount": { - "type": "integer", - "format": "int32", - "description": "浏览量" - } - }, - "title": "攻略文章列表项" - }, - "攻略文章详情": { - "type": "object", - "properties": { - "articleId": { - "type": "integer", - "format": "int64", - "description": "文章ID" - }, - "authorName": { - "type": "string", - "description": "作者名称" - }, - "bannerMaterialIds": { - "type": "array", - "description": "轮播图素材ID列表", - "items": { - "type": "integer", - "format": "int64" - } - }, - "categoryId": { - "type": "integer", - "format": "int64", - "description": "分类ID" - }, - "categoryName": { - "type": "string", - "description": "分类名称" - }, - "content": { - "type": "string", - "description": "正文内容" - }, - "coverMaterialId": { - "type": "integer", - "format": "int64", - "description": "封面素材ID" - }, - "coverUrl": { - "type": "string", - "description": "封面URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "favoriteCount": { - "type": "integer", - "format": "int32", - "description": "收藏数" - }, - "isRecommend": { - "type": "integer", - "format": "int32", - "description": "是否推荐:0=否,1=是" - }, - "isTop": { - "type": "integer", - "format": "int32", - "description": "是否置顶:0=否,1=是" - }, - "likeCount": { - "type": "integer", - "format": "int32", - "description": "点赞数" - }, - "publishTime": { - "type": "string", - "format": "date-time", - "description": "发布时间" - }, - "resources": { - "type": "array", - "description": "关联资源列表", - "items": { - "$ref": "#/definitions/文章关联资源", - "originalRef": "文章关联资源" - } - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序" - }, - "source": { - "type": "string", - "description": "来源" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=草稿,1=已发布,2=已下架" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "summary": { - "type": "string", - "description": "摘要" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "$ref": "#/definitions/攻略标签", - "originalRef": "攻略标签" - } - }, - "title": { - "type": "string", - "description": "标题" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "viewCount": { - "type": "integer", - "format": "int32", - "description": "浏览量" - } - }, - "title": "攻略文章详情" - }, - "攻略标签": { - "type": "object", - "properties": { - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "tagColor": { - "type": "string", - "description": "标签颜色" - }, - "tagId": { - "type": "integer", - "format": "int64", - "description": "标签ID" - }, - "tagName": { - "type": "string", - "description": "标签名称" - }, - "tagType": { - "type": "integer", - "format": "int32", - "description": "标签类型:0=系统管理,1=自定义" - }, - "useCount": { - "type": "integer", - "format": "int32", - "description": "使用次数" - } - }, - "title": "攻略标签" - }, - "文章关联资源": { - "type": "object", - "properties": { - "resourceId": { - "type": "integer", - "format": "int64", - "description": "资源ID" - }, - "resourceName": { - "type": "string", - "description": "资源名称" - }, - "resourceType": { - "type": "string", - "description": "资源类型:SCENIC/RESTAURANT/HOTEL/ACTIVITY/PRODUCT" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序" - } - }, - "title": "文章关联资源" - }, - "统一响应结果«分页结果«攻略文章列表项»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«攻略文章列表项»", - "originalRef": "分页结果«攻略文章列表项»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«攻略文章列表项»»" - }, - "统一响应结果«攻略文章详情»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/攻略文章详情", - "originalRef": "攻略文章详情" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«攻略文章详情»" - }, - "ArticleTagUpdateRequest": { - "type": "object", - "required": [ - "tagIds" - ], - "properties": { - "tagIds": { - "type": "array", - "description": "标签ID列表", - "items": { - "type": "integer", - "format": "int64" - } - } - }, - "title": "ArticleTagUpdateRequest" - }, - "TagCreateRequest": { - "type": "object", - "required": [ - "tagName" - ], - "properties": { - "tagColor": { - "type": "string", - "description": "标签颜色(十六进制)" - }, - "tagName": { - "type": "string", - "description": "标签名称" - }, - "tagType": { - "type": "integer", - "format": "int32", - "description": "标签类型:0=系统管理,1=自定义(默认0)" - } - }, - "title": "TagCreateRequest" - }, - "TagUpdateRequest": { - "type": "object", - "properties": { - "tagColor": { - "type": "string", - "description": "标签颜色(十六进制)" - }, - "tagName": { - "type": "string", - "description": "标签名称" - } - }, - "title": "TagUpdateRequest" - }, - "统一响应结果«List«攻略标签»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/攻略标签", - "originalRef": "攻略标签" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«攻略标签»»" - }, - "统一响应结果«攻略标签»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/攻略标签", - "originalRef": "攻略标签" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«攻略标签»" - } - } -} \ No newline at end of file diff --git a/.swagger/hl-insurance-service.json b/.swagger/hl-insurance-service.json deleted file mode 100644 index 64efb70..0000000 --- a/.swagger/hl-insurance-service.json +++ /dev/null @@ -1,3168 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "保险服务", - "version": "1.0.0" - }, - "basePath": "/", - "paths": { - "/admin/insurance/balance": { - "get": { - "tags": [ - "保险管理" - ], - "summary": "查询保游网账户余额", - "description": "查询保游网平台的账户余额,用于管理端展示当前可用投保额度。查询失败时返回null(非关键信息,不影响业务)。\n\n**权限**:需管理员登录。", - "operationId": "getBalanceUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«JsonNode»", - "$ref": "#/definitions/统一响应结果«JsonNode»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«JsonNode»", - "$ref": "#/definitions/统一响应结果«JsonNode»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/cancel/{id}": { - "post": { - "tags": [ - "保险管理" - ], - "summary": "退保", - "description": "对单个保险订单发起退保,调用保游网退保API。退保成功后保险状态变为CANCELLED。\n\n**权限**:需管理员登录。\n**注意**:已生效的保单退保可能产生手续费。\n\n**关联字典**:\n- insurance_status:保险状态(状态流转)", - "operationId": "cancelUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "保险订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«保险订单VO»", - "$ref": "#/definitions/统一响应结果«保险订单VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«保险订单VO»", - "$ref": "#/definitions/统一响应结果«保险订单VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/coverage/{orderId}": { - "get": { - "tags": [ - "保险管理" - ], - "summary": "查询订单保险保障(含被保人详情)", - "description": "返回订单维度的保险保障汇总信息,包含覆盖人数、保障期间、每位被保人的保单明细。用于订单详情页的保险保障展示。\n\n**权限**:需管理员登录。\n\n**关联字典**:\n- insurance_status:保险状态(显示)\n- gender:性别(被保人信息显示)\n- id_card_type:证件类型(被保人信息显示)", - "operationId": "getCoverageUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "旅行订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«订单保险保障VO»", - "$ref": "#/definitions/统一响应结果«订单保险保障VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«订单保险保障VO»", - "$ref": "#/definitions/统一响应结果«订单保险保障VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/entities": { - "get": { - "tags": [ - "保险管理" - ], - "summary": "投保公司主体列表", - "description": "返回系统配置的投保公司主体列表(来自Nacos配置),投保下单时选择以哪个公司主体投保。每个主体包含编码、公司名称和商户ID。\n\n**权限**:需管理员登录。", - "operationId": "listEntitiesUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«Map«string,string»»»", - "$ref": "#/definitions/统一响应结果«List«Map«string,string»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«Map«string,string»»»", - "$ref": "#/definitions/统一响应结果«List«Map«string,string»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/orders": { - "get": { - "tags": [ - "保险管理" - ], - "summary": "保险订单列表", - "description": "**关联字典**:\n- insurance_status:保险状态(列表筛选+显示)", - "operationId": "listOrdersUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "query", - "description": "关联旅行订单ID", - "required": false, - "type": "integer", - "format": "int64", - "x-example": 2026270000000000001 - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 20 - }, - { - "name": "status", - "in": "query", - "description": "订单状态: PENDING-待出单, INSURED-已承保, CANCELLED-已退保, FAILED-投保失败", - "required": false, - "type": "string", - "x-example": "INSURED" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«保险订单VO»»", - "$ref": "#/definitions/统一响应结果«分页结果«保险订单VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«保险订单VO»»", - "$ref": "#/definitions/统一响应结果«分页结果«保险订单VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/orders/by-order/{orderId}": { - "get": { - "tags": [ - "保险管理" - ], - "summary": "按旅行订单查询保险单", - "description": "根据旅行订单ID查询关联的所有保险订单列表。在订单详情页展示保险购买情况。\n\n**权限**:需管理员登录。\n\n**关联字典**:\n- insurance_status:保险状态(列表显示)", - "operationId": "getByOrderUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "旅行订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«保险订单VO»»", - "$ref": "#/definitions/统一响应结果«List«保险订单VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«保险订单VO»»", - "$ref": "#/definitions/统一响应结果«List«保险订单VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/orders/{id}": { - "get": { - "tags": [ - "保险管理" - ], - "summary": "保险订单详情(含被保人)", - "description": "**关联字典**:\n- insurance_status:保险状态(显示)\n- gender:性别(被保人信息显示)\n- id_card_type:证件类型(被保人信息显示)", - "operationId": "getOrderDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "保险订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«保险订单详情VO»", - "$ref": "#/definitions/统一响应结果«保险订单详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«保险订单详情VO»", - "$ref": "#/definitions/统一响应结果«保险订单详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/policy/{id}/download": { - "get": { - "tags": [ - "保险管理" - ], - "summary": "下载保单PDF(Base64)", - "description": "从保游网下载指定保险订单的电子保单PDF,以Base64编码返回。前端可解码后展示或提供下载。\n\n**权限**:需管理员登录。", - "operationId": "downloadPolicyUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "保险订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«string»", - "$ref": "#/definitions/统一响应结果«string»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«string»", - "$ref": "#/definitions/统一响应结果«string»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/products": { - "get": { - "tags": [ - "保险管理" - ], - "summary": "保险产品列表", - "description": "分页查询已同步的保险产品,支持按是否境外筛选。产品数据来源于保游网同步。\n\n**权限**:需管理员登录。", - "operationId": "listProductsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "isOverseas", - "in": "query", - "description": "是否境外", - "required": false, - "type": "boolean", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«保险产品VO»»", - "$ref": "#/definitions/统一响应结果«分页结果«保险产品VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«保险产品VO»»", - "$ref": "#/definitions/统一响应结果«分页结果«保险产品VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/products/{id}": { - "get": { - "tags": [ - "保险管理" - ], - "summary": "保险产品详情", - "description": "返回保险产品完整信息,包含产品名称、保险公司、保障范围、适用地区等。\n\n**权限**:需管理员登录。", - "operationId": "getProductUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "保险产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«保险产品VO»", - "$ref": "#/definitions/统一响应结果«保险产品VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«保险产品VO»", - "$ref": "#/definitions/统一响应结果«保险产品VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/products/{id}/plans": { - "get": { - "tags": [ - "保险管理" - ], - "summary": "保险产品计划及费率", - "description": "返回指定保险产品的所有投保计划及对应费率表,包含不同天数区间的保费价格。投保下单前需选择具体计划。\n\n**权限**:需管理员登录。", - "operationId": "getProductPlansUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "保险产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«保险计划VO»»", - "$ref": "#/definitions/统一响应结果«List«保险计划VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«保险计划VO»»", - "$ref": "#/definitions/统一响应结果«List«保险计划VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/purchase": { - "post": { - "tags": [ - "保险管理" - ], - "summary": "投保下单(每人独立保单)", - "description": "**关联字典**:\n- gender:性别(被保人信息)\n- id_card_type:证件类型(被保人信息)", - "operationId": "purchaseUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "投保请求", - "required": false, - "schema": { - "originalRef": "投保请求", - "$ref": "#/definitions/投保请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«保险订单详情VO»»", - "$ref": "#/definitions/统一响应结果«List«保险订单详情VO»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«保险订单详情VO»»", - "$ref": "#/definitions/统一响应结果«List«保险订单详情VO»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/recharge": { - "post": { - "tags": [ - "保险管理" - ], - "summary": "在线充值(调用保游网支付API)", - "description": "调用保游网在线充值API,生成充值支付链接。支持选择支付方式(支付宝/微信),充值完成后账户余额自动更新。\n\n**权限**:需管理员登录。", - "operationId": "rechargeUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "充值请求", - "required": false, - "schema": { - "originalRef": "充值请求", - "$ref": "#/definitions/充值请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Map«string,object»»", - "$ref": "#/definitions/统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Map«string,object»»", - "$ref": "#/definitions/统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/recharge-url": { - "get": { - "tags": [ - "保险管理" - ], - "summary": "获取保游网充值链接(旧接口,保留兼容)", - "description": "返回保游网平台的充值页面URL。此为旧版接口,保留用于向后兼容,推荐使用在线充值接口。\n\n**权限**:需管理员登录。", - "operationId": "getRechargeUrlUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«string»", - "$ref": "#/definitions/统一响应结果«string»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«string»", - "$ref": "#/definitions/统一响应结果«string»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/scheme": { - "post": { - "tags": [ - "保险方案模板" - ], - "summary": "创建方案", - "description": "创建保险方案模板,配置关联保险产品、投保天数规则和费率。创建后默认启用。\n\n**权限**:需管理员登录。", - "operationId": "createSchemeUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "方案请求", - "required": false, - "schema": { - "originalRef": "保险方案模板请求", - "$ref": "#/definitions/保险方案模板请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«保险方案模板VO»", - "$ref": "#/definitions/统一响应结果«保险方案模板VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«保险方案模板VO»", - "$ref": "#/definitions/统一响应结果«保险方案模板VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/scheme/list": { - "get": { - "tags": [ - "保险方案模板" - ], - "summary": "活跃方案列表(下拉选择用)", - "description": "返回所有状态为启用的保险方案模板,用于投保下单时的方案下拉选择。\n\n**权限**:需管理员登录。", - "operationId": "listActiveSchemesUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«保险方案模板VO»»", - "$ref": "#/definitions/统一响应结果«List«保险方案模板VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«保险方案模板VO»»", - "$ref": "#/definitions/统一响应结果«List«保险方案模板VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/scheme/list-all": { - "get": { - "tags": [ - "保险方案模板" - ], - "summary": "全部方案列表(管理用)", - "description": "返回所有保险方案模板(含启用和停用),用于方案管理页面展示和编辑。\n\n**权限**:需管理员登录。", - "operationId": "listAllSchemesUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«保险方案模板VO»»", - "$ref": "#/definitions/统一响应结果«List«保险方案模板VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«保险方案模板VO»»", - "$ref": "#/definitions/统一响应结果«List«保险方案模板VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/scheme/preview-apply": { - "post": { - "tags": [ - "保险方案模板" - ], - "summary": "预览应用方案(解析日期+估算保费)", - "description": "根据方案模板和行程日期预览投保效果:解析实际投保起止日期、计算每人保费和总保费。用于投保前确认费用。\n\n**权限**:需管理员登录。", - "operationId": "previewApplyUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "预览请求", - "required": false, - "schema": { - "originalRef": "应用方案预览请求", - "$ref": "#/definitions/应用方案预览请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«方案应用预览VO»", - "$ref": "#/definitions/统一响应结果«方案应用预览VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«方案应用预览VO»", - "$ref": "#/definitions/统一响应结果«方案应用预览VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/scheme/{id}": { - "get": { - "tags": [ - "保险方案模板" - ], - "summary": "方案详情", - "description": "返回单个保险方案模板的完整信息,包含方案名称、保险产品关联、天数规则、费率配置等。\n\n**权限**:需管理员登录。", - "operationId": "getSchemeDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "方案ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«保险方案模板VO»", - "$ref": "#/definitions/统一响应结果«保险方案模板VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«保险方案模板VO»", - "$ref": "#/definitions/统一响应结果«保险方案模板VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "保险方案模板" - ], - "summary": "更新方案", - "description": "更新保险方案模板的配置信息,包括方案名称、关联产品、天数规则、费率等。\n\n**权限**:需管理员登录。", - "operationId": "updateSchemeUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "方案ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "方案请求", - "required": false, - "schema": { - "originalRef": "保险方案模板请求", - "$ref": "#/definitions/保险方案模板请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«保险方案模板VO»", - "$ref": "#/definitions/统一响应结果«保险方案模板VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«保险方案模板VO»", - "$ref": "#/definitions/统一响应结果«保险方案模板VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "保险方案模板" - ], - "summary": "删除方案(软删除)", - "description": "软删除保险方案模板。已使用该方案创建的保险订单不受影响。\n\n**权限**:需管理员登录。", - "operationId": "deleteSchemeUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "方案ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/scheme/{id}/toggle-status": { - "put": { - "tags": [ - "保险方案模板" - ], - "summary": "切换方案状态(启用/停用)", - "description": "切换保险方案模板的启用/停用状态。停用后不会出现在投保下单的方案选择列表中。\n\n**权限**:需管理员登录。\n\n**关联字典**:\n- common_status:通用状态(ACTIVE=启用/INACTIVE=停用)", - "operationId": "toggleStatusUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "方案ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«保险方案模板VO»", - "$ref": "#/definitions/统一响应结果«保险方案模板VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«保险方案模板VO»", - "$ref": "#/definitions/统一响应结果«保险方案模板VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/share-policy": { - "post": { - "tags": [ - "保险管理" - ], - "summary": "分享保单(合并某出行人所有有效保单PDF,上传OSS返回链接)", - "description": "合并指定出行人的所有有效保单PDF为一个文件,上传至OSS后返回公开访问链接。用于管理端分享保单给出行人。\n\n**权限**:需管理员登录。", - "operationId": "sharePolicyUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "分享保单请求", - "required": false, - "schema": { - "originalRef": "保单分享请求", - "$ref": "#/definitions/保单分享请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«保单分享结果»", - "$ref": "#/definitions/统一响应结果«保单分享结果»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«保单分享结果»", - "$ref": "#/definitions/统一响应结果«保单分享结果»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/sync-products": { - "post": { - "tags": [ - "保险管理" - ], - "summary": "从保游网同步产品数据", - "description": "手动触发从保游网API拉取最新保险产品数据(含计划和费率),同步到本地数据库。返回同步的产品数量。\n\n**权限**:需管理员登录。", - "operationId": "syncProductsUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«int»", - "$ref": "#/definitions/统一响应结果«int»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«int»", - "$ref": "#/definitions/统一响应结果«int»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/insurance/trial-price": { - "post": { - "tags": [ - "保险管理" - ], - "summary": "保费试算(本地费率)", - "description": "根据保险计划、投保天数和人数,使用本地同步的费率表试算保费。不调用保游网API,用于投保前的费用预估。\n\n**权限**:需管理员登录。", - "operationId": "trialPriceUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "试算请求", - "required": false, - "schema": { - "originalRef": "保费试算请求", - "$ref": "#/definitions/保费试算请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Map«string,object»»", - "$ref": "#/definitions/统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Map«string,object»»", - "$ref": "#/definitions/统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - } - }, - "definitions": { - "JsonNode": { - "type": "object", - "title": "JsonNode" - }, - "Map«string,string»": { - "type": "object", - "title": "Map«string,string»", - "additionalProperties": { - "type": "string" - } - }, - "保单分享结果": { - "type": "object", - "properties": { - "failedCount": { - "type": "integer", - "format": "int32", - "description": "下载失败的保单数量(已跳过)" - }, - "pdfBase64": { - "type": "string", - "description": "合并后的PDF(Base64编码)" - }, - "personName": { - "type": "string", - "description": "被保人姓名" - }, - "policyCount": { - "type": "integer", - "format": "int32", - "description": "包含的保单数量" - } - }, - "title": "保单分享结果" - }, - "保单分享请求": { - "type": "object", - "required": [ - "insuredIdCardNo", - "insuredName", - "orderId" - ], - "properties": { - "insuredIdCardNo": { - "type": "string", - "description": "被保人证件号码" - }, - "insuredName": { - "type": "string", - "description": "被保人姓名" - }, - "orderId": { - "type": "integer", - "format": "int64", - "description": "旅游订单ID" - } - }, - "title": "保单分享请求" - }, - "保费试算请求": { - "type": "object", - "required": [ - "endDate", - "insuredCount", - "planId", - "startDate" - ], - "properties": { - "endDate": { - "type": "string", - "format": "date", - "example": "2026-05-05", - "description": "保障结束日期" - }, - "insuredCount": { - "type": "integer", - "format": "int32", - "example": 3, - "description": "被保人数量" - }, - "planId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856390, - "description": "保险计划ID" - }, - "startDate": { - "type": "string", - "format": "date", - "example": "2026-05-01", - "description": "保障开始日期" - } - }, - "title": "保费试算请求" - }, - "保险产品VO": { - "type": "object", - "properties": { - "companyName": { - "type": "string", - "example": "中国平安", - "description": "保险公司名称" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "同步时间" - }, - "extProductGuid": { - "type": "string", - "example": "4810725b34654e1e88a7509e5b241c3a", - "description": "保游网产品GUID" - }, - "isOverseas": { - "type": "boolean", - "example": false, - "description": "是否境外产品" - }, - "maxAge": { - "type": "integer", - "format": "int32", - "example": 85, - "description": "最大投保年龄" - }, - "maxDays": { - "type": "integer", - "format": "int32", - "example": 365, - "description": "最长保障天数" - }, - "minAge": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "最小投保年龄" - }, - "minDays": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "最短保障天数" - }, - "productId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856385, - "description": "保险产品ID" - }, - "productName": { - "type": "string", - "example": "畅游神州境内游(旅行社专享)", - "description": "产品名称" - }, - "productType": { - "type": "string", - "description": "产品类型" - }, - "status": { - "type": "string", - "example": "ACTIVE", - "description": "产品状态: ACTIVE-已上架, INACTIVE-已下架" - } - }, - "title": "保险产品VO" - }, - "保险方案模板VO": { - "type": "object", - "properties": { - "adminId": { - "type": "integer", - "format": "int64", - "example": 100, - "description": "创建人ID" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "description": { - "type": "string", - "example": "适用于7日国内行程", - "description": "方案描述" - }, - "isOverseas": { - "type": "boolean", - "example": false, - "description": "是否境外" - }, - "name": { - "type": "string", - "example": "7日标准方案", - "description": "方案名称" - }, - "schemeId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856500, - "description": "方案ID" - }, - "segmentCount": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "段数量" - }, - "segments": { - "type": "array", - "description": "方案段列表", - "items": { - "originalRef": "保险方案段VO", - "$ref": "#/definitions/保险方案段VO" - } - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序序号" - }, - "status": { - "type": "string", - "example": "ACTIVE", - "description": "状态: ACTIVE-启用, INACTIVE-停用" - } - }, - "title": "保险方案模板VO" - }, - "保险方案模板请求": { - "type": "object", - "required": [ - "isOverseas", - "name", - "segments" - ], - "properties": { - "description": { - "type": "string", - "example": "适用于7日国内行程,含前段境内险和后段高原险", - "description": "方案描述" - }, - "isOverseas": { - "type": "boolean", - "example": false, - "description": "是否境外: false=境内, true=境外" - }, - "name": { - "type": "string", - "example": "7日标准方案", - "description": "方案名称" - }, - "segments": { - "type": "array", - "description": "保险段列表", - "items": { - "originalRef": "保险方案段", - "$ref": "#/definitions/保险方案段" - } - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序序号(越小越靠前)" - } - }, - "title": "保险方案模板请求" - }, - "保险方案段": { - "type": "object", - "required": [ - "dayOffsetEnd", - "dayOffsetStart", - "planId", - "productId" - ], - "properties": { - "dayOffsetEnd": { - "type": "integer", - "format": "int32", - "example": 3, - "description": "相对结束天(1-based, -1=行程最后一天)" - }, - "dayOffsetStart": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "相对起始天(1-based, 1=出发日)" - }, - "planId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856390, - "description": "保险计划ID" - }, - "productId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856385, - "description": "保险产品ID" - }, - "segmentName": { - "type": "string", - "example": "前段-境内险", - "description": "段名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "段排序序号" - } - }, - "title": "保险方案段" - }, - "保险方案段VO": { - "type": "object", - "properties": { - "dayOffsetEnd": { - "type": "integer", - "format": "int32", - "example": 3, - "description": "相对结束天(-1=最后一天)" - }, - "dayOffsetStart": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "相对起始天" - }, - "planId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856390, - "description": "保险计划ID" - }, - "planName": { - "type": "string", - "example": "经济版", - "description": "保险计划名称" - }, - "productId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856385, - "description": "保险产品ID" - }, - "productName": { - "type": "string", - "example": "畅游神州境内游(旅行社专享)", - "description": "保险产品名称" - }, - "segmentId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856510, - "description": "段ID" - }, - "segmentName": { - "type": "string", - "example": "前段-境内险", - "description": "段名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "段排序序号" - } - }, - "title": "保险方案段VO" - }, - "保险计划VO": { - "type": "object", - "properties": { - "extPlanGuid": { - "type": "string", - "example": "abc123", - "description": "保游网计划GUID" - }, - "planId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856390, - "description": "计划ID" - }, - "planName": { - "type": "string", - "example": "经济版", - "description": "计划名称" - }, - "productId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856385, - "description": "所属产品ID" - }, - "rates": { - "type": "array", - "description": "费率列表", - "items": { - "originalRef": "保险费率VO", - "$ref": "#/definitions/保险费率VO" - } - }, - "securityList": { - "type": "string", - "example": "...
", - "description": "保障内容(HTML)" - } - }, - "title": "保险计划VO" - }, - "保险订单VO": { - "type": "object", - "properties": { - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "endDate": { - "type": "string", - "format": "date", - "example": "2026-05-05", - "description": "保障结束日期" - }, - "entityCode": { - "type": "string", - "example": "hulai", - "description": "投保公司主体编码" - }, - "extOrderNo": { - "type": "string", - "example": "BYW202602250001", - "description": "保游网订单号" - }, - "extPolicyNo": { - "type": "string", - "example": "P202602250001", - "description": "保单号" - }, - "insuranceOrderId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856400, - "description": "保险订单ID" - }, - "insuredCount": { - "type": "integer", - "format": "int32", - "example": 3, - "description": "被保人数量" - }, - "orderId": { - "type": "integer", - "format": "int64", - "example": 2026270000000000001, - "description": "关联旅行订单ID" - }, - "planId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856390, - "description": "保险计划ID" - }, - "planName": { - "type": "string", - "example": "经济版", - "description": "保险计划名称" - }, - "policyHolderName": { - "type": "string", - "example": "内蒙古呼籁国际旅行社有限公司", - "description": "投保人姓名(公司名称)" - }, - "productId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856385, - "description": "保险产品ID" - }, - "productName": { - "type": "string", - "example": "畅游神州境内游(旅行社专享)", - "description": "保险产品名称" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "startDate": { - "type": "string", - "format": "date", - "example": "2026-05-01", - "description": "保障开始日期" - }, - "status": { - "type": "string", - "example": "INSURED", - "description": "订单状态: PENDING-待出单, INSURED-已承保, CANCELLED-已退保, FAILED-投保失败" - }, - "statusLabel": { - "type": "string", - "example": "已承保", - "description": "状态中文标签" - }, - "totalPremium": { - "type": "number", - "example": 45.0, - "description": "总保费(元)" - } - }, - "title": "保险订单VO" - }, - "保险订单详情VO": { - "type": "object", - "properties": { - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "endDate": { - "type": "string", - "format": "date", - "example": "2026-05-05", - "description": "保障结束日期" - }, - "entityCode": { - "type": "string", - "example": "hulai", - "description": "投保公司主体编码" - }, - "extOrderNo": { - "type": "string", - "example": "BYW202602250001", - "description": "保游网订单号" - }, - "extPolicyNo": { - "type": "string", - "example": "P202602250001", - "description": "保单号" - }, - "insuranceOrderId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856400, - "description": "保险订单ID" - }, - "insuredCount": { - "type": "integer", - "format": "int32", - "example": 3, - "description": "被保人数量" - }, - "insuredPersons": { - "type": "array", - "description": "被保人列表", - "items": { - "originalRef": "被保人信息VO", - "$ref": "#/definitions/被保人信息VO" - } - }, - "orderId": { - "type": "integer", - "format": "int64", - "example": 2026270000000000001, - "description": "关联旅行订单ID" - }, - "planId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856390, - "description": "保险计划ID" - }, - "planName": { - "type": "string", - "example": "经济版", - "description": "保险计划名称" - }, - "policyHolderName": { - "type": "string", - "example": "内蒙古呼籁国际旅行社有限公司", - "description": "投保人姓名(公司名称)" - }, - "productId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856385, - "description": "保险产品ID" - }, - "productName": { - "type": "string", - "example": "畅游神州境内游(旅行社专享)", - "description": "保险产品名称" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "startDate": { - "type": "string", - "format": "date", - "example": "2026-05-01", - "description": "保障开始日期" - }, - "status": { - "type": "string", - "example": "INSURED", - "description": "订单状态: PENDING-待出单, INSURED-已承保, CANCELLED-已退保, FAILED-投保失败" - }, - "statusLabel": { - "type": "string", - "example": "已承保", - "description": "状态中文标签" - }, - "totalPremium": { - "type": "number", - "example": 45.0, - "description": "总保费(元)" - } - }, - "title": "保险订单详情VO" - }, - "保险费率VO": { - "type": "object", - "properties": { - "ageRange": { - "type": "string", - "example": "0-85", - "description": "适用年龄范围" - }, - "dayRange": { - "type": "string", - "example": "4-7", - "description": "适用天数范围(如 1, 2, 4-7)" - }, - "dayType": { - "type": "string", - "example": 10, - "description": "天数类型: 10-按天, 20-按月, 30-按年" - }, - "extRateCode": { - "type": "string", - "example": "RATE001", - "description": "保游网费率编码" - }, - "premium": { - "type": "number", - "example": 15.0, - "description": "单人保费(元)" - }, - "rateId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856395, - "description": "费率ID" - } - }, - "title": "保险费率VO" - }, - "充值请求": { - "type": "object", - "required": [ - "money", - "payType" - ], - "properties": { - "backUrl": { - "type": "string", - "example": "http://localhost:5173/insurance", - "description": "同步回调地址(支付宝用)" - }, - "money": { - "type": "number", - "example": 100.0, - "description": "充值金额(元)" - }, - "payType": { - "type": "integer", - "format": "int32", - "example": 11, - "description": "支付方式:11=支付宝扫码, 33=微信扫码" - } - }, - "title": "充值请求" - }, - "分页结果«保险产品VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "originalRef": "保险产品VO", - "$ref": "#/definitions/保险产品VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«保险产品VO»" - }, - "分页结果«保险订单VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "originalRef": "保险订单VO", - "$ref": "#/definitions/保险订单VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«保险订单VO»" - }, - "应用方案预览请求": { - "type": "object", - "required": [ - "orderId", - "schemeId" - ], - "properties": { - "departureDate": { - "type": "string", - "format": "date", - "example": "2026-07-01", - "description": "出发日期(可选,不传则从订单获取)" - }, - "insuredCount": { - "type": "integer", - "format": "int32", - "example": 4, - "description": "被保人数量(可选,不传则从订单获取出行人数)" - }, - "orderId": { - "type": "integer", - "format": "int64", - "example": 2026270000000000001, - "description": "旅行订单ID(用于获取出发/返回日期和出行人数)" - }, - "returnDate": { - "type": "string", - "format": "date", - "example": "2026-07-07", - "description": "返回日期(可选,不传则从订单获取)" - }, - "schemeId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856500, - "description": "方案ID" - } - }, - "title": "应用方案预览请求" - }, - "投保请求": { - "type": "object", - "required": [ - "endDate", - "insuredPersons", - "planId", - "startDate" - ], - "properties": { - "endDate": { - "type": "string", - "format": "date", - "example": "2026-05-05", - "description": "保障结束日期" - }, - "entityCode": { - "type": "string", - "example": "hulai", - "description": "投保公司主体编码(不填则使用默认主体)" - }, - "insuredPersons": { - "type": "array", - "description": "被保人列表(至少1人)", - "items": { - "originalRef": "被保人/投保人信息", - "$ref": "#/definitions/被保人/投保人信息" - } - }, - "orderId": { - "type": "integer", - "format": "int64", - "example": 2026270000000000001, - "description": "关联旅行订单ID(可选)" - }, - "planId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856390, - "description": "保险计划ID" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "startDate": { - "type": "string", - "format": "date", - "example": "2026-05-01", - "description": "保障开始日期" - } - }, - "title": "投保请求" - }, - "方案应用预览VO": { - "type": "object", - "properties": { - "departureDate": { - "type": "string", - "format": "date", - "example": "2026-07-01", - "description": "行程出发日期" - }, - "insuredCount": { - "type": "integer", - "format": "int32", - "example": 4, - "description": "被保人数量" - }, - "returnDate": { - "type": "string", - "format": "date", - "example": "2026-07-07", - "description": "行程返回日期" - }, - "schemeId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856500, - "description": "方案ID" - }, - "schemeName": { - "type": "string", - "example": "7日标准方案", - "description": "方案名称" - }, - "segments": { - "type": "array", - "description": "解析后的保险段列表", - "items": { - "originalRef": "解析后的保险段", - "$ref": "#/definitions/解析后的保险段" - } - }, - "totalEstimatedPremium": { - "type": "number", - "example": 320.0, - "description": "预估总保费(所有段合计)" - }, - "tripDays": { - "type": "integer", - "format": "int32", - "example": 7, - "description": "行程天数" - }, - "warnings": { - "type": "array", - "description": "警告信息(如日期间隙、重叠、超出行程范围等)", - "items": { - "type": "string" - } - } - }, - "title": "方案应用预览VO" - }, - "统一响应结果«JsonNode»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "JsonNode", - "$ref": "#/definitions/JsonNode" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«JsonNode»" - }, - "统一响应结果«List«Map«string,string»»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "Map«string,string»", - "$ref": "#/definitions/Map«string,string»" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«Map«string,string»»»" - }, - "统一响应结果«List«保险方案模板VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "保险方案模板VO", - "$ref": "#/definitions/保险方案模板VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«保险方案模板VO»»" - }, - "统一响应结果«List«保险计划VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "保险计划VO", - "$ref": "#/definitions/保险计划VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«保险计划VO»»" - }, - "统一响应结果«List«保险订单VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "保险订单VO", - "$ref": "#/definitions/保险订单VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«保险订单VO»»" - }, - "统一响应结果«List«保险订单详情VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "保险订单详情VO", - "$ref": "#/definitions/保险订单详情VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«保险订单详情VO»»" - }, - "统一响应结果«Map«string,object»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "object", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Map«string,object»»" - }, - "统一响应结果«Void»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Void»" - }, - "统一响应结果«int»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "integer", - "format": "int32", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«int»" - }, - "统一响应结果«string»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "string", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«string»" - }, - "统一响应结果«保单分享结果»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "保单分享结果", - "$ref": "#/definitions/保单分享结果" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«保单分享结果»" - }, - "统一响应结果«保险产品VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "保险产品VO", - "$ref": "#/definitions/保险产品VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«保险产品VO»" - }, - "统一响应结果«保险方案模板VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "保险方案模板VO", - "$ref": "#/definitions/保险方案模板VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«保险方案模板VO»" - }, - "统一响应结果«保险订单VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "保险订单VO", - "$ref": "#/definitions/保险订单VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«保险订单VO»" - }, - "统一响应结果«保险订单详情VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "保险订单详情VO", - "$ref": "#/definitions/保险订单详情VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«保险订单详情VO»" - }, - "统一响应结果«分页结果«保险产品VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分页结果«保险产品VO»", - "$ref": "#/definitions/分页结果«保险产品VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«保险产品VO»»" - }, - "统一响应结果«分页结果«保险订单VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分页结果«保险订单VO»", - "$ref": "#/definitions/分页结果«保险订单VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«保险订单VO»»" - }, - "统一响应结果«方案应用预览VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "方案应用预览VO", - "$ref": "#/definitions/方案应用预览VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«方案应用预览VO»" - }, - "统一响应结果«订单保险保障VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "订单保险保障VO", - "$ref": "#/definitions/订单保险保障VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«订单保险保障VO»" - }, - "被保人/投保人信息": { - "type": "object", - "required": [ - "birthday", - "gender", - "idCardNo", - "name" - ], - "properties": { - "birthday": { - "type": "string", - "format": "date", - "example": "1990-01-01", - "description": "出生日期" - }, - "gender": { - "type": "string", - "example": "MALE", - "description": "性别: MALE-男, FEMALE-女" - }, - "idCardNo": { - "type": "string", - "example": 110101199001011234, - "description": "证件号码" - }, - "idCardType": { - "type": "string", - "example": "ID_CARD", - "description": "证件类型: ID_CARD-身份证, PASSPORT-护照, OTHER-其他" - }, - "isBeneficiary": { - "type": "boolean", - "example": false, - "description": "是否为受益人" - }, - "name": { - "type": "string", - "example": "李四", - "description": "姓名" - }, - "phone": { - "type": "string", - "example": 13800138000, - "description": "手机号" - } - }, - "title": "被保人/投保人信息" - }, - "被保人信息VO": { - "type": "object", - "properties": { - "birthday": { - "type": "string", - "format": "date", - "example": "1990-01-01", - "description": "出生日期" - }, - "gender": { - "type": "string", - "example": "MALE", - "description": "性别: MALE-男, FEMALE-女" - }, - "idCardNo": { - "type": "string", - "example": 110101199001011234, - "description": "证件号码" - }, - "idCardType": { - "type": "string", - "example": "ID_CARD", - "description": "证件类型: ID_CARD-身份证, PASSPORT-护照, OTHER-其他" - }, - "insuredId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856410, - "description": "被保人ID" - }, - "isBeneficiary": { - "type": "boolean", - "example": false, - "description": "是否为受益人" - }, - "name": { - "type": "string", - "example": "李四", - "description": "姓名" - }, - "phone": { - "type": "string", - "example": 13800138000, - "description": "手机号" - } - }, - "title": "被保人信息VO" - }, - "解析后的保险段": { - "type": "object", - "properties": { - "coverageDays": { - "type": "integer", - "format": "int32", - "example": 3, - "description": "覆盖天数" - }, - "dayOffsetEnd": { - "type": "integer", - "format": "int32", - "example": 3, - "description": "原始结束天偏移" - }, - "dayOffsetStart": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "原始起始天偏移" - }, - "estimatedPremium": { - "type": "number", - "example": 60.0, - "description": "该段预估总保费(单人保费 x 人数)" - }, - "planId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856390, - "description": "保险计划ID" - }, - "planName": { - "type": "string", - "example": "经济版", - "description": "保险计划名称" - }, - "productId": { - "type": "integer", - "format": "int64", - "example": 2026279738275856385, - "description": "保险产品ID" - }, - "productName": { - "type": "string", - "example": "畅游神州境内游(旅行社专享)", - "description": "保险产品名称" - }, - "resolvedEndDate": { - "type": "string", - "format": "date", - "example": "2026-07-03", - "description": "解析后的实际结束日期" - }, - "resolvedStartDate": { - "type": "string", - "format": "date", - "example": "2026-07-01", - "description": "解析后的实际开始日期" - }, - "segmentName": { - "type": "string", - "example": "前段-境内险", - "description": "段名称" - }, - "skipReason": { - "type": "string", - "description": "跳过原因" - }, - "skipped": { - "type": "boolean", - "example": false, - "description": "是否被跳过(超出行程范围)" - }, - "unitPremium": { - "type": "number", - "example": 15.0, - "description": "单人保费" - } - }, - "title": "解析后的保险段" - }, - "订单保险保障VO": { - "type": "object", - "properties": { - "insuranceOrders": { - "type": "array", - "description": "保险订单详情列表(含被保人)", - "items": { - "originalRef": "保险订单详情VO", - "$ref": "#/definitions/保险订单详情VO" - } - }, - "orderCount": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "保险单数量" - }, - "orderId": { - "type": "integer", - "format": "int64", - "example": 2026270000000000001, - "description": "旅行订单ID" - } - }, - "title": "订单保险保障VO" - } - } -} \ No newline at end of file diff --git a/.swagger/hl-material-service.json b/.swagger/hl-material-service.json deleted file mode 100644 index 208caad..0000000 --- a/.swagger/hl-material-service.json +++ /dev/null @@ -1,3274 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "素材服务", - "version": "1.0.0" - }, - "basePath": "/", - "paths": { - "/admin/material/batch": { - "delete": { - "tags": [ - "素材管理" - ], - "summary": "批量删除素材", - "description": "批量删除素材,返回删除结果(成功数/失败数/失败原因)。有引用关系的素材会跳过并记录失败原因", - "operationId": "batchDeleteUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "批量删除请求", - "required": false, - "schema": { - "originalRef": "批量删除素材请求", - "$ref": "#/definitions/批量删除素材请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«批量删除结果»", - "$ref": "#/definitions/统一响应结果«批量删除结果»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«批量删除结果»", - "$ref": "#/definitions/统一响应结果«批量删除结果»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/batch/tags": { - "put": { - "tags": [ - "素材管理" - ], - "summary": "批量更新标签", - "description": "对多个素材同时添加和/或移除标签,支持增量操作(addTagIds新增,removeTagIds移除)", - "operationId": "batchUpdateTagsUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "批量标签更新请求", - "required": false, - "schema": { - "originalRef": "批量标签操作请求", - "$ref": "#/definitions/批量标签操作请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/categories": { - "get": { - "tags": [ - "素材管理" - ], - "summary": "获取有权限的分类列表(含素材数量)", - "description": "返回当前角色有权限查看的素材分类树,每个分类包含素材数量统计。超级管理员可见全部分类", - "operationId": "getCategoriesUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«素材分类信息»»", - "$ref": "#/definitions/统一响应结果«List«素材分类信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«素材分类信息»»", - "$ref": "#/definitions/统一响应结果«List«素材分类信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/category/permissions/{roleCode}": { - "get": { - "tags": [ - "素材分类权限管理" - ], - "summary": "获取角色的分类权限", - "description": "仅超级管理员可操作。返回指定角色可访问的素材分类编码列表", - "operationId": "getPermissionsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "roleCode", - "in": "path", - "description": "角色编码", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«string»»", - "$ref": "#/definitions/统一响应结果«List«string»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«string»»", - "$ref": "#/definitions/统一响应结果«List«string»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "素材分类权限管理" - ], - "summary": "更新角色的分类权限", - "description": "仅超级管理员可操作。全量替换指定角色的素材分类访问权限,传入允许访问的分类编码列表", - "operationId": "updatePermissionsUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "分类权限更新请求", - "required": false, - "schema": { - "originalRef": "分类权限更新请求", - "$ref": "#/definitions/分类权限更新请求" - } - }, - { - "name": "roleCode", - "in": "path", - "description": "角色编码", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/category/sub": { - "post": { - "tags": [ - "素材管理" - ], - "summary": "创建子分类", - "description": "在一级分类下创建子分类,分类编码自动生成。子分类用于更细粒度的素材归档", - "operationId": "createSubCategoryUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "子分类创建请求", - "required": false, - "schema": { - "originalRef": "Create subcategory request", - "$ref": "#/definitions/Create subcategory request" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«素材分类信息»", - "$ref": "#/definitions/统一响应结果«素材分类信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«素材分类信息»", - "$ref": "#/definitions/统一响应结果«素材分类信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/category/sub/{categoryId}": { - "put": { - "tags": [ - "素材管理" - ], - "summary": "更新子分类", - "description": "更新子分类的名称或排序值。仅有该分类权限的管理员可操作。", - "operationId": "updateSubCategoryUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "categoryId", - "in": "path", - "description": "子分类ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "子分类更新请求", - "required": false, - "schema": { - "originalRef": "Update subcategory request", - "$ref": "#/definitions/Update subcategory request" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«素材分类信息»", - "$ref": "#/definitions/统一响应结果«素材分类信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«素材分类信息»", - "$ref": "#/definitions/统一响应结果«素材分类信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "素材管理" - ], - "summary": "删除子分类", - "description": "删除子分类前需确保分类下无素材,否则删除失败", - "operationId": "deleteSubCategoryUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "categoryId", - "in": "path", - "description": "子分类ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/list": { - "get": { - "tags": [ - "素材管理" - ], - "summary": "素材列表", - "description": "分页查询素材,支持按分类、标签、文件类型、关键词筛选。返回结果受角色分类权限限制\n\n**关联字典**:\n- file_type:文件类型(列表筛选+显示)", - "operationId": "listMaterialsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "categoryCode", - "in": "query", - "description": "分类编码", - "required": false, - "type": "string", - "x-example": "scenic" - }, - { - "name": "createdBy", - "in": "query", - "description": "创建人ID", - "required": false, - "type": "integer", - "format": "int64", - "x-example": 1001 - }, - { - "name": "endDate", - "in": "query", - "description": "结束日期", - "required": false, - "type": "string", - "x-example": "2026-12-31" - }, - { - "name": "fileType", - "in": "query", - "description": "文件类型", - "required": false, - "type": "string", - "x-example": "image" - }, - { - "name": "keyword", - "in": "query", - "description": "搜索关键词", - "required": false, - "type": "string", - "x-example": "风景" - }, - { - "name": "orderBy", - "in": "query", - "description": "排序字段", - "required": false, - "type": "string", - "x-example": "createdAt" - }, - { - "name": "orderDir", - "in": "query", - "description": "排序方向: asc/desc", - "required": false, - "type": "string", - "x-example": "desc" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 20 - }, - { - "name": "startDate", - "in": "query", - "description": "开始日期", - "required": false, - "type": "string", - "x-example": "2026-01-01" - }, - { - "name": "subCategoryId", - "in": "query", - "description": "子分类ID", - "required": false, - "type": "integer", - "format": "int64", - "x-example": 2030000000000001 - }, - { - "name": "tagIds", - "in": "query", - "description": "标签ID列表(逗号分隔)", - "required": false, - "type": "string", - "x-example": "1,2,3" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«素材信息»»", - "$ref": "#/definitions/统一响应结果«分页结果«素材信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«素材信息»»", - "$ref": "#/definitions/统一响应结果«分页结果«素材信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/tag": { - "post": { - "tags": [ - "素材标签管理" - ], - "summary": "创建管理标签", - "description": "创建系统级素材标签,标签名称不可重复。创建后可用于素材分类和筛选。\n\n**权限**:需管理员登录。", - "operationId": "createTagUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "创建标签请求", - "required": false, - "schema": { - "originalRef": "创建标签请求", - "$ref": "#/definitions/创建标签请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«素材标签信息»", - "$ref": "#/definitions/统一响应结果«素材标签信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«素材标签信息»", - "$ref": "#/definitions/统一响应结果«素材标签信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/tag/adhoc": { - "post": { - "tags": [ - "素材标签管理" - ], - "summary": "解析自定义标签(按名称查找或创建)", - "description": "按标签名称查找已有标签,不存在则自动创建为用户自定义标签。用于素材上传时输入自由标签文本的场景。\n\n**权限**:需管理员登录。", - "operationId": "resolveAdHocTagUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "自定义标签请求", - "required": false, - "schema": { - "originalRef": "创建标签请求", - "$ref": "#/definitions/创建标签请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«素材标签信息»", - "$ref": "#/definitions/统一响应结果«素材标签信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«素材标签信息»", - "$ref": "#/definitions/统一响应结果«素材标签信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/tag/{tagId}": { - "put": { - "tags": [ - "素材标签管理" - ], - "summary": "编辑标签", - "description": "更新标签名称。标签名称不可与其他已有标签重复。\n\n**权限**:需管理员登录。", - "operationId": "updateTagUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "更新标签请求", - "required": false, - "schema": { - "originalRef": "更新标签请求", - "$ref": "#/definitions/更新标签请求" - } - }, - { - "name": "tagId", - "in": "path", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«素材标签信息»", - "$ref": "#/definitions/统一响应结果«素材标签信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«素材标签信息»", - "$ref": "#/definitions/统一响应结果«素材标签信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "素材标签管理" - ], - "summary": "删除标签", - "description": "删除标签并自动解除与所有素材的关联关系。\n\n**权限**:需管理员登录。", - "operationId": "deleteTagUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "tagId", - "in": "path", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/tags": { - "get": { - "tags": [ - "素材标签管理" - ], - "summary": "获取管理标签(标签管理用,分页)", - "description": "返回管理员创建的系统标签列表(不含用户自定义标签),用于标签管理页的CRUD操作。支持按标签名称搜索。", - "operationId": "listManagedTagsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "搜索关键词(按标签名称模糊搜索)", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码(默认1)", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数(默认20)", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«素材标签信息»»", - "$ref": "#/definitions/统一响应结果«分页结果«素材标签信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«素材标签信息»»", - "$ref": "#/definitions/统一响应结果«分页结果«素材标签信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/tags/all": { - "get": { - "tags": [ - "素材标签管理" - ], - "summary": "获取全部标签(选择器用,含自定义标签)", - "description": "返回所有标签(含系统标签和用户自定义标签),用于素材上传/编辑时的标签选择器。", - "operationId": "listAllTagsUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«素材标签信息»»", - "$ref": "#/definitions/统一响应结果«List«素材标签信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«素材标签信息»»", - "$ref": "#/definitions/统一响应结果«List«素材标签信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/upload/chunk": { - "post": { - "tags": [ - "素材管理" - ], - "summary": "分片上传-上传分片", - "description": "大文件上传第二步:逐个上传分片数据,分片索引从0开始。支持断点续传,已上传的分片无需重传。", - "operationId": "chunkUploadPartUsingPOST", - "consumes": [ - "multipart/form-data" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "chunk", - "in": "formData", - "description": "分片文件", - "required": false, - "type": "file" - }, - { - "name": "chunkIndex", - "in": "query", - "description": "分片索引(从0开始)", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "uploadId", - "in": "query", - "description": "上传ID", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分片上传结果»", - "$ref": "#/definitions/统一响应结果«分片上传结果»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分片上传结果»", - "$ref": "#/definitions/统一响应结果«分片上传结果»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/upload/chunk/cancel": { - "post": { - "tags": [ - "素材管理" - ], - "summary": "分片上传-取消", - "description": "取消分片上传任务,清理已上传的分片数据和OSS临时文件。仅上传发起者可取消。", - "operationId": "chunkUploadCancelUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "分片上传取消请求", - "required": false, - "schema": { - "originalRef": "分片上传取消请求", - "$ref": "#/definitions/分片上传取消请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/upload/chunk/complete": { - "post": { - "tags": [ - "素材管理" - ], - "summary": "分片上传-完成合并", - "description": "大文件上传第三步:所有分片上传完成后调用,OSS端合并分片为完整文件并创建素材记录。", - "operationId": "chunkUploadCompleteUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "分片上传完成请求", - "required": false, - "schema": { - "originalRef": "分片上传完成请求", - "$ref": "#/definitions/分片上传完成请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«素材信息»", - "$ref": "#/definitions/统一响应结果«素材信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«素材信息»", - "$ref": "#/definitions/统一响应结果«素材信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/upload/chunk/init": { - "post": { - "tags": [ - "素材管理" - ], - "summary": "分片上传-初始化", - "description": "大文件上传第一步:初始化分片上传任务,返回uploadId和每个分片的预签名URL。前端按分片并发上传后调用完成合并接口。\n\n**权限**:需管理员登录,受角色分类权限限制。", - "operationId": "chunkUploadInitUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "分片上传初始化请求", - "required": false, - "schema": { - "originalRef": "分片上传初始化请求", - "$ref": "#/definitions/分片上传初始化请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分片上传初始化结果»", - "$ref": "#/definitions/统一响应结果«分片上传初始化结果»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分片上传初始化结果»", - "$ref": "#/definitions/统一响应结果«分片上传初始化结果»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/upload/confirm": { - "post": { - "tags": [ - "素材管理" - ], - "summary": "确认上传完成", - "description": "上传素材第二步:前端直传OSS完成后调用此接口创建素材记录,支持MD5去重\n\n**关联字典**:\n- material_tag:素材标签(上传时可选标签)", - "operationId": "confirmUploadUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "确认上传请求", - "required": false, - "schema": { - "originalRef": "素材上传确认请求", - "$ref": "#/definitions/素材上传确认请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«素材信息»", - "$ref": "#/definitions/统一响应结果«素材信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«素材信息»", - "$ref": "#/definitions/统一响应结果«素材信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/upload/folder": { - "post": { - "tags": [ - "素材管理" - ], - "summary": "文件夹上传初始化(创建分类+批量获取凭证)", - "description": "支持整个文件夹上传:自动根据文件夹名创建子分类,为每个文件批量获取上传凭证,前端逐一上传后批量确认", - "operationId": "folderUploadInitUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "文件夹上传初始化请求", - "required": false, - "schema": { - "originalRef": "文件夹上传初始化请求", - "$ref": "#/definitions/文件夹上传初始化请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«文件夹上传初始化结果»", - "$ref": "#/definitions/统一响应结果«文件夹上传初始化结果»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«文件夹上传初始化结果»", - "$ref": "#/definitions/统一响应结果«文件夹上传初始化结果»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/upload/token": { - "post": { - "tags": [ - "素材管理" - ], - "summary": "获取上传凭证", - "description": "上传素材第一步:获取OSS预签名URL和凭证。前端使用凭证直传OSS后调用确认上传。支持基于角色的分类权限校验", - "operationId": "requestUploadTokenUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "上传凭证请求", - "required": false, - "schema": { - "originalRef": "素材上传令牌请求", - "$ref": "#/definitions/素材上传令牌请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«素材上传令牌信息»", - "$ref": "#/definitions/统一响应结果«素材上传令牌信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«素材上传令牌信息»", - "$ref": "#/definitions/统一响应结果«素材上传令牌信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/{materialId}": { - "get": { - "tags": [ - "素材管理" - ], - "summary": "素材详情", - "description": "返回素材完整信息,包含文件名、URL、分类、标签、文件大小、上传者等。受角色分类权限限制。\n\n**关联字典**:\n- file_type:文件类型(显示)", - "operationId": "getMaterialUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "materialId", - "in": "path", - "description": "素材ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«素材信息»", - "$ref": "#/definitions/统一响应结果«素材信息»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«素材信息»", - "$ref": "#/definitions/统一响应结果«素材信息»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "素材管理" - ], - "summary": "更新素材信息", - "description": "**关联字典**:\n- material_tag:素材标签(编辑时选择标签)", - "operationId": "updateMaterialUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "materialId", - "in": "path", - "description": "素材ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "素材更新请求", - "required": false, - "schema": { - "originalRef": "更新素材请求", - "$ref": "#/definitions/更新素材请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«素材信息»", - "$ref": "#/definitions/统一响应结果«素材信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«素材信息»", - "$ref": "#/definitions/统一响应结果«素材信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "素材管理" - ], - "summary": "删除素材", - "description": "删除素材记录。如果素材存在引用关系(被景区、酒店等使用),则不允许删除", - "operationId": "deleteMaterialUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "materialId", - "in": "path", - "description": "素材ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/{materialId}/refs": { - "get": { - "tags": [ - "素材管理" - ], - "summary": "查看素材引用记录", - "description": "查看素材被哪些业务实体引用(如景区封面、酒店轮播图等),用于判断素材是否可安全删除", - "operationId": "getMaterialRefsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "materialId", - "in": "path", - "description": "素材ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«素材引用信息»»", - "$ref": "#/definitions/统一响应结果«List«素材引用信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«素材引用信息»»", - "$ref": "#/definitions/统一响应结果«List«素材引用信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/material/{materialId}/tags": { - "put": { - "tags": [ - "素材管理" - ], - "summary": "更新素材标签", - "description": "全量替换单个素材的标签,传入新的标签ID列表", - "operationId": "updateMaterialTagsUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "materialId", - "in": "path", - "description": "素材ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "素材标签更新请求", - "required": false, - "schema": { - "originalRef": "更新素材标签请求", - "$ref": "#/definitions/更新素材标签请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/material/miniprogram": { - "get": { - "tags": [ - "小程序-素材" - ], - "summary": "获取小程序分类下的全部素材", - "description": "返回miniprogram分类下的所有素材,用于小程序端展示公共素材资源(如引导页图片、默认头像等)", - "operationId": "listMiniprogramMaterialsUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«素材信息»»", - "$ref": "#/definitions/统一响应结果«List«素材信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«素材信息»»", - "$ref": "#/definitions/统一响应结果«List«素材信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - } - }, - "definitions": { - "Create subcategory request": { - "type": "object", - "required": [ - "categoryName", - "parentCode" - ], - "properties": { - "categoryName": { - "type": "string", - "example": "乌兰山", - "description": "子分类名称" - }, - "parentCode": { - "type": "string", - "example": "scenic", - "description": "根分类编码(scenic/hotel等)" - }, - "parentId": { - "type": "integer", - "format": "int64", - "example": 1234567890, - "description": "父子分类ID(为空则创建在根分类下)" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序值" - } - }, - "title": "Create subcategory request" - }, - "STS临时凭证信息": { - "type": "object", - "properties": { - "accessKeyId": { - "type": "string", - "description": "AccessKey ID" - }, - "accessKeySecret": { - "type": "string", - "description": "AccessKey Secret" - }, - "expiration": { - "type": "string", - "description": "过期时间" - }, - "securityToken": { - "type": "string", - "description": "安全令牌" - } - }, - "title": "STS临时凭证信息" - }, - "Update subcategory request": { - "type": "object", - "properties": { - "categoryName": { - "type": "string", - "example": "Hulunbuir", - "description": "Subcategory name" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "Sort order" - } - }, - "title": "Update subcategory request" - }, - "分片上传初始化结果": { - "type": "object", - "properties": { - "chunkSize": { - "type": "integer", - "format": "int32", - "description": "推荐分片大小(字节)" - }, - "uploadId": { - "type": "string", - "description": "上传ID" - } - }, - "title": "分片上传初始化结果" - }, - "分片上传初始化请求": { - "type": "object", - "required": [ - "contentType", - "fileSize", - "filename" - ], - "properties": { - "contentType": { - "type": "string", - "description": "文件MIME类型" - }, - "fileSize": { - "type": "integer", - "format": "int64", - "description": "文件大小(字节)" - }, - "filename": { - "type": "string", - "description": "文件名" - }, - "materialId": { - "type": "string", - "description": "关联素材ID(可选,用于更新已有素材)" - } - }, - "title": "分片上传初始化请求" - }, - "分片上传取消请求": { - "type": "object", - "required": [ - "uploadId" - ], - "properties": { - "uploadId": { - "type": "string", - "description": "上传ID" - } - }, - "title": "分片上传取消请求" - }, - "分片上传完成请求": { - "type": "object", - "required": [ - "uploadId" - ], - "properties": { - "uploadId": { - "type": "string", - "description": "上传ID" - } - }, - "title": "分片上传完成请求" - }, - "分片上传结果": { - "type": "object", - "properties": { - "etag": { - "type": "string", - "description": "分片ETag" - } - }, - "title": "分片上传结果" - }, - "分类权限更新请求": { - "type": "object", - "required": [ - "categoryCodes" - ], - "properties": { - "categoryCodes": { - "type": "array", - "description": "分类编码列表", - "items": { - "type": "string" - } - } - }, - "title": "分类权限更新请求" - }, - "分页结果«素材信息»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "originalRef": "素材信息", - "$ref": "#/definitions/素材信息" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«素材信息»" - }, - "分页结果«素材标签信息»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "originalRef": "素材标签信息", - "$ref": "#/definitions/素材标签信息" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«素材标签信息»" - }, - "创建标签请求": { - "type": "object", - "required": [ - "tagName" - ], - "properties": { - "tagColor": { - "type": "string", - "example": "#409EFF", - "description": "标签颜色" - }, - "tagName": { - "type": "string", - "example": "风景", - "description": "标签名称" - } - }, - "title": "创建标签请求" - }, - "删除失败项": { - "type": "object", - "properties": { - "materialId": { - "type": "string", - "description": "素材ID" - }, - "reason": { - "type": "string", - "description": "失败原因" - } - }, - "title": "删除失败项" - }, - "批量删除素材请求": { - "type": "object", - "required": [ - "materialIds" - ], - "properties": { - "materialIds": { - "type": "array", - "description": "素材ID列表", - "items": { - "type": "string" - } - } - }, - "title": "批量删除素材请求" - }, - "批量删除结果": { - "type": "object", - "properties": { - "failedItems": { - "type": "array", - "description": "失败项列表", - "items": { - "originalRef": "删除失败项", - "$ref": "#/definitions/删除失败项" - } - }, - "successCount": { - "type": "integer", - "format": "int32", - "description": "成功删除数量" - } - }, - "title": "批量删除结果" - }, - "批量标签操作请求": { - "type": "object", - "required": [ - "materialIds" - ], - "properties": { - "addTagIds": { - "type": "array", - "description": "要添加的标签ID列表", - "items": { - "type": "string" - } - }, - "materialIds": { - "type": "array", - "description": "素材ID列表", - "items": { - "type": "string" - } - }, - "removeTagIds": { - "type": "array", - "description": "要移除的标签ID列表", - "items": { - "type": "string" - } - } - }, - "title": "批量标签操作请求" - }, - "文件上传凭证项": { - "type": "object", - "properties": { - "bucket": { - "type": "string", - "description": "OSS Bucket名称" - }, - "error": { - "type": "string", - "description": "错误信息(该文件获取凭证失败时)" - }, - "filename": { - "type": "string", - "description": "文件名" - }, - "folderPath": { - "type": "string", - "description": "文件夹路径" - }, - "instantUpload": { - "type": "boolean", - "description": "是否秒传(文件已存在)" - }, - "materialId": { - "type": "string", - "description": "素材ID" - }, - "ossKey": { - "type": "string", - "description": "OSS对象Key" - }, - "region": { - "type": "string", - "description": "OSS Region" - }, - "stsToken": { - "description": "STS临时凭证", - "originalRef": "STS临时凭证信息", - "$ref": "#/definitions/STS临时凭证信息" - }, - "uploadHeaders": { - "type": "object", - "description": "上传请求头", - "additionalProperties": { - "type": "string" - } - }, - "uploadMethod": { - "type": "string", - "description": "上传方式: PUT/POST" - }, - "uploadUrl": { - "type": "string", - "description": "上传URL" - } - }, - "title": "文件上传凭证项" - }, - "文件夹上传初始化结果": { - "type": "object", - "properties": { - "fileTokens": { - "type": "array", - "description": "各文件的上传凭证列表", - "items": { - "originalRef": "文件上传凭证项", - "$ref": "#/definitions/文件上传凭证项" - } - }, - "folderCategoryMap": { - "type": "object", - "description": "文件夹路径 → 子分类ID 映射", - "additionalProperties": { - "type": "string" - } - } - }, - "title": "文件夹上传初始化结果" - }, - "文件夹上传初始化请求": { - "type": "object", - "required": [ - "categoryCode", - "files", - "folderPaths" - ], - "properties": { - "categoryCode": { - "type": "string", - "example": "guide", - "description": "分类编码" - }, - "files": { - "type": "array", - "description": "文件列表", - "items": { - "originalRef": "文件夹上传文件项", - "$ref": "#/definitions/文件夹上传文件项" - } - }, - "folderPaths": { - "type": "array", - "description": "文件夹路径列表(如 [\"999\", \"999/888\"])", - "items": { - "type": "string" - } - } - }, - "title": "文件夹上传初始化请求" - }, - "文件夹上传文件项": { - "type": "object", - "required": [ - "contentType", - "fileSize", - "filename", - "folderPath", - "md5" - ], - "properties": { - "contentType": { - "type": "string", - "example": "image/jpeg", - "description": "文件MIME类型" - }, - "fileSize": { - "type": "integer", - "format": "int64", - "example": 1048576, - "description": "文件大小(字节)" - }, - "filename": { - "type": "string", - "example": "photo.jpg", - "description": "文件名" - }, - "folderPath": { - "type": "string", - "example": "999/888", - "description": "文件所在文件夹路径(与folderPaths中的路径对应)" - }, - "materialName": { - "type": "string", - "example": "风景图", - "description": "素材名称" - }, - "md5": { - "type": "string", - "example": "d41d8cd98f00b204e9800998ecf8427e", - "description": "文件MD5" - } - }, - "title": "文件夹上传文件项" - }, - "更新标签请求": { - "type": "object", - "properties": { - "tagColor": { - "type": "string", - "example": "#409EFF", - "description": "标签颜色" - }, - "tagName": { - "type": "string", - "example": "风景", - "description": "标签名称" - } - }, - "title": "更新标签请求" - }, - "更新素材标签请求": { - "type": "object", - "required": [ - "tagIds" - ], - "properties": { - "tagIds": { - "type": "array", - "description": "标签ID列表", - "items": { - "type": "string" - } - } - }, - "title": "更新素材标签请求" - }, - "更新素材请求": { - "type": "object", - "properties": { - "categoryCode": { - "type": "string", - "example": "scenic", - "description": "分类编码" - }, - "description": { - "type": "string", - "example": "九寨沟秋季风景", - "description": "素材描述" - }, - "materialName": { - "type": "string", - "example": "九寨沟风景图", - "description": "素材名称" - }, - "subCategoryId": { - "type": "integer", - "format": "int64", - "example": 2030000000000001, - "description": "子分类ID(0表示清除子分类)" - } - }, - "title": "更新素材请求" - }, - "素材上传令牌信息": { - "type": "object", - "properties": { - "bucket": { - "type": "string", - "description": "OSS Bucket名称" - }, - "contentType": { - "type": "string", - "description": "上传时必须使用的Content-Type(与预签名URL签名一致)" - }, - "expireAt": { - "type": "string", - "format": "date-time", - "description": "过期时间" - }, - "fileId": { - "type": "string", - "description": "文件ID" - }, - "instantUpload": { - "type": "boolean", - "description": "是否秒传" - }, - "material": { - "description": "秒传时返回的素材信息", - "originalRef": "素材信息", - "$ref": "#/definitions/素材信息" - }, - "materialId": { - "type": "string", - "description": "素材ID" - }, - "ossKey": { - "type": "string", - "description": "OSS对象Key" - }, - "region": { - "type": "string", - "description": "OSS Region" - }, - "stsToken": { - "description": "STS临时凭证", - "originalRef": "STS临时凭证信息", - "$ref": "#/definitions/STS临时凭证信息" - }, - "uploadMode": { - "type": "string", - "description": "上传模式: PRESIGNED_URL/STS_MULTIPART" - }, - "uploadUrl": { - "type": "string", - "description": "上传URL" - } - }, - "title": "素材上传令牌信息" - }, - "素材上传令牌请求": { - "type": "object", - "required": [ - "categoryCode", - "contentType", - "fileSize", - "filename", - "md5" - ], - "properties": { - "categoryCode": { - "type": "string", - "example": "scenic", - "description": "分类编码" - }, - "contentType": { - "type": "string", - "example": "image/jpeg", - "description": "文件MIME类型" - }, - "fileSize": { - "type": "integer", - "format": "int64", - "example": 1048576, - "description": "文件大小(字节)" - }, - "filename": { - "type": "string", - "example": "photo.jpg", - "description": "文件名" - }, - "materialName": { - "type": "string", - "example": "九寨沟风景图", - "description": "素材名称" - }, - "md5": { - "type": "string", - "example": "d41d8cd98f00b204e9800998ecf8427e", - "description": "文件MD5" - }, - "subCategoryId": { - "type": "integer", - "format": "int64", - "example": 2030000000000001, - "description": "子分类ID(文件夹上传时使用)" - } - }, - "title": "素材上传令牌请求" - }, - "素材上传确认请求": { - "type": "object", - "required": [ - "materialId" - ], - "properties": { - "description": { - "type": "string", - "example": "九寨沟秋季风景", - "description": "素材描述" - }, - "materialId": { - "type": "string", - "example": 1234567890, - "description": "素材ID" - }, - "tagIds": { - "type": "array", - "description": "标签ID列表", - "items": { - "type": "string" - } - } - }, - "title": "素材上传确认请求" - }, - "素材信息": { - "type": "object", - "properties": { - "categoryCode": { - "type": "string", - "description": "分类编码" - }, - "categoryName": { - "type": "string", - "description": "分类名称" - }, - "categoryPath": { - "type": "string", - "description": "完整分类路径(如:攻略管理 / 999 / 888)" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "string", - "description": "创建人ID" - }, - "createdByName": { - "type": "string", - "description": "创建人姓名" - }, - "description": { - "type": "string", - "description": "素材描述" - }, - "fileId": { - "type": "string", - "description": "文件ID" - }, - "fileName": { - "type": "string", - "description": "文件名" - }, - "fileSize": { - "type": "integer", - "format": "int64", - "description": "文件大小(字节)" - }, - "fileType": { - "type": "string", - "description": "文件类型" - }, - "imageHeight": { - "type": "integer", - "format": "int32", - "description": "图片高度" - }, - "imageWidth": { - "type": "integer", - "format": "int32", - "description": "图片宽度" - }, - "materialId": { - "type": "string", - "description": "素材ID" - }, - "materialName": { - "type": "string", - "description": "素材名称" - }, - "ossUrl": { - "type": "string", - "description": "OSS地址" - }, - "refCount": { - "type": "integer", - "format": "int32", - "description": "引用次数" - }, - "subCategoryId": { - "type": "string", - "description": "子分类ID" - }, - "subCategoryName": { - "type": "string", - "description": "子分类名称" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "originalRef": "素材标签信息", - "$ref": "#/definitions/素材标签信息" - } - }, - "thumbnailUrl": { - "type": "string", - "description": "缩略图地址" - } - }, - "title": "素材信息" - }, - "素材分类信息": { - "type": "object", - "properties": { - "categoryCode": { - "type": "string", - "description": "分类编码" - }, - "categoryName": { - "type": "string", - "description": "分类名称" - }, - "children": { - "type": "array", - "description": "子分类列表", - "items": { - "originalRef": "素材分类信息", - "$ref": "#/definitions/素材分类信息" - } - }, - "materialCount": { - "type": "integer", - "format": "int32", - "description": "素材数量" - }, - "parentId": { - "type": "string", - "description": "父子分类ID" - }, - "subCategoryId": { - "type": "string", - "description": "子分类ID" - } - }, - "title": "素材分类信息" - }, - "素材引用信息": { - "type": "object", - "properties": { - "bizId": { - "type": "string", - "description": "业务ID" - }, - "bizName": { - "type": "string", - "description": "业务名称" - }, - "bizType": { - "type": "string", - "description": "业务类型" - }, - "bizTypeName": { - "type": "string", - "description": "业务类型名称" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdByName": { - "type": "string", - "description": "创建人姓名" - }, - "id": { - "type": "string", - "description": "引用ID" - }, - "materialId": { - "type": "string", - "description": "素材ID" - }, - "usageType": { - "type": "string", - "description": "用途类型" - }, - "usageTypeName": { - "type": "string", - "description": "用途类型名称" - } - }, - "title": "素材引用信息" - }, - "素材标签信息": { - "type": "object", - "properties": { - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdByName": { - "type": "string", - "description": "创建人姓名" - }, - "managed": { - "type": "boolean", - "description": "是否系统管理标签" - }, - "tagColor": { - "type": "string", - "description": "标签颜色" - }, - "tagId": { - "type": "string", - "description": "标签ID" - }, - "tagName": { - "type": "string", - "description": "标签名称" - }, - "useCount": { - "type": "integer", - "format": "int32", - "description": "使用次数" - } - }, - "title": "素材标签信息" - }, - "统一响应结果«List«string»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "type": "string" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«string»»" - }, - "统一响应结果«List«素材信息»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "素材信息", - "$ref": "#/definitions/素材信息" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«素材信息»»" - }, - "统一响应结果«List«素材分类信息»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "素材分类信息", - "$ref": "#/definitions/素材分类信息" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«素材分类信息»»" - }, - "统一响应结果«List«素材引用信息»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "素材引用信息", - "$ref": "#/definitions/素材引用信息" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«素材引用信息»»" - }, - "统一响应结果«List«素材标签信息»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "素材标签信息", - "$ref": "#/definitions/素材标签信息" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«素材标签信息»»" - }, - "统一响应结果«Void»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Void»" - }, - "统一响应结果«分片上传初始化结果»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分片上传初始化结果", - "$ref": "#/definitions/分片上传初始化结果" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分片上传初始化结果»" - }, - "统一响应结果«分片上传结果»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分片上传结果", - "$ref": "#/definitions/分片上传结果" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分片上传结果»" - }, - "统一响应结果«分页结果«素材信息»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分页结果«素材信息»", - "$ref": "#/definitions/分页结果«素材信息»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«素材信息»»" - }, - "统一响应结果«分页结果«素材标签信息»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分页结果«素材标签信息»", - "$ref": "#/definitions/分页结果«素材标签信息»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«素材标签信息»»" - }, - "统一响应结果«批量删除结果»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "批量删除结果", - "$ref": "#/definitions/批量删除结果" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«批量删除结果»" - }, - "统一响应结果«文件夹上传初始化结果»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "文件夹上传初始化结果", - "$ref": "#/definitions/文件夹上传初始化结果" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«文件夹上传初始化结果»" - }, - "统一响应结果«素材上传令牌信息»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "素材上传令牌信息", - "$ref": "#/definitions/素材上传令牌信息" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«素材上传令牌信息»" - }, - "统一响应结果«素材信息»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "素材信息", - "$ref": "#/definitions/素材信息" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«素材信息»" - }, - "统一响应结果«素材分类信息»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "素材分类信息", - "$ref": "#/definitions/素材分类信息" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«素材分类信息»" - }, - "统一响应结果«素材标签信息»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "素材标签信息", - "$ref": "#/definitions/素材标签信息" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«素材标签信息»" - } - } -} \ No newline at end of file diff --git a/.swagger/hl-monitor-service.json b/.swagger/hl-monitor-service.json deleted file mode 100644 index 892f51a..0000000 --- a/.swagger/hl-monitor-service.json +++ /dev/null @@ -1,2024 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "监控服务", - "version": "1.0.0" - }, - "basePath": "/", - "paths": { - "/admin/monitor/approval-logs": { - "get": { - "tags": [ - "企微审批日志" - ], - "summary": "审批日志分页查询", - "description": "查询企微OA审批流程记录,支持按审批状态(1-审批中/2-已通过/3-已驳回/4-已撤销)、申请人、模板名称筛选\n\n**关联字典**:\n- approval_sp_status:审批状态(列表筛选+显示)", - "operationId": "listUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "applyUserName", - "in": "query", - "description": "申请人姓名", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "endTime", - "in": "query", - "description": "结束时间", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "spName", - "in": "query", - "description": "审批模板名称", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "spStatus", - "in": "query", - "description": "审批状态", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "startTime", - "in": "query", - "description": "开始时间", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«审批日志»»", - "originalRef": "统一响应结果«分页结果«审批日志»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«审批日志»»", - "originalRef": "统一响应结果«分页结果«审批日志»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/monitor/approval-logs/{id}": { - "get": { - "tags": [ - "企微审批日志" - ], - "summary": "审批日志详情", - "description": "**关联字典**:\n- approval_sp_status:审批状态(显示)", - "operationId": "detailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "日志ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«审批日志»", - "originalRef": "统一响应结果«审批日志»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«审批日志»", - "originalRef": "统一响应结果«审批日志»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/monitor/data-retention/cleanup": { - "post": { - "tags": [ - "数据清理" - ], - "summary": "手动触发数据清理", - "description": "仅超级管理员可操作。按数据保留策略清理过期日志(操作日志/错误日志/通知日志等),返回各类型清理的记录数", - "operationId": "cleanupUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,int»»", - "originalRef": "统一响应结果«Map«string,int»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,int»»", - "originalRef": "统一响应结果«Map«string,int»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/monitor/error-logs": { - "get": { - "tags": [ - "错误日志" - ], - "summary": "错误日志分页查询", - "description": "查询各微服务的异常记录,支持按服务名称、异常类名、时间范围筛选。堆栈信息仅保留com.hulalv包内的调用帧", - "operationId": "listUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "endTime", - "in": "query", - "description": "结束时间", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "exceptionClass", - "in": "query", - "description": "异常类名", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "serviceName", - "in": "query", - "description": "服务名称", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "startTime", - "in": "query", - "description": "开始时间", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«错误日志»»", - "originalRef": "统一响应结果«分页结果«错误日志»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«错误日志»»", - "originalRef": "统一响应结果«分页结果«错误日志»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/monitor/error-logs/{id}": { - "get": { - "tags": [ - "错误日志" - ], - "summary": "错误日志详情", - "description": "返回单条错误日志的完整信息,包含异常类名、错误消息、过滤后的堆栈信息(仅com.hulalv包内调用帧)、请求URL、请求参数等。", - "operationId": "detailUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "日志ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«错误日志»", - "originalRef": "统一响应结果«错误日志»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«错误日志»", - "originalRef": "统一响应结果«错误日志»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/monitor/login-logs": { - "get": { - "tags": [ - "登录日志" - ], - "summary": "登录日志分页查询", - "description": "查询管理员登录记录(代理到user-service),包含登录IP、设备信息、登录方式和登录结果\n\n**关联字典**:\n- login_status:登录状态(列表筛选+显示)", - "operationId": "listUsingGET_2", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "adminId", - "in": "query", - "description": "管理员ID", - "required": false, - "type": "integer", - "format": "int64", - "allowEmptyValue": false - }, - { - "name": "endTime", - "in": "query", - "description": "结束时间", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "startTime", - "in": "query", - "description": "开始时间", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "status", - "in": "query", - "description": "状态", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«object»", - "originalRef": "统一响应结果«object»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«object»", - "originalRef": "统一响应结果«object»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/monitor/mysql": { - "get": { - "tags": [ - "MySQL监控" - ], - "summary": "MySQL实时监控数据", - "description": "返回MySQL实时状态:连接数、QPS、缓冲池命中率、线程状态、慢查询计数等核心指标", - "operationId": "overviewUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/monitor/mysql/slow-queries": { - "get": { - "tags": [ - "MySQL监控" - ], - "summary": "慢SQL查询统计", - "description": "仅超级管理员可操作。查询慢SQL统计信息,返回执行时间最长的SQL语句及其执行次数、平均耗时等", - "operationId": "slowQueriesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "limit", - "in": "query", - "description": "返回条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "type", - "in": "query", - "description": "查询类型", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/monitor/mysql/tables": { - "get": { - "tags": [ - "MySQL监控" - ], - "summary": "表空间列表", - "description": "查询各数据库表的空间占用情况,包含数据大小、索引大小、行数等信息。可指定schema筛选,仅允许查询hl_前缀的数据库", - "operationId": "tablesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "schema", - "in": "query", - "description": "数据库名", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/monitor/notification-logs": { - "get": { - "tags": [ - "消息通知日志" - ], - "summary": "消息通知日志分页查询", - "description": "查询各渠道(短信/站内信/企微/公众号)的通知发送记录,支持按通知类型、用户、发送状态筛选\n\n**关联字典**:\n- notification_send_status:发送状态(列表筛选+显示,0=待发送/1=成功/2=失败)", - "operationId": "listUsingGET_3", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "endTime", - "in": "query", - "description": "结束时间", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "notificationType", - "in": "query", - "description": "通知类型", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "sendStatus", - "in": "query", - "description": "发送状态", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "startTime", - "in": "query", - "description": "开始时间", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "userName", - "in": "query", - "description": "用户名", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«通知日志»»", - "originalRef": "统一响应结果«分页结果«通知日志»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«通知日志»»", - "originalRef": "统一响应结果«分页结果«通知日志»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/monitor/notification-logs/{id}": { - "get": { - "tags": [ - "消息通知日志" - ], - "summary": "消息通知日志详情", - "description": "返回单条通知发送日志的完整信息,包含通知类型、接收用户、发送渠道、发送状态、失败原因(如有)、消息内容等。", - "operationId": "detailUsingGET_2", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "日志ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«通知日志»", - "originalRef": "统一响应结果«通知日志»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«通知日志»", - "originalRef": "统一响应结果«通知日志»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/monitor/operation-logs": { - "get": { - "tags": [ - "操作日志" - ], - "summary": "操作日志分页查询", - "description": "查询管理员的操作记录,支持按模块、管理员、状态、时间范围筛选。记录包含请求参数、响应结果和耗时信息\n\n**操作状态**:0=成功, 1=失败(非字典,代码常量)", - "operationId": "listUsingGET_4", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "adminId", - "in": "query", - "description": "管理员ID", - "required": false, - "type": "integer", - "format": "int64", - "allowEmptyValue": false - }, - { - "name": "endTime", - "in": "query", - "description": "结束时间", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "module", - "in": "query", - "description": "模块名称", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "startTime", - "in": "query", - "description": "开始时间", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "status", - "in": "query", - "description": "状态", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«操作日志»»", - "originalRef": "统一响应结果«分页结果«操作日志»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«操作日志»»", - "originalRef": "统一响应结果«分页结果«操作日志»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/monitor/operation-logs/{id}": { - "get": { - "tags": [ - "操作日志" - ], - "summary": "操作日志详情", - "description": "返回单条操作日志的完整信息,包含操作模块、操作描述、请求参数、响应结果、操作耗时、操作人信息、IP地址等。", - "operationId": "detailUsingGET_3", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "日志ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«操作日志»", - "originalRef": "统一响应结果«操作日志»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«操作日志»", - "originalRef": "统一响应结果«操作日志»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/monitor/redis": { - "get": { - "tags": [ - "Redis监控" - ], - "summary": "Redis实时监控数据", - "description": "返回Redis实时状态:内存使用量、连接数、Key数量、命中率、每秒命令数等核心指标", - "operationId": "overviewUsingGET_1", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/monitor/rocketmq": { - "get": { - "tags": [ - "RocketMQ监控" - ], - "summary": "RocketMQ概览", - "description": "返回RocketMQ集群状态:Broker状态、Topic数量、消息积压量、生产者/消费者连接数等核心指标", - "operationId": "overviewUsingGET_2", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/monitor/rocketmq/consumer-groups": { - "get": { - "tags": [ - "RocketMQ监控" - ], - "summary": "消费者组统计", - "description": "返回各消费者组的消费进度、积压量和在线消费者实例信息", - "operationId": "consumerGroupStatsUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/monitor/rocketmq/topics": { - "get": { - "tags": [ - "RocketMQ监控" - ], - "summary": "Topic统计", - "description": "返回各Topic的消息量、最新偏移量和消费进度等信息", - "operationId": "topicStatsUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/monitor/services": { - "get": { - "tags": [ - "服务监控" - ], - "summary": "微服务列表和健康状态", - "description": "从Nacos注册中心获取所有微服务的实例列表和健康状态,包含IP、端口、注册时间和健康检查结果", - "operationId": "listUsingGET_5", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - } - }, - "definitions": { - "Map«string,int»": { - "type": "object", - "title": "Map«string,int»", - "additionalProperties": { - "$ref": "#/definitions/Integer", - "originalRef": "Integer" - } - }, - "Map«string,object»": { - "type": "object", - "title": "Map«string,object»", - "additionalProperties": { - "type": "object" - } - }, - "Map«string,object»_1": { - "type": "object", - "title": "Map«string,object»_1", - "additionalProperties": { - "type": "object" - } - }, - "Map«string,object»_2": { - "type": "object", - "title": "Map«string,object»_2", - "additionalProperties": { - "type": "object" - } - }, - "Map«string,object»_3": { - "type": "object", - "title": "Map«string,object»_3", - "additionalProperties": { - "type": "object" - } - }, - "Map«string,object»_4": { - "type": "object", - "title": "Map«string,object»_4", - "additionalProperties": { - "type": "object" - } - }, - "分页结果«审批日志»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/审批日志", - "originalRef": "审批日志" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«审批日志»" - }, - "分页结果«操作日志»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/操作日志", - "originalRef": "操作日志" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«操作日志»" - }, - "分页结果«通知日志»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/通知日志", - "originalRef": "通知日志" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«通知日志»" - }, - "分页结果«错误日志»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/错误日志", - "originalRef": "错误日志" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«错误日志»" - }, - "审批日志": { - "type": "object", - "properties": { - "applyData": { - "type": "string", - "description": "申请表单数据(JSON)" - }, - "applyTime": { - "type": "string", - "format": "date-time", - "description": "申请时间" - }, - "applyUserId": { - "type": "string", - "example": "zhangsan", - "description": "申请人企微UserID" - }, - "applyUserName": { - "type": "string", - "example": "张三", - "description": "申请人姓名" - }, - "approvalLogId": { - "type": "integer", - "format": "int64", - "description": "审批日志ID" - }, - "approvalNodes": { - "type": "string", - "description": "审批节点详情(JSON)" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "notifyNodes": { - "type": "string", - "description": "抄送节点详情(JSON)" - }, - "spName": { - "type": "string", - "example": "景区上架审批", - "description": "审批模板名称" - }, - "spStatus": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "审批状态: 1-审批中, 2-已通过, 3-已驳回, 4-已撤销, 6-通过后撤销, 7-已删除" - }, - "templateId": { - "type": "string", - "example": "Cxxxxxx", - "description": "审批模板ID" - }, - "thirdNo": { - "type": "string", - "example": 202603030001, - "description": "审批编号" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "审批日志" - }, - "操作日志": { - "type": "object", - "properties": { - "adminId": { - "type": "integer", - "format": "int64", - "example": 1001, - "description": "管理员ID" - }, - "adminName": { - "type": "string", - "example": "admin", - "description": "管理员名称" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "description": { - "type": "string", - "example": "新增景区", - "description": "操作描述" - }, - "duration": { - "type": "integer", - "format": "int32", - "example": 120, - "description": "耗时(毫秒)" - }, - "errorMsg": { - "type": "string", - "description": "错误信息" - }, - "ipAddress": { - "type": "string", - "example": "192.168.1.100", - "description": "IP地址" - }, - "module": { - "type": "string", - "example": "scenic", - "description": "操作模块" - }, - "operationLogId": { - "type": "integer", - "format": "int64", - "description": "操作日志ID" - }, - "requestMethod": { - "type": "string", - "example": "POST", - "description": "请求方法" - }, - "requestParams": { - "type": "string", - "description": "请求参数(JSON)" - }, - "requestUrl": { - "type": "string", - "example": "/admin/scenic/spot", - "description": "请求URL" - }, - "responseCode": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "响应状态码" - }, - "responseMsg": { - "type": "string", - "example": "success", - "description": "响应消息" - }, - "serviceName": { - "type": "string", - "example": "hl-resource-service", - "description": "服务名称" - }, - "status": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "状态: 0-成功, 1-失败" - } - }, - "title": "操作日志" - }, - "统一响应结果«List«Map«string,object»»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«Map«string,object»»»" - }, - "统一响应结果«Map«string,int»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "object", - "description": "响应数据", - "additionalProperties": { - "type": "integer", - "format": "int32" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Map«string,int»»" - }, - "统一响应结果«Map«string,object»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "object", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Map«string,object»»" - }, - "统一响应结果«object»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "object", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«object»" - }, - "统一响应结果«分页结果«审批日志»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«审批日志»", - "originalRef": "分页结果«审批日志»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«审批日志»»" - }, - "统一响应结果«分页结果«操作日志»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«操作日志»", - "originalRef": "分页结果«操作日志»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«操作日志»»" - }, - "统一响应结果«分页结果«通知日志»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«通知日志»", - "originalRef": "分页结果«通知日志»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«通知日志»»" - }, - "统一响应结果«分页结果«错误日志»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«错误日志»", - "originalRef": "分页结果«错误日志»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«错误日志»»" - }, - "统一响应结果«审批日志»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/审批日志", - "originalRef": "审批日志" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«审批日志»" - }, - "统一响应结果«操作日志»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/操作日志", - "originalRef": "操作日志" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«操作日志»" - }, - "统一响应结果«通知日志»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/通知日志", - "originalRef": "通知日志" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«通知日志»" - }, - "统一响应结果«错误日志»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/错误日志", - "originalRef": "错误日志" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«错误日志»" - }, - "通知日志": { - "type": "object", - "properties": { - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "externalUserId": { - "type": "string", - "example": "wmXXXX", - "description": "外部联系人ID" - }, - "externalUserName": { - "type": "string", - "example": "李客户", - "description": "外部联系人姓名" - }, - "failReason": { - "type": "string", - "description": "失败原因" - }, - "messageContent": { - "type": "string", - "description": "消息内容" - }, - "notificationLogId": { - "type": "integer", - "format": "int64", - "description": "通知日志ID" - }, - "notificationType": { - "type": "string", - "example": "ADD_EXTERNAL_CONTACT", - "description": "通知类型: ADD_EXTERNAL_CONTACT/DEL_FOLLOW_USER/DEL_EXTERNAL_CONTACT" - }, - "sendStatus": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "发送状态: 0-成功, 1-失败, 2-已过滤" - }, - "serviceName": { - "type": "string", - "example": "hl-callback-service", - "description": "来源服务名称" - }, - "userId": { - "type": "string", - "example": "zhangsan", - "description": "员工企微UserID" - }, - "userName": { - "type": "string", - "example": "张三", - "description": "员工姓名" - } - }, - "title": "通知日志" - }, - "错误日志": { - "type": "object", - "properties": { - "adminId": { - "type": "integer", - "format": "int64", - "example": 1001, - "description": "管理员ID" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "errorLogId": { - "type": "integer", - "format": "int64", - "description": "错误日志ID" - }, - "exceptionClass": { - "type": "string", - "example": "BusinessException", - "description": "异常类名" - }, - "exceptionMessage": { - "type": "string", - "example": "资源不存在", - "description": "异常消息" - }, - "ipAddress": { - "type": "string", - "example": "192.168.1.100", - "description": "IP地址" - }, - "requestMethod": { - "type": "string", - "example": "GET", - "description": "请求方法" - }, - "requestParams": { - "type": "string", - "description": "请求参数(JSON)" - }, - "requestUrl": { - "type": "string", - "example": "/admin/user/list", - "description": "请求URL" - }, - "serviceName": { - "type": "string", - "example": "hl-user-service", - "description": "服务名称" - }, - "stackTrace": { - "type": "string", - "description": "堆栈跟踪" - } - }, - "title": "错误日志" - } - } -} \ No newline at end of file diff --git a/.swagger/hl-mp-service.json b/.swagger/hl-mp-service.json deleted file mode 100644 index ccdb8c4..0000000 --- a/.swagger/hl-mp-service.json +++ /dev/null @@ -1,13726 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "小程序聚合服务", - "version": "1.0.0" - }, - "basePath": "/", - "paths": { - "/mp/home": { - "get": { - "tags": [ - "C端 - 首页接口" - ], - "summary": "首页数据", - "description": "聚合流程:并行获取推荐产品列表+产品线列表+轮播图 → Redis缓存5分钟 → 返回聚合数据\n\n**关联字典(BFF透传)**:\n- product_type:产品类型(产品卡片显示)\n- product_status:产品状态(透传自product-service)", - "operationId": "getHomeDataUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«首页聚合数据»", - "originalRef": "统一响应结果«首页聚合数据»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«首页聚合数据»", - "originalRef": "统一响应结果«首页聚合数据»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/search": { - "get": { - "tags": [ - "C端 - 搜索接口" - ], - "summary": "搜索产品", - "description": "按关键词搜索已上架产品(匹配产品名称和描述),支持按产品类型进一步筛选\n\n**关联字典(BFF透传)**:\n- product_type:产品类型(筛选+显示)", - "operationId": "searchUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "搜索关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数(最大50)", - "required": false, - "type": "integer", - "default": 10, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "productType", - "in": "query", - "description": "产品类型:CORE/ROUTE/CUSTOM/GROUP", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/product/lines": { - "get": { - "tags": [ - "C端 - 产品接口" - ], - "summary": "产品线列表", - "description": "返回所有已启用的产品线,用于小程序首页或筛选栏展示", - "operationId": "listLinesUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/product/list": { - "get": { - "tags": [ - "C端 - 产品接口" - ], - "summary": "产品列表", - "description": "分页查询已上架产品,支持按关键词、产品类型(CORE/ROUTE/CUSTOM/GROUP)、季节、天数、目的地、产品线筛选和排序。\n\n**GROUP(小蒙马)产品额外返回 batches 字段**(可售团期列表,按出发日期升序),每个团期包含:\n- batchId:团期ID\n- departureDate:出发日期\n- batchLabel:团期标签(如\"五一团\")\n- batchName:团期名称\n- batchStatus:团期状态\n- startingPrice:起步价(元)\n- enrolledCount:已报名人数\n- remainingSlots:剩余名额\n- isConfirmed:是否已成团\n\n**关联字典**:\n- product_type:产品类型(CORE=核心产品, ROUTE=自驾路书, CUSTOM=私人定制, GROUP=小蒙马)\n- batch_status:团期状态(ENROLLING=报名中, CONFIRMED=已成团, FULL=已满员, CLOSED=已关闭)", - "operationId": "listProductsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "destination", - "in": "query", - "description": "目的地", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "keyword", - "in": "query", - "description": "搜索关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "lineId", - "in": "query", - "description": "产品线ID", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 10, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "productType", - "in": "query", - "description": "产品类型:CORE/ROUTE/CUSTOM/GROUP", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "season", - "in": "query", - "description": "季节", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "sortBy", - "in": "query", - "description": "排序字段", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "sortDir", - "in": "query", - "description": "排序方向", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "tripDays", - "in": "query", - "description": "天数", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/product/{productId}": { - "get": { - "tags": [ - "C端 - 产品接口" - ], - "summary": "产品详情(聚合收藏状态)", - "description": "聚合流程:获取产品详情 → 并行查询收藏状态 → 异步记录足迹 → 返回聚合数据。支持未登录访问(不返回收藏状态)。\n\n**GROUP(小蒙马)产品额外返回 batches 字段**(可售团期列表),字段同产品列表。\n\n**关联字典**:\n- product_type:产品类型(CORE=核心产品, ROUTE=自驾路书, CUSTOM=私人定制, GROUP=小蒙马)\n- batch_status:团期状态(ENROLLING=报名中, CONFIRMED=已成团, FULL=已满员, CLOSED=已关闭)\n- product_status:产品状态(透传自product-service)", - "operationId": "getProductUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«C端产品详情»", - "originalRef": "统一响应结果«C端产品详情»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«C端产品详情»", - "originalRef": "统一响应结果«C端产品详情»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/product/{productId}/price-calendar": { - "get": { - "tags": [ - "C端 - 产品接口" - ], - "summary": "价格日历", - "description": "返回产品指定日期范围内的每日价格,用于日历组件展示。不传日期时默认返回未来一个月", - "operationId": "getPriceCalendarUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "endDate", - "in": "query", - "description": "结束日期", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "startDate", - "in": "query", - "description": "开始日期", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/product/{productId}/quote": { - "post": { - "tags": [ - "C端 - 产品接口" - ], - "summary": "报价计算(含早鸟优惠)", - "description": "报价流程:传入出发日期+人数 → 价格日历计算基础报价(与下单一致) → 匹配早鸟优惠方案 → 返回明细报价+优惠信息。\n\n支付方式说明:\n- FULL: 全额支付,需一次性付清全部金额\n- DEPOSIT: 定金+尾款,先付定金(比例由产品配置),出行前补齐尾款", - "operationId": "calculateQuoteUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/产品报价请求", - "originalRef": "产品报价请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品报价结果»", - "originalRef": "统一响应结果«产品报价结果»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品报价结果»", - "originalRef": "统一响应结果«产品报价结果»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/bind-by-contact": { - "post": { - "tags": [ - "C端 - 订单接口" - ], - "summary": "绑定未绑定的订单", - "description": "绑定流程:用户登录 → 完善个人资料 → 自动通过联系人手机号+姓名匹配 → 将userId=NULL的订单绑定到当前用户", - "operationId": "bindByContactUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "绑定请求体", - "required": false, - "schema": { - "$ref": "#/definitions/通过联系人信息绑定订单请求", - "originalRef": "通过联系人信息绑定订单请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«int»", - "originalRef": "统一响应结果«int»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«int»", - "originalRef": "统一响应结果«int»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/count": { - "get": { - "tags": [ - "C端 - 订单接口" - ], - "summary": "各状态订单数量", - "description": "统计当前用户各状态的订单数量,用于「我的」页面的订单状态角标展示\n\n**关联字典(BFF透传)**:\n- order_status:订单状态(状态分类统计)", - "operationId": "countByStatusUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/create": { - "post": { - "tags": [ - "C端 - 订单接口" - ], - "summary": "创建订单", - "description": "下单流程:选择产品 → 填写联系人/出行人信息 → 报价计算 → 创建订单 → 返回订单ID", - "operationId": "createOrderUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "创建订单请求体", - "required": false, - "schema": { - "$ref": "#/definitions/C端创建订单请求", - "originalRef": "C端创建订单请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«订单详情»", - "originalRef": "统一响应结果«订单详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«订单详情»", - "originalRef": "统一响应结果«订单详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/list": { - "get": { - "tags": [ - "C端 - 订单接口" - ], - "summary": "订单列表", - "description": "分页查询当前用户的订单列表,支持按状态筛选。返回订单摘要信息(不含详细出行人信息)\n\n**关联字典(BFF透传)**:\n- order_status:订单状态(列表筛选+显示)\n- product_type:产品类型(订单卡片显示)", - "operationId": "listOrdersUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "status", - "in": "query", - "description": "状态", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«订单列表项»»", - "originalRef": "统一响应结果«分页结果«订单列表项»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«订单列表项»»", - "originalRef": "统一响应结果«分页结果«订单列表项»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/lookup": { - "get": { - "tags": [ - "C端 - 订单接口" - ], - "summary": "通过联系人手机号+姓名查找订单(无需登录)", - "description": "无需登录即可查询。用于管理员代下单场景:管理员创建订单后,用户通过联系人手机号+姓名查找订单并绑定到自己账号。仅返回尚未绑定用户(userId=NULL)的订单。", - "operationId": "lookupByContactUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "contactName", - "in": "query", - "description": "联系人姓名", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "contactPhone", - "in": "query", - "description": "联系人手机号", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/refund-reasons": { - "get": { - "tags": [ - "C端 - 退款接口" - ], - "summary": "退款原因列表", - "description": "返回系统预设的退款原因选项,用于退款申请页面的原因选择", - "operationId": "listRefundReasonsUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«退款原因»»", - "originalRef": "统一响应结果«List«退款原因»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«退款原因»»", - "originalRef": "统一响应结果«List«退款原因»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/refund/{applicationId}": { - "get": { - "tags": [ - "C端 - 退款接口" - ], - "summary": "退款申请详情", - "description": "获取退款申请的完整信息,包含审核状态、退款金额、退款进度和操作记录\n\n**关联字典(BFF透传)**:\n- order_status:订单状态(显示)\n- 支付状态(非字典,代码常量):PENDING=待支付, SUCCESS=成功, CLOSED=已关闭, FAILED=失败", - "operationId": "getRefundDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "applicationId", - "in": "path", - "description": "退款申请ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款申请详情»", - "originalRef": "统一响应结果«退款申请详情»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款申请详情»", - "originalRef": "统一响应结果«退款申请详情»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/refund/{applicationId}/appeal": { - "post": { - "tags": [ - "C端 - 退款接口" - ], - "summary": "发起申诉", - "description": "退款被拒绝后,用户可在3天内发起一次申诉,由上级管理员重新审核", - "operationId": "refundAppealUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "applicationId", - "in": "path", - "description": "退款申请ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "body", - "description": "申诉请求体", - "required": false, - "schema": { - "$ref": "#/definitions/退款申诉请求", - "originalRef": "退款申诉请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款申请详情»", - "originalRef": "统一响应结果«退款申请详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款申请详情»", - "originalRef": "统一响应结果«退款申请详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/refund/{applicationId}/cancel": { - "post": { - "tags": [ - "C端 - 退款接口" - ], - "summary": "撤回退款申请", - "description": "仅PENDING状态的退款申请可撤回,撤回后订单恢复到原状态", - "operationId": "cancelRefundUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "applicationId", - "in": "path", - "description": "退款申请ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/refund/{orderId}/direct-appeal": { - "post": { - "tags": [ - "C端 - 退款接口" - ], - "summary": "直接申诉退款", - "description": "用户对退款政策计算的金额不满意,跳过退款申请直接发起申诉。\n申诉金额不能超过已付金额。流程:用户查看退款预览 → 不满意 → 直接申诉填写期望金额 → 企微OA审批", - "operationId": "directAppealUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/退款申诉请求", - "originalRef": "退款申诉请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款申请详情»", - "originalRef": "统一响应结果«退款申请详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款申请详情»", - "originalRef": "统一响应结果«退款申请详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/upcoming": { - "get": { - "tags": [ - "C端 - 订单接口" - ], - "summary": "即将出发的订单", - "description": "查询3天内即将出发的订单(状态为已确认/待出发/出行中),含合同和保险信息,按出发日期升序", - "operationId": "getUpcomingDeparturesUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«订单列表项»»", - "originalRef": "统一响应结果«List«订单列表项»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«订单列表项»»", - "originalRef": "统一响应结果«List«订单列表项»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/{orderId}": { - "get": { - "tags": [ - "C端 - 订单接口" - ], - "summary": "订单详情", - "description": "获取订单完整信息,包含产品快照、出行人列表、支付信息、合同状态等\n\n**关联字典(BFF透传)**:\n- order_status:订单状态(显示)\n- product_type:产品类型(显示)\n- contract_status:合同状态(显示)", - "operationId": "getOrderUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«订单详情»", - "originalRef": "统一响应结果«订单详情»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«订单详情»", - "originalRef": "统一响应结果«订单详情»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/{orderId}/approve-unlock": { - "post": { - "tags": [ - "C端 - 订单接口" - ], - "summary": "同意解锁订单", - "description": "用户同意管理员的修改请求,解除订单锁定状态,允许管理员继续修改订单", - "operationId": "approveUnlockUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/{orderId}/cancel": { - "post": { - "tags": [ - "C端 - 订单接口" - ], - "summary": "取消订单", - "description": "取消规则:仅PENDING_PAY/DEPOSIT_PAID状态可用户取消,取消后不可恢复", - "operationId": "cancelOrderUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "body", - "description": "body", - "required": false, - "schema": { - "$ref": "#/definitions/用户取消订单请求", - "originalRef": "用户取消订单请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/{orderId}/edit": { - "put": { - "tags": [ - "C端 - 订单接口" - ], - "summary": "修改订单", - "description": "用户可修改出发日期和出行人。仅待支付/已付定金/已支付/已确认/待付尾款/待出发状态可修改,清单已确认的订单不允许修改。修改后重走内部流程", - "operationId": "editOrderUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/修改订单请求", - "originalRef": "修改订单请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«订单详情»", - "originalRef": "统一响应结果«订单详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«订单详情»", - "originalRef": "统一响应结果«订单详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/{orderId}/refund": { - "post": { - "tags": [ - "C端 - 退款接口" - ], - "summary": "提交退款申请", - "description": "退款流程:获取退款预览 → 选择退款原因 → 提交退款申请 → 管理员审核 → 审核通过后自动退款到原支付方式", - "operationId": "applyRefundUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "退款申请请求体", - "required": false, - "schema": { - "$ref": "#/definitions/退款申请请求", - "originalRef": "退款申请请求" - } - }, - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款申请详情»", - "originalRef": "统一响应结果«退款申请详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款申请详情»", - "originalRef": "统一响应结果«退款申请详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/{orderId}/refund-detail": { - "get": { - "tags": [ - "C端 - 退款接口" - ], - "summary": "根据订单ID获取最新退款详情", - "description": "查询订单关联的最新一条退款申请详情,无退款记录时返回null\n\n**关联字典(BFF透传)**:\n- order_status:订单状态(显示)\n- 支付状态(非字典,代码常量):PENDING=待支付, SUCCESS=成功, CLOSED=已关闭, FAILED=失败", - "operationId": "getRefundDetailByOrderUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款申请详情»", - "originalRef": "统一响应结果«退款申请详情»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款申请详情»", - "originalRef": "统一响应结果«退款申请详情»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/{orderId}/refund-preview": { - "get": { - "tags": [ - "C端 - 退款接口" - ], - "summary": "退款金额预览", - "description": "根据退款政策和订单出发日期计算可退金额,展示退款比例和扣除金额明细", - "operationId": "refundPreviewUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款预览»", - "originalRef": "统一响应结果«退款预览»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款预览»", - "originalRef": "统一响应结果«退款预览»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/{orderId}/remark": { - "put": { - "tags": [ - "C端 - 订单接口" - ], - "summary": "添加/修改订单备注", - "description": "用户在订单详情页添加或修改备注。备注对管理端可见。\n请求体:{\"remark\": \"备注内容\"}", - "operationId": "updateRemarkUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - { - "name": "orderId", - "in": "path", - "description": "orderId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/{orderId}/resources": { - "get": { - "tags": [ - "C端 - 订单接口" - ], - "summary": "订单资源详情(按分类)", - "description": "解析产品快照,提取资源详情按分类返回", - "operationId": "getOrderResourcesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,List«Map«string,object»»»»", - "originalRef": "统一响应结果«Map«string,List«Map«string,object»»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,List«Map«string,object»»»»", - "originalRef": "统一响应结果«Map«string,List«Map«string,object»»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/{orderId}/transport": { - "post": { - "tags": [ - "小程序-订单交通信息" - ], - "summary": "填写交通信息", - "description": "用户填写去程/回程的航班或火车信息。\n\n**请求字段**:\n- legType: OUTBOUND=去程, RETURN=回程\n- transportType: FLIGHT=航班, TRAIN=火车\n- transportNo: 航班号(如CA1234)或车次(如G71)\n- departureStation: 出发站(选填)\n- arrivalStation: 到达站(选填)\n- travelDate: 乘坐日期(yyyy-MM-dd)\n- remark: 备注(选填)", - "operationId": "addTransportUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "type": "object" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/{orderId}/transports": { - "get": { - "tags": [ - "小程序-订单交通信息" - ], - "summary": "查看订单交通信息(含实时动态)", - "description": "返回订单的去程/回程交通信息,自动从飞常准查询实时航班/火车状态", - "operationId": "listTransportsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/order/{orderId}/urge": { - "post": { - "tags": [ - "C端 - 订单接口" - ], - "summary": "催单", - "description": "提醒定制师尽快处理订单内部流程,通过企业微信发送消息。每个订单2小时内只能催一次", - "operationId": "urgeOrderUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/invoice/apply": { - "post": { - "tags": [ - "C端 - 发票接口" - ], - "summary": "申请开票", - "description": "开票流程:订单完成后 → 填写发票信息(抬头/税号/类型) → 提交开票申请 → 管理员处理 → 发送电子发票", - "operationId": "applyInvoiceUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "开票请求体", - "required": false, - "schema": { - "$ref": "#/definitions/发票申请请求", - "originalRef": "发票申请请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/invoice/order/{orderId}": { - "get": { - "tags": [ - "C端 - 发票接口" - ], - "summary": "通过订单ID查询发票", - "description": "查询指定订单的发票信息,如果订单未开票则返回null", - "operationId": "getInvoiceByOrderIdUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/invoice/{id}": { - "get": { - "tags": [ - "C端 - 发票接口" - ], - "summary": "发票详情", - "description": "获取发票的完整信息,包含开票状态、发票抬头、税号、金额、电子发票文件链接等", - "operationId": "getInvoiceDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "发票ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/invoice/{invoiceId}/reissue": { - "post": { - "tags": [ - "C端 - 发票接口" - ], - "summary": "发票换开", - "description": "对已开发票申请换开(修改抬头/税号等),原发票作废后重新开具新发票", - "operationId": "reissueInvoiceUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "invoiceId", - "in": "path", - "description": "发票ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/发票换开请求", - "originalRef": "发票换开请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/payment/prepay": { - "post": { - "tags": [ - "C端 - 支付接口" - ], - "summary": "发起支付", - "description": "支付流程:选择支付方式(JSAPI/H5) → 调用微信支付API → 返回支付参数 → 前端调起微信支付\n\n**支付状态**:PENDING=待支付, SUCCESS=成功, CLOSED=已关闭, FAILED=失败(非字典,代码常量)", - "operationId": "prepayUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "支付请求体", - "required": false, - "schema": { - "$ref": "#/definitions/支付预下单请求", - "originalRef": "支付预下单请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/payment/status/{orderId}": { - "get": { - "tags": [ - "C端 - 支付接口" - ], - "summary": "查询支付状态", - "description": "**支付状态**:PENDING=待支付, SUCCESS=成功, CLOSED=已关闭, FAILED=失败(非字典,代码常量)", - "operationId": "getStatusUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/payment/transactions/{orderId}": { - "get": { - "tags": [ - "C端 - 支付接口" - ], - "summary": "订单交易记录列表", - "description": "**支付状态**:PENDING=待支付, SUCCESS=成功, CLOSED=已关闭, FAILED=失败(非字典,代码常量)", - "operationId": "listTransactionsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/trip/list": { - "get": { - "tags": [ - "C端 - 行程接口" - ], - "summary": "行程列表", - "description": "获取当前登录用户的行程列表(已确认及进行中的订单对应的行程)\n\n**关联字典(BFF透传)**:\n- order_status:订单/行程状态(显示)", - "operationId": "getTripListUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/trip/today": { - "get": { - "tags": [ - "C端 - 行程接口" - ], - "summary": "今日行程", - "description": "获取今日行程(如果有正在进行中的行程),无行程时data为null\n\n**关联字典(BFF透传)**:\n- order_status:订单/行程状态(显示)", - "operationId": "getTodayTripUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/trip/weather": { - "get": { - "tags": [ - "C端 - 行程接口" - ], - "summary": "天气查询(经纬度)", - "description": "通过和风天气API查询指定经纬度的实时天气,精度3-5公里", - "operationId": "getWeatherUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "latitude", - "in": "query", - "description": "纬度", - "required": true, - "type": "number", - "allowEmptyValue": false - }, - { - "name": "longitude", - "in": "query", - "description": "经度", - "required": true, - "type": "number", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/trip/{orderId}": { - "get": { - "tags": [ - "C端 - 行程接口" - ], - "summary": "行程详情", - "description": "获取订单对应的行程详情,含每日行程节点信息(景点/酒店/餐厅等)\n\n**关联字典(BFF透传)**:\n- order_status:订单/行程状态(显示)", - "operationId": "getTripDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/user/account": { - "delete": { - "tags": [ - "C端 - 用户接口" - ], - "summary": "注销账号", - "description": "注销后用户数据将被软删除,30天内可联系客服恢复", - "operationId": "deleteAccountUsingDELETE", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/user/login": { - "post": { - "tags": [ - "C端 - 用户接口" - ], - "summary": "微信登录", - "description": "登录流程:小程序wx.login获取code → 后端换取openid → 查找/创建用户 → 返回JWT令牌+needProfile标记", - "operationId": "loginUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/微信登录请求", - "originalRef": "微信登录请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/user/login/sms": { - "post": { - "tags": [ - "C端 - 用户接口" - ], - "summary": "短信登录", - "description": "登录流程:获取验证码 → 验证手机号+验证码 → 查找/创建用户 → 返回JWT令牌", - "operationId": "loginBySmsUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/短信验证码登录请求", - "originalRef": "短信验证码登录请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/user/logout": { - "post": { - "tags": [ - "C端 - 用户接口" - ], - "summary": "用户登出", - "description": "清除用户登录状态和服务端缓存的令牌信息。登出后需重新登录获取新令牌。\n\n**权限**:需登录。", - "operationId": "logoutUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/user/ocr/idcard": { - "post": { - "tags": [ - "C端 - 用户接口" - ], - "summary": "身份证OCR识别", - "description": "将身份证图片上传到OSS后,传入ossUrl进行OCR识别。返回姓名、身份证号、性别、民族等结构化数据,可用于自动填充出行人信息", - "operationId": "ocrIdCardUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/身份证OCR识别请求", - "originalRef": "身份证OCR识别请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/user/profile": { - "get": { - "tags": [ - "C端 - 用户接口" - ], - "summary": "获取用户信息", - "description": "获取当前登录用户的个人资料,包含头像、昵称、手机号、实名信息等", - "operationId": "getProfileUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "C端 - 用户接口" - ], - "summary": "更新用户信息", - "description": "更新当前用户的个人资料,支持部分更新(只传需要修改的字段)。首次完善资料时realName为必填", - "operationId": "updateProfileUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/更新个人资料请求", - "originalRef": "更新个人资料请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/user/sms/send": { - "post": { - "tags": [ - "C端 - 用户接口" - ], - "summary": "发送短信验证码", - "description": "向指定手机号发送登录验证码,有效期5分钟,60秒内不可重复发送", - "operationId": "sendSmsCodeUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/发送短信验证码请求", - "originalRef": "发送短信验证码请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/user/traveler": { - "get": { - "tags": [ - "C端 - 出行人接口" - ], - "summary": "出行人列表", - "description": "返回当前用户的所有出行人列表。如果用户已完善实名信息,列表中会自动包含一条「本人」虚拟记录(travelerId=0)", - "operationId": "listTravelersUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "C端 - 出行人接口" - ], - "summary": "添加出行人", - "description": "添加常用出行人信息(姓名/证件/联系方式等),下单时可快速选择。单个用户最多50个出行人", - "operationId": "addTravelerUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/出行人请求(新增/修改)", - "originalRef": "出行人请求(新增/修改)" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/user/traveler/{id}": { - "get": { - "tags": [ - "C端 - 出行人接口" - ], - "summary": "出行人详情", - "description": "获取单个出行人的完整信息(姓名、证件信息、联系方式等)。\n\n**权限**:需登录,仅能查看自己的出行人。", - "operationId": "getTravelerUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "出行人ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "C端 - 出行人接口" - ], - "summary": "更新出行人", - "description": "修改出行人信息,支持部分更新(只传需要修改的字段)。已关联订单的出行人修改不影响历史订单记录。\n\n**权限**:需登录。", - "operationId": "updateTravelerUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "出行人ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/出行人请求(新增/修改)", - "originalRef": "出行人请求(新增/修改)" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "C端 - 出行人接口" - ], - "summary": "删除出行人", - "description": "删除常用出行人记录。默认出行人不可删除,需先取消默认后再删除。\n\n**权限**:需登录。", - "operationId": "deleteTravelerUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "出行人ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/user/traveler/{id}/default": { - "put": { - "tags": [ - "C端 - 出行人接口" - ], - "summary": "设为默认出行人", - "description": "设为默认出行人后,下单时自动作为第一个出行人。每个用户只能有一个默认出行人", - "operationId": "setDefaultTravelerUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "出行人ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/user/favorite": { - "get": { - "tags": [ - "C端 - 收藏接口" - ], - "summary": "收藏列表(含资源摘要)", - "description": "分页查询收藏列表,聚合层会补充每个收藏项对应资源的摘要信息(名称、封面图、价格等)。支持按目标类型筛选。\n\n**权限**:需登录。\n\n**关联字典**:\n- favorite_resource_type:收藏资源类型(PRODUCT/SCENIC/RESTAURANT/ACTIVITY)", - "operationId": "listFavoritesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "targetType", - "in": "query", - "description": "目标类型筛选(字典:favorite_resource_type):PRODUCT/SCENIC/RESTAURANT/ACTIVITY", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«收藏列表项(含资源摘要)»»", - "originalRef": "统一响应结果«分页结果«收藏列表项(含资源摘要)»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«收藏列表项(含资源摘要)»»", - "originalRef": "统一响应结果«分页结果«收藏列表项(含资源摘要)»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "C端 - 收藏接口" - ], - "summary": "添加收藏", - "description": "将产品/景区/餐厅/活动加入收藏。同一目标重复收藏会返回已有收藏记录", - "operationId": "addFavoriteUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/收藏请求", - "originalRef": "收藏请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/user/favorite/batch": { - "delete": { - "tags": [ - "C端 - 收藏接口" - ], - "summary": "批量删除收藏", - "description": "批量删除多条收藏记录,传入收藏记录ID列表。用于收藏管理页面的批量操作。\n\n**权限**:需登录,仅能删除自己的收藏。", - "operationId": "batchDeleteFavoritesUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "ids", - "description": "收藏ID列表", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int64" - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/user/favorite/by-target": { - "delete": { - "tags": [ - "C端 - 收藏接口" - ], - "summary": "按目标取消收藏", - "description": "通过目标类型+目标ID取消收藏,适用于详情页点击取消收藏的场景(不需要知道收藏记录ID)。\n\n**权限**:需登录。", - "operationId": "deleteFavoriteByTargetUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "targetId", - "in": "query", - "description": "目标资源ID", - "required": false, - "type": "integer", - "format": "int64", - "allowEmptyValue": false - }, - { - "name": "targetType", - "in": "query", - "description": "目标类型", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/user/favorite/check": { - "get": { - "tags": [ - "C端 - 收藏接口" - ], - "summary": "检查是否已收藏", - "description": "检查当前用户是否已收藏指定资源,用于详情页收藏按钮状态显示。\n\n**权限**:需登录。", - "operationId": "checkFavoriteUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "targetId", - "in": "query", - "description": "目标资源ID", - "required": false, - "type": "integer", - "format": "int64", - "allowEmptyValue": false - }, - { - "name": "targetType", - "in": "query", - "description": "目标类型(字典:favorite_resource_type)", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«boolean»", - "originalRef": "统一响应结果«boolean»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«boolean»", - "originalRef": "统一响应结果«boolean»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/user/favorite/{id}": { - "delete": { - "tags": [ - "C端 - 收藏接口" - ], - "summary": "取消收藏", - "description": "通过收藏记录ID取消收藏,适用于收藏列表页的删除操作。\n\n**权限**:需登录,仅能删除自己的收藏。", - "operationId": "deleteFavoriteUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "收藏记录ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/user/footprint": { - "get": { - "tags": [ - "C端 - 足迹接口" - ], - "summary": "足迹列表(含资源摘要)", - "description": "分页查询浏览足迹列表,聚合层会补充每条足迹对应资源的摘要信息(名称、封面图等)。支持按资源类型筛选,按浏览时间倒序。\n\n**权限**:需登录。", - "operationId": "listFootprintsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "resourceType", - "in": "query", - "description": "资源类型筛选:PRODUCT/SCENIC/RESTAURANT/ACTIVITY", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«足迹列表项(含资源摘要)»»", - "originalRef": "统一响应结果«分页结果«足迹列表项(含资源摘要)»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«足迹列表项(含资源摘要)»»", - "originalRef": "统一响应结果«分页结果«足迹列表项(含资源摘要)»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "C端 - 足迹接口" - ], - "summary": "记录足迹", - "description": "记录用户浏览资源的足迹,同一资源重复浏览会更新浏览时间而非新增记录", - "operationId": "addFootprintUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/添加足迹请求", - "originalRef": "添加足迹请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/user/footprint/batch": { - "delete": { - "tags": [ - "C端 - 足迹接口" - ], - "summary": "批量删除足迹", - "description": "批量删除多条浏览足迹记录,传入足迹ID列表。用于足迹管理页面的批量清理。\n\n**权限**:需登录,仅能删除自己的足迹。", - "operationId": "batchDeleteFootprintsUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "ids", - "description": "足迹ID列表", - "required": false, - "schema": { - "type": "array", - "items": { - "type": "integer", - "format": "int64" - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/user/footprint/{id}": { - "delete": { - "tags": [ - "C端 - 足迹接口" - ], - "summary": "删除足迹", - "description": "删除单条浏览足迹记录。\n\n**权限**:需登录,仅能删除自己的足迹。", - "operationId": "deleteFootprintUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "足迹ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/message/list": { - "get": { - "tags": [ - "C端 - 消息接口" - ], - "summary": "消息列表", - "description": "消息列表,支持按分类筛选,按时间倒序分页返回", - "operationId": "listMessagesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "category", - "in": "query", - "description": "消息分类筛选,不传返回全部", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码,默认1", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数,默认20", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/message/read-all": { - "put": { - "tags": [ - "C端 - 消息接口" - ], - "summary": "全部标记已读", - "description": "将指定分类或全部消息标记为已读,不传category则全部已读", - "operationId": "markAllReadUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "category", - "in": "query", - "description": "消息分类,不传则将所有分类标记为已读", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/message/summary": { - "get": { - "tags": [ - "C端 - 消息接口" - ], - "summary": "消息摘要", - "description": "获取各分类的未读数量和最新一条消息,用于消息中心首页展示", - "operationId": "getSummaryUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/message/{id}": { - "delete": { - "tags": [ - "C端 - 消息接口" - ], - "summary": "删除消息", - "description": "删除单条消息", - "operationId": "deleteMessageUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "消息ID", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/message/{id}/read": { - "put": { - "tags": [ - "C端 - 消息接口" - ], - "summary": "标记已读", - "description": "标记单条消息为已读", - "operationId": "markReadUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "消息ID", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/review/create": { - "post": { - "tags": [ - "C端 - 评价接口" - ], - "summary": "创建评价", - "description": "评价流程:订单完成后 → 查询可评价目标列表 → 对每个目标(酒店/景区/活动等)提交评价 → 自动内容审核 → 审核通过后公开展示\n\n**关联字典(BFF透传)**:\n- review_status:评价审核状态(返回字段)\n- rating_level:评价等级(返回字段)", - "operationId": "createReviewUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "评价请求体", - "required": false, - "schema": { - "$ref": "#/definitions/创建评价请求", - "originalRef": "创建评价请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/review/featured": { - "get": { - "tags": [ - "C端 - 评价接口" - ], - "summary": "精选评价列表(公开)", - "description": "无需登录,返回精选评价数组,用于评价浏览页\n\n**关联字典(BFF透传)**:\n- rating_level:评价等级(显示)", - "operationId": "getFeaturedReviewsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "limit", - "in": "query", - "description": "数量限制", - "required": false, - "type": "integer", - "default": 50, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/review/my": { - "get": { - "tags": [ - "C端 - 评价接口" - ], - "summary": "我的评价列表", - "description": "**关联字典(BFF透传)**:\n- review_status:评价审核状态(显示)\n- rating_level:评价等级(显示)", - "operationId": "getMyReviewsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/review/order/{orderId}/reviewable-targets": { - "get": { - "tags": [ - "C端 - 评价接口" - ], - "summary": "订单可评价目标列表", - "description": "返回订单中可评价的资源目标列表(景区/酒店/活动等),用于评价页面展示可评价项。已评价的目标不会重复出现。\n\n**权限**:需登录。", - "operationId": "getReviewableTargetsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/review/order/{orderId}/reviewed": { - "get": { - "tags": [ - "C端 - 评价接口" - ], - "summary": "检查订单是否已评价", - "description": "检查指定订单是否已提交评价,用于订单详情页决定是否显示'去评价'按钮。", - "operationId": "isOrderReviewedUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«boolean»", - "originalRef": "统一响应结果«boolean»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«boolean»", - "originalRef": "统一响应结果«boolean»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/review/product/{productId}": { - "get": { - "tags": [ - "C端 - 评价接口" - ], - "summary": "按产品ID查看评价列表", - "description": "返回评价列表+统计数据,支持好中差评/有图/有视频筛选\n\n**关联字典(BFF透传)**:\n- rating_level:评价等级(筛选+显示)", - "operationId": "getProductReviewsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "hasImage", - "in": "query", - "description": "是否有图片", - "required": false, - "type": "boolean", - "allowEmptyValue": false - }, - { - "name": "hasVideo", - "in": "query", - "description": "是否有视频", - "required": false, - "type": "boolean", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 10, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "ratingLevel", - "in": "query", - "description": "评价等级: GOOD/MEDIUM/BAD", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/review/product/{productId}/highlights": { - "get": { - "tags": [ - "C端 - 评价接口" - ], - "summary": "产品精选评价(最高评分+最高点赞+统计)", - "description": "用于产品详情页评价区域展示", - "operationId": "getProductHighlightsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/review/rating-categories": { - "get": { - "tags": [ - "C端 - 评价接口" - ], - "summary": "评分类别列表", - "description": "从字典读取评价时需要填写的评分维度,前端据此渲染评分组件。字典类型: review_rating_category,remark字段包含扩展JSON(required/min/max)", - "operationId": "getRatingCategoriesUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/review/search": { - "get": { - "tags": [ - "C端 - 评价接口" - ], - "summary": "关键词搜索评价(公开)", - "description": "按关键词搜索已通过的评价内容,支持按目标类型和目标ID筛选\n\n**关联字典(BFF透传)**:\n- rating_level:评价等级(显示)", - "operationId": "searchReviewsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "搜索关键词", - "required": true, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "targetId", - "in": "query", - "description": "目标ID(可选)", - "required": false, - "type": "integer", - "format": "int64", - "allowEmptyValue": false - }, - { - "name": "targetType", - "in": "query", - "description": "目标类型(可选): PRODUCT/SCENIC_SPOT/ACTIVITY/HOTEL等", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/review/stats": { - "get": { - "tags": [ - "C端 - 评价接口" - ], - "summary": "评价统计(平均分、数量)", - "description": "获取指定目标的评价统计数据(平均评分、总评价数等),用于详情页评价区域展示。产品showReview关闭时返回空统计。", - "operationId": "getTargetStatsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "targetId", - "in": "query", - "description": "目标ID", - "required": false, - "type": "integer", - "format": "int64", - "allowEmptyValue": false - }, - { - "name": "targetType", - "in": "query", - "description": "目标类型", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/review/target": { - "get": { - "tags": [ - "C端 - 评价接口" - ], - "summary": "某目标的已通过评价(公开)", - "description": "**关联字典(BFF透传)**:\n- rating_level:评价等级(筛选+显示)", - "operationId": "getTargetReviewsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "hasImage", - "in": "query", - "description": "是否有图片", - "required": false, - "type": "boolean", - "allowEmptyValue": false - }, - { - "name": "hasVideo", - "in": "query", - "description": "是否有视频", - "required": false, - "type": "boolean", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "ratingLevel", - "in": "query", - "description": "评价等级: GOOD/MEDIUM/BAD", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "targetId", - "in": "query", - "description": "目标ID", - "required": false, - "type": "integer", - "format": "int64", - "allowEmptyValue": false - }, - { - "name": "targetType", - "in": "query", - "description": "目标类型", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/review/{reviewId}/like": { - "post": { - "tags": [ - "C端 - 评价接口" - ], - "summary": "点赞/取消点赞评价", - "description": "对评价进行点赞或取消点赞操作,返回当前点赞状态和点赞总数。\n\n**权限**:需登录。", - "operationId": "toggleLikeUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "reviewId", - "in": "path", - "description": "评价ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/review/{reviewId}/like/check": { - "get": { - "tags": [ - "C端 - 评价接口" - ], - "summary": "检查是否已点赞", - "description": "检查当前用户是否已点赞指定评价,用于评价列表/详情的点赞按钮状态展示。\n\n**权限**:需登录。", - "operationId": "checkLikedUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "reviewId", - "in": "path", - "description": "评价ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«boolean»", - "originalRef": "统一响应结果«boolean»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«boolean»", - "originalRef": "统一响应结果«boolean»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/designer": { - "get": { - "tags": [ - "C端 - 定制师接口" - ], - "summary": "定制师列表(含真实产品数和评分,综合排序)", - "description": "获取定制师列表,聚合层会补充每个定制师的真实产品数量和评价评分。按综合排序(评分>路线数>咨询人数),用于小程序定制师推荐页。", - "operationId": "listDesignersUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "limit", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 10, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/designer/all": { - "get": { - "tags": [ - "C端 - 定制师接口" - ], - "summary": "全部定制师(不分页,含真实产品数和评分)", - "description": "返回所有定制师,不分页,聚合层补充产品数量和评分,按综合排序。用于下拉选择、全量展示等场景。", - "operationId": "listAllDesignersUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/designer/featured": { - "get": { - "tags": [ - "C端 - 定制师接口" - ], - "summary": "推荐定制师(综合排序第一名)", - "description": "获取综合排序排名第一的定制师信息(含产品数和评分),用于首页推荐定制师卡片展示。", - "operationId": "getFeaturedDesignerUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/designer/{id}": { - "get": { - "tags": [ - "C端 - 定制师接口" - ], - "summary": "定制师详情(含产品数量和评分)", - "description": "获取定制师完整个人信息,聚合层会补充该定制师的已发布产品数量和综合评分,用于定制师个人主页展示。", - "operationId": "getDesignerDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "定制师ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/designer/{id}/products": { - "get": { - "tags": [ - "C端 - 定制师接口" - ], - "summary": "定制师已发布产品列表", - "description": "**关联字典(BFF透传)**:\n- product_type:产品类型(显示)", - "operationId": "getDesignerProductsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "定制师ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 10, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/designer/{id}/reviews": { - "get": { - "tags": [ - "C端 - 定制师接口" - ], - "summary": "定制师产品评价列表", - "description": "**关联字典(BFF透传)**:\n- rating_level:评价等级(显示)", - "operationId": "getDesignerReviewsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "定制师ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 10, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/wiki/article/{articleId}": { - "get": { - "tags": [ - "C端 - 攻略接口" - ], - "summary": "文章详情", - "description": "**关联字典(BFF透传)**:\n- wiki_status:文章状态(返回字段)", - "operationId": "getArticleUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "articleId", - "in": "path", - "description": "文章ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/wiki/categories": { - "get": { - "tags": [ - "C端 - 攻略接口" - ], - "summary": "攻略分类列表", - "description": "获取所有已启用的攻略分类,按排序值排列。用于小程序攻略频道的分类导航展示。", - "operationId": "listCategoriesUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/wiki/category/{categoryId}/articles": { - "get": { - "tags": [ - "C端 - 攻略接口" - ], - "summary": "分类文章列表", - "description": "分页查询指定攻略分类下已发布的文章列表,按发布时间倒序排列。用于攻略分类详情页。", - "operationId": "listCategoryArticlesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "categoryId", - "in": "path", - "description": "攻略分类ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 10, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/wiki/recommend-articles": { - "get": { - "tags": [ - "C端 - 攻略接口" - ], - "summary": "推荐文章列表", - "description": "获取编辑推荐的攻略文章列表(按推荐权重排序),用于首页或攻略频道的推荐位展示。", - "operationId": "listRecommendArticlesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "limit", - "in": "query", - "description": "返回条数", - "required": false, - "type": "integer", - "default": 10, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/contract/by-order/{orderId}": { - "get": { - "tags": [ - "C端 - 合同接口" - ], - "summary": "按订单查合同", - "description": "返回订单关联的最新有效合同(非作废)\n\n**关联字典(BFF透传)**:\n- contract_status:合同状态(显示)", - "operationId": "getContractByOrderUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/contract/by-order/{orderId}/all": { - "get": { - "tags": [ - "C端 - 合同接口" - ], - "summary": "按订单查所有合同", - "description": "返回订单关联的所有有效合同(TOUR+INSURANCE各一条)\n\n**关联字典(BFF透传)**:\n- contract_status:合同状态(显示)", - "operationId": "getContractsByOrderUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/contract/list": { - "get": { - "tags": [ - "C端 - 合同接口" - ], - "summary": "合同列表", - "description": "**关联字典(BFF透传)**:\n- contract_status:合同状态(列表筛选+显示)", - "operationId": "listContractsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "status", - "in": "query", - "description": "状态", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/contract/{contractId}/resend-sms": { - "post": { - "tags": [ - "C端 - 合同接口" - ], - "summary": "重新发送合同签署短信", - "description": "重新向出行人发送合同签署短信通知,适用于出行人未收到短信或短信过期的场景。\n\n**权限**:需登录。", - "operationId": "resendContractSmsUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "contractId", - "in": "path", - "description": "合同ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«boolean»", - "originalRef": "统一响应结果«boolean»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«boolean»", - "originalRef": "统一响应结果«boolean»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/contract/{id}": { - "get": { - "tags": [ - "C端 - 合同接口" - ], - "summary": "合同详情", - "description": "返回合同基本信息、签署状态、出行人签署详情及合同文件下载链接\n\n**关联字典(BFF透传)**:\n- contract_status:合同状态(显示)", - "operationId": "getContractDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "合同ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/hotel/list": { - "get": { - "tags": [ - "C端 - 酒店接口" - ], - "summary": "酒店列表", - "description": "分页查询已上架的酒店列表,支持按关键词、城市、星级筛选。聚合层透传resource-service的酒店数据。", - "operationId": "listHotelsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "city", - "in": "query", - "description": "城市", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "keyword", - "in": "query", - "description": "关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "starLevel", - "in": "query", - "description": "星级(字典: hotel_star_level)", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/hotel/room-type/{roomTypeId}": { - "get": { - "tags": [ - "C端 - 酒店接口" - ], - "summary": "房型详情", - "description": "获取房型完整信息,包含封面、轮播图、视频等素材URL,以及床型、面积、设施等详细信息。", - "operationId": "getRoomTypeDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "roomTypeId", - "in": "path", - "description": "房型ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/hotel/{hotelId}": { - "get": { - "tags": [ - "C端 - 酒店接口" - ], - "summary": "酒店详情", - "description": "获取酒店完整信息(含房型列表、图文详情、价格等),自动注入静态地图图片URL用于详情页地图展示。roomTypes字段包含已启用的房型列表。", - "operationId": "getHotelDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "hotelId", - "in": "path", - "description": "酒店ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/restaurant/list": { - "get": { - "tags": [ - "C端 - 餐厅接口" - ], - "summary": "餐厅列表", - "description": "分页查询已上架的餐厅列表,支持按关键词和城市筛选。聚合层透传resource-service的餐厅数据。", - "operationId": "listRestaurantsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "city", - "in": "query", - "description": "城市", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "keyword", - "in": "query", - "description": "关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/restaurant/{restaurantId}": { - "get": { - "tags": [ - "C端 - 餐厅接口" - ], - "summary": "餐厅详情", - "description": "获取餐厅完整信息(含菜品、图文详情等),自动注入静态地图图片URL用于详情页地图展示。", - "operationId": "getRestaurantDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "restaurantId", - "in": "path", - "description": "餐厅ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/dict/all": { - "get": { - "tags": [ - "C端 - 字典接口" - ], - "summary": "获取所有字典数据", - "description": "获取系统全部字典数据(按字典类型分组),用于小程序端的下拉选项、枚举映射等。建议前端缓存此数据", - "operationId": "getAllDictUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/badge": { - "get": { - "tags": [ - "C端 - 徽章接口" - ], - "summary": "获取徽章数据", - "description": "返回用户的徽章统计(未读消息数、待办事项数等),用于「我的」页面角标展示", - "operationId": "getBadgesUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/banner/active": { - "get": { - "tags": [ - "C端 - 轮播图接口" - ], - "summary": "获取当前生效的轮播图列表", - "description": "返回当前处于有效期内的轮播图,按排序值排列。用于小程序首页顶部轮播展示,透传自user-service。", - "operationId": "listActiveBannersUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/common/agreement/list": { - "get": { - "tags": [ - "C端 - 公共接口" - ], - "summary": "协议列表", - "description": "获取所有已上线的协议列表(不含内容,仅含类型、标题、版本)", - "operationId": "listAgreementsUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/common/agreement/{type}": { - "get": { - "tags": [ - "C端 - 公共接口" - ], - "summary": "获取协议文本", - "description": "获取指定类型的协议文本(如隐私政策、用户协议),返回富文本内容", - "operationId": "getAgreementUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "type", - "in": "path", - "description": "协议类型: privacy(隐私政策) / user(用户协议)", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/common/config": { - "get": { - "tags": [ - "C端 - 公共接口" - ], - "summary": "应用配置", - "description": "获取应用全局配置信息", - "operationId": "getConfigUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/common/contact": { - "get": { - "tags": [ - "C端 - 公共接口" - ], - "summary": "联系方式列表", - "description": "获取有效的联系方式列表(电话/微信/邮箱等)", - "operationId": "listContactsUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/common/faq": { - "get": { - "tags": [ - "C端 - 公共接口" - ], - "summary": "FAQ列表", - "description": "获取常见问题列表(按分类分组)", - "operationId": "listFaqUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/common/feedback": { - "post": { - "tags": [ - "C端 - 公共接口" - ], - "summary": "提交反馈", - "description": "提交用户反馈,支持文字内容和图片附件", - "operationId": "submitFeedbackUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "feedback", - "description": "反馈内容(含content、images、contact等字段)", - "required": true, - "schema": { - "$ref": "#/definitions/提交反馈请求", - "originalRef": "提交反馈请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/config": { - "get": { - "tags": [ - "C端 - 前端配置接口" - ], - "summary": "获取所有非敏感前端配置", - "description": "返回所有非SECRET类型的前端配置项(如主题色、客服电话、版本号等)。不含敏感配置,可安全传输给小程序端。", - "operationId": "listPublicConfigsUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/config/group/{group}": { - "get": { - "tags": [ - "C端 - 前端配置接口" - ], - "summary": "按分组获取非敏感前端配置", - "description": "按配置分组获取前端配置项,如UI分组、功能开关分组等。用于小程序按需加载特定分组的配置。", - "operationId": "listPublicConfigsByGroupUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "group", - "in": "path", - "description": "配置分组", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/wish": { - "get": { - "tags": [ - "C端 - 心愿单接口" - ], - "summary": "心愿单列表", - "description": "返回当前用户的心愿单列表,按创建时间倒序排列", - "operationId": "listWishesUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "C端 - 心愿单接口" - ], - "summary": "创建心愿", - "description": "创建旅行心愿,描述想去的地方和时间偏好,定制师可据此推荐产品", - "operationId": "createWishUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "心愿请求体", - "required": false, - "schema": { - "$ref": "#/definitions/创建祈愿请求", - "originalRef": "创建祈愿请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/explore/list": { - "get": { - "tags": [ - "C端 - 探索接口" - ], - "summary": "探索列表", - "description": "获取已启用的探索分类列表(图文攻略内容),支持综合/最新/最热排序,分页返回。用于小程序探索频道首页瀑布流展示。", - "operationId": "listUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "sortType", - "in": "query", - "description": "排序方式:comprehensive/newest/hottest", - "required": false, - "type": "string", - "default": "comprehensive", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/explore/{id}": { - "get": { - "tags": [ - "C端 - 探索接口" - ], - "summary": "探索详情", - "description": "自动增加浏览量,已登录时返回点赞/收藏状态", - "operationId": "detailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "探索分类ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/explore/{id}/favorite": { - "post": { - "tags": [ - "C端 - 探索接口" - ], - "summary": "切换收藏", - "description": "对探索内容收藏/取消收藏,返回当前收藏状态(true=已收藏)。收藏后可在'我的收藏'中查看。\n\n**权限**:需登录。", - "operationId": "toggleFavoriteUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "探索分类ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«boolean»", - "originalRef": "统一响应结果«boolean»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«boolean»", - "originalRef": "统一响应结果«boolean»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/explore/{id}/like": { - "post": { - "tags": [ - "C端 - 探索接口" - ], - "summary": "切换点赞", - "description": "对探索内容点赞/取消点赞,返回当前点赞状态(true=已点赞)。\n\n**权限**:需登录。", - "operationId": "toggleLikeUsingPOST_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "探索分类ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«boolean»", - "originalRef": "统一响应结果«boolean»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«boolean»", - "originalRef": "统一响应结果«boolean»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/explore/{id}/view": { - "post": { - "tags": [ - "C端 - 探索接口" - ], - "summary": "浏览+1", - "description": "增加探索内容的浏览计数。前端进入探索详情页时调用,无需登录。", - "operationId": "viewUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "探索分类ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/album/file/{albumFileId}/download-url": { - "get": { - "tags": [ - "C端 - 相册接口" - ], - "summary": "获取文件下载链接", - "description": "获取文件的预签名下载URL,有效期有限", - "operationId": "getDownloadUrlUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "albumFileId", - "in": "path", - "description": "相册文件ID", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«string»", - "originalRef": "统一响应结果«string»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«string»", - "originalRef": "统一响应结果«string»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/album/folder/{folderId}/files": { - "get": { - "tags": [ - "C端 - 相册接口" - ], - "summary": "文件夹下的文件列表", - "description": "获取文件夹下的文件列表(分页),含图片和视频", - "operationId": "listFilesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "folderId", - "in": "path", - "description": "文件夹ID", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "page", - "in": "query", - "description": "页码,默认1", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "size", - "in": "query", - "description": "每页数量,默认20", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/album/order/{orderId}/folders": { - "get": { - "tags": [ - "C端 - 相册接口" - ], - "summary": "订单的文件夹列表", - "description": "获取订单下的相册文件夹列表", - "operationId": "listFoldersUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/album/orders": { - "get": { - "tags": [ - "C端 - 相册接口" - ], - "summary": "有相册的订单列表", - "description": "获取当前登录用户有相册的订单列表", - "operationId": "listAlbumOrdersUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/activity/list": { - "get": { - "tags": [ - "C端 - 活动接口" - ], - "summary": "活动列表", - "description": "分页查询已上架的活动列表,支持关键词和分类筛选。聚合层透传resource-service的活动数据给小程序前端。", - "operationId": "listActivitiesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "categoryCode", - "in": "query", - "description": "分类", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "keyword", - "in": "query", - "description": "关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/activity/{activityId}": { - "get": { - "tags": [ - "C端 - 活动接口" - ], - "summary": "活动详情", - "description": "获取活动完整信息(含图文详情、价格等),自动注入静态地图图片URL用于详情页地图展示。", - "operationId": "getActivityDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "activityId", - "in": "path", - "description": "活动ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/scenic/list": { - "get": { - "tags": [ - "C端 - 景区接口" - ], - "summary": "景区列表", - "description": "分页查询已上架的景区列表,支持按关键词和城市筛选。聚合层透传resource-service的景区数据。", - "operationId": "listScenicUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "city", - "in": "query", - "description": "城市", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "keyword", - "in": "query", - "description": "关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»", - "originalRef": "统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/scenic/{scenicId}": { - "get": { - "tags": [ - "C端 - 景区接口" - ], - "summary": "景区详情", - "description": "获取景区完整信息(含季节素材、图文详情、价格等),自动注入静态地图图片URL用于详情页地图展示。", - "operationId": "getScenicDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "scenicId", - "in": "path", - "description": "景区ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/scenic/{scenicId}/nearby": { - "get": { - "tags": [ - "C端 - 景区接口" - ], - "summary": "附近景区(地理+探索分类聚合)", - "description": "聚合两个数据源:1.基于经纬度的地理位置附近景区(resource-service);2.探索分类关联的景区(user-service)。去重合并后返回,用于景区详情页底部'附近推荐'展示。", - "operationId": "getNearbyScenicUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "limit", - "in": "query", - "description": "返回条数", - "required": false, - "type": "integer", - "default": 10, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "radius", - "in": "query", - "description": "搜索半径(km)", - "required": false, - "type": "number", - "default": 50.0, - "format": "double", - "allowEmptyValue": false - }, - { - "name": "scenicId", - "in": "path", - "description": "景区ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/weather/forecast": { - "get": { - "tags": [ - "C端 - 天气接口" - ], - "summary": "根据经纬度获取天气预报", - "description": "通过和风天气API查询指定经纬度的未来7天天气预报信息", - "operationId": "getForecastWeatherUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "latitude", - "in": "query", - "description": "纬度", - "required": false, - "type": "number", - "allowEmptyValue": false - }, - { - "name": "longitude", - "in": "query", - "description": "经度", - "required": false, - "type": "number", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/weather/itinerary/{orderId}": { - "get": { - "tags": [ - "C端 - 天气接口" - ], - "summary": "获取订单行程天气", - "description": "根据订单行程节点的经纬度,批量查询每日天气信息,用于行程详情页展示", - "operationId": "getItineraryWeatherUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/weather/live": { - "get": { - "tags": [ - "C端 - 天气接口" - ], - "summary": "根据经纬度获取实况天气", - "description": "通过和风天气API查询指定经纬度的实时天气(温度、体感温度、湿度、风向等),精度3-5公里", - "operationId": "getLiveWeatherUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "latitude", - "in": "query", - "description": "纬度", - "required": false, - "type": "number", - "allowEmptyValue": false - }, - { - "name": "longitude", - "in": "query", - "description": "经度", - "required": false, - "type": "number", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/like/{targetType}/batch-check": { - "post": { - "tags": [ - "C端 - 通用点赞" - ], - "summary": "批量检查点赞状态", - "description": "批量检查当前用户是否已对多个目标点赞,返回已点赞的目标ID列表。用于列表页批量展示点赞状态。\n\n**权限**:需登录。", - "operationId": "batchCheckLikedUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "targetType", - "in": "path", - "description": "目标类型", - "required": false, - "type": "string" - }, - { - "in": "body", - "name": "targetIds", - "description": "targetIds", - "required": true, - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«string»»", - "originalRef": "统一响应结果«List«string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«string»»", - "originalRef": "统一响应结果«List«string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/like/{targetType}/{targetId}": { - "post": { - "tags": [ - "C端 - 通用点赞" - ], - "summary": "切换点赞", - "description": "点赞/取消点赞,返回 {liked: true/false, likeCount: 点赞数}", - "operationId": "toggleLikeUsingPOST_2", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "targetId", - "in": "path", - "description": "目标ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "targetType", - "in": "path", - "description": "目标类型: REVIEW/EXPLORE/GUIDE等", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/like/{targetType}/{targetId}/check": { - "get": { - "tags": [ - "C端 - 通用点赞" - ], - "summary": "检查是否已点赞", - "description": "检查当前用户是否已对指定目标点赞,用于前端点赞按钮状态展示。\n\n**权限**:需登录。", - "operationId": "checkLikeUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "targetId", - "in": "path", - "description": "目标ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "targetType", - "in": "path", - "description": "目标类型", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«boolean»", - "originalRef": "统一响应结果«boolean»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«boolean»", - "originalRef": "统一响应结果«boolean»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/custom/detail": { - "get": { - "tags": [ - "C端 - 定制需求接口" - ], - "summary": "定制需求详情", - "description": "查询单条定制需求的完整信息,包含定制师信息、需求详情、回复内容等。\n\n**关联字典**:\n- status → 字典:customize_request_status:PENDING=待处理, ACCEPTED=已接受, DESIGNING=设计中, QUOTED=已报价, COMPLETED=已完成, CANCELLED=已取消\n- travelPurpose → 字典:travel_purpose(旅游目的)\n- requestType → 字典:customize_request_type(需求类型)\n- budget → 字典:customize_budget(预算范围)", - "operationId": "detailUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "query", - "description": "定制请求ID", - "required": false, - "type": "integer", - "format": "int64", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«定制需求详情VO»", - "originalRef": "统一响应结果«定制需求详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«定制需求详情VO»", - "originalRef": "统一响应结果«定制需求详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/custom/list": { - "get": { - "tags": [ - "C端 - 定制需求接口" - ], - "summary": "定制需求列表", - "description": "分页查询当前用户的定制需求列表,按创建时间倒序。\n\n**关联字典**:\n- status → 字典:customize_request_status:PENDING=待处理, ACCEPTED=已接受, DESIGNING=设计中, QUOTED=已报价, COMPLETED=已完成, CANCELLED=已取消\n- travelPurpose → 字典:travel_purpose(旅游目的)\n- requestType → 字典:customize_request_type(需求类型)\n- budget → 字典:customize_budget(预算范围)", - "operationId": "listUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«定制需求列表项VO»»", - "originalRef": "统一响应结果«分页结果«定制需求列表项VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«定制需求列表项VO»»", - "originalRef": "统一响应结果«分页结果«定制需求列表项VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/custom/product/{productId}": { - "get": { - "tags": [ - "C端 - 定制需求接口" - ], - "summary": "查询已完成的定制产品详情", - "description": "根据产品ID查询已完成(COMPLETED/ORDERED)的定制产品详情。\n用于定制需求详情页展示定制师设计完成的产品方案。\n\n**返回字段**:产品完整信息,包括行程安排(itineraryDays)、人员配置(staffConfigs)、家庭分组(families)、定价(pricing)等。\n\n**关联字典**:\n- productType → 字典:product_type:CUSTOM=定制产品\n- status → 字典:product_status:COMPLETED=已完成(可下单), ORDERED=已下单(已有订单)\n- staffConfigs.staffType → 字典:staff_type:GUIDE=导游, GUIDE_ASSISTANT=助理导游, PHOTOGRAPHER=摄影师, LEADER=领队, OTHER=其他\n- paymentMode → 字典:payment_mode:FULL=全款, DEPOSIT=定金+尾款", - "operationId": "getCompletedCustomProductUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "定制产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«已完成定制产品详情VO»", - "originalRef": "统一响应结果«已完成定制产品详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«已完成定制产品详情VO»", - "originalRef": "统一响应结果«已完成定制产品详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/custom/products": { - "get": { - "tags": [ - "C端 - 定制需求接口" - ], - "summary": "我的已完成定制产品列表", - "description": "查询当前用户所有已完成的定制产品列表。\n聚合流程:先从定制需求中获取关联的产品ID → 再批量查询产品信息。\n\n**关联字典**:\n- productType → 字典:product_type:CUSTOM=定制产品\n- paymentMode → 字典:payment_mode:FULL=全款, DEPOSIT=定金+尾款", - "operationId": "listCompletedCustomProductsUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«已完成定制产品列表项VO»»", - "originalRef": "统一响应结果«List«已完成定制产品列表项VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«已完成定制产品列表项VO»»", - "originalRef": "统一响应结果«List«已完成定制产品列表项VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/custom/submit": { - "post": { - "tags": [ - "C端 - 定制需求接口" - ], - "summary": "提交定制需求", - "description": "用户提交定制旅行需求,系统会创建定制请求并通知定制师。\n\n**关联字典**:\n- travelPurpose → 字典:travel_purpose(旅游目的):LEISURE=休闲度假, ADVENTURE=探险体验, CULTURE=文化探访, FAMILY=亲子陪伴, ROMANCE=浪漫旅行, TEAM=团队建设, OTHER=其他\n- requestType → 字典:customize_request_type(需求类型):FAMILY_TRIP=亲子游, HONEYMOON=蜜月游, GROUP_TRIP=团建游, SENIOR_TRIP=银发游, ADVENTURE=探险游, PHOTOGRAPHY=摄影游, CULTURE=文化游, OTHER=其他\n- budget → 字典:customize_budget(预算范围):UNDER_3000=3000元以下/人, BUDGET_3000_5000=3000-5000元/人, BUDGET_5000_10000=5000-10000元/人, BUDGET_10000_20000=10000-20000元/人, ABOVE_20000=20000元以上/人, NO_LIMIT=不限预算\n- 返回字段 status → 字典:customize_request_status(定制请求状态):PENDING=待处理, ACCEPTED=已接受, DESIGNING=设计中, QUOTED=已报价, COMPLETED=已完成, CANCELLED=已取消", - "operationId": "submitUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/提交定制需求请求", - "originalRef": "提交定制需求请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«定制需求详情VO»", - "originalRef": "统一响应结果«定制需求详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«定制需求详情VO»", - "originalRef": "统一响应结果«定制需求详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/custom/{requestId}/cancel": { - "post": { - "tags": [ - "C端 - 定制需求接口" - ], - "summary": "取消定制需求", - "description": "用户取消定制需求。\n\n**业务规则**:\n- 仅 PENDING(待处理)、ACCEPTED(已接受)、DESIGNING(设计中)状态可取消\n- 已报价(QUOTED)、已完成(COMPLETED)或已取消(CANCELLED)的需求不可再次取消\n\n**关联字典**:\n- status → 字典:customize_request_status:PENDING=待处理, ACCEPTED=已接受, DESIGNING=设计中, QUOTED=已报价, COMPLETED=已完成, CANCELLED=已取消", - "operationId": "cancelUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "requestId", - "in": "path", - "description": "定制请求ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«定制需求详情VO»", - "originalRef": "统一响应结果«定制需求详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«定制需求详情VO»", - "originalRef": "统一响应结果«定制需求详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - } - }, - "definitions": { - "Map«string,object»": { - "type": "object", - "title": "Map«string,object»", - "additionalProperties": { - "type": "object" - } - }, - "Map«string,object»_1": { - "type": "object", - "title": "Map«string,object»_1", - "additionalProperties": { - "type": "object" - } - }, - "分页结果«Map«string,object»»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«Map«string,object»»" - }, - "统一响应结果«分页结果«Map«string,object»»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«Map«string,object»»", - "originalRef": "分页结果«Map«string,object»»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«Map«string,object»»»" - }, - "统一响应结果«首页聚合数据»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/首页聚合数据", - "originalRef": "首页聚合数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«首页聚合数据»" - }, - "首页聚合数据": { - "type": "object", - "properties": { - "banners": { - "type": "array", - "description": "轮播图Banner列表", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "contactInfo": { - "type": "array", - "description": "联系我们列表", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "exploreTopics": { - "type": "array", - "description": "探索专题列表", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "featuredDesigner": { - "type": "object", - "description": "推荐定制师" - }, - "featuredReviews": { - "type": "array", - "description": "首页精选评价列表", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "productLines": { - "type": "array", - "description": "产品线分类列表", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "recommendProducts": { - "type": "array", - "description": "推荐产品列表", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - } - }, - "title": "首页聚合数据" - }, - "C端产品详情": { - "type": "object", - "properties": { - "batches": { - "type": "array", - "description": "可售期数列表(仅GROUP产品,按出发日期升序)", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "chatMessages": { - "type": "array", - "description": "群聊最近消息(来自会话存档)", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "earliestBookingDate": { - "type": "string", - "description": "最早可订日期(如 2026-07-15)" - }, - "earlyBirdDiscount": { - "type": "number", - "description": "早鸟优惠金额(元/人)" - }, - "earlyBirdPlanName": { - "type": "string", - "description": "早鸟计划名称" - }, - "earlyBirdText": { - "type": "string", - "description": "早鸟优惠文字描述(如: 早鸟优惠:满2人立减50元/人)" - }, - "isFavorited": { - "type": "boolean", - "description": "是否已收藏(null表示未登录)" - }, - "participantFamilyCount": { - "type": "integer", - "format": "int32", - "description": "参与家庭数" - }, - "product": { - "type": "object", - "description": "产品详情(来自product-service)" - }, - "refundPolicies": { - "type": "object", - "description": "退款政策详情(按退款类型分组)。key=退款类型(FULL/DEPOSIT/BALANCE),value=政策详情(含policyName、rules等)" - }, - "reviewStats": { - "type": "object", - "description": "评价统计数据" - }, - "topLikedReview": { - "type": "object", - "description": "最高点赞评价" - }, - "topRatedReview": { - "type": "object", - "description": "最高评分评价" - }, - "totalSold": { - "type": "integer", - "format": "int32", - "description": "已购人数" - } - }, - "title": "C端产品详情" - }, - "Map«string,object»_2": { - "type": "object", - "title": "Map«string,object»_2", - "additionalProperties": { - "type": "object" - } - }, - "Map«string,object»_3": { - "type": "object", - "title": "Map«string,object»_3", - "additionalProperties": { - "type": "object" - } - }, - "产品报价结果": { - "type": "object", - "properties": { - "adultSellPrice": { - "type": "number", - "description": "成人单价" - }, - "available": { - "type": "boolean", - "description": "该日期是否可订(库存>0或不限库存)" - }, - "babySellPrice": { - "type": "number", - "description": "幼童单价(固定价)" - }, - "childSellPrice": { - "type": "number", - "description": "儿童单价" - }, - "childWithBedFee": { - "type": "number", - "description": "儿童加床费" - }, - "depositPayment": { - "description": "定金支付信息(仅paymentMode=DEPOSIT时有值)", - "$ref": "#/definitions/定金支付选项", - "originalRef": "定金支付选项" - }, - "earlyBirdDiscount": { - "description": "早鸟优惠信息,无优惠时为null", - "$ref": "#/definitions/早鸟优惠信息", - "originalRef": "早鸟优惠信息" - }, - "finalPrice": { - "type": "number", - "description": "最终价(早鸟优惠后)" - }, - "fullPayment": { - "description": "全额支付信息", - "$ref": "#/definitions/全额支付选项", - "originalRef": "全额支付选项" - }, - "grandTotalSellPrice": { - "type": "number", - "description": "总售价(优惠前)" - }, - "paymentMode": { - "type": "string", - "description": "支付方式: FULL(全额支付) / DEPOSIT(定金+尾款)" - }, - "stock": { - "type": "integer", - "format": "int32", - "description": "该日期剩余库存(null表示不限)" - }, - "totalAdultSellPrice": { - "type": "number", - "description": "成人小计" - }, - "totalBabySellPrice": { - "type": "number", - "description": "幼童小计" - }, - "totalChildSellPrice": { - "type": "number", - "description": "儿童小计" - }, - "totalYoungChildSellPrice": { - "type": "number", - "description": "小童小计" - }, - "youngChildSellPrice": { - "type": "number", - "description": "小童单价(儿童价×折扣比例)" - } - }, - "title": "产品报价结果" - }, - "产品报价请求": { - "type": "object", - "required": [ - "adultCount", - "departureDate" - ], - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "成人数量" - }, - "babyCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "婴儿数量" - }, - "childCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "儿童数量" - }, - "childNeedBed": { - "type": "boolean", - "example": false, - "description": "儿童是否需要床位" - }, - "departureDate": { - "type": "string", - "example": "2026-05-01", - "description": "出发日期" - }, - "youngChildCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "幼儿数量" - } - }, - "title": "产品报价请求" - }, - "全额支付选项": { - "type": "object", - "properties": { - "amount": { - "type": "number", - "description": "应付金额" - }, - "description": { - "type": "string", - "description": "说明" - } - }, - "title": "全额支付选项" - }, - "定金支付选项": { - "type": "object", - "properties": { - "balanceAmount": { - "type": "number", - "description": "尾款金额(出行前需付)" - }, - "depositAmount": { - "type": "number", - "description": "定金金额(首次需付)" - }, - "depositRatio": { - "type": "integer", - "format": "int32", - "description": "定金比例(%)" - }, - "description": { - "type": "string", - "description": "说明" - } - }, - "title": "定金支付选项" - }, - "早鸟优惠信息": { - "type": "object", - "properties": { - "discountAmount": { - "type": "number", - "description": "优惠金额" - }, - "minPeople": { - "type": "integer", - "format": "int32", - "description": "最低人数要求" - }, - "planId": { - "type": "integer", - "format": "int64", - "description": "优惠方案ID" - }, - "planName": { - "type": "string", - "description": "优惠方案名称" - } - }, - "title": "早鸟优惠信息" - }, - "统一响应结果«C端产品详情»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/C端产品详情", - "originalRef": "C端产品详情" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«C端产品详情»" - }, - "统一响应结果«List«Map«string,object»»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«Map«string,object»»»" - }, - "统一响应结果«产品报价结果»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/产品报价结果", - "originalRef": "产品报价结果" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«产品报价结果»" - }, - "C端创建订单请求": { - "type": "object", - "required": [ - "contactName", - "contactPhone", - "productId" - ], - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "成人数" - }, - "babyCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "幼童数" - }, - "childCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "儿童数" - }, - "childNeedBed": { - "type": "boolean", - "example": false, - "description": "儿童是否需要床位" - }, - "contactName": { - "type": "string", - "example": "张三", - "description": "联系人姓名" - }, - "contactPhone": { - "type": "string", - "example": 13800138000, - "description": "联系人电话" - }, - "customizerId": { - "type": "string", - "description": "定制师ID(通过分享链接下单时传入)" - }, - "departureDate": { - "type": "string", - "format": "date", - "example": "2026-05-01", - "description": "出发日期(GROUP产品从团期获取,可不传)" - }, - "groupBatchId": { - "type": "string", - "description": "团期ID(GROUP产品必填)" - }, - "productId": { - "type": "string", - "example": 1760000000000001, - "description": "产品ID" - }, - "remark": { - "type": "string", - "example": "希望安排靠窗座位", - "description": "备注" - }, - "roomCount": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "房间数(GROUP产品,默认1)" - }, - "sharerOpenid": { - "type": "string", - "description": "分享人微信openid(通过分享进入下单时传入,用于记录分享关系)" - }, - "travelers": { - "type": "array", - "description": "出行人列表", - "items": { - "$ref": "#/definitions/出行人信息", - "originalRef": "出行人信息" - } - }, - "youngChildCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "小童数" - } - }, - "title": "C端创建订单请求" - }, - "Map«string,List«Map«string,object»»»": { - "type": "object", - "title": "Map«string,List«Map«string,object»»»", - "additionalProperties": { - "$ref": "#/definitions/List", - "originalRef": "List" - } - }, - "Map«string,object»_4": { - "type": "object", - "title": "Map«string,object»_4", - "additionalProperties": { - "type": "object" - } - }, - "Map«string,object»_5": { - "type": "object", - "title": "Map«string,object»_5", - "additionalProperties": { - "type": "object" - } - }, - "Map«string,object»_6": { - "type": "object", - "title": "Map«string,object»_6", - "additionalProperties": { - "type": "object" - } - }, - "修改订单请求": { - "type": "object", - "properties": { - "departureDate": { - "type": "string", - "format": "date", - "example": "2026-05-01", - "description": "出发日期" - }, - "travelers": { - "type": "array", - "description": "出行人列表(提供则替换全部出行人)", - "items": { - "$ref": "#/definitions/出行人信息_1", - "originalRef": "出行人信息_1" - } - } - }, - "title": "修改订单请求" - }, - "出行人信息": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "birthday": { - "type": "string", - "format": "date", - "example": "1990-01-01", - "description": "出生日期" - }, - "email": { - "type": "string", - "example": "lisi@example.com", - "description": "电子邮箱" - }, - "emergencyContact": { - "type": "string", - "example": "王五", - "description": "紧急联系人" - }, - "emergencyPhone": { - "type": "string", - "example": 13800138002, - "description": "紧急联系电话" - }, - "gender": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "性别(1=男, 2=女)" - }, - "idCardNo": { - "type": "string", - "example": 110101199001011234, - "description": "证件号码" - }, - "idCardType": { - "type": "string", - "example": "ID_CARD", - "description": "证件类型" - }, - "name": { - "type": "string", - "example": "李四", - "description": "出行人姓名" - }, - "nationality": { - "type": "string", - "example": "中国", - "description": "国籍" - }, - "phone": { - "type": "string", - "example": 13800138001, - "description": "手机号" - }, - "travelerType": { - "type": "string", - "example": "ADULT", - "description": "出行人类型(ADULT/CHILD/YOUNG_CHILD/BABY)" - } - }, - "title": "出行人信息" - }, - "出行人信息_1": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "birthday": { - "type": "string", - "format": "date", - "example": "1990-01-01", - "description": "出生日期" - }, - "email": { - "type": "string", - "example": "lisi@example.com", - "description": "电子邮箱" - }, - "emergencyContact": { - "type": "string", - "example": "王五", - "description": "紧急联系人" - }, - "emergencyPhone": { - "type": "string", - "example": 13800138002, - "description": "紧急联系电话" - }, - "gender": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "性别" - }, - "idCardNo": { - "type": "string", - "example": 110101199001011234, - "description": "证件号码" - }, - "idCardType": { - "type": "string", - "example": "ID_CARD", - "description": "证件类型" - }, - "name": { - "type": "string", - "example": "李四", - "description": "出行人姓名" - }, - "nationality": { - "type": "string", - "example": "中国", - "description": "国籍" - }, - "phone": { - "type": "string", - "example": 13800138001, - "description": "手机号" - }, - "travelerType": { - "type": "string", - "example": "ADULT", - "description": "出行人类型" - } - }, - "title": "出行人信息_1" - }, - "分页结果«订单列表项»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/订单列表项", - "originalRef": "订单列表项" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«订单列表项»" - }, - "用户取消订单请求": { - "type": "object", - "properties": { - "reason": { - "type": "string", - "example": "行程有变,需要取消", - "description": "取消原因" - } - }, - "title": "用户取消订单请求" - }, - "统一响应结果«List«订单列表项»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/订单列表项", - "originalRef": "订单列表项" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«订单列表项»»" - }, - "统一响应结果«List«退款原因»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/退款原因", - "originalRef": "退款原因" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«退款原因»»" - }, - "统一响应结果«Map«string,List«Map«string,object»»»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "object", - "description": "响应数据", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Map«string,List«Map«string,object»»»»" - }, - "统一响应结果«Map«string,object»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "object", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Map«string,object»»" - }, - "统一响应结果«Void»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Void»" - }, - "统一响应结果«int»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "integer", - "format": "int32", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«int»" - }, - "统一响应结果«分页结果«订单列表项»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«订单列表项»", - "originalRef": "分页结果«订单列表项»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«订单列表项»»" - }, - "统一响应结果«订单详情»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/订单详情", - "originalRef": "订单详情" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«订单详情»" - }, - "统一响应结果«退款申请详情»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/退款申请详情", - "originalRef": "退款申请详情" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«退款申请详情»" - }, - "统一响应结果«退款预览»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/退款预览", - "originalRef": "退款预览" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«退款预览»" - }, - "订单列表项": { - "type": "object", - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "description": "成人数" - }, - "babyCount": { - "type": "integer", - "format": "int32", - "description": "幼童数" - }, - "balanceAmount": { - "type": "number", - "description": "尾款金额" - }, - "childCount": { - "type": "integer", - "format": "int32", - "description": "儿童数" - }, - "contracts": { - "type": "array", - "description": "合同列表(含signUrl/fileUrl/status等)", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "daysUntilDeparture": { - "type": "integer", - "format": "int32", - "description": "距出发天数(负数表示已出发)" - }, - "departureDate": { - "type": "string", - "format": "date", - "description": "出发日期" - }, - "depositAmount": { - "type": "number", - "description": "定金金额" - }, - "displayName": { - "type": "string", - "description": "显示名称(未支付=手机号+姓名,已支付=订单号)" - }, - "displayStatus": { - "type": "string", - "description": "C端简化状态(PENDING_PAY/PENDING_DEPARTURE/PENDING_REVIEW/REFUND/CANCELLED)" - }, - "displayStatusLabel": { - "type": "string", - "description": "C端简化状态标签" - }, - "expiryTime": { - "type": "string", - "format": "date-time", - "description": "支付截止时间(PENDING_PAY状态有效)" - }, - "insurances": { - "type": "array", - "description": "保险订单列表(含productName/extPolicyNo/status等)", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "nextAction": { - "type": "string", - "description": "下一步操作提示" - }, - "orderId": { - "type": "integer", - "format": "int64", - "description": "订单ID" - }, - "orderNo": { - "type": "string", - "description": "订单编号" - }, - "paidAmount": { - "type": "number", - "description": "已付金额" - }, - "paymentMode": { - "type": "string", - "description": "支付模式(FULL/DEPOSIT)" - }, - "processStatus": { - "type": "string", - "description": "内部流程状态(字典:order_process_status)" - }, - "processStatusLabel": { - "type": "string", - "description": "内部流程状态标签(字典:order_process_status 翻译)" - }, - "productCoverUrl": { - "type": "string", - "description": "产品封面图URL" - }, - "productId": { - "type": "integer", - "format": "int64", - "description": "产品ID" - }, - "productName": { - "type": "string", - "description": "产品名称" - }, - "productType": { - "type": "string", - "description": "产品类型(CORE/ROUTE/CUSTOM/GROUP)" - }, - "refundAmount": { - "type": "number", - "description": "实际退款金额" - }, - "status": { - "type": "string", - "description": "订单状态(PENDING_PAY/DEPOSIT_PAID/PAID/CONFIRMED/IN_PROGRESS/COMPLETED/CANCELLED)" - }, - "statusLabel": { - "type": "string", - "description": "订单状态标签" - }, - "totalPrice": { - "type": "number", - "description": "总售价" - }, - "tripDays": { - "type": "integer", - "format": "int32", - "description": "行程天数" - }, - "tripNights": { - "type": "integer", - "format": "int32", - "description": "行程晚数" - }, - "youngChildCount": { - "type": "integer", - "format": "int32", - "description": "小童数" - } - }, - "title": "订单列表项" - }, - "订单详情": { - "type": "object", - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "description": "成人数" - }, - "babyCount": { - "type": "integer", - "format": "int32", - "description": "幼童数" - }, - "balanceAmount": { - "type": "number", - "description": "尾款金额" - }, - "balancePayMethod": { - "type": "string", - "description": "尾款支付方式: ONLINE=线上 OFFLINE=线下" - }, - "balanceProofUrl": { - "type": "string", - "description": "尾款凭证URL" - }, - "cancelReason": { - "type": "string", - "description": "取消原因" - }, - "cancelledAt": { - "type": "string", - "format": "date-time", - "description": "取消时间" - }, - "checklistConfirmed": { - "type": "boolean", - "description": "清单确认状态" - }, - "childCount": { - "type": "integer", - "format": "int32", - "description": "儿童数" - }, - "completedAt": { - "type": "string", - "format": "date-time", - "description": "完成时间" - }, - "confirmedAt": { - "type": "string", - "format": "date-time", - "description": "确认时间" - }, - "contactName": { - "type": "string", - "description": "联系人姓名" - }, - "contactPhone": { - "type": "string", - "description": "联系人电话" - }, - "contracts": { - "type": "array", - "description": "合同列表(含signUrl/fileUrl/status等)", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "creatorAdminId": { - "type": "integer", - "format": "int64", - "description": "创建人管理员ID" - }, - "creatorName": { - "type": "string", - "description": "创建人姓名" - }, - "customizerId": { - "type": "integer", - "format": "int64", - "description": "定制师ID" - }, - "customizerName": { - "type": "string", - "description": "定制师姓名" - }, - "departureDate": { - "type": "string", - "format": "date", - "description": "出发日期" - }, - "depositAmount": { - "type": "number", - "description": "定金金额" - }, - "depositRatio": { - "type": "integer", - "format": "int32", - "description": "定金比例" - }, - "discountAmount": { - "type": "number", - "description": "优惠金额" - }, - "discountReason": { - "type": "string", - "description": "优惠原因" - }, - "discounts": { - "type": "array", - "description": "优惠列表", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "displayStatus": { - "type": "string", - "description": "展示状态(前端主要使用此字段展示)" - }, - "displayStatusLabel": { - "type": "string", - "description": "展示状态标签" - }, - "expiryMinutes": { - "type": "integer", - "format": "int32", - "description": "支付时限(分钟)" - }, - "expiryTime": { - "type": "string", - "format": "date-time", - "description": "支付截止时间" - }, - "hotelAssignmentDetails": { - "type": "array", - "description": "酒店分配详情(按家庭分组,含封面图)", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "hotelAssignments": { - "type": "string", - "description": "酒店分配信息JSON(原始数据)" - }, - "insurances": { - "type": "array", - "description": "保险订单列表(含productName/extPolicyNo/status/startDate/endDate等)", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "mchId": { - "type": "string", - "description": "商户号" - }, - "orderId": { - "type": "integer", - "format": "int64", - "description": "订单ID" - }, - "orderNo": { - "type": "string", - "description": "订单编号" - }, - "paidAmount": { - "type": "number", - "description": "已付金额" - }, - "paidAt": { - "type": "string", - "format": "date-time", - "description": "支付时间" - }, - "payMethodLabel": { - "type": "string", - "description": "支付方式标签(如:微信支付、定金微信+尾款线下)" - }, - "paymentMode": { - "type": "string", - "description": "支付模式(FULL/DEPOSIT)" - }, - "processStatus": { - "type": "string", - "description": "内部流程状态" - }, - "processStatusLabel": { - "type": "string", - "description": "内部流程状态标签" - }, - "productCoverUrl": { - "type": "string", - "description": "产品封面图URL" - }, - "productId": { - "type": "integer", - "format": "int64", - "description": "产品ID" - }, - "productName": { - "type": "string", - "description": "产品名称" - }, - "productSnapshot": { - "type": "string", - "description": "产品快照JSON" - }, - "productType": { - "type": "string", - "description": "产品类型(CORE/ROUTE/CUSTOM/GROUP)" - }, - "readyAt": { - "type": "string", - "format": "date-time", - "description": "就绪时间" - }, - "refundAmount": { - "type": "number", - "description": "退款金额" - }, - "refundPolicy": { - "type": "object", - "description": "退款政策(含政策名称和退款规则列表)" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "returnDate": { - "type": "string", - "format": "date", - "description": "返程日期(出发日期 + 行程天数 - 1)" - }, - "reviewed": { - "type": "boolean", - "description": "是否已评价" - }, - "roomInfo": { - "type": "string", - "description": "房间信息" - }, - "sharerOpenid": { - "type": "string", - "description": "分享者openid" - }, - "status": { - "type": "string", - "description": "订单状态(PENDING_PAY/DEPOSIT_PAID/PAID/CONFIRMED/IN_PROGRESS/COMPLETED/CANCELLED)" - }, - "statusLabel": { - "type": "string", - "description": "订单状态标签" - }, - "surchargeAmount": { - "type": "number", - "description": "费用增加总额" - }, - "surcharges": { - "type": "array", - "description": "费用增加项列表", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "timeline": { - "type": "array", - "description": "时间线列表", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "todos": { - "type": "array", - "description": "待办列表", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "totalPrice": { - "type": "number", - "description": "总售价" - }, - "transportSegments": { - "type": "array", - "description": "交通段列表", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "travelers": { - "type": "array", - "description": "出行人列表", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "tripDays": { - "type": "integer", - "format": "int32", - "description": "行程天数" - }, - "tripNights": { - "type": "integer", - "format": "int32", - "description": "行程晚数" - }, - "unlockRequestedAt": { - "type": "string", - "format": "date-time", - "description": "解锁请求时间" - }, - "userId": { - "type": "integer", - "format": "int64", - "description": "用户ID" - }, - "vehicleInfo": { - "type": "string", - "description": "车辆信息" - }, - "youngChildCount": { - "type": "integer", - "format": "int32", - "description": "小童数" - } - }, - "title": "订单详情" - }, - "退款原因": { - "type": "object", - "properties": { - "category": { - "type": "string", - "description": "分类: GENERAL(通用)/PRODUCT(产品问题)/SERVICE(服务问题)" - }, - "enabled": { - "type": "boolean", - "description": "是否启用" - }, - "reasonId": { - "type": "integer", - "format": "int64", - "description": "原因ID" - }, - "reasonText": { - "type": "string", - "description": "原因描述" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - } - }, - "title": "退款原因" - }, - "退款申诉请求": { - "type": "object", - "required": [ - "appealAmount", - "appealReason" - ], - "properties": { - "appealAmount": { - "type": "number", - "example": 100.0, - "description": "申诉退款金额" - }, - "appealReason": { - "type": "string", - "description": "申诉原因" - }, - "evidence": { - "type": "array", - "description": "申诉凭证图片URL列表", - "items": { - "type": "string" - } - } - }, - "title": "退款申诉请求" - }, - "退款申请详情": { - "type": "object", - "properties": { - "actualAmount": { - "type": "number", - "description": "实际退款金额(审核后确定)" - }, - "appealAmount": { - "type": "number", - "description": "申诉退款金额" - }, - "appealReason": { - "type": "string", - "description": "申诉原因" - }, - "appealStatus": { - "type": "integer", - "format": "int32", - "description": "申诉状态: 1-处理中, 2-通过, 3-驳回" - }, - "appealStatusLabel": { - "type": "string", - "description": "申诉状态中文标签" - }, - "appealedAt": { - "type": "string", - "format": "date-time", - "description": "申诉时间" - }, - "applicantId": { - "type": "integer", - "format": "int64", - "description": "申请人ID" - }, - "applicantName": { - "type": "string", - "description": "申请人姓名" - }, - "applicantType": { - "type": "string", - "description": "申请人类型: USER(用户)/ADMIN(管理员)" - }, - "applicationId": { - "type": "integer", - "format": "int64", - "description": "退款申请ID" - }, - "approvalNo": { - "type": "string", - "description": "审批编号(企微OA审批编号)" - }, - "autoRefundDeadline": { - "type": "string", - "format": "date-time", - "description": "自动退款截止时间" - }, - "calculatedAmount": { - "type": "number", - "description": "计算退款金额" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "daysBeforeDept": { - "type": "integer", - "format": "int32", - "description": "距出发天数" - }, - "departureDate": { - "type": "string", - "format": "date", - "description": "出发日期" - }, - "orderId": { - "type": "integer", - "format": "int64", - "description": "订单ID" - }, - "orderNo": { - "type": "string", - "description": "订单号" - }, - "paidAmount": { - "type": "number", - "description": "已付金额" - }, - "policyId": { - "type": "integer", - "format": "int64", - "description": "退款政策ID" - }, - "policyName": { - "type": "string", - "description": "退款政策名称" - }, - "productName": { - "type": "string", - "description": "产品名称" - }, - "reasonDetail": { - "type": "string", - "description": "补充说明" - }, - "reasonId": { - "type": "integer", - "format": "int64", - "description": "退款原因ID" - }, - "reasonText": { - "type": "string", - "description": "退款原因" - }, - "refundRatio": { - "type": "integer", - "format": "int32", - "description": "退款比例(百分比)" - }, - "refundType": { - "type": "string", - "description": "退款类型: DEPOSIT(定金)/BALANCE(尾款)/FULL(全款)" - }, - "refundTypeLabel": { - "type": "string", - "description": "退款类型中文标签" - }, - "refundedAt": { - "type": "string", - "format": "date-time", - "description": "退款完成时间" - }, - "reviewAdminId": { - "type": "integer", - "format": "int64", - "description": "审批管理员ID" - }, - "reviewAdminName": { - "type": "string", - "description": "审批管理员姓名" - }, - "reviewRemark": { - "type": "string", - "description": "审批备注" - }, - "reviewedAt": { - "type": "string", - "format": "date-time", - "description": "审批时间" - }, - "status": { - "type": "string", - "description": "退款状态: PENDING(待审核)/APPROVED(已通过)/REJECTED(已拒绝)/REFUNDING(退款中)/REFUNDED(已退款)/CANCELLED(已撤回)/APPEALING(申诉中)/APPEAL_APPROVED(申诉通过)/APPEAL_REJECTED(申诉驳回)" - }, - "statusLabel": { - "type": "string", - "description": "退款状态中文标签" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "退款申请详情" - }, - "退款申请请求": { - "type": "object", - "required": [ - "reasonText", - "refundType" - ], - "properties": { - "images": { - "type": "array", - "description": "退款凭证图片URL列表", - "items": { - "type": "string" - } - }, - "reasonDetail": { - "type": "string", - "description": "退款补充说明" - }, - "reasonId": { - "type": "string", - "example": 1, - "description": "退款原因ID(已废弃,改用字典)" - }, - "reasonText": { - "type": "string", - "example": "行程冲突/时间变动", - "description": "退款原因文本" - }, - "reasonValue": { - "type": "string", - "example": "schedule_conflict", - "description": "退款原因字典值" - }, - "refundType": { - "type": "string", - "example": "FULL", - "description": "退款类型(FULL/DEPOSIT/BALANCE)" - } - }, - "title": "退款申请请求" - }, - "退款规则项": { - "type": "object", - "properties": { - "matched": { - "type": "boolean", - "description": "是否当前命中此规则" - }, - "minDays": { - "type": "integer", - "format": "int32", - "description": "最低天数" - }, - "refundRatio": { - "type": "integer", - "format": "int32", - "description": "退款比例(百分比)" - } - }, - "title": "退款规则项" - }, - "退款预览": { - "type": "object", - "properties": { - "calculatedAmount": { - "type": "number", - "description": "计算退款金额" - }, - "daysBeforeDept": { - "type": "integer", - "format": "int32", - "description": "距出发天数" - }, - "departureDate": { - "type": "string", - "description": "出发日期" - }, - "message": { - "type": "string", - "description": "提示信息" - }, - "orderId": { - "type": "integer", - "format": "int64", - "description": "订单ID" - }, - "orderNo": { - "type": "string", - "description": "订单号" - }, - "paidAmount": { - "type": "number", - "description": "已付金额" - }, - "policyId": { - "type": "integer", - "format": "int64", - "description": "匹配的退款政策ID" - }, - "policyName": { - "type": "string", - "description": "匹配的退款政策名称" - }, - "refundRatio": { - "type": "integer", - "format": "int32", - "description": "退款比例(百分比)" - }, - "refundType": { - "type": "string", - "description": "退款类型: DEPOSIT/BALANCE/FULL" - }, - "refundable": { - "type": "boolean", - "description": "是否可退款" - }, - "rules": { - "type": "array", - "description": "退款规则列表(按天数降序)", - "items": { - "$ref": "#/definitions/退款规则项", - "originalRef": "退款规则项" - } - } - }, - "title": "退款预览" - }, - "通过联系人信息绑定订单请求": { - "type": "object", - "required": [ - "contactName", - "contactPhone" - ], - "properties": { - "contactName": { - "type": "string", - "example": "张三", - "description": "联系人姓名" - }, - "contactPhone": { - "type": "string", - "example": 13800138000, - "description": "联系人手机号" - } - }, - "title": "通过联系人信息绑定订单请求" - }, - "发票换开请求": { - "type": "object", - "required": [ - "invoiceTitle", - "titleType" - ], - "properties": { - "email": { - "type": "string", - "description": "接收邮箱" - }, - "invoiceTitle": { - "type": "string", - "example": "张三", - "description": "发票抬头" - }, - "taxNumber": { - "type": "string", - "description": "纳税人识别号(企业发票必填)" - }, - "titleType": { - "type": "string", - "example": "PERSONAL", - "description": "抬头类型: PERSONAL(个人)/COMPANY(企业)" - } - }, - "title": "发票换开请求" - }, - "发票申请请求": { - "type": "object", - "required": [ - "invoiceTitle", - "orderId" - ], - "properties": { - "bankAccount": { - "type": "string", - "description": "银行账号(企业发票选填)" - }, - "bankName": { - "type": "string", - "description": "开户行(企业发票选填)" - }, - "companyAddress": { - "type": "string", - "description": "企业地址(企业发票选填)" - }, - "companyPhone": { - "type": "string", - "description": "企业电话(企业发票选填)" - }, - "contactPhone": { - "type": "string", - "example": 13800138000, - "description": "联系电话" - }, - "email": { - "type": "string", - "description": "接收邮箱" - }, - "invoiceTitle": { - "type": "string", - "example": "张三", - "description": "发票抬头" - }, - "orderId": { - "type": "string", - "example": 1760000000000001, - "description": "订单ID" - }, - "remark": { - "type": "string", - "description": "备注信息" - }, - "taxNumber": { - "type": "string", - "description": "纳税人识别号(企业发票必填)" - }, - "titleType": { - "type": "string", - "example": "PERSONAL", - "description": "抬头类型: PERSONAL=个人(默认)、COMPANY=企业" - } - }, - "title": "发票申请请求" - }, - "支付预下单请求": { - "type": "object", - "required": [ - "orderId", - "tradeType" - ], - "properties": { - "clientIp": { - "type": "string", - "example": "192.168.1.1", - "description": "客户端IP(H5支付必填)" - }, - "orderId": { - "type": "string", - "example": 1760000000000001, - "description": "订单ID" - }, - "tradeType": { - "type": "string", - "example": "JSAPI", - "description": "支付方式: JSAPI(小程序支付)/H5(H5支付)" - } - }, - "title": "支付预下单请求" - }, - "Map«string,string»": { - "type": "object", - "title": "Map«string,string»", - "additionalProperties": { - "type": "string" - } - }, - "发送短信验证码请求": { - "type": "object", - "required": [ - "phone" - ], - "properties": { - "phone": { - "type": "string", - "example": 13800138000, - "description": "手机号" - } - }, - "title": "发送短信验证码请求" - }, - "微信登录请求": { - "type": "object", - "required": [ - "code" - ], - "properties": { - "code": { - "type": "string", - "example": "0a3...", - "description": "微信授权code" - } - }, - "title": "微信登录请求" - }, - "更新个人资料请求": { - "type": "object", - "properties": { - "avatar": { - "type": "string", - "example": "https://...", - "description": "头像URL" - }, - "birthday": { - "type": "string", - "format": "date", - "example": "1990-01-01", - "description": "生日" - }, - "email": { - "type": "string", - "example": "user@example.com", - "description": "邮箱" - }, - "gender": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "性别: 1=男, 2=女" - }, - "nationality": { - "type": "string", - "example": "中国", - "description": "国籍" - }, - "nickname": { - "type": "string", - "example": "旅行者小张", - "description": "昵称" - }, - "phone": { - "type": "string", - "example": 13800138000, - "description": "手机号" - }, - "realName": { - "type": "string", - "example": "张三", - "description": "真实姓名" - } - }, - "title": "更新个人资料请求" - }, - "短信验证码登录请求": { - "type": "object", - "required": [ - "code", - "phone" - ], - "properties": { - "code": { - "type": "string", - "example": 123456, - "description": "验证码" - }, - "phone": { - "type": "string", - "example": 13800138000, - "description": "手机号" - } - }, - "title": "短信验证码登录请求" - }, - "统一响应结果«Map«string,string»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "object", - "description": "响应数据", - "additionalProperties": { - "type": "string" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Map«string,string»»" - }, - "身份证OCR识别请求": { - "type": "object", - "required": [ - "imgUrl" - ], - "properties": { - "imgUrl": { - "type": "string", - "example": "https://hlgl-test.oss-cn-beijing.aliyuncs.com/xxx.jpg", - "description": "身份证图片的OSS地址" - } - }, - "title": "身份证OCR识别请求" - }, - "出行人请求(新增/修改)": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "birthday": { - "type": "string", - "format": "date", - "example": "1990-01-01", - "description": "生日" - }, - "email": { - "type": "string", - "example": "lisi@example.com", - "description": "邮箱" - }, - "emergencyContact": { - "type": "string", - "example": "王五", - "description": "紧急联系人" - }, - "emergencyPhone": { - "type": "string", - "example": 13800138002, - "description": "紧急联系电话" - }, - "gender": { - "type": "string", - "example": 1, - "description": "性别: 1=男, 2=女" - }, - "idCardNo": { - "type": "string", - "example": 110101199001011234, - "description": "证件号码" - }, - "idCardType": { - "type": "string", - "example": "ID_CARD", - "description": "证件类型: ID_CARD(身份证)/PASSPORT(护照)" - }, - "name": { - "type": "string", - "example": "李四", - "description": "姓名" - }, - "nationality": { - "type": "string", - "example": "中国", - "description": "国籍" - }, - "phone": { - "type": "string", - "example": 13800138001, - "description": "手机号" - }, - "travelerType": { - "type": "string", - "example": "ADULT", - "description": "出行人类型: ADULT/CHILD/YOUNG_CHILD/BABY" - } - }, - "title": "出行人请求(新增/修改)" - }, - "分页结果«收藏列表项(含资源摘要)»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/收藏列表项(含资源摘要)", - "originalRef": "收藏列表项(含资源摘要)" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«收藏列表项(含资源摘要)»" - }, - "收藏列表项(含资源摘要)": { - "type": "object", - "properties": { - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "收藏时间" - }, - "favoriteId": { - "type": "string", - "description": "收藏记录ID" - }, - "name": { - "type": "string", - "description": "资源名称" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "type": "string" - } - }, - "targetId": { - "type": "string", - "description": "目标资源ID" - }, - "targetType": { - "type": "string", - "description": "目标类型(字典:favorite_resource_type)" - } - }, - "title": "收藏列表项(含资源摘要)" - }, - "收藏请求": { - "type": "object", - "required": [ - "targetId", - "targetType" - ], - "properties": { - "targetId": { - "type": "string", - "example": 3001000000000000020, - "description": "目标资源ID" - }, - "targetType": { - "type": "string", - "example": "SCENIC", - "description": "目标类型(字典:favorite_resource_type)", - "enum": [ - "PRODUCT", - "SCENIC", - "RESTAURANT", - "ACTIVITY" - ] - } - }, - "title": "收藏请求" - }, - "统一响应结果«boolean»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "boolean", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«boolean»" - }, - "统一响应结果«分页结果«收藏列表项(含资源摘要)»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«收藏列表项(含资源摘要)»", - "originalRef": "分页结果«收藏列表项(含资源摘要)»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«收藏列表项(含资源摘要)»»" - }, - "分页结果«足迹列表项(含资源摘要)»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/足迹列表项(含资源摘要)", - "originalRef": "足迹列表项(含资源摘要)" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«足迹列表项(含资源摘要)»" - }, - "添加足迹请求": { - "type": "object", - "required": [ - "resourceId", - "resourceType" - ], - "properties": { - "resourceId": { - "type": "string", - "example": 3001000000000000020, - "description": "资源ID" - }, - "resourceType": { - "type": "string", - "example": "SCENIC", - "description": "资源类型: PRODUCT/SCENIC/RESTAURANT/ACTIVITY" - } - }, - "title": "添加足迹请求" - }, - "统一响应结果«分页结果«足迹列表项(含资源摘要)»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«足迹列表项(含资源摘要)»", - "originalRef": "分页结果«足迹列表项(含资源摘要)»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«足迹列表项(含资源摘要)»»" - }, - "足迹列表项(含资源摘要)": { - "type": "object", - "properties": { - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "footprintId": { - "type": "string", - "description": "足迹记录ID" - }, - "name": { - "type": "string", - "description": "资源名称" - }, - "resourceId": { - "type": "string", - "description": "资源ID" - }, - "resourceType": { - "type": "string", - "description": "资源类型:PRODUCT/SCENIC/RESTAURANT/ACTIVITY" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "type": "string" - } - }, - "visitTime": { - "type": "string", - "format": "date-time", - "description": "浏览时间" - } - }, - "title": "足迹列表项(含资源摘要)" - }, - "创建评价请求": { - "type": "object", - "required": [ - "content", - "orderId", - "ratings" - ], - "properties": { - "content": { - "type": "string", - "example": "非常棒的旅行体验!景色优美,服务周到。", - "description": "评价内容(10-500字)" - }, - "images": { - "type": "array", - "description": "评价图片列表(最多9张)", - "items": { - "$ref": "#/definitions/评价图片项", - "originalRef": "评价图片项" - } - }, - "orderId": { - "type": "integer", - "format": "int64", - "example": 1760000000000001, - "description": "订单ID" - }, - "ratings": { - "type": "object", - "description": "评分数据(key为评分类别字典的dictValue,value为1-5整数)。先调用 GET /mp/review/rating-categories 获取评分维度,required=true的必填。示例: {\"ratingItinerary\":5,\"ratingAccommodation\":4,\"ratingDriver\":5,\"ratingDining\":4,\"ratingOverall\":5}", - "additionalProperties": { - "type": "integer", - "format": "int32" - } - }, - "videos": { - "type": "array", - "description": "评价视频列表(最多3个)", - "items": { - "$ref": "#/definitions/评价视频项", - "originalRef": "评价视频项" - } - } - }, - "title": "创建评价请求" - }, - "评价图片项": { - "type": "object", - "required": [ - "imageUrl" - ], - "properties": { - "fileId": { - "type": "integer", - "format": "int64", - "description": "文件ID" - }, - "imageUrl": { - "type": "string", - "description": "图片URL" - } - }, - "title": "评价图片项" - }, - "评价视频项": { - "type": "object", - "required": [ - "videoUrl" - ], - "properties": { - "coverUrl": { - "type": "string", - "description": "视频封面URL" - }, - "duration": { - "type": "integer", - "format": "int32", - "description": "视频时长(秒)" - }, - "fileId": { - "type": "integer", - "format": "int64", - "description": "文件ID" - }, - "videoUrl": { - "type": "string", - "description": "视频URL" - } - }, - "title": "评价视频项" - }, - "Map«string,object»_7": { - "type": "object", - "title": "Map«string,object»_7", - "additionalProperties": { - "type": "object" - } - }, - "创建祈愿请求": { - "type": "object", - "required": [ - "content", - "wishType" - ], - "properties": { - "content": { - "type": "string", - "example": "祝家人平安健康", - "description": "祈愿内容,最多200字" - }, - "wishType": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "祈愿类型: 1=平安 2=健康 3=事业 4=爱情 5=财运" - } - }, - "title": "创建祈愿请求" - }, - "提交反馈请求": { - "type": "object", - "required": [ - "content" - ], - "properties": { - "contact": { - "type": "string", - "description": "联系方式" - }, - "content": { - "type": "string", - "example": "页面加载较慢", - "description": "反馈内容" - }, - "images": { - "type": "array", - "description": "图片URL列表", - "items": { - "type": "string" - } - } - }, - "title": "提交反馈请求" - }, - "统一响应结果«string»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "string", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«string»" - }, - "统一响应结果«List«string»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "type": "string" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«string»»" - }, - "人员配置项": { - "type": "object", - "properties": { - "familyIds": { - "type": "array", - "description": "所属家庭ID列表", - "items": { - "type": "string" - } - }, - "id": { - "type": "string", - "description": "记录ID" - }, - "quantity": { - "type": "integer", - "format": "int32", - "description": "数量" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "staffType": { - "type": "string", - "description": "人员类型:GUIDE=导游, GUIDE_ASSISTANT=助理导游, PHOTOGRAPHER=摄影师, LEADER=领队, OTHER=其他" - }, - "staffTypeName": { - "type": "string", - "description": "人员类型名称(中文)" - } - }, - "title": "人员配置项" - }, - "分页结果«定制需求列表项VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/定制需求列表项VO", - "originalRef": "定制需求列表项VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«定制需求列表项VO»" - }, - "定价配置": { - "type": "object", - "properties": { - "babyPrice": { - "type": "number", - "description": "婴儿价" - }, - "balanceDueDays": { - "type": "integer", - "format": "int32", - "description": "尾款支付截止天数(出发前N天)" - }, - "childDiscountPercent": { - "type": "number", - "description": "儿童折扣百分比" - }, - "childWithBed": { - "type": "number", - "description": "儿童占床价" - }, - "customTotalPrice": { - "type": "number", - "description": "定制产品总价(CUSTOM模式下使用)" - }, - "depositAmount": { - "type": "number", - "description": "定金金额" - }, - "depositRatio": { - "type": "integer", - "format": "int32", - "description": "定金比例(百分比)" - }, - "extraCostPerPerson": { - "type": "number", - "description": "每人额外成本" - }, - "insuranceFee": { - "type": "number", - "description": "保险费用" - }, - "markupPercent": { - "type": "number", - "description": "加价百分比(PERCENT模式下使用)" - }, - "mealBudget": { - "type": "number", - "description": "餐费预算" - }, - "minGroupSize": { - "type": "integer", - "format": "int32", - "description": "成团人数" - }, - "paymentType": { - "type": "string", - "description": "支付方式:FULL=全款 DEPOSIT=定金+尾款" - }, - "pricingId": { - "type": "string", - "description": "定价配置ID" - }, - "productId": { - "type": "string", - "description": "产品ID" - }, - "profitAmount": { - "type": "number", - "description": "利润金额(FIXED模式下使用)" - }, - "profitMode": { - "type": "string", - "description": "利润模式:FIXED=固定金额 PERCENT=百分比" - }, - "vehicleModelIds": { - "type": "array", - "description": "车型ID列表", - "items": { - "type": "string" - } - } - }, - "title": "定价配置" - }, - "定制需求列表项VO": { - "type": "object", - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "description": "成人数" - }, - "budget": { - "type": "string", - "description": "预算范围(字典:customize_budget)" - }, - "childCount": { - "type": "integer", - "format": "int32", - "description": "儿童数" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "days": { - "type": "integer", - "format": "int32", - "description": "期望天数" - }, - "designerAvatar": { - "type": "string", - "description": "定制师头像URL" - }, - "designerName": { - "type": "string", - "description": "定制师姓名" - }, - "destination": { - "type": "string", - "description": "目标地区" - }, - "requestId": { - "type": "integer", - "format": "int64", - "description": "请求ID" - }, - "requestType": { - "type": "string", - "description": "需求类型(字典:customize_request_type)" - }, - "startDate": { - "type": "string", - "format": "date", - "description": "期望出发日期" - }, - "status": { - "type": "string", - "description": "状态(字典:customize_request_status):PENDING=待处理, ACCEPTED=已接受, DESIGNING=设计中, QUOTED=已报价, COMPLETED=已完成, CANCELLED=已取消" - }, - "statusLabel": { - "type": "string", - "description": "状态标签(中文)" - }, - "travelPurpose": { - "type": "string", - "description": "旅游目的(字典:travel_purpose)" - }, - "userId": { - "type": "integer", - "format": "int64", - "description": "用户ID" - } - }, - "title": "定制需求列表项VO" - }, - "定制需求详情VO": { - "type": "object", - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "description": "成人数" - }, - "budget": { - "type": "string", - "description": "预算范围(字典:customize_budget)" - }, - "childCount": { - "type": "integer", - "format": "int32", - "description": "儿童数" - }, - "contactName": { - "type": "string", - "description": "联系人" - }, - "contactPhone": { - "type": "string", - "description": "联系电话" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "days": { - "type": "integer", - "format": "int32", - "description": "期望天数" - }, - "designerAvatar": { - "type": "string", - "description": "定制师头像URL" - }, - "designerId": { - "type": "integer", - "format": "int64", - "description": "指定定制师ID" - }, - "designerName": { - "type": "string", - "description": "定制师姓名" - }, - "destination": { - "type": "string", - "description": "目标地区" - }, - "endDate": { - "type": "string", - "format": "date", - "description": "期望结束日期" - }, - "productId": { - "type": "integer", - "format": "int64", - "description": "关联产品ID(定制完成后返回)" - }, - "repliedAt": { - "type": "string", - "format": "date-time", - "description": "回复时间" - }, - "reply": { - "type": "string", - "description": "定制师回复内容" - }, - "requestId": { - "type": "integer", - "format": "int64", - "description": "请求ID" - }, - "requestType": { - "type": "string", - "description": "需求类型(字典:customize_request_type)" - }, - "requirements": { - "type": "string", - "description": "详细需求描述" - }, - "startDate": { - "type": "string", - "format": "date", - "description": "期望出发日期" - }, - "status": { - "type": "string", - "description": "状态(字典:customize_request_status):PENDING=待处理, ACCEPTED=已接受, DESIGNING=设计中, QUOTED=已报价, COMPLETED=已完成, CANCELLED=已取消" - }, - "statusLabel": { - "type": "string", - "description": "状态标签(中文)" - }, - "travelPurpose": { - "type": "string", - "description": "旅游目的(字典:travel_purpose)" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "userId": { - "type": "integer", - "format": "int64", - "description": "用户ID" - } - }, - "title": "定制需求详情VO" - }, - "家庭分组项": { - "type": "object", - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "description": "成人数" - }, - "babyCount": { - "type": "integer", - "format": "int32", - "description": "幼童数" - }, - "childCount": { - "type": "integer", - "format": "int32", - "description": "儿童数" - }, - "familyId": { - "type": "string", - "description": "家庭ID" - }, - "familyName": { - "type": "string", - "description": "家庭名称(如:家庭1)" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "youngChildCount": { - "type": "integer", - "format": "int32", - "description": "小童数" - } - }, - "title": "家庭分组项" - }, - "已完成定制产品列表项VO": { - "type": "object", - "properties": { - "coverImageUrl": { - "type": "string", - "description": "封面图URL" - }, - "creatorAvatarUrl": { - "type": "string", - "description": "定制师头像URL" - }, - "departureCity": { - "type": "string", - "description": "出发城市" - }, - "destinationCity": { - "type": "string", - "description": "目的地城市" - }, - "name": { - "type": "string", - "description": "产品名称" - }, - "paymentMode": { - "type": "string", - "description": "支付模式:FULL=全款 DEPOSIT=定金+尾款" - }, - "productId": { - "type": "string", - "description": "产品ID" - }, - "productType": { - "type": "string", - "description": "产品类型:CUSTOM=定制产品" - }, - "routeMapUrl": { - "type": "string", - "description": "路径图URL" - }, - "startPrice": { - "type": "number", - "description": "起步价" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "tags": { - "type": "array", - "description": "产品标签列表", - "items": { - "type": "string" - } - }, - "tripDays": { - "type": "integer", - "format": "int32", - "description": "行程天数" - }, - "tripNights": { - "type": "integer", - "format": "int32", - "description": "行程晚数" - } - }, - "title": "已完成定制产品列表项VO" - }, - "已完成定制产品详情VO": { - "type": "object", - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "description": "成人人数" - }, - "babyCount": { - "type": "integer", - "format": "int32", - "description": "婴儿人数" - }, - "benefitsDescription": { - "type": "array", - "description": "权益说明(静态,所有产品相同)", - "items": { - "$ref": "#/definitions/权益分组", - "originalRef": "权益分组" - } - }, - "bookingTermsContent": { - "type": "string", - "description": "预订条款内容" - }, - "bookingTermsId": { - "type": "string", - "description": "预订条款ID" - }, - "bookingTermsName": { - "type": "string", - "description": "预订条款名称" - }, - "carouselImages": { - "type": "array", - "description": "轮播图列表", - "items": { - "type": "string" - } - }, - "carouselVideoUrl": { - "type": "string", - "description": "轮播视频URL" - }, - "chatMessages": { - "type": "array", - "description": "群聊消息列表", - "items": { - "$ref": "#/definitions/群聊消息", - "originalRef": "群聊消息" - } - }, - "childCount": { - "type": "integer", - "format": "int32", - "description": "儿童人数" - }, - "contactPhone": { - "type": "string", - "description": "联系电话(定制产品)" - }, - "costItems": { - "type": "array", - "description": "成本项列表(费用包含/不含/自理)", - "items": { - "$ref": "#/definitions/成本项", - "originalRef": "成本项" - } - }, - "coverImageUrl": { - "type": "string", - "description": "封面图URL" - }, - "createBy": { - "type": "string", - "description": "创建人ID" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "creatorAvatarUrl": { - "type": "string", - "description": "定制师头像URL" - }, - "creatorIntro": { - "type": "string", - "description": "创作者寄语" - }, - "customFees": { - "type": "array", - "description": "自定义费用项列表", - "items": { - "$ref": "#/definitions/自定义费用项", - "originalRef": "自定义费用项" - } - }, - "customerName": { - "type": "string", - "description": "客户姓名(定制产品)" - }, - "customizerId": { - "type": "string", - "description": "定制师ID" - }, - "departureCity": { - "type": "string", - "description": "出发城市" - }, - "departureDate": { - "type": "string", - "format": "date", - "description": "出发日期(定制产品)" - }, - "destinationCities": { - "type": "array", - "description": "途经城市列表(从行程节点资源去重提取)", - "items": { - "type": "string" - } - }, - "destinationCity": { - "type": "string", - "description": "目的地城市" - }, - "families": { - "type": "array", - "description": "家庭分组列表(按家庭分配人员和房间)", - "items": { - "$ref": "#/definitions/家庭分组项", - "originalRef": "家庭分组项" - } - }, - "folderId": { - "type": "string", - "description": "所属文件夹ID" - }, - "groupChatQrUrl": { - "type": "string", - "description": "群聊二维码URL" - }, - "groupRoomId": { - "type": "string", - "description": "企微群聊ID" - }, - "isBooking": { - "type": "boolean", - "description": "是否预约产品" - }, - "itineraryDays": { - "type": "array", - "description": "行程天列表(包含每天的景点、酒店、餐厅、活动等安排,含资源图片)", - "items": { - "$ref": "#/definitions/行程天", - "originalRef": "行程天" - } - }, - "lineId": { - "type": "string", - "description": "产品线ID" - }, - "lineName": { - "type": "string", - "description": "产品线名称" - }, - "lineSubtitle": { - "type": "string", - "description": "产品线副标题" - }, - "maxAdultPerOrder": { - "type": "integer", - "format": "int32", - "description": "每单最大成人数(null=不限)" - }, - "maxChildPerOrder": { - "type": "integer", - "format": "int32", - "description": "每单最大儿童数(null=不限)" - }, - "mchId": { - "type": "string", - "description": "商户号" - }, - "minAdultPerOrder": { - "type": "integer", - "format": "int32", - "description": "每单最少成人数(null=默认1)" - }, - "name": { - "type": "string", - "description": "产品名称" - }, - "paymentMode": { - "type": "string", - "description": "支付模式:FULL=全款 DEPOSIT=定金+尾款" - }, - "pricing": { - "description": "定价配置", - "$ref": "#/definitions/定价配置", - "originalRef": "定价配置" - }, - "productId": { - "type": "string", - "description": "产品ID" - }, - "productNo": { - "type": "string", - "description": "产品编号" - }, - "productType": { - "type": "string", - "description": "产品类型:CUSTOM=定制产品" - }, - "publishedAt": { - "type": "string", - "format": "date-time", - "description": "发布时间" - }, - "refundPolicies": { - "type": "object", - "description": "退款政策详情(按退款类型分组)。key=退款类型(FULL/DEPOSIT/BALANCE),value=政策详情(含policyName、rules等)" - }, - "refundPolicyIds": { - "type": "object", - "description": "退款政策映射(按退款类型绑定不同政策)。key=退款类型(FULL/DEPOSIT/BALANCE), value=政策ID", - "additionalProperties": { - "type": "string" - } - }, - "routeMapUrl": { - "type": "string", - "description": "路径图URL" - }, - "seasonLabels": { - "type": "array", - "description": "适用季节列表(中文)", - "items": { - "type": "string" - } - }, - "seasons": { - "type": "array", - "description": "适用季节列表(编码)", - "items": { - "type": "string" - } - }, - "showChatGroup": { - "type": "boolean", - "description": "是否显示群聊入口" - }, - "showReview": { - "type": "boolean", - "description": "是否显示评价" - }, - "showTripDistance": { - "type": "boolean", - "description": "是否显示行程距离" - }, - "showTripTime": { - "type": "boolean", - "description": "是否显示行程时间" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "staffConfigs": { - "type": "array", - "description": "人员配置列表(导游、领队、摄影师等)", - "items": { - "$ref": "#/definitions/人员配置项", - "originalRef": "人员配置项" - } - }, - "startPrice": { - "type": "number", - "description": "起步价" - }, - "status": { - "type": "string", - "description": "产品状态:COMPLETED=已完成, ORDERED=已下单" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "suppliesList": { - "type": "array", - "description": "物资列表", - "items": { - "$ref": "#/definitions/物资项", - "originalRef": "物资项" - } - }, - "tags": { - "type": "array", - "description": "产品标签列表", - "items": { - "type": "string" - } - }, - "teamExperienceYears": { - "type": "integer", - "format": "int32", - "description": "团队经验年数" - }, - "tripDays": { - "type": "integer", - "format": "int32", - "description": "行程天数" - }, - "tripNights": { - "type": "integer", - "format": "int32", - "description": "行程晚数" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "warmTipsContent": { - "type": "string", - "description": "温馨提示内容" - }, - "warmTipsId": { - "type": "string", - "description": "温馨提示ID" - }, - "warmTipsName": { - "type": "string", - "description": "温馨提示名称" - }, - "youngChildCount": { - "type": "integer", - "format": "int32", - "description": "小童人数" - } - }, - "title": "已完成定制产品详情VO" - }, - "成本项": { - "type": "object", - "properties": { - "category": { - "type": "string", - "description": "成本项类别:HOTEL/SCENIC/VEHICLE/ACTIVITY/SERVICE/DINING/OTHER" - }, - "description": { - "type": "string", - "description": "成本项描述" - }, - "id": { - "type": "string", - "description": "成本项ID" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "title": { - "type": "string", - "description": "成本项标题" - }, - "type": { - "type": "string", - "description": "成本项类型:INCLUDED=费用包含 EXCLUDED=费用不含 SELF_PAY=自理费用" - } - }, - "title": "成本项" - }, - "提交定制需求请求": { - "type": "object", - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "成人数" - }, - "budget": { - "type": "string", - "example": "BUDGET_5000_10000", - "description": "预算范围(字典:customize_budget)" - }, - "childCount": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "儿童数" - }, - "contactName": { - "type": "string", - "example": "张三", - "description": "联系人" - }, - "contactPhone": { - "type": "string", - "example": 13800138000, - "description": "联系电话" - }, - "days": { - "type": "integer", - "format": "int32", - "example": 5, - "description": "期望天数" - }, - "designerId": { - "type": "integer", - "format": "int64", - "example": 1234567890, - "description": "指定定制师ID(可为空=系统分配)" - }, - "destination": { - "type": "string", - "example": "云南大理", - "description": "目标地区" - }, - "endDate": { - "type": "string", - "format": "date", - "example": "2026-04-05", - "description": "期望结束日期" - }, - "requestType": { - "type": "string", - "example": "FAMILY_TRIP", - "description": "需求类型(字典:customize_request_type)" - }, - "requirements": { - "type": "string", - "example": "希望安排亲子活动,孩子3岁", - "description": "详细需求描述" - }, - "startDate": { - "type": "string", - "format": "date", - "example": "2026-04-01", - "description": "期望出发日期" - }, - "travelPurpose": { - "type": "string", - "example": "FAMILY", - "description": "旅游目的(字典:travel_purpose)" - } - }, - "title": "提交定制需求请求" - }, - "权益分组": { - "type": "object", - "properties": { - "items": { - "type": "array", - "description": "权益项列表", - "items": { - "$ref": "#/definitions/权益项", - "originalRef": "权益项" - } - }, - "title": { - "type": "string", - "description": "分组标题,如:儿童权益 (1.2m以下)" - } - }, - "title": "权益分组" - }, - "权益项": { - "type": "object", - "properties": { - "category": { - "type": "string", - "description": "类别,如:门票、住宿、餐饮" - }, - "description": { - "type": "string", - "description": "说明,如:含全部景点儿童票" - } - }, - "title": "权益项" - }, - "每日酒店": { - "type": "object", - "properties": { - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "dayNumber": { - "type": "integer", - "format": "int32", - "description": "天数编号" - }, - "familyIds": { - "type": "array", - "description": "所属家庭ID列表(NULL=所有家庭共享)", - "items": { - "type": "string" - } - }, - "familyRoomConfig": { - "type": "object", - "description": "家庭房间分配:{familyId: roomCount}", - "additionalProperties": { - "type": "integer", - "format": "int32" - } - }, - "hotelId": { - "type": "string", - "description": "酒店ID" - }, - "hotelName": { - "type": "string", - "description": "酒店名称" - }, - "id": { - "type": "string", - "description": "记录ID" - }, - "isDefault": { - "type": "boolean", - "description": "是否默认酒店" - }, - "roomCount": { - "type": "integer", - "format": "int32", - "description": "房间数量" - }, - "roomTypeId": { - "type": "string", - "description": "房型ID" - }, - "roomTypeName": { - "type": "string", - "description": "房型名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - } - }, - "title": "每日酒店" - }, - "物资项": { - "type": "object", - "properties": { - "billingType": { - "type": "string", - "description": "计费方式:BY_PERSON=按人头 BY_COUNT=按次/按件" - }, - "costPerPerson": { - "type": "number", - "description": "每人成本" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "dayNumber": { - "type": "integer", - "format": "int32", - "description": "天数编号(scope=DAY时生效)" - }, - "familyIds": { - "type": "array", - "description": "所属家庭ID列表(定制产品按家庭分配)", - "items": { - "type": "string" - } - }, - "id": { - "type": "string", - "description": "记录ID" - }, - "quantity": { - "type": "integer", - "format": "int32", - "description": "数量" - }, - "scope": { - "type": "string", - "description": "适用范围:ALL=整个行程 DAY=指定天" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "suppliesId": { - "type": "string", - "description": "物资ID" - }, - "suppliesName": { - "type": "string", - "description": "物资名称" - } - }, - "title": "物资项" - }, - "用餐选项": { - "type": "object", - "properties": { - "coverUrl": { - "type": "string", - "description": "餐食封面图URL" - }, - "dayNumber": { - "type": "integer", - "format": "int32", - "description": "天数编号" - }, - "id": { - "type": "string", - "description": "记录ID" - }, - "mealTypes": { - "type": "string", - "description": "餐次:早餐/午餐/晚餐" - }, - "priceInfo": { - "type": "string", - "description": "价格信息" - }, - "quantity": { - "type": "integer", - "format": "int32", - "description": "数量" - }, - "restaurantId": { - "type": "string", - "description": "餐厅ID" - }, - "restaurantName": { - "type": "string", - "description": "餐厅/餐食名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "unitPrice": { - "type": "number", - "description": "餐食单价(元)" - } - }, - "title": "用餐选项" - }, - "统一响应结果«List«已完成定制产品列表项VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/已完成定制产品列表项VO", - "originalRef": "已完成定制产品列表项VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«已完成定制产品列表项VO»»" - }, - "统一响应结果«分页结果«定制需求列表项VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«定制需求列表项VO»", - "originalRef": "分页结果«定制需求列表项VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«定制需求列表项VO»»" - }, - "统一响应结果«定制需求详情VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/定制需求详情VO", - "originalRef": "定制需求详情VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«定制需求详情VO»" - }, - "统一响应结果«已完成定制产品详情VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/已完成定制产品详情VO", - "originalRef": "已完成定制产品详情VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«已完成定制产品详情VO»" - }, - "群聊消息": { - "type": "object", - "properties": { - "avatar": { - "type": "string", - "description": "用户头像URL(type=user时有效)" - }, - "text": { - "type": "string", - "description": "消息内容" - }, - "type": { - "type": "string", - "description": "消息类型: user/creator" - } - }, - "title": "群聊消息" - }, - "自定义费用项": { - "type": "object", - "properties": { - "description": { - "type": "string", - "description": "费用说明" - }, - "familyIds": { - "type": "array", - "description": "所属家庭ID列表(定制产品按家庭分配)", - "items": { - "type": "string" - } - }, - "feeAmount": { - "type": "number", - "description": "费用金额" - }, - "feeName": { - "type": "string", - "description": "费用项名称" - }, - "feeUnit": { - "type": "string", - "description": "费用单位" - }, - "id": { - "type": "string", - "description": "费用项ID" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - } - }, - "title": "自定义费用项" - }, - "行程天": { - "type": "object", - "properties": { - "dayId": { - "type": "string", - "description": "行程天ID" - }, - "dayNumber": { - "type": "integer", - "format": "int32", - "description": "天数编号" - }, - "dayTitle": { - "type": "string", - "description": "天标题" - }, - "hotels": { - "type": "array", - "description": "当日酒店列表", - "items": { - "$ref": "#/definitions/每日酒店", - "originalRef": "每日酒店" - } - }, - "nodes": { - "type": "array", - "description": "行程节点列表(含资源详情和图片)", - "items": { - "$ref": "#/definitions/行程节点", - "originalRef": "行程节点" - } - }, - "restaurants": { - "type": "array", - "description": "当日用餐列表", - "items": { - "$ref": "#/definitions/用餐选项", - "originalRef": "用餐选项" - } - }, - "routeSummary": { - "type": "string", - "description": "路线概览" - } - }, - "title": "行程天" - }, - "行程节点": { - "type": "object", - "properties": { - "costPrice": { - "type": "number", - "description": "资源成本价(来自资源价格日历)" - }, - "dayId": { - "type": "string", - "description": "所属行程天ID" - }, - "description": { - "type": "string", - "description": "节点描述" - }, - "distanceKm": { - "type": "number", - "description": "距离(公里)" - }, - "durationMinutes": { - "type": "integer", - "format": "int32", - "description": "时长(分钟)" - }, - "emojiIcon": { - "type": "string", - "description": "表情图标" - }, - "extraData": { - "type": "string", - "description": "扩展数据(JSON格式)" - }, - "familyIds": { - "type": "array", - "description": "所属家庭ID列表(定制产品按家庭分配)", - "items": { - "type": "string" - } - }, - "images": { - "type": "array", - "description": "节点图片列表", - "items": { - "type": "string" - } - }, - "latitude": { - "type": "number", - "description": "纬度" - }, - "longitude": { - "type": "number", - "description": "经度" - }, - "nodeId": { - "type": "string", - "description": "节点ID" - }, - "nodeName": { - "type": "string", - "description": "节点名称" - }, - "nodeType": { - "type": "string", - "description": "节点类型:TRANSPORT/SCENIC/RESTAURANT/ACTIVITY/PHOTOGRAPHY/HOTEL/FREE/CUSTOM/SERVICE/NOTE" - }, - "quantity": { - "type": "integer", - "format": "int32", - "description": "数量" - }, - "resourceDetail": { - "description": "绑定资源的详细信息(含封面图cover、轮播图images、地址address等)", - "$ref": "#/definitions/资源详情", - "originalRef": "资源详情" - }, - "resourceId": { - "type": "string", - "description": "关联资源ID" - }, - "resourceName": { - "type": "string", - "description": "关联资源名称" - }, - "resourceType": { - "type": "string", - "description": "关联资源类型:SCENIC/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE/STAFF" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "startTime": { - "type": "string", - "description": "开始时间" - } - }, - "title": "行程节点" - }, - "资源详情": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "地址" - }, - "city": { - "type": "string", - "description": "所在城市" - }, - "cover": { - "type": "string", - "description": "封面图URL" - }, - "description": { - "type": "string", - "description": "简介/描述" - }, - "featureIntro": { - "type": "string", - "description": "图文详情(featureIntro JSON)" - }, - "images": { - "type": "array", - "description": "图片URL列表(轮播图)", - "items": { - "type": "string" - } - }, - "latitude": { - "type": "number", - "description": "纬度" - }, - "longitude": { - "type": "number", - "description": "经度" - }, - "name": { - "type": "string", - "description": "资源名称" - }, - "rating": { - "type": "number", - "description": "评分" - }, - "resourceId": { - "type": "string", - "description": "资源ID" - }, - "resourceType": { - "type": "string", - "description": "资源类型: SCENIC_SPOT/HOTEL/RESTAURANT/ACTIVITY" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "type": "string" - } - } - }, - "title": "资源详情" - } - } -} \ No newline at end of file diff --git a/.swagger/hl-order-service.json b/.swagger/hl-order-service.json deleted file mode 100644 index 9c31159..0000000 --- a/.swagger/hl-order-service.json +++ /dev/null @@ -1,12836 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "订单服务", - "version": "1.0.0" - }, - "basePath": "/", - "paths": { - "/admin/order/album/file/{albumFileId}": { - "put": { - "tags": [ - "管理端相册接口" - ], - "summary": "编辑文件信息", - "description": "**关联字典**:\n- album_file_type(文件类型,返回字段fileType):IMAGE=图片, VIDEO=视频\n- album_location_type(地点类型,返回字段locationType):RESOURCE=关联资源, CUSTOM=自定义地点\n- resource_type(资源类型,返回字段resourceType):SCENIC_SPOT=景区, ACTIVITY=活动, RESTAURANT=餐厅, HOTEL=酒店, VEHICLE=车辆", - "operationId": "updateFileUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "albumFileId", - "in": "path", - "description": "相册文件ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/AlbumFileUpdateRequest", - "originalRef": "AlbumFileUpdateRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«AlbumFileVO»", - "originalRef": "统一响应结果«AlbumFileVO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«AlbumFileVO»", - "originalRef": "统一响应结果«AlbumFileVO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "管理端相册接口" - ], - "summary": "删除文件", - "description": "删除相册中的单个文件(照片/视频)。仅上传者或超级管理员可操作,删除后C端用户不再可见。", - "operationId": "deleteFileUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "albumFileId", - "in": "path", - "description": "相册文件ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/album/folder/{folderId}": { - "put": { - "tags": [ - "管理端相册接口" - ], - "summary": "编辑相册文件夹", - "description": "修改文件夹名称或描述。仅创建者或超级管理员可操作", - "operationId": "updateFolderUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "folderId", - "in": "path", - "description": "文件夹ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/AlbumFolderRequest", - "originalRef": "AlbumFolderRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«AlbumFolderVO»", - "originalRef": "统一响应结果«AlbumFolderVO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«AlbumFolderVO»", - "originalRef": "统一响应结果«AlbumFolderVO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "管理端相册接口" - ], - "summary": "删除相册文件夹", - "description": "删除文件夹及其下所有文件。仅创建者或超级管理员可操作。删除后C端用户不再可见", - "operationId": "deleteFolderUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "folderId", - "in": "path", - "description": "文件夹ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/album/folder/{folderId}/cover": { - "put": { - "tags": [ - "管理端相册接口" - ], - "summary": "设置文件夹封面", - "description": "将文件夹中的指定文件设为封面图,封面图会在文件夹列表中展示。仅上传者或超级管理员可操作。", - "operationId": "setCoverUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "albumFileId", - "in": "query", - "description": "相册文件ID", - "required": false, - "type": "integer", - "format": "int64", - "allowEmptyValue": false - }, - { - "name": "folderId", - "in": "path", - "description": "文件夹ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/album/folder/{folderId}/files": { - "get": { - "tags": [ - "管理端相册接口" - ], - "summary": "查询文件夹下的文件列表", - "description": "**关联字典**:\n- album_file_type(文件类型,返回字段fileType):IMAGE=图片, VIDEO=视频\n- album_location_type(地点类型,返回字段locationType):RESOURCE=关联资源, CUSTOM=自定义地点\n- resource_type(资源类型,返回字段resourceType):SCENIC_SPOT=景区, ACTIVITY=活动, RESTAURANT=餐厅, HOTEL=酒店, VEHICLE=车辆", - "operationId": "listFilesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "folderId", - "in": "path", - "description": "文件夹ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "size", - "in": "query", - "description": "每页数量", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«AlbumFileVO»»", - "originalRef": "统一响应结果«分页结果«AlbumFileVO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«AlbumFileVO»»", - "originalRef": "统一响应结果«分页结果«AlbumFileVO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "管理端相册接口" - ], - "summary": "批量添加文件到文件夹", - "description": "一次添加多个照片/视频到指定文件夹。文件需先通过文件服务上传获取OSS URL\n\n**关联字典**:\n- album_file_type(文件类型,返回字段fileType):IMAGE=图片, VIDEO=视频\n- album_location_type(地点类型,返回字段locationType):RESOURCE=关联资源, CUSTOM=自定义地点\n- resource_type(资源类型,返回字段resourceType):SCENIC_SPOT=景区, ACTIVITY=活动, RESTAURANT=餐厅, HOTEL=酒店, VEHICLE=车辆", - "operationId": "addFilesUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "folderId", - "in": "path", - "description": "文件夹ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/AlbumFileBatchAddRequest", - "originalRef": "AlbumFileBatchAddRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«AlbumFileVO»»", - "originalRef": "统一响应结果«List«AlbumFileVO»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«AlbumFileVO»»", - "originalRef": "统一响应结果«List«AlbumFileVO»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/album/my-uploads": { - "get": { - "tags": [ - "管理端相册接口" - ], - "summary": "我的上传", - "description": "查询当前管理员上传的所有相册文件(跨订单),方便管理自己上传的内容\n\n**关联字典**:\n- album_file_type(文件类型,返回字段fileType):IMAGE=图片, VIDEO=视频\n- album_location_type(地点类型,返回字段locationType):RESOURCE=关联资源, CUSTOM=自定义地点\n- resource_type(资源类型,返回字段resourceType):SCENIC_SPOT=景区, ACTIVITY=活动, RESTAURANT=餐厅, HOTEL=酒店, VEHICLE=车辆", - "operationId": "listMyUploadsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "size", - "in": "query", - "description": "每页数量", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«AlbumFileVO»»", - "originalRef": "统一响应结果«分页结果«AlbumFileVO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«AlbumFileVO»»", - "originalRef": "统一响应结果«分页结果«AlbumFileVO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/config/expiry-minutes": { - "get": { - "tags": [ - "订单配置接口" - ], - "summary": "获取订单过期配置", - "description": "获取当前的订单未支付自动过期时间(分钟)。\n返回当前值、默认值和配置来源(redis=已自定义, default=使用默认值)", - "operationId": "getExpiryMinutesUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "订单配置接口" - ], - "summary": "设置订单过期时间(分钟)", - "description": "修改订单未支付自动取消的等待时间。存储在Redis中,即时生效。\n仅影响新创建的订单,已有订单的过期时间不变", - "operationId": "setExpiryMinutesUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "expiryRequest", - "description": "修改订单过期时间请求", - "required": false, - "schema": { - "$ref": "#/definitions/修改订单过期时间请求", - "originalRef": "修改订单过期时间请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/create": { - "post": { - "tags": [ - "管理端订单接口" - ], - "summary": "创建订单(定制师代下单)", - "description": "创建订单流程:选择产品 → 填写联系人和出行人 → 系统计算报价 → 生成订单(PENDING_PAY状态)\n\n权限:CUSTOM产品仅创建者可下单,CORE/ROUTE产品所有管理员可下单\n\n【关联字典】\n- 请求参数 productType → 字典:product_type(产品类型)\n- 请求参数 travelers[].travelerType → 字典:traveler_type(出行人类型)\n- 请求参数 travelers[].idCardType → 字典:id_card_type(证件类型)\n- 请求参数 travelers[].gender → 字典:gender(性别)\n- 返回字段 status → 字典:order_status(订单状态)\n- 返回字段 processStatus → 字典:order_process_status(订单内部流程状态)\n- 返回字段 productType → 字典:product_type(产品类型)\n- 返回字段 travelers[].travelerType → 字典:traveler_type(出行人类型)\n- 返回字段 travelers[].idCardType → 字典:id_card_type(证件类型)\n- 返回字段 travelers[].gender → 字典:gender(性别)", - "operationId": "createOrderUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "createRequest", - "description": "创建订单请求", - "required": false, - "schema": { - "$ref": "#/definitions/管理员创建订单请求", - "originalRef": "管理员创建订单请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«订单详情VO»", - "originalRef": "统一响应结果«订单详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«订单详情VO»", - "originalRef": "统一响应结果«订单详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/early-bird": { - "post": { - "tags": [ - "早鸟优惠计划管理" - ], - "summary": "创建早鸟优惠计划", - "description": "创建一个早鸟优惠计划,在指定日期范围内下单且满足最低人数条件的订单可享受优惠。\n下单时系统自动匹配最优的早鸟计划。权限:仅超级管理员(SUPER_ADMIN)", - "operationId": "createUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "planRequest", - "description": "创建早鸟计划请求", - "required": false, - "schema": { - "$ref": "#/definitions/早鸟优惠计划请求", - "originalRef": "早鸟优惠计划请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«早鸟优惠计划VO»", - "originalRef": "统一响应结果«早鸟优惠计划VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«早鸟优惠计划VO»", - "originalRef": "统一响应结果«早鸟优惠计划VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/early-bird/list": { - "get": { - "tags": [ - "早鸟优惠计划管理" - ], - "summary": "早鸟优惠计划列表", - "description": "分页查询所有早鸟优惠计划。权限:仅超级管理员(SUPER_ADMIN)", - "operationId": "listUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«早鸟优惠计划VO»»", - "originalRef": "统一响应结果«分页结果«早鸟优惠计划VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«早鸟优惠计划VO»»", - "originalRef": "统一响应结果«分页结果«早鸟优惠计划VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/early-bird/{planId}": { - "get": { - "tags": [ - "早鸟优惠计划管理" - ], - "summary": "早鸟优惠计划详情", - "description": "权限:仅超级管理员(SUPER_ADMIN)", - "operationId": "detailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "planId", - "in": "path", - "description": "早鸟计划ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«早鸟优惠计划VO»", - "originalRef": "统一响应结果«早鸟优惠计划VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«早鸟优惠计划VO»", - "originalRef": "统一响应结果«早鸟优惠计划VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "早鸟优惠计划管理" - ], - "summary": "修改早鸟优惠计划", - "description": "权限:仅超级管理员(SUPER_ADMIN)。修改不影响已下单的订单优惠", - "operationId": "updateUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "planId", - "in": "path", - "description": "早鸟计划ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "planRequest", - "description": "修改早鸟计划请求", - "required": false, - "schema": { - "$ref": "#/definitions/早鸟优惠计划请求", - "originalRef": "早鸟优惠计划请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "早鸟优惠计划管理" - ], - "summary": "删除早鸟优惠计划", - "description": "权限:仅超级管理员(SUPER_ADMIN)。删除不影响已下单的订单优惠", - "operationId": "deleteUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "planId", - "in": "path", - "description": "早鸟计划ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/early-bird/{planId}/toggle": { - "put": { - "tags": [ - "早鸟优惠计划管理" - ], - "summary": "启用/禁用早鸟优惠计划", - "description": "禁用后该计划不再参与自动匹配。权限:仅超级管理员(SUPER_ADMIN)", - "operationId": "toggleUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "enabled", - "in": "query", - "description": "是否启用", - "required": false, - "type": "boolean", - "allowEmptyValue": false - }, - { - "name": "planId", - "in": "path", - "description": "早鸟计划ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/list": { - "get": { - "tags": [ - "管理端订单接口" - ], - "summary": "订单列表", - "description": "支持按关键词(订单号/联系人/产品名)、状态、内部流程状态、产品类型筛选。\n支持按创建时间/出发日期/总价排序。\n\n返回分页结果,包含订单基本信息、状态、支付信息和产品封面\n\n【关联字典】\n- 筛选参数 status → 字典:order_status(订单状态)\n- 筛选参数 processStatus → 字典:order_process_status(订单内部流程状态)\n- 筛选参数 productType → 字典:product_type(产品类型)\n- 返回字段 status → 字典:order_status(订单状态)\n- 返回字段 processStatus → 字典:order_process_status(订单内部流程状态)\n- 返回字段 productType → 字典:product_type(产品类型)", - "operationId": "listOrdersUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "contactPhone", - "in": "query", - "description": "联系电话", - "required": false, - "type": "string", - "x-example": "13800138000" - }, - { - "name": "createTimeEnd", - "in": "query", - "description": "下单时间结束(yyyy-MM-dd HH:mm:ss)", - "required": false, - "type": "string", - "format": "date-time", - "x-example": "2026-03-31 23:59:59" - }, - { - "name": "createTimeStart", - "in": "query", - "description": "下单时间起始(yyyy-MM-dd HH:mm:ss)", - "required": false, - "type": "string", - "format": "date-time", - "x-example": "2026-03-01 00:00:00" - }, - { - "name": "customizerName", - "in": "query", - "description": "定制师名称(模糊搜索)", - "required": false, - "type": "string", - "x-example": "王骁" - }, - { - "name": "departureDateEnd", - "in": "query", - "description": "出发日期结束(yyyy-MM-dd)", - "required": false, - "type": "string", - "format": "date", - "x-example": "2026-03-31" - }, - { - "name": "departureDateStart", - "in": "query", - "description": "出发日期起始(yyyy-MM-dd)", - "required": false, - "type": "string", - "format": "date", - "x-example": "2026-03-01" - }, - { - "name": "keyword", - "in": "query", - "description": "搜索关键词(订单号/联系人姓名/产品名称)", - "required": false, - "type": "string", - "x-example": "HL2026" - }, - { - "name": "mchId", - "in": "query", - "description": "商户号(字典:mch_id)", - "required": false, - "type": "string", - "x-example": "shanhe" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 20 - }, - { - "name": "processStatus", - "in": "query", - "description": "内部流程状态(字典:order_process_status)", - "required": false, - "type": "string", - "x-example": "PENDING_ROOM" - }, - { - "name": "productType", - "in": "query", - "description": "产品类型(字典:product_type)", - "required": false, - "type": "string", - "x-example": "CORE" - }, - { - "name": "sortBy", - "in": "query", - "description": "排序字段(createTime/departureDate/totalPrice)", - "required": false, - "type": "string", - "x-example": "createTime" - }, - { - "name": "sortDir", - "in": "query", - "description": "排序方向(desc/asc)", - "required": false, - "type": "string", - "x-example": "desc" - }, - { - "name": "status", - "in": "query", - "description": "订单状态(字典:order_status,支持逗号分隔多状态)", - "required": false, - "type": "string", - "x-example": "PAID" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«管理员订单列表VO»»", - "originalRef": "统一响应结果«分页结果«管理员订单列表VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«管理员订单列表VO»»", - "originalRef": "统一响应结果«分页结果«管理员订单列表VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/quote": { - "post": { - "tags": [ - "管理端订单接口" - ], - "summary": "报价预览", - "description": "根据产品、出发日期、人数组合实时计算报价。\n返回各资源明细价格和合计金额,前端据此展示报价清单。\n\n注意:报价仅供参考,最终价格以创建订单时为准(价格日历可能变动)", - "operationId": "quotePreviewUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "quoteRequest", - "description": "报价预览请求", - "required": false, - "schema": { - "$ref": "#/definitions/报价预览请求", - "originalRef": "报价预览请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/todo/contract-eligible": { - "get": { - "tags": [ - "订单待办接口" - ], - "summary": "可签合同订单列表(保险已完成)", - "description": "查询保险待办已完成、可以进入签合同环节的订单列表。\n用于合同管理页面展示待签合同的订单\n\n【关联字典】\n- 返回字段 todoType → 字典:order_todo_type(订单待办类型)\n- 返回字段 orderStatus → 字典:order_status(订单状态)", - "operationId": "getContractEligibleOrdersUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«订单待办VO»»", - "originalRef": "统一响应结果«List«订单待办VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«订单待办VO»»", - "originalRef": "统一响应结果«List«订单待办VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/todo/customizer-list": { - "get": { - "tags": [ - "订单待办接口" - ], - "summary": "定制师列表", - "description": "获取所有定制师(CUSTOMIZER角色)的列表,用于更换定制师时选择目标定制师", - "operationId": "getCustomizerListUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«管理员基本信息»»", - "originalRef": "统一响应结果«List«管理员基本信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«管理员基本信息»»", - "originalRef": "统一响应结果«List«管理员基本信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/todo/my-count": { - "get": { - "tags": [ - "订单待办接口" - ], - "summary": "我的待办数量", - "description": "返回当前管理员未完成的待办总数,用于首页角标/红点提醒", - "operationId": "getMyTodosCountUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«int»", - "originalRef": "统一响应结果«int»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«int»", - "originalRef": "统一响应结果«int»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/todo/my-list": { - "get": { - "tags": [ - "订单待办接口" - ], - "summary": "我的待办列表", - "description": "根据当前管理员ID和角色,查询分配给自己的未完成待办。\n超级管理员可看到所有待办,其他角色只能看到对应类型的待办\n\n【关联字典】\n- 返回字段 todoType → 字典:order_todo_type(订单待办类型)\n- 返回字段 orderStatus → 字典:order_status(订单状态)", - "operationId": "getMyTodosUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«订单待办VO»»", - "originalRef": "统一响应结果«List«订单待办VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«订单待办VO»»", - "originalRef": "统一响应结果«List«订单待办VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/todo/{todoId}/complete": { - "put": { - "tags": [ - "订单待办接口" - ], - "summary": "完成待办", - "description": "将指定待办标记为已完成。\n需要对应角色权限:如配房待办需ROOM_MANAGER角色,配车待办需VEHICLE_MANAGER角色。\n\n完成后系统自动检查是否所有必要待办已完成,若是则推进内部流程\n\n【关联字典】\n- 涉及字段 todoType → 字典:order_todo_type(订单待办类型)", - "operationId": "completeTodoUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "todoId", - "in": "path", - "description": "待办ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/work-order": { - "post": { - "tags": [ - "工单管理" - ], - "summary": "创建工单", - "description": "创建旅途中的变更工单,需关联订单ID。\n可指定处理人,未指定则进入待分配状态。可附带差价信息和资源详情JSON\n\n【关联字典】\n- 请求参数 type → 字典:work_order_type(工单类型)\n- 请求参数 priority → 字典:work_order_priority(工单优先级)\n- 返回字段 status → 字典:work_order_status(工单状态)\n- 返回字段 type → 字典:work_order_type(工单类型)\n- 返回字段 priority → 字典:work_order_priority(工单优先级)", - "operationId": "createUsingPOST_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreateWorkOrderRequest", - "originalRef": "CreateWorkOrderRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«WorkOrderVO»", - "originalRef": "统一响应结果«WorkOrderVO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«WorkOrderVO»", - "originalRef": "统一响应结果«WorkOrderVO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/work-order/count-by-order/{orderId}": { - "get": { - "tags": [ - "工单管理" - ], - "summary": "按订单查工单数量", - "description": "返回指定订单关联的工单总数,用于订单详情页展示工单角标", - "operationId": "countByOrderUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«int»", - "originalRef": "统一响应结果«int»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«int»", - "originalRef": "统一响应结果«int»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/work-order/list": { - "get": { - "tags": [ - "工单管理" - ], - "summary": "工单列表", - "description": "分页查询工单,支持按状态/类型/优先级/订单编号/处理人筛选。\n工单用于处理旅行中的突发变更需求(如换房、换车、加景点等)\n\n【关联字典】\n- 筛选参数 status → 字典:work_order_status(工单状态)\n- 筛选参数 type → 字典:work_order_type(工单类型)\n- 筛选参数 priority → 字典:work_order_priority(工单优先级)\n- 返回字段 status → 字典:work_order_status(工单状态)\n- 返回字段 type → 字典:work_order_type(工单类型)\n- 返回字段 priority → 字典:work_order_priority(工单优先级)", - "operationId": "listUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "assigneeAdminId", - "in": "query", - "description": "处理人ID", - "required": false, - "type": "integer", - "format": "int64", - "allowEmptyValue": false - }, - { - "name": "orderNo", - "in": "query", - "description": "订单编号(模糊)", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "priority", - "in": "query", - "description": "优先级: URGENT/NORMAL", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "status", - "in": "query", - "description": "状态: PENDING/PROCESSING/RESOLVED/REJECTED", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "type", - "in": "query", - "description": "类型: ROOM_CHANGE/ROOM_ADD/CHECKOUT_CHANGE/HOTEL_ISSUE/VEHICLE_CHANGE/SCENIC_ADD/SCENIC_REMOVE/OTHER", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«WorkOrderVO»»", - "originalRef": "统一响应结果«分页结果«WorkOrderVO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«WorkOrderVO»»", - "originalRef": "统一响应结果«分页结果«WorkOrderVO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/work-order/stats": { - "get": { - "tags": [ - "工单管理" - ], - "summary": "工单统计", - "description": "返回各状态的工单数量和紧急工单数,用于工单管理页面顶部统计卡片\n\n【关联字典】\n- 返回字段中的状态key → 字典:work_order_status(工单状态)", - "operationId": "getStatsUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/work-order/{workOrderId}": { - "get": { - "tags": [ - "工单管理" - ], - "summary": "工单详情", - "description": "返回工单完整信息,包括关联订单、资源详情、处理记录和备注列表\n\n【关联字典】\n- 返回字段 status → 字典:work_order_status(工单状态)\n- 返回字段 type → 字典:work_order_type(工单类型)\n- 返回字段 priority → 字典:work_order_priority(工单优先级)", - "operationId": "getDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "workOrderId", - "in": "path", - "description": "工单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«WorkOrderVO»", - "originalRef": "统一响应结果«WorkOrderVO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«WorkOrderVO»", - "originalRef": "统一响应结果«WorkOrderVO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/work-order/{workOrderId}/assign": { - "put": { - "tags": [ - "工单管理" - ], - "summary": "指派工单", - "description": "将工单分配给指定管理员处理。被指派人将在待办列表中看到该工单", - "operationId": "assignUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "assigneeId", - "in": "query", - "description": "处理人ID", - "required": false, - "type": "integer", - "format": "int64", - "allowEmptyValue": false - }, - { - "name": "assigneeName", - "in": "query", - "description": "处理人姓名", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "workOrderId", - "in": "path", - "description": "工单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«WorkOrderVO»", - "originalRef": "统一响应结果«WorkOrderVO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«WorkOrderVO»", - "originalRef": "统一响应结果«WorkOrderVO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/work-order/{workOrderId}/comment": { - "post": { - "tags": [ - "工单管理" - ], - "summary": "添加工单备注", - "description": "在工单中追加备注信息,用于内部沟通和处理过程记录", - "operationId": "addCommentUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "workOrderId", - "in": "path", - "description": "工单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«WorkOrderVO»", - "originalRef": "统一响应结果«WorkOrderVO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«WorkOrderVO»", - "originalRef": "统一响应结果«WorkOrderVO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/work-order/{workOrderId}/process": { - "put": { - "tags": [ - "工单管理" - ], - "summary": "处理工单(解决/驳回)", - "description": "解决时需填写处理结果(resolution),驳回时需填写驳回原因(rejectReason)。\n可调整差价(costDifference),正数表示加价,负数表示退费\n\n【关联字典】\n- 返回字段 status → 字典:work_order_status(工单状态)", - "operationId": "processUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "workOrderId", - "in": "path", - "description": "工单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "$ref": "#/definitions/ProcessWorkOrderRequest", - "originalRef": "ProcessWorkOrderRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«WorkOrderVO»", - "originalRef": "统一响应结果«WorkOrderVO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«WorkOrderVO»", - "originalRef": "统一响应结果«WorkOrderVO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}": { - "get": { - "tags": [ - "管理端订单接口" - ], - "summary": "订单详情", - "description": "返回订单完整信息,包括:基本信息、产品快照、联系人、出行人列表、支付记录、优惠明细、时间线、内部流程状态等\n\n【关联字典】\n- 返回字段 status → 字典:order_status(订单状态)\n- 返回字段 processStatus → 字典:order_process_status(订单内部流程状态)\n- 返回字段 productType → 字典:product_type(产品类型)\n- 返回字段 travelers[].travelerType → 字典:traveler_type(出行人类型)\n- 返回字段 travelers[].idCardType → 字典:id_card_type(证件类型)\n- 返回字段 travelers[].gender → 字典:gender(性别)\n- 返回字段 timeline[].action → 字典:order_timeline_action(订单操作类型)\n- 返回字段 todos[].todoType → 字典:order_todo_type(订单待办类型)", - "operationId": "getOrderUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«订单详情VO»", - "originalRef": "统一响应结果«订单详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«订单详情VO»", - "originalRef": "统一响应结果«订单详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "管理端订单接口" - ], - "summary": "编辑订单", - "description": "修改订单的联系人、人数、出发日期、售价、成本、备注等信息。\n仅传入需要修改的字段,未传入的字段不会被修改。\n\n如果提供了出行人列表(travelers),将替换订单的全部出行人。\n已锁定的订单需先调用'申请修改'接口解锁后才能编辑\n\n【关联字典】\n- 请求参数 travelers[].travelerType → 字典:traveler_type(出行人类型)\n- 请求参数 travelers[].idCardType → 字典:id_card_type(证件类型)\n- 请求参数 travelers[].gender → 字典:gender(性别)", - "operationId": "editOrderUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "updateRequest", - "description": "编辑订单请求", - "required": false, - "schema": { - "$ref": "#/definitions/管理员修改订单请求", - "originalRef": "管理员修改订单请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "管理端订单接口" - ], - "summary": "删除订单", - "description": "仅待支付(PENDING_PAY)状态的订单可删除,其他状态不可删除", - "operationId": "deleteOrderUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/album/folder": { - "post": { - "tags": [ - "管理端相册接口" - ], - "summary": "创建相册文件夹", - "description": "为订单创建旅行相册文件夹(如'第一天风景'、'合影'等),用于组织旅途照片/视频", - "operationId": "createFolderUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/AlbumFolderRequest", - "originalRef": "AlbumFolderRequest" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«AlbumFolderVO»", - "originalRef": "统一响应结果«AlbumFolderVO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«AlbumFolderVO»", - "originalRef": "统一响应结果«AlbumFolderVO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/album/folders": { - "get": { - "tags": [ - "管理端相册接口" - ], - "summary": "查询订单的文件夹列表", - "description": "获取指定订单的所有相册文件夹,含文件夹名称、描述、封面图、文件数量等信息。", - "operationId": "listFoldersUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«AlbumFolderVO»»", - "originalRef": "统一响应结果«List«AlbumFolderVO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«AlbumFolderVO»»", - "originalRef": "统一响应结果«List«AlbumFolderVO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/available-hotels": { - "get": { - "tags": [ - "管理端订单接口" - ], - "summary": "配房可选酒店列表", - "description": "返回所有启用酒店列表,标注该订单产品快照中指定行程天包含的酒店(inSnapshot=true),并将快照酒店排在最前面。\n用于管理员配房时选择酒店,快照中的酒店是产品行程已安排的住宿,应优先选择。\n\n**必须传 dayIndex 参数**(行程第几天,从1开始),因为每天的酒店可能不同。\n\n返回字段说明:\n- hotelId:酒店ID\n- hotelName:酒店名称\n- inSnapshot:是否在该天产品快照中(true=该天行程已安排的酒店)", - "operationId": "getAvailableHotelsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "dayIndex", - "in": "query", - "description": "行程第几天(从1开始)", - "required": true, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/balance-pay-method": { - "put": { - "tags": [ - "管理端订单接口" - ], - "summary": "设置尾款支付方式", - "description": "设置订单尾款的支付方式。ONLINE=线上微信支付,OFFLINE=线下转账(需管理员手动记录尾款到账)", - "operationId": "setBalancePayMethodUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "balancePayMethod", - "in": "query", - "description": "支付方式:ONLINE-线上支付, OFFLINE-线下支付", - "required": true, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/cancel": { - "put": { - "tags": [ - "管理端订单接口" - ], - "summary": "取消订单", - "description": "管理员可取消的状态:待支付、已付定金、已全额支付、已确认、待付尾款\n\n已付款订单取消后需走退款流程", - "operationId": "cancelOrderUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "cancelRequest", - "description": "取消订单请求", - "required": false, - "schema": { - "$ref": "#/definitions/管理员取消订单请求", - "originalRef": "管理员取消订单请求" - } - }, - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/confirm": { - "put": { - "tags": [ - "管理端订单接口" - ], - "summary": "确认订单", - "description": "确认订单后进入内部流程:待配房 → 待配车 → 待核算 → 就绪\n\n前置条件:订单状态为已全额支付(PAID)或已付定金(DEPOSIT_PAID)", - "operationId": "confirmOrderUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/customizer": { - "put": { - "tags": [ - "订单待办接口" - ], - "summary": "更换定制师", - "description": "将订单转派给另一位定制师。更换后原定制师的待办自动转移,订单时间线会记录此操作", - "operationId": "changeCustomizerUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "定制师信息", - "required": false, - "schema": { - "$ref": "#/definitions/更换定制师请求", - "originalRef": "更换定制师请求" - } - }, - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/deposit": { - "put": { - "tags": [ - "管理端订单接口" - ], - "summary": "修改定金金额", - "description": "修改订单的定金金额。仅待支付(PENDING_PAY)状态可修改。\n\n定金金额不能超过订单总价,修改后影响用户支付页面显示的应付金额", - "operationId": "updateDepositUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "depositRequest", - "description": "修改定金金额请求", - "required": false, - "schema": { - "$ref": "#/definitions/修改定金金额请求", - "originalRef": "修改定金金额请求" - } - }, - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/discount": { - "post": { - "tags": [ - "管理端订单接口" - ], - "summary": "添加优惠项", - "description": "为订单添加手动优惠(如会员折扣、老客优惠等)。\n添加后系统自动重算订单应付金额。一个订单可添加多个优惠项", - "operationId": "addDiscountUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "discountRequest", - "description": "优惠项请求", - "required": false, - "schema": { - "$ref": "#/definitions/优惠项请求", - "originalRef": "优惠项请求" - } - }, - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«OrderDiscount»", - "originalRef": "统一响应结果«OrderDiscount»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«OrderDiscount»", - "originalRef": "统一响应结果«OrderDiscount»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/discount/{discountId}": { - "put": { - "tags": [ - "管理端订单接口" - ], - "summary": "修改优惠项", - "description": "修改已添加的优惠项名称或金额,修改后自动重算订单应付金额", - "operationId": "updateDiscountUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "discountId", - "in": "path", - "description": "优惠项ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "discountRequest", - "description": "优惠项请求", - "required": false, - "schema": { - "$ref": "#/definitions/优惠项请求", - "originalRef": "优惠项请求" - } - }, - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "管理端订单接口" - ], - "summary": "删除优惠项", - "description": "删除已添加的优惠项,删除后自动重算订单应付金额", - "operationId": "removeDiscountUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "discountId", - "in": "path", - "description": "优惠项ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/hotel-assignment": { - "put": { - "tags": [ - "管理端订单接口" - ], - "summary": "分配酒店信息", - "description": "按天按家庭为订单分配具体的酒店房间。\n每天每个家庭一条记录,包含酒店ID、房型ID、日期和备注。\n\n**房型升级自动处理**:如果分配的房型与产品默认房型不同,系统自动计算差价并创建升级记录。\n- 定制师操作:自动确认,差价直接计入总售价\n- 其他角色操作:创建待确认记录(临时计入尾款),通知定制师确认\n- 可通过 upgradePrice 字段手动覆盖系统计算的差价", - "operationId": "assignHotelUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/酒店分配请求", - "originalRef": "酒店分配请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/hotel-assignment/preview": { - "post": { - "tags": [ - "管理端订单接口" - ], - "summary": "配房升级差价预览", - "description": "预览配房时的房型升级差价(不创建记录)。\n逐天比较分配房型与产品默认房型(CORE产品默认标间),返回每天差价明细和汇总。\n前端可据此展示差价信息,用户确认后再调用分配接口。", - "operationId": "previewHotelAssignmentUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/酒店分配请求", - "originalRef": "酒店分配请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«配房升级差价预览»", - "originalRef": "统一响应结果«配房升级差价预览»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«配房升级差价预览»", - "originalRef": "统一响应结果«配房升级差价预览»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/itinerary/add": { - "post": { - "tags": [ - "管理端订单行程编辑" - ], - "summary": "新增节点", - "description": "在某一天的行程中新增一个节点\n\n**关联字典**:\n- itinerary_edit_action(操作类型,返回字段action):SKIP=跳过, ADD=新增节点, ADD_DAY=新增整天, ROOM_CHANGE=房型切换, VEHICLE_CHANGE=车型切换\n- itinerary_confirm_status(确认状态,返回字段confirmStatus):PENDING_CONFIRM=待确认, CONFIRMED=已确认\n- resource_type(资源类型,返回字段resourceType):SCENIC_SPOT=景区, ACTIVITY=活动, RESTAURANT=餐厅, HOTEL=酒店, VEHICLE=车辆", - "operationId": "addNodeUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "新增节点请求", - "required": false, - "schema": { - "$ref": "#/definitions/新增行程节点请求", - "originalRef": "新增行程节点请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«OrderItineraryEdit»", - "originalRef": "统一响应结果«OrderItineraryEdit»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«OrderItineraryEdit»", - "originalRef": "统一响应结果«OrderItineraryEdit»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/itinerary/add-day": { - "post": { - "tags": [ - "管理端订单行程编辑" - ], - "summary": "新增整天行程", - "description": "在订单行程中新增一整天(含多个节点)\n\n**关联字典**:\n- itinerary_edit_action(操作类型,返回字段action):ADD_DAY=新增整天\n- itinerary_confirm_status(确认状态,返回字段confirmStatus):PENDING_CONFIRM=待确认, CONFIRMED=已确认\n- resource_type(资源类型,返回字段resourceType):SCENIC_SPOT=景区, ACTIVITY=活动, RESTAURANT=餐厅, HOTEL=酒店, VEHICLE=车辆", - "operationId": "addDayUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/新增行程天请求", - "originalRef": "新增行程天请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«OrderItineraryEdit»»", - "originalRef": "统一响应结果«List«OrderItineraryEdit»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«OrderItineraryEdit»»", - "originalRef": "统一响应结果«List«OrderItineraryEdit»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/itinerary/add/{editId}": { - "delete": { - "tags": [ - "管理端订单行程编辑" - ], - "summary": "删除新增的节点", - "description": "删除通过编辑新增的节点\n\n**关联字典**:\n- itinerary_edit_action(操作类型,返回字段action):SKIP=跳过, ADD=新增节点, ADD_DAY=新增整天, ROOM_CHANGE=房型切换, VEHICLE_CHANGE=车型切换\n- itinerary_confirm_status(确认状态,返回字段confirmStatus):PENDING_CONFIRM=待确认, CONFIRMED=已确认", - "operationId": "removeAddedNodeUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "editId", - "in": "path", - "description": "编辑记录ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "撤销原因", - "required": false, - "schema": { - "$ref": "#/definitions/撤销行程编辑请求", - "originalRef": "撤销行程编辑请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/itinerary/balance-summary": { - "get": { - "tags": [ - "管理端订单行程编辑" - ], - "summary": "获取尾款调整汇总", - "description": "返回行程编辑产生的尾款调整明细和总额", - "operationId": "getBalanceAdjustmentSummaryUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/itinerary/confirm-all": { - "post": { - "tags": [ - "管理端订单行程编辑" - ], - "summary": "批量确认所有待确认修改", - "description": "确认该订单所有待确认的行程编辑\n\n**关联字典**:\n- itinerary_confirm_status(确认状态,返回字段confirmStatus):PENDING_CONFIRM=待确认, CONFIRMED=已确认", - "operationId": "confirmAllPendingUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«int»", - "originalRef": "统一响应结果«int»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«int»", - "originalRef": "统一响应结果«int»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/itinerary/confirm/{editId}": { - "post": { - "tags": [ - "管理端订单行程编辑" - ], - "summary": "确认单条修改", - "description": "确认一条待确认的行程编辑\n\n**关联字典**:\n- itinerary_confirm_status(确认状态,返回字段confirmStatus):PENDING_CONFIRM=待确认, CONFIRMED=已确认", - "operationId": "confirmEditUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "editId", - "in": "path", - "description": "编辑记录ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/itinerary/day/{editId}": { - "delete": { - "tags": [ - "管理端订单行程编辑" - ], - "summary": "删除新增的整天行程", - "description": "删除通过新增操作添加的整天行程及其所有子节点,已确认的天不允许删除\n\n**关联字典**:\n- itinerary_confirm_status(确认状态,返回字段confirmStatus):PENDING_CONFIRM=待确认, CONFIRMED=已确认", - "operationId": "removeDayUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "editId", - "in": "path", - "description": "ADD_DAY编辑记录ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "删除原因", - "required": false, - "schema": { - "$ref": "#/definitions/撤销行程编辑请求", - "originalRef": "撤销行程编辑请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/itinerary/edit/{editId}": { - "put": { - "tags": [ - "管理端订单行程编辑" - ], - "summary": "修改编辑记录", - "description": "修改待确认状态的编辑记录(如调整价格、名称等)\n\n**关联字典**:\n- itinerary_edit_action(操作类型,返回字段action):SKIP=跳过, ADD=新增节点, ADD_DAY=新增整天, ROOM_CHANGE=房型切换, VEHICLE_CHANGE=车型切换\n- itinerary_confirm_status(确认状态,返回字段confirmStatus):PENDING_CONFIRM=待确认, CONFIRMED=已确认\n- resource_type(资源类型,返回字段resourceType):SCENIC_SPOT=景区, ACTIVITY=活动, RESTAURANT=餐厅, HOTEL=酒店, VEHICLE=车辆", - "operationId": "updateEditUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "editId", - "in": "path", - "description": "编辑记录ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "updates", - "description": "updates", - "required": true, - "schema": { - "type": "object" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«OrderItineraryEdit»", - "originalRef": "统一响应结果«OrderItineraryEdit»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«OrderItineraryEdit»", - "originalRef": "统一响应结果«OrderItineraryEdit»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/itinerary/edits": { - "get": { - "tags": [ - "管理端订单行程编辑" - ], - "summary": "获取行程编辑记录列表", - "description": "**关联字典**:\n- itinerary_edit_action(操作类型,返回字段action):SKIP=跳过, ADD=新增节点, ADD_DAY=新增整天, ROOM_CHANGE=房型切换, VEHICLE_CHANGE=车型切换\n- itinerary_confirm_status(确认状态,返回字段confirmStatus):PENDING_CONFIRM=待确认, CONFIRMED=已确认\n- resource_type(资源类型,返回字段resourceType):SCENIC_SPOT=景区, ACTIVITY=活动, RESTAURANT=餐厅, HOTEL=酒店, VEHICLE=车辆", - "operationId": "getEditListUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«OrderItineraryEdit»»", - "originalRef": "统一响应结果«List«OrderItineraryEdit»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«OrderItineraryEdit»»", - "originalRef": "统一响应结果«List«OrderItineraryEdit»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/itinerary/merged": { - "get": { - "tags": [ - "管理端订单行程编辑" - ], - "summary": "获取合并后的行程(原始+编辑)", - "description": "**关联字典**:\n- itinerary_edit_action(操作类型,返回字段action):SKIP=跳过, ADD=新增节点, ADD_DAY=新增整天, ROOM_CHANGE=房型切换, VEHICLE_CHANGE=车型切换\n- itinerary_confirm_status(确认状态,返回字段confirmStatus):PENDING_CONFIRM=待确认, CONFIRMED=已确认\n- resource_type(资源类型,返回字段resourceType):SCENIC_SPOT=景区, ACTIVITY=活动, RESTAURANT=餐厅, HOTEL=酒店, VEHICLE=车辆", - "operationId": "getMergedItineraryUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/itinerary/pending-count": { - "get": { - "tags": [ - "管理端订单行程编辑" - ], - "summary": "获取待确认数量", - "description": "返回该订单待确认的编辑数量", - "operationId": "getPendingCountUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«long»", - "originalRef": "统一响应结果«long»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«long»", - "originalRef": "统一响应结果«long»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/itinerary/pending/{editId}": { - "delete": { - "tags": [ - "管理端订单行程编辑" - ], - "summary": "撤回待确认的修改", - "description": "软删除一条待确认的编辑记录\n\n**关联字典**:\n- itinerary_confirm_status(确认状态,返回字段confirmStatus):PENDING_CONFIRM=待确认, CONFIRMED=已确认", - "operationId": "withdrawPendingEditUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "editId", - "in": "path", - "description": "编辑记录ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": false, - "schema": { - "$ref": "#/definitions/撤销行程编辑请求", - "originalRef": "撤销行程编辑请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/itinerary/room-type-change": { - "post": { - "tags": [ - "管理端订单行程编辑" - ], - "summary": "房型切换", - "description": "执行房型切换,自动计算差价,创建待确认记录\n\n**关联字典**:\n- itinerary_edit_action(操作类型,返回字段action):ROOM_CHANGE=房型切换\n- itinerary_confirm_status(确认状态,返回字段confirmStatus):PENDING_CONFIRM=待确认, CONFIRMED=已确认\n- resource_type(资源类型,返回字段resourceType):HOTEL=酒店", - "operationId": "roomTypeChangeUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/房型变更请求", - "originalRef": "房型变更请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«OrderItineraryEdit»", - "originalRef": "统一响应结果«OrderItineraryEdit»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«OrderItineraryEdit»", - "originalRef": "统一响应结果«OrderItineraryEdit»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/itinerary/room-type-change/preview": { - "post": { - "tags": [ - "管理端订单行程编辑" - ], - "summary": "房型切换差价预览", - "description": "预览房型切换的差价,不创建记录\n\n**关联字典**:\n- resource_type(资源类型,返回字段resourceType):HOTEL=酒店", - "operationId": "previewRoomTypeChangeUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/房型变更请求", - "originalRef": "房型变更请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«差价计算结果»", - "originalRef": "统一响应结果«差价计算结果»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«差价计算结果»", - "originalRef": "统一响应结果«差价计算结果»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/itinerary/skip": { - "post": { - "tags": [ - "管理端订单行程编辑" - ], - "summary": "跳过节点", - "description": "将行程中的某个节点标记为跳过(客户不去)\n\n**关联字典**:\n- itinerary_edit_action(操作类型,返回字段action):SKIP=跳过, ADD=新增节点, ADD_DAY=新增整天, ROOM_CHANGE=房型切换, VEHICLE_CHANGE=车型切换\n- itinerary_confirm_status(确认状态,返回字段confirmStatus):PENDING_CONFIRM=待确认, CONFIRMED=已确认\n- resource_type(资源类型,返回字段resourceType):SCENIC_SPOT=景区, ACTIVITY=活动, RESTAURANT=餐厅, HOTEL=酒店, VEHICLE=车辆", - "operationId": "skipNodeUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "跳过节点请求", - "required": false, - "schema": { - "$ref": "#/definitions/跳过行程节点请求", - "originalRef": "跳过行程节点请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«OrderItineraryEdit»", - "originalRef": "统一响应结果«OrderItineraryEdit»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«OrderItineraryEdit»", - "originalRef": "统一响应结果«OrderItineraryEdit»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/itinerary/skip/{editId}": { - "delete": { - "tags": [ - "管理端订单行程编辑" - ], - "summary": "恢复跳过的节点", - "description": "取消跳过,恢复为正常状态\n\n**关联字典**:\n- itinerary_edit_action(操作类型,返回字段action):SKIP=跳过, ADD=新增节点, ADD_DAY=新增整天, ROOM_CHANGE=房型切换, VEHICLE_CHANGE=车型切换\n- itinerary_confirm_status(确认状态,返回字段confirmStatus):PENDING_CONFIRM=待确认, CONFIRMED=已确认", - "operationId": "unskipNodeUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "editId", - "in": "path", - "description": "编辑记录ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "撤销原因", - "required": false, - "schema": { - "$ref": "#/definitions/撤销行程编辑请求", - "originalRef": "撤销行程编辑请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/itinerary/vehicle-type-change": { - "post": { - "tags": [ - "管理端订单行程编辑" - ], - "summary": "车型切换", - "description": "执行车型切换,自动计算差价,创建待确认记录\n\n**关联字典**:\n- itinerary_edit_action(操作类型,返回字段action):VEHICLE_CHANGE=车型切换\n- itinerary_confirm_status(确认状态,返回字段confirmStatus):PENDING_CONFIRM=待确认, CONFIRMED=已确认\n- resource_type(资源类型,返回字段resourceType):VEHICLE=车辆", - "operationId": "vehicleTypeChangeUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/车型变更请求", - "originalRef": "车型变更请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«OrderItineraryEdit»", - "originalRef": "统一响应结果«OrderItineraryEdit»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«OrderItineraryEdit»", - "originalRef": "统一响应结果«OrderItineraryEdit»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/itinerary/vehicle-type-change/preview": { - "post": { - "tags": [ - "管理端订单行程编辑" - ], - "summary": "车型切换差价预览", - "description": "预览车型切换的差价,不创建记录\n\n**关联字典**:\n- resource_type(资源类型,返回字段resourceType):VEHICLE=车辆", - "operationId": "previewVehicleTypeChangeUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/车型变更请求", - "originalRef": "车型变更请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«差价计算结果»", - "originalRef": "统一响应结果«差价计算结果»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«差价计算结果»", - "originalRef": "统一响应结果«差价计算结果»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/process-status": { - "put": { - "tags": [ - "管理端订单接口" - ], - "summary": "推进内部流程", - "description": "内部流程推进顺序:待配房(PENDING_ROOM) → 待配车(PENDING_VEHICLE) → 待核算(PENDING_FINANCE) → 就绪(READY)\n\n仅在订单状态为已确认(CONFIRMED)时有效,每次调用自动推进到下一步\n\n【关联字典】\n- 涉及字段 processStatus → 字典:order_process_status(订单内部流程状态)", - "operationId": "advanceProcessStatusUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/record-balance": { - "put": { - "tags": [ - "管理端订单接口" - ], - "summary": "记录尾款(线下收取)", - "description": "管理员确认收到尾款 → 上传凭证。已确认(流程就绪)或待出行状态可操作", - "operationId": "recordBalanceUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "尾款信息", - "required": false, - "schema": { - "$ref": "#/definitions/记录尾款请求", - "originalRef": "记录尾款请求" - } - }, - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/remark": { - "post": { - "tags": [ - "管理端订单接口" - ], - "summary": "添加备注", - "description": "向订单时间线添加一条管理员备注。备注会记录操作人和时间,可用于内部沟通和订单跟踪", - "operationId": "addRemarkUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "remarkRequest", - "description": "备注请求", - "required": false, - "schema": { - "$ref": "#/definitions/管理员备注请求", - "originalRef": "管理员备注请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/request-unlock": { - "post": { - "tags": [ - "管理端订单接口" - ], - "summary": "申请修改(解锁已锁定订单)", - "description": "清单确认后订单进入锁定状态,如需修改需先申请解锁\n\n解锁后可重新编辑订单信息并再次确认清单", - "operationId": "requestUnlockUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "解锁原因", - "required": false, - "schema": { - "$ref": "#/definitions/申请解锁订单请求", - "originalRef": "申请解锁订单请求" - } - }, - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/room-info": { - "put": { - "tags": [ - "管理端订单接口" - ], - "summary": "更新房间信息(仅房务管理员/超级管理员)", - "description": "更新订单的房间分配信息(房型、房间号、入住安排等)。\n\n**权限**:仅ROOM_MANAGER(房务管理员)或SUPER_ADMIN(超级管理员)可操作。", - "operationId": "updateRoomInfoUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "roomInfoRequest", - "description": "房间信息请求", - "required": false, - "schema": { - "$ref": "#/definitions/房间信息请求", - "originalRef": "房间信息请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/room-info/check-diff": { - "post": { - "tags": [ - "管理端订单接口" - ], - "summary": "检测房型一致性", - "description": "检测当前房间配置是否与产品快照一致。返回 null 表示一致,否则返回不一致描述", - "operationId": "checkRoomTypeDiffUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "roomInfoJson", - "description": "roomInfoJson", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«string»", - "originalRef": "统一响应结果«string»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«string»", - "originalRef": "统一响应结果«string»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/status": { - "put": { - "tags": [ - "管理端订单接口" - ], - "summary": "更新订单状态", - "description": "合法状态流转:\n- 待支付 → 已付定金/已全额支付/已取消\n- 已付定金 → 已确认/已取消/售后中\n- 已全额支付 → 已确认/已取消/售后中\n- 已确认 → 待付尾款/待出行/已取消/售后中\n- 待付尾款 → 待出行/已取消/售后中\n- 待出行 → 旅行中/售后中\n- 旅行中 → 已完成\n- 已完成 → 售后中\n- 售后中 → 退款中\n- 退款中 → 已退款\n\n【关联字典】\n- 请求参数 status → 字典:order_status(订单状态)", - "operationId": "updateStatusUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "statusRequest", - "description": "更新订单状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/更新订单状态请求", - "originalRef": "更新订单状态请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/surcharge": { - "post": { - "tags": [ - "管理端订单接口" - ], - "summary": "添加费用增加项", - "description": "为订单添加费用增加项(如升级房型补差价、加座费等)。\n添加后系统自动重算订单尾款金额。\n\n**权限**:仅该订单的定制师或超级管理员(SUPER_ADMIN)可操作", - "operationId": "addSurchargeUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "surchargeRequest", - "description": "费用增加项请求", - "required": false, - "schema": { - "$ref": "#/definitions/费用增加项请求", - "originalRef": "费用增加项请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«OrderSurcharge»", - "originalRef": "统一响应结果«OrderSurcharge»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«OrderSurcharge»", - "originalRef": "统一响应结果«OrderSurcharge»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/surcharge/{surchargeId}": { - "put": { - "tags": [ - "管理端订单接口" - ], - "summary": "修改费用增加项", - "description": "修改已添加的费用增加项名称或金额,修改后自动重算订单尾款金额。\n\n**权限**:仅该订单的定制师或超级管理员(SUPER_ADMIN)可操作", - "operationId": "updateSurchargeUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "surchargeId", - "in": "path", - "description": "费用增加项ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "surchargeRequest", - "description": "费用增加项请求", - "required": false, - "schema": { - "$ref": "#/definitions/费用增加项请求", - "originalRef": "费用增加项请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "管理端订单接口" - ], - "summary": "删除费用增加项", - "description": "删除已添加的费用增加项,删除后自动重算订单尾款金额。\n\n**权限**:仅该订单的定制师或超级管理员(SUPER_ADMIN)可操作", - "operationId": "removeSurchargeUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "surchargeId", - "in": "path", - "description": "费用增加项ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/todos": { - "get": { - "tags": [ - "订单待办接口" - ], - "summary": "获取订单待办列表", - "description": "返回指定订单的所有待办项(含已完成和未完成)。\n待办类型包括:配房、配车、签合同、购保险、核算等,随内部流程自动生成\n\n【关联字典】\n- 返回字段 todoType → 字典:order_todo_type(订单待办类型)", - "operationId": "getOrderTodosUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«OrderTodo»»", - "originalRef": "统一响应结果«List«OrderTodo»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«OrderTodo»»", - "originalRef": "统一响应结果«List«OrderTodo»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/transport": { - "get": { - "tags": [ - "管理端订单接口" - ], - "summary": "查询交通信息", - "description": "查询订单的所有交通信息(航班/车次),按排序序号和出发时间升序排列", - "operationId": "getTransportUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«OrderTransportSegment»»", - "originalRef": "统一响应结果«List«OrderTransportSegment»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«OrderTransportSegment»»", - "originalRef": "统一响应结果«List«OrderTransportSegment»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "管理端订单接口" - ], - "summary": "保存交通信息(航班/车次)", - "description": "为订单保存交通信息,支持多条航班和车次。每次提交为全量替换(先删后增)。\n\n**使用场景**:管理员为订单录入去程/回程的航班号或车次号、出发/到达站点和时间。\n一个订单可以有多条交通记录(如:去程航班+回程航班+市内火车等)。\n\n【关联字典】\n- 请求参数 segments[].transportType → 字典:transport_type(交通类型:FLIGHT-航班, TRAIN-火车)", - "operationId": "saveTransportUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "transportRequest", - "description": "交通信息请求", - "required": false, - "schema": { - "$ref": "#/definitions/交通信息请求(批量保存)", - "originalRef": "交通信息请求(批量保存)" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«OrderTransportSegment»»", - "originalRef": "统一响应结果«List«OrderTransportSegment»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«OrderTransportSegment»»", - "originalRef": "统一响应结果«List«OrderTransportSegment»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/travelers": { - "get": { - "tags": [ - "管理端订单接口" - ], - "summary": "获取订单出行人列表", - "description": "返回指定订单的所有出行人信息,用于保险投保时自动填充被保人。\n\n**权限**:需管理员登录\n\n**关联字典**:\n- 返回字段 travelerType → 字典:traveler_type(出行人类型)\n- 返回字段 idCardType → 字典:id_card_type(证件类型)\n- 返回字段 gender → 字典:gender(性别)", - "operationId": "getOrderTravelersUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«OrderTraveler»»", - "originalRef": "统一响应结果«List«OrderTraveler»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«OrderTraveler»»", - "originalRef": "统一响应结果«List«OrderTraveler»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/vehicle-assignment": { - "put": { - "tags": [ - "管理端订单接口" - ], - "summary": "分配车辆信息", - "description": "为订单分配具体的车辆和司机信息(车型、品牌、车牌号、司机姓名和电话)。\n分配后信息将展示在订单详情和C端行程中", - "operationId": "assignVehicleUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/车辆分配请求", - "originalRef": "车辆分配请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/vehicle-info": { - "put": { - "tags": [ - "管理端订单接口" - ], - "summary": "更新车辆信息(仅车务管理员/超级管理员)", - "description": "更新订单的车辆分配信息(车型、车牌号、司机等)。\n\n**权限**:仅VEHICLE_MANAGER(车务管理员)或SUPER_ADMIN(超级管理员)可操作。", - "operationId": "updateVehicleInfoUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "vehicleInfoRequest", - "description": "车辆信息请求", - "required": false, - "schema": { - "$ref": "#/definitions/车辆信息请求", - "originalRef": "车辆信息请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/{orderId}/vehicle-info/check-diff": { - "post": { - "tags": [ - "管理端订单接口" - ], - "summary": "检测车型一致性", - "description": "检测当前车辆配置是否与产品快照一致。返回 null 表示一致,否则返回不一致描述", - "operationId": "checkVehicleTypeDiffUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderId", - "in": "path", - "description": "订单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "vehicleInfoJson", - "description": "vehicleInfoJson", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«string»", - "originalRef": "统一响应结果«string»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«string»", - "originalRef": "统一响应结果«string»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/refund-policy": { - "post": { - "tags": [ - "退款政策管理" - ], - "summary": "创建退款政策", - "description": "退款政策定义按距出发天数的退款比例阶梯\n\n例如:出发前30天退90%,前15天退70%,前7天退50%,7天内不可退\n\n创建后需在产品设计时绑定,产品未绑定退款政策时使用默认政策", - "operationId": "createUsingPOST_2", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "policyRequest", - "description": "创建退款政策请求", - "required": false, - "schema": { - "$ref": "#/definitions/退款政策请求", - "originalRef": "退款政策请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款政策VO»", - "originalRef": "统一响应结果«退款政策VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款政策VO»", - "originalRef": "统一响应结果«退款政策VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/refund-policy/enabled": { - "get": { - "tags": [ - "退款政策管理" - ], - "summary": "启用的退款政策列表", - "description": "仅返回启用状态的政策,供产品设计时选择绑定", - "operationId": "listEnabledUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«退款政策VO»»", - "originalRef": "统一响应结果«List«退款政策VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«退款政策VO»»", - "originalRef": "统一响应结果«List«退款政策VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/refund-policy/list": { - "get": { - "tags": [ - "退款政策管理" - ], - "summary": "退款政策列表", - "description": "返回所有退款政策(含禁用),按默认→创建时间倒序", - "operationId": "listUsingGET_2", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«退款政策VO»»", - "originalRef": "统一响应结果«List«退款政策VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«退款政策VO»»", - "originalRef": "统一响应结果«List«退款政策VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/refund-policy/{policyId}": { - "get": { - "tags": [ - "退款政策管理" - ], - "summary": "退款政策详情", - "operationId": "detailUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "policyId", - "in": "path", - "description": "退款政策ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款政策VO»", - "originalRef": "统一响应结果«退款政策VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款政策VO»", - "originalRef": "统一响应结果«退款政策VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "退款政策管理" - ], - "summary": "修改退款政策", - "operationId": "updateUsingPUT_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "policyId", - "in": "path", - "description": "退款政策ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "policyRequest", - "description": "修改退款政策请求", - "required": false, - "schema": { - "$ref": "#/definitions/退款政策请求", - "originalRef": "退款政策请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款政策VO»", - "originalRef": "统一响应结果«退款政策VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款政策VO»", - "originalRef": "统一响应结果«退款政策VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "退款政策管理" - ], - "summary": "删除退款政策", - "description": "软删除。已绑定该政策的产品申请退款时将降级使用默认政策。不影响历史退款申请(已快照)。", - "operationId": "deleteUsingDELETE_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "policyId", - "in": "path", - "description": "退款政策ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/refund-policy/{policyId}/toggle": { - "put": { - "tags": [ - "退款政策管理" - ], - "summary": "启用/禁用退款政策", - "description": "禁用后不再出现在产品设计的可选列表中,已绑定的产品申请退款时降级使用默认政策", - "operationId": "toggleUsingPUT_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "enabled", - "in": "query", - "description": "是否启用", - "required": false, - "type": "boolean", - "allowEmptyValue": false - }, - { - "name": "policyId", - "in": "path", - "description": "退款政策ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/refund/list": { - "get": { - "tags": [ - "退款管理" - ], - "summary": "退款申请列表", - "description": "分页查询退款申请,支持按状态筛选。\n状态包括:PENDING(待审批)、APPROVED(已通过)、REJECTED(已拒绝)、REFUNDING(退款中)、REFUNDED(已退款)、CANCELLED(已撤回)、APPEAL(申诉中)\n\n【关联字典】\n- 筛选参数 status → 字典:refund_status(退款状态)\n- 返回字段 status → 字典:refund_status(退款状态)", - "operationId": "listApplicationsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "status", - "in": "query", - "description": "状态", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«退款申请VO»»", - "originalRef": "统一响应结果«分页结果«退款申请VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«退款申请VO»»", - "originalRef": "统一响应结果«分页结果«退款申请VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/refund/reason": { - "post": { - "tags": [ - "退款管理" - ], - "summary": "创建退款原因", - "description": "新增退款原因选项,C端用户申请退款时可选择。按sortOrder排序展示\n\n【关联字典】\n- 请求参数 category → 字典:refund_reason_category(退款原因分类)", - "operationId": "createReasonUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "createRequest", - "description": "创建退款原因请求", - "required": false, - "schema": { - "$ref": "#/definitions/创建退款原因请求", - "originalRef": "创建退款原因请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款原因VO»", - "originalRef": "统一响应结果«退款原因VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款原因VO»", - "originalRef": "统一响应结果«退款原因VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/refund/reason/list": { - "get": { - "tags": [ - "退款管理" - ], - "summary": "退款原因列表", - "description": "获取所有退款原因选项(含禁用的),用于退款原因管理页面\n\n【关联字典】\n- 返回字段 category → 字典:refund_reason_category(退款原因分类)", - "operationId": "listReasonsUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«退款原因VO»»", - "originalRef": "统一响应结果«List«退款原因VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«退款原因VO»»", - "originalRef": "统一响应结果«List«退款原因VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/refund/reason/{reasonId}": { - "put": { - "tags": [ - "退款管理" - ], - "summary": "修改退款原因", - "description": "修改退款原因的文本、分类或排序,不影响已使用该原因的历史退款申请\n\n【关联字典】\n- 请求参数 category → 字典:refund_reason_category(退款原因分类)", - "operationId": "updateReasonUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "reasonId", - "in": "path", - "description": "退款原因ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "updateRequest", - "description": "修改退款原因请求", - "required": false, - "schema": { - "$ref": "#/definitions/修改退款原因请求", - "originalRef": "修改退款原因请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款原因VO»", - "originalRef": "统一响应结果«退款原因VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款原因VO»", - "originalRef": "统一响应结果«退款原因VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "退款管理" - ], - "summary": "删除退款原因", - "description": "软删除退款原因,删除后C端不再展示。不影响已使用该原因的历史退款申请", - "operationId": "deleteReasonUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "reasonId", - "in": "path", - "description": "退款原因ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/refund/{applicationId}": { - "get": { - "tags": [ - "退款管理" - ], - "summary": "退款申请详情", - "description": "返回退款申请的完整信息,包括退款原因、申请金额、实退金额、审批记录、申诉信息等\n\n【关联字典】\n- 返回字段 status → 字典:refund_status(退款状态)", - "operationId": "getDetailUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "applicationId", - "in": "path", - "description": "退款申请ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款申请VO»", - "originalRef": "统一响应结果«退款申请VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款申请VO»", - "originalRef": "统一响应结果«退款申请VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/refund/{applicationId}/complete": { - "put": { - "tags": [ - "退款管理" - ], - "summary": "手动完成退款", - "description": "用于测试订单或线下退款场景。将处于'退款中'状态的退款申请直接标记为'已退款'", - "operationId": "manualCompleteUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "applicationId", - "in": "path", - "description": "退款申请ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款申请VO»", - "originalRef": "统一响应结果«退款申请VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款申请VO»", - "originalRef": "统一响应结果«退款申请VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/refund/{applicationId}/execute-appeal": { - "put": { - "tags": [ - "退款管理" - ], - "summary": "申诉通过后执行退款", - "description": "申诉退款流程:用户发起申诉 → 企微OA审批 → 审批通过后管理员确认实退金额 → 调起微信退款", - "operationId": "executeAppealUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "appealRequest", - "description": "申诉退款执行请求", - "required": false, - "schema": { - "$ref": "#/definitions/申诉退款执行请求", - "originalRef": "申诉退款执行请求" - } - }, - { - "name": "applicationId", - "in": "path", - "description": "退款申请ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款申请VO»", - "originalRef": "统一响应结果«退款申请VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款申请VO»", - "originalRef": "统一响应结果«退款申请VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/refund/{applicationId}/review": { - "put": { - "tags": [ - "退款管理" - ], - "summary": "审批退款申请", - "description": "退款审批流程:查看退款申请 → 决定通过/拒绝 → 通过时填写实退金额 → 系统自动调起微信退款\n\n拒绝后用户可发起申诉\n\n【关联字典】\n- 返回字段 status → 字典:refund_status(退款状态)", - "operationId": "reviewUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "applicationId", - "in": "path", - "description": "退款申请ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "reviewRequest", - "description": "审批退款请求", - "required": false, - "schema": { - "$ref": "#/definitions/管理员退款审批请求", - "originalRef": "管理员退款审批请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款申请VO»", - "originalRef": "统一响应结果«退款申请VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«退款申请VO»", - "originalRef": "统一响应结果«退款申请VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/invoice/page": { - "get": { - "tags": [ - "发票管理" - ], - "summary": "发票分页列表", - "description": "分页查询发票申请列表,支持按状态、订单号、用户ID筛选。\n\n【关联字典】\n- 筛选参数 status → 字典:invoice_status(发票状态):PENDING=待开票, ISSUED=已开票, FAILED=开票失败, VOIDED=已作废\n- 返回字段 titleType → 字典:invoice_title_type(抬头类型):PERSONAL=个人, COMPANY=企业\n- 返回字段 status → 字典:invoice_status(发票状态)", - "operationId": "pageInvoicesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "orderNo", - "in": "query", - "description": "订单编号(模糊搜索)", - "required": false, - "type": "string", - "x-example": "HL2026" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 20 - }, - { - "name": "status", - "in": "query", - "description": "发票状态(字典:invoice_status)", - "required": false, - "type": "string", - "x-example": "PENDING" - }, - { - "name": "userId", - "in": "query", - "description": "用户ID", - "required": false, - "type": "integer", - "format": "int64", - "x-example": 1760000000000001 - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«发票VO»»", - "originalRef": "统一响应结果«分页结果«发票VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«发票VO»»", - "originalRef": "统一响应结果«分页结果«发票VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/invoice/upload": { - "post": { - "tags": [ - "发票管理" - ], - "summary": "上传发票文件", - "description": "上传发票PDF/图片文件,返回文件访问URL。\n上传成功后,将返回的fileUrl传给「开票完成」接口即可。\n\n【支持格式】PDF、JPG、PNG\n【大小限制】10MB", - "operationId": "uploadInvoiceFileUsingPOST", - "consumes": [ - "multipart/form-data" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "file", - "in": "formData", - "description": "发票文件(PDF/JPG/PNG)", - "required": false, - "type": "file" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/invoice/{id}": { - "get": { - "tags": [ - "发票管理" - ], - "summary": "发票详情", - "description": "获取发票的完整信息,包含开票信息、用户信息、企业信息等。\n\n【关联字典】\n- 返回字段 titleType → 字典:invoice_title_type(抬头类型)\n- 返回字段 status → 字典:invoice_status(发票状态)", - "operationId": "getInvoiceDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "发票ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«发票VO»", - "originalRef": "统一响应结果«发票VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«发票VO»", - "originalRef": "统一响应结果«发票VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/invoice/{id}/fail": { - "put": { - "tags": [ - "发票管理" - ], - "summary": "开票失败", - "description": "标记发票开票失败,需填写失败原因。用户可根据原因修正后重新申请。\n只有待开票(PENDING)状态的发票可以操作。", - "operationId": "failInvoiceUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "发票ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "failRequest", - "description": "failRequest", - "required": true, - "schema": { - "$ref": "#/definitions/管理员开票失败请求", - "originalRef": "管理员开票失败请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«发票VO»", - "originalRef": "统一响应结果«发票VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«发票VO»", - "originalRef": "统一响应结果«发票VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/invoice/{id}/issue": { - "put": { - "tags": [ - "发票管理" - ], - "summary": "开票完成", - "description": "管理员上传发票文件并填写发票号码后,将发票状态改为已开票。\n只有待开票(PENDING)或开票失败(FAILED)状态的发票可以操作。", - "operationId": "issueInvoiceUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "发票ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "issueRequest", - "description": "issueRequest", - "required": true, - "schema": { - "$ref": "#/definitions/管理员开票请求", - "originalRef": "管理员开票请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«发票VO»", - "originalRef": "统一响应结果«发票VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«发票VO»", - "originalRef": "统一响应结果«发票VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/invoice/{id}/void": { - "put": { - "tags": [ - "发票管理" - ], - "summary": "作废发票", - "description": "将发票标记为已作废。已作废的发票不可重复作废。", - "operationId": "voidInvoiceUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "发票ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«发票VO»", - "originalRef": "统一响应结果«发票VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«发票VO»", - "originalRef": "统一响应结果«发票VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/customize/page": { - "get": { - "tags": [ - "私人定制管理" - ], - "summary": "定制请求列表", - "description": "分页查询定制请求,支持关键词搜索、状态筛选、定制师筛选\n\n【关联字典】\n- 筛选参数 status → 字典:customize_request_status(定制请求状态)\n- 返回字段 status → 字典:customize_request_status(定制请求状态)\n- 返回字段 travelPurpose → 字典:travel_purpose(旅游目的)\n- 返回字段 requestType → 字典:customize_request_type(需求类型)\n- 返回字段 budget → 字典:customize_budget(预算范围)", - "operationId": "pageUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "designerId", - "in": "query", - "description": "定制师ID", - "required": false, - "type": "integer", - "format": "int64", - "x-example": 1234567890 - }, - { - "name": "keyword", - "in": "query", - "description": "搜索关键词(联系人/目标地区/需求描述)", - "required": false, - "type": "string", - "x-example": "云南" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 20 - }, - { - "name": "sortBy", - "in": "query", - "description": "排序字段(createTime/startDate)", - "required": false, - "type": "string", - "x-example": "createTime" - }, - { - "name": "sortDir", - "in": "query", - "description": "排序方向(desc/asc)", - "required": false, - "type": "string", - "x-example": "desc" - }, - { - "name": "status", - "in": "query", - "description": "状态(字典:customize_request_status)", - "required": false, - "type": "string", - "x-example": "PENDING" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«定制请求列表VO»»", - "originalRef": "统一响应结果«分页结果«定制请求列表VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«定制请求列表VO»»", - "originalRef": "统一响应结果«分页结果«定制请求列表VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/customize/{requestId}": { - "get": { - "tags": [ - "私人定制管理" - ], - "summary": "定制请求详情", - "description": "查看定制请求完整信息\n\n【关联字典】\n- 返回字段 status → 字典:customize_request_status(定制请求状态)\n- 返回字段 travelPurpose → 字典:travel_purpose(旅游目的)\n- 返回字段 requestType → 字典:customize_request_type(需求类型)\n- 返回字段 budget → 字典:customize_budget(预算范围)", - "operationId": "detailUsingGET_2", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "requestId", - "in": "path", - "description": "定制请求ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«定制请求详情VO»", - "originalRef": "统一响应结果«定制请求详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«定制请求详情VO»", - "originalRef": "统一响应结果«定制请求详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/customize/{requestId}/accept": { - "put": { - "tags": [ - "私人定制管理" - ], - "summary": "接受定制请求", - "description": "定制师接受定制请求,状态从待处理变为已接受。如果用户未指定定制师,系统将自动分配当前操作人为定制师", - "operationId": "acceptUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "requestId", - "in": "path", - "description": "定制请求ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«定制请求详情VO»", - "originalRef": "统一响应结果«定制请求详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«定制请求详情VO»", - "originalRef": "统一响应结果«定制请求详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/customize/{requestId}/complete": { - "put": { - "tags": [ - "私人定制管理" - ], - "summary": "标记完成", - "description": "将已报价的定制请求标记为已完成(用户已确认方案或已下单)", - "operationId": "completeUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "requestId", - "in": "path", - "description": "定制请求ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«定制请求详情VO»", - "originalRef": "统一响应结果«定制请求详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«定制请求详情VO»", - "originalRef": "统一响应结果«定制请求详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/order/customize/{requestId}/reply": { - "put": { - "tags": [ - "私人定制管理" - ], - "summary": "回复/报价", - "description": "定制师回复定制请求或提交报价方案。\n- 仅填写回复内容:状态变为「设计中」\n- 同时关联产品ID:状态变为「已报价」\n\n只有已接受或设计中状态可以回复", - "operationId": "replyUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "requestId", - "in": "path", - "description": "定制请求ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "replyRequest", - "description": "replyRequest", - "required": true, - "schema": { - "$ref": "#/definitions/定制师回复/报价请求", - "originalRef": "定制师回复/报价请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«定制请求详情VO»", - "originalRef": "统一响应结果«定制请求详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«定制请求详情VO»", - "originalRef": "统一响应结果«定制请求详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - } - }, - "definitions": { - "AlbumFileAddRequest": { - "type": "object", - "properties": { - "customLocation": { - "type": "string", - "description": "自定义地点文本(地点类型为CUSTOM时)" - }, - "description": { - "type": "string", - "description": "文件描述" - }, - "fileId": { - "type": "integer", - "format": "int64", - "description": "文件ID(来自file_info)" - }, - "fileType": { - "type": "string", - "description": "文件类型: IMAGE/VIDEO" - }, - "locationType": { - "type": "string", - "description": "地点类型: RESOURCE/CUSTOM" - }, - "ossUrl": { - "type": "string", - "description": "文件访问URL" - }, - "resourceId": { - "type": "integer", - "format": "int64", - "description": "资源ID(地点类型为RESOURCE时)" - }, - "resourceName": { - "type": "string", - "description": "资源名称(地点类型为RESOURCE时)" - }, - "resourceType": { - "type": "string", - "description": "资源类型(地点类型为RESOURCE时)" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序号" - }, - "thumbnailUrl": { - "type": "string", - "description": "缩略图URL" - } - }, - "title": "AlbumFileAddRequest" - }, - "AlbumFileBatchAddRequest": { - "type": "object", - "properties": { - "files": { - "type": "array", - "description": "文件列表", - "items": { - "$ref": "#/definitions/AlbumFileAddRequest", - "originalRef": "AlbumFileAddRequest" - } - } - }, - "title": "AlbumFileBatchAddRequest" - }, - "AlbumFileUpdateRequest": { - "type": "object", - "properties": { - "customLocation": { - "type": "string", - "description": "自定义地点文本" - }, - "description": { - "type": "string", - "description": "文件描述" - }, - "locationType": { - "type": "string", - "description": "地点类型: RESOURCE/CUSTOM" - }, - "resourceId": { - "type": "integer", - "format": "int64", - "description": "资源ID" - }, - "resourceName": { - "type": "string", - "description": "资源名称" - }, - "resourceType": { - "type": "string", - "description": "资源类型" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序号" - } - }, - "title": "AlbumFileUpdateRequest" - }, - "AlbumFileVO": { - "type": "object", - "properties": { - "albumFileId": { - "type": "integer", - "format": "int64", - "description": "相册文件ID" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "integer", - "format": "int64", - "description": "上传人ID" - }, - "customLocation": { - "type": "string", - "description": "自定义地点文本" - }, - "description": { - "type": "string", - "description": "文件描述" - }, - "fileId": { - "type": "integer", - "format": "int64", - "description": "文件ID" - }, - "fileType": { - "type": "string", - "description": "文件类型: IMAGE/VIDEO" - }, - "folderId": { - "type": "integer", - "format": "int64", - "description": "所属文件夹ID" - }, - "locationText": { - "type": "string", - "description": "地点显示文本" - }, - "locationType": { - "type": "string", - "description": "地点类型: RESOURCE/CUSTOM" - }, - "ossUrl": { - "type": "string", - "description": "文件访问URL" - }, - "resourceId": { - "type": "integer", - "format": "int64", - "description": "资源ID" - }, - "resourceName": { - "type": "string", - "description": "资源名称" - }, - "resourceType": { - "type": "string", - "description": "资源类型" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序号" - }, - "thumbnailUrl": { - "type": "string", - "description": "缩略图URL" - } - }, - "title": "AlbumFileVO" - }, - "AlbumFolderRequest": { - "type": "object", - "properties": { - "folderName": { - "type": "string", - "description": "文件夹名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序号" - } - }, - "title": "AlbumFolderRequest" - }, - "AlbumFolderVO": { - "type": "object", - "properties": { - "coverThumbnailUrl": { - "type": "string", - "description": "封面缩略图URL" - }, - "coverUrl": { - "type": "string", - "description": "封面文件URL" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "integer", - "format": "int64", - "description": "创建人ID" - }, - "fileCount": { - "type": "integer", - "format": "int32", - "description": "文件数量" - }, - "folderId": { - "type": "integer", - "format": "int64", - "description": "文件夹ID" - }, - "folderName": { - "type": "string", - "description": "文件夹名称" - }, - "orderId": { - "type": "integer", - "format": "int64", - "description": "关联订单ID" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序号" - } - }, - "title": "AlbumFolderVO" - }, - "CreateWorkOrderRequest": { - "type": "object", - "required": [ - "description", - "orderId", - "priority", - "type" - ], - "properties": { - "assigneeAdminId": { - "type": "integer", - "format": "int64", - "description": "指定处理人ID" - }, - "assigneeName": { - "type": "string", - "description": "指定处理人姓名" - }, - "attachmentUrls": { - "type": "string", - "description": "附件URL(JSON数组)" - }, - "costDifference": { - "type": "number", - "description": "差价(正数=客户需补差价, 负数=需退费给客户)" - }, - "description": { - "type": "string", - "description": "问题描述" - }, - "orderId": { - "type": "integer", - "format": "int64", - "description": "关联订单ID" - }, - "priority": { - "type": "string", - "description": "优先级: URGENT(紧急,如当天出发需处理)/NORMAL(普通)" - }, - "resourceDetail": { - "type": "string", - "description": "资源详情JSON(酒店/车辆/景点信息)" - }, - "type": { - "type": "string", - "description": "工单类型: ROOM_CHANGE(换房)/ROOM_ADD(加房)/CHECKOUT_CHANGE(改退房日期)/HOTEL_ISSUE(酒店问题)/VEHICLE_CHANGE(换车)/SCENIC_ADD(加景点)/SCENIC_REMOVE(减景点)/OTHER(其他)" - } - }, - "title": "CreateWorkOrderRequest" - }, - "Map«string,object»": { - "type": "object", - "title": "Map«string,object»", - "additionalProperties": { - "type": "object" - } - }, - "Map«string,object»_1": { - "type": "object", - "title": "Map«string,object»_1", - "additionalProperties": { - "type": "object" - } - }, - "Map«string,object»_2": { - "type": "object", - "title": "Map«string,object»_2", - "additionalProperties": { - "type": "object" - } - }, - "Map«string,object»_3": { - "type": "object", - "title": "Map«string,object»_3", - "additionalProperties": { - "type": "object" - } - }, - "Map«string,object»_4": { - "type": "object", - "title": "Map«string,object»_4", - "additionalProperties": { - "type": "object" - } - }, - "OrderDiscount": { - "type": "object", - "properties": { - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "deletedAt": { - "type": "string", - "format": "date-time", - "description": "删除时间(软删除)" - }, - "discountAmount": { - "type": "number", - "description": "优惠金额" - }, - "discountId": { - "type": "integer", - "format": "int64", - "description": "优惠ID" - }, - "discountName": { - "type": "string", - "description": "优惠名称" - }, - "orderId": { - "type": "integer", - "format": "int64", - "description": "订单ID" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "OrderDiscount" - }, - "OrderItineraryEdit": { - "type": "object", - "properties": { - "action": { - "type": "string", - "description": "操作类型:SKIP/ADD" - }, - "balanceAdjustment": { - "type": "number", - "description": "尾款调整金额(正数=增加尾款,负数=减少尾款)" - }, - "changeDays": { - "type": "integer", - "format": "int32", - "description": "变更天数" - }, - "changeReasonCode": { - "type": "string", - "description": "变更原因代码(字典项)" - }, - "changeReasonLabel": { - "type": "string", - "description": "变更原因标签" - }, - "confirmStatus": { - "type": "string", - "description": "确认状态:PENDING_CONFIRM/CONFIRMED" - }, - "confirmedAt": { - "type": "string", - "format": "date-time", - "description": "确认时间" - }, - "confirmedBy": { - "type": "integer", - "format": "int64", - "description": "确认人ID" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "dayNumber": { - "type": "integer", - "format": "int32", - "description": "行程天数编号" - }, - "deletedAt": { - "type": "string", - "format": "date-time", - "description": "删除时间(软删除)" - }, - "description": { - "type": "string", - "description": "节点描述(ADD时)" - }, - "editId": { - "type": "integer", - "format": "int64", - "description": "编辑ID" - }, - "newResourceName": { - "type": "string", - "description": "新资源名称(房型/车型)" - }, - "newUnitPrice": { - "type": "number", - "description": "新单价(日均)" - }, - "nodeId": { - "type": "string", - "description": "原节点ID(SKIP时必填)" - }, - "nodeName": { - "type": "string", - "description": "节点名称(ADD时)" - }, - "nodeType": { - "type": "string", - "description": "节点类型(ADD时)" - }, - "operatorId": { - "type": "integer", - "format": "int64", - "description": "操作人ID" - }, - "operatorName": { - "type": "string", - "description": "操作人姓名" - }, - "orderId": { - "type": "integer", - "format": "int64", - "description": "订单ID" - }, - "originalResourceName": { - "type": "string", - "description": "原资源名称(房型/车型)" - }, - "originalUnitPrice": { - "type": "number", - "description": "原单价(日均)" - }, - "reason": { - "type": "string", - "description": "修改原因" - }, - "resourceId": { - "type": "integer", - "format": "int64", - "description": "关联资源ID" - }, - "resourceType": { - "type": "string", - "description": "关联资源类型:SCENIC_SPOT/ACTIVITY/RESTAURANT/HOTEL/VEHICLE" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号(ADD时)" - }, - "startTime": { - "type": "string", - "description": "开始时间(ADD时)" - }, - "suggestedAdjustment": { - "type": "number", - "description": "系统建议差价" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "OrderItineraryEdit" - }, - "OrderSurcharge": { - "type": "object", - "properties": { - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "deletedAt": { - "type": "string", - "format": "date-time", - "description": "删除时间(软删除)" - }, - "orderId": { - "type": "integer", - "format": "int64", - "description": "订单ID" - }, - "surchargeAmount": { - "type": "number", - "description": "费用增加金额" - }, - "surchargeId": { - "type": "integer", - "format": "int64", - "description": "费用增加项ID" - }, - "surchargeName": { - "type": "string", - "description": "费用增加项名称" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "OrderSurcharge" - }, - "OrderTimeline": { - "type": "object", - "properties": { - "action": { - "type": "string", - "description": "操作动作" - }, - "actionLabel": { - "type": "string", - "description": "操作动作中文标签" - }, - "content": { - "type": "string", - "description": "操作内容" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "deletedAt": { - "type": "string", - "format": "date-time", - "description": "删除时间(软删除)" - }, - "operatorId": { - "type": "integer", - "format": "int64", - "description": "操作人ID" - }, - "operatorName": { - "type": "string", - "description": "操作人姓名" - }, - "operatorType": { - "type": "string", - "description": "操作人类型:USER=用户 ADMIN=管理员 SYSTEM=系统" - }, - "operatorTypeLabel": { - "type": "string", - "description": "操作人类型中文标签" - }, - "orderId": { - "type": "integer", - "format": "int64", - "description": "订单ID" - }, - "timelineId": { - "type": "integer", - "format": "int64", - "description": "时间线ID" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "OrderTimeline" - }, - "OrderTodo": { - "type": "object", - "properties": { - "assigneeAdminId": { - "type": "integer", - "format": "int64", - "description": "指派管理员ID" - }, - "assigneeRoleKey": { - "type": "string", - "description": "指派角色Key" - }, - "assigneeRoleLabel": { - "type": "string", - "description": "指派角色中文标签" - }, - "completedAt": { - "type": "string", - "format": "date-time", - "description": "完成时间" - }, - "completedBy": { - "type": "integer", - "format": "int64", - "description": "完成人ID" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "deletedAt": { - "type": "string", - "format": "date-time", - "description": "删除时间(软删除)" - }, - "lastNotifiedAt": { - "type": "string", - "format": "date-time", - "description": "最后通知时间" - }, - "notificationCount": { - "type": "integer", - "format": "int32", - "description": "通知次数" - }, - "orderId": { - "type": "integer", - "format": "int64", - "description": "订单ID" - }, - "orderNo": { - "type": "string", - "description": "订单编号" - }, - "sequence": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "status": { - "type": "string", - "description": "待办状态" - }, - "todoId": { - "type": "integer", - "format": "int64", - "description": "待办ID" - }, - "todoLabel": { - "type": "string", - "description": "待办标签" - }, - "todoType": { - "type": "string", - "description": "待办类型" - }, - "todoTypeLabel": { - "type": "string", - "description": "待办类型中文标签" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "OrderTodo" - }, - "OrderTransportSegment": { - "type": "object", - "properties": { - "arriveStation": { - "type": "string", - "description": "到达站/到达机场" - }, - "arriveTime": { - "type": "string", - "format": "date-time", - "description": "到达时间" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "deletedAt": { - "type": "string", - "format": "date-time", - "description": "删除时间(软删除)" - }, - "departStation": { - "type": "string", - "description": "出发站/出发机场" - }, - "departTime": { - "type": "string", - "format": "date-time", - "description": "出发时间" - }, - "orderId": { - "type": "integer", - "format": "int64", - "description": "订单ID" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "segmentId": { - "type": "integer", - "format": "int64", - "description": "分段ID" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "transportNo": { - "type": "string", - "description": "航班号/车次号" - }, - "transportType": { - "type": "string", - "description": "交通类型(字典:transport_type): FLIGHT-航班, TRAIN-火车" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "OrderTransportSegment" - }, - "OrderTraveler": { - "type": "object", - "properties": { - "birthday": { - "type": "string", - "format": "date", - "description": "出生日期" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "deletedAt": { - "type": "string", - "format": "date-time", - "description": "删除时间(软删除)" - }, - "email": { - "type": "string", - "description": "邮箱地址" - }, - "emergencyContact": { - "type": "string", - "description": "紧急联系人姓名" - }, - "emergencyPhone": { - "type": "string", - "description": "紧急联系人电话(加密存储)" - }, - "gender": { - "type": "string", - "description": "性别(字典:gender)" - }, - "idCardNo": { - "type": "string", - "description": "证件号码(加密存储)" - }, - "idCardType": { - "type": "string", - "description": "证件类型(字典:id_card_type)" - }, - "idCardTypeLabel": { - "type": "string", - "description": "证件类型中文标签" - }, - "insurancePolicies": { - "type": "array", - "description": "该出行人的保险保单列表(按人合并,含保障期间和保单号)", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "name": { - "type": "string", - "description": "出行人姓名" - }, - "nationality": { - "type": "string", - "description": "国籍" - }, - "orderId": { - "type": "integer", - "format": "int64", - "description": "订单ID" - }, - "orderTravelerId": { - "type": "integer", - "format": "int64", - "description": "出行人记录ID" - }, - "phone": { - "type": "string", - "description": "手机号码(加密存储)" - }, - "travelerType": { - "type": "string", - "description": "出行人类型(字典:traveler_type)" - }, - "travelerTypeLabel": { - "type": "string", - "description": "出行人类型中文标签" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "OrderTraveler" - }, - "PrevDayHotel": { - "type": "object", - "properties": { - "hotelId": { - "type": "integer", - "format": "int64", - "description": "酒店ID" - }, - "hotelName": { - "type": "string", - "description": "酒店名称" - }, - "roomTypeId": { - "type": "integer", - "format": "int64", - "description": "房型ID" - }, - "roomTypeName": { - "type": "string", - "description": "房型名称" - } - }, - "title": "PrevDayHotel" - }, - "ProcessWorkOrderRequest": { - "type": "object", - "required": [ - "action" - ], - "properties": { - "action": { - "type": "string", - "description": "操作: RESOLVE(解决) / REJECT(驳回)" - }, - "costDifference": { - "type": "number", - "description": "调整后差价" - }, - "rejectReason": { - "type": "string", - "description": "驳回原因(驳回时填写)" - }, - "resolution": { - "type": "string", - "description": "处理结果(解决时填写)" - } - }, - "title": "ProcessWorkOrderRequest" - }, - "WorkOrderVO": { - "type": "object", - "properties": { - "assigneeAdminId": { - "type": "string", - "description": "处理人ID" - }, - "assigneeName": { - "type": "string", - "description": "处理人姓名" - }, - "attachmentUrls": { - "type": "string", - "description": "附件URL(JSON数组)" - }, - "costDifference": { - "type": "number", - "description": "差价" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "creatorAdminId": { - "type": "string", - "description": "发起人ID" - }, - "creatorName": { - "type": "string", - "description": "发起人姓名" - }, - "description": { - "type": "string", - "description": "问题描述" - }, - "logs": { - "type": "array", - "description": "操作日志列表", - "items": { - "$ref": "#/definitions/工单操作日志VO", - "originalRef": "工单操作日志VO" - } - }, - "orderId": { - "type": "string", - "description": "关联订单ID" - }, - "orderNo": { - "type": "string", - "description": "关联订单编号" - }, - "priority": { - "type": "string", - "description": "优先级" - }, - "priorityLabel": { - "type": "string", - "description": "优先级标签" - }, - "rejectReason": { - "type": "string", - "description": "驳回原因" - }, - "resolution": { - "type": "string", - "description": "处理结果" - }, - "resolvedAt": { - "type": "string", - "format": "date-time", - "description": "处理完成时间" - }, - "resourceDetail": { - "type": "string", - "description": "资源详情JSON" - }, - "status": { - "type": "string", - "description": "状态" - }, - "statusLabel": { - "type": "string", - "description": "状态标签" - }, - "type": { - "type": "string", - "description": "工单类型" - }, - "typeLabel": { - "type": "string", - "description": "工单类型标签" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "workOrderId": { - "type": "string", - "description": "工单ID" - }, - "workOrderNo": { - "type": "string", - "description": "工单编号" - } - }, - "title": "WorkOrderVO" - }, - "交通信息请求(批量保存)": { - "type": "object", - "required": [ - "segments" - ], - "properties": { - "segments": { - "type": "array", - "description": "交通分段列表", - "items": { - "$ref": "#/definitions/交通分段项", - "originalRef": "交通分段项" - } - } - }, - "title": "交通信息请求(批量保存)" - }, - "交通分段项": { - "type": "object", - "required": [ - "transportType" - ], - "properties": { - "arriveStation": { - "type": "string", - "example": "广州白云T2", - "description": "到达站/到达机场" - }, - "arriveTime": { - "type": "string", - "format": "date-time", - "example": "2026-04-01T11:45:00", - "description": "到达时间" - }, - "departStation": { - "type": "string", - "example": "北京首都T3", - "description": "出发站/出发机场" - }, - "departTime": { - "type": "string", - "format": "date-time", - "example": "2026-04-01T08:30:00", - "description": "出发时间" - }, - "remark": { - "type": "string", - "example": "请提前2小时到达机场", - "description": "备注" - }, - "transportNo": { - "type": "string", - "example": "CA1234", - "description": "航班号/车次号" - }, - "transportType": { - "type": "string", - "example": "FLIGHT", - "description": "交通类型(字典:transport_type): FLIGHT-航班, TRAIN-火车" - } - }, - "title": "交通分段项" - }, - "优惠项请求": { - "type": "object", - "required": [ - "discountAmount", - "discountName" - ], - "properties": { - "discountAmount": { - "type": "number", - "example": 100.0, - "description": "优惠金额" - }, - "discountName": { - "type": "string", - "example": "会员折扣", - "description": "优惠项目名称" - } - }, - "title": "优惠项请求" - }, - "修改定金金额请求": { - "type": "object", - "required": [ - "amount" - ], - "properties": { - "amount": { - "type": "number", - "example": 500.0, - "description": "定金金额" - } - }, - "title": "修改定金金额请求" - }, - "修改订单过期时间请求": { - "type": "object", - "required": [ - "minutes" - ], - "properties": { - "minutes": { - "type": "integer", - "format": "int32", - "example": 30, - "description": "过期时间(分钟)" - } - }, - "title": "修改订单过期时间请求" - }, - "出行人信息": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "birthday": { - "type": "string", - "format": "date", - "example": "1990-01-01", - "description": "出生日期(后端根据此字段自动判断人员类型,未传则默认ADULT)" - }, - "email": { - "type": "string", - "example": "lisi@example.com", - "description": "电子邮箱" - }, - "emergencyContact": { - "type": "string", - "example": "王五", - "description": "紧急联系人" - }, - "emergencyPhone": { - "type": "string", - "example": 13800138002, - "description": "紧急联系电话" - }, - "gender": { - "type": "string", - "example": 1, - "description": "性别(字典:gender)" - }, - "idCardNo": { - "type": "string", - "example": 110101199001011234, - "description": "证件号码" - }, - "idCardType": { - "type": "string", - "example": "ID_CARD", - "description": "证件类型(字典:id_card_type)" - }, - "name": { - "type": "string", - "example": "李四", - "description": "出行人姓名" - }, - "nationality": { - "type": "string", - "example": "中国", - "description": "国籍" - }, - "phone": { - "type": "string", - "example": 13800138001, - "description": "手机号" - } - }, - "title": "出行人信息" - }, - "分页结果«AlbumFileVO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/AlbumFileVO", - "originalRef": "AlbumFileVO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«AlbumFileVO»" - }, - "分页结果«WorkOrderVO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/WorkOrderVO", - "originalRef": "WorkOrderVO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«WorkOrderVO»" - }, - "分页结果«早鸟优惠计划VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/早鸟优惠计划VO", - "originalRef": "早鸟优惠计划VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«早鸟优惠计划VO»" - }, - "分页结果«管理员订单列表VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/管理员订单列表VO", - "originalRef": "管理员订单列表VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«管理员订单列表VO»" - }, - "单天住宿分配": { - "type": "object", - "properties": { - "date": { - "type": "string", - "description": "日期(yyyy-MM-dd)" - }, - "hotelCoverUrl": { - "type": "string", - "description": "酒店封面图URL(从产品快照提取,可能为空)" - }, - "hotelId": { - "type": "integer", - "format": "int64", - "description": "酒店ID" - }, - "hotelName": { - "type": "string", - "description": "酒店名称" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "roomCount": { - "type": "integer", - "format": "int32", - "description": "房间数量" - }, - "roomType": { - "type": "string", - "description": "房型名称" - }, - "roomTypeCoverUrl": { - "type": "string", - "description": "房型封面图URL(从产品快照提取,可能为空)" - }, - "roomTypeId": { - "type": "integer", - "format": "int64", - "description": "房型ID" - } - }, - "title": "单天住宿分配" - }, - "单天升级差价明细": { - "type": "object", - "properties": { - "assignedPrice": { - "type": "number", - "description": "实际房型当天单价" - }, - "assignedRoomTypeId": { - "type": "integer", - "format": "int64", - "description": "实际分配房型ID" - }, - "assignedRoomTypeName": { - "type": "string", - "description": "实际分配房型名称" - }, - "date": { - "type": "string", - "description": "日期" - }, - "dayDiff": { - "type": "number", - "description": "当天差价" - }, - "defaultPrice": { - "type": "number", - "description": "默认房型当天单价" - }, - "defaultRoomTypeId": { - "type": "integer", - "format": "int64", - "description": "产品默认房型ID" - }, - "defaultRoomTypeName": { - "type": "string", - "description": "产品默认房型名称" - }, - "direction": { - "type": "string", - "description": "差价方向" - }, - "familyIndex": { - "type": "integer", - "format": "int32", - "description": "家庭序号" - }, - "remark": { - "type": "string", - "description": "备注" - } - }, - "title": "单天升级差价明细" - }, - "单天单家庭酒店分配": { - "type": "object", - "required": [ - "date", - "familyIndex", - "hotelId", - "hotelName", - "roomType", - "roomTypeId" - ], - "properties": { - "date": { - "type": "string", - "description": "日期(yyyy-MM-dd),单天" - }, - "familyIndex": { - "type": "integer", - "format": "int32", - "description": "家庭序号" - }, - "hotelId": { - "type": "integer", - "format": "int64", - "description": "酒店ID" - }, - "hotelName": { - "type": "string", - "description": "酒店名称" - }, - "remark": { - "type": "string", - "description": "当天备注" - }, - "roomType": { - "type": "string", - "description": "房型名称" - }, - "roomTypeId": { - "type": "integer", - "format": "int64", - "description": "房型ID" - }, - "upgradePrice": { - "type": "number", - "description": "手动覆盖升级差价(null=使用系统计算值,仅当房型与产品默认不同时有效)" - } - }, - "title": "单天单家庭酒店分配" - }, - "工单操作日志VO": { - "type": "object", - "properties": { - "action": { - "type": "string", - "description": "操作动作" - }, - "actionLabel": { - "type": "string", - "description": "操作动作标签" - }, - "content": { - "type": "string", - "description": "操作内容" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "操作时间" - }, - "logId": { - "type": "string", - "description": "日志ID" - }, - "operatorName": { - "type": "string", - "description": "操作人姓名" - } - }, - "title": "工单操作日志VO" - }, - "差价计算结果": { - "type": "object", - "properties": { - "changeDays": { - "type": "integer", - "format": "int32", - "description": "变更天数" - }, - "description": { - "type": "string", - "description": "差价描述(中文说明)" - }, - "direction": { - "type": "string", - "description": "差价方向:UPGRADE=升级加价, DOWNGRADE=降级减价, SAME=价格不变" - }, - "newName": { - "type": "string", - "description": "新资源名称" - }, - "newUnitPrice": { - "type": "number", - "description": "新单价(日均)" - }, - "originalName": { - "type": "string", - "description": "原资源名称" - }, - "originalUnitPrice": { - "type": "number", - "description": "原单价(日均)" - }, - "priceDiff": { - "type": "number", - "description": "差价金额(正数=需补款,负数=可退款)" - } - }, - "title": "差价计算结果" - }, - "房型变更请求": { - "type": "object", - "required": [ - "dayNumber", - "newRoomTypeId", - "originalRoomTypeId", - "reason" - ], - "properties": { - "balanceAdjustment": { - "type": "number", - "example": 200.0, - "description": "尾款调整金额(可选,覆盖系统建议差价;正数=增加尾款,负数=减少尾款)" - }, - "changeReasonCode": { - "type": "string", - "description": "变更原因代码(字典项 order_change_reason)" - }, - "dayNumber": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "行程天数编号" - }, - "newRoomTypeId": { - "type": "integer", - "format": "int64", - "description": "新房型ID" - }, - "originalRoomTypeId": { - "type": "integer", - "format": "int64", - "description": "原房型ID" - }, - "reason": { - "type": "string", - "example": "客户要求升级房型", - "description": "变更原因" - }, - "roomCount": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "房间数量" - } - }, - "title": "房型变更请求" - }, - "房间信息请求": { - "type": "object", - "required": [ - "roomInfo" - ], - "properties": { - "roomInfo": { - "type": "string", - "example": "标准双人间2间,大床房1间", - "description": "房间信息" - } - }, - "title": "房间信息请求" - }, - "报价预览请求": { - "type": "object", - "required": [ - "departureDate", - "productId" - ], - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "成人数" - }, - "babyCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "幼童数" - }, - "childCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "儿童数" - }, - "childNeedBed": { - "type": "boolean", - "example": false, - "description": "儿童是否需要床位" - }, - "departureDate": { - "type": "string", - "format": "date", - "example": "2026-05-01", - "description": "出发日期" - }, - "productId": { - "type": "integer", - "format": "int64", - "example": 1760000000000001, - "description": "产品ID" - }, - "youngChildCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "小童数" - } - }, - "title": "报价预览请求" - }, - "撤销行程编辑请求": { - "type": "object", - "required": [ - "reason" - ], - "properties": { - "reason": { - "type": "string", - "example": "客户改主意了", - "description": "撤销原因" - } - }, - "title": "撤销行程编辑请求" - }, - "新增行程天请求": { - "type": "object", - "required": [ - "dayNumber", - "dayTitle", - "reason" - ], - "properties": { - "dayNumber": { - "type": "integer", - "format": "int32", - "example": 3, - "description": "行程天数编号(插入位置,后续天数自动顺延)" - }, - "dayTitle": { - "type": "string", - "example": "第三天:丽江古城自由行", - "description": "天标题" - }, - "nodes": { - "type": "array", - "description": "该天的行程节点列表", - "items": { - "$ref": "#/definitions/新增行程节点请求", - "originalRef": "新增行程节点请求" - } - }, - "prevDayHotel": { - "description": "前一天住宿配置(原最后一天无住宿,新增天数后需配置)", - "$ref": "#/definitions/PrevDayHotel", - "originalRef": "PrevDayHotel" - }, - "reason": { - "type": "string", - "example": "客户要求增加一天自由行", - "description": "变更原因" - } - }, - "title": "新增行程天请求" - }, - "新增行程节点请求": { - "type": "object", - "required": [ - "nodeName", - "nodeType" - ], - "properties": { - "balanceAdjustment": { - "type": "number", - "example": 200.0, - "description": "尾款调整金额(正数=增加尾款,负数=减少尾款)" - }, - "dayNumber": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "行程天数编号(独立调用时必填,addDay子节点时自动继承)" - }, - "description": { - "type": "string", - "description": "节点描述" - }, - "nodeName": { - "type": "string", - "description": "节点名称" - }, - "nodeType": { - "type": "string", - "description": "节点类型:SCENIC/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE/FREE/NOTE" - }, - "reason": { - "type": "string", - "example": "客户要求增加该景点", - "description": "修改原因(独立调用时必填,addDay子节点时自动继承)" - }, - "resourceId": { - "type": "integer", - "format": "int64", - "description": "关联资源ID" - }, - "resourceType": { - "type": "string", - "description": "关联资源类型:SCENIC_SPOT/ACTIVITY/RESTAURANT/HOTEL/VEHICLE" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号(插入位置,默认追加到末尾)" - }, - "startTime": { - "type": "string", - "description": "开始时间" - } - }, - "title": "新增行程节点请求" - }, - "早鸟优惠计划VO": { - "type": "object", - "properties": { - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "integer", - "format": "int64", - "description": "创建人ID" - }, - "discountAmount": { - "type": "number", - "description": "优惠金额" - }, - "enabled": { - "type": "boolean", - "description": "是否启用" - }, - "endDate": { - "type": "string", - "format": "date", - "description": "生效结束日期" - }, - "minPeople": { - "type": "integer", - "format": "int32", - "description": "最低人数" - }, - "planId": { - "type": "integer", - "format": "int64", - "description": "计划ID" - }, - "planName": { - "type": "string", - "description": "计划名称" - }, - "productIds": { - "type": "array", - "description": "适用产品ID列表(空表示适用全部CORE/GROUP产品)", - "items": { - "type": "integer", - "format": "int64" - } - }, - "productNames": { - "type": "array", - "description": "适用产品名称列表(空表示适用全部)", - "items": { - "type": "string" - } - }, - "remark": { - "type": "string", - "description": "备注" - }, - "startDate": { - "type": "string", - "format": "date", - "description": "生效开始日期" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "早鸟优惠计划VO" - }, - "早鸟优惠计划请求": { - "type": "object", - "required": [ - "discountAmount", - "endDate", - "minPeople", - "planName", - "startDate" - ], - "properties": { - "discountAmount": { - "type": "number", - "example": 200.0, - "description": "优惠金额(从订单总价中扣减的固定金额)" - }, - "endDate": { - "type": "string", - "format": "date", - "example": "2026-04-15", - "description": "生效结束日期" - }, - "minPeople": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "最低出行人数(含成人+儿童),订单人数>=此值才能享受优惠" - }, - "planName": { - "type": "string", - "example": "五一早鸟优惠", - "description": "计划名称" - }, - "productIds": { - "type": "array", - "example": [ - "1760000000000001", - "1760000000000002" - ], - "description": "适用产品ID列表(仅CORE/GROUP类型),为空或null表示适用全部核心产品和小蒙马", - "items": { - "type": "integer", - "format": "int64" - } - }, - "remark": { - "type": "string", - "example": "仅限新用户", - "description": "备注" - }, - "startDate": { - "type": "string", - "format": "date", - "example": "2026-03-01", - "description": "生效开始日期" - } - }, - "title": "早鸟优惠计划请求" - }, - "更换定制师请求": { - "type": "object", - "required": [ - "customizerId" - ], - "properties": { - "customizerId": { - "type": "integer", - "format": "int64", - "description": "定制师ID" - } - }, - "title": "更换定制师请求" - }, - "更新订单状态请求": { - "type": "object", - "required": [ - "status" - ], - "properties": { - "status": { - "type": "string", - "example": "CONFIRMED", - "description": "目标状态。可选值:PENDING_PAY(待支付)/DEPOSIT_PAID(已付定金)/PAID(已全额支付)/CONFIRMED(已确认)/PENDING_BALANCE(待付尾款)/PENDING_DEPARTURE(待出行)/TRAVELLING(旅行中)/COMPLETED(已完成)/AFTER_SALE(售后中)/REFUNDING(退款中)/REFUNDED(已退款)/CANCELLED(已取消)" - } - }, - "title": "更新订单状态请求" - }, - "申请解锁订单请求": { - "type": "object", - "properties": { - "reason": { - "type": "string", - "description": "解锁原因" - } - }, - "title": "申请解锁订单请求" - }, - "管理员修改订单请求": { - "type": "object", - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "成人数" - }, - "babyCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "幼童数" - }, - "childCount": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "儿童数" - }, - "contactName": { - "type": "string", - "example": "张三", - "description": "联系人姓名" - }, - "contactPhone": { - "type": "string", - "example": 13800138000, - "description": "联系人电话" - }, - "customizerId": { - "type": "integer", - "format": "int64", - "example": 123456, - "description": "定制师ID(切换定制师)" - }, - "departureDate": { - "type": "string", - "format": "date", - "example": "2026-05-01", - "description": "出发日期" - }, - "depositAmount": { - "type": "number", - "example": 2000.0, - "description": "定金金额" - }, - "mchId": { - "type": "string", - "example": 1246532201, - "description": "商户号(微信支付商户号,多商户场景使用)" - }, - "remark": { - "type": "string", - "example": "客户要求安排靠窗座位", - "description": "备注" - }, - "totalCost": { - "type": "number", - "example": 5000.0, - "description": "总成本" - }, - "totalPrice": { - "type": "number", - "example": 8000.0, - "description": "总售价" - }, - "travelers": { - "type": "array", - "description": "出行人列表(如提供则替换全部出行人,不传则不修改出行人)", - "items": { - "$ref": "#/definitions/出行人信息", - "originalRef": "出行人信息" - } - }, - "youngChildCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "小童数" - } - }, - "title": "管理员修改订单请求" - }, - "管理员创建订单请求": { - "type": "object", - "required": [ - "contactName", - "contactPhone", - "productId" - ], - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "成人数" - }, - "babyCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "幼童数" - }, - "childCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "儿童数" - }, - "childNeedBed": { - "type": "boolean", - "example": false, - "description": "儿童是否需要床位(影响房间分配和报价计算)" - }, - "contactName": { - "type": "string", - "example": "张三", - "description": "联系人姓名" - }, - "contactPhone": { - "type": "string", - "example": 13800138000, - "description": "联系人电话" - }, - "customizerId": { - "type": "integer", - "format": "int64", - "example": 1760000000000010, - "description": "定制师ID(可选,默认为创建人)" - }, - "departureDate": { - "type": "string", - "format": "date", - "example": "2026-05-01", - "description": "出发日期(GROUP产品可不传,从团期获取)" - }, - "expiryMinutes": { - "type": "integer", - "format": "int32", - "example": 30, - "description": "支付时限(分钟),不传则使用全局默认值。超时未支付订单自动取消" - }, - "groupBatchId": { - "type": "integer", - "format": "int64", - "description": "团期ID(GROUP产品必填)" - }, - "productId": { - "type": "integer", - "format": "int64", - "example": 1760000000000001, - "description": "产品ID" - }, - "remark": { - "type": "string", - "example": "客户VIP", - "description": "备注" - }, - "roomCount": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "房间数(GROUP产品,默认1)" - }, - "travelers": { - "type": "array", - "description": "出行人列表", - "items": { - "$ref": "#/definitions/出行人信息", - "originalRef": "出行人信息" - } - }, - "userPhone": { - "type": "string", - "example": 13800138000, - "description": "用户手机号(可选,用于关联C端用户)。如匹配到已注册用户则自动绑定订单" - }, - "youngChildCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "小童数" - } - }, - "title": "管理员创建订单请求" - }, - "管理员取消订单请求": { - "type": "object", - "required": [ - "reason" - ], - "properties": { - "reason": { - "type": "string", - "example": "客户主动取消", - "description": "取消原因" - }, - "refundAmount": { - "type": "number", - "example": 500.0, - "description": "退款金额(可选,不传则按退款政策自动计算;传0表示不退款)" - } - }, - "title": "管理员取消订单请求" - }, - "管理员基本信息": { - "type": "object", - "properties": { - "adminId": { - "type": "integer", - "format": "int64", - "description": "管理员ID" - }, - "avatarUrl": { - "type": "string", - "description": "头像URL" - }, - "username": { - "type": "string", - "description": "用户名" - }, - "wechatName": { - "type": "string", - "description": "企微用户名称" - }, - "wechatUserid": { - "type": "string", - "description": "企微用户ID" - } - }, - "title": "管理员基本信息" - }, - "管理员备注请求": { - "type": "object", - "required": [ - "content" - ], - "properties": { - "content": { - "type": "string", - "example": "客户要求加急处理", - "description": "备注内容" - } - }, - "title": "管理员备注请求" - }, - "管理员订单列表VO": { - "type": "object", - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "description": "成人数" - }, - "babyCount": { - "type": "integer", - "format": "int32", - "description": "幼童数" - }, - "balanceAmount": { - "type": "number", - "description": "尾款金额(DEPOSIT模式:总售价-定金-优惠)" - }, - "checklistConfirmed": { - "type": "boolean", - "description": "是否已锁单(清单确认后锁定)" - }, - "childCount": { - "type": "integer", - "format": "int32", - "description": "儿童数" - }, - "contactName": { - "type": "string", - "description": "联系人姓名" - }, - "contactPhone": { - "type": "string", - "description": "联系人电话" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "creatorAdminId": { - "type": "integer", - "format": "int64", - "description": "创建人管理员ID" - }, - "customizerName": { - "type": "string", - "description": "定制师名称" - }, - "daysUntilDeparture": { - "type": "integer", - "format": "int32", - "description": "距出发天数(负数表示已出发)" - }, - "departureDate": { - "type": "string", - "format": "date", - "description": "出发日期" - }, - "depositAmount": { - "type": "number", - "description": "定金金额" - }, - "discountAmount": { - "type": "number", - "description": "优惠金额" - }, - "mchId": { - "type": "string", - "description": "商户号" - }, - "mchName": { - "type": "string", - "description": "商户名称" - }, - "orderId": { - "type": "integer", - "format": "int64", - "description": "订单ID" - }, - "orderNo": { - "type": "string", - "description": "订单号" - }, - "paidAmount": { - "type": "number", - "description": "已付金额" - }, - "paymentMode": { - "type": "string", - "description": "支付模式(字典:payment_mode)" - }, - "processStatus": { - "type": "string", - "description": "内部流程状态(字典:order_process_status)" - }, - "processStatusLabel": { - "type": "string", - "description": "内部流程状态标签(字典:order_process_status 翻译)" - }, - "productCoverUrl": { - "type": "string", - "description": "产品封面图URL" - }, - "productId": { - "type": "integer", - "format": "int64", - "description": "产品ID" - }, - "productName": { - "type": "string", - "description": "产品名称" - }, - "productType": { - "type": "string", - "description": "产品类型(字典:product_type)" - }, - "status": { - "type": "string", - "description": "订单状态(字典:order_status)" - }, - "statusLabel": { - "type": "string", - "description": "订单状态标签(字典:order_status 翻译)" - }, - "surchargeAmount": { - "type": "number", - "description": "费用增加总额" - }, - "totalPrice": { - "type": "number", - "description": "总售价" - }, - "tripDays": { - "type": "integer", - "format": "int32", - "description": "行程天数" - }, - "tripNights": { - "type": "integer", - "format": "int32", - "description": "行程晚数" - }, - "userId": { - "type": "integer", - "format": "int64", - "description": "用户ID" - }, - "youngChildCount": { - "type": "integer", - "format": "int32", - "description": "小童数" - } - }, - "title": "管理员订单列表VO" - }, - "统一响应结果«AlbumFileVO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/AlbumFileVO", - "originalRef": "AlbumFileVO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«AlbumFileVO»" - }, - "统一响应结果«AlbumFolderVO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/AlbumFolderVO", - "originalRef": "AlbumFolderVO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«AlbumFolderVO»" - }, - "统一响应结果«List«AlbumFileVO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/AlbumFileVO", - "originalRef": "AlbumFileVO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«AlbumFileVO»»" - }, - "统一响应结果«List«AlbumFolderVO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/AlbumFolderVO", - "originalRef": "AlbumFolderVO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«AlbumFolderVO»»" - }, - "统一响应结果«List«Map«string,object»»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«Map«string,object»»»" - }, - "统一响应结果«List«OrderItineraryEdit»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/OrderItineraryEdit", - "originalRef": "OrderItineraryEdit" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«OrderItineraryEdit»»" - }, - "统一响应结果«List«OrderTodo»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/OrderTodo", - "originalRef": "OrderTodo" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«OrderTodo»»" - }, - "统一响应结果«List«OrderTransportSegment»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/OrderTransportSegment", - "originalRef": "OrderTransportSegment" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«OrderTransportSegment»»" - }, - "统一响应结果«List«OrderTraveler»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/OrderTraveler", - "originalRef": "OrderTraveler" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«OrderTraveler»»" - }, - "统一响应结果«List«管理员基本信息»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/管理员基本信息", - "originalRef": "管理员基本信息" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«管理员基本信息»»" - }, - "统一响应结果«List«订单待办VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/订单待办VO", - "originalRef": "订单待办VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«订单待办VO»»" - }, - "统一响应结果«Map«string,object»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "object", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Map«string,object»»" - }, - "统一响应结果«OrderDiscount»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/OrderDiscount", - "originalRef": "OrderDiscount" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«OrderDiscount»" - }, - "统一响应结果«OrderItineraryEdit»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/OrderItineraryEdit", - "originalRef": "OrderItineraryEdit" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«OrderItineraryEdit»" - }, - "统一响应结果«OrderSurcharge»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/OrderSurcharge", - "originalRef": "OrderSurcharge" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«OrderSurcharge»" - }, - "统一响应结果«Void»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Void»" - }, - "统一响应结果«WorkOrderVO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/WorkOrderVO", - "originalRef": "WorkOrderVO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«WorkOrderVO»" - }, - "统一响应结果«int»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "integer", - "format": "int32", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«int»" - }, - "统一响应结果«long»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "integer", - "format": "int64", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«long»" - }, - "统一响应结果«string»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "string", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«string»" - }, - "统一响应结果«分页结果«AlbumFileVO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«AlbumFileVO»", - "originalRef": "分页结果«AlbumFileVO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«AlbumFileVO»»" - }, - "统一响应结果«分页结果«WorkOrderVO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«WorkOrderVO»", - "originalRef": "分页结果«WorkOrderVO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«WorkOrderVO»»" - }, - "统一响应结果«分页结果«早鸟优惠计划VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«早鸟优惠计划VO»", - "originalRef": "分页结果«早鸟优惠计划VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«早鸟优惠计划VO»»" - }, - "统一响应结果«分页结果«管理员订单列表VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«管理员订单列表VO»", - "originalRef": "分页结果«管理员订单列表VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«管理员订单列表VO»»" - }, - "统一响应结果«差价计算结果»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/差价计算结果", - "originalRef": "差价计算结果" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«差价计算结果»" - }, - "统一响应结果«早鸟优惠计划VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/早鸟优惠计划VO", - "originalRef": "早鸟优惠计划VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«早鸟优惠计划VO»" - }, - "统一响应结果«订单详情VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/订单详情VO", - "originalRef": "订单详情VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«订单详情VO»" - }, - "统一响应结果«配房升级差价预览»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/配房升级差价预览", - "originalRef": "配房升级差价预览" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«配房升级差价预览»" - }, - "订单待办VO": { - "type": "object", - "properties": { - "assigneeAdminId": { - "type": "integer", - "format": "int64", - "description": "负责管理员ID" - }, - "assigneeRoleKey": { - "type": "string", - "description": "负责角色标识" - }, - "blocked": { - "type": "boolean", - "description": "是否阻塞" - }, - "blockedReason": { - "type": "string", - "description": "阻塞原因" - }, - "completedAt": { - "type": "string", - "format": "date-time", - "description": "完成时间" - }, - "completedBy": { - "type": "integer", - "format": "int64", - "description": "完成人ID" - }, - "contactName": { - "type": "string", - "description": "联系人姓名(关联查询)" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "departureDate": { - "type": "string", - "format": "date", - "description": "出发日期(关联查询)" - }, - "orderId": { - "type": "integer", - "format": "int64", - "description": "订单ID" - }, - "orderNo": { - "type": "string", - "description": "订单号" - }, - "orderStatus": { - "type": "string", - "description": "订单状态(关联查询)" - }, - "productName": { - "type": "string", - "description": "产品名称(关联查询)" - }, - "sequence": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "status": { - "type": "string", - "description": "待办状态" - }, - "todoId": { - "type": "integer", - "format": "int64", - "description": "待办ID" - }, - "todoLabel": { - "type": "string", - "description": "待办名称" - }, - "todoType": { - "type": "string", - "description": "待办类型" - } - }, - "title": "订单待办VO" - }, - "订单详情VO": { - "type": "object", - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "description": "成人数" - }, - "babyCount": { - "type": "integer", - "format": "int32", - "description": "幼童数" - }, - "balanceAmount": { - "type": "number", - "description": "尾款金额(总售价-定金)" - }, - "balancePayMethod": { - "type": "string", - "description": "尾款支付方式: ONLINE=线上微信支付 OFFLINE=线下转账" - }, - "balanceProofUrl": { - "type": "string", - "description": "尾款凭证URL" - }, - "cancelReason": { - "type": "string", - "description": "取消原因" - }, - "cancelledAt": { - "type": "string", - "format": "date-time", - "description": "取消时间" - }, - "checklistConfirmed": { - "type": "boolean", - "description": "清单确认状态" - }, - "childCount": { - "type": "integer", - "format": "int32", - "description": "儿童数" - }, - "completedAt": { - "type": "string", - "format": "date-time", - "description": "完成时间" - }, - "confirmedAt": { - "type": "string", - "format": "date-time", - "description": "确认时间" - }, - "contactName": { - "type": "string", - "description": "联系人姓名" - }, - "contactPhone": { - "type": "string", - "description": "联系人电话" - }, - "contracts": { - "type": "array", - "description": "合同列表(含signUrl/fileUrl/status等)", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "creatorAdminId": { - "type": "integer", - "format": "int64", - "description": "创建人管理员ID" - }, - "creatorName": { - "type": "string", - "description": "创建人姓名" - }, - "customizerId": { - "type": "integer", - "format": "int64", - "description": "定制师ID" - }, - "customizerName": { - "type": "string", - "description": "定制师姓名" - }, - "departureDate": { - "type": "string", - "format": "date", - "description": "出发日期" - }, - "depositAmount": { - "type": "number", - "description": "定金金额" - }, - "depositRatio": { - "type": "integer", - "format": "int32", - "description": "定金比例" - }, - "discountAmount": { - "type": "number", - "description": "优惠金额" - }, - "discountReason": { - "type": "string", - "description": "优惠原因" - }, - "discounts": { - "type": "array", - "description": "优惠列表", - "items": { - "$ref": "#/definitions/OrderDiscount", - "originalRef": "OrderDiscount" - } - }, - "displayStatus": { - "type": "string", - "description": "前端显示状态(字典:order_display_status)" - }, - "displayStatusLabel": { - "type": "string", - "description": "前端显示状态标签(字典:order_display_status 翻译)" - }, - "expiryMinutes": { - "type": "integer", - "format": "int32", - "description": "支付时限(分钟)" - }, - "expiryTime": { - "type": "string", - "format": "date-time", - "description": "支付截止时间" - }, - "hotelAssignmentDetails": { - "type": "array", - "description": "酒店分配详情(按家庭分组,含封面图)", - "items": { - "$ref": "#/definitions/酒店分配详情(按家庭分组)", - "originalRef": "酒店分配详情(按家庭分组)" - } - }, - "hotelAssignments": { - "type": "string", - "description": "酒店分配信息JSON(原始数据)" - }, - "insurances": { - "type": "array", - "description": "保险订单列表(含productName/extPolicyNo/status/startDate/endDate等)", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "mchId": { - "type": "string", - "description": "商户号" - }, - "mchName": { - "type": "string", - "description": "商户名称" - }, - "orderId": { - "type": "integer", - "format": "int64", - "description": "订单ID" - }, - "orderNo": { - "type": "string", - "description": "订单号" - }, - "paidAmount": { - "type": "number", - "description": "已付金额" - }, - "paidAt": { - "type": "string", - "format": "date-time", - "description": "支付时间" - }, - "payMethodLabel": { - "type": "string", - "description": "支付方式标签(如:微信支付、定金微信+尾款线下)" - }, - "paymentMode": { - "type": "string", - "description": "支付模式(字典:payment_mode)" - }, - "paymentModeLabel": { - "type": "string", - "description": "支付模式中文标签(DEPOSIT=定金+尾款, FULL=全款)" - }, - "pendingUpgradeAmount": { - "type": "number", - "description": "待确认差价总额(配房/配车升级未确认的差价)" - }, - "processStatus": { - "type": "string", - "description": "内部流程状态(字典:order_process_status)" - }, - "processStatusLabel": { - "type": "string", - "description": "内部流程状态标签(字典:order_process_status 翻译)" - }, - "productCoverUrl": { - "type": "string", - "description": "产品封面图URL" - }, - "productId": { - "type": "integer", - "format": "int64", - "description": "产品ID" - }, - "productName": { - "type": "string", - "description": "产品名称" - }, - "productSnapshot": { - "type": "string", - "description": "产品快照JSON" - }, - "productType": { - "type": "string", - "description": "产品类型(字典:product_type)" - }, - "productTypeLabel": { - "type": "string", - "description": "产品类型中文标签(CORE=核心产品, CUSTOM=私人定制, GROUP=小蒙马, ROUTE=路书产品)" - }, - "readyAt": { - "type": "string", - "format": "date-time", - "description": "就绪时间" - }, - "refundAmount": { - "type": "number", - "description": "退款金额(实退金额)" - }, - "refundPolicy": { - "description": "退款政策(含政策名称和退款规则列表)", - "$ref": "#/definitions/退款政策VO", - "originalRef": "退款政策VO" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "returnDate": { - "type": "string", - "format": "date", - "description": "返程日期(出发日期 + 行程天数 - 1)" - }, - "reviewed": { - "type": "boolean", - "description": "是否已评价" - }, - "roomInfo": { - "type": "string", - "description": "房间信息" - }, - "sharerOpenid": { - "type": "string", - "description": "分享人微信openid" - }, - "status": { - "type": "string", - "description": "订单状态(字典:order_status)" - }, - "statusLabel": { - "type": "string", - "description": "订单状态标签(字典:order_status 翻译)" - }, - "surchargeAmount": { - "type": "number", - "description": "费用增加总额" - }, - "surcharges": { - "type": "array", - "description": "费用增加项列表", - "items": { - "$ref": "#/definitions/OrderSurcharge", - "originalRef": "OrderSurcharge" - } - }, - "timeline": { - "type": "array", - "description": "时间线列表", - "items": { - "$ref": "#/definitions/OrderTimeline", - "originalRef": "OrderTimeline" - } - }, - "todos": { - "type": "array", - "description": "待办列表", - "items": { - "$ref": "#/definitions/OrderTodo", - "originalRef": "OrderTodo" - } - }, - "totalCost": { - "type": "number", - "description": "总成本(仅管理员可见)" - }, - "totalPrice": { - "type": "number", - "description": "总售价" - }, - "transportSegments": { - "type": "array", - "description": "交通信息列表(航班/车次,含transportType/transportNo/departStation/arriveStation/departTime/arriveTime等)", - "items": { - "$ref": "#/definitions/OrderTransportSegment", - "originalRef": "OrderTransportSegment" - } - }, - "travelers": { - "type": "array", - "description": "出行人列表", - "items": { - "$ref": "#/definitions/OrderTraveler", - "originalRef": "OrderTraveler" - } - }, - "tripDays": { - "type": "integer", - "format": "int32", - "description": "行程天数" - }, - "tripNights": { - "type": "integer", - "format": "int32", - "description": "行程晚数" - }, - "unlockRequestedAt": { - "type": "string", - "format": "date-time", - "description": "解锁请求时间" - }, - "userId": { - "type": "integer", - "format": "int64", - "description": "用户ID" - }, - "vehicleInfo": { - "type": "string", - "description": "车辆信息" - }, - "youngChildCount": { - "type": "integer", - "format": "int32", - "description": "小童数" - } - }, - "title": "订单详情VO" - }, - "记录尾款请求": { - "type": "object", - "properties": { - "proofUrl": { - "type": "string", - "description": "支付凭证URL" - }, - "remark": { - "type": "string", - "description": "备注" - } - }, - "title": "记录尾款请求" - }, - "费用增加项请求": { - "type": "object", - "required": [ - "surchargeAmount", - "surchargeName" - ], - "properties": { - "surchargeAmount": { - "type": "number", - "example": 200.0, - "description": "费用增加金额" - }, - "surchargeName": { - "type": "string", - "example": "升级房型补差价", - "description": "费用增加项名称" - } - }, - "title": "费用增加项请求" - }, - "跳过行程节点请求": { - "type": "object", - "required": [ - "dayNumber", - "nodeId", - "reason" - ], - "properties": { - "balanceAdjustment": { - "type": "number", - "example": -120.0, - "description": "尾款调整金额(正数=增加尾款,负数=减少尾款)" - }, - "dayNumber": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "行程天数编号" - }, - "nodeId": { - "type": "string", - "description": "节点ID" - }, - "nodeName": { - "type": "string", - "example": "蒙古族小型冰雪那达慕", - "description": "节点名称" - }, - "reason": { - "type": "string", - "example": "客户不想去该景点", - "description": "修改原因" - } - }, - "title": "跳过行程节点请求" - }, - "车型变更请求": { - "type": "object", - "required": [ - "newVehicleId", - "originalVehicleId", - "reason" - ], - "properties": { - "balanceAdjustment": { - "type": "number", - "example": 300.0, - "description": "尾款调整金额(可选,覆盖系统建议差价;正数=增加尾款,负数=减少尾款)" - }, - "changeReasonCode": { - "type": "string", - "description": "变更原因代码(字典项 order_change_reason)" - }, - "newVehicleId": { - "type": "integer", - "format": "int64", - "description": "新车辆ID" - }, - "originalVehicleId": { - "type": "integer", - "format": "int64", - "description": "原车辆ID" - }, - "reason": { - "type": "string", - "example": "原车辆已被预订", - "description": "变更原因" - } - }, - "title": "车型变更请求" - }, - "车辆信息请求": { - "type": "object", - "required": [ - "vehicleInfo" - ], - "properties": { - "vehicleInfo": { - "type": "string", - "example": "7座商务车1辆,司机张师傅", - "description": "车辆信息" - } - }, - "title": "车辆信息请求" - }, - "车辆分配请求": { - "type": "object", - "required": [ - "vehicleModel" - ], - "properties": { - "driverName": { - "type": "string", - "description": "司机姓名" - }, - "driverPhone": { - "type": "string", - "description": "司机电话" - }, - "plateNumber": { - "type": "string", - "description": "车牌号" - }, - "vehicleBrand": { - "type": "string", - "description": "品牌(选填,不传则从车型名称中提取)" - }, - "vehicleModel": { - "type": "string", - "description": "车型" - } - }, - "title": "车辆分配请求" - }, - "退款政策VO": { - "type": "object", - "properties": { - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "integer", - "format": "int64", - "description": "创建人ID" - }, - "enabled": { - "type": "boolean", - "description": "是否启用" - }, - "policyId": { - "type": "integer", - "format": "int64", - "description": "政策ID" - }, - "policyName": { - "type": "string", - "description": "政策名称" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "rules": { - "type": "array", - "description": "退款规则列表", - "items": { - "$ref": "#/definitions/退款规则VO", - "originalRef": "退款规则VO" - } - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "退款政策VO" - }, - "退款规则VO": { - "type": "object", - "properties": { - "minDays": { - "type": "integer", - "format": "int32", - "description": "距出发最少天数" - }, - "refundRatio": { - "type": "integer", - "format": "int32", - "description": "退款比例(百分比)" - }, - "ruleId": { - "type": "integer", - "format": "int64", - "description": "规则ID" - } - }, - "title": "退款规则VO" - }, - "配房升级差价预览": { - "type": "object", - "properties": { - "description": { - "type": "string", - "description": "描述" - }, - "details": { - "type": "array", - "description": "各天差价明细", - "items": { - "$ref": "#/definitions/单天升级差价明细", - "originalRef": "单天升级差价明细" - } - }, - "direction": { - "type": "string", - "description": "差价方向:UPGRADE=升级加价, DOWNGRADE=降级减价, SAME=价格不变, MIXED=部分升级部分降级" - }, - "totalDiff": { - "type": "number", - "description": "差价合计(正数=需补款,负数=可退款)" - } - }, - "title": "配房升级差价预览" - }, - "酒店分配详情(按家庭分组)": { - "type": "object", - "properties": { - "days": { - "type": "array", - "description": "每天的住宿分配列表", - "items": { - "$ref": "#/definitions/单天住宿分配", - "originalRef": "单天住宿分配" - } - }, - "familyIndex": { - "type": "integer", - "format": "int32", - "description": "家庭序号(从1开始)" - }, - "familyLabel": { - "type": "string", - "description": "家庭标签(如:家庭1、家庭2)" - } - }, - "title": "酒店分配详情(按家庭分组)" - }, - "酒店分配请求": { - "type": "object", - "required": [ - "assignments" - ], - "properties": { - "assignments": { - "type": "array", - "description": "酒店分配列表(按天粒度,每天每个家庭一条记录)", - "items": { - "$ref": "#/definitions/单天单家庭酒店分配", - "originalRef": "单天单家庭酒店分配" - } - } - }, - "title": "酒店分配请求" - }, - "修改退款原因请求": { - "type": "object", - "properties": { - "category": { - "type": "string", - "example": "用户原因", - "description": "分类" - }, - "reasonText": { - "type": "string", - "example": "行程有变", - "description": "退款原因文本" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序号" - } - }, - "title": "修改退款原因请求" - }, - "分页结果«退款申请VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/退款申请VO", - "originalRef": "退款申请VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«退款申请VO»" - }, - "创建退款原因请求": { - "type": "object", - "required": [ - "reasonText" - ], - "properties": { - "category": { - "type": "string", - "example": "用户原因", - "description": "分类" - }, - "reasonText": { - "type": "string", - "example": "行程有变", - "description": "退款原因文本" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序号" - } - }, - "title": "创建退款原因请求" - }, - "申诉退款执行请求": { - "type": "object", - "required": [ - "actualAmount" - ], - "properties": { - "actualAmount": { - "type": "number", - "example": 1500.0, - "description": "实际退款金额" - }, - "remark": { - "type": "string", - "example": "申诉通过,按协商金额退款", - "description": "备注" - } - }, - "title": "申诉退款执行请求" - }, - "管理员退款审批请求": { - "type": "object", - "required": [ - "action" - ], - "properties": { - "action": { - "type": "string", - "example": "APPROVE", - "description": "审批结果:APPROVE=通过(自动调起微信退款)、REJECT=拒绝(用户可发起申诉)" - }, - "actualAmount": { - "type": "number", - "example": 1500.0, - "description": "实际退款金额(审批通过时可调整,不传则使用申请金额)。不能超过订单已付金额" - }, - "remark": { - "type": "string", - "example": "同意全额退款", - "description": "审批备注" - } - }, - "title": "管理员退款审批请求" - }, - "统一响应结果«List«退款原因VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/退款原因VO", - "originalRef": "退款原因VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«退款原因VO»»" - }, - "统一响应结果«List«退款政策VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/退款政策VO", - "originalRef": "退款政策VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«退款政策VO»»" - }, - "统一响应结果«分页结果«退款申请VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«退款申请VO»", - "originalRef": "分页结果«退款申请VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«退款申请VO»»" - }, - "统一响应结果«退款原因VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/退款原因VO", - "originalRef": "退款原因VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«退款原因VO»" - }, - "统一响应结果«退款政策VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/退款政策VO", - "originalRef": "退款政策VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«退款政策VO»" - }, - "统一响应结果«退款申请VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/退款申请VO", - "originalRef": "退款申请VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«退款申请VO»" - }, - "退款原因VO": { - "type": "object", - "properties": { - "category": { - "type": "string", - "description": "原因分类" - }, - "enabled": { - "type": "boolean", - "description": "是否启用" - }, - "reasonId": { - "type": "integer", - "format": "int64", - "description": "原因ID" - }, - "reasonText": { - "type": "string", - "description": "原因描述" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - } - }, - "title": "退款原因VO" - }, - "退款政策请求": { - "type": "object", - "required": [ - "policyName", - "rules" - ], - "properties": { - "policyName": { - "type": "string", - "example": "国内游退款政策", - "description": "政策名称" - }, - "remark": { - "type": "string", - "example": "适用于所有国内游产品", - "description": "备注" - }, - "rules": { - "type": "array", - "description": "退款规则列表", - "items": { - "$ref": "#/definitions/退款规则项", - "originalRef": "退款规则项" - } - } - }, - "title": "退款政策请求" - }, - "退款申请VO": { - "type": "object", - "properties": { - "actualAmount": { - "type": "number", - "description": "实际退款金额" - }, - "appealAmount": { - "type": "number", - "description": "申诉退款金额" - }, - "appealReason": { - "type": "string", - "description": "申诉原因" - }, - "appealStatus": { - "type": "integer", - "format": "int32", - "description": "申诉状态: 1-处理中 2-通过 3-驳回" - }, - "appealStatusLabel": { - "type": "string", - "description": "申诉状态标签" - }, - "appealedAt": { - "type": "string", - "format": "date-time", - "description": "申诉时间" - }, - "applicantId": { - "type": "integer", - "format": "int64", - "description": "申请人ID" - }, - "applicantName": { - "type": "string", - "description": "申请人姓名" - }, - "applicantType": { - "type": "string", - "description": "申请人类型(USER/ADMIN)" - }, - "applicationId": { - "type": "integer", - "format": "int64", - "description": "申请ID" - }, - "approvalNo": { - "type": "string", - "description": "审批编号" - }, - "calculatedAmount": { - "type": "number", - "description": "计算退款金额" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "daysBeforeDept": { - "type": "integer", - "format": "int32", - "description": "距出发天数" - }, - "departureDate": { - "type": "string", - "format": "date", - "description": "出发日期" - }, - "orderId": { - "type": "integer", - "format": "int64", - "description": "订单ID" - }, - "orderNo": { - "type": "string", - "description": "订单号" - }, - "paidAmount": { - "type": "number", - "description": "已付金额" - }, - "policyId": { - "type": "integer", - "format": "int64", - "description": "退款政策ID" - }, - "policyName": { - "type": "string", - "description": "退款政策名称" - }, - "productName": { - "type": "string", - "description": "产品名称" - }, - "reasonDetail": { - "type": "string", - "description": "补充说明" - }, - "reasonId": { - "type": "integer", - "format": "int64", - "description": "退款原因ID" - }, - "reasonText": { - "type": "string", - "description": "退款原因" - }, - "refundRatio": { - "type": "integer", - "format": "int32", - "description": "退款比例(百分比)" - }, - "refundType": { - "type": "string", - "description": "退款类型(字典:refund_type)" - }, - "refundTypeLabel": { - "type": "string", - "description": "退款类型标签(字典:refund_type 翻译)" - }, - "refundedAt": { - "type": "string", - "format": "date-time", - "description": "退款完成时间" - }, - "reviewAdminId": { - "type": "integer", - "format": "int64", - "description": "审批管理员ID" - }, - "reviewAdminName": { - "type": "string", - "description": "审批管理员姓名" - }, - "reviewRemark": { - "type": "string", - "description": "审批备注" - }, - "reviewedAt": { - "type": "string", - "format": "date-time", - "description": "审批时间" - }, - "status": { - "type": "string", - "description": "退款状态(字典:refund_status)" - }, - "statusLabel": { - "type": "string", - "description": "退款状态标签(字典:refund_status 翻译)" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "退款申请VO" - }, - "退款规则项": { - "type": "object", - "required": [ - "minDays", - "refundRatio" - ], - "properties": { - "minDays": { - "type": "integer", - "format": "int32", - "example": 7, - "description": "距出发最少天数(含当天)。例如:minDays=7表示出发前7天及以上适用此规则" - }, - "refundRatio": { - "type": "integer", - "format": "int32", - "example": 80, - "description": "退款比例(百分比,0-100)。例如:80表示退已付金额的80%" - } - }, - "title": "退款规则项" - }, - "Map«string,string»": { - "type": "object", - "title": "Map«string,string»", - "additionalProperties": { - "type": "string" - } - }, - "分页结果«发票VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/发票VO", - "originalRef": "发票VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«发票VO»" - }, - "发票VO": { - "type": "object", - "properties": { - "amount": { - "type": "string", - "description": "金额" - }, - "bankAccount": { - "type": "string", - "description": "银行账号(企业发票)" - }, - "bankName": { - "type": "string", - "description": "开户行(企业发票)" - }, - "companyAddress": { - "type": "string", - "description": "企业地址(企业发票)" - }, - "companyPhone": { - "type": "string", - "description": "企业电话(企业发票)" - }, - "contactPhone": { - "type": "string", - "description": "联系电话" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "email": { - "type": "string", - "description": "接收邮箱" - }, - "failReason": { - "type": "string", - "description": "失败原因" - }, - "fileUrl": { - "type": "string", - "description": "发票文件URL" - }, - "id": { - "type": "string", - "description": "发票ID" - }, - "invoiceContent": { - "type": "string", - "description": "发票内容" - }, - "invoiceNo": { - "type": "string", - "description": "发票号码" - }, - "invoiceTitle": { - "type": "string", - "description": "发票抬头" - }, - "invoiceType": { - "type": "string", - "description": "发票类型" - }, - "issuedAt": { - "type": "string", - "format": "date-time", - "description": "开票时间" - }, - "issuedBy": { - "type": "string", - "description": "开票操作人ID" - }, - "orderId": { - "type": "string", - "description": "订单ID" - }, - "orderNo": { - "type": "string", - "description": "订单号" - }, - "originalInvoiceId": { - "type": "string", - "description": "原发票ID(换开时关联)" - }, - "reissueCount": { - "type": "integer", - "format": "int32", - "description": "换开次数" - }, - "remark": { - "type": "string", - "description": "备注信息" - }, - "status": { - "type": "string", - "description": "发票状态" - }, - "taxNumber": { - "type": "string", - "description": "税号" - }, - "titleType": { - "type": "string", - "description": "抬头类型(personal=个人/company=企业)" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "userId": { - "type": "string", - "description": "用户ID" - } - }, - "title": "发票VO" - }, - "管理员开票失败请求": { - "type": "object", - "required": [ - "failReason" - ], - "properties": { - "failReason": { - "type": "string", - "example": "发票信息有误,请核实后重新申请", - "description": "失败原因" - } - }, - "title": "管理员开票失败请求" - }, - "管理员开票请求": { - "type": "object", - "required": [ - "fileUrl", - "invoiceNo" - ], - "properties": { - "fileUrl": { - "type": "string", - "example": "https://oss.example.com/invoice/xxx.pdf", - "description": "发票文件URL" - }, - "invoiceNo": { - "type": "string", - "example": "012345678901", - "description": "发票号码" - } - }, - "title": "管理员开票请求" - }, - "统一响应结果«Map«string,string»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "object", - "description": "响应数据", - "additionalProperties": { - "type": "string" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Map«string,string»»" - }, - "统一响应结果«分页结果«发票VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«发票VO»", - "originalRef": "分页结果«发票VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«发票VO»»" - }, - "统一响应结果«发票VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/发票VO", - "originalRef": "发票VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«发票VO»" - }, - "分页结果«定制请求列表VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/定制请求列表VO", - "originalRef": "定制请求列表VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«定制请求列表VO»" - }, - "定制师回复/报价请求": { - "type": "object", - "required": [ - "reply" - ], - "properties": { - "productId": { - "type": "integer", - "format": "int64", - "example": 1234567890, - "description": "关联产品ID(定制产品已创建时传入)" - }, - "reply": { - "type": "string", - "example": "已为您设计3天2晚大理深度游方案", - "description": "回复内容" - } - }, - "title": "定制师回复/报价请求" - }, - "定制请求列表VO": { - "type": "object", - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "description": "成人数" - }, - "budget": { - "type": "string", - "description": "预算范围(字典:customize_budget)" - }, - "childCount": { - "type": "integer", - "format": "int32", - "description": "儿童数" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "days": { - "type": "integer", - "format": "int32", - "description": "期望天数" - }, - "designerAvatar": { - "type": "string", - "description": "定制师头像" - }, - "designerName": { - "type": "string", - "description": "定制师姓名" - }, - "destination": { - "type": "string", - "description": "目标地区" - }, - "requestId": { - "type": "integer", - "format": "int64", - "description": "请求ID" - }, - "requestType": { - "type": "string", - "description": "需求类型(字典:customize_request_type)" - }, - "startDate": { - "type": "string", - "format": "date", - "description": "期望出发日期" - }, - "status": { - "type": "string", - "description": "状态(字典:customize_request_status)" - }, - "statusLabel": { - "type": "string", - "description": "状态标签" - }, - "travelPurpose": { - "type": "string", - "description": "旅游目的(字典:travel_purpose)" - }, - "userId": { - "type": "integer", - "format": "int64", - "description": "用户ID" - } - }, - "title": "定制请求列表VO" - }, - "定制请求详情VO": { - "type": "object", - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "description": "成人数" - }, - "budget": { - "type": "string", - "description": "预算范围(字典:customize_budget)" - }, - "childCount": { - "type": "integer", - "format": "int32", - "description": "儿童数" - }, - "contactName": { - "type": "string", - "description": "联系人" - }, - "contactPhone": { - "type": "string", - "description": "联系电话" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "days": { - "type": "integer", - "format": "int32", - "description": "期望天数" - }, - "designerAvatar": { - "type": "string", - "description": "定制师头像" - }, - "designerId": { - "type": "integer", - "format": "int64", - "description": "指定定制师ID" - }, - "designerName": { - "type": "string", - "description": "定制师姓名" - }, - "destination": { - "type": "string", - "description": "目标地区" - }, - "endDate": { - "type": "string", - "format": "date", - "description": "期望结束日期" - }, - "productId": { - "type": "integer", - "format": "int64", - "description": "关联产品ID" - }, - "repliedAt": { - "type": "string", - "format": "date-time", - "description": "回复时间" - }, - "reply": { - "type": "string", - "description": "定制师回复" - }, - "requestId": { - "type": "integer", - "format": "int64", - "description": "请求ID" - }, - "requestType": { - "type": "string", - "description": "需求类型(字典:customize_request_type)" - }, - "requirements": { - "type": "string", - "description": "详细需求描述" - }, - "startDate": { - "type": "string", - "format": "date", - "description": "期望出发日期" - }, - "status": { - "type": "string", - "description": "状态(字典:customize_request_status)" - }, - "statusLabel": { - "type": "string", - "description": "状态标签" - }, - "travelPurpose": { - "type": "string", - "description": "旅游目的(字典:travel_purpose)" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "userId": { - "type": "integer", - "format": "int64", - "description": "用户ID" - } - }, - "title": "定制请求详情VO" - }, - "统一响应结果«分页结果«定制请求列表VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«定制请求列表VO»", - "originalRef": "分页结果«定制请求列表VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«定制请求列表VO»»" - }, - "统一响应结果«定制请求详情VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/定制请求详情VO", - "originalRef": "定制请求详情VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«定制请求详情VO»" - } - } -} \ No newline at end of file diff --git a/.swagger/hl-payment-service.json b/.swagger/hl-payment-service.json deleted file mode 100644 index ccb67bc..0000000 --- a/.swagger/hl-payment-service.json +++ /dev/null @@ -1,6386 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "支付服务", - "version": "1.0.0" - }, - "basePath": "/", - "paths": { - "/admin/product/item/basic": { - "post": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "Step1 基础信息保存", - "description": "创建+更新合一接口。\n\n**创建**:productId不传,productType必传,返回新产品ID。\n**更新**:productId传已有ID,返回原产品ID。\n\n**涉及字典:**\n- product_type: CORE=核心产品, GROUP=小蒙马跟团游, CUSTOM=私人定制\n- product_season: spring=春, summer=夏, autumn=秋, winter=冬\n- product_tag: 亲子/研学/自驾/摄影/草原/高原 等\n- payment_type: FULL=全款支付, DEPOSIT=订金+尾款", - "operationId": "saveBasicUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "req", - "description": "req", - "required": true, - "schema": { - "$ref": "#/definitions/管理端 - Step1 基础信息保存", - "originalRef": "管理端 - Step1 基础信息保存" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«long»", - "originalRef": "统一响应结果«long»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«long»", - "originalRef": "统一响应结果«long»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/list": { - "get": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "产品分页列表", - "description": "支持按名称关键词/产品类型/产品线/状态筛选。\n\n**涉及字典:**\n- product_type: CORE/GROUP/CUSTOM\n- product_status: DRAFT/PENDING_REVIEW/PUBLISHED/UNPUBLISHED/REJECTED/COMPLETED/ORDERED", - "operationId": "listProductsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "关键词(名称/编号)", - "required": false, - "type": "string" - }, - { - "name": "lineId", - "in": "query", - "description": "产品线ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "productType", - "in": "query", - "description": "产品类型(CORE/GROUP/CUSTOM)", - "required": false, - "type": "string" - }, - { - "name": "status", - "in": "query", - "description": "产品状态", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«管理端 - 产品列表项»»", - "originalRef": "统一响应结果«分页结果«管理端 - 产品列表项»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«管理端 - 产品列表项»»", - "originalRef": "统一响应结果«分页结果«管理端 - 产品列表项»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}": { - "get": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "产品详情", - "description": "聚合全部5步数据(主表+基础+行程+路线+价格+补充),用于编辑页回显。", - "operationId": "getDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«管理端 - 产品详情»", - "originalRef": "统一响应结果«管理端 - 产品详情»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«管理端 - 产品详情»", - "originalRef": "统一响应结果«管理端 - 产品详情»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "删除产品", - "description": "级联删除产品+全部子表。仅草稿/已驳回/已下架/已完成状态可删,已上架/待审核需先下架。", - "operationId": "deleteProductUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}/action": { - "post": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "产品状态变更", - "description": "通过COLA状态机驱动状态流转。\n\n**涉及字典:**\n- product_action: SUBMIT_PUBLISH=提交上架, WITHDRAW=撤回, DIRECT_PUBLISH=直接上架, UNPUBLISH=申请下架, FORCE_UNPUBLISH=强制下架, COMPLETE=完成设计\n- product_status: DRAFT→PENDING_REVIEW→PUBLISHED→UNPUBLISHED(详见状态流转图)", - "operationId": "changeStatusUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "req", - "description": "req", - "required": true, - "schema": { - "$ref": "#/definitions/管理端 - 产品状态变更", - "originalRef": "管理端 - 产品状态变更" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}/copy": { - "post": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "复制产品", - "description": "深拷贝产品+全部子表(主表+6张1:1/1:N子表+行程数据),新产品为草稿状态。返回新产品ID。", - "operationId": "copyProductUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«long»", - "originalRef": "统一响应结果«long»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«long»", - "originalRef": "统一响应结果«long»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}/fee-deduction-preview": { - "get": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "费用推导预览", - "description": "根据行程节点类型自动推导费用包含项(景区→门票,酒店→住宿等),排除已忽略类型。", - "operationId": "feeDeductionPreviewUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«管理端 - 费用推导预览»»", - "originalRef": "统一响应结果«List«管理端 - 费用推导预览»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«管理端 - 费用推导预览»»", - "originalRef": "统一响应结果«List«管理端 - 费用推导预览»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}/itinerary": { - "put": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "Step2 行程整体保存", - "description": "整体保存行程天+节点+住宿+路线点。支持新增/更新/删除(EntityDiffUtil对比)。\n\n**涉及字典:**\n- product_node_type: SCENIC=景区, ACTIVITY=活动, RESTAURANT=餐厅, HOTEL=酒店, TRANSPORT=交通, SERVICE=服务, FREE=自由活动, CUSTOM=自定义, NOTE=备注\n- meal_option: HOTEL=酒店餐, CAMP=营地餐, SPECIAL=特色餐, SELF=自理", - "operationId": "saveItineraryUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "req", - "description": "req", - "required": true, - "schema": { - "$ref": "#/definitions/管理端 - Step2 行程保存", - "originalRef": "管理端 - Step2 行程保存" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}/itinerary/day": { - "post": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "Step2 增加一天", - "description": "在行程末尾追加一天,自动编号。返回新天的dayId。", - "operationId": "addDayUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«long»", - "originalRef": "统一响应结果«long»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«long»", - "originalRef": "统一响应结果«long»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}/itinerary/day/{dayNumber}": { - "delete": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "Step2 删除一天", - "description": "删除指定天序号的行程天,级联删除节点+住宿+路线点,后续天序号自动-1。", - "operationId": "deleteDayUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "dayNumber", - "in": "path", - "description": "dayNumber", - "required": true, - "type": "integer", - "format": "int32" - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}/operation-logs": { - "get": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "产品操作记录", - "description": "查询产品的全部操作记录(按时间倒序),审计保留不随产品删除。", - "operationId": "getOperationLogsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«管理端 - 产品操作记录»»", - "originalRef": "统一响应结果«List«管理端 - 产品操作记录»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«管理端 - 产品操作记录»»", - "originalRef": "统一响应结果«List«管理端 - 产品操作记录»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}/price-calendar": { - "get": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "Step4 查询价格日历", - "description": "按月份查询价格日历。\n\n**涉及字典:**\n- price_type: NORMAL=平日, PEAK=旺季, HOLIDAY=节假日, SPECIAL=特价\n- accommodation_spec: 档位序号(1=标准,2=舒适,3=豪华)", - "operationId": "getPriceCalendarUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "month", - "in": "query", - "description": "月份(yyyy-MM)", - "required": true, - "type": "string" - }, - { - "name": "tierSeq", - "in": "query", - "description": "档位序号(默认1)", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«ProductPriceCalendarDO»»", - "originalRef": "统一响应结果«List«ProductPriceCalendarDO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«ProductPriceCalendarDO»»", - "originalRef": "统一响应结果«List«ProductPriceCalendarDO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "Step4 价格日历删除", - "description": "按日期范围+档位删除价格日历(物理删除)。", - "operationId": "deletePriceCalendarUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "req", - "description": "req", - "required": true, - "schema": { - "$ref": "#/definitions/管理端 - 价格日历批量设置", - "originalRef": "管理端 - 价格日历批量设置" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}/price-calendar/batch": { - "post": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "Step4 价格日历批量设置", - "description": "按日期范围+档位批量设置价格(UPSERT)。已上架产品用priceVersion,草稿用version。\n\n**涉及字典:**\n- price_type: NORMAL=平日, PEAK=旺季, HOLIDAY=节假日, SPECIAL=特价", - "operationId": "batchSetPriceCalendarUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "req", - "description": "req", - "required": true, - "schema": { - "$ref": "#/definitions/管理端 - 价格日历批量设置", - "originalRef": "管理端 - 价格日历批量设置" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}/quote": { - "post": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "报价计算", - "description": "根据出发日期+人数+档位计算总价,返回每日明细。", - "operationId": "calculateQuoteUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "req", - "description": "req", - "required": true, - "schema": { - "$ref": "#/definitions/管理端 - 报价计算", - "originalRef": "管理端 - 报价计算" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«管理端 - 报价结果»", - "originalRef": "统一响应结果«管理端 - 报价结果»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«管理端 - 报价结果»", - "originalRef": "统一响应结果«管理端 - 报价结果»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}/route": { - "put": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "Step3 路线与备品保存", - "description": "保存路线总览(1:1)+备品清单(1:N)+额外成本项(1:N)。备品和成本项支持增删改。\n\n**涉及字典:**\n- supply_billing: PER_PERSON=按人头, PER_QUANTITY=按数量", - "operationId": "saveRouteUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "req", - "description": "req", - "required": true, - "schema": { - "$ref": "#/definitions/管理端 - Step3 路线与备品保存", - "originalRef": "管理端 - Step3 路线与备品保存" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}/schedule": { - "post": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "Step4 创建班期", - "description": "创建新班期,batchId不传。自动生成班期编号、计算结束日期和报名截止日。", - "operationId": "saveScheduleUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "req", - "description": "req", - "required": true, - "schema": { - "$ref": "#/definitions/管理端 - 班期保存", - "originalRef": "管理端 - 班期保存" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«long»", - "originalRef": "统一响应结果«long»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«long»", - "originalRef": "统一响应结果«long»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "Step4 修改班期", - "description": "修改已有班期,batchId在body中传。", - "operationId": "updateScheduleUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "req", - "description": "req", - "required": true, - "schema": { - "$ref": "#/definitions/管理端 - 班期保存", - "originalRef": "管理端 - 班期保存" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«long»", - "originalRef": "统一响应结果«long»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«long»", - "originalRef": "统一响应结果«long»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}/schedule/batch-create": { - "post": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "Step4 班期批量创建", - "description": "按重复模式批量创建班期(最多52个,跨度≤12个月)。\n\n**涉及字典:**\n- repeat_mode: WEEKLY=每周, BIWEEKLY=隔周, MONTHLY=每月", - "operationId": "batchCreateScheduleUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "req", - "description": "req", - "required": true, - "schema": { - "$ref": "#/definitions/管理端 - 班期批量创建", - "originalRef": "管理端 - 班期批量创建" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«int»", - "originalRef": "统一响应结果«int»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«int»", - "originalRef": "统一响应结果«int»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}/schedule/list": { - "get": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "Step4 班期列表", - "description": "查询产品下所有班期。\n\n**涉及字典:**\n- schedule_status: ENROLLING=报名中, NEARLY_FULL=即将满员, FULL=已满, FINISHED=已结束, CANCELLING=取消中, CANCELLED=已取消", - "operationId": "getScheduleListUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«GroupTourBatchDO»»", - "originalRef": "统一响应结果«List«GroupTourBatchDO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«GroupTourBatchDO»»", - "originalRef": "统一响应结果«List«GroupTourBatchDO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}/schedule/team": { - "get": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "班期团队查询", - "description": "查询指定班期的团队成员列表。\n\n**涉及字典:**\n- staff_role: LEADER=领队, PHOTOGRAPHER=摄影师, DRIVER=司机, OTHER=其他", - "operationId": "getScheduleTeamUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«GroupBatchStaffDO»»", - "originalRef": "统一响应结果«List«GroupBatchStaffDO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«GroupBatchStaffDO»»", - "originalRef": "统一响应结果«List«GroupBatchStaffDO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "班期团队保存", - "description": "全量保存班期团队成员(全删全插策略,每次传完整列表)。\n\n**涉及字典:**\n- staff_role: LEADER=领队, PHOTOGRAPHER=摄影师, DRIVER=司机, OTHER=其他", - "operationId": "saveScheduleTeamUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "req", - "description": "req", - "required": true, - "schema": { - "$ref": "#/definitions/管理端 - 班期团队保存", - "originalRef": "管理端 - 班期团队保存" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}/schedule/{scheduleId}": { - "delete": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "Step4 删除班期", - "description": "删除班期(已有报名订单不允许删除)。", - "operationId": "deleteScheduleUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "scheduleId", - "in": "path", - "description": "scheduleId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}/schedule/{scheduleId}/cancel": { - "post": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "Step4 取消班期", - "description": "取消班期(有报名订单则标记为CANCELLING触发退款,无订单直接CANCELLED)。", - "operationId": "cancelScheduleUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "scheduleId", - "in": "path", - "description": "scheduleId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}/supplement": { - "put": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "Step5 补充信息保存", - "description": "保存费用包含/不含/自定义项+人群优惠+补充配置(退改/车辆/保险/卖点等)。\n\n**涉及字典:**\n- fee_include_type: TICKET=门票, HOTEL=住宿, TRANSPORT=交通, MEAL=餐饮, INSURANCE=保险\n- fee_source: AUTO=自动推导, MANUAL=手动添加", - "operationId": "saveSupplementUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "req", - "description": "req", - "required": true, - "schema": { - "$ref": "#/definitions/管理端 - Step5 补充信息保存", - "originalRef": "管理端 - Step5 补充信息保存" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}/transfer": { - "put": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "转让产品", - "description": "更换产品创建人(仅超管可操作)。", - "operationId": "transferProductUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "req", - "description": "req", - "required": true, - "schema": { - "$ref": "#/definitions/管理端 - 产品转让", - "originalRef": "管理端 - 产品转让" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{id}/validate-publish": { - "get": { - "tags": [ - "管理端 - 产品管理" - ], - "summary": "上架预检", - "description": "5级校验:L1基础字段→L2内容完整→L3定价→L4条款→L5资源。返回问题列表,空=全部通过。", - "operationId": "validatePublishUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«string»»", - "originalRef": "统一响应结果«List«string»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«string»»", - "originalRef": "统一响应结果«List«string»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/line": { - "post": { - "tags": [ - "管理端 - 产品线管理" - ], - "summary": "创建/修改产品线", - "operationId": "saveLineUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "req", - "description": "req", - "required": true, - "schema": { - "$ref": "#/definitions/管理端 - 产品线保存", - "originalRef": "管理端 - 产品线保存" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«long»", - "originalRef": "统一响应结果«long»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«long»", - "originalRef": "统一响应结果«long»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/line/list": { - "get": { - "tags": [ - "管理端 - 产品线管理" - ], - "summary": "产品线分页列表", - "operationId": "listLinesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "关键词", - "required": false, - "type": "string" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "status", - "in": "query", - "description": "状态(ACTIVE/INACTIVE)", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«管理端 - 产品线详情/列表项»»", - "originalRef": "统一响应结果«分页结果«管理端 - 产品线详情/列表项»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«管理端 - 产品线详情/列表项»»", - "originalRef": "统一响应结果«分页结果«管理端 - 产品线详情/列表项»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/line/simple-list": { - "get": { - "tags": [ - "管理端 - 产品线管理" - ], - "summary": "产品线下拉选项", - "operationId": "simpleListUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«管理端 - 产品线下拉»»", - "originalRef": "统一响应结果«List«管理端 - 产品线下拉»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«管理端 - 产品线下拉»»", - "originalRef": "统一响应结果«List«管理端 - 产品线下拉»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/line/{id}": { - "get": { - "tags": [ - "管理端 - 产品线管理" - ], - "summary": "产品线详情", - "operationId": "getDetailUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«管理端 - 产品线详情/列表项»", - "originalRef": "统一响应结果«管理端 - 产品线详情/列表项»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«管理端 - 产品线详情/列表项»", - "originalRef": "统一响应结果«管理端 - 产品线详情/列表项»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "管理端 - 产品线管理" - ], - "summary": "删除产品线", - "operationId": "deleteLineUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/booking-terms/enabled": { - "get": { - "tags": [ - "管理端 - 模板管理" - ], - "summary": "预订条款下拉", - "operationId": "bookingTermsEnabledUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«管理端 - 预订条款»»", - "originalRef": "统一响应结果«List«管理端 - 预订条款»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«管理端 - 预订条款»»", - "originalRef": "统一响应结果«List«管理端 - 预订条款»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/safety-template/enabled": { - "get": { - "tags": [ - "管理端 - 模板管理" - ], - "summary": "安全保障模板下拉", - "operationId": "safetyTemplateEnabledUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«管理端 - 安全保障模板»»", - "originalRef": "统一响应结果«List«管理端 - 安全保障模板»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«管理端 - 安全保障模板»»", - "originalRef": "统一响应结果«List«管理端 - 安全保障模板»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/warm-tips/enabled": { - "get": { - "tags": [ - "管理端 - 模板管理" - ], - "summary": "温馨提示下拉", - "operationId": "warmTipsEnabledUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«管理端 - 温馨提示»»", - "originalRef": "统一响应结果«List«管理端 - 温馨提示»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«管理端 - 温馨提示»»", - "originalRef": "统一响应结果«List«管理端 - 温馨提示»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/product/compare": { - "get": { - "tags": [ - "小程序端 - 产品查询" - ], - "summary": "产品对比", - "operationId": "compareUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "ids", - "in": "query", - "description": "ids", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«小程序端 - 产品详情»»", - "originalRef": "统一响应结果«List«小程序端 - 产品详情»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«小程序端 - 产品详情»»", - "originalRef": "统一响应结果«List«小程序端 - 产品详情»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/product/{id}": { - "get": { - "tags": [ - "小程序端 - 产品查询" - ], - "summary": "产品详情", - "operationId": "getDetailUsingGET_2", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«小程序端 - 产品详情»", - "originalRef": "统一响应结果«小程序端 - 产品详情»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«小程序端 - 产品详情»", - "originalRef": "统一响应结果«小程序端 - 产品详情»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/product/{id}/price-calendar": { - "get": { - "tags": [ - "小程序端 - 产品查询" - ], - "summary": "价格日历", - "operationId": "getPriceCalendarUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "month", - "in": "query", - "description": "月份(yyyy-MM)", - "required": true, - "type": "string" - }, - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«小程序端 - 价格日历»", - "originalRef": "统一响应结果«小程序端 - 价格日历»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«小程序端 - 价格日历»", - "originalRef": "统一响应结果«小程序端 - 价格日历»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/product/{id}/quote": { - "post": { - "tags": [ - "小程序端 - 产品查询" - ], - "summary": "C端报价", - "operationId": "quoteUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "req", - "description": "req", - "required": true, - "schema": { - "$ref": "#/definitions/管理端 - 报价计算", - "originalRef": "管理端 - 报价计算" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«管理端 - 报价结果»", - "originalRef": "统一响应结果«管理端 - 报价结果»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«管理端 - 报价结果»", - "originalRef": "统一响应结果«管理端 - 报价结果»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/product/{id}/schedules": { - "get": { - "tags": [ - "小程序端 - 产品查询" - ], - "summary": "班期列表", - "operationId": "getSchedulesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«GroupTourBatchDO»»", - "originalRef": "统一响应结果«List«GroupTourBatchDO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«GroupTourBatchDO»»", - "originalRef": "统一响应结果«List«GroupTourBatchDO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/product/{id}/tier-compare": { - "get": { - "tags": [ - "小程序端 - 产品查询" - ], - "summary": "档位对比", - "operationId": "tierCompareUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "id", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«int,List«ProductDayHotelDO»»»", - "originalRef": "统一响应结果«Map«int,List«ProductDayHotelDO»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«int,List«ProductDayHotelDO»»»", - "originalRef": "统一响应结果«Map«int,List«ProductDayHotelDO»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/product-line/list": { - "get": { - "tags": [ - "小程序端 - 产品线查询" - ], - "summary": "产品线列表", - "operationId": "listLinesUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "season", - "in": "query", - "description": "season", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«管理端 - 产品线下拉»»", - "originalRef": "统一响应结果«List«管理端 - 产品线下拉»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«管理端 - 产品线下拉»»", - "originalRef": "统一响应结果«List«管理端 - 产品线下拉»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/product-line/{lineId}/products": { - "get": { - "tags": [ - "小程序端 - 产品线查询" - ], - "summary": "产品线下产品列表", - "operationId": "listProductsUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "lineId", - "in": "query", - "description": "产品线ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "tag", - "in": "query", - "description": "标签筛选(可选)", - "required": false, - "type": "string" - }, - { - "name": "lineId", - "in": "path", - "description": "lineId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«小程序端 - 产品列表项»»", - "originalRef": "统一响应结果«List«小程序端 - 产品列表项»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«小程序端 - 产品列表项»»", - "originalRef": "统一响应结果«List«小程序端 - 产品列表项»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - } - }, - "definitions": { - "DailyDetail": { - "type": "object", - "properties": { - "adultPrice": { - "type": "number", - "description": "成人价" - }, - "childPrice": { - "type": "number", - "description": "儿童价" - }, - "date": { - "type": "string", - "description": "日期" - } - }, - "title": "DailyDetail" - }, - "GroupBatchStaffDO": { - "type": "object", - "properties": { - "batchId": { - "type": "integer", - "format": "int64" - }, - "createTime": { - "type": "string", - "format": "date-time" - }, - "createdBy": { - "type": "integer", - "format": "int64" - }, - "deletedAt": { - "type": "string", - "format": "date-time" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "productId": { - "type": "integer", - "format": "int64" - }, - "remark": { - "type": "string" - }, - "sortOrder": { - "type": "integer", - "format": "int32" - }, - "staffId": { - "type": "integer", - "format": "int64" - }, - "staffName": { - "type": "string" - }, - "staffPhone": { - "type": "string" - }, - "staffRole": { - "type": "string" - }, - "updateTime": { - "type": "string", - "format": "date-time" - }, - "updatedBy": { - "type": "integer", - "format": "int64" - } - }, - "title": "GroupBatchStaffDO" - }, - "GroupTourBatchDO": { - "type": "object", - "properties": { - "adultPrice": { - "type": "number" - }, - "batchId": { - "type": "integer", - "format": "int64" - }, - "batchLabel": { - "type": "string" - }, - "batchName": { - "type": "string" - }, - "batchNo": { - "type": "string" - }, - "batchStatus": { - "type": "string" - }, - "bookedRooms": { - "type": "integer", - "format": "int32" - }, - "childPrice": { - "type": "number" - }, - "createTime": { - "type": "string", - "format": "date-time" - }, - "createdBy": { - "type": "integer", - "format": "int64" - }, - "deletedAt": { - "type": "string", - "format": "date-time" - }, - "departureDate": { - "type": "string", - "format": "date" - }, - "endDate": { - "type": "string", - "format": "date" - }, - "enrolledCount": { - "type": "integer", - "format": "int32" - }, - "enrollmentDeadline": { - "type": "string", - "format": "date" - }, - "infantPrice": { - "type": "number" - }, - "maxParticipants": { - "type": "integer", - "format": "int32" - }, - "maxRooms": { - "type": "integer", - "format": "int32" - }, - "productId": { - "type": "integer", - "format": "int64" - }, - "productStockLimit": { - "type": "integer", - "format": "int32" - }, - "remark": { - "type": "string" - }, - "sortOrder": { - "type": "integer", - "format": "int32" - }, - "toddlerDiscount": { - "type": "number" - }, - "updateTime": { - "type": "string", - "format": "date-time" - }, - "updatedBy": { - "type": "integer", - "format": "int64" - }, - "version": { - "type": "integer", - "format": "int32" - } - }, - "title": "GroupTourBatchDO" - }, - "ProductCrowdBenefitDO": { - "type": "object", - "properties": { - "childAccommodation": { - "type": "string" - }, - "childMeal": { - "type": "string" - }, - "childTicket": { - "type": "string" - }, - "createTime": { - "type": "string", - "format": "date-time" - }, - "createdBy": { - "type": "integer", - "format": "int64" - }, - "deletedAt": { - "type": "string", - "format": "date-time" - }, - "elderAccommodation": { - "type": "string" - }, - "elderTicket": { - "type": "string" - }, - "productId": { - "type": "integer", - "format": "int64" - }, - "tips": { - "type": "string" - }, - "updateTime": { - "type": "string", - "format": "date-time" - }, - "updatedBy": { - "type": "integer", - "format": "int64" - } - }, - "title": "ProductCrowdBenefitDO" - }, - "ProductFeeItemDO": { - "type": "object", - "properties": { - "costItemId": { - "type": "integer", - "format": "int64" - }, - "createTime": { - "type": "string", - "format": "date-time" - }, - "createdBy": { - "type": "integer", - "format": "int64" - }, - "daily": { - "type": "boolean" - }, - "deletedAt": { - "type": "string", - "format": "date-time" - }, - "description": { - "type": "string" - }, - "feeCategory": { - "type": "string" - }, - "feeType": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - }, - "productId": { - "type": "integer", - "format": "int64" - }, - "quantity": { - "type": "integer", - "format": "int32" - }, - "resourceId": { - "type": "integer", - "format": "int64" - }, - "resourceType": { - "type": "string" - }, - "sortOrder": { - "type": "integer", - "format": "int32" - }, - "source": { - "type": "string" - }, - "unit": { - "type": "string" - }, - "unitPrice": { - "type": "number" - }, - "updateTime": { - "type": "string", - "format": "date-time" - }, - "updatedBy": { - "type": "integer", - "format": "int64" - } - }, - "title": "ProductFeeItemDO" - }, - "ProductPriceCalendarDO": { - "type": "object", - "properties": { - "adultSellPrice": { - "type": "number" - }, - "childSellPrice": { - "type": "number" - }, - "createTime": { - "type": "string", - "format": "date-time" - }, - "createdBy": { - "type": "integer", - "format": "int64" - }, - "dailyStock": { - "type": "integer", - "format": "int32" - }, - "date": { - "type": "string", - "format": "date" - }, - "deletedAt": { - "type": "string", - "format": "date-time" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "infantPrice": { - "type": "number" - }, - "priceType": { - "type": "string" - }, - "productId": { - "type": "integer", - "format": "int64" - }, - "rangeId": { - "type": "integer", - "format": "int64" - }, - "sold": { - "type": "integer", - "format": "int32" - }, - "tierSeq": { - "type": "integer", - "format": "int32" - }, - "toddlerDiscount": { - "type": "number" - }, - "updateTime": { - "type": "string", - "format": "date-time" - }, - "updatedBy": { - "type": "integer", - "format": "int64" - } - }, - "title": "ProductPriceCalendarDO" - }, - "ProductRouteInfoDO": { - "type": "object", - "properties": { - "createTime": { - "type": "string", - "format": "date-time" - }, - "createdBy": { - "type": "integer", - "format": "int64" - }, - "deletedAt": { - "type": "string", - "format": "date-time" - }, - "productId": { - "type": "integer", - "format": "int64" - }, - "routeDescription": { - "type": "string" - }, - "routeMapUrl": { - "type": "string" - }, - "routeName": { - "type": "string" - }, - "staffCostIds": { - "type": "string" - }, - "totalMileage": { - "type": "number" - }, - "updateTime": { - "type": "string", - "format": "date-time" - }, - "updatedBy": { - "type": "integer", - "format": "int64" - }, - "vehicleModelId": { - "type": "integer", - "format": "int64" - } - }, - "title": "ProductRouteInfoDO" - }, - "ProductSupplementDO": { - "type": "object", - "properties": { - "bookingTermsId": { - "type": "integer", - "format": "int64" - }, - "childExperience": { - "type": "string" - }, - "contractSchemeId": { - "type": "integer", - "format": "int64" - }, - "createTime": { - "type": "string", - "format": "date-time" - }, - "createdBy": { - "type": "integer", - "format": "int64" - }, - "deletedAt": { - "type": "string", - "format": "date-time" - }, - "equipmentAdvice": { - "type": "string" - }, - "feeIgnoredTypes": { - "type": "string" - }, - "growthGains": { - "type": "string" - }, - "insuranceNotice": { - "type": "string" - }, - "insuranceSchemeId": { - "type": "integer", - "format": "int64" - }, - "productId": { - "type": "integer", - "format": "int64" - }, - "quickUnderstand": { - "type": "string" - }, - "refundPolicyIds": { - "type": "string" - }, - "updateTime": { - "type": "string", - "format": "date-time" - }, - "updatedBy": { - "type": "integer", - "format": "int64" - }, - "vehicleModelIds": { - "type": "string" - }, - "vehicleRuleText": { - "type": "string" - }, - "warmTipsId": { - "type": "integer", - "format": "int64" - } - }, - "title": "ProductSupplementDO" - }, - "ProductSuppliesDO": { - "type": "object", - "properties": { - "billingType": { - "type": "string" - }, - "category": { - "type": "string" - }, - "createTime": { - "type": "string", - "format": "date-time" - }, - "createdBy": { - "type": "integer", - "format": "int64" - }, - "deletedAt": { - "type": "string", - "format": "date-time" - }, - "hasCost": { - "type": "boolean" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "productId": { - "type": "integer", - "format": "int64" - }, - "quantity": { - "type": "integer", - "format": "int32" - }, - "sortOrder": { - "type": "integer", - "format": "int32" - }, - "suppliesName": { - "type": "string" - }, - "suppliesResourceId": { - "type": "integer", - "format": "int64" - }, - "unitPrice": { - "type": "number" - }, - "updateTime": { - "type": "string", - "format": "date-time" - }, - "updatedBy": { - "type": "integer", - "format": "int64" - } - }, - "title": "ProductSuppliesDO" - }, - "StaffItem": { - "type": "object", - "properties": { - "remark": { - "type": "string", - "description": "备注" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序" - }, - "staffId": { - "type": "integer", - "format": "int64", - "description": "员工ID" - }, - "staffName": { - "type": "string", - "description": "员工名称" - }, - "staffPhone": { - "type": "string", - "description": "员工电话" - }, - "staffRole": { - "type": "string", - "description": "员工角色" - } - }, - "title": "StaffItem" - }, - "住宿项": { - "type": "object", - "properties": { - "hotelId": { - "type": "integer", - "format": "int64", - "description": "酒店ID" - }, - "id": { - "type": "integer", - "format": "int64", - "description": "住宿ID(已有则传,新增不传)" - }, - "isDefault": { - "type": "boolean", - "description": "是否默认推荐" - }, - "roomCount": { - "type": "integer", - "format": "int32", - "description": "房间数(私人定制用)" - }, - "roomTypeId": { - "type": "integer", - "format": "int64", - "description": "房型ID(私人定制用)" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序" - }, - "tierSeq": { - "type": "integer", - "format": "int32", - "description": "档位序号(无档位=1)" - } - }, - "title": "住宿项" - }, - "分页结果«管理端 - 产品列表项»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/管理端 - 产品列表项", - "originalRef": "管理端 - 产品列表项" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«管理端 - 产品列表项»" - }, - "备品项": { - "type": "object", - "properties": { - "billingType": { - "type": "string", - "description": "计费方式(PER_PERSON/PER_QUANTITY)" - }, - "category": { - "type": "string", - "description": "分类" - }, - "hasCost": { - "type": "boolean", - "description": "是否涉及成本" - }, - "id": { - "type": "integer", - "format": "int64", - "description": "备品ID(已有则传,新增不传)" - }, - "quantity": { - "type": "integer", - "format": "int32", - "description": "数量" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序" - }, - "suppliesName": { - "type": "string", - "description": "备品名称" - }, - "suppliesResourceId": { - "type": "integer", - "format": "int64", - "description": "备品资源ID(可空=自定义)" - }, - "unitPrice": { - "type": "number", - "description": "单价" - } - }, - "title": "备品项" - }, - "活动节点": { - "type": "object", - "properties": { - "description": { - "type": "string", - "description": "描述" - }, - "durationMinutes": { - "type": "integer", - "format": "int32", - "description": "时长(分钟)" - }, - "emojiIcon": { - "type": "string", - "description": "图标" - }, - "extraData": { - "type": "object", - "description": "扩展数据" - }, - "images": { - "type": "array", - "description": "图片列表", - "items": { - "type": "string" - } - }, - "nodeId": { - "type": "integer", - "format": "int64", - "description": "节点ID(已有则传,新增不传)" - }, - "nodeName": { - "type": "string", - "description": "节点名称" - }, - "nodeType": { - "type": "string", - "description": "节点类型(SCENIC/ACTIVITY/RESTAURANT/SERVICE/CUSTOM等)" - }, - "resourceId": { - "type": "integer", - "format": "int64", - "description": "资源ID" - }, - "resourceType": { - "type": "string", - "description": "资源类型" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序" - }, - "startTime": { - "type": "string", - "description": "开始时间(如10:00)" - } - }, - "title": "活动节点" - }, - "管理端 - Step1 基础信息保存": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "category": { - "type": "string", - "example": "family", - "description": "产品分类(字典product_category: family=亲子游, honeymoon=蜜月旅行, photography=摄影之旅, experience=深度体验, driving=自驾越野)" - }, - "coverImageUrl": { - "type": "string", - "description": "封面图URL" - }, - "introduction": { - "type": "string", - "description": "产品简介(富文本HTML)" - }, - "lineId": { - "type": "integer", - "format": "int64", - "example": 100, - "description": "产品线ID(主题ID,CORE/GROUP必传,CUSTOM可空)" - }, - "name": { - "type": "string", - "example": "额吉的故乡·亲子版", - "description": "产品名称(≤30字)" - }, - "productId": { - "type": "integer", - "format": "int64", - "example": 2043246204711550977, - "description": "产品ID(不传=创建,传了=更新)" - }, - "productType": { - "type": "string", - "example": "CORE", - "description": "产品类型(创建时必传,更新时忽略。CORE=核心产品, GROUP=小蒙马, CUSTOM=私人定制)" - }, - "subtitle": { - "type": "string", - "example": "6天5晚草原环线", - "description": "副标题(≤128字)" - }, - "tags": { - "type": "array", - "example": [ - "亲子", - "研学" - ], - "description": "产品标签(亲子/研学/露营/城记/摄影)", - "items": { - "type": "string" - } - }, - "tiers": { - "type": "array", - "description": "规格列表(单一档不传或传1个,多档传多个)", - "items": { - "$ref": "#/definitions/规格项", - "originalRef": "规格项" - } - }, - "tripDays": { - "type": "integer", - "format": "int32", - "example": 6, - "description": "行程天数(≥1)" - }, - "tripNights": { - "type": "integer", - "format": "int32", - "example": 5, - "description": "行程晚数(不传自动=天数-1)" - } - }, - "title": "管理端 - Step1 基础信息保存" - }, - "管理端 - Step2 行程保存": { - "type": "object", - "properties": { - "days": { - "type": "array", - "description": "行程天列表", - "items": { - "$ref": "#/definitions/行程天", - "originalRef": "行程天" - } - } - }, - "title": "管理端 - Step2 行程保存" - }, - "管理端 - Step3 路线与备品保存": { - "type": "object", - "properties": { - "extraCosts": { - "type": "array", - "description": "额外成本项列表", - "items": { - "$ref": "#/definitions/额外成本项", - "originalRef": "额外成本项" - } - }, - "routeDescription": { - "type": "string", - "description": "线路描述" - }, - "routeMapUrl": { - "type": "string", - "description": "路线图URL(手动上传)" - }, - "supplies": { - "type": "array", - "description": "备品列表", - "items": { - "$ref": "#/definitions/备品项", - "originalRef": "备品项" - } - }, - "totalMileage": { - "type": "number", - "description": "总里程(km)" - } - }, - "title": "管理端 - Step3 路线与备品保存" - }, - "管理端 - Step5 补充信息保存": { - "type": "object", - "properties": { - "bookingTermsId": { - "type": "integer", - "format": "int64", - "description": "预订条款ID" - }, - "childAccommodation": { - "type": "string", - "description": "儿童住宿(BED/NO_BED)" - }, - "childExperience": { - "type": "object", - "description": "孩子经历" - }, - "childMeal": { - "type": "string", - "description": "儿童餐饮(FULL/HALF)" - }, - "childTicket": { - "type": "string", - "description": "儿童门票优惠(FREE/HALF_PRICE/FULL_PRICE)" - }, - "contractSchemeId": { - "type": "integer", - "format": "int64", - "description": "合同方案ID" - }, - "crowdBenefitTips": { - "type": "string", - "description": "人群优惠温馨提示" - }, - "customFees": { - "type": "array", - "description": "自定义费用列表", - "items": { - "$ref": "#/definitions/费用项", - "originalRef": "费用项" - } - }, - "elderAccommodation": { - "type": "string", - "description": "老人住宿" - }, - "elderTicket": { - "type": "string", - "description": "老人门票优惠" - }, - "equipmentAdvice": { - "type": "string", - "description": "装备建议(富文本)" - }, - "excludedFees": { - "type": "array", - "description": "费用不含列表", - "items": { - "$ref": "#/definitions/费用项", - "originalRef": "费用项" - } - }, - "feeIgnoredTypes": { - "type": "array", - "description": "费用推导已忽略类型", - "items": { - "type": "string" - } - }, - "growthGains": { - "type": "array", - "description": "成长收获", - "items": { - "type": "object" - } - }, - "includedFees": { - "type": "array", - "description": "费用包含列表", - "items": { - "$ref": "#/definitions/费用项", - "originalRef": "费用项" - } - }, - "insuranceNotice": { - "type": "string", - "description": "保险告知(INCLUDED/EXCLUDED/OPTIONAL)" - }, - "insuranceSchemeId": { - "type": "integer", - "format": "int64", - "description": "保险方案ID" - }, - "quickUnderstand": { - "type": "object", - "description": "快速理解" - }, - "refundPolicyIds": { - "type": "object", - "description": "退改政策映射" - }, - "vehicleModelIds": { - "type": "array", - "description": "展示车型ID列表", - "items": { - "type": "integer", - "format": "int64" - } - }, - "vehicleRuleText": { - "type": "string", - "description": "用车规则说明" - }, - "warmTipsId": { - "type": "integer", - "format": "int64", - "description": "温馨提示ID" - } - }, - "title": "管理端 - Step5 补充信息保存" - }, - "管理端 - 产品列表项": { - "type": "object", - "properties": { - "category": { - "type": "string", - "description": "产品分类(字典product_category)" - }, - "coverImageUrl": { - "type": "string", - "description": "封面图URL" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "integer", - "format": "int64", - "description": "创建人ID" - }, - "createdByName": { - "type": "string", - "description": "创建人名称" - }, - "lineId": { - "type": "integer", - "format": "int64", - "description": "产品线ID(前端叫「主题」)" - }, - "lineName": { - "type": "string", - "description": "产品线名称(前端叫「主题名」,从产品线表关联查出)" - }, - "name": { - "type": "string", - "description": "产品名称" - }, - "productId": { - "type": "integer", - "format": "int64", - "description": "产品ID" - }, - "productNo": { - "type": "string", - "description": "产品编号(如C260409001)" - }, - "productType": { - "type": "string", - "description": "产品类型(字典product_type: CORE=核心产品, GROUP=小蒙马, CUSTOM=私人定制)" - }, - "publishedAt": { - "type": "string", - "format": "date-time", - "description": "上架时间" - }, - "seasons": { - "type": "array", - "description": "产品季节(JSON数组,如[\"summer\",\"autumn\"])", - "items": { - "type": "string" - } - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序号" - }, - "startPrice": { - "type": "number", - "description": "起步价(已上架产品的最低成人售价,草稿为null)" - }, - "status": { - "type": "string", - "description": "产品状态(字典product_status)" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "tags": { - "type": "array", - "description": "产品标签(JSON数组,如[\"亲子\",\"研学\"])", - "items": { - "type": "string" - } - }, - "tierCount": { - "type": "integer", - "format": "int32", - "description": "档位数量(前端叫「规格数」,单一=1,多档=N,未配置=0)" - }, - "tripDays": { - "type": "integer", - "format": "int32", - "description": "行程天数" - }, - "tripNights": { - "type": "integer", - "format": "int32", - "description": "行程晚数" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "管理端 - 产品列表项" - }, - "管理端 - 产品操作记录": { - "type": "object", - "properties": { - "action": { - "type": "string", - "description": "操作类型" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "操作时间" - }, - "detail": { - "type": "string", - "description": "详情/驳回原因" - }, - "id": { - "type": "integer", - "format": "int64", - "description": "记录ID" - }, - "operatorId": { - "type": "integer", - "format": "int64", - "description": "操作人ID" - }, - "operatorName": { - "type": "string", - "description": "操作人名称" - }, - "step": { - "type": "string", - "description": "步骤号" - } - }, - "title": "管理端 - 产品操作记录" - }, - "管理端 - 产品状态变更": { - "type": "object", - "required": [ - "action" - ], - "properties": { - "action": { - "type": "string", - "description": "操作动作(SUBMIT_PUBLISH/WITHDRAW/DIRECT_PUBLISH/UNPUBLISH/FORCE_UNPUBLISH/COMPLETE)" - }, - "remark": { - "type": "string", - "description": "备注/驳回原因(可选)" - } - }, - "title": "管理端 - 产品状态变更" - }, - "管理端 - 产品详情": { - "type": "object", - "properties": { - "carouselImages": { - "type": "object", - "description": "轮播图" - }, - "category": { - "type": "string", - "description": "产品分类(字典product_category)" - }, - "childAgeMax": { - "type": "integer", - "format": "int32", - "description": "儿童年龄上限" - }, - "childAgeMin": { - "type": "integer", - "format": "int32", - "description": "儿童年龄下限" - }, - "coverImageUrl": { - "type": "string", - "description": "封面图" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "integer", - "format": "int64", - "description": "创建人ID" - }, - "crowdBenefit": { - "description": "人群优惠", - "$ref": "#/definitions/ProductCrowdBenefitDO", - "originalRef": "ProductCrowdBenefitDO" - }, - "currentStep": { - "type": "integer", - "format": "int32", - "description": "当前步骤进度(1=基础信息, 2=行程编排, 3=路线与备品, 4=定价管理, 5=补充信息)" - }, - "customFees": { - "type": "array", - "description": "自定义费用", - "items": { - "$ref": "#/definitions/ProductFeeItemDO", - "originalRef": "ProductFeeItemDO" - } - }, - "depositAmount": { - "type": "number", - "description": "订金固定额" - }, - "depositRatio": { - "type": "integer", - "format": "int32", - "description": "订金比例" - }, - "excludedFees": { - "type": "array", - "description": "费用不含", - "items": { - "$ref": "#/definitions/ProductFeeItemDO", - "originalRef": "ProductFeeItemDO" - } - }, - "extraCosts": { - "type": "array", - "description": "额外成本项", - "items": { - "$ref": "#/definitions/ProductFeeItemDO", - "originalRef": "ProductFeeItemDO" - } - }, - "includedFees": { - "type": "array", - "description": "费用包含", - "items": { - "$ref": "#/definitions/ProductFeeItemDO", - "originalRef": "ProductFeeItemDO" - } - }, - "infantAgeMax": { - "type": "integer", - "format": "int32", - "description": "幼童年龄上限" - }, - "introduction": { - "type": "string", - "description": "产品简介" - }, - "isBooking": { - "type": "boolean", - "description": "是否预约产品" - }, - "itinerary": { - "type": "array", - "description": "行程天列表", - "items": { - "type": "object" - } - }, - "lineId": { - "type": "integer", - "format": "int64", - "description": "产品线ID" - }, - "name": { - "type": "string", - "description": "产品名称" - }, - "paymentType": { - "type": "string", - "description": "支付方式" - }, - "productId": { - "type": "integer", - "format": "int64", - "description": "产品ID" - }, - "productNo": { - "type": "string", - "description": "产品编号" - }, - "productType": { - "type": "string", - "description": "产品类型" - }, - "publishedAt": { - "type": "string", - "format": "date-time", - "description": "上架时间" - }, - "routeInfo": { - "description": "路线信息", - "$ref": "#/definitions/ProductRouteInfoDO", - "originalRef": "ProductRouteInfoDO" - }, - "schedules": { - "type": "array", - "description": "班期列表", - "items": { - "$ref": "#/definitions/GroupTourBatchDO", - "originalRef": "GroupTourBatchDO" - } - }, - "seasons": { - "type": "object", - "description": "产品季节" - }, - "showReview": { - "type": "boolean", - "description": "展示评价" - }, - "status": { - "type": "string", - "description": "产品状态" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "supplement": { - "description": "补充配置", - "$ref": "#/definitions/ProductSupplementDO", - "originalRef": "ProductSupplementDO" - }, - "supplies": { - "type": "array", - "description": "备品列表", - "items": { - "$ref": "#/definitions/ProductSuppliesDO", - "originalRef": "ProductSuppliesDO" - } - }, - "tags": { - "type": "object", - "description": "产品标签" - }, - "tiers": { - "type": "object", - "description": "档位列表" - }, - "toddlerAgeMax": { - "type": "integer", - "format": "int32", - "description": "小童年龄上限" - }, - "tripDays": { - "type": "integer", - "format": "int32", - "description": "行程天数" - }, - "tripNights": { - "type": "integer", - "format": "int32", - "description": "行程晚数" - } - }, - "title": "管理端 - 产品详情" - }, - "管理端 - 产品转让": { - "type": "object", - "required": [ - "newCreatorId" - ], - "properties": { - "newCreatorId": { - "type": "integer", - "format": "int64", - "description": "新创建人ID" - } - }, - "title": "管理端 - 产品转让" - }, - "管理端 - 价格日历批量设置": { - "type": "object", - "required": [ - "adultSellPrice", - "endDate", - "startDate" - ], - "properties": { - "adultSellPrice": { - "type": "number", - "description": "成人售价" - }, - "childSellPrice": { - "type": "number", - "description": "儿童售价" - }, - "dailyStock": { - "type": "integer", - "format": "int32", - "description": "每日库存上限(NULL=不限量)" - }, - "endDate": { - "type": "string", - "format": "date", - "description": "结束日期" - }, - "infantPrice": { - "type": "number", - "description": "幼童售价(0=免费)" - }, - "priceType": { - "type": "string", - "description": "价格类型(NORMAL/PEAK/HOLIDAY/SPECIAL)" - }, - "startDate": { - "type": "string", - "format": "date", - "description": "开始日期" - }, - "tierSeq": { - "type": "integer", - "format": "int32", - "description": "档位序号(默认1)" - }, - "toddlerDiscount": { - "type": "number", - "description": "小童优惠额(负数)" - } - }, - "title": "管理端 - 价格日历批量设置" - }, - "管理端 - 报价结果": { - "type": "object", - "properties": { - "dailyDetails": { - "type": "array", - "description": "每日价格明细", - "items": { - "$ref": "#/definitions/DailyDetail", - "originalRef": "DailyDetail" - } - }, - "grandTotal": { - "type": "number", - "description": "总价合计" - }, - "totalAdultPrice": { - "type": "number", - "description": "成人总价" - }, - "totalChildPrice": { - "type": "number", - "description": "儿童总价" - } - }, - "title": "管理端 - 报价结果" - }, - "管理端 - 报价计算": { - "type": "object", - "required": [ - "adultCount", - "departureDate" - ], - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "description": "成人数" - }, - "batchId": { - "type": "integer", - "format": "int64", - "description": "班期ID(小蒙马用)" - }, - "childCount": { - "type": "integer", - "format": "int32", - "description": "儿童数" - }, - "departureDate": { - "type": "string", - "format": "date", - "description": "出发日期" - }, - "infantCount": { - "type": "integer", - "format": "int32", - "description": "幼童数" - }, - "tierSeq": { - "type": "integer", - "format": "int32", - "description": "档位序号(默认1)" - }, - "toddlerCount": { - "type": "integer", - "format": "int32", - "description": "小童数" - } - }, - "title": "管理端 - 报价计算" - }, - "管理端 - 班期保存": { - "type": "object", - "required": [ - "departureDate" - ], - "properties": { - "adultPrice": { - "type": "number", - "description": "成人价" - }, - "batchId": { - "type": "integer", - "format": "int64", - "description": "班期ID(修改时传)" - }, - "batchName": { - "type": "string", - "description": "班期名称" - }, - "childPrice": { - "type": "number", - "description": "儿童价" - }, - "departureDate": { - "type": "string", - "format": "date", - "description": "出发日期" - }, - "enrollmentDeadline": { - "type": "string", - "format": "date", - "description": "报名截止日(默认出发前1天)" - }, - "infantPrice": { - "type": "number", - "description": "幼童价" - }, - "maxParticipants": { - "type": "integer", - "format": "int32", - "description": "最大参与人数" - }, - "maxRooms": { - "type": "integer", - "format": "int32", - "description": "总房间数(0=不限)" - }, - "productStockLimit": { - "type": "integer", - "format": "int32", - "description": "产品库存上限" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "toddlerDiscount": { - "type": "number", - "description": "小童优惠额(负数)" - } - }, - "title": "管理端 - 班期保存" - }, - "管理端 - 班期团队保存": { - "type": "object", - "properties": { - "staffList": { - "type": "array", - "description": "团队成员列表", - "items": { - "$ref": "#/definitions/StaffItem", - "originalRef": "StaffItem" - } - } - }, - "title": "管理端 - 班期团队保存" - }, - "管理端 - 班期批量创建": { - "type": "object", - "required": [ - "endDate", - "repeatMode", - "startDate" - ], - "properties": { - "adultPrice": { - "type": "number", - "description": "成人价" - }, - "childPrice": { - "type": "number", - "description": "儿童价" - }, - "dayOfWeek": { - "type": "integer", - "format": "int32", - "description": "星期几(1=周一...7=周日)" - }, - "endDate": { - "type": "string", - "format": "date", - "description": "结束日期" - }, - "maxParticipants": { - "type": "integer", - "format": "int32", - "description": "最大参与人数" - }, - "maxRooms": { - "type": "integer", - "format": "int32", - "description": "总房间数" - }, - "repeatMode": { - "type": "string", - "description": "重复模式(WEEKLY/BIWEEKLY/MONTHLY)" - }, - "startDate": { - "type": "string", - "format": "date", - "description": "开始日期" - } - }, - "title": "管理端 - 班期批量创建" - }, - "管理端 - 费用推导预览": { - "type": "object", - "properties": { - "feeType": { - "type": "string", - "description": "费用类型标签" - }, - "name": { - "type": "string", - "description": "费用名称" - }, - "source": { - "type": "string", - "description": "来源(AUTO=自动推导)" - }, - "sourceNodeName": { - "type": "string", - "description": "来源节点名称" - } - }, - "title": "管理端 - 费用推导预览" - }, - "统一响应结果«List«GroupBatchStaffDO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/GroupBatchStaffDO", - "originalRef": "GroupBatchStaffDO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«GroupBatchStaffDO»»" - }, - "统一响应结果«List«GroupTourBatchDO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/GroupTourBatchDO", - "originalRef": "GroupTourBatchDO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«GroupTourBatchDO»»" - }, - "统一响应结果«List«ProductPriceCalendarDO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/ProductPriceCalendarDO", - "originalRef": "ProductPriceCalendarDO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«ProductPriceCalendarDO»»" - }, - "统一响应结果«List«string»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "type": "string" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«string»»" - }, - "统一响应结果«List«管理端 - 产品操作记录»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/管理端 - 产品操作记录", - "originalRef": "管理端 - 产品操作记录" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«管理端 - 产品操作记录»»" - }, - "统一响应结果«List«管理端 - 费用推导预览»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/管理端 - 费用推导预览", - "originalRef": "管理端 - 费用推导预览" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«管理端 - 费用推导预览»»" - }, - "统一响应结果«Void»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«Void»" - }, - "统一响应结果«int»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "integer", - "format": "int32", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«int»" - }, - "统一响应结果«long»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "integer", - "format": "int64", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«long»" - }, - "统一响应结果«分页结果«管理端 - 产品列表项»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«管理端 - 产品列表项»", - "originalRef": "分页结果«管理端 - 产品列表项»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«分页结果«管理端 - 产品列表项»»" - }, - "统一响应结果«管理端 - 产品详情»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/管理端 - 产品详情", - "originalRef": "管理端 - 产品详情" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«管理端 - 产品详情»" - }, - "统一响应结果«管理端 - 报价结果»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/管理端 - 报价结果", - "originalRef": "管理端 - 报价结果" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«管理端 - 报价结果»" - }, - "行程天": { - "type": "object", - "properties": { - "breakfast": { - "type": "string", - "description": "早餐(HOTEL/CAMP/SPECIAL/SELF)" - }, - "coverImageUrl": { - "type": "string", - "description": "当日封面图" - }, - "customFields": { - "type": "object", - "description": "自定义概况" - }, - "dailyMileage": { - "type": "number", - "description": "当日里程(km)" - }, - "dayId": { - "type": "integer", - "format": "int64", - "description": "行程天ID(已有则传,新增不传)" - }, - "dayNumber": { - "type": "integer", - "format": "int32", - "description": "天序号" - }, - "dayTitle": { - "type": "string", - "description": "当日标题" - }, - "description": { - "type": "string", - "description": "行程描述" - }, - "diningRemark": { - "type": "string", - "description": "餐饮备注" - }, - "dinner": { - "type": "string", - "description": "晚餐" - }, - "hotels": { - "type": "array", - "description": "住宿列表", - "items": { - "$ref": "#/definitions/住宿项", - "originalRef": "住宿项" - } - }, - "lunch": { - "type": "string", - "description": "午餐" - }, - "mileageManualOverride": { - "type": "boolean", - "description": "里程是否手动覆盖" - }, - "nodes": { - "type": "array", - "description": "活动节点列表", - "items": { - "$ref": "#/definitions/活动节点", - "originalRef": "活动节点" - } - }, - "photoUrls": { - "type": "array", - "description": "照片集", - "items": { - "type": "string" - } - }, - "quoteText": { - "type": "string", - "description": "当日金句" - }, - "routePoints": { - "type": "array", - "description": "途经路线点列表", - "items": { - "$ref": "#/definitions/途经路线点", - "originalRef": "途经路线点" - } - } - }, - "title": "行程天" - }, - "规格项": { - "type": "object", - "required": [ - "tierName", - "tierSeq" - ], - "properties": { - "tierName": { - "type": "string", - "example": "舒适", - "description": "规格名称" - }, - "tierSeq": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "规格序号(1开始递增)" - } - }, - "title": "规格项" - }, - "费用项": { - "type": "object", - "properties": { - "description": { - "type": "string", - "description": "说明" - }, - "feeType": { - "type": "string", - "description": "费用类型" - }, - "id": { - "type": "integer", - "format": "int64", - "description": "费用项ID(已有则传)" - }, - "name": { - "type": "string", - "description": "名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序" - }, - "source": { - "type": "string", - "description": "来源(AUTO/MANUAL)" - }, - "unit": { - "type": "string", - "description": "单位(自定义费用)" - }, - "unitPrice": { - "type": "number", - "description": "单价(自定义费用)" - } - }, - "title": "费用项" - }, - "途经路线点": { - "type": "object", - "properties": { - "latitude": { - "type": "number", - "description": "纬度" - }, - "longitude": { - "type": "number", - "description": "经度" - }, - "name": { - "type": "string", - "description": "地点名称" - }, - "resourceId": { - "type": "integer", - "format": "int64", - "description": "资源ID(可空=自定义地点)" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序" - } - }, - "title": "途经路线点" - }, - "额外成本项": { - "type": "object", - "properties": { - "costItemId": { - "type": "integer", - "format": "int64", - "description": "费用项ID" - }, - "daily": { - "type": "boolean", - "description": "是否按天计费" - }, - "description": { - "type": "string", - "description": "说明" - }, - "id": { - "type": "integer", - "format": "int64", - "description": "费用项ID(已有则传,新增不传)" - }, - "name": { - "type": "string", - "description": "名称" - }, - "quantity": { - "type": "integer", - "format": "int32", - "description": "数量" - }, - "resourceId": { - "type": "integer", - "format": "int64", - "description": "资源ID" - }, - "resourceType": { - "type": "string", - "description": "资源类型" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序" - }, - "unitPrice": { - "type": "number", - "description": "单价" - } - }, - "title": "额外成本项" - }, - "分页结果«管理端 - 产品线详情/列表项»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/管理端 - 产品线详情/列表项", - "originalRef": "管理端 - 产品线详情/列表项" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«管理端 - 产品线详情/列表项»" - }, - "管理端 - 产品线下拉": { - "type": "object", - "properties": { - "lineId": { - "type": "integer", - "format": "int64", - "description": "产品线ID" - }, - "name": { - "type": "string", - "description": "产品线名称" - } - }, - "title": "管理端 - 产品线下拉" - }, - "管理端 - 产品线保存": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "coverImageUrl": { - "type": "string", - "description": "封面图" - }, - "description": { - "type": "string", - "description": "描述" - }, - "lineId": { - "type": "integer", - "format": "int64", - "description": "产品线ID(修改时传)" - }, - "name": { - "type": "string", - "description": "名称" - }, - "productType": { - "type": "string", - "description": "绑定产品类型" - }, - "seasons": { - "type": "array", - "description": "适用季节", - "items": { - "type": "string" - } - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序" - }, - "status": { - "type": "string", - "description": "状态(ACTIVE/INACTIVE)" - }, - "tags": { - "type": "array", - "description": "标签", - "items": { - "type": "string" - } - } - }, - "title": "管理端 - 产品线保存" - }, - "管理端 - 产品线详情/列表项": { - "type": "object", - "properties": { - "coverImageUrl": { - "type": "string", - "description": "封面图" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "integer", - "format": "int64", - "description": "创建人ID" - }, - "description": { - "type": "string", - "description": "描述" - }, - "lineId": { - "type": "integer", - "format": "int64", - "description": "产品线ID" - }, - "name": { - "type": "string", - "description": "产品线名称" - }, - "productCount": { - "type": "integer", - "format": "int64", - "example": 12, - "description": "产品数量" - }, - "productType": { - "type": "string", - "description": "绑定产品类型" - }, - "seasons": { - "type": "array", - "description": "适用季节", - "items": { - "type": "string" - } - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序" - }, - "status": { - "type": "string", - "description": "状态" - }, - "tags": { - "type": "array", - "description": "产品线标签", - "items": { - "type": "string" - } - } - }, - "title": "管理端 - 产品线详情/列表项" - }, - "统一响应结果«List«管理端 - 产品线下拉»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/管理端 - 产品线下拉", - "originalRef": "管理端 - 产品线下拉" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«管理端 - 产品线下拉»»" - }, - "统一响应结果«分页结果«管理端 - 产品线详情/列表项»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«管理端 - 产品线详情/列表项»", - "originalRef": "分页结果«管理端 - 产品线详情/列表项»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«分页结果«管理端 - 产品线详情/列表项»»" - }, - "统一响应结果«管理端 - 产品线详情/列表项»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/管理端 - 产品线详情/列表项", - "originalRef": "管理端 - 产品线详情/列表项" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«管理端 - 产品线详情/列表项»" - }, - "管理端 - 安全保障模板": { - "type": "object", - "properties": { - "items": { - "type": "string", - "description": "具体条目(JSON)" - }, - "name": { - "type": "string", - "description": "模板名称" - }, - "templateId": { - "type": "integer", - "format": "int64", - "description": "模板ID" - } - }, - "title": "管理端 - 安全保障模板" - }, - "管理端 - 温馨提示": { - "type": "object", - "properties": { - "tipsId": { - "type": "integer", - "format": "int64", - "description": "提示ID" - }, - "tipsName": { - "type": "string", - "description": "提示名称" - } - }, - "title": "管理端 - 温馨提示" - }, - "管理端 - 预订条款": { - "type": "object", - "properties": { - "termsId": { - "type": "integer", - "format": "int64", - "description": "条款ID" - }, - "termsName": { - "type": "string", - "description": "条款名称" - } - }, - "title": "管理端 - 预订条款" - }, - "统一响应结果«List«管理端 - 安全保障模板»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/管理端 - 安全保障模板", - "originalRef": "管理端 - 安全保障模板" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«管理端 - 安全保障模板»»" - }, - "统一响应结果«List«管理端 - 温馨提示»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/管理端 - 温馨提示", - "originalRef": "管理端 - 温馨提示" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«管理端 - 温馨提示»»" - }, - "统一响应结果«List«管理端 - 预订条款»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/管理端 - 预订条款", - "originalRef": "管理端 - 预订条款" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«管理端 - 预订条款»»" - }, - "C端人群优惠": { - "type": "object", - "properties": { - "childAccommodation": { - "type": "string", - "description": "儿童住宿" - }, - "childMeal": { - "type": "string", - "description": "儿童餐饮" - }, - "childTicket": { - "type": "string", - "description": "儿童门票" - }, - "elderTicket": { - "type": "string", - "description": "老人门票" - }, - "tips": { - "type": "string", - "description": "温馨提示" - } - }, - "title": "C端人群优惠" - }, - "C端活动节点": { - "type": "object", - "properties": { - "description": { - "type": "string", - "description": "描述" - }, - "durationMinutes": { - "type": "integer", - "format": "int32", - "description": "时长(分钟)" - }, - "nodeName": { - "type": "string", - "description": "节点名称" - }, - "nodeType": { - "type": "string", - "description": "节点类型" - }, - "startTime": { - "type": "string", - "description": "开始时间" - } - }, - "title": "C端活动节点" - }, - "C端行程天": { - "type": "object", - "properties": { - "breakfast": { - "type": "string", - "description": "早餐" - }, - "coverImageUrl": { - "type": "string", - "description": "封面图" - }, - "dayNumber": { - "type": "integer", - "format": "int32", - "description": "天序号" - }, - "dayTitle": { - "type": "string", - "description": "标题" - }, - "description": { - "type": "string", - "description": "描述" - }, - "dinner": { - "type": "string", - "description": "晚餐" - }, - "lunch": { - "type": "string", - "description": "午餐" - }, - "nodes": { - "type": "array", - "description": "节点列表", - "items": { - "$ref": "#/definitions/C端活动节点", - "originalRef": "C端活动节点" - } - } - }, - "title": "C端行程天" - }, - "C端费用说明": { - "type": "object", - "properties": { - "description": { - "type": "string", - "description": "说明" - }, - "name": { - "type": "string", - "description": "名称" - } - }, - "title": "C端费用说明" - }, - "Map«int,List«ProductDayHotelDO»»": { - "type": "object", - "title": "Map«int,List«ProductDayHotelDO»»", - "additionalProperties": { - "$ref": "#/definitions/List", - "originalRef": "List" - } - }, - "ProductDayHotelDO": { - "type": "object", - "properties": { - "createTime": { - "type": "string", - "format": "date-time" - }, - "createdBy": { - "type": "integer", - "format": "int64" - }, - "dayId": { - "type": "integer", - "format": "int64" - }, - "dayNumber": { - "type": "integer", - "format": "int32" - }, - "deletedAt": { - "type": "string", - "format": "date-time" - }, - "hotelId": { - "type": "integer", - "format": "int64" - }, - "hotelName": { - "type": "string" - }, - "id": { - "type": "integer", - "format": "int64" - }, - "isDefault": { - "type": "boolean" - }, - "productId": { - "type": "integer", - "format": "int64" - }, - "roomCount": { - "type": "integer", - "format": "int32" - }, - "roomTypeId": { - "type": "integer", - "format": "int64" - }, - "sortOrder": { - "type": "integer", - "format": "int32" - }, - "tierSeq": { - "type": "integer", - "format": "int32" - }, - "updateTime": { - "type": "string", - "format": "date-time" - }, - "updatedBy": { - "type": "integer", - "format": "int64" - } - }, - "title": "ProductDayHotelDO" - }, - "小程序端 - 产品详情": { - "type": "object", - "properties": { - "carouselImages": { - "type": "array", - "description": "轮播图", - "items": { - "type": "string" - } - }, - "coverImageUrl": { - "type": "string", - "description": "封面图" - }, - "crowdBenefit": { - "description": "人群优惠", - "$ref": "#/definitions/C端人群优惠", - "originalRef": "C端人群优惠" - }, - "excludedFees": { - "type": "array", - "description": "费用不含", - "items": { - "$ref": "#/definitions/C端费用说明", - "originalRef": "C端费用说明" - } - }, - "includedFees": { - "type": "array", - "description": "费用包含", - "items": { - "$ref": "#/definitions/C端费用说明", - "originalRef": "C端费用说明" - } - }, - "introduction": { - "type": "string", - "description": "产品简介" - }, - "itinerary": { - "type": "array", - "description": "行程天列表", - "items": { - "$ref": "#/definitions/C端行程天", - "originalRef": "C端行程天" - } - }, - "name": { - "type": "string", - "description": "产品名称" - }, - "productId": { - "type": "integer", - "format": "int64", - "description": "产品ID" - }, - "productType": { - "type": "string", - "description": "产品类型" - }, - "routeMapUrl": { - "type": "string", - "description": "路线图URL" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "tripDays": { - "type": "integer", - "format": "int32", - "description": "行程天数" - }, - "tripNights": { - "type": "integer", - "format": "int32", - "description": "行程晚数" - } - }, - "title": "小程序端 - 产品详情" - }, - "小程序端 - 价格日历": { - "type": "object", - "properties": { - "days": { - "type": "array", - "description": "日历列表", - "items": { - "$ref": "#/definitions/日历日期项", - "originalRef": "日历日期项" - } - } - }, - "title": "小程序端 - 价格日历" - }, - "日历日期项": { - "type": "object", - "properties": { - "adultPrice": { - "type": "number", - "description": "成人售价" - }, - "childPrice": { - "type": "number", - "description": "儿童售价" - }, - "date": { - "type": "string", - "description": "日期(yyyy-MM-dd)" - }, - "isSelectable": { - "type": "boolean", - "description": "是否可选(有库存且未过期)" - }, - "priceType": { - "type": "string", - "description": "价格类型" - }, - "remainStock": { - "type": "integer", - "format": "int32", - "description": "剩余库存(NULL=不限量)" - } - }, - "title": "日历日期项" - }, - "统一响应结果«List«小程序端 - 产品详情»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/小程序端 - 产品详情", - "originalRef": "小程序端 - 产品详情" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«小程序端 - 产品详情»»" - }, - "统一响应结果«Map«int,List«ProductDayHotelDO»»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "object", - "description": "响应数据", - "additionalProperties": { - "type": "array", - "items": { - "$ref": "#/definitions/ProductDayHotelDO", - "originalRef": "ProductDayHotelDO" - } - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«Map«int,List«ProductDayHotelDO»»»" - }, - "统一响应结果«小程序端 - 产品详情»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/小程序端 - 产品详情", - "originalRef": "小程序端 - 产品详情" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«小程序端 - 产品详情»" - }, - "统一响应结果«小程序端 - 价格日历»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/小程序端 - 价格日历", - "originalRef": "小程序端 - 价格日历" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«小程序端 - 价格日历»" - }, - "小程序端 - 产品列表项": { - "type": "object", - "properties": { - "coverImageUrl": { - "type": "string", - "description": "封面图URL" - }, - "lineName": { - "type": "string", - "description": "产品线名称(前端叫「主题名」)" - }, - "name": { - "type": "string", - "description": "产品名称" - }, - "paymentType": { - "type": "string", - "description": "支付方式(FULL=全款, DEPOSIT=订金)" - }, - "productId": { - "type": "integer", - "format": "int64", - "description": "产品ID" - }, - "productType": { - "type": "string", - "description": "产品类型(CORE/GROUP/CUSTOM)" - }, - "seasons": { - "type": "array", - "description": "产品季节(如[\"summer\",\"autumn\"])", - "items": { - "type": "string" - } - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序号" - }, - "startPrice": { - "type": "number", - "description": "起步价(¥X起,最低成人售价)" - }, - "startPriceLabel": { - "type": "string", - "description": "起步价展示文案(如\"¥3980起/人\")" - }, - "subtitle": { - "type": "string", - "description": "副标题(一句话卖点)" - }, - "tags": { - "type": "array", - "description": "产品标签(如[\"亲子\",\"研学\"])", - "items": { - "type": "string" - } - }, - "tierCount": { - "type": "integer", - "format": "int32", - "description": "规格数量(前端叫「规格数」,单一=1,多档=N)" - }, - "tripDays": { - "type": "integer", - "format": "int32", - "description": "行程天数" - }, - "tripNights": { - "type": "integer", - "format": "int32", - "description": "行程晚数" - } - }, - "title": "小程序端 - 产品列表项" - }, - "统一响应结果«List«小程序端 - 产品列表项»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/小程序端 - 产品列表项", - "originalRef": "小程序端 - 产品列表项" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«小程序端 - 产品列表项»»" - } - } -} \ No newline at end of file diff --git a/.swagger/hl-product-service.json b/.swagger/hl-product-service.json deleted file mode 100644 index 0983816..0000000 --- a/.swagger/hl-product-service.json +++ /dev/null @@ -1,15056 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "产品服务", - "version": "1.0.0" - }, - "basePath": "/", - "paths": { - "/admin/product/booking-terms": { - "post": { - "tags": [ - "预订条款管理" - ], - "summary": "创建预订条款", - "description": "创建后默认启用", - "operationId": "createUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "termsRequest", - "description": "termsRequest", - "required": true, - "schema": { - "$ref": "#/definitions/预订条款请求", - "originalRef": "预订条款请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«预订条款VO»", - "originalRef": "统一响应结果«预订条款VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«预订条款VO»", - "originalRef": "统一响应结果«预订条款VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/booking-terms/enabled": { - "get": { - "tags": [ - "预订条款管理" - ], - "summary": "启用的预订条款列表", - "description": "仅返回启用状态的条款,供产品设计时选择", - "operationId": "listEnabledUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«预订条款VO»»", - "originalRef": "统一响应结果«List«预订条款VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«预订条款VO»»", - "originalRef": "统一响应结果«List«预订条款VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/booking-terms/list": { - "get": { - "tags": [ - "预订条款管理" - ], - "summary": "预订条款列表", - "description": "返回所有预订条款(含禁用),按创建时间倒序", - "operationId": "listUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«预订条款VO»»", - "originalRef": "统一响应结果«List«预订条款VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«预订条款VO»»", - "originalRef": "统一响应结果«List«预订条款VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/booking-terms/{termsId}": { - "get": { - "tags": [ - "预订条款管理" - ], - "summary": "预订条款详情", - "operationId": "detailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "termsId", - "in": "path", - "description": "预订条款ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«预订条款VO»", - "originalRef": "统一响应结果«预订条款VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«预订条款VO»", - "originalRef": "统一响应结果«预订条款VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "预订条款管理" - ], - "summary": "修改预订条款", - "operationId": "updateUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "termsId", - "in": "path", - "description": "预订条款ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "termsRequest", - "description": "termsRequest", - "required": true, - "schema": { - "$ref": "#/definitions/预订条款请求", - "originalRef": "预订条款请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«预订条款VO»", - "originalRef": "统一响应结果«预订条款VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«预订条款VO»", - "originalRef": "统一响应结果«预订条款VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "预订条款管理" - ], - "summary": "删除预订条款", - "description": "软删除,已绑定的产品不受影响(产品详情会显示为空)", - "operationId": "deleteUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "termsId", - "in": "path", - "description": "预订条款ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/booking-terms/{termsId}/toggle": { - "put": { - "tags": [ - "预订条款管理" - ], - "summary": "启用/禁用预订条款", - "description": "禁用后不再出现在产品设计的可选列表中,已绑定的产品不受影响", - "operationId": "toggleUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "enabled", - "in": "query", - "description": "是否启用", - "required": false, - "type": "boolean", - "allowEmptyValue": false - }, - { - "name": "termsId", - "in": "path", - "description": "预订条款ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/dining/{id}": { - "put": { - "tags": [ - "行程管理" - ], - "summary": "更新餐饮推荐", - "description": "更新餐饮推荐的餐厅、用餐类型(早/午/晚)、描述等信息。", - "operationId": "updateDiningOptionUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "餐饮推荐ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "餐饮推荐请求", - "required": false, - "schema": { - "$ref": "#/definitions/用餐选项请求", - "originalRef": "用餐选项请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«用餐选项VO»", - "originalRef": "统一响应结果«用餐选项VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«用餐选项VO»", - "originalRef": "统一响应结果«用餐选项VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "行程管理" - ], - "summary": "删除餐饮推荐", - "description": "删除指定的餐饮推荐记录。", - "operationId": "deleteDiningOptionUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "餐饮推荐ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/district/search": { - "get": { - "tags": [ - "行政区划搜索" - ], - "summary": "搜索行政区划(城市/区县/镇)", - "description": "通过高德地图 API 搜索行政区划,用于产品的出发城市和目的地城市选择。\n输入关键词(如\"丽江\"、\"黑山头\"),返回匹配的城市/区县/镇列表,包含行政区划编码。\n\n**关联字典**:\n- cities(城市):搜索结果可用于产品行程中的城市预览\n- city(城市筛选):搜索结果可用于资源面板城市筛选", - "operationId": "searchUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keywords", - "in": "query", - "description": "搜索关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«行政区划搜索结果»»", - "originalRef": "统一响应结果«List«行政区划搜索结果»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«行政区划搜索结果»»", - "originalRef": "统一响应结果«List«行政区划搜索结果»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/folder": { - "post": { - "tags": [ - "产品文件夹管理" - ], - "summary": "创建文件夹", - "description": "创建产品文件夹,用于组织管理产品。支持多级目录结构。\n文件夹归属于创建人,普通管理员只能看到自己的文件夹。", - "operationId": "createFolderUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "创建文件夹请求", - "required": false, - "schema": { - "$ref": "#/definitions/创建文件夹请求", - "originalRef": "创建文件夹请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品文件夹VO»", - "originalRef": "统一响应结果«产品文件夹VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品文件夹VO»", - "originalRef": "统一响应结果«产品文件夹VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/folder/tree": { - "get": { - "tags": [ - "产品文件夹管理" - ], - "summary": "获取文件夹树", - "description": "获取当前用户可见的文件夹树形结构。\n普通管理员只能看到自己创建的文件夹,SUPER_ADMIN 可看到所有文件夹。\n返回结构为嵌套的树形列表,包含每个文件夹的子文件夹。", - "operationId": "getFolderTreeUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«产品文件夹VO»»", - "originalRef": "统一响应结果«List«产品文件夹VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«产品文件夹VO»»", - "originalRef": "统一响应结果«List«产品文件夹VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/folder/{folderId}": { - "put": { - "tags": [ - "产品文件夹管理" - ], - "summary": "更新文件夹", - "description": "更新文件夹名称等信息。\n**权限说明**:普通管理员只能更新自己创建的文件夹,SUPER_ADMIN 可更新任何文件夹。", - "operationId": "updateFolderUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "folderId", - "in": "path", - "description": "文件夹ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "更新文件夹请求", - "required": false, - "schema": { - "$ref": "#/definitions/更新文件夹请求", - "originalRef": "更新文件夹请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品文件夹VO»", - "originalRef": "统一响应结果«产品文件夹VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品文件夹VO»", - "originalRef": "统一响应结果«产品文件夹VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "产品文件夹管理" - ], - "summary": "删除文件夹", - "description": "删除文件夹。如果文件夹下有产品,产品会自动移到根目录(folderId 置空)。\n普通管理员只能删除自己的文件夹,SUPER_ADMIN 可删除任何文件夹。", - "operationId": "deleteFolderUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "folderId", - "in": "path", - "description": "文件夹ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/formula/group": { - "post": { - "tags": [ - "定价公式管理" - ], - "summary": "创建公式组", - "description": "创建一个新的定价公式组。创建后默认为未激活状态。\n\n公式组编码(groupCode)在同一产品类型下必须唯一。\n建议命名规范:{产品类型}_PRICING_V{版本号},如 CORE_PRICING_V2。\n\n**关联字典**:\n- product_type(产品类型,公式组所属类型):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品", - "operationId": "createGroupUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/公式组请求", - "originalRef": "公式组请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«公式组VO»", - "originalRef": "统一响应结果«公式组VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«公式组VO»", - "originalRef": "统一响应结果«公式组VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/formula/group/list": { - "get": { - "tags": [ - "定价公式管理" - ], - "summary": "公式组列表", - "description": "获取定价公式组列表,可按产品类型筛选。\n\n**公式引擎说明**:定价公式用于自动计算产品的成本价和售价。\n每种产品类型可以有多个公式组,但同一时间只能有一个激活的公式组。\n公式组包含多个步骤,按顺序执行,每步计算一个中间变量或最终结果。\n\n**关联字典**:\n- product_type(产品类型,筛选条件):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品", - "operationId": "listGroupsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productType", - "in": "query", - "description": "productType", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«公式组VO»»", - "originalRef": "统一响应结果«List«公式组VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«公式组VO»»", - "originalRef": "统一响应结果«List«公式组VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/formula/group/{groupId}": { - "get": { - "tags": [ - "定价公式管理" - ], - "summary": "公式组详情", - "description": "获取公式组完整信息。\n\n**关联字典**:\n- product_type(产品类型):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品", - "operationId": "getGroupUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "groupId", - "in": "path", - "description": "groupId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«公式组VO»", - "originalRef": "统一响应结果«公式组VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«公式组VO»", - "originalRef": "统一响应结果«公式组VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "定价公式管理" - ], - "summary": "更新公式组", - "description": "更新公式组信息。\n\n**关联字典**:\n- product_type(产品类型):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品", - "operationId": "updateGroupUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "groupId", - "in": "path", - "description": "groupId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/公式组请求", - "originalRef": "公式组请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«公式组VO»", - "originalRef": "统一响应结果«公式组VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«公式组VO»", - "originalRef": "统一响应结果«公式组VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "定价公式管理" - ], - "summary": "删除公式组", - "description": "删除公式组及其下所有步骤。\n**限制**:已激活的公式组不能删除,需先激活其他公式组。", - "operationId": "deleteGroupUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "groupId", - "in": "path", - "description": "groupId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/formula/group/{groupId}/activate": { - "put": { - "tags": [ - "定价公式管理" - ], - "summary": "激活公式组", - "description": "激活指定公式组,同时自动停用同产品类型下的其他公式组。\n\n同一产品类型下只能有一个激活的公式组,激活操作具有排他性。\n激活后,该产品类型的自动成本计算将使用此公式组。\n\n**关联字典**:\n- product_type(产品类型,同类型排他激活):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品", - "operationId": "activateGroupUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "groupId", - "in": "path", - "description": "groupId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/formula/group/{groupId}/steps": { - "get": { - "tags": [ - "定价公式管理" - ], - "summary": "公式步骤列表", - "description": "获取公式组下所有步骤,按执行顺序(executionOrder)升序排列。\n步骤按顺序依次执行,前一步的输出变量可作为后续步骤的输入。", - "operationId": "listStepsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "groupId", - "in": "path", - "description": "groupId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«公式步骤VO»»", - "originalRef": "统一响应结果«List«公式步骤VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«公式步骤VO»»", - "originalRef": "统一响应结果«List«公式步骤VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/formula/step": { - "post": { - "tags": [ - "定价公式管理" - ], - "summary": "创建公式步骤", - "description": "在公式组中创建一个计算步骤。\n\n**表达式语法**:使用 Aviator 表达式引擎,支持数学运算、条件判断、内置函数等。\n示例:`baseCost = adultCount * adultUnitCost + childCount * childUnitCost`\n\n**输入变量**:可引用公式变量表中定义的变量,或前置步骤的输出变量。\n**输出变量**:每个步骤必须指定一个输出变量名,供后续步骤引用。", - "operationId": "createStepUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/公式步骤请求", - "originalRef": "公式步骤请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«公式步骤VO»", - "originalRef": "统一响应结果«公式步骤VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«公式步骤VO»", - "originalRef": "统一响应结果«公式步骤VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/formula/step/{formulaId}": { - "get": { - "tags": [ - "定价公式管理" - ], - "summary": "公式步骤详情", - "description": "获取单个公式步骤的完整信息,包含表达式、输入/输出变量、执行顺序等。", - "operationId": "getStepUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "formulaId", - "in": "path", - "description": "formulaId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«公式步骤VO»", - "originalRef": "统一响应结果«公式步骤VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«公式步骤VO»", - "originalRef": "统一响应结果«公式步骤VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "定价公式管理" - ], - "summary": "更新公式步骤", - "description": "更新公式步骤的表达式、输入/输出变量等。\n每次更新会自动保存一个版本快照,可通过版本历史接口查看和回滚。", - "operationId": "updateStepUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "formulaId", - "in": "path", - "description": "formulaId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/公式步骤请求", - "originalRef": "公式步骤请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«公式步骤VO»", - "originalRef": "统一响应结果«公式步骤VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«公式步骤VO»", - "originalRef": "统一响应结果«公式步骤VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "定价公式管理" - ], - "summary": "删除公式步骤", - "description": "删除指定的公式步骤。删除后其他步骤的执行顺序不会自动调整。\n**注意**:如果后续步骤引用了被删步骤的输出变量,执行时会报错。", - "operationId": "deleteStepUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "formulaId", - "in": "path", - "description": "formulaId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/formula/step/{formulaId}/rollback/{versionNum}": { - "put": { - "tags": [ - "定价公式管理" - ], - "summary": "回滚公式步骤到指定版本", - "description": "将公式步骤回滚到历史版本。\n回滚操作会用历史版本的表达式、变量等覆盖当前内容,并创建一个新的版本记录。", - "operationId": "rollbackStepUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "formulaId", - "in": "path", - "description": "formulaId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "versionNum", - "in": "path", - "description": "versionNum", - "required": true, - "type": "integer", - "format": "int32" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«公式步骤VO»", - "originalRef": "统一响应结果«公式步骤VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«公式步骤VO»", - "originalRef": "统一响应结果«公式步骤VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/formula/step/{formulaId}/toggle": { - "put": { - "tags": [ - "定价公式管理" - ], - "summary": "启用/禁用公式步骤", - "description": "切换公式步骤的启用状态。\n禁用的步骤在公式执行时会被跳过,不影响其他步骤的执行。\n适用场景:临时跳过某个计算步骤进行调试或测试。", - "operationId": "toggleStepUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "formulaId", - "in": "path", - "description": "formulaId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/formula/step/{formulaId}/versions": { - "get": { - "tags": [ - "定价公式管理" - ], - "summary": "公式步骤版本历史", - "description": "获取公式步骤的所有历史版本列表,按版本号倒序。\n每次更新步骤表达式会自动创建新版本,方便追溯和回滚。", - "operationId": "listVersionsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "formulaId", - "in": "path", - "description": "formulaId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«公式版本历史VO»»", - "originalRef": "统一响应结果«List«公式版本历史VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«公式版本历史VO»»", - "originalRef": "统一响应结果«List«公式版本历史VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/formula/test": { - "post": { - "tags": [ - "定价公式管理" - ], - "summary": "测试公式执行", - "description": "使用自定义变量值测试公式组的执行结果,不影响任何业务数据。\n\n传入公式组ID和测试变量(变量名→值的映射),返回每个步骤的执行结果。\n适用于公式调试:验证表达式是否正确、计算结果是否符合预期。\n如果某步骤执行出错,会在结果中标明错误信息。", - "operationId": "testFormulasUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/公式测试请求", - "originalRef": "公式测试请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«公式测试结果VO»", - "originalRef": "统一响应结果«公式测试结果VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«公式测试结果VO»", - "originalRef": "统一响应结果«公式测试结果VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/formula/var": { - "post": { - "tags": [ - "定价公式管理" - ], - "summary": "创建公式变量", - "description": "创建公式变量定义。变量名(varName)全局唯一,建议使用驼峰命名。\n可指定适用的产品类型列表(productTypes),为空则适用于所有类型。\n\n**关联字典**:\n- product_type(产品类型,变量适用范围):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品", - "operationId": "createVarUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/公式变量请求", - "originalRef": "公式变量请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«公式变量VO»", - "originalRef": "统一响应结果«公式变量VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«公式变量VO»", - "originalRef": "统一响应结果«公式变量VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/formula/var/list": { - "get": { - "tags": [ - "定价公式管理" - ], - "summary": "公式变量列表", - "description": "获取公式变量列表,可按变量分类筛选。\n\n**变量分类**:\n- INPUT:输入变量,从业务数据获取(如成人人数、资源单价)\n- INTERMEDIATE:中间变量,由公式步骤计算得出\n- OUTPUT:输出变量,最终报价结果(如总成本、售价)", - "operationId": "listVarsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "category", - "in": "query", - "description": "category", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«公式变量VO»»", - "originalRef": "统一响应结果«List«公式变量VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«公式变量VO»»", - "originalRef": "统一响应结果«List«公式变量VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/formula/var/{varId}": { - "put": { - "tags": [ - "定价公式管理" - ], - "summary": "更新公式变量", - "description": "更新公式变量定义。\n\n**关联字典**:\n- product_type(产品类型,变量适用范围):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品", - "operationId": "updateVarUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/公式变量请求", - "originalRef": "公式变量请求" - } - }, - { - "name": "varId", - "in": "path", - "description": "varId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«公式变量VO»", - "originalRef": "统一响应结果«公式变量VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«公式变量VO»", - "originalRef": "统一响应结果«公式变量VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "定价公式管理" - ], - "summary": "删除公式变量", - "description": "删除公式变量定义。\n**注意**:如果有公式步骤引用了该变量,删除后步骤执行时会报错。建议先确认无引用再删除。", - "operationId": "deleteVarUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "varId", - "in": "path", - "description": "varId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/hotel/{id}": { - "put": { - "tags": [ - "行程管理" - ], - "summary": "更新每日住宿", - "description": "更新住宿记录的酒店、房型、数量等信息。", - "operationId": "updateHotelUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "住宿记录ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "每日住宿请求", - "required": false, - "schema": { - "$ref": "#/definitions/每日酒店配置请求", - "originalRef": "每日酒店配置请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«每日酒店VO»", - "originalRef": "统一响应结果«每日酒店VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«每日酒店VO»", - "originalRef": "统一响应结果«每日酒店VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "行程管理" - ], - "summary": "删除每日住宿", - "description": "删除指定住宿记录。删除后该天的住宿成本会从报价中移除。", - "operationId": "deleteHotelUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "住宿记录ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item": { - "post": { - "tags": [ - "产品管理" - ], - "summary": "创建产品(草稿)", - "description": "创建一个新产品,初始状态为 DRAFT(草稿)。\n\n**产品类型说明**:\n- CORE:核心产品,标准旅游产品,支持上架/下架审批流程\n- GROUP:小蒙马拼团,需配合团期批次管理,按人头计价\n- CUSTOM:定制产品,由定制师为客户量身定制,按单计价\n- ROUTE:线路产品,预设线路模板,按单计价\n\n**注意事项**:\n- 创建后需依次完善行程、定价、价格日历等信息\n- CUSTOM/ROUTE 产品的价格日历存储的是整单总价,不按人头乘算\n- GROUP 产品需额外创建团期批次才能报名\n\n**关联字典**:\n- product_type(产品类型):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品\n- product_category(产品分类):family=亲子游, honeymoon=蜜月游, photography=旅拍, experience=体验, driving=自驾", - "operationId": "createProductUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "创建产品请求", - "required": false, - "schema": { - "$ref": "#/definitions/创建产品请求", - "originalRef": "创建产品请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品详情VO»", - "originalRef": "统一响应结果«产品详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品详情VO»", - "originalRef": "统一响应结果«产品详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/list": { - "get": { - "tags": [ - "产品管理" - ], - "summary": "产品列表", - "description": "分页查询产品列表,支持多维度筛选和排序。\n\n**权限说明**:\n- 普通管理员只能看到自己创建的产品\n- SUPER_ADMIN 可看到所有产品\n\n**筛选条件**:关键词(名称/副标题模糊匹配)、产品类型、状态、文件夹、产品线、季节、行程天数。\n支持多状态筛选(statuses 字段,逗号分隔)。\n\n**关联字典**:\n- product_type(产品类型,筛选条件):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品\n- product_status(产品状态,筛选条件+返回字段):DRAFT=草稿, PENDING_REVIEW=待审核, REVIEWED=已审核, REJECTED=已驳回, PUBLISHED=已上架, UNPUBLISHED=已下架, COMPLETED=已完成, ORDERED=已下单", - "operationId": "listProductsUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "folderId", - "in": "query", - "description": "文件夹ID", - "required": false, - "type": "string", - "x-example": "1893012345678901234" - }, - { - "name": "keyword", - "in": "query", - "description": "搜索关键词", - "required": false, - "type": "string", - "x-example": "丽江" - }, - { - "name": "lineId", - "in": "query", - "description": "产品线ID", - "required": false, - "type": "string", - "x-example": "1893012345678901234" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 20 - }, - { - "name": "productType", - "in": "query", - "description": "产品类型:CORE=核心产品 ROUTE=线路产品 CUSTOM=定制产品 GROUP=小蒙马拼团", - "required": false, - "type": "string", - "x-example": "CORE" - }, - { - "name": "season", - "in": "query", - "description": "季节筛选", - "required": false, - "type": "string", - "x-example": "spring" - }, - { - "name": "sortBy", - "in": "query", - "description": "排序字段:name/tripDays/createTime/updateTime", - "required": false, - "type": "string", - "x-example": "createTime" - }, - { - "name": "sortDir", - "in": "query", - "description": "排序方向:asc/desc", - "required": false, - "type": "string", - "x-example": "desc" - }, - { - "name": "status", - "in": "query", - "description": "产品状态:DRAFT/PENDING_REVIEW/REVIEWED/REJECTED/PUBLISHED/UNPUBLISHED/COMPLETED", - "required": false, - "type": "string", - "x-example": "PUBLISHED" - }, - { - "name": "statuses", - "in": "query", - "description": "多状态筛选(逗号分隔)", - "required": false, - "type": "string", - "x-example": "PUBLISHED,COMPLETED" - }, - { - "name": "tripDays", - "in": "query", - "description": "行程天数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 5 - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«产品列表VO»»", - "originalRef": "统一响应结果«分页结果«产品列表VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«产品列表VO»»", - "originalRef": "统一响应结果«分页结果«产品列表VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/save": { - "post": { - "tags": [ - "产品管理" - ], - "summary": "保存产品(统一创建/更新)", - "description": "统一的产品保存接口,根据是否传入 productId 自动判断创建或更新:\n\n- **不传 productId**:创建新产品(草稿),此时 productType 必填\n- **传入 productId**:更新已有产品,仅修改传入的字段\n\n**包含字段**:产品基本信息(名称/副标题/行程天数/出发城市等)、标签列表(tags)、季节列表(seasons)、轮播图/视频、展示开关、政策文本、定制师信息等全部产品属性。\n\n**权限说明**:\n- 创建:任何管理员可创建\n- 更新:普通管理员只能编辑自己创建的产品,SUPER_ADMIN 可编辑所有产品\n\n**关联字典**:\n- product_type(产品类型,创建时必填):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品\n- product_status(产品状态,返回字段):DRAFT=草稿, PENDING_REVIEW=待审核, REVIEWED=已审核, REJECTED=已驳回, PUBLISHED=已上架, UNPUBLISHED=已下架, COMPLETED=已完成, ORDERED=已下单\n- product_category(产品分类):family=亲子游, honeymoon=蜜月游, photography=旅拍, experience=体验, driving=自驾", - "operationId": "saveProductUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "保存产品请求", - "required": false, - "schema": { - "$ref": "#/definitions/保存产品请求(创建或更新)", - "originalRef": "保存产品请求(创建或更新)" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品详情VO»", - "originalRef": "统一响应结果«产品详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品详情VO»", - "originalRef": "统一响应结果«产品详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}": { - "get": { - "tags": [ - "产品管理" - ], - "summary": "获取产品详情", - "description": "获取产品完整信息,包括基本信息、行程天列表、定价配置、费用项等。\n返回数据包含关联的行程节点资源详情,适用于产品编辑页面。\n不过滤产品状态,所有状态的产品都可查看。\n\n**关联字典**:\n- product_type(产品类型):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品\n- product_status(产品状态):DRAFT=草稿, PENDING_REVIEW=待审核, REVIEWED=已审核, REJECTED=已驳回, PUBLISHED=已上架, UNPUBLISHED=已下架, COMPLETED=已完成, ORDERED=已下单\n- product_category(产品分类):family=亲子游, honeymoon=蜜月游, photography=旅拍, experience=体验, driving=自驾", - "operationId": "getProductUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品详情VO»", - "originalRef": "统一响应结果«产品详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品详情VO»", - "originalRef": "统一响应结果«产品详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "产品管理" - ], - "summary": "更新产品", - "description": "更新产品基本信息,仅传入需要修改的字段,未传字段不会被覆盖。\n\n**权限说明**:\n- 普通管理员只能编辑自己创建的产品\n- SUPER_ADMIN 可编辑所有产品\n\n**注意**:行程、定价、价格日历等通过各自独立的接口管理,不在此接口中处理。\n\n**关联字典**:\n- product_type(产品类型):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品\n- product_category(产品分类):family=亲子游, honeymoon=蜜月游, photography=旅拍, experience=体验, driving=自驾", - "operationId": "updateProductUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "更新产品请求", - "required": false, - "schema": { - "$ref": "#/definitions/更新产品请求", - "originalRef": "更新产品请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品详情VO»", - "originalRef": "统一响应结果«产品详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品详情VO»", - "originalRef": "统一响应结果«产品详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "产品管理" - ], - "summary": "删除产品", - "description": "软删除产品(设置 deleted_at 字段)。\n\n**权限说明**:普通管理员只能删除自己创建的产品,SUPER_ADMIN 可删除所有产品。\n**限制**:已上架(PUBLISHED)的产品不能直接删除,需先下架。", - "operationId": "deleteProductUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/batch": { - "post": { - "tags": [ - "拼团批次管理" - ], - "summary": "创建主批次", - "description": "为 GROUP(小蒙马拼团)产品创建一个团期主批次。\n\n**仅适用于 GROUP 产品类型**。\n每个批次有独立的出发日期、报名截止日期、人数上限。\n创建后状态为 PENDING(待开放),需手动开启报名。\n\n**批次状态流转**:PENDING → ENROLLING(报名中)→ CONFIRMED(已成团)→ CLOSED(已关闭)\n任意报名状态均可被解散(DISBANDED)。\n\n**关联字典**:\n- product_type(产品类型,仅限GROUP):GROUP=小蒙马拼团\n- batch_status(批次状态):PENDING=待开放, ENROLLING=报名中, CONFIRMED=已成团, FULL=已满员, CLOSED=已关闭, DISBANDED=已解散, IN_PROGRESS=进行中, FINISHED=已结束", - "operationId": "createBatchUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "productId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/创建拼团批次请求", - "originalRef": "创建拼团批次请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«团批次VO»", - "originalRef": "统一响应结果«团批次VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«团批次VO»", - "originalRef": "统一响应结果«团批次VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/batch/list": { - "get": { - "tags": [ - "拼团批次管理" - ], - "summary": "批次列表(树形)", - "description": "获取产品所有批次,以树形结构返回(主批次包含子批次列表)。\n按出发日期升序排列,包含每个批次的报名人数和剩余名额。\n\n**关联字典**:\n- batch_status(批次状态,返回字段):PENDING=待开放, ENROLLING=报名中, CONFIRMED=已成团, FULL=已满员, CLOSED=已关闭, DISBANDED=已解散, IN_PROGRESS=进行中, FINISHED=已结束", - "operationId": "listBatchesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "productId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«团批次VO»»", - "originalRef": "统一响应结果«List«团批次VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«团批次VO»»", - "originalRef": "统一响应结果«List«团批次VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/batch/{batchId}": { - "get": { - "tags": [ - "拼团批次管理" - ], - "summary": "批次详情", - "description": "获取单个批次的完整信息,包括批次基本信息、服务人员配置、套餐组合等。\n\n**关联字典**:\n- batch_status(批次状态):PENDING=待开放, ENROLLING=报名中, CONFIRMED=已成团, FULL=已满员, CLOSED=已关闭, DISBANDED=已解散, IN_PROGRESS=进行中, FINISHED=已结束\n- staff_type(人员类型,服务人员配置):GUIDE=领队, DRIVER=司机, PHOTOGRAPHER=摄影师, ASSISTANT=助理, OTHER=其他", - "operationId": "getBatchDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "batchId", - "in": "path", - "description": "batchId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "productId", - "in": "path", - "description": "productId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«团批次详情VO»", - "originalRef": "统一响应结果«团批次详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«团批次详情VO»", - "originalRef": "统一响应结果«团批次详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "拼团批次管理" - ], - "summary": "更新批次", - "description": "更新批次基本信息。仅传入需要修改的字段。\n已有报名人员的批次修改人数上限时,不能低于已报名人数。", - "operationId": "updateBatchUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "batchId", - "in": "path", - "description": "batchId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "productId", - "in": "path", - "description": "productId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/更新拼团批次请求", - "originalRef": "更新拼团批次请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«团批次VO»", - "originalRef": "统一响应结果«团批次VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«团批次VO»", - "originalRef": "统一响应结果«团批次VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "拼团批次管理" - ], - "summary": "删除批次", - "description": "删除批次(软删除)。\n**限制**:已有报名人员的批次不能直接删除,需先解散批次。", - "operationId": "deleteBatchUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "batchId", - "in": "path", - "description": "batchId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "productId", - "in": "path", - "description": "productId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/batch/{batchId}/close": { - "put": { - "tags": [ - "拼团批次管理" - ], - "summary": "关闭报名(ENROLLING/CONFIRMED->CLOSED)", - "description": "关闭批次报名,不再接受新的报名。\n已报名的订单不受影响,仅阻止新增报名。\n适用于报名截止日期到达或手动提前关闭的场景。", - "operationId": "closeEnrollmentUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "batchId", - "in": "path", - "description": "batchId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "productId", - "in": "path", - "description": "productId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/batch/{batchId}/disband": { - "post": { - "tags": [ - "拼团批次管理" - ], - "summary": "解散批次", - "description": "解散批次并处理已报名的订单。\n\n**重要**:解散操作会触发以下流程:\n1. 批次状态变更为 DISBANDED\n2. 通过 MQ 消息通知订单服务,自动取消该批次下的所有未完成订单\n3. 已支付订单会触发退款流程\n\n必须填写解散原因(如:报名人数不足、行程调整等)。", - "operationId": "disbandBatchUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "batchId", - "in": "path", - "description": "batchId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "productId", - "in": "path", - "description": "productId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/解散批次请求", - "originalRef": "解散批次请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/batch/{batchId}/open": { - "put": { - "tags": [ - "拼团批次管理" - ], - "summary": "开启报名(PENDING->ENROLLING)", - "description": "将批次从 PENDING 状态变更为 ENROLLING(报名中)。\n开启后用户可在小程序端看到该团期并报名。\n前提条件:产品必须已上架(PUBLISHED)。", - "operationId": "openEnrollmentUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "batchId", - "in": "path", - "description": "batchId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "productId", - "in": "path", - "description": "productId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/batch/{batchId}/staff": { - "get": { - "tags": [ - "拼团批次管理" - ], - "summary": "服务人员列表", - "description": "**关联字典**:\n- staff_type(人员类型):GUIDE=领队, DRIVER=司机, PHOTOGRAPHER=摄影师, ASSISTANT=助理, OTHER=其他", - "operationId": "listStaffUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "batchId", - "in": "path", - "description": "batchId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "productId", - "in": "path", - "description": "productId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«团批次服务人员VO»»", - "originalRef": "统一响应结果«List«团批次服务人员VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«团批次服务人员VO»»", - "originalRef": "统一响应结果«List«团批次服务人员VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "拼团批次管理" - ], - "summary": "保存服务人员(全量替换)", - "description": "保存批次的服务人员配置,采用全量替换模式(先删后增)。\n\n每次提交完整的人员列表,替换掉该批次原有的所有人员配置。\n人员来源于资源服务的人员库,通过 staffId 关联。\n**角色类型**:LEADER(领队)/PHOTOGRAPHER(摄影师)/DRIVER(司机)/OTHER(其他)\n\n**关联字典**:\n- staff_type(人员类型):GUIDE=领队, DRIVER=司机, PHOTOGRAPHER=摄影师, ASSISTANT=助理, OTHER=其他", - "operationId": "saveStaffUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "batchId", - "in": "path", - "description": "batchId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "productId", - "in": "path", - "description": "productId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "requests", - "description": "requests", - "required": true, - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/批次服务人员分配请求", - "originalRef": "批次服务人员分配请求" - } - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«团批次服务人员VO»»", - "originalRef": "统一响应结果«List«团批次服务人员VO»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«团批次服务人员VO»»", - "originalRef": "统一响应结果«List«团批次服务人员VO»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/batch/{batchId}/staff/copy-from/{sourceId}": { - "post": { - "tags": [ - "拼团批次管理" - ], - "summary": "从其他批次复制服务人员", - "description": "将源批次的服务人员配置复制到当前批次(全量替换当前批次已有人员)。\n适用场景:多个团期使用相同的服务人员班底。", - "operationId": "copyStaffUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "batchId", - "in": "path", - "description": "batchId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "productId", - "in": "path", - "description": "productId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "sourceId", - "in": "path", - "description": "sourceId", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«团批次服务人员VO»»", - "originalRef": "统一响应结果«List«团批次服务人员VO»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«团批次服务人员VO»»", - "originalRef": "统一响应结果«List«团批次服务人员VO»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/batch/{batchId}/sub-batch": { - "post": { - "tags": [ - "拼团批次管理" - ], - "summary": "创建子批次(溢出)", - "description": "当主批次人数满员时,创建子批次接收溢出报名。\n\n子批次共享主批次的出发日期和行程,但有独立的人数上限和报名人数。\n适用场景:某团期特别火爆,需要扩容但希望分开管理。\n子批次在列表中显示为主批次的子级节点。", - "operationId": "createSubBatchUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "batchId", - "in": "path", - "description": "batchId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "name": "productId", - "in": "path", - "description": "productId", - "required": true, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "$ref": "#/definitions/创建拼团批次请求", - "originalRef": "创建拼团批次请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«团批次VO»", - "originalRef": "统一响应结果«团批次VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«团批次VO»", - "originalRef": "统一响应结果«团批次VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/copy": { - "post": { - "tags": [ - "产品管理" - ], - "summary": "复制产品", - "description": "深度复制产品,包括行程天、行程节点、定价配置、住宿、餐饮、物资、人员配置等所有关联数据。\n\n复制后的产品状态为 DRAFT,名称自动添加\"(副本)\"后缀。\n适用场景:基于已有产品快速创建新产品。\n\n**关联字典**:\n- product_type(产品类型,返回字段):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品\n- product_status(产品状态,复制后固定为 DRAFT)", - "operationId": "copyProductUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品详情VO»", - "originalRef": "统一响应结果«产品详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品详情VO»", - "originalRef": "统一响应结果«产品详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/cost-item": { - "post": { - "tags": [ - "定价与费用管理" - ], - "summary": "添加费用项", - "description": "添加产品的费用包含/不包含说明项。\n\n用于在产品详情页展示\"费用包含\"和\"费用不包含\"信息。\n仅用于前端展示,不参与报价计算。", - "operationId": "addCostItemUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "费用项请求", - "required": false, - "schema": { - "$ref": "#/definitions/成本项请求", - "originalRef": "成本项请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品成本项VO»", - "originalRef": "统一响应结果«产品成本项VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品成本项VO»", - "originalRef": "统一响应结果«产品成本项VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/cost-item/{itemId}": { - "put": { - "tags": [ - "定价与费用管理" - ], - "summary": "更新费用项", - "description": "更新费用包含/不包含说明项的内容。仅用于前端展示,不参与报价计算。", - "operationId": "updateCostItemUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "itemId", - "in": "path", - "description": "费用项ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "费用项请求", - "required": false, - "schema": { - "$ref": "#/definitions/成本项请求", - "originalRef": "成本项请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品成本项VO»", - "originalRef": "统一响应结果«产品成本项VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品成本项VO»", - "originalRef": "统一响应结果«产品成本项VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "定价与费用管理" - ], - "summary": "删除费用项", - "description": "删除费用包含/不包含说明项。", - "operationId": "deleteCostItemUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "itemId", - "in": "path", - "description": "费用项ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/cost-items": { - "get": { - "tags": [ - "定价与费用管理" - ], - "summary": "获取费用项列表", - "description": "获取产品的所有费用包含/不包含说明项列表。", - "operationId": "listCostItemsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«产品成本项VO»»", - "originalRef": "统一响应结果«List«产品成本项VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«产品成本项VO»»", - "originalRef": "统一响应结果«List«产品成本项VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/custom-fee": { - "post": { - "tags": [ - "定价与费用管理" - ], - "summary": "添加自定义费用", - "description": "添加产品级别的自定义费用项,直接设置金额,参与成本自动计算。\n\n与额外成本关联不同,自定义费用不关联资源服务的费用项,而是直接指定费用名称和金额。\n适用于临时性或一次性的费用。", - "operationId": "addCustomFeeUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "自定义费用请求", - "required": false, - "schema": { - "$ref": "#/definitions/自定义费用项请求", - "originalRef": "自定义费用项请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品自定义费用项VO»", - "originalRef": "统一响应结果«产品自定义费用项VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品自定义费用项VO»", - "originalRef": "统一响应结果«产品自定义费用项VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/custom-fee/{feeId}": { - "put": { - "tags": [ - "定价与费用管理" - ], - "summary": "更新自定义费用", - "description": "更新自定义费用项的名称、金额等信息。修改后会影响成本自动计算结果。", - "operationId": "updateCustomFeeUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "feeId", - "in": "path", - "description": "自定义费用ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "自定义费用请求", - "required": false, - "schema": { - "$ref": "#/definitions/自定义费用项请求", - "originalRef": "自定义费用项请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品自定义费用项VO»", - "originalRef": "统一响应结果«产品自定义费用项VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品自定义费用项VO»", - "originalRef": "统一响应结果«产品自定义费用项VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "定价与费用管理" - ], - "summary": "删除自定义费用", - "description": "删除自定义费用项。删除后该费用不再计入成本自动计算。", - "operationId": "deleteCustomFeeUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "feeId", - "in": "path", - "description": "自定义费用ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/custom-fees": { - "get": { - "tags": [ - "定价与费用管理" - ], - "summary": "获取自定义费用列表", - "description": "获取产品的所有自定义费用项列表。", - "operationId": "listCustomFeesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«产品自定义费用项VO»»", - "originalRef": "统一响应结果«List«产品自定义费用项VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«产品自定义费用项VO»»", - "originalRef": "统一响应结果«List«产品自定义费用项VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/day/{dayNumber}": { - "put": { - "tags": [ - "行程管理" - ], - "summary": "更新行程天", - "description": "更新指定天的行程信息,如当天主题、概述等。\n行程天在创建产品时根据 tripDays 自动生成,不支持单独增删,只能更新。\ndayNumber 从 1 开始,对应第几天的行程。", - "operationId": "updateDayUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "dayNumber", - "in": "path", - "description": "天数编号", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "行程天请求", - "required": false, - "schema": { - "$ref": "#/definitions/行程天请求", - "originalRef": "行程天请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«行程天VO»", - "originalRef": "统一响应结果«行程天VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«行程天VO»", - "originalRef": "统一响应结果«行程天VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/day/{dayNumber}/dining": { - "get": { - "tags": [ - "行程管理" - ], - "summary": "获取某天的餐厅推荐列表", - "description": "获取指定天的所有餐饮推荐,包含餐厅名称、用餐类型、描述等信息。", - "operationId": "listDiningUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "dayNumber", - "in": "path", - "description": "天数编号", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«用餐选项VO»»", - "originalRef": "统一响应结果«List«用餐选项VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«用餐选项VO»»", - "originalRef": "统一响应结果«List«用餐选项VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "行程管理" - ], - "summary": "添加每日餐厅推荐", - "description": "为指定天添加餐饮推荐,关联资源服务中的餐厅。\n用于展示当天的用餐安排,可按早/午/晚分类。", - "operationId": "addDiningOptionUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "dayNumber", - "in": "path", - "description": "天数编号", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "餐饮推荐请求", - "required": false, - "schema": { - "$ref": "#/definitions/用餐选项请求", - "originalRef": "用餐选项请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«用餐选项VO»", - "originalRef": "统一响应结果«用餐选项VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«用餐选项VO»", - "originalRef": "统一响应结果«用餐选项VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/day/{dayNumber}/hotel": { - "post": { - "tags": [ - "行程管理" - ], - "summary": "添加每日住宿", - "description": "为指定天添加住宿安排,关联资源服务中的酒店和房型。\n每天可以有多个住宿选项(如不同档次),参与成本自动计算。\n住宿费用会体现在价格日历的成本计算中。", - "operationId": "addHotelUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "dayNumber", - "in": "path", - "description": "天数编号", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "每日住宿请求", - "required": false, - "schema": { - "$ref": "#/definitions/每日酒店配置请求", - "originalRef": "每日酒店配置请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«每日酒店VO»", - "originalRef": "统一响应结果«每日酒店VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«每日酒店VO»", - "originalRef": "统一响应结果«每日酒店VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/day/{dayNumber}/hotels": { - "get": { - "tags": [ - "行程管理" - ], - "summary": "获取某天的住宿列表", - "description": "获取指定天的所有住宿安排,包含酒店名称、房型、数量等信息。", - "operationId": "listHotelsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "dayNumber", - "in": "path", - "description": "天数编号", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«每日酒店VO»»", - "originalRef": "统一响应结果«List«每日酒店VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«每日酒店VO»»", - "originalRef": "统一响应结果«List«每日酒店VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/day/{dayNumber}/node": { - "post": { - "tags": [ - "行程管理" - ], - "summary": "添加行程节点", - "description": "在指定天添加一个行程节点。节点是行程的最小单元,可关联资源服务中的景区、酒店、活动等。\n\n**节点类型**:TRANSPORT(交通)/SCENIC(景区)/RESTAURANT(餐厅)/ACTIVITY(活动)/PHOTOGRAPHY(摄影)/HOTEL(酒店)/FREE(自由活动)/CUSTOM(自定义)/SERVICE(服务)/NOTE(备注)\n\n**CUSTOM 定制产品特有**:可通过 familyIds 指定节点所属的家庭分组,实现按家庭分配行程。\n新建节点自动追加到当天最后位置,可通过排序接口调整顺序。\n\n**关联字典**:\n- city(城市,资源面板筛选用):用于在添加节点时按城市筛选可选资源", - "operationId": "createNodeUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "dayNumber", - "in": "path", - "description": "天数编号", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "创建节点请求", - "required": false, - "schema": { - "$ref": "#/definitions/创建行程节点请求", - "originalRef": "创建行程节点请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«行程节点VO»", - "originalRef": "统一响应结果«行程节点VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«行程节点VO»", - "originalRef": "统一响应结果«行程节点VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/day/{dayNumber}/nodes": { - "get": { - "tags": [ - "行程管理" - ], - "summary": "获取某天的节点列表", - "description": "获取指定天的所有行程节点,按排序顺序返回。\n每个节点包含类型、名称、时间、关联资源信息、图片等完整数据。\n\n**关联字典**:\n- city(城市):资源面板城市筛选\n- cities(城市ID映射):城市名称预览", - "operationId": "listNodesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "dayNumber", - "in": "path", - "description": "天数编号", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«行程节点VO»»", - "originalRef": "统一响应结果«List«行程节点VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«行程节点VO»»", - "originalRef": "统一响应结果«List«行程节点VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/day/{dayNumber}/nodes/sort": { - "put": { - "tags": [ - "行程管理" - ], - "summary": "行程节点拖拽排序", - "description": "重新排列指定天的所有行程节点顺序。前端拖拽排序后,将新的节点ID顺序全量提交。\nnodeIds 列表中的顺序即为新的排序顺序(从上到下)。", - "operationId": "sortNodesUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "dayNumber", - "in": "path", - "description": "天数编号", - "required": false, - "type": "integer", - "format": "int32" - }, - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "节点排序请求", - "required": false, - "schema": { - "$ref": "#/definitions/节点排序请求", - "originalRef": "节点排序请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/days": { - "get": { - "tags": [ - "行程管理" - ], - "summary": "获取行程天列表", - "description": "获取产品所有行程天的信息,按 dayNumber 升序排列。\n每一天包含当天主题、概述等信息,不包含节点详情(节点通过单独接口获取)。", - "operationId": "listDaysUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«行程天VO»»", - "originalRef": "统一响应结果«List«行程天VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«行程天VO»»", - "originalRef": "统一响应结果«List«行程天VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/extra-cost": { - "post": { - "tags": [ - "定价与费用管理" - ], - "summary": "添加额外成本关联", - "description": "关联资源服务中的费用项(cost_item)到产品,参与成本自动计算。\n\n额外成本是指不包含在行程节点中、但需要计入总成本的费用。\n例如:导游服务费、保险费、通讯费等固定运营开支。", - "operationId": "addExtraCostUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "额外成本请求", - "required": false, - "schema": { - "$ref": "#/definitions/额外成本请求", - "originalRef": "额外成本请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品额外成本VO»", - "originalRef": "统一响应结果«产品额外成本VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品额外成本VO»", - "originalRef": "统一响应结果«产品额外成本VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/extra-cost/{ecId}": { - "put": { - "tags": [ - "定价与费用管理" - ], - "summary": "更新额外成本关联", - "description": "更新额外成本关联的费用项、数量等信息。修改后会影响成本自动计算结果。", - "operationId": "updateExtraCostUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "ecId", - "in": "path", - "description": "额外成本ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "额外成本请求", - "required": false, - "schema": { - "$ref": "#/definitions/额外成本请求", - "originalRef": "额外成本请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品额外成本VO»", - "originalRef": "统一响应结果«产品额外成本VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品额外成本VO»", - "originalRef": "统一响应结果«产品额外成本VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "定价与费用管理" - ], - "summary": "删除额外成本关联", - "description": "删除额外成本关联记录。删除后该费用项不再计入成本自动计算。", - "operationId": "removeExtraCostUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "ecId", - "in": "path", - "description": "额外成本ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/extra-costs": { - "get": { - "tags": [ - "定价与费用管理" - ], - "summary": "获取额外成本关联列表", - "description": "获取产品关联的所有额外成本项列表,包含费用项名称、金额等信息。", - "operationId": "listExtraCostsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«产品额外成本VO»»", - "originalRef": "统一响应结果«List«产品额外成本VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«产品额外成本VO»»", - "originalRef": "统一响应结果«List«产品额外成本VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/families": { - "get": { - "tags": [ - "家庭分组管理" - ], - "summary": "获取家庭分组列表", - "description": "获取产品的家庭分组列表,按排序序号升序。\n\n**仅适用于 CUSTOM(定制)产品**。\n家庭分组用于将定制产品的行程按家庭单位分配,每个家庭可以有不同的人数和行程安排。\n行程节点通过 familyIds 字段关联到具体的家庭分组。", - "operationId": "listFamiliesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«家庭分组VO»»", - "originalRef": "统一响应结果«List«家庭分组VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«家庭分组VO»»", - "originalRef": "统一响应结果«List«家庭分组VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/family": { - "post": { - "tags": [ - "家庭分组管理" - ], - "summary": "添加家庭分组", - "description": "为 CUSTOM 定制产品添加一个家庭分组,指定家庭名称和各类型人数。\n添加后可在行程节点中关联此家庭,实现按家庭分配行程。", - "operationId": "addFamilyUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "家庭分组请求", - "required": false, - "schema": { - "$ref": "#/definitions/家庭分组保存请求", - "originalRef": "家庭分组保存请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«家庭分组VO»", - "originalRef": "统一响应结果«家庭分组VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«家庭分组VO»", - "originalRef": "统一响应结果«家庭分组VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/family/{familyId}": { - "put": { - "tags": [ - "家庭分组管理" - ], - "summary": "更新家庭分组", - "description": "更新家庭分组的名称、各类型人数等信息。\n**仅适用于 CUSTOM(定制)产品**。", - "operationId": "updateFamilyUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "familyId", - "in": "path", - "description": "家庭ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "家庭分组请求", - "required": false, - "schema": { - "$ref": "#/definitions/家庭分组保存请求", - "originalRef": "家庭分组保存请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«家庭分组VO»", - "originalRef": "统一响应结果«家庭分组VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«家庭分组VO»", - "originalRef": "统一响应结果«家庭分组VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "家庭分组管理" - ], - "summary": "删除家庭分组", - "description": "删除家庭分组。如果有行程节点通过 familyIds 关联了该分组,需要手动移除关联。\n**仅适用于 CUSTOM(定制)产品**。", - "operationId": "deleteFamilyUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "familyId", - "in": "path", - "description": "家庭ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/generate-route-map": { - "post": { - "tags": [ - "产品管理" - ], - "summary": "手动生成路径图", - "description": "根据产品行程节点的经纬度信息,调用地图API生成行程路径图。\n\n通常在行程编辑完成后手动触发,生成结果为 OSS 图片 URL。\n如果行程节点没有经纬度信息,则无法生成路径图。", - "operationId": "generateRouteMapUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«string»", - "originalRef": "统一响应结果«string»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«string»", - "originalRef": "统一响应结果«string»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/group-quote": { - "get": { - "tags": [ - "报价计算" - ], - "summary": "GROUP产品报价(按套餐组合)", - "description": "为 GROUP(小蒙马拼团)产品按团期批次计算报价。\n\n**算价逻辑**:\n- 单房差 = 酒店总成本 ÷ 每房成人数(团期配置)\n- 成人价 = 单房差 + 人均成本 + 利润\n- 儿童价 = 人均成本 + 利润(不含酒店)\n- 空床补差 = (房间数×每房成人数 - 成人数) × 单房差\n- 总售价 = 成人价×成人数 + 儿童价×儿童数 + 空床补差\n\n**关联字典**:\n- product_type(产品类型,仅限GROUP):GROUP=小蒙马拼团", - "operationId": "calculateGroupQuoteUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "adultCount", - "in": "query", - "description": "成人人数", - "required": false, - "type": "integer", - "default": 2, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "batchId", - "in": "query", - "description": "团期ID", - "required": false, - "type": "integer", - "format": "int64", - "allowEmptyValue": false - }, - { - "name": "childCount", - "in": "query", - "description": "儿童人数", - "required": false, - "type": "integer", - "default": 0, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "roomCount", - "in": "query", - "description": "房间数", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«GROUP产品报价结果»", - "originalRef": "统一响应结果«GROUP产品报价结果»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«GROUP产品报价结果»", - "originalRef": "统一响应结果«GROUP产品报价结果»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/move": { - "put": { - "tags": [ - "产品管理" - ], - "summary": "移动产品到文件夹", - "description": "将产品移动到指定文件夹,或移出文件夹(folderId 传空字符串或 null)。\n文件夹用于组织管理产品,不影响产品的业务逻辑。", - "operationId": "moveProductUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "移动产品请求", - "required": false, - "schema": { - "$ref": "#/definitions/产品移动请求", - "originalRef": "产品移动请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/price-calendar": { - "get": { - "tags": [ - "定价与费用管理" - ], - "summary": "获取月度价格日历", - "description": "获取指定月份的价格日历数据列表。\n\n每条数据包含:日期、成人售价/成本价、儿童售价/成本价、库存、状态(OPEN/CLOSED)等。\n**CORE/GROUP 产品**:价格为单人价格,按人头 × 价格计算总价。\n**CUSTOM/ROUTE 产品**:价格为整单总价,不乘以人头数。", - "operationId": "getMonthCalendarUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "month", - "in": "query", - "description": "月份", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "year", - "in": "query", - "description": "年份", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«产品价格日历VO»»", - "originalRef": "统一响应结果«List«产品价格日历VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«产品价格日历VO»»", - "originalRef": "统一响应结果«List«产品价格日历VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "定价与费用管理" - ], - "summary": "设置单日价格", - "description": "设置或更新指定日期的价格和库存。如果该日期已有记录则更新,否则新建。\n\n可设置成人售价/成本价、儿童售价/成本价、库存数量、状态(OPEN/CLOSED)。\n状态为 CLOSED 的日期不会出现在小程序端的可选日期中。", - "operationId": "setDayPriceUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "价格日历请求", - "required": false, - "schema": { - "$ref": "#/definitions/价格日历请求", - "originalRef": "价格日历请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品价格日历VO»", - "originalRef": "统一响应结果«产品价格日历VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品价格日历VO»", - "originalRef": "统一响应结果«产品价格日历VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/price-calendar/auto-calc": { - "post": { - "tags": [ - "定价与费用管理" - ], - "summary": "自动计算成本并同步到价格日历", - "description": "根据出发日期和人数,自动计算成本并将结果写入价格日历。\n\n与测算预览不同,此接口会实际更新价格日历数据。\n计算逻辑:查询各资源的价格日历 → 汇总成本 → 应用公式和利润规则 → 写入结果。\n\n**关联字典**:\n- vehicle_type(车型):车辆费用成本计算", - "operationId": "autoCalcCostUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "报价请求", - "required": false, - "schema": { - "$ref": "#/definitions/报价请求", - "originalRef": "报价请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«报价结果VO»", - "originalRef": "统一响应结果«报价结果VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«报价结果VO»", - "originalRef": "统一响应结果«报价结果VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/price-calendar/batch": { - "post": { - "tags": [ - "定价与费用管理" - ], - "summary": "批量设置价格", - "description": "批量设置日期范围内的价格和库存,支持按星期筛选。\n\n指定 startDate 和 endDate 日期范围,可选 selectedWeekdays 过滤星期几。\n示例:设置5月1日-5月31日的工作日(周一到周五=[1,2,3,4,5])价格。\nselectedWeekdays 为空时,范围内所有日期都会被设置。", - "operationId": "batchSetPricesUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "批量价格请求", - "required": false, - "schema": { - "$ref": "#/definitions/批量设置价格日历请求", - "originalRef": "批量设置价格日历请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«产品价格日历VO»»", - "originalRef": "统一响应结果«List«产品价格日历VO»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«产品价格日历VO»»", - "originalRef": "统一响应结果«List«产品价格日历VO»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/price-calendar/calc-preview": { - "post": { - "tags": [ - "定价与费用管理" - ], - "summary": "测算预览(不写入数据库)", - "description": "根据行程中的资源价格日历,自动计算指定日期的成本价和售价,仅预览不保存。\n\n用于在设置价格日历前预览自动计算的结果。\n计算逻辑:汇总当天所有行程节点关联资源的价格 → 应用公式引擎 → 加上利润。\nGROUP 产品需要传 adultCount 参数(影响均摊计算)。\n\n**关联字典**:\n- vehicle_type(车型):车辆费用成本测算", - "operationId": "calcPreviewUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "测算预览请求", - "required": false, - "schema": { - "$ref": "#/definitions/成本预览请求", - "originalRef": "成本预览请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«成本预览VO»", - "originalRef": "统一响应结果«成本预览VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«成本预览VO»", - "originalRef": "统一响应结果«成本预览VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/price-calendar/recalculate": { - "post": { - "tags": [ - "定价与费用管理" - ], - "summary": "重新测算所有自动测算日期的价格", - "description": "重新计算价格日历中所有 costAutoCalc=true 的日期的成本价和售价。\n\n适用场景:资源价格调整后,批量刷新所有自动计算的价格日历。\n返回更新的日期数量和详情。手动设置的价格(costAutoCalc=false)不受影响。", - "operationId": "recalculateUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,object»»", - "originalRef": "统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/pricing": { - "get": { - "tags": [ - "定价与费用管理" - ], - "summary": "获取定价规则", - "description": "获取产品的定价配置,包括定价模式、利润设置、儿童/婴儿价格、支付方式等。\n如果产品尚未设置定价规则,返回 null。\n\n**关联字典**:\n- vehicle_type(车型):费用配置中车辆相关成本显示", - "operationId": "getPricingUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品定价配置VO»", - "originalRef": "统一响应结果«产品定价配置VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品定价配置VO»", - "originalRef": "统一响应结果«产品定价配置VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "定价与费用管理" - ], - "summary": "保存定价规则", - "description": "保存或更新产品的定价配置(一个产品仅一条定价记录,重复调用为覆盖更新)。\n\n**定价模式**:\n- AUTO:自动计算,通过公式引擎根据行程资源价格自动测算成本和售价\n- MANUAL:手动定价,直接在价格日历中手动设置每日价格\n- CUSTOM:定制定价,设置整单总价(customTotalPrice),不按人头\n\n**利润模式**(AUTO 模式下生效):\n- FIXED:固定金额加价,售价 = 成本 + profitAmount\n- PERCENT:百分比加价,售价 = 成本 × (1 + markupPercent/100)\n\n**支付方式**:FULL=全款支付,DEPOSIT=定金+尾款(需设置 depositRatio 或 depositAmount)\n\n**关联字典**:\n- vehicle_type(车型):费用配置中车辆相关成本计算", - "operationId": "savePricingUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "定价规则请求", - "required": false, - "schema": { - "$ref": "#/definitions/定价配置请求", - "originalRef": "定价配置请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品定价配置VO»", - "originalRef": "统一响应结果«产品定价配置VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品定价配置VO»", - "originalRef": "统一响应结果«产品定价配置VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/quote": { - "post": { - "tags": [ - "报价计算" - ], - "summary": "计算报价", - "description": "根据出发日期和人数组合,计算产品的完整报价。\n\n**计算流程**:\n1. 从价格日历获取指定日期的单价\n2. 按人数类型分别计算:成人 × 成人价、儿童 × 儿童价\n3. 小童按儿童价 × 折扣比例(childDiscountPercent)计算\n4. 婴儿使用固定价格(babyPrice)\n5. 儿童加床(childNeedBed=true)额外加收 childWithBed 费用\n\n**CUSTOM/ROUTE 产品**:价格日历存的是整单总价,不按人头乘算。\n**GROUP 产品**:建议使用 group-quote 接口,支持套餐组合报价。\n\n**关联字典**:\n- product_type(产品类型,影响计算逻辑):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品", - "operationId": "calculateQuoteUsingPOST_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "报价请求", - "required": false, - "schema": { - "$ref": "#/definitions/报价请求", - "originalRef": "报价请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«报价结果VO»", - "originalRef": "统一响应结果«报价结果VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«报价结果VO»", - "originalRef": "统一响应结果«报价结果VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/share-link": { - "post": { - "tags": [ - "产品管理" - ], - "summary": "生成定制产品分享链接", - "description": "为 CUSTOM(定制)产品生成小程序分享链接,用于定制师发送给客户查看方案。\n\n**限制**:仅 CUSTOM 类型且状态为 COMPLETED 的产品可生成。\n**权限**:普通管理员只能为自己创建的产品生成链接,SUPER_ADMIN 不受限制。", - "operationId": "generateShareLinkUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分享链接响应»", - "originalRef": "统一响应结果«分享链接响应»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分享链接响应»", - "originalRef": "统一响应结果«分享链接响应»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/staff-config": { - "post": { - "tags": [ - "行程管理" - ], - "summary": "添加人员配置", - "description": "为产品添加服务人员配置(如领队、摄影师、司机等),关联资源服务中的人员。\n人员配置是产品级别的模板,GROUP 产品的实际人员在团期批次中单独分配。\n人员费用参与成本自动计算。\n\n**关联字典**:\n- staff_type(人员类型):GUIDE=领队, DRIVER=司机, PHOTOGRAPHER=摄影师, ASSISTANT=助理, OTHER=其他", - "operationId": "addStaffConfigUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "人员配置请求", - "required": false, - "schema": { - "$ref": "#/definitions/人员配置请求", - "originalRef": "人员配置请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品人员配置VO»", - "originalRef": "统一响应结果«产品人员配置VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品人员配置VO»", - "originalRef": "统一响应结果«产品人员配置VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/staff-configs": { - "get": { - "tags": [ - "行程管理" - ], - "summary": "获取产品人员配置列表", - "description": "**关联字典**:\n- staff_type(人员类型):GUIDE=领队, DRIVER=司机, PHOTOGRAPHER=摄影师, ASSISTANT=助理, OTHER=其他", - "operationId": "listStaffConfigsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«产品人员配置VO»»", - "originalRef": "统一响应结果«List«产品人员配置VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«产品人员配置VO»»", - "originalRef": "统一响应结果«List«产品人员配置VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/status": { - "put": { - "tags": [ - "产品管理" - ], - "summary": "产品状态变更(上架/下架/完成)", - "description": "根据产品类型,状态流转规则不同:\n\n**核心产品(CORE) / 小蒙马(GROUP)**:支持上架/下架,需企微审批\n- DRAFT → PENDING_REVIEW → REVIEWED → PUBLISHED(上架)\n- PUBLISHED → UNPUBLISHED(下架)\n- UNPUBLISHED → PUBLISHED(重新上架)\n- REJECTED → DRAFT(驳回后重新编辑)\n\n**定制产品(CUSTOM)**:仅支持完成,无上架/下架概念\n- DRAFT → COMPLETED(定制师完成设计)\n- COMPLETED → ORDERED(客户下单,系统自动变更)\n- ORDERED → COMPLETED(订单取消/退款后回退)\n\n**关联字典**:\n- product_type(产品类型,影响状态流转规则):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品\n- product_status(产品状态,请求+返回字段):DRAFT=草稿, PENDING_REVIEW=待审核, REVIEWED=已审核, REJECTED=已驳回, PUBLISHED=已上架, UNPUBLISHED=已下架, COMPLETED=已完成, ORDERED=已下单", - "operationId": "changeStatusUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "状态变更请求", - "required": false, - "schema": { - "$ref": "#/definitions/产品状态变更请求", - "originalRef": "产品状态变更请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/item/{productId}/supplies": { - "get": { - "tags": [ - "行程管理" - ], - "summary": "获取产品物资列表", - "description": "获取产品关联的所有物资配品,包含物资名称、数量、单价等信息。", - "operationId": "listSuppliesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«产品物资VO»»", - "originalRef": "统一响应结果«List«产品物资VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«产品物资VO»»", - "originalRef": "统一响应结果«List«产品物资VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "行程管理" - ], - "summary": "添加物资配品", - "description": "为产品添加物资配品(如帐篷、睡袋、登山杖等),关联资源服务中的物资。\n物资配品是产品级别的,不区分具体哪一天,参与成本计算。", - "operationId": "addSuppliesUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "物资配品请求", - "required": false, - "schema": { - "$ref": "#/definitions/物资配置请求", - "originalRef": "物资配置请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品物资VO»", - "originalRef": "统一响应结果«产品物资VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品物资VO»", - "originalRef": "统一响应结果«产品物资VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/line": { - "post": { - "tags": [ - "产品线管理" - ], - "summary": "创建产品线", - "description": "创建产品线,用于对产品进行业务分类(如:亲子游、蜜月游、探险游等)。\n产品线在小程序端可作为筛选条件,帮助用户快速找到感兴趣的产品类别。", - "operationId": "createLineUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "创建产品线请求", - "required": false, - "schema": { - "$ref": "#/definitions/创建产品线请求", - "originalRef": "创建产品线请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品线VO»", - "originalRef": "统一响应结果«产品线VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品线VO»", - "originalRef": "统一响应结果«产品线VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/line/active": { - "get": { - "tags": [ - "产品线管理" - ], - "summary": "所有启用的产品线", - "description": "获取所有启用状态的产品线,不分页。\n适用于产品编辑时的产品线下拉选择,以及小程序端的筛选项。", - "operationId": "listAllActiveUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«产品线VO»»", - "originalRef": "统一响应结果«List«产品线VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«产品线VO»»", - "originalRef": "统一响应结果«List«产品线VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/line/list": { - "get": { - "tags": [ - "产品线管理" - ], - "summary": "产品线列表(分页)", - "description": "分页查询产品线列表,支持按名称关键词筛选。", - "operationId": "listLinesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "搜索关键词", - "required": false, - "type": "string", - "x-example": "丽江" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 20 - }, - { - "name": "status", - "in": "query", - "description": "产品线状态:ACTIVE=启用 INACTIVE=停用", - "required": false, - "type": "string", - "x-example": "ACTIVE" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«产品线VO»»", - "originalRef": "统一响应结果«分页结果«产品线VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«产品线VO»»", - "originalRef": "统一响应结果«分页结果«产品线VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/line/{lineId}": { - "get": { - "tags": [ - "产品线管理" - ], - "summary": "产品线详情", - "description": "获取指定产品线的完整信息。", - "operationId": "getLineUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "lineId", - "in": "path", - "description": "产品线ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品线VO»", - "originalRef": "统一响应结果«产品线VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品线VO»", - "originalRef": "统一响应结果«产品线VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "产品线管理" - ], - "summary": "更新产品线", - "description": "更新产品线名称、描述、状态等信息。", - "operationId": "updateLineUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "lineId", - "in": "path", - "description": "产品线ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "更新产品线请求", - "required": false, - "schema": { - "$ref": "#/definitions/更新产品线请求", - "originalRef": "更新产品线请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品线VO»", - "originalRef": "统一响应结果«产品线VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品线VO»", - "originalRef": "统一响应结果«产品线VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "产品线管理" - ], - "summary": "删除产品线", - "description": "删除产品线(软删除)。已关联产品的产品线仍可删除,但关联产品的产品线字段不会被清空。", - "operationId": "deleteLineUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "lineId", - "in": "path", - "description": "产品线ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/node/{nodeId}": { - "put": { - "tags": [ - "行程管理" - ], - "summary": "更新行程节点", - "description": "更新行程节点信息,仅传入需要修改的字段。\n可修改节点名称、时间、关联资源、图片、描述等。\n\n**关联字典**:\n- city(城市):资源面板城市筛选\n- cities(城市ID映射):城市名称预览", - "operationId": "updateNodeUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "nodeId", - "in": "path", - "description": "行程节点ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "更新节点请求", - "required": false, - "schema": { - "$ref": "#/definitions/更新行程节点请求", - "originalRef": "更新行程节点请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«行程节点VO»", - "originalRef": "统一响应结果«行程节点VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«行程节点VO»", - "originalRef": "统一响应结果«行程节点VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "行程管理" - ], - "summary": "删除行程节点", - "description": "删除指定行程节点,同天其他节点的排序自动调整。", - "operationId": "deleteNodeUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "nodeId", - "in": "path", - "description": "行程节点ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/node/{nodeId}/copy": { - "post": { - "tags": [ - "行程管理" - ], - "summary": "复制行程节点", - "description": "复制指定节点到同一天的末尾位置,包括节点的所有属性(名称、资源关联、图片等)。\n适用场景:同一天有相似的行程安排时快速复制。", - "operationId": "copyNodeUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "nodeId", - "in": "path", - "description": "行程节点ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«行程节点VO»", - "originalRef": "统一响应结果«行程节点VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«行程节点VO»", - "originalRef": "统一响应结果«行程节点VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/node/{nodeId}/move": { - "put": { - "tags": [ - "行程管理" - ], - "summary": "移动行程节点到其他天", - "description": "将节点从当前天移动到目标天的末尾位置。\n移动后原天和目标天的节点排序自动调整。", - "operationId": "moveNodeUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "nodeId", - "in": "path", - "description": "行程节点ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "节点移动请求", - "required": false, - "schema": { - "$ref": "#/definitions/节点移动请求", - "originalRef": "节点移动请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«行程节点VO»", - "originalRef": "统一响应结果«行程节点VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«行程节点VO»", - "originalRef": "统一响应结果«行程节点VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/staff-config/{id}": { - "put": { - "tags": [ - "行程管理" - ], - "summary": "更新人员配置", - "description": "**关联字典**:\n- staff_type(人员类型):GUIDE=领队, DRIVER=司机, PHOTOGRAPHER=摄影师, ASSISTANT=助理, OTHER=其他", - "operationId": "updateStaffConfigUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "人员配置ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "人员配置请求", - "required": false, - "schema": { - "$ref": "#/definitions/人员配置请求", - "originalRef": "人员配置请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品人员配置VO»", - "originalRef": "统一响应结果«产品人员配置VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品人员配置VO»", - "originalRef": "统一响应结果«产品人员配置VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "行程管理" - ], - "summary": "删除人员配置", - "description": "删除指定的人员配置记录。删除后该人员费用不再计入成本。\n\n**关联字典**:\n- staff_type(人员类型):GUIDE=领队, DRIVER=司机, PHOTOGRAPHER=摄影师, ASSISTANT=助理, OTHER=其他", - "operationId": "deleteStaffConfigUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "人员配置ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/supplies/{id}": { - "put": { - "tags": [ - "行程管理" - ], - "summary": "更新物资配品", - "description": "更新物资配品的关联物资、数量等信息。修改后会影响成本自动计算结果。", - "operationId": "updateSuppliesUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "物资配品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "物资配品请求", - "required": false, - "schema": { - "$ref": "#/definitions/物资配置请求", - "originalRef": "物资配置请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品物资VO»", - "originalRef": "统一响应结果«产品物资VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品物资VO»", - "originalRef": "统一响应结果«产品物资VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "行程管理" - ], - "summary": "删除物资配品", - "description": "删除指定的物资配品记录。删除后该物资费用不再计入成本。", - "operationId": "deleteSuppliesUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "物资配品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/warm-tips": { - "post": { - "tags": [ - "温馨提示管理" - ], - "summary": "创建温馨提示", - "description": "创建后默认启用", - "operationId": "createUsingPOST_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "tipsRequest", - "description": "tipsRequest", - "required": true, - "schema": { - "$ref": "#/definitions/温馨提示请求", - "originalRef": "温馨提示请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«温馨提示VO»", - "originalRef": "统一响应结果«温馨提示VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«温馨提示VO»", - "originalRef": "统一响应结果«温馨提示VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/warm-tips/enabled": { - "get": { - "tags": [ - "温馨提示管理" - ], - "summary": "启用的温馨提示列表", - "description": "仅返回启用状态的提示,供产品设计时选择", - "operationId": "listEnabledUsingGET_1", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«温馨提示VO»»", - "originalRef": "统一响应结果«List«温馨提示VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«温馨提示VO»»", - "originalRef": "统一响应结果«List«温馨提示VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/warm-tips/list": { - "get": { - "tags": [ - "温馨提示管理" - ], - "summary": "温馨提示列表", - "description": "返回所有温馨提示(含禁用),按创建时间倒序", - "operationId": "listUsingGET_1", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«温馨提示VO»»", - "originalRef": "统一响应结果«List«温馨提示VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«温馨提示VO»»", - "originalRef": "统一响应结果«List«温馨提示VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/warm-tips/{tipsId}": { - "get": { - "tags": [ - "温馨提示管理" - ], - "summary": "温馨提示详情", - "operationId": "detailUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "tipsId", - "in": "path", - "description": "温馨提示ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«温馨提示VO»", - "originalRef": "统一响应结果«温馨提示VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«温馨提示VO»", - "originalRef": "统一响应结果«温馨提示VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "温馨提示管理" - ], - "summary": "修改温馨提示", - "operationId": "updateUsingPUT_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "tipsId", - "in": "path", - "description": "温馨提示ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "tipsRequest", - "description": "tipsRequest", - "required": true, - "schema": { - "$ref": "#/definitions/温馨提示请求", - "originalRef": "温馨提示请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«温馨提示VO»", - "originalRef": "统一响应结果«温馨提示VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«温馨提示VO»", - "originalRef": "统一响应结果«温馨提示VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "温馨提示管理" - ], - "summary": "删除温馨提示", - "description": "软删除,已绑定的产品不受影响(产品详情会显示为空)", - "operationId": "deleteUsingDELETE_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "tipsId", - "in": "path", - "description": "温馨提示ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/product/warm-tips/{tipsId}/toggle": { - "put": { - "tags": [ - "温馨提示管理" - ], - "summary": "启用/禁用温馨提示", - "description": "禁用后不再出现在产品设计的可选列表中,已绑定的产品不受影响", - "operationId": "toggleUsingPUT_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "enabled", - "in": "query", - "description": "是否启用", - "required": false, - "type": "boolean", - "allowEmptyValue": false - }, - { - "name": "tipsId", - "in": "path", - "description": "温馨提示ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/product/list": { - "get": { - "tags": [ - "小程序-产品" - ], - "summary": "产品列表(C端)", - "description": "小程序端产品列表接口,仅返回已上架(PUBLISHED)的产品。\n\n支持按产品类型、季节、行程天数、目的地、产品线、支付模式、定制师等筛选。\n默认按 sortOrder 排序,也可按价格或行程天数排序。\n\n**关联字典**:\n- product_type(产品类型,筛选条件):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品", - "operationId": "listProductsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "designerId", - "in": "query", - "description": "定制师ID(创建者ID)筛选", - "required": false, - "type": "integer", - "format": "int64", - "x-example": 1893012345678901234 - }, - { - "name": "destination", - "in": "query", - "description": "目的地筛选", - "required": false, - "type": "string", - "x-example": "丽江" - }, - { - "name": "keyword", - "in": "query", - "description": "搜索关键词(产品名称)", - "required": false, - "type": "string", - "x-example": "丽江" - }, - { - "name": "lineId", - "in": "query", - "description": "产品线ID筛选", - "required": false, - "type": "string", - "x-example": "1893012345678901234" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 10 - }, - { - "name": "paymentMode", - "in": "query", - "description": "支付模式筛选:FULL=全款 DEPOSIT=定金+尾款 null=全部", - "required": false, - "type": "string", - "x-example": "DEPOSIT" - }, - { - "name": "productType", - "in": "query", - "description": "产品类型:CORE=核心产品 ROUTE=线路产品 CUSTOM=定制产品 GROUP=小蒙马拼团", - "required": false, - "type": "string", - "x-example": "CORE" - }, - { - "name": "season", - "in": "query", - "description": "季节筛选", - "required": false, - "type": "string", - "x-example": "spring" - }, - { - "name": "sortBy", - "in": "query", - "description": "排序字段:price/tripDays/default(默认按sortOrder)", - "required": false, - "type": "string", - "x-example": "price" - }, - { - "name": "sortDir", - "in": "query", - "description": "排序方向:asc/desc", - "required": false, - "type": "string", - "x-example": "asc" - }, - { - "name": "tripDays", - "in": "query", - "description": "行程天数筛选", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 5 - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«C端产品列表VO»»", - "originalRef": "统一响应结果«分页结果«C端产品列表VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«C端产品列表VO»»", - "originalRef": "统一响应结果«分页结果«C端产品列表VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/product/{productId}": { - "get": { - "tags": [ - "小程序-产品" - ], - "summary": "产品详情(C端)", - "description": "小程序端产品详情接口,仅返回已上架(PUBLISHED)的产品。\n包含完整的行程信息、定价配置、费用说明、创作者寄语等。\n未上架的产品会返回 404 错误。\n\n**关联字典**:\n- product_type(产品类型):CORE=核心产品, GROUP=小蒙马拼团, CUSTOM=定制产品, ROUTE=线路产品\n- product_category(产品分类):family=亲子游, honeymoon=蜜月游, photography=旅拍, experience=体验, driving=自驾", - "operationId": "getProductUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品详情VO»", - "originalRef": "统一响应结果«产品详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«产品详情VO»", - "originalRef": "统一响应结果«产品详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/mp/product/{productId}/quote": { - "post": { - "tags": [ - "小程序-产品" - ], - "summary": "报价计算(C端)", - "description": "小程序端报价计算接口,根据用户选择的日期和人数计算总价。\n内部会校验产品是否存在且已上架。\n详细计算逻辑参见管理后台的报价计算接口说明。", - "operationId": "calculateQuoteUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "productId", - "in": "path", - "description": "产品ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "报价请求", - "required": false, - "schema": { - "$ref": "#/definitions/报价请求", - "originalRef": "报价请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«报价结果VO»", - "originalRef": "统一响应结果«报价结果VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«报价结果VO»", - "originalRef": "统一响应结果«报价结果VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - } - }, - "definitions": { - "C端产品列表VO": { - "type": "object", - "properties": { - "coverImageUrl": { - "type": "string", - "description": "封面图URL" - }, - "creatorAvatarUrl": { - "type": "string", - "description": "定制师头像URL" - }, - "departureCity": { - "type": "string", - "description": "出发城市" - }, - "destinationCity": { - "type": "string", - "description": "目的地城市" - }, - "lineName": { - "type": "string", - "description": "产品线名称" - }, - "name": { - "type": "string", - "description": "产品名称" - }, - "paymentMode": { - "type": "string", - "description": "支付模式:FULL=全款 DEPOSIT=定金+尾款" - }, - "productId": { - "type": "string", - "description": "产品ID" - }, - "productType": { - "type": "string", - "description": "产品类型:CORE=核心产品 ROUTE=线路产品 CUSTOM=定制产品 GROUP=小蒙马拼团" - }, - "routeMapUrl": { - "type": "string", - "description": "路径图URL" - }, - "seasonLabels": { - "type": "array", - "description": "适用季节列表(中文)", - "items": { - "type": "string" - } - }, - "seasons": { - "type": "array", - "description": "适用季节列表(编码)", - "items": { - "type": "string" - } - }, - "startPrice": { - "type": "number", - "description": "起步价(来自定价配置)" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "tags": { - "type": "array", - "description": "产品标签列表", - "items": { - "type": "string" - } - }, - "tripDays": { - "type": "integer", - "format": "int32", - "description": "行程天数" - }, - "tripNights": { - "type": "integer", - "format": "int32", - "description": "行程晚数" - } - }, - "title": "C端产品列表VO" - }, - "GROUP产品报价结果": { - "type": "object", - "properties": { - "adultCostPrice": { - "type": "number", - "description": "成人成本价(单房差+每人费用)" - }, - "adultCount": { - "type": "integer", - "format": "int32", - "description": "成人数" - }, - "adultSellPrice": { - "type": "number", - "description": "成人售价" - }, - "adultsPerRoom": { - "type": "integer", - "format": "int32", - "description": "每间房入住成人数" - }, - "childCostPrice": { - "type": "number", - "description": "儿童成本价(每人费用,不含酒店)" - }, - "childCount": { - "type": "integer", - "format": "int32", - "description": "儿童数" - }, - "childSellPrice": { - "type": "number", - "description": "儿童售价" - }, - "code": { - "type": "integer", - "format": "int32", - "description": "返回码: 0=成功, 1=非GROUP产品, 2=错误" - }, - "dayCosts": { - "type": "array", - "description": "每日成本明细", - "items": { - "$ref": "#/definitions/每日成本明细", - "originalRef": "每日成本明细" - } - }, - "emptyBedSupplement": { - "type": "number", - "description": "空床补差 = (房间数×每房成人数 - 成人数) × 单房差" - }, - "extraCostItems": { - "type": "array", - "description": "额外成本明细列表", - "items": { - "$ref": "#/definitions/额外成本明细项", - "originalRef": "额外成本明细项" - } - }, - "extraCostPerPerson": { - "type": "number", - "description": "额外成本(人均)" - }, - "extraCostTotal": { - "type": "number", - "description": "额外成本总额(团队)" - }, - "hotelCostTotal": { - "type": "number", - "description": "酒店总成本" - }, - "message": { - "type": "string", - "description": "错误信息(code!=0时)" - }, - "perPersonCost": { - "type": "number", - "description": "每人成本(不含酒店)" - }, - "profitMode": { - "type": "string", - "description": "利润模式" - }, - "roomCount": { - "type": "integer", - "format": "int32", - "description": "选择的房间数" - }, - "singleRoomSupplement": { - "type": "number", - "description": "单房差 = 成人售价 - 儿童售价" - }, - "totalSellPrice": { - "type": "number", - "description": "总售价 = 成人价×成人数 + 儿童价×儿童数 + 空床补差" - }, - "warnings": { - "type": "array", - "description": "警告信息", - "items": { - "type": "string" - } - } - }, - "title": "GROUP产品报价结果" - }, - "产品人员配置VO": { - "type": "object", - "properties": { - "familyIds": { - "type": "array", - "description": "所属家庭ID列表(定制产品按家庭分配)", - "items": { - "type": "string" - } - }, - "id": { - "type": "string", - "description": "记录ID" - }, - "quantity": { - "type": "integer", - "format": "int32", - "description": "数量" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "staffType": { - "type": "string", - "description": "人员类型:GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER" - }, - "staffTypeName": { - "type": "string", - "description": "人员类型名称" - } - }, - "title": "产品人员配置VO" - }, - "产品价格日历VO": { - "type": "object", - "properties": { - "adultCostPrice": { - "type": "number", - "description": "成人成本价" - }, - "adultProfit": { - "type": "number", - "description": "成人利润" - }, - "adultSellPrice": { - "type": "number", - "description": "成人售价" - }, - "childCostPrice": { - "type": "number", - "description": "儿童成本价" - }, - "childProfit": { - "type": "number", - "description": "儿童利润" - }, - "childSellPrice": { - "type": "number", - "description": "儿童售价" - }, - "costAutoCalc": { - "type": "boolean", - "description": "是否自动计算成本" - }, - "date": { - "type": "string", - "format": "date", - "description": "日期" - }, - "id": { - "type": "string", - "description": "价格日历ID" - }, - "profitRate": { - "type": "number", - "description": "利润率(百分比)" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "sold": { - "type": "integer", - "format": "int32", - "description": "已售数量" - }, - "status": { - "type": "string", - "description": "状态:OPEN=开放 CLOSED=关闭" - }, - "stock": { - "type": "integer", - "format": "int32", - "description": "库存数量" - } - }, - "title": "产品价格日历VO" - }, - "产品列表VO": { - "type": "object", - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "description": "成人数(私人定制/路书)" - }, - "approvalNo": { - "type": "string", - "description": "审批编号" - }, - "babyCount": { - "type": "integer", - "format": "int32", - "description": "幼童数(私人定制/路书)" - }, - "childCount": { - "type": "integer", - "format": "int32", - "description": "儿童数(私人定制/路书)" - }, - "coverImageUrl": { - "type": "string", - "description": "封面图URL" - }, - "createBy": { - "type": "string", - "description": "创建人ID" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "departureCity": { - "type": "string", - "description": "出发城市" - }, - "destinationCity": { - "type": "string", - "description": "目的地城市" - }, - "folderId": { - "type": "string", - "description": "所属文件夹ID" - }, - "groupRoomId": { - "type": "string", - "description": "企微群聊ID(用于会话存档展示群消息)" - }, - "isBooking": { - "type": "boolean", - "description": "是否预约产品" - }, - "lineId": { - "type": "string", - "description": "产品线ID" - }, - "lineName": { - "type": "string", - "description": "产品线名称" - }, - "maxAdultPerOrder": { - "type": "integer", - "format": "int32", - "description": "每单最大成人数(null=不限)" - }, - "maxChildPerOrder": { - "type": "integer", - "format": "int32", - "description": "每单最大儿童数(null=不限)" - }, - "mchId": { - "type": "string", - "description": "商户号" - }, - "minAdultPerOrder": { - "type": "integer", - "format": "int32", - "description": "每单最少成人数(null=默认1)" - }, - "name": { - "type": "string", - "description": "产品名称" - }, - "pendingStatus": { - "type": "string", - "description": "待审批目标状态" - }, - "productId": { - "type": "string", - "description": "产品ID" - }, - "productNo": { - "type": "string", - "description": "产品编号" - }, - "productType": { - "type": "string", - "description": "产品类型:CORE=核心产品 ROUTE=线路产品 CUSTOM=定制产品 GROUP=小蒙马拼团" - }, - "seasonLabels": { - "type": "array", - "description": "适用季节列表(中文)", - "items": { - "type": "string" - } - }, - "seasons": { - "type": "array", - "description": "适用季节列表(编码)", - "items": { - "type": "string" - } - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "status": { - "type": "string", - "description": "产品状态:DRAFT/PENDING_REVIEW/REVIEWED/REJECTED/PUBLISHED/UNPUBLISHED/COMPLETED" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "tripDays": { - "type": "integer", - "format": "int32", - "description": "行程天数" - }, - "tripNights": { - "type": "integer", - "format": "int32", - "description": "行程晚数" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "youngChildCount": { - "type": "integer", - "format": "int32", - "description": "小童数(私人定制/路书)" - } - }, - "title": "产品列表VO" - }, - "产品定价配置VO": { - "type": "object", - "properties": { - "adultExtraBed": { - "type": "number", - "description": "成人加床费" - }, - "babyPrice": { - "type": "number", - "description": "婴儿价" - }, - "balanceDueDays": { - "type": "integer", - "format": "int32", - "description": "尾款支付截止天数(出发前N天)" - }, - "childDiscountPercent": { - "type": "number", - "description": "儿童折扣百分比" - }, - "childNoBed": { - "type": "number", - "description": "儿童不占床价" - }, - "childWithBed": { - "type": "number", - "description": "儿童占床价" - }, - "companionPrice": { - "type": "number", - "description": "陪同人员价格" - }, - "customTotalPrice": { - "type": "number", - "description": "定制产品总价(CUSTOM模式下使用)" - }, - "depositAmount": { - "type": "number", - "description": "定金金额" - }, - "depositRatio": { - "type": "integer", - "format": "int32", - "description": "定金比例(百分比)" - }, - "extraCostPerPerson": { - "type": "number", - "description": "每人额外成本" - }, - "insuranceFee": { - "type": "number", - "description": "保险费用" - }, - "markupPercent": { - "type": "number", - "description": "加价百分比(PERCENT模式下使用)" - }, - "maxGroupSize": { - "type": "integer", - "format": "int32", - "description": "最大成团人数" - }, - "mealBudget": { - "type": "number", - "description": "餐费预算" - }, - "minGroupSize": { - "type": "integer", - "format": "int32", - "description": "最小成团人数" - }, - "paymentType": { - "type": "string", - "description": "支付方式:FULL=全款 DEPOSIT=定金+尾款" - }, - "pricingId": { - "type": "string", - "description": "定价配置ID" - }, - "pricingMode": { - "type": "string", - "description": "定价模式:AUTO=自动计算 MANUAL=手动定价 CUSTOM=定制定价" - }, - "productId": { - "type": "string", - "description": "产品ID" - }, - "profitAmount": { - "type": "number", - "description": "利润金额(FIXED模式下使用)" - }, - "profitMode": { - "type": "string", - "description": "利润模式:FIXED=固定金额 PERCENT=百分比" - }, - "singleRoomDiff": { - "type": "number", - "description": "单房差" - }, - "vehicleModelIds": { - "type": "array", - "description": "车型ID列表", - "items": { - "type": "string" - } - }, - "vehicleWarning": { - "type": "string", - "description": "车辆绑定警告信息(为空表示绑定成功)" - } - }, - "title": "产品定价配置VO" - }, - "产品成本项VO": { - "type": "object", - "properties": { - "category": { - "type": "string", - "description": "成本项类别:HOTEL/SCENIC/VEHICLE/ACTIVITY/SERVICE/DINING/OTHER" - }, - "description": { - "type": "string", - "description": "成本项描述" - }, - "id": { - "type": "string", - "description": "成本项ID" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "title": { - "type": "string", - "description": "成本项标题" - }, - "type": { - "type": "string", - "description": "成本项类型:INCLUDED=费用包含 EXCLUDED=费用不含 SELF_PAY=自理费用" - } - }, - "title": "产品成本项VO" - }, - "产品文件夹VO": { - "type": "object", - "properties": { - "children": { - "type": "array", - "description": "子文件夹列表", - "items": { - "$ref": "#/definitions/产品文件夹VO", - "originalRef": "产品文件夹VO" - } - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "folderId": { - "type": "string", - "description": "文件夹ID" - }, - "name": { - "type": "string", - "description": "文件夹名称" - }, - "ownerId": { - "type": "string", - "description": "拥有者ID" - }, - "ownerName": { - "type": "string", - "description": "拥有者姓名" - }, - "parentId": { - "type": "string", - "description": "父文件夹ID" - }, - "productCount": { - "type": "integer", - "format": "int32", - "description": "文件夹内产品数量" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "产品文件夹VO" - }, - "产品物资VO": { - "type": "object", - "properties": { - "billingType": { - "type": "string", - "description": "计费方式:BY_PERSON=按人头 BY_COUNT=按次/按件" - }, - "costPerPerson": { - "type": "number", - "description": "每人成本" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "dayNumber": { - "type": "integer", - "format": "int32", - "description": "天数编号(scope=DAY时生效)" - }, - "familyIds": { - "type": "array", - "description": "所属家庭ID列表(定制产品按家庭分配)", - "items": { - "type": "string" - } - }, - "id": { - "type": "string", - "description": "记录ID" - }, - "quantity": { - "type": "integer", - "format": "int32", - "description": "数量" - }, - "scope": { - "type": "string", - "description": "适用范围:ALL=整个行程 DAY=指定天" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "suppliesId": { - "type": "string", - "description": "物资ID" - }, - "suppliesName": { - "type": "string", - "description": "物资名称" - } - }, - "title": "产品物资VO" - }, - "产品状态变更请求": { - "type": "object", - "required": [ - "status" - ], - "properties": { - "reason": { - "type": "string", - "example": "行程信息不完整,请补充", - "description": "状态变更原因(驳回时必填;上架/下架审批时可填)" - }, - "status": { - "type": "string", - "example": "PUBLISHED", - "description": "目标状态。核心/小蒙马:DRAFT/PENDING_REVIEW/REVIEWED/REJECTED/PUBLISHED/UNPUBLISHED;定制产品:COMPLETED" - } - }, - "title": "产品状态变更请求" - }, - "产品移动请求": { - "type": "object", - "properties": { - "folderId": { - "type": "string", - "example": 1893012345678901234, - "description": "目标文件夹ID,为空则移动到根目录" - } - }, - "title": "产品移动请求" - }, - "产品线VO": { - "type": "object", - "properties": { - "coverImageUrl": { - "type": "string", - "description": "封面图URL" - }, - "createBy": { - "type": "string", - "description": "创建人ID" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "description": { - "type": "string", - "description": "产品线描述" - }, - "lineId": { - "type": "string", - "description": "产品线ID" - }, - "name": { - "type": "string", - "description": "产品线名称" - }, - "productCount": { - "type": "integer", - "format": "int32", - "description": "关联产品数量" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "status": { - "type": "string", - "description": "状态:ACTIVE=启用 INACTIVE=停用" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "产品线VO" - }, - "产品自定义费用项VO": { - "type": "object", - "properties": { - "description": { - "type": "string", - "description": "费用说明" - }, - "familyIds": { - "type": "array", - "description": "所属家庭ID列表(定制产品按家庭分配)", - "items": { - "type": "string" - } - }, - "feeAmount": { - "type": "number", - "description": "费用金额" - }, - "feeName": { - "type": "string", - "description": "费用项名称" - }, - "feeUnit": { - "type": "string", - "description": "费用单位" - }, - "id": { - "type": "string", - "description": "费用项ID" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - } - }, - "title": "产品自定义费用项VO" - }, - "产品详情VO": { - "type": "object", - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "description": "成人人数" - }, - "babyCount": { - "type": "integer", - "format": "int32", - "description": "婴儿人数" - }, - "benefitsDescription": { - "type": "array", - "description": "权益说明(静态,所有产品相同)", - "items": { - "$ref": "#/definitions/权益分组", - "originalRef": "权益分组" - } - }, - "bookingTermsContent": { - "type": "string", - "description": "预订条款内容" - }, - "bookingTermsId": { - "type": "string", - "description": "预订条款ID" - }, - "bookingTermsName": { - "type": "string", - "description": "预订条款名称" - }, - "carouselImages": { - "type": "array", - "description": "轮播图列表", - "items": { - "type": "string" - } - }, - "carouselVideoUrl": { - "type": "string", - "description": "轮播视频URL" - }, - "chatMessages": { - "type": "array", - "description": "群聊消息列表", - "items": { - "$ref": "#/definitions/群聊消息VO", - "originalRef": "群聊消息VO" - } - }, - "childCount": { - "type": "integer", - "format": "int32", - "description": "儿童人数" - }, - "contactPhone": { - "type": "string", - "description": "联系电话(定制产品)" - }, - "costItems": { - "type": "array", - "description": "成本项列表", - "items": { - "$ref": "#/definitions/产品成本项VO", - "originalRef": "产品成本项VO" - } - }, - "coverImageUrl": { - "type": "string", - "description": "封面图URL" - }, - "createBy": { - "type": "string", - "description": "创建人ID" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "creatorAvatarUrl": { - "type": "string", - "description": "定制师头像URL" - }, - "creatorIntro": { - "type": "string", - "description": "创作者寄语" - }, - "customFees": { - "type": "array", - "description": "自定义费用项列表", - "items": { - "$ref": "#/definitions/产品自定义费用项VO", - "originalRef": "产品自定义费用项VO" - } - }, - "customerName": { - "type": "string", - "description": "客户姓名(定制产品)" - }, - "customizerId": { - "type": "string", - "description": "定制师ID" - }, - "departureCity": { - "type": "string", - "description": "出发城市" - }, - "departureDate": { - "type": "string", - "format": "date", - "description": "出发日期(定制产品)" - }, - "destinationCities": { - "type": "array", - "description": "途经城市列表(从行程节点资源去重提取)", - "items": { - "type": "string" - } - }, - "destinationCity": { - "type": "string", - "description": "目的地城市" - }, - "families": { - "type": "array", - "description": "家庭分组列表(定制产品)", - "items": { - "$ref": "#/definitions/家庭分组VO", - "originalRef": "家庭分组VO" - } - }, - "folderId": { - "type": "string", - "description": "所属文件夹ID" - }, - "groupChatQrUrl": { - "type": "string", - "description": "群聊二维码URL" - }, - "groupRoomId": { - "type": "string", - "description": "企微群聊ID(用于会话存档展示群消息)" - }, - "isBooking": { - "type": "boolean", - "description": "是否预约产品" - }, - "itineraryDays": { - "type": "array", - "description": "行程天列表", - "items": { - "$ref": "#/definitions/行程天VO", - "originalRef": "行程天VO" - } - }, - "lineId": { - "type": "string", - "description": "产品线ID" - }, - "lineName": { - "type": "string", - "description": "产品线名称" - }, - "lineSubtitle": { - "type": "string", - "description": "产品线副标题" - }, - "maxAdultPerOrder": { - "type": "integer", - "format": "int32", - "description": "每单最大成人数(null=不限)" - }, - "maxChildPerOrder": { - "type": "integer", - "format": "int32", - "description": "每单最大儿童数(null=不限)" - }, - "mchId": { - "type": "string", - "description": "商户号" - }, - "minAdultPerOrder": { - "type": "integer", - "format": "int32", - "description": "每单最少成人数(null=默认1)" - }, - "name": { - "type": "string", - "description": "产品名称" - }, - "paymentMode": { - "type": "string", - "description": "支付模式:FULL=全款 DEPOSIT=定金+尾款" - }, - "pricing": { - "description": "定价配置", - "$ref": "#/definitions/产品定价配置VO", - "originalRef": "产品定价配置VO" - }, - "productId": { - "type": "string", - "description": "产品ID" - }, - "productNo": { - "type": "string", - "description": "产品编号" - }, - "productType": { - "type": "string", - "description": "产品类型:CORE=核心产品 ROUTE=线路产品 CUSTOM=定制产品 GROUP=小蒙马拼团" - }, - "publishedAt": { - "type": "string", - "format": "date-time", - "description": "发布时间" - }, - "refundPolicyId": { - "type": "string", - "description": "退款政策ID(已废弃,用refundPolicyIds替代)" - }, - "refundPolicyIds": { - "type": "object", - "description": "退款政策映射(按退款类型绑定不同政策)。key=退款类型(FULL/DEPOSIT/BALANCE), value=政策ID", - "additionalProperties": { - "type": "string" - } - }, - "refundPolicyName": { - "type": "string", - "description": "退款政策名称(已废弃)" - }, - "routeMapUrl": { - "type": "string", - "description": "路径图URL(后端自动生成)" - }, - "seasonLabels": { - "type": "array", - "description": "适用季节列表(中文)", - "items": { - "type": "string" - } - }, - "seasons": { - "type": "array", - "description": "适用季节列表(编码)", - "items": { - "type": "string" - } - }, - "showChatGroup": { - "type": "boolean", - "description": "是否显示群聊入口" - }, - "showReview": { - "type": "boolean", - "description": "是否显示评价" - }, - "showTripDistance": { - "type": "boolean", - "description": "是否显示行程距离" - }, - "showTripTime": { - "type": "boolean", - "description": "是否显示行程时间" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "staffConfigs": { - "type": "array", - "description": "人员配置列表(定制产品)", - "items": { - "$ref": "#/definitions/产品人员配置VO", - "originalRef": "产品人员配置VO" - } - }, - "startPrice": { - "type": "number", - "description": "起步价:未来一年价格日历中最低成人售价" - }, - "status": { - "type": "string", - "description": "产品状态:DRAFT/PENDING_REVIEW/REVIEWED/REJECTED/PUBLISHED/UNPUBLISHED/COMPLETED" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "suppliesList": { - "type": "array", - "description": "物资列表", - "items": { - "$ref": "#/definitions/产品物资VO", - "originalRef": "产品物资VO" - } - }, - "tags": { - "type": "array", - "description": "产品标签列表", - "items": { - "type": "string" - } - }, - "teamExperienceYears": { - "type": "integer", - "format": "int32", - "description": "团队经验年数" - }, - "tripDays": { - "type": "integer", - "format": "int32", - "description": "行程天数" - }, - "tripNights": { - "type": "integer", - "format": "int32", - "description": "行程晚数" - }, - "updateBy": { - "type": "string", - "description": "更新人ID" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "warmTipsContent": { - "type": "string", - "description": "温馨提示内容" - }, - "warmTipsId": { - "type": "string", - "description": "温馨提示ID" - }, - "warmTipsName": { - "type": "string", - "description": "温馨提示名称" - }, - "youngChildCount": { - "type": "integer", - "format": "int32", - "description": "小童人数" - } - }, - "title": "产品详情VO" - }, - "产品额外成本VO": { - "type": "object", - "properties": { - "applyRole": { - "type": "string", - "description": "适用角色" - }, - "categoryCode": { - "type": "string", - "description": "费用类别编码" - }, - "costItemId": { - "type": "string", - "description": "费用项ID" - }, - "costItemName": { - "type": "string", - "description": "费用项名称" - }, - "daily": { - "type": "boolean", - "description": "是否按天计算:true=按天计算(乘以天数) false=整个行程一次" - }, - "familyIds": { - "type": "array", - "description": "所属家庭ID列表(定制产品按家庭分配)", - "items": { - "type": "string" - } - }, - "id": { - "type": "string", - "description": "记录ID" - }, - "quantity": { - "type": "integer", - "format": "int32", - "description": "数量" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "unit": { - "type": "string", - "description": "单位" - }, - "unitPrice": { - "type": "number", - "description": "单价" - } - }, - "title": "产品额外成本VO" - }, - "人员配置请求": { - "type": "object", - "required": [ - "quantity", - "staffType" - ], - "properties": { - "familyIds": { - "type": "array", - "description": "所属家庭ID列表(定制产品按家庭分配)", - "items": { - "type": "string" - } - }, - "quantity": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "数量" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序序号" - }, - "staffType": { - "type": "string", - "example": "GUIDE", - "description": "人员类型:GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER" - } - }, - "title": "人员配置请求" - }, - "价格日历请求": { - "type": "object", - "required": [ - "date" - ], - "properties": { - "adultCostPrice": { - "type": "number", - "example": 2800.0, - "description": "成人成本价" - }, - "adultCount": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "成人人数(GROUP产品自动测算用)" - }, - "adultSellPrice": { - "type": "number", - "example": 3980.0, - "description": "成人售价" - }, - "childCostPrice": { - "type": "number", - "example": 1800.0, - "description": "儿童成本价" - }, - "childSellPrice": { - "type": "number", - "example": 2680.0, - "description": "儿童售价" - }, - "costAutoCalc": { - "type": "boolean", - "example": true, - "description": "是否自动计算成本(true时重新测算会自动更新此日期的价格)" - }, - "date": { - "type": "string", - "format": "date", - "example": "2026-05-01", - "description": "日期" - }, - "remark": { - "type": "string", - "example": "五一黄金周特价", - "description": "备注" - }, - "status": { - "type": "string", - "example": "OPEN", - "description": "状态:OPEN=开放预订 CLOSED=关闭(不可预订)" - }, - "stock": { - "type": "integer", - "format": "int32", - "example": 30, - "description": "库存数量(CORE/GROUP按人头扣减,CUSTOM/ROUTE按单扣减)" - } - }, - "title": "价格日历请求" - }, - "保存产品请求(创建或更新)": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "成人人数" - }, - "babyCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "婴儿人数" - }, - "bookingTermsId": { - "type": "string", - "example": 1893012345678901234, - "description": "预订条款ID(关联预订条款模板)" - }, - "carouselImages": { - "type": "array", - "description": "轮播图列表", - "items": { - "type": "string" - } - }, - "carouselVideoUrl": { - "type": "string", - "example": "https://oss.example.com/video.mp4", - "description": "轮播视频URL" - }, - "chatMessages": { - "type": "array", - "description": "群聊消息列表", - "items": { - "$ref": "#/definitions/群聊消息VO", - "originalRef": "群聊消息VO" - } - }, - "childCount": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "儿童人数" - }, - "contactPhone": { - "type": "string", - "example": 13800138000, - "description": "联系电话(定制产品)" - }, - "coverImageUrl": { - "type": "string", - "example": "https://oss.example.com/cover.jpg", - "description": "封面图URL" - }, - "creatorAvatarUrl": { - "type": "string", - "example": "https://oss.example.com/avatar.jpg", - "description": "定制师头像URL" - }, - "creatorIntro": { - "type": "string", - "example": "带你体验最地道的丽江风情", - "description": "创作者寄语" - }, - "customerName": { - "type": "string", - "example": "张三", - "description": "客户姓名(定制产品)" - }, - "customizerId": { - "type": "string", - "example": 1893012345678901234, - "description": "定制师ID" - }, - "departureCity": { - "type": "string", - "example": "昆明", - "description": "出发城市" - }, - "departureDate": { - "type": "string", - "format": "date", - "example": "2026-07-01", - "description": "出发日期(定制产品)" - }, - "destinationCity": { - "type": "string", - "example": "丽江", - "description": "目的地城市" - }, - "folderId": { - "type": "string", - "example": 1893012345678901234, - "description": "所属文件夹ID" - }, - "groupChatQrUrl": { - "type": "string", - "example": "https://oss.example.com/qr.jpg", - "description": "群聊二维码URL" - }, - "groupRoomId": { - "type": "string", - "description": "企微群聊ID(用于会话存档展示群消息)" - }, - "isBooking": { - "type": "boolean", - "example": false, - "description": "是否预约产品" - }, - "lineId": { - "type": "string", - "example": 1893012345678901234, - "description": "产品线ID" - }, - "lineSubtitle": { - "type": "string", - "example": "亲子游", - "description": "产品线副标题" - }, - "maxAdultPerOrder": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "每单最大成人数(不填则不限制)" - }, - "maxChildPerOrder": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "每单最大儿童数(不填则不限制)" - }, - "mchId": { - "type": "string", - "example": "shanhe", - "description": "商户号:shanhe/wenlu" - }, - "minAdultPerOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "每单最少成人数(不填默认1)" - }, - "name": { - "type": "string", - "example": "丽江5日深度游", - "description": "产品名称" - }, - "productId": { - "type": "integer", - "format": "int64", - "example": 1893012345678901234, - "description": "产品ID(传入则更新,不传则创建)" - }, - "productType": { - "type": "string", - "example": "CORE", - "description": "产品类型:CORE=核心产品 ROUTE=线路产品 CUSTOM=定制产品 GROUP=小蒙马拼团(创建时必填,更新时忽略)" - }, - "refundPolicyId": { - "type": "string", - "example": 1893012345678901234, - "description": "退款政策ID(已废弃,用refundPolicyIds替代)" - }, - "refundPolicyIds": { - "type": "object", - "example": { - "FULL": "1893012345678901234", - "DEPOSIT": "1893012345678901235" - }, - "description": "退款政策映射(按退款类型绑定不同政策)。key=退款类型(FULL/DEPOSIT/BALANCE), value=政策ID", - "additionalProperties": { - "type": "string" - } - }, - "seasons": { - "type": "array", - "example": [ - "春", - "夏" - ], - "description": "适用季节列表,如 [\"春\",\"夏\",\"秋\",\"冬\"]", - "items": { - "type": "string" - } - }, - "showChatGroup": { - "type": "boolean", - "example": true, - "description": "是否显示群聊入口" - }, - "showReview": { - "type": "boolean", - "example": true, - "description": "是否显示评价" - }, - "showTripDistance": { - "type": "boolean", - "example": true, - "description": "是否显示行程距离" - }, - "showTripTime": { - "type": "boolean", - "example": true, - "description": "是否显示行程时间" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序序号" - }, - "subtitle": { - "type": "string", - "example": "探访纳西文化,邂逅玉龙雪山", - "description": "副标题" - }, - "tags": { - "type": "array", - "example": [ - "亲子游", - "摄影" - ], - "description": "产品标签列表,如 [\"亲子游\",\"摄影\"]", - "items": { - "type": "string" - } - }, - "teamExperienceYears": { - "type": "integer", - "format": "int32", - "example": 10, - "description": "团队经验年数" - }, - "tripDays": { - "type": "integer", - "format": "int32", - "example": 5, - "description": "行程天数" - }, - "warmTipsId": { - "type": "string", - "example": 1893012345678901234, - "description": "温馨提示ID(关联温馨提示模板)" - }, - "youngChildCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "小童人数" - } - }, - "title": "保存产品请求(创建或更新)" - }, - "公式变量VO": { - "type": "object", - "properties": { - "category": { - "type": "string", - "description": "变量分类:INPUT/INTERMEDIATE/OUTPUT" - }, - "defaultValue": { - "type": "string", - "description": "默认值" - }, - "description": { - "type": "string", - "description": "描述" - }, - "productTypes": { - "type": "array", - "description": "适用产品类型列表", - "items": { - "type": "string" - } - }, - "varId": { - "type": "string", - "description": "变量ID" - }, - "varName": { - "type": "string", - "description": "变量名" - }, - "varType": { - "type": "string", - "description": "变量类型:DECIMAL/INTEGER/BOOLEAN/STRING" - } - }, - "title": "公式变量VO" - }, - "公式变量请求": { - "type": "object", - "required": [ - "category", - "varName", - "varType" - ], - "properties": { - "category": { - "type": "string", - "example": "INPUT", - "description": "变量分类:INPUT/INTERMEDIATE/OUTPUT" - }, - "defaultValue": { - "type": "string", - "example": 0, - "description": "默认值" - }, - "description": { - "type": "string", - "example": "成人单价成本", - "description": "描述" - }, - "productTypes": { - "type": "array", - "example": [ - "CORE", - "ROUTE" - ], - "description": "适用产品类型列表", - "items": { - "type": "string" - } - }, - "varName": { - "type": "string", - "example": "adultUnitCost", - "description": "变量名" - }, - "varType": { - "type": "string", - "example": "DECIMAL", - "description": "变量类型:DECIMAL/INTEGER/BOOLEAN/STRING" - } - }, - "title": "公式变量请求" - }, - "公式步骤VO": { - "type": "object", - "properties": { - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "description": { - "type": "string", - "description": "描述" - }, - "executionOrder": { - "type": "integer", - "format": "int32", - "description": "执行顺序" - }, - "expression": { - "type": "string", - "description": "表达式" - }, - "formulaId": { - "type": "string", - "description": "公式ID" - }, - "groupId": { - "type": "string", - "description": "公式组ID" - }, - "inputVars": { - "type": "string", - "description": "输入变量(逗号分隔)" - }, - "isEnabled": { - "type": "boolean", - "description": "是否启用" - }, - "outputVar": { - "type": "string", - "description": "输出变量名" - }, - "stepCode": { - "type": "string", - "description": "步骤编码" - }, - "stepName": { - "type": "string", - "description": "步骤名称" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "公式步骤VO" - }, - "公式步骤请求": { - "type": "object", - "required": [ - "expression", - "groupId", - "outputVar", - "stepCode", - "stepName" - ], - "properties": { - "changeNote": { - "type": "string", - "example": "初始创建", - "description": "变更说明" - }, - "description": { - "type": "string", - "example": "根据人数和单价计算基础成本", - "description": "描述" - }, - "executionOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "执行顺序" - }, - "expression": { - "type": "string", - "example": "baseCost = adultCount * adultUnitCost + childCount * childUnitCost", - "description": "Aviator表达式(支持数学运算、条件判断、内置函数;可引用前置步骤的输出变量和公式变量表中的变量)" - }, - "groupId": { - "type": "integer", - "format": "int64", - "example": 1893012345678901234, - "description": "公式组ID" - }, - "inputVars": { - "type": "string", - "example": "adultCount,adultUnitCost,childCount,childUnitCost", - "description": "输入变量(逗号分隔)" - }, - "outputVar": { - "type": "string", - "example": "baseCost", - "description": "输出变量名" - }, - "stepCode": { - "type": "string", - "example": "CALC_BASE_COST", - "description": "步骤编码" - }, - "stepName": { - "type": "string", - "example": "计算基础成本", - "description": "步骤名称" - } - }, - "title": "公式步骤请求" - }, - "公式测试结果VO": { - "type": "object", - "properties": { - "errorMessage": { - "type": "string", - "description": "错误信息" - }, - "finalVariables": { - "type": "object", - "description": "最终变量表" - }, - "stepResults": { - "type": "array", - "description": "各步骤执行结果", - "items": { - "$ref": "#/definitions/步骤执行结果", - "originalRef": "步骤执行结果" - } - }, - "success": { - "type": "boolean", - "description": "是否成功" - }, - "totalTimeMs": { - "type": "integer", - "format": "int64", - "description": "总耗时(毫秒)" - } - }, - "title": "公式测试结果VO" - }, - "公式测试请求": { - "type": "object", - "required": [ - "groupId", - "variables" - ], - "properties": { - "groupId": { - "type": "integer", - "format": "int64", - "example": 1893012345678901234, - "description": "公式组ID" - }, - "variables": { - "type": "object", - "description": "测试变量(变量名→值)" - } - }, - "title": "公式测试请求" - }, - "公式版本历史VO": { - "type": "object", - "properties": { - "changeNote": { - "type": "string", - "description": "变更说明" - }, - "changedBy": { - "type": "string", - "description": "变更人ID" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "expression": { - "type": "string", - "description": "表达式" - }, - "formulaId": { - "type": "string", - "description": "公式ID" - }, - "versionId": { - "type": "string", - "description": "版本ID" - }, - "versionNum": { - "type": "integer", - "format": "int32", - "description": "版本号" - } - }, - "title": "公式版本历史VO" - }, - "公式组VO": { - "type": "object", - "properties": { - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "description": { - "type": "string", - "description": "描述" - }, - "groupCode": { - "type": "string", - "description": "公式组编码" - }, - "groupId": { - "type": "string", - "description": "公式组ID" - }, - "groupName": { - "type": "string", - "description": "公式组名称" - }, - "isActive": { - "type": "boolean", - "description": "是否激活" - }, - "productType": { - "type": "string", - "description": "适用产品类型" - }, - "stepCount": { - "type": "integer", - "format": "int32", - "description": "步骤数量" - }, - "version": { - "type": "integer", - "format": "int32", - "description": "版本号" - } - }, - "title": "公式组VO" - }, - "公式组请求": { - "type": "object", - "required": [ - "groupCode", - "groupName", - "productType" - ], - "properties": { - "description": { - "type": "string", - "example": "核心产品标准报价公式", - "description": "描述" - }, - "groupCode": { - "type": "string", - "example": "CORE_PRICING_V1", - "description": "公式组编码" - }, - "groupName": { - "type": "string", - "example": "核心产品定价公式", - "description": "公式组名称" - }, - "productType": { - "type": "string", - "example": "CORE", - "description": "适用产品类型:CORE/ROUTE/CUSTOM/GROUP" - } - }, - "title": "公式组请求" - }, - "分享链接响应": { - "type": "object", - "properties": { - "expireTime": { - "type": "object", - "description": "链接过期时间(Unix时间戳)" - }, - "productId": { - "type": "integer", - "format": "int64", - "description": "产品ID" - }, - "productName": { - "type": "string", - "description": "产品名称" - }, - "urlLink": { - "type": "string", - "description": "微信URL Link" - } - }, - "title": "分享链接响应" - }, - "分页结果«C端产品列表VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/C端产品列表VO", - "originalRef": "C端产品列表VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«C端产品列表VO»" - }, - "分页结果«产品列表VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/产品列表VO", - "originalRef": "产品列表VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«产品列表VO»" - }, - "分页结果«产品线VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/产品线VO", - "originalRef": "产品线VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«产品线VO»" - }, - "创建产品线请求": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "coverImageUrl": { - "type": "string", - "example": "https://oss.example.com/cover.jpg", - "description": "封面图URL" - }, - "description": { - "type": "string", - "example": "丽江古城及周边精品旅游线路", - "description": "产品线描述" - }, - "name": { - "type": "string", - "example": "丽江精品线路", - "description": "产品线名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序序号" - } - }, - "title": "创建产品线请求" - }, - "创建产品请求": { - "type": "object", - "required": [ - "name", - "productType" - ], - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "成人人数" - }, - "babyCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "婴儿人数" - }, - "bookingTermsId": { - "type": "string", - "example": 1893012345678901234, - "description": "预订条款ID(关联预订条款模板)" - }, - "carouselImages": { - "type": "array", - "description": "轮播图列表", - "items": { - "type": "string" - } - }, - "carouselVideoUrl": { - "type": "string", - "example": "https://oss.example.com/video.mp4", - "description": "轮播视频URL" - }, - "childCount": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "儿童人数" - }, - "contactPhone": { - "type": "string", - "example": 13800138000, - "description": "联系电话(定制产品)" - }, - "creatorAvatarUrl": { - "type": "string", - "example": "https://oss.example.com/avatar.jpg", - "description": "定制师头像URL" - }, - "creatorIntro": { - "type": "string", - "example": "带你体验最地道的丽江风情", - "description": "创作者寄语" - }, - "customerName": { - "type": "string", - "example": "张三", - "description": "客户姓名(定制产品)" - }, - "customizerId": { - "type": "string", - "example": 1893012345678901234, - "description": "定制师ID" - }, - "departureCity": { - "type": "string", - "example": "昆明", - "description": "出发城市" - }, - "departureDate": { - "type": "string", - "format": "date", - "example": "2026-07-01", - "description": "出发日期(定制产品)" - }, - "destinationCity": { - "type": "string", - "example": "丽江", - "description": "目的地城市" - }, - "folderId": { - "type": "string", - "example": 1893012345678901234, - "description": "所属文件夹ID" - }, - "groupChatQrUrl": { - "type": "string", - "example": "https://oss.example.com/qr.jpg", - "description": "群聊二维码URL" - }, - "groupRoomId": { - "type": "string", - "description": "企微群聊ID(用于会话存档展示群消息)" - }, - "isBooking": { - "type": "boolean", - "example": false, - "description": "是否预约产品" - }, - "lineId": { - "type": "string", - "example": 1893012345678901234, - "description": "产品线ID" - }, - "maxAdultPerOrder": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "每单最大成人数(不填则不限制)" - }, - "maxChildPerOrder": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "每单最大儿童数(不填则不限制)" - }, - "mchId": { - "type": "string", - "example": "shanhe", - "description": "商户号:shanhe/wenlu" - }, - "minAdultPerOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "每单最少成人数(不填默认1)" - }, - "name": { - "type": "string", - "example": "丽江5日深度游", - "description": "产品名称" - }, - "productType": { - "type": "string", - "example": "CORE", - "description": "产品类型:CORE=核心产品 ROUTE=线路产品 CUSTOM=定制产品 GROUP=小蒙马拼团" - }, - "refundPolicyId": { - "type": "string", - "example": 1893012345678901234, - "description": "退款政策ID(已废弃,用refundPolicyIds替代)" - }, - "refundPolicyIds": { - "type": "object", - "example": { - "FULL": "1893012345678901234", - "DEPOSIT": "1893012345678901235" - }, - "description": "退款政策映射(按退款类型绑定不同政策)。key=退款类型(FULL/DEPOSIT/BALANCE), value=政策ID", - "additionalProperties": { - "type": "string" - } - }, - "seasons": { - "type": "array", - "description": "适用季节列表", - "items": { - "type": "string" - } - }, - "showChatGroup": { - "type": "boolean", - "example": true, - "description": "是否显示群聊入口" - }, - "showReview": { - "type": "boolean", - "example": true, - "description": "是否显示评价" - }, - "showTripDistance": { - "type": "boolean", - "example": true, - "description": "是否显示行程距离" - }, - "showTripTime": { - "type": "boolean", - "example": true, - "description": "是否显示行程时间" - }, - "subtitle": { - "type": "string", - "example": "探访纳西文化,邂逅玉龙雪山", - "description": "副标题" - }, - "tags": { - "type": "array", - "description": "产品标签列表", - "items": { - "type": "string" - } - }, - "tripDays": { - "type": "integer", - "format": "int32", - "example": 5, - "description": "行程天数" - }, - "warmTipsId": { - "type": "string", - "example": 1893012345678901234, - "description": "温馨提示ID(关联温馨提示模板)" - }, - "youngChildCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "小童人数" - } - }, - "title": "创建产品请求" - }, - "创建拼团批次请求": { - "type": "object", - "required": [ - "batchName", - "departureDate", - "enrollmentDeadline", - "maxParticipants", - "maxRooms" - ], - "properties": { - "adultsPerRoom": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "每间房入住成人数(默认2,用于计算单房差:酒店总成本÷此值)" - }, - "batchName": { - "type": "string", - "example": "7月20日第1批", - "description": "批次名称" - }, - "departureDate": { - "type": "string", - "format": "date", - "example": "2026-07-20", - "description": "出发日期" - }, - "enrollmentDeadline": { - "type": "string", - "format": "date", - "example": "2026-07-15", - "description": "报名截止日期,必须早于出发日期" - }, - "maxParticipants": { - "type": "integer", - "format": "int32", - "example": 30, - "description": "最大参团人数(报名人数达到上限后自动关闭报名)" - }, - "maxRooms": { - "type": "integer", - "format": "int32", - "example": 15, - "description": "总房间数(下单时扣减房间库存)" - }, - "minParticipants": { - "type": "integer", - "format": "int32", - "example": 10, - "description": "最低成团人数(0=不限制,达到此人数自动变为CONFIRMED状态)" - }, - "remark": { - "type": "string", - "example": "暑期特别批次", - "description": "备注说明" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序序号(越小越靠前)" - } - }, - "title": "创建拼团批次请求" - }, - "创建文件夹请求": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "type": "string", - "example": "国内线路", - "description": "文件夹名称" - }, - "parentId": { - "type": "string", - "example": 1893012345678901234, - "description": "父文件夹ID,为空则为根文件夹" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序序号" - } - }, - "title": "创建文件夹请求" - }, - "创建行程节点请求": { - "type": "object", - "required": [ - "nodeName", - "nodeType" - ], - "properties": { - "description": { - "type": "string", - "example": "漫步古城,感受纳西文化", - "description": "节点描述" - }, - "distanceKm": { - "type": "number", - "example": 15.5, - "description": "距离(公里)" - }, - "durationMinutes": { - "type": "integer", - "format": "int32", - "example": 120, - "description": "时长(分钟)" - }, - "emojiIcon": { - "type": "string", - "example": "city_sunset", - "description": "表情图标" - }, - "extraData": { - "type": "string", - "description": "扩展数据(JSON格式)" - }, - "familyIds": { - "type": "array", - "description": "所属家庭ID列表(仅CUSTOM定制产品使用,实现按家庭分配行程节点)", - "items": { - "type": "string" - } - }, - "images": { - "type": "array", - "description": "节点图片列表", - "items": { - "type": "string" - } - }, - "latitude": { - "type": "number", - "example": 26.872108, - "description": "纬度" - }, - "longitude": { - "type": "number", - "example": 100.233026, - "description": "经度" - }, - "nodeName": { - "type": "string", - "example": "丽江古城游览", - "description": "节点名称" - }, - "nodeType": { - "type": "string", - "example": "SCENIC", - "description": "节点类型:TRANSPORT(交通)/SCENIC(景区)/RESTAURANT(餐厅)/ACTIVITY(活动)/PHOTOGRAPHY(摄影)/HOTEL(酒店)/FREE(自由活动)/CUSTOM(自定义)/SERVICE(服务)/NOTE(备注)" - }, - "quantity": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "数量" - }, - "resourceId": { - "type": "string", - "example": 1893012345678901234, - "description": "关联资源ID(来自资源服务,关联后节点名称和图片可自动同步)" - }, - "resourceType": { - "type": "string", - "example": "SCENIC", - "description": "关联资源类型(关联后可从资源服务获取价格参与成本计算):SCENIC/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE" - }, - "startTime": { - "type": "string", - "example": "09:00", - "description": "开始时间" - } - }, - "title": "创建行程节点请求" - }, - "团批次VO": { - "type": "object", - "properties": { - "adultsPerRoom": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "每间房入住成人数(用于计算单房差)" - }, - "batchId": { - "type": "string", - "example": 2026280000000000001, - "description": "批次ID" - }, - "batchLabel": { - "type": "string", - "example": "五一团", - "description": "批次标签(简称)" - }, - "batchName": { - "type": "string", - "example": "2026年五一黄金周第一批", - "description": "批次名称" - }, - "batchNo": { - "type": "string", - "example": "B20260501-01", - "description": "批次编号" - }, - "batchStatus": { - "type": "string", - "example": "ENROLLING", - "description": "批次状态: PENDING/ENROLLING/CONFIRMED/FULL/CLOSED/IN_PROGRESS/FINISHED/DISBANDED" - }, - "bookedRooms": { - "type": "integer", - "format": "int32", - "example": 5, - "description": "已预订房间数" - }, - "createBy": { - "type": "string", - "example": 2026260000000000001, - "description": "创建人ID" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "departureDate": { - "type": "string", - "format": "date", - "example": "2026-05-01", - "description": "出发日期" - }, - "endDate": { - "type": "string", - "format": "date", - "example": "2026-05-05", - "description": "结束日期" - }, - "enrolledCount": { - "type": "integer", - "format": "int32", - "example": 15, - "description": "已报名人数" - }, - "enrollmentDeadline": { - "type": "string", - "format": "date", - "example": "2026-04-25", - "description": "报名截止日期" - }, - "maxParticipants": { - "type": "integer", - "format": "int32", - "example": 30, - "description": "最大人数" - }, - "maxRooms": { - "type": "integer", - "format": "int32", - "example": 15, - "description": "总房间数" - }, - "minParticipants": { - "type": "integer", - "format": "int32", - "example": 10, - "description": "最少成团人数" - }, - "parentBatchId": { - "type": "string", - "example": 2026280000000000001, - "description": "父批次ID(子批次时有值)" - }, - "productId": { - "type": "string", - "example": 2026270000000000001, - "description": "产品ID" - }, - "remainingRooms": { - "type": "integer", - "format": "int32", - "example": 10, - "description": "剩余房间数" - }, - "remainingSlots": { - "type": "integer", - "format": "int32", - "example": 15, - "description": "剩余名额" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序" - }, - "subBatches": { - "type": "array", - "description": "子批次列表(树形)", - "items": { - "$ref": "#/definitions/团批次VO", - "originalRef": "团批次VO" - } - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "团批次VO" - }, - "团批次服务人员VO": { - "type": "object", - "properties": { - "batchId": { - "type": "string", - "example": 2026280000000000001, - "description": "批次ID" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "id": { - "type": "string", - "example": 2026280000000000020, - "description": "记录ID" - }, - "productId": { - "type": "string", - "example": 2026270000000000001, - "description": "产品ID" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序" - }, - "staffId": { - "type": "string", - "example": 2026250000000000001, - "description": "服务人员ID" - }, - "staffName": { - "type": "string", - "example": "张导", - "description": "姓名" - }, - "staffPhone": { - "type": "string", - "example": 13800138000, - "description": "手机号" - }, - "staffRole": { - "type": "string", - "example": "GUIDE", - "description": "角色: GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER" - } - }, - "title": "团批次服务人员VO" - }, - "团批次详情VO": { - "type": "object", - "properties": { - "adultsPerRoom": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "每间房入住成人数(用于计算单房差)" - }, - "batchId": { - "type": "string", - "example": 2026280000000000001, - "description": "批次ID" - }, - "batchLabel": { - "type": "string", - "example": "五一团", - "description": "批次标签(简称)" - }, - "batchName": { - "type": "string", - "example": "2026年五一黄金周第一批", - "description": "批次名称" - }, - "batchNo": { - "type": "string", - "example": "B20260501-01", - "description": "批次编号" - }, - "batchStatus": { - "type": "string", - "example": "ENROLLING", - "description": "批次状态: PENDING/ENROLLING/CONFIRMED/FULL/CLOSED/IN_PROGRESS/FINISHED/DISBANDED" - }, - "bookedRooms": { - "type": "integer", - "format": "int32", - "example": 5, - "description": "已预订房间数" - }, - "createBy": { - "type": "string", - "example": 2026260000000000001, - "description": "创建人ID" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "departureDate": { - "type": "string", - "format": "date", - "example": "2026-05-01", - "description": "出发日期" - }, - "endDate": { - "type": "string", - "format": "date", - "example": "2026-05-05", - "description": "结束日期" - }, - "enrolledCount": { - "type": "integer", - "format": "int32", - "example": 15, - "description": "已报名人数" - }, - "enrollmentDeadline": { - "type": "string", - "format": "date", - "example": "2026-04-25", - "description": "报名截止日期" - }, - "maxParticipants": { - "type": "integer", - "format": "int32", - "example": 30, - "description": "最大人数" - }, - "maxRooms": { - "type": "integer", - "format": "int32", - "example": 15, - "description": "总房间数" - }, - "minParticipants": { - "type": "integer", - "format": "int32", - "example": 10, - "description": "最少成团人数" - }, - "parentBatchId": { - "type": "string", - "example": 2026280000000000001, - "description": "父批次ID(子批次时有值)" - }, - "productId": { - "type": "string", - "example": 2026270000000000001, - "description": "产品ID" - }, - "remainingRooms": { - "type": "integer", - "format": "int32", - "example": 10, - "description": "剩余房间数" - }, - "remainingSlots": { - "type": "integer", - "format": "int32", - "example": 15, - "description": "剩余名额" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序" - }, - "staff": { - "type": "array", - "description": "服务人员列表", - "items": { - "$ref": "#/definitions/团批次服务人员VO", - "originalRef": "团批次服务人员VO" - } - }, - "subBatches": { - "type": "array", - "description": "子批次列表(树形)", - "items": { - "$ref": "#/definitions/团批次VO", - "originalRef": "团批次VO" - } - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "团批次详情VO" - }, - "定价配置请求": { - "type": "object", - "properties": { - "adultExtraBed": { - "type": "number", - "example": 200.0, - "description": "成人加床费" - }, - "babyPrice": { - "type": "number", - "example": 300.0, - "description": "婴儿固定价格(不随日期变化)" - }, - "balanceDueDays": { - "type": "integer", - "format": "int32", - "example": 7, - "description": "尾款支付截止天数(出发前N天必须支付尾款,超时可能取消订单)" - }, - "childDiscountPercent": { - "type": "number", - "example": 70.0, - "description": "小童折扣百分比(小童价=儿童价×此百分比/100,如70表示打7折)" - }, - "childNoBed": { - "type": "number", - "example": 1200.0, - "description": "儿童不占床价(暂未使用,预留字段)" - }, - "childWithBed": { - "type": "number", - "example": 1800.0, - "description": "儿童加床费(childNeedBed=true时额外加收的费用)" - }, - "companionPrice": { - "type": "number", - "example": 0.0, - "description": "陪同人员价格" - }, - "customTotalPrice": { - "type": "number", - "example": 28800.0, - "description": "定制产品总价(CUSTOM定价模式下使用,代表整单总价)" - }, - "depositAmount": { - "type": "number", - "example": 1000.0, - "description": "定金金额(固定金额,与depositRatio二选一)" - }, - "depositRatio": { - "type": "integer", - "format": "int32", - "example": 30, - "description": "定金比例(百分比,如30代表30%。与depositAmount二选一,优先使用比例)" - }, - "extraCostPerPerson": { - "type": "number", - "example": 50.0, - "description": "每人额外成本" - }, - "insuranceFee": { - "type": "number", - "example": 50.0, - "description": "保险费用" - }, - "markupPercent": { - "type": "number", - "example": 20.0, - "description": "加价百分比(PERCENT模式下使用)" - }, - "maxGroupSize": { - "type": "integer", - "format": "int32", - "example": 16, - "description": "最大成团人数(CORE/GROUP产品用)" - }, - "mealBudget": { - "type": "number", - "example": 100.0, - "description": "餐费预算" - }, - "minGroupSize": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "最小成团人数(CORE/GROUP产品用,影响均摊成本计算)" - }, - "paymentType": { - "type": "string", - "example": "FULL", - "description": "支付方式:FULL=全款支付 DEPOSIT=定金+尾款分期支付" - }, - "pricingMode": { - "type": "string", - "example": "AUTO", - "description": "定价模式:AUTO=根据行程资源价格自动计算 MANUAL=手动在价格日历设置每日价格 CUSTOM=定制产品整单定价" - }, - "profitAmount": { - "type": "number", - "example": 500.0, - "description": "利润金额(FIXED模式下使用)" - }, - "profitMode": { - "type": "string", - "example": "FIXED", - "description": "利润模式(AUTO模式下生效):FIXED=在成本基础上加固定金额 PERCENT=在成本基础上按百分比加价" - }, - "singleRoomDiff": { - "type": "number", - "example": 300.0, - "description": "单房差" - }, - "vehicleModelIds": { - "type": "array", - "description": "车型ID列表", - "items": { - "type": "integer", - "format": "int64" - } - } - }, - "title": "定价配置请求" - }, - "家庭分组VO": { - "type": "object", - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "description": "成人数" - }, - "babyCount": { - "type": "integer", - "format": "int32", - "description": "幼童数" - }, - "childCount": { - "type": "integer", - "format": "int32", - "description": "儿童数" - }, - "familyId": { - "type": "string", - "description": "家庭ID" - }, - "familyName": { - "type": "string", - "description": "家庭名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "youngChildCount": { - "type": "integer", - "format": "int32", - "description": "小童数" - } - }, - "title": "家庭分组VO" - }, - "家庭分组保存请求": { - "type": "object", - "required": [ - "familyName" - ], - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "成人数" - }, - "babyCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "幼童数" - }, - "childCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "儿童数" - }, - "familyName": { - "type": "string", - "example": "家庭1", - "description": "家庭名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序序号" - }, - "youngChildCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "小童数" - } - }, - "title": "家庭分组保存请求", - "description": "仅适用于CUSTOM定制产品,用于将行程按家庭单位分配" - }, - "家庭成本明细": { - "type": "object", - "properties": { - "activityCost": { - "type": "number", - "description": "活动成本" - }, - "adultCount": { - "type": "integer", - "format": "int32", - "description": "成人数" - }, - "babyCost": { - "type": "number", - "description": "婴儿固定成本" - }, - "babyCount": { - "type": "integer", - "format": "int32", - "description": "幼童数" - }, - "childCount": { - "type": "integer", - "format": "int32", - "description": "儿童数" - }, - "costPerPerson": { - "type": "number", - "description": "人均成本(家庭成本/付费人头)" - }, - "customFeeCost": { - "type": "number", - "description": "自定义费用成本" - }, - "extraCost": { - "type": "number", - "description": "额外成本" - }, - "familyId": { - "type": "string", - "description": "家庭ID" - }, - "familyName": { - "type": "string", - "description": "家庭名称" - }, - "headcount": { - "type": "integer", - "format": "int32", - "description": "人头数" - }, - "hotelCost": { - "type": "number", - "description": "酒店成本" - }, - "insuranceCost": { - "type": "number", - "description": "保险成本" - }, - "payingHeadcount": { - "type": "integer", - "format": "int32", - "description": "付费人头数(不含幼童)" - }, - "personCosts": { - "type": "array", - "description": "每人分项成本列表", - "items": { - "$ref": "#/definitions/每人成本明细", - "originalRef": "每人成本明细" - } - }, - "scenicCost": { - "type": "number", - "description": "景区成本" - }, - "sellPricePerPerson": { - "type": "number", - "description": "人均售价(家庭售价/付费人头)" - }, - "serviceCost": { - "type": "number", - "description": "服务成本" - }, - "staffCost": { - "type": "number", - "description": "人员成本" - }, - "suppliesCost": { - "type": "number", - "description": "物资成本" - }, - "totalCost": { - "type": "number", - "description": "家庭成本合计" - }, - "totalProfit": { - "type": "number", - "description": "家庭利润合计" - }, - "totalSellPrice": { - "type": "number", - "description": "家庭售价合计" - }, - "vehicleCost": { - "type": "number", - "description": "车辆成本" - }, - "youngChildCount": { - "type": "integer", - "format": "int32", - "description": "小童数" - } - }, - "title": "家庭成本明细" - }, - "成本项请求": { - "type": "object", - "required": [ - "category", - "title", - "type" - ], - "properties": { - "category": { - "type": "string", - "example": "HOTEL", - "description": "成本项类别:HOTEL/SCENIC/VEHICLE/ACTIVITY/SERVICE/DINING/OTHER" - }, - "description": { - "type": "string", - "example": "含早餐,标准双人间", - "description": "成本项描述" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序序号" - }, - "title": { - "type": "string", - "example": "丽江古城酒店住宿", - "description": "成本项标题" - }, - "type": { - "type": "string", - "example": "INCLUDED", - "description": "成本项类型:INCLUDED=费用包含 EXCLUDED=费用不含 SELF_PAY=自理费用" - } - }, - "title": "成本项请求" - }, - "成本预览VO": { - "type": "object", - "properties": { - "adultCostPrice": { - "type": "number", - "description": "成人成本价" - }, - "adultSellPrice": { - "type": "number", - "description": "成人售价" - }, - "childCostPrice": { - "type": "number", - "description": "儿童成本价" - }, - "childSellPrice": { - "type": "number", - "description": "儿童售价" - }, - "warnings": { - "type": "array", - "description": "警告信息列表", - "items": { - "type": "string" - } - } - }, - "title": "成本预览VO" - }, - "成本预览请求": { - "type": "object", - "required": [ - "date" - ], - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "成人人数(GROUP产品用)" - }, - "date": { - "type": "string", - "format": "date", - "example": "2026-05-01", - "description": "日期" - } - }, - "title": "成本预览请求" - }, - "批次服务人员分配请求": { - "type": "object", - "required": [ - "staffId", - "staffRole" - ], - "properties": { - "remark": { - "type": "string", - "example": "主导游", - "description": "备注(如:主导游、备用摄影师等)" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序序号(越小越靠前)" - }, - "staffId": { - "type": "integer", - "format": "int64", - "example": 1760000000000001, - "description": "人员ID(来自资源服务的人员库)" - }, - "staffRole": { - "type": "string", - "example": "LEADER", - "description": "在该批次中的角色:LEADER(领队)/PHOTOGRAPHER(摄影师)/DRIVER(司机)/OTHER(其他)" - } - }, - "title": "批次服务人员分配请求" - }, - "批量设置价格日历请求": { - "type": "object", - "required": [ - "endDate", - "startDate" - ], - "properties": { - "adultCostPrice": { - "type": "number", - "example": 2800.0, - "description": "成人成本价" - }, - "adultSellPrice": { - "type": "number", - "example": 3980.0, - "description": "成人售价" - }, - "childCostPrice": { - "type": "number", - "example": 1800.0, - "description": "儿童成本价" - }, - "childSellPrice": { - "type": "number", - "example": 2680.0, - "description": "儿童售价" - }, - "costAutoCalc": { - "type": "boolean", - "example": true, - "description": "是否自动计算成本" - }, - "endDate": { - "type": "string", - "format": "date", - "example": "2026-05-07", - "description": "结束日期" - }, - "remark": { - "type": "string", - "example": "五一黄金周特价", - "description": "备注" - }, - "selectedWeekdays": { - "type": "array", - "example": [ - 1, - 2, - 3, - 4, - 5 - ], - "description": "选中的星期(1=周一...7=周日),为空或包含全部则不过滤", - "items": { - "type": "integer", - "format": "int32" - } - }, - "startDate": { - "type": "string", - "format": "date", - "example": "2026-05-01", - "description": "开始日期" - }, - "status": { - "type": "string", - "example": "OPEN", - "description": "状态:OPEN=开放 CLOSED=关闭" - }, - "stock": { - "type": "integer", - "format": "int32", - "example": 30, - "description": "库存数量" - } - }, - "title": "批量设置价格日历请求" - }, - "报价结果VO": { - "type": "object", - "properties": { - "customFeeCost": { - "type": "number", - "description": "自定义费用合计(定制产品)" - }, - "dayCosts": { - "type": "array", - "description": "每日成本明细列表", - "items": { - "$ref": "#/definitions/每日成本明细", - "originalRef": "每日成本明细" - } - }, - "extraCostItems": { - "type": "array", - "description": "额外成本明细列表", - "items": { - "$ref": "#/definitions/额外成本明细项", - "originalRef": "额外成本明细项" - } - }, - "extraCostPerPerson": { - "type": "number", - "description": "每人额外成本" - }, - "extraCostTotal": { - "type": "number", - "description": "额外成本合计" - }, - "familyCosts": { - "type": "array", - "description": "家庭分组成本明细(定制产品,有分组时返回)", - "items": { - "$ref": "#/definitions/家庭成本明细", - "originalRef": "家庭成本明细" - } - }, - "grandTotalCost": { - "type": "number", - "description": "总成本合计" - }, - "grandTotalProfit": { - "type": "number", - "description": "总利润合计" - }, - "grandTotalSellPrice": { - "type": "number", - "description": "总售价合计" - }, - "insuranceFee": { - "type": "number", - "description": "保险费用" - }, - "profitRate": { - "type": "number", - "description": "利润率(百分比)" - }, - "staffCost": { - "type": "number", - "description": "人员成本" - }, - "suppliesCost": { - "type": "number", - "description": "物资成本" - }, - "totalAdultCost": { - "type": "number", - "description": "成人总成本" - }, - "totalAdultProfit": { - "type": "number", - "description": "成人总利润" - }, - "totalAdultSellPrice": { - "type": "number", - "description": "成人总售价" - }, - "totalBabyCost": { - "type": "number", - "description": "婴儿总成本" - }, - "totalBabySellPrice": { - "type": "number", - "description": "婴儿总售价" - }, - "totalChildCost": { - "type": "number", - "description": "儿童总成本" - }, - "totalChildSellPrice": { - "type": "number", - "description": "儿童总售价" - }, - "totalYoungChildCost": { - "type": "number", - "description": "小童总成本" - }, - "totalYoungChildSellPrice": { - "type": "number", - "description": "小童总售价" - }, - "warnings": { - "type": "array", - "description": "警告信息列表", - "items": { - "type": "string" - } - } - }, - "title": "报价结果VO" - }, - "报价请求": { - "type": "object", - "required": [ - "adultCount", - "departureDate" - ], - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "成人人数" - }, - "babyCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "婴儿人数(按固定 babyPrice 计算)" - }, - "childCount": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "儿童人数(占床,按儿童价计算)" - }, - "childNeedBed": { - "type": "boolean", - "example": false, - "description": "儿童是否加床(true 时额外加收 childWithBed 费用)" - }, - "departureDate": { - "type": "string", - "format": "date", - "example": "2026-05-01", - "description": "出发日期" - }, - "youngChildCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "小童人数(不占床,按儿童价 × childDiscountPercent 折扣比例计算)" - } - }, - "title": "报价请求" - }, - "更新产品线请求": { - "type": "object", - "properties": { - "coverImageUrl": { - "type": "string", - "example": "https://oss.example.com/cover.jpg", - "description": "封面图URL" - }, - "description": { - "type": "string", - "example": "丽江古城及周边精品旅游线路", - "description": "产品线描述" - }, - "name": { - "type": "string", - "example": "丽江精品线路", - "description": "产品线名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序序号" - }, - "status": { - "type": "string", - "example": "ACTIVE", - "description": "产品线状态:ACTIVE=启用 INACTIVE=停用" - } - }, - "title": "更新产品线请求" - }, - "更新产品请求": { - "type": "object", - "properties": { - "adultCount": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "成人人数" - }, - "babyCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "婴儿人数" - }, - "bookingTermsId": { - "type": "string", - "example": 1893012345678901234, - "description": "预订条款ID(关联预订条款模板)" - }, - "carouselImages": { - "type": "array", - "description": "轮播图列表", - "items": { - "type": "string" - } - }, - "carouselVideoUrl": { - "type": "string", - "example": "https://oss.example.com/video.mp4", - "description": "轮播视频URL" - }, - "chatMessages": { - "type": "array", - "description": "群聊消息列表", - "items": { - "$ref": "#/definitions/群聊消息VO", - "originalRef": "群聊消息VO" - } - }, - "childCount": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "儿童人数" - }, - "contactPhone": { - "type": "string", - "example": 13800138000, - "description": "联系电话(定制产品)" - }, - "creatorAvatarUrl": { - "type": "string", - "example": "https://oss.example.com/avatar.jpg", - "description": "定制师头像URL" - }, - "creatorIntro": { - "type": "string", - "example": "带你体验最地道的丽江风情", - "description": "创作者寄语" - }, - "customerName": { - "type": "string", - "example": "张三", - "description": "客户姓名(定制产品)" - }, - "customizerId": { - "type": "string", - "example": 1893012345678901234, - "description": "定制师ID" - }, - "departureCity": { - "type": "string", - "example": "昆明", - "description": "出发城市" - }, - "departureDate": { - "type": "string", - "format": "date", - "example": "2026-07-01", - "description": "出发日期(定制产品)" - }, - "destinationCity": { - "type": "string", - "example": "丽江", - "description": "目的地城市" - }, - "folderId": { - "type": "string", - "example": 1893012345678901234, - "description": "所属文件夹ID" - }, - "groupChatQrUrl": { - "type": "string", - "example": "https://oss.example.com/qr.jpg", - "description": "群聊二维码URL" - }, - "groupRoomId": { - "type": "string", - "description": "企微群聊ID(用于会话存档展示群消息)" - }, - "isBooking": { - "type": "boolean", - "example": false, - "description": "是否预约产品" - }, - "lineId": { - "type": "string", - "example": 1893012345678901234, - "description": "产品线ID" - }, - "lineSubtitle": { - "type": "string", - "example": "亲子游", - "description": "产品线副标题" - }, - "maxAdultPerOrder": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "每单最大成人数(不填则不限制)" - }, - "maxChildPerOrder": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "每单最大儿童数(不填则不限制)" - }, - "mchId": { - "type": "string", - "example": "shanhe", - "description": "商户号:shanhe/wenlu" - }, - "minAdultPerOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "每单最少成人数(不填默认1)" - }, - "name": { - "type": "string", - "example": "丽江5日深度游", - "description": "产品名称" - }, - "refundPolicyId": { - "type": "string", - "example": 1893012345678901234, - "description": "退款政策ID(已废弃,用refundPolicyIds替代)" - }, - "refundPolicyIds": { - "type": "object", - "example": { - "FULL": "1893012345678901234", - "DEPOSIT": "1893012345678901235" - }, - "description": "退款政策映射(按退款类型绑定不同政策)。key=退款类型(FULL/DEPOSIT/BALANCE), value=政策ID", - "additionalProperties": { - "type": "string" - } - }, - "seasons": { - "type": "array", - "description": "适用季节列表", - "items": { - "type": "string" - } - }, - "showChatGroup": { - "type": "boolean", - "example": true, - "description": "是否显示群聊入口" - }, - "showReview": { - "type": "boolean", - "example": true, - "description": "是否显示评价" - }, - "showTripDistance": { - "type": "boolean", - "example": true, - "description": "是否显示行程距离" - }, - "showTripTime": { - "type": "boolean", - "example": true, - "description": "是否显示行程时间" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序序号" - }, - "subtitle": { - "type": "string", - "example": "探访纳西文化,邂逅玉龙雪山", - "description": "副标题" - }, - "tags": { - "type": "array", - "description": "产品标签列表", - "items": { - "type": "string" - } - }, - "teamExperienceYears": { - "type": "integer", - "format": "int32", - "example": 10, - "description": "团队经验年数" - }, - "tripDays": { - "type": "integer", - "format": "int32", - "example": 5, - "description": "行程天数" - }, - "warmTipsId": { - "type": "string", - "example": 1893012345678901234, - "description": "温馨提示ID(关联温馨提示模板)" - }, - "youngChildCount": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "小童人数" - } - }, - "title": "更新产品请求" - }, - "更新拼团批次请求": { - "type": "object", - "properties": { - "adultsPerRoom": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "每间房入住成人数(默认2,用于计算单房差)" - }, - "batchName": { - "type": "string", - "example": "7月20日第1批", - "description": "批次名称" - }, - "departureDate": { - "type": "string", - "format": "date", - "example": "2026-07-20", - "description": "出发日期" - }, - "enrollmentDeadline": { - "type": "string", - "format": "date", - "example": "2026-07-15", - "description": "报名截止日期" - }, - "maxParticipants": { - "type": "integer", - "format": "int32", - "example": 30, - "description": "最大参团人数(不能低于已报名人数)" - }, - "maxRooms": { - "type": "integer", - "format": "int32", - "example": 15, - "description": "总房间数(不能低于已预订房间数)" - }, - "minParticipants": { - "type": "integer", - "format": "int32", - "example": 10, - "description": "最低成团人数(0=不限制)" - }, - "remark": { - "type": "string", - "description": "备注说明" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - } - }, - "title": "更新拼团批次请求" - }, - "更新文件夹请求": { - "type": "object", - "properties": { - "name": { - "type": "string", - "example": "国内线路", - "description": "文件夹名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "排序序号" - } - }, - "title": "更新文件夹请求" - }, - "更新行程节点请求": { - "type": "object", - "properties": { - "description": { - "type": "string", - "example": "漫步古城,感受纳西文化", - "description": "节点描述" - }, - "distanceKm": { - "type": "number", - "example": 15.5, - "description": "距离(公里)" - }, - "durationMinutes": { - "type": "integer", - "format": "int32", - "example": 120, - "description": "时长(分钟)" - }, - "emojiIcon": { - "type": "string", - "example": "city_sunset", - "description": "表情图标" - }, - "extraData": { - "type": "string", - "description": "扩展数据(JSON格式)" - }, - "familyIds": { - "type": "array", - "description": "所属家庭ID列表(定制产品按家庭分配)", - "items": { - "type": "string" - } - }, - "images": { - "type": "array", - "description": "节点图片列表", - "items": { - "type": "string" - } - }, - "latitude": { - "type": "number", - "example": 26.872108, - "description": "纬度" - }, - "longitude": { - "type": "number", - "example": 100.233026, - "description": "经度" - }, - "nodeName": { - "type": "string", - "example": "丽江古城游览", - "description": "节点名称" - }, - "nodeType": { - "type": "string", - "example": "SCENIC", - "description": "节点类型:TRANSPORT(交通)/SCENIC(景区)/RESTAURANT(餐厅)/ACTIVITY(活动)/PHOTOGRAPHY(摄影)/HOTEL(酒店)/FREE(自由活动)/CUSTOM(自定义)/SERVICE(服务)/NOTE(备注)" - }, - "quantity": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "数量" - }, - "resourceId": { - "type": "string", - "example": 1893012345678901234, - "description": "关联资源ID" - }, - "resourceType": { - "type": "string", - "example": "SCENIC", - "description": "关联资源类型:SCENIC/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE/STAFF" - }, - "startTime": { - "type": "string", - "example": "09:00", - "description": "开始时间" - } - }, - "title": "更新行程节点请求" - }, - "权益分组": { - "type": "object", - "properties": { - "items": { - "type": "array", - "description": "权益项列表", - "items": { - "$ref": "#/definitions/权益项", - "originalRef": "权益项" - } - }, - "title": { - "type": "string", - "description": "分组标题,如:儿童权益 (1.2m以下)" - } - }, - "title": "权益分组" - }, - "权益项": { - "type": "object", - "properties": { - "category": { - "type": "string", - "description": "类别,如:门票、住宿、餐饮" - }, - "description": { - "type": "string", - "description": "说明,如:含全部景点儿童票" - } - }, - "title": "权益项" - }, - "步骤执行结果": { - "type": "object", - "properties": { - "errorMessage": { - "type": "string", - "description": "错误信息" - }, - "executionTimeMs": { - "type": "integer", - "format": "int64", - "description": "执行耗时(毫秒)" - }, - "expression": { - "type": "string", - "description": "表达式" - }, - "outputValue": { - "type": "object", - "description": "输出值" - }, - "outputVar": { - "type": "string", - "description": "输出变量名" - }, - "stepCode": { - "type": "string", - "description": "步骤编码" - }, - "stepName": { - "type": "string", - "description": "步骤名称" - }, - "success": { - "type": "boolean", - "description": "是否成功" - } - }, - "title": "步骤执行结果" - }, - "每人成本明细": { - "type": "object", - "properties": { - "activityCost": { - "type": "number", - "description": "活动成本" - }, - "babyCost": { - "type": "number", - "description": "婴儿固定成本" - }, - "customFeeCost": { - "type": "number", - "description": "自定义费用成本" - }, - "extraCost": { - "type": "number", - "description": "额外成本" - }, - "hotelCost": { - "type": "number", - "description": "酒店成本" - }, - "insuranceCost": { - "type": "number", - "description": "保险成本" - }, - "label": { - "type": "string", - "description": "人员标签(如 成人1、儿童1、婴儿1)" - }, - "personType": { - "type": "string", - "description": "人员类型:ADULT/CHILD/YOUNG_CHILD/BABY" - }, - "scenicCost": { - "type": "number", - "description": "景区成本" - }, - "serviceCost": { - "type": "number", - "description": "服务成本" - }, - "staffCost": { - "type": "number", - "description": "人员成本" - }, - "suppliesCost": { - "type": "number", - "description": "物资成本" - }, - "totalCost": { - "type": "number", - "description": "个人成本合计" - }, - "vehicleCost": { - "type": "number", - "description": "车辆成本" - } - }, - "title": "每人成本明细" - }, - "每日成本明细": { - "type": "object", - "properties": { - "activityCost": { - "type": "number", - "description": "活动成本" - }, - "dayCostTotal": { - "type": "number", - "description": "当日成本合计" - }, - "dayNumber": { - "type": "integer", - "format": "int32", - "description": "天数编号" - }, - "diningCost": { - "type": "number", - "description": "餐饮成本" - }, - "extraCost": { - "type": "number", - "description": "额外成本" - }, - "hotelCost": { - "type": "number", - "description": "酒店成本(整间价)" - }, - "scenicCost": { - "type": "number", - "description": "景区成本" - }, - "serviceCost": { - "type": "number", - "description": "服务成本" - }, - "singleRoomSupplement": { - "type": "number", - "description": "单房差(当日酒店成本÷每房成人数,GROUP产品专用)" - }, - "staffCost": { - "type": "number", - "description": "人员成本" - }, - "vehicleCost": { - "type": "number", - "description": "车辆成本" - } - }, - "title": "每日成本明细" - }, - "每日酒店VO": { - "type": "object", - "properties": { - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "dayNumber": { - "type": "integer", - "format": "int32", - "description": "天数编号" - }, - "familyIds": { - "type": "array", - "description": "所属家庭ID列表(NULL=所有家庭共享)", - "items": { - "type": "string" - } - }, - "familyRoomConfig": { - "type": "object", - "description": "家庭房间分配:{familyId: roomCount}", - "additionalProperties": { - "type": "integer", - "format": "int32" - } - }, - "hotelId": { - "type": "string", - "description": "酒店ID" - }, - "hotelName": { - "type": "string", - "description": "酒店名称" - }, - "id": { - "type": "string", - "description": "记录ID" - }, - "isDefault": { - "type": "boolean", - "description": "是否默认酒店" - }, - "roomCount": { - "type": "integer", - "format": "int32", - "description": "房间数量" - }, - "roomTypeId": { - "type": "string", - "description": "房型ID" - }, - "roomTypeName": { - "type": "string", - "description": "房型名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - } - }, - "title": "每日酒店VO" - }, - "每日酒店配置请求": { - "type": "object", - "required": [ - "hotelId" - ], - "properties": { - "coverUrl": { - "type": "string", - "example": "https://oss.example.com/hotel-cover.jpg", - "description": "封面图URL" - }, - "familyIds": { - "type": "array", - "description": "所属家庭ID列表(定制产品,不传=所有家庭共享)", - "items": { - "type": "string" - } - }, - "familyRoomConfig": { - "type": "object", - "description": "家庭房间分配(定制产品):{familyId: roomCount},如 {\"123\": 2, \"456\": 1}", - "additionalProperties": { - "type": "integer", - "format": "int32" - } - }, - "hotelId": { - "type": "string", - "example": 1893012345678901234, - "description": "酒店ID" - }, - "hotelName": { - "type": "string", - "example": "丽江和府洲际度假酒店", - "description": "酒店名称" - }, - "isDefault": { - "type": "boolean", - "example": true, - "description": "是否默认酒店" - }, - "roomCount": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "房间数量" - }, - "roomTypeId": { - "type": "string", - "example": 1893012345678901234, - "description": "关联房型ID(定制产品必填,核心产品为空)" - }, - "roomTypeName": { - "type": "string", - "example": "豪华山景大床房", - "description": "房型名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序序号" - } - }, - "title": "每日酒店配置请求" - }, - "温馨提示VO": { - "type": "object", - "properties": { - "content": { - "type": "string", - "description": "提示内容(富文本)" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "integer", - "format": "int64", - "description": "创建人ID" - }, - "enabled": { - "type": "boolean", - "description": "是否启用" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "tipsId": { - "type": "integer", - "format": "int64", - "description": "温馨提示ID" - }, - "tipsName": { - "type": "string", - "description": "提示名称" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "温馨提示VO" - }, - "温馨提示请求": { - "type": "object", - "required": [ - "content", - "tipsName" - ], - "properties": { - "content": { - "type": "string", - "description": "提示内容(富文本)" - }, - "remark": { - "type": "string", - "example": "适用于草原类产品", - "description": "备注" - }, - "tipsName": { - "type": "string", - "example": "草原游温馨提示", - "description": "提示名称" - } - }, - "title": "温馨提示请求" - }, - "物资配置请求": { - "type": "object", - "required": [ - "suppliesId" - ], - "properties": { - "billingType": { - "type": "string", - "example": "BY_PERSON", - "description": "计费方式:BY_PERSON=按人头 BY_COUNT=按次/按件" - }, - "costPerPerson": { - "type": "number", - "example": 30.0, - "description": "每人成本" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "dayNumber": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "天数编号(scope=DAY时生效)" - }, - "familyIds": { - "type": "array", - "description": "所属家庭ID列表(定制产品按家庭分配)", - "items": { - "type": "string" - } - }, - "quantity": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "数量" - }, - "scope": { - "type": "string", - "example": "ALL", - "description": "适用范围:ALL=整个行程 DAY=指定天" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序序号" - }, - "suppliesId": { - "type": "string", - "example": 1893012345678901234, - "description": "物资ID" - }, - "suppliesName": { - "type": "string", - "example": "登山杖", - "description": "物资名称" - } - }, - "title": "物资配置请求" - }, - "用餐选项VO": { - "type": "object", - "properties": { - "coverUrl": { - "type": "string", - "description": "餐食封面图URL" - }, - "dayNumber": { - "type": "integer", - "format": "int32", - "description": "天数编号" - }, - "id": { - "type": "string", - "description": "记录ID" - }, - "mealTypes": { - "type": "string", - "description": "餐次:早餐/午餐/晚餐" - }, - "priceInfo": { - "type": "string", - "description": "价格信息" - }, - "quantity": { - "type": "integer", - "format": "int32", - "description": "数量" - }, - "restaurantId": { - "type": "string", - "description": "餐厅ID" - }, - "restaurantName": { - "type": "string", - "description": "餐厅/餐食名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "unitPrice": { - "type": "number", - "description": "餐食单价(元)" - } - }, - "title": "用餐选项VO" - }, - "用餐选项请求": { - "type": "object", - "properties": { - "coverUrl": { - "type": "string", - "example": "https://oss.example.com/meal.jpg", - "description": "餐食封面图URL" - }, - "mealTypes": { - "type": "string", - "example": "午餐", - "description": "餐次:早餐/午餐/晚餐" - }, - "priceInfo": { - "type": "string", - "example": "人均80元", - "description": "价格信息" - }, - "quantity": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "数量" - }, - "restaurantId": { - "type": "string", - "example": 1893012345678901234, - "description": "餐厅ID(GROUP产品可不传)" - }, - "restaurantName": { - "type": "string", - "example": "纳西风味餐厅", - "description": "餐厅/餐食名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序序号" - }, - "unitPrice": { - "type": "number", - "example": 80.0, - "description": "餐食单价(元,GROUP产品用于成本计算)" - } - }, - "title": "用餐选项请求" - }, - "统一响应结果«GROUP产品报价结果»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/GROUP产品报价结果", - "originalRef": "GROUP产品报价结果" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«GROUP产品报价结果»" - }, - "统一响应结果«List«产品人员配置VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/产品人员配置VO", - "originalRef": "产品人员配置VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«产品人员配置VO»»" - }, - "统一响应结果«List«产品价格日历VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/产品价格日历VO", - "originalRef": "产品价格日历VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«产品价格日历VO»»" - }, - "统一响应结果«List«产品成本项VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/产品成本项VO", - "originalRef": "产品成本项VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«产品成本项VO»»" - }, - "统一响应结果«List«产品文件夹VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/产品文件夹VO", - "originalRef": "产品文件夹VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«产品文件夹VO»»" - }, - "统一响应结果«List«产品物资VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/产品物资VO", - "originalRef": "产品物资VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«产品物资VO»»" - }, - "统一响应结果«List«产品线VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/产品线VO", - "originalRef": "产品线VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«产品线VO»»" - }, - "统一响应结果«List«产品自定义费用项VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/产品自定义费用项VO", - "originalRef": "产品自定义费用项VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«产品自定义费用项VO»»" - }, - "统一响应结果«List«产品额外成本VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/产品额外成本VO", - "originalRef": "产品额外成本VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«产品额外成本VO»»" - }, - "统一响应结果«List«公式变量VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/公式变量VO", - "originalRef": "公式变量VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«公式变量VO»»" - }, - "统一响应结果«List«公式步骤VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/公式步骤VO", - "originalRef": "公式步骤VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«公式步骤VO»»" - }, - "统一响应结果«List«公式版本历史VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/公式版本历史VO", - "originalRef": "公式版本历史VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«公式版本历史VO»»" - }, - "统一响应结果«List«公式组VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/公式组VO", - "originalRef": "公式组VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«公式组VO»»" - }, - "统一响应结果«List«团批次VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/团批次VO", - "originalRef": "团批次VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«团批次VO»»" - }, - "统一响应结果«List«团批次服务人员VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/团批次服务人员VO", - "originalRef": "团批次服务人员VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«团批次服务人员VO»»" - }, - "统一响应结果«List«家庭分组VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/家庭分组VO", - "originalRef": "家庭分组VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«家庭分组VO»»" - }, - "统一响应结果«List«每日酒店VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/每日酒店VO", - "originalRef": "每日酒店VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«每日酒店VO»»" - }, - "统一响应结果«List«温馨提示VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/温馨提示VO", - "originalRef": "温馨提示VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«温馨提示VO»»" - }, - "统一响应结果«List«用餐选项VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/用餐选项VO", - "originalRef": "用餐选项VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«用餐选项VO»»" - }, - "统一响应结果«List«行政区划搜索结果»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/行政区划搜索结果", - "originalRef": "行政区划搜索结果" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«行政区划搜索结果»»" - }, - "统一响应结果«List«行程天VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/行程天VO", - "originalRef": "行程天VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«行程天VO»»" - }, - "统一响应结果«List«行程节点VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/行程节点VO", - "originalRef": "行程节点VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«行程节点VO»»" - }, - "统一响应结果«List«预订条款VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/预订条款VO", - "originalRef": "预订条款VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«预订条款VO»»" - }, - "统一响应结果«Map«string,object»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "object", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Map«string,object»»" - }, - "统一响应结果«Void»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Void»" - }, - "统一响应结果«string»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "string", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«string»" - }, - "统一响应结果«产品人员配置VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/产品人员配置VO", - "originalRef": "产品人员配置VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«产品人员配置VO»" - }, - "统一响应结果«产品价格日历VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/产品价格日历VO", - "originalRef": "产品价格日历VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«产品价格日历VO»" - }, - "统一响应结果«产品定价配置VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/产品定价配置VO", - "originalRef": "产品定价配置VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«产品定价配置VO»" - }, - "统一响应结果«产品成本项VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/产品成本项VO", - "originalRef": "产品成本项VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«产品成本项VO»" - }, - "统一响应结果«产品文件夹VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/产品文件夹VO", - "originalRef": "产品文件夹VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«产品文件夹VO»" - }, - "统一响应结果«产品物资VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/产品物资VO", - "originalRef": "产品物资VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«产品物资VO»" - }, - "统一响应结果«产品线VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/产品线VO", - "originalRef": "产品线VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«产品线VO»" - }, - "统一响应结果«产品自定义费用项VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/产品自定义费用项VO", - "originalRef": "产品自定义费用项VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«产品自定义费用项VO»" - }, - "统一响应结果«产品详情VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/产品详情VO", - "originalRef": "产品详情VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«产品详情VO»" - }, - "统一响应结果«产品额外成本VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/产品额外成本VO", - "originalRef": "产品额外成本VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«产品额外成本VO»" - }, - "统一响应结果«公式变量VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/公式变量VO", - "originalRef": "公式变量VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«公式变量VO»" - }, - "统一响应结果«公式步骤VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/公式步骤VO", - "originalRef": "公式步骤VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«公式步骤VO»" - }, - "统一响应结果«公式测试结果VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/公式测试结果VO", - "originalRef": "公式测试结果VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«公式测试结果VO»" - }, - "统一响应结果«公式组VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/公式组VO", - "originalRef": "公式组VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«公式组VO»" - }, - "统一响应结果«分享链接响应»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分享链接响应", - "originalRef": "分享链接响应" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分享链接响应»" - }, - "统一响应结果«分页结果«C端产品列表VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«C端产品列表VO»", - "originalRef": "分页结果«C端产品列表VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«C端产品列表VO»»" - }, - "统一响应结果«分页结果«产品列表VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«产品列表VO»", - "originalRef": "分页结果«产品列表VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«产品列表VO»»" - }, - "统一响应结果«分页结果«产品线VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«产品线VO»", - "originalRef": "分页结果«产品线VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«产品线VO»»" - }, - "统一响应结果«团批次VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/团批次VO", - "originalRef": "团批次VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«团批次VO»" - }, - "统一响应结果«团批次详情VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/团批次详情VO", - "originalRef": "团批次详情VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«团批次详情VO»" - }, - "统一响应结果«家庭分组VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/家庭分组VO", - "originalRef": "家庭分组VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«家庭分组VO»" - }, - "统一响应结果«成本预览VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/成本预览VO", - "originalRef": "成本预览VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«成本预览VO»" - }, - "统一响应结果«报价结果VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/报价结果VO", - "originalRef": "报价结果VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«报价结果VO»" - }, - "统一响应结果«每日酒店VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/每日酒店VO", - "originalRef": "每日酒店VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«每日酒店VO»" - }, - "统一响应结果«温馨提示VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/温馨提示VO", - "originalRef": "温馨提示VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«温馨提示VO»" - }, - "统一响应结果«用餐选项VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/用餐选项VO", - "originalRef": "用餐选项VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«用餐选项VO»" - }, - "统一响应结果«行程天VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/行程天VO", - "originalRef": "行程天VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«行程天VO»" - }, - "统一响应结果«行程节点VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/行程节点VO", - "originalRef": "行程节点VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«行程节点VO»" - }, - "统一响应结果«预订条款VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/预订条款VO", - "originalRef": "预订条款VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«预订条款VO»" - }, - "群聊消息VO": { - "type": "object", - "properties": { - "avatar": { - "type": "string", - "description": "用户头像URL(type=user时有效)" - }, - "text": { - "type": "string", - "description": "消息内容" - }, - "type": { - "type": "string", - "description": "消息类型: user/creator" - } - }, - "title": "群聊消息VO" - }, - "自定义费用项请求": { - "type": "object", - "required": [ - "feeName" - ], - "properties": { - "description": { - "type": "string", - "example": "含专车接机及导游服务", - "description": "费用说明" - }, - "familyIds": { - "type": "array", - "description": "所属家庭ID列表(定制产品按家庭分配)", - "items": { - "type": "string" - } - }, - "feeAmount": { - "type": "number", - "example": 200.0, - "description": "费用金额" - }, - "feeName": { - "type": "string", - "example": "接机服务费", - "description": "费用项名称" - }, - "feeUnit": { - "type": "string", - "example": "元/人", - "description": "费用单位" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序序号" - } - }, - "title": "自定义费用项请求" - }, - "节点排序请求": { - "type": "object", - "required": [ - "nodeIds" - ], - "properties": { - "nodeIds": { - "type": "array", - "description": "节点ID有序列表,按期望排序顺序排列", - "items": { - "type": "string" - } - } - }, - "title": "节点排序请求" - }, - "节点移动请求": { - "type": "object", - "required": [ - "targetDayNumber" - ], - "properties": { - "targetDayNumber": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "目标天数编号" - } - }, - "title": "节点移动请求" - }, - "行政区划搜索结果": { - "type": "object", - "properties": { - "adcode": { - "type": "string", - "description": "行政区编码" - }, - "fullPath": { - "type": "string", - "description": "全路径(省/市/区/镇,用于显示区分重名)" - }, - "level": { - "type": "string", - "description": "级别: city/district/street" - }, - "levelName": { - "type": "string", - "description": "级别中文名: 市/区/县/镇/乡/街道" - }, - "name": { - "type": "string", - "description": "行政区名称(最后一级,用于保存)" - } - }, - "title": "行政区划搜索结果" - }, - "行程天VO": { - "type": "object", - "properties": { - "dayId": { - "type": "string", - "description": "行程天ID" - }, - "dayNumber": { - "type": "integer", - "format": "int32", - "description": "天数编号" - }, - "dayTitle": { - "type": "string", - "description": "天标题" - }, - "hotels": { - "type": "array", - "description": "当日酒店列表", - "items": { - "$ref": "#/definitions/每日酒店VO", - "originalRef": "每日酒店VO" - } - }, - "nodes": { - "type": "array", - "description": "行程节点列表", - "items": { - "$ref": "#/definitions/行程节点VO", - "originalRef": "行程节点VO" - } - }, - "restaurants": { - "type": "array", - "description": "当日用餐列表", - "items": { - "$ref": "#/definitions/用餐选项VO", - "originalRef": "用餐选项VO" - } - }, - "routeSummary": { - "type": "string", - "description": "路线概览" - } - }, - "title": "行程天VO" - }, - "行程天请求": { - "type": "object", - "properties": { - "dayTitle": { - "type": "string", - "example": "Day1 丽江古城漫步", - "description": "天标题" - }, - "routeSummary": { - "type": "string", - "example": "丽江古城 → 束河古镇 → 白沙古镇", - "description": "路线概览" - } - }, - "title": "行程天请求" - }, - "行程节点VO": { - "type": "object", - "properties": { - "costPrice": { - "type": "number", - "description": "资源成本价(来自资源价格日历)" - }, - "dayId": { - "type": "string", - "description": "所属行程天ID" - }, - "description": { - "type": "string", - "description": "节点描述" - }, - "distanceKm": { - "type": "number", - "description": "距离(公里)" - }, - "durationMinutes": { - "type": "integer", - "format": "int32", - "description": "时长(分钟)" - }, - "emojiIcon": { - "type": "string", - "description": "表情图标" - }, - "extraData": { - "type": "string", - "description": "扩展数据(JSON格式)" - }, - "familyIds": { - "type": "array", - "description": "所属家庭ID列表(定制产品按家庭分配)", - "items": { - "type": "string" - } - }, - "images": { - "type": "array", - "description": "节点图片列表", - "items": { - "type": "string" - } - }, - "latitude": { - "type": "number", - "description": "纬度" - }, - "longitude": { - "type": "number", - "description": "经度" - }, - "nodeId": { - "type": "string", - "description": "节点ID" - }, - "nodeName": { - "type": "string", - "description": "节点名称" - }, - "nodeType": { - "type": "string", - "description": "节点类型:TRANSPORT(交通)/SCENIC(景区)/RESTAURANT(餐厅)/ACTIVITY(活动)/PHOTOGRAPHY(摄影)/HOTEL(酒店)/FREE(自由活动)/CUSTOM(自定义)/SERVICE(服务)/NOTE(备注)" - }, - "quantity": { - "type": "integer", - "format": "int32", - "description": "数量" - }, - "resourceDetail": { - "description": "绑定资源的详细信息(含图片、地址等)", - "$ref": "#/definitions/资源详情", - "originalRef": "资源详情" - }, - "resourceId": { - "type": "string", - "description": "关联资源ID" - }, - "resourceName": { - "type": "string", - "description": "关联资源名称" - }, - "resourceType": { - "type": "string", - "description": "关联资源类型:SCENIC/HOTEL/RESTAURANT/ACTIVITY/VEHICLE/SERVICE/STAFF" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "startTime": { - "type": "string", - "description": "开始时间" - } - }, - "title": "行程节点VO" - }, - "解散批次请求": { - "type": "object", - "required": [ - "reason" - ], - "properties": { - "reason": { - "type": "string", - "example": "报名人数不足", - "description": "解散原因(如:报名人数不足、行程调整等)" - } - }, - "title": "解散批次请求" - }, - "资源详情": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "地址" - }, - "city": { - "type": "string", - "description": "所在城市" - }, - "cover": { - "type": "string", - "description": "封面图URL" - }, - "description": { - "type": "string", - "description": "简介/描述" - }, - "featureIntro": { - "type": "string", - "description": "图文详情(featureIntro JSON)" - }, - "images": { - "type": "array", - "description": "图片URL列表(轮播图)", - "items": { - "type": "string" - } - }, - "latitude": { - "type": "number", - "description": "纬度" - }, - "longitude": { - "type": "number", - "description": "经度" - }, - "name": { - "type": "string", - "description": "资源名称" - }, - "rating": { - "type": "number", - "description": "评分" - }, - "resourceId": { - "type": "string", - "description": "资源ID" - }, - "resourceType": { - "type": "string", - "description": "资源类型: SCENIC_SPOT/HOTEL/RESTAURANT/ACTIVITY" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "type": "string" - } - } - }, - "title": "资源详情" - }, - "预订条款VO": { - "type": "object", - "properties": { - "content": { - "type": "string", - "description": "条款内容(富文本)" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "integer", - "format": "int64", - "description": "创建人ID" - }, - "enabled": { - "type": "boolean", - "description": "是否启用" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "termsId": { - "type": "integer", - "format": "int64", - "description": "预订条款ID" - }, - "termsName": { - "type": "string", - "description": "条款名称" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "预订条款VO" - }, - "预订条款请求": { - "type": "object", - "required": [ - "content", - "termsName" - ], - "properties": { - "content": { - "type": "string", - "description": "条款内容(富文本)" - }, - "remark": { - "type": "string", - "example": "适用于所有国内游产品", - "description": "备注" - }, - "termsName": { - "type": "string", - "example": "国内游预订条款", - "description": "条款名称" - } - }, - "title": "预订条款请求" - }, - "额外成本明细项": { - "type": "object", - "properties": { - "costItemName": { - "type": "string", - "description": "成本项名称" - }, - "daily": { - "type": "boolean", - "description": "是否按天计算" - }, - "days": { - "type": "integer", - "format": "int32", - "description": "天数(按天计算时)" - }, - "quantity": { - "type": "integer", - "format": "int32", - "description": "数量" - }, - "subtotal": { - "type": "number", - "description": "小计金额" - }, - "unitPrice": { - "type": "number", - "description": "单价" - } - }, - "title": "额外成本明细项" - }, - "额外成本请求": { - "type": "object", - "required": [ - "costItemId" - ], - "properties": { - "costItemId": { - "type": "integer", - "format": "int64", - "example": 1893012345678901234, - "description": "额外成本项ID(关联费用项资源)" - }, - "daily": { - "type": "boolean", - "example": true, - "description": "是否按天计算:true=按天计算(乘以天数) false=整个行程一次" - }, - "familyIds": { - "type": "array", - "description": "所属家庭ID列表(定制产品按家庭分配)", - "items": { - "type": "string" - } - }, - "quantity": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "数量" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序序号" - } - }, - "title": "额外成本请求" - } - } -} \ No newline at end of file diff --git a/.swagger/hl-resource-service.json b/.swagger/hl-resource-service.json deleted file mode 100644 index 7beaa0f..0000000 --- a/.swagger/hl-resource-service.json +++ /dev/null @@ -1,24455 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "资源服务", - "version": "1.0.0" - }, - "basePath": "/", - "paths": { - "/admin/scenic/spot": { - "post": { - "tags": [ - "景区管理" - ], - "summary": "创建景区", - "description": "新建一个景区资源,初始状态为下架(status=0)。创建后需通过「提交启用审批」接口走企微OA审批流程才能上架。支持富文本字段(featureIntro/detailContent等),素材ID从素材库获取。\n\n**关联字典**:\n- scenic_facility:景区设施(表单多选)\n- scenic_honor:景区荣誉(表单多选)", - "operationId": "createSpotUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "景区创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/景区创建请求", - "originalRef": "景区创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«景区详情»", - "originalRef": "统一响应结果«景区详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«景区详情»", - "originalRef": "统一响应结果«景区详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/scenic/spot/{scenicId}": { - "get": { - "tags": [ - "景区管理" - ], - "summary": "景区详情", - "description": "获取景区完整信息,包含富文本内容、素材URL、标签列表、季节内容等。素材ID会自动解析为OSS访问地址。\n\n**关联字典**:\n- scenic_facility:景区设施(详情显示)\n- scenic_honor:景区荣誉(详情显示)", - "operationId": "getSpotUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "scenicId", - "in": "path", - "description": "景区ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«景区详情»", - "originalRef": "统一响应结果«景区详情»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«景区详情»", - "originalRef": "统一响应结果«景区详情»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "景区管理" - ], - "summary": "更新景区", - "description": "更新景区基本信息和富文本内容。更新不会改变当前状态。如果景区已上架,修改后仍保持上架状态,无需重新审批。\n\n**关联字典**:\n- scenic_facility:景区设施(表单多选)\n- scenic_honor:景区荣誉(表单多选)", - "operationId": "updateSpotUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "景区更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/景区更新请求", - "originalRef": "景区更新请求" - } - }, - { - "name": "scenicId", - "in": "path", - "description": "景区ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«景区详情»", - "originalRef": "统一响应结果«景区详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«景区详情»", - "originalRef": "统一响应结果«景区详情»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "景区管理" - ], - "summary": "删除景区", - "description": "软删除景区(设置deleted_at)。仅SUPER_ADMIN角色或创建者本人可删除。已上架的景区需先下架再删除。删除后会同时清理关联的素材引用。", - "operationId": "deleteSpotUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "scenicId", - "in": "path", - "description": "景区ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/scenic/spot/{scenicId}/prices": { - "get": { - "tags": [ - "景区价格日历" - ], - "summary": "查询价格日历", - "description": "按月查询景区的每日价格和可售状态。返回指定年月中所有已设置价格的日期,未设置的日期不返回。用于前端日历组件渲染。", - "operationId": "getPriceCalendarUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "month", - "in": "query", - "description": "月份", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "scenicId", - "in": "path", - "description": "景区ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "year", - "in": "query", - "description": "年份", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«价格日历月视图»", - "originalRef": "统一响应结果«价格日历月视图»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«价格日历月视图»", - "originalRef": "统一响应结果«价格日历月视图»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "景区价格日历" - ], - "summary": "批量设置价格", - "description": "在指定日期范围内批量设置成本价、库存和可售状态。支持weekdayOnly/weekendOnly/selectedWeekdays过滤特定星期,支持excludeDates排除特定日期。已有价格的日期会被覆盖更新。", - "operationId": "batchSetPricesUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "价格日历设置请求", - "required": false, - "schema": { - "$ref": "#/definitions/价格日历批量设置请求", - "originalRef": "价格日历批量设置请求" - } - }, - { - "name": "scenicId", - "in": "path", - "description": "景区ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "景区价格日历" - ], - "summary": "批量清除价格", - "description": "删除指定日期范围内的所有价格记录。删除后该日期范围将显示为未设置状态。日期格式:yyyy-MM-dd。", - "operationId": "deletePricesUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "endDate", - "in": "query", - "description": "结束日期", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "scenicId", - "in": "path", - "description": "景区ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "startDate", - "in": "query", - "description": "开始日期", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/scenic/spot/{scenicId}/prices/status": { - "put": { - "tags": [ - "景区价格日历" - ], - "summary": "批量修改可售状态", - "description": "批量修改指定日期范围内的可售状态,不影响价格和库存。status=0不可售,status=1可售。用于临时关闭/开放某些日期的售卖。", - "operationId": "batchUpdateStatusUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "价格日历状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/价格日历状态变更请求", - "originalRef": "价格日历状态变更请求" - } - }, - { - "name": "scenicId", - "in": "path", - "description": "景区ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/scenic/spot/{scenicId}/season/{seasonType}": { - "put": { - "tags": [ - "景区季节内容" - ], - "summary": "保存/更新季节内容", - "description": "创建或更新指定景区的季节内容。seasonType为季节标识(如spring/summer/autumn/winter)。如果该季节已存在则更新,不存在则创建。支持设置季节别名(如「樱花季」)、月份范围、独立封面和轮播图。", - "operationId": "saveSeasonUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "季节内容保存请求", - "required": false, - "schema": { - "$ref": "#/definitions/景区季节保存请求", - "originalRef": "景区季节保存请求" - } - }, - { - "name": "scenicId", - "in": "path", - "description": "景区ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "seasonType", - "in": "path", - "description": "季节类型", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«景区季节内容»", - "originalRef": "统一响应结果«景区季节内容»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«景区季节内容»", - "originalRef": "统一响应结果«景区季节内容»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "景区季节内容" - ], - "summary": "删除季节内容", - "description": "删除指定景区的某个季节内容,同时清理关联的素材引用。", - "operationId": "deleteSeasonUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "scenicId", - "in": "path", - "description": "景区ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "seasonType", - "in": "path", - "description": "季节类型", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/scenic/spot/{scenicId}/seasons": { - "get": { - "tags": [ - "景区季节内容" - ], - "summary": "获取景区全部季节内容", - "description": "返回景区的所有季节内容列表(春/夏/秋/冬)。季节内容是景区独有功能,其他资源类型没有此概念。每个季节可设置独立的封面、轮播图、亮点描述和游玩攻略。", - "operationId": "getSeasonsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "scenicId", - "in": "path", - "description": "景区ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«景区季节内容»»", - "originalRef": "统一响应结果«List«景区季节内容»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«景区季节内容»»", - "originalRef": "统一响应结果«List«景区季节内容»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/scenic/spot/{scenicId}/status": { - "put": { - "tags": [ - "景区管理" - ], - "summary": "上下架切换", - "description": "直接修改景区状态(跳过审批流程),仅限SUPER_ADMIN使用。普通管理员应使用「提交启用/禁用审批」接口。状态值:0=下架,1=上架。", - "operationId": "updateStatusUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "景区状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/景区状态变更请求", - "originalRef": "景区状态变更请求" - } - }, - { - "name": "scenicId", - "in": "path", - "description": "景区ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/scenic/spot/{scenicId}/submit-approval": { - "post": { - "tags": [ - "景区管理" - ], - "summary": "提交启用/禁用审批", - "description": "向企微OA提交审批申请。targetStatus=1表示申请上架,targetStatus=2表示申请下架。提交后景区进入PENDING_APPROVAL状态,企微审批通过/拒绝后通过回调自动更新状态。返回企微审批单号spNo。同一景区不可重复提交未完成的审批。", - "operationId": "submitApprovalUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "审批提交请求", - "required": false, - "schema": { - "$ref": "#/definitions/审批提交请求", - "originalRef": "审批提交请求" - } - }, - { - "name": "scenicId", - "in": "path", - "description": "景区ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/scenic/spot/{scenicId}/tags": { - "put": { - "tags": [ - "景区标签管理" - ], - "summary": "更新景区标签", - "description": "全量替换指定景区的标签列表。传入tagIds为该景区最终要关联的标签ID列表,为空则清除所有标签。", - "operationId": "updateScenicTagsUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "景区标签更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/景区标签更新请求", - "originalRef": "景区标签更新请求" - } - }, - { - "name": "scenicId", - "in": "path", - "description": "景区ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/scenic/spots": { - "get": { - "tags": [ - "景区管理" - ], - "summary": "景区列表", - "description": "分页查询景区列表,支持按名称关键词、状态(0下架/1上架)、城市等条件筛选。返回列表摘要信息(不含富文本详情),按sortOrder倒序+创建时间倒序排列。\n\n**关联字典**:\n- scenic_facility:景区设施(列表显示)\n- scenic_honor:景区荣誉(列表显示)", - "operationId": "listSpotsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "city", - "in": "query", - "description": "城市筛选(行政区划)", - "required": false, - "type": "string", - "x-example": "杭州市" - }, - { - "name": "cityKeyword", - "in": "query", - "description": "城市/区域关键词模糊搜索(匹配城市名、省份、地址)", - "required": false, - "type": "string", - "x-example": "海拉尔" - }, - { - "name": "cityName", - "in": "query", - "description": "城市名称筛选(展示用)", - "required": false, - "type": "string", - "x-example": "杭州" - }, - { - "name": "facility", - "in": "query", - "description": "设施编码筛选", - "required": false, - "type": "string", - "x-example": "parking" - }, - { - "name": "keyword", - "in": "query", - "description": "搜索关键词(名称/地址模糊匹配)", - "required": false, - "type": "string", - "x-example": "西湖" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 20 - }, - { - "name": "province", - "in": "query", - "description": "省份筛选", - "required": false, - "type": "string", - "x-example": "浙江省" - }, - { - "name": "sortBy", - "in": "query", - "description": "排序字段:name/rating/viewCount/sortOrder/createdAt", - "required": false, - "type": "string", - "x-example": "sortOrder" - }, - { - "name": "sortDir", - "in": "query", - "description": "排序方向:asc/desc", - "required": false, - "type": "string", - "x-example": "desc" - }, - { - "name": "status", - "in": "query", - "description": "状态筛选:0=下架 1=上架", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "tagId", - "in": "query", - "description": "标签ID筛选(单个)", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "tagIds", - "in": "query", - "description": "标签ID筛选(多个,逗号分隔)", - "required": false, - "type": "string", - "x-example": "1,2,3" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«景区列表项»»", - "originalRef": "统一响应结果«分页结果«景区列表项»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«景区列表项»»", - "originalRef": "统一响应结果«分页结果«景区列表项»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/scenic/spots/batch": { - "delete": { - "tags": [ - "景区管理" - ], - "summary": "批量删除", - "description": "批量软删除多个景区。权限校验同单个删除:仅SUPER_ADMIN或创建者可操作。部分失败不影响其他景区的删除。", - "operationId": "batchDeleteUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "批量删除请求", - "required": false, - "schema": { - "$ref": "#/definitions/景区批量删除请求", - "originalRef": "景区批量删除请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/scenic/spots/batch/status": { - "put": { - "tags": [ - "景区管理" - ], - "summary": "批量上下架", - "description": "批量修改多个景区的状态。scenicIds为景区ID列表(字符串格式),status为目标状态。跳过审批流程,适用于批量管理场景。", - "operationId": "batchUpdateStatusUsingPUT_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "景区状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/景区状态变更请求", - "originalRef": "景区状态变更请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/scenic/spots/batch/tags": { - "put": { - "tags": [ - "景区标签管理" - ], - "summary": "批量打标签", - "description": "对多个景区批量添加或移除标签。addTagIds为要添加的标签,removeTagIds为要移除的标签,两者可同时使用。增量操作,不影响未指定的标签。", - "operationId": "batchUpdateTagsUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "批量标签请求", - "required": false, - "schema": { - "$ref": "#/definitions/景区批量标签操作请求", - "originalRef": "景区批量标签操作请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/scenic/tag": { - "post": { - "tags": [ - "景区标签管理" - ], - "summary": "创建管理标签", - "description": "创建预设标签,标签名不可重复。可指定颜色(tagColor),默认为#409EFF。预设标签在标签管理页面展示和维护。", - "operationId": "createTagUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/标签创建请求", - "originalRef": "标签创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«景区标签»", - "originalRef": "统一响应结果«景区标签»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«景区标签»", - "originalRef": "统一响应结果«景区标签»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/scenic/tag/adhoc": { - "post": { - "tags": [ - "景区标签管理" - ], - "summary": "解析自定义标签", - "description": "输入标签名称,如果已存在则直接返回,不存在则自动创建。用于景区编辑时快速输入新标签,避免先到标签管理页面创建。", - "operationId": "resolveAdHocTagUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/标签创建请求", - "originalRef": "标签创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«景区标签»", - "originalRef": "统一响应结果«景区标签»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«景区标签»", - "originalRef": "统一响应结果«景区标签»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/scenic/tag/{tagId}": { - "put": { - "tags": [ - "景区标签管理" - ], - "summary": "编辑标签", - "description": "修改标签名称或颜色。修改后所有关联此标签的景区会自动生效。", - "operationId": "updateTagUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/标签更新请求", - "originalRef": "标签更新请求" - } - }, - { - "name": "tagId", - "in": "path", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«景区标签»", - "originalRef": "统一响应结果«景区标签»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«景区标签»", - "originalRef": "统一响应结果«景区标签»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "景区标签管理" - ], - "summary": "删除标签", - "description": "删除标签并自动解除所有景区与该标签的关联关系。", - "operationId": "deleteTagUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "tagId", - "in": "path", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/scenic/tags": { - "get": { - "tags": [ - "景区标签管理" - ], - "summary": "获取管理标签列表(分页)", - "description": "分页查询景区标签库中的所有标签,支持按关键词搜索。标签分为预设标签(管理员创建)和自定义标签(adhoc接口创建),此接口返回全部类型。", - "operationId": "listManagedTagsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«景区标签»»", - "originalRef": "统一响应结果«分页结果«景区标签»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«景区标签»»", - "originalRef": "统一响应结果«分页结果«景区标签»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/scenic/tags/all": { - "get": { - "tags": [ - "景区标签管理" - ], - "summary": "获取全部标签", - "description": "不分页返回所有标签,用于景区编辑时的标签选择下拉列表。", - "operationId": "listAllTagsUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«景区标签»»", - "originalRef": "统一响应结果«List«景区标签»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«景区标签»»", - "originalRef": "统一响应结果«List«景区标签»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/restaurant/item": { - "post": { - "tags": [ - "餐厅管理" - ], - "summary": "创建餐厅", - "description": "新建餐厅资源,初始状态为下架(status=0)。餐厅没有价格日历,费用通过产品报价中的费用项管理。需走企微审批流程上架。\n\n**关联字典**:\n- restaurant_category:餐厅分类(表单选择)\n- cuisine_type:菜系类型(表单多选)\n- environment_type:环境类型(表单多选)\n- restaurant_facility:餐厅设施(表单多选)\n\n**纯文本字段**:\n- cityName:城市名称(手动输入,如「拉萨」「海拉尔」,非字典)", - "operationId": "createRestaurantUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "餐厅创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/餐厅创建请求", - "originalRef": "餐厅创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«餐厅详情视图»", - "originalRef": "统一响应结果«餐厅详情视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«餐厅详情视图»", - "originalRef": "统一响应结果«餐厅详情视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/restaurant/item/{restaurantId}": { - "get": { - "tags": [ - "餐厅管理" - ], - "summary": "餐厅详情", - "description": "获取餐厅完整信息,包含素材URL、标签、富文本介绍等。\n\n**关联字典**:\n- restaurant_category:餐厅分类(详情显示)\n- cuisine_type:菜系类型(详情显示)\n- environment_type:环境类型(详情显示)\n- restaurant_facility:餐厅设施(详情显示)", - "operationId": "getRestaurantUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "restaurantId", - "in": "path", - "description": "餐厅ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«餐厅详情视图»", - "originalRef": "统一响应结果«餐厅详情视图»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«餐厅详情视图»", - "originalRef": "统一响应结果«餐厅详情视图»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "餐厅管理" - ], - "summary": "更新餐厅", - "description": "更新餐厅基本信息,不改变当前状态。\n\n**关联字典**:\n- restaurant_category:餐厅分类(表单选择)\n- cuisine_type:菜系类型(表单多选)\n- environment_type:环境类型(表单多选)\n- restaurant_facility:餐厅设施(表单多选)\n\n**纯文本字段**:\n- cityName:城市名称(手动输入,非字典)", - "operationId": "updateRestaurantUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "餐厅更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/餐厅更新请求", - "originalRef": "餐厅更新请求" - } - }, - { - "name": "restaurantId", - "in": "path", - "description": "餐厅ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«餐厅详情视图»", - "originalRef": "统一响应结果«餐厅详情视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«餐厅详情视图»", - "originalRef": "统一响应结果«餐厅详情视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "餐厅管理" - ], - "summary": "删除餐厅", - "description": "软删除餐厅。仅SUPER_ADMIN或创建者可操作。", - "operationId": "deleteRestaurantUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "restaurantId", - "in": "path", - "description": "餐厅ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/restaurant/item/{restaurantId}/status": { - "put": { - "tags": [ - "餐厅管理" - ], - "summary": "上下架切换", - "description": "直接修改状态(跳过审批),仅限SUPER_ADMIN。状态值:0=下架,1=上架。", - "operationId": "updateStatusUsingPUT_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "餐厅状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/餐厅状态变更请求", - "originalRef": "餐厅状态变更请求" - } - }, - { - "name": "restaurantId", - "in": "path", - "description": "餐厅ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/restaurant/item/{restaurantId}/submit-approval": { - "post": { - "tags": [ - "餐厅管理" - ], - "summary": "提交启用/禁用审批", - "description": "向企微OA提交审批。targetStatus=1申请上架,targetStatus=2申请下架。返回审批单号spNo。", - "operationId": "submitApprovalUsingPOST_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "审批提交请求", - "required": false, - "schema": { - "$ref": "#/definitions/餐厅审批提交请求", - "originalRef": "餐厅审批提交请求" - } - }, - { - "name": "restaurantId", - "in": "path", - "description": "餐厅ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/restaurant/item/{restaurantId}/tags": { - "put": { - "tags": [ - "餐厅标签管理" - ], - "summary": "更新餐厅标签", - "description": "全量替换指定餐厅的标签列表。传入tagIds为最终关联的标签ID列表,为空则清除所有标签。", - "operationId": "updateRestaurantTagsUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "餐厅标签更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/餐厅标签更新请求_1", - "originalRef": "餐厅标签更新请求_1" - } - }, - { - "name": "restaurantId", - "in": "path", - "description": "餐厅ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/restaurant/items": { - "get": { - "tags": [ - "餐厅管理" - ], - "summary": "餐厅列表", - "description": "分页查询餐厅列表,支持按名称、状态、分类、城市等条件筛选。\n\n**关联字典**:\n- restaurant_category:餐厅分类(筛选+列表显示)\n- cuisine_type:菜系类型(列表显示)\n- environment_type:环境类型(列表显示)\n- restaurant_facility:餐厅设施(列表显示)", - "operationId": "listRestaurantsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "categoryCode", - "in": "query", - "description": "分类编码", - "required": false, - "type": "string", - "x-example": "TIBETAN" - }, - { - "name": "city", - "in": "query", - "description": "城市", - "required": false, - "type": "string", - "x-example": "拉萨市" - }, - { - "name": "cityName", - "in": "query", - "description": "城市名称筛选(纯文本)", - "required": false, - "type": "string", - "x-example": "拉萨" - }, - { - "name": "cuisineType", - "in": "query", - "description": "菜系类型", - "required": false, - "type": "string", - "x-example": "TIBETAN" - }, - { - "name": "keyword", - "in": "query", - "description": "搜索关键词(名称/副标题模糊搜索)", - "required": false, - "type": "string", - "x-example": "藏餐" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 20 - }, - { - "name": "province", - "in": "query", - "description": "省份", - "required": false, - "type": "string", - "x-example": "西藏自治区" - }, - { - "name": "recommended", - "in": "query", - "description": "是否推荐:0=否 1=是", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "sortBy", - "in": "query", - "description": "排序字段", - "required": false, - "type": "string", - "x-example": "createdAt" - }, - { - "name": "sortDir", - "in": "query", - "description": "排序方向:asc=升序 desc=降序", - "required": false, - "type": "string", - "x-example": "desc" - }, - { - "name": "status", - "in": "query", - "description": "状态:0=下架 1=上架", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "tagId", - "in": "query", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64", - "x-example": 100 - }, - { - "name": "tagIds", - "in": "query", - "description": "标签ID列表(逗号分隔)", - "required": false, - "type": "string", - "x-example": "100,101,102" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«餐厅列表视图»»", - "originalRef": "统一响应结果«分页结果«餐厅列表视图»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«餐厅列表视图»»", - "originalRef": "统一响应结果«分页结果«餐厅列表视图»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/restaurant/items/batch": { - "delete": { - "tags": [ - "餐厅管理" - ], - "summary": "批量删除", - "description": "批量软删除多个餐厅。仅SUPER_ADMIN或创建者可操作。", - "operationId": "batchDeleteUsingDELETE_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "批量删除请求", - "required": false, - "schema": { - "$ref": "#/definitions/餐厅批量删除请求", - "originalRef": "餐厅批量删除请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/restaurant/items/batch/status": { - "put": { - "tags": [ - "餐厅管理" - ], - "summary": "批量上下架", - "description": "批量修改多个餐厅的状态,跳过审批流程。", - "operationId": "batchUpdateStatusUsingPUT_2", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "餐厅状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/餐厅状态变更请求", - "originalRef": "餐厅状态变更请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/restaurant/items/batch/tags": { - "put": { - "tags": [ - "餐厅标签管理" - ], - "summary": "批量打标签", - "description": "对多个餐厅批量添加/移除标签。增量操作,不影响未指定的标签。", - "operationId": "batchUpdateTagsUsingPUT_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "批量标签请求", - "required": false, - "schema": { - "$ref": "#/definitions/餐厅批量标签操作请求", - "originalRef": "餐厅批量标签操作请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/restaurant/tag": { - "post": { - "tags": [ - "餐厅标签管理" - ], - "summary": "创建管理标签", - "description": "创建预设标签,标签名不可重复。可指定颜色(tagColor),默认#409EFF。", - "operationId": "createTagUsingPOST_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/餐厅标签创建请求", - "originalRef": "餐厅标签创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«餐厅标签视图»", - "originalRef": "统一响应结果«餐厅标签视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«餐厅标签视图»", - "originalRef": "统一响应结果«餐厅标签视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/restaurant/tag/adhoc": { - "post": { - "tags": [ - "餐厅标签管理" - ], - "summary": "解析自定义标签", - "description": "按名称查找或自动创建标签。用于餐厅编辑时快速输入新标签。", - "operationId": "resolveAdHocTagUsingPOST_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/餐厅标签创建请求", - "originalRef": "餐厅标签创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«餐厅标签视图»", - "originalRef": "统一响应结果«餐厅标签视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«餐厅标签视图»", - "originalRef": "统一响应结果«餐厅标签视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/restaurant/tag/{tagId}": { - "put": { - "tags": [ - "餐厅标签管理" - ], - "summary": "编辑标签", - "description": "修改标签名称或颜色,所有关联餐厅自动生效。", - "operationId": "updateTagUsingPUT_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/餐厅标签更新请求", - "originalRef": "餐厅标签更新请求" - } - }, - { - "name": "tagId", - "in": "path", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«餐厅标签视图»", - "originalRef": "统一响应结果«餐厅标签视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«餐厅标签视图»", - "originalRef": "统一响应结果«餐厅标签视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "餐厅标签管理" - ], - "summary": "删除标签", - "description": "删除标签并解除所有餐厅与该标签的关联。", - "operationId": "deleteTagUsingDELETE_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "tagId", - "in": "path", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/restaurant/tags": { - "get": { - "tags": [ - "餐厅标签管理" - ], - "summary": "获取管理标签列表(分页)", - "description": "分页查询餐厅标签库,支持按关键词搜索。包含预设标签和自定义标签。", - "operationId": "listManagedTagsUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«餐厅标签视图»»", - "originalRef": "统一响应结果«分页结果«餐厅标签视图»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«餐厅标签视图»»", - "originalRef": "统一响应结果«分页结果«餐厅标签视图»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/restaurant/tags/all": { - "get": { - "tags": [ - "餐厅标签管理" - ], - "summary": "获取全部标签", - "description": "不分页返回所有标签,用于餐厅编辑时的标签选择下拉。", - "operationId": "listAllTagsUsingGET_1", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«餐厅标签视图»»", - "originalRef": "统一响应结果«List«餐厅标签视图»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«餐厅标签视图»»", - "originalRef": "统一响应结果«List«餐厅标签视图»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/supplies/item": { - "post": { - "tags": [ - "备品管理" - ], - "summary": "创建备品", - "description": "新建备品资源(帐篷、睡袋、炊具等物资),初始状态为下架(status=0)。需走企微审批上架。支持按件(PER_ITEM)和按人(PER_PERSON)计费。\n\n**关联字典**:\n- supplies_category:备品分类(表单选择)\n- billing_type:计费方式(表单选择)", - "operationId": "createSuppliesUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "备品创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/备品创建请求", - "originalRef": "备品创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«备品详情视图»", - "originalRef": "统一响应结果«备品详情视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«备品详情视图»", - "originalRef": "统一响应结果«备品详情视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/supplies/item/{suppliesId}": { - "get": { - "tags": [ - "备品管理" - ], - "summary": "备品详情", - "description": "获取备品完整信息,包含素材URL、标签等。\n\n**关联字典**:\n- supplies_category:备品分类(详情显示)\n- billing_type:计费方式(详情显示)", - "operationId": "getSuppliesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "suppliesId", - "in": "path", - "description": "备品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«备品详情视图»", - "originalRef": "统一响应结果«备品详情视图»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«备品详情视图»", - "originalRef": "统一响应结果«备品详情视图»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "备品管理" - ], - "summary": "更新备品", - "description": "更新备品基本信息,不改变当前状态。\n\n**关联字典**:\n- supplies_category:备品分类(表单选择)\n- billing_type:计费方式(表单选择)", - "operationId": "updateSuppliesUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "备品更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/备品更新请求", - "originalRef": "备品更新请求" - } - }, - { - "name": "suppliesId", - "in": "path", - "description": "备品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«备品详情视图»", - "originalRef": "统一响应结果«备品详情视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«备品详情视图»", - "originalRef": "统一响应结果«备品详情视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "备品管理" - ], - "summary": "删除备品", - "description": "软删除备品。仅SUPER_ADMIN或创建者可操作。", - "operationId": "deleteSuppliesUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "suppliesId", - "in": "path", - "description": "备品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/supplies/item/{suppliesId}/status": { - "put": { - "tags": [ - "备品管理" - ], - "summary": "上下架切换", - "description": "直接修改状态(跳过审批),仅限SUPER_ADMIN。状态值:0=下架,1=上架。", - "operationId": "updateStatusUsingPUT_2", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "备品状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/备品状态变更请求", - "originalRef": "备品状态变更请求" - } - }, - { - "name": "suppliesId", - "in": "path", - "description": "备品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/supplies/item/{suppliesId}/submit-approval": { - "post": { - "tags": [ - "备品管理" - ], - "summary": "提交启用/禁用审批", - "description": "向企微OA提交审批。targetStatus=1申请上架,targetStatus=2申请下架。返回审批单号spNo。", - "operationId": "submitApprovalUsingPOST_2", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "审批提交请求", - "required": false, - "schema": { - "$ref": "#/definitions/备品审批提交请求", - "originalRef": "备品审批提交请求" - } - }, - { - "name": "suppliesId", - "in": "path", - "description": "备品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/supplies/item/{suppliesId}/tags": { - "put": { - "tags": [ - "备品标签管理" - ], - "summary": "更新备品标签", - "description": "全量替换指定备品的标签列表。", - "operationId": "updateSuppliesTagsUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "备品标签更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/备品标签更新请求_1", - "originalRef": "备品标签更新请求_1" - } - }, - { - "name": "suppliesId", - "in": "path", - "description": "备品ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/supplies/items": { - "get": { - "tags": [ - "备品管理" - ], - "summary": "备品列表", - "description": "分页查询备品列表,支持按名称、状态、分类等条件筛选。\n\n**关联字典**:\n- supplies_category:备品分类(筛选+列表显示)\n- billing_type:计费方式(列表显示)", - "operationId": "listSuppliesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "billingType", - "in": "query", - "description": "计费方式:PER_ITEM=按件 PER_DAY=按天", - "required": false, - "type": "string", - "x-example": "PER_ITEM" - }, - { - "name": "categoryCode", - "in": "query", - "description": "分类编码", - "required": false, - "type": "string", - "x-example": "OUTDOOR_GEAR" - }, - { - "name": "keyword", - "in": "query", - "description": "搜索关键词(名称/副标题模糊搜索)", - "required": false, - "type": "string", - "x-example": "登山杖" - }, - { - "name": "maxPrice", - "in": "query", - "description": "最高价格", - "required": false, - "type": "number", - "x-example": 500.0 - }, - { - "name": "minPrice", - "in": "query", - "description": "最低价格", - "required": false, - "type": "number", - "x-example": 10.0 - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 20 - }, - { - "name": "recommended", - "in": "query", - "description": "是否推荐:0=否 1=是", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "sortBy", - "in": "query", - "description": "排序字段", - "required": false, - "type": "string", - "x-example": "createdAt" - }, - { - "name": "sortDir", - "in": "query", - "description": "排序方向:asc=升序 desc=降序", - "required": false, - "type": "string", - "x-example": "desc" - }, - { - "name": "status", - "in": "query", - "description": "状态:0=下架 1=上架", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "tagId", - "in": "query", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64", - "x-example": 100 - }, - { - "name": "tagIds", - "in": "query", - "description": "标签ID列表(逗号分隔)", - "required": false, - "type": "string", - "x-example": "100,101,102" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«备品列表视图»»", - "originalRef": "统一响应结果«分页结果«备品列表视图»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«备品列表视图»»", - "originalRef": "统一响应结果«分页结果«备品列表视图»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/supplies/items/batch": { - "delete": { - "tags": [ - "备品管理" - ], - "summary": "批量删除", - "description": "批量软删除多个备品。仅SUPER_ADMIN或创建者可操作。", - "operationId": "batchDeleteUsingDELETE_2", - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "批量删除请求", - "required": false, - "schema": { - "$ref": "#/definitions/备品批量删除请求", - "originalRef": "备品批量删除请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/supplies/items/batch/status": { - "put": { - "tags": [ - "备品管理" - ], - "summary": "批量上下架", - "description": "批量修改多个备品的状态,跳过审批流程。", - "operationId": "batchUpdateStatusUsingPUT_3", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "备品状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/备品状态变更请求", - "originalRef": "备品状态变更请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/supplies/items/batch/tags": { - "put": { - "tags": [ - "备品标签管理" - ], - "summary": "批量打标签", - "description": "对多个备品批量添加/移除标签。增量操作。", - "operationId": "batchUpdateTagsUsingPUT_2", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "批量标签请求", - "required": false, - "schema": { - "$ref": "#/definitions/备品批量标签操作请求", - "originalRef": "备品批量标签操作请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/supplies/tag": { - "post": { - "tags": [ - "备品标签管理" - ], - "summary": "创建管理标签", - "description": "创建预设标签,标签名不可重复。", - "operationId": "createTagUsingPOST_2", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/备品标签创建请求", - "originalRef": "备品标签创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«备品标签视图»", - "originalRef": "统一响应结果«备品标签视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«备品标签视图»", - "originalRef": "统一响应结果«备品标签视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/supplies/tag/adhoc": { - "post": { - "tags": [ - "备品标签管理" - ], - "summary": "解析自定义标签", - "description": "按名称查找或自动创建标签。", - "operationId": "resolveAdHocTagUsingPOST_2", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/备品标签创建请求", - "originalRef": "备品标签创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«备品标签视图»", - "originalRef": "统一响应结果«备品标签视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«备品标签视图»", - "originalRef": "统一响应结果«备品标签视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/supplies/tag/{tagId}": { - "put": { - "tags": [ - "备品标签管理" - ], - "summary": "编辑标签", - "description": "修改标签名称或颜色,所有关联备品自动生效。", - "operationId": "updateTagUsingPUT_2", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/备品标签更新请求", - "originalRef": "备品标签更新请求" - } - }, - { - "name": "tagId", - "in": "path", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«备品标签视图»", - "originalRef": "统一响应结果«备品标签视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«备品标签视图»", - "originalRef": "统一响应结果«备品标签视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "备品标签管理" - ], - "summary": "删除标签", - "description": "删除标签并解除所有备品与该标签的关联。", - "operationId": "deleteTagUsingDELETE_2", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "tagId", - "in": "path", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/supplies/tags": { - "get": { - "tags": [ - "备品标签管理" - ], - "summary": "获取管理标签列表(分页)", - "description": "分页查询备品标签库,支持按关键词搜索。", - "operationId": "listManagedTagsUsingGET_2", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«备品标签视图»»", - "originalRef": "统一响应结果«分页结果«备品标签视图»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«备品标签视图»»", - "originalRef": "统一响应结果«分页结果«备品标签视图»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/supplies/tags/all": { - "get": { - "tags": [ - "备品标签管理" - ], - "summary": "获取全部标签", - "description": "不分页返回所有标签,用于备品编辑时的标签选择下拉。", - "operationId": "listAllTagsUsingGET_2", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«备品标签视图»»", - "originalRef": "统一响应结果«List«备品标签视图»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«备品标签视图»»", - "originalRef": "统一响应结果«List«备品标签视图»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/activity/item": { - "post": { - "tags": [ - "游玩项目管理" - ], - "summary": "创建游玩项目", - "description": "新建游玩项目资源(如漂流、骑行、篝火晚会等),初始状态为下架(status=0)。需通过「提交启用/禁用审批」走企微审批后上架。支持按项收费(PER_ITEM)和按人收费(PER_PERSON)两种计费方式。\n\n**关联字典**:\n- activity_category:活动分类(表单选择)\n- activity_billing_type:计费方式(表单选择)", - "operationId": "createActivityUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "游玩项目创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/活动项目创建请求", - "originalRef": "活动项目创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«活动项目详情视图»", - "originalRef": "统一响应结果«活动项目详情视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«活动项目详情视图»", - "originalRef": "统一响应结果«活动项目详情视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/activity/item/{activityId}": { - "get": { - "tags": [ - "游玩项目管理" - ], - "summary": "游玩项目详情", - "description": "获取游玩项目完整信息,包含富文本内容、素材URL、标签、价格日历等。\n\n**关联字典**:\n- activity_category:活动分类(详情显示)\n- activity_billing_type:计费方式(详情显示)", - "operationId": "getActivityUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "activityId", - "in": "path", - "description": "游玩项目ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«活动项目详情视图»", - "originalRef": "统一响应结果«活动项目详情视图»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«活动项目详情视图»", - "originalRef": "统一响应结果«活动项目详情视图»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "游玩项目管理" - ], - "summary": "更新游玩项目", - "description": "更新游玩项目基本信息,不改变当前状态。已上架的项目修改后仍保持上架。\n\n**关联字典**:\n- activity_category:活动分类(表单选择)\n- activity_billing_type:计费方式(表单选择)", - "operationId": "updateActivityUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "activityId", - "in": "path", - "description": "游玩项目ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "游玩项目更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/活动项目更新请求", - "originalRef": "活动项目更新请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«活动项目详情视图»", - "originalRef": "统一响应结果«活动项目详情视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«活动项目详情视图»", - "originalRef": "统一响应结果«活动项目详情视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "游玩项目管理" - ], - "summary": "删除游玩项目", - "description": "软删除游玩项目。仅SUPER_ADMIN或创建者可操作。删除后关联的素材引用会被清理。", - "operationId": "deleteActivityUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "activityId", - "in": "path", - "description": "游玩项目ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/activity/item/{activityId}/prices": { - "get": { - "tags": [ - "游玩项目价格日历" - ], - "summary": "查询价格日历", - "description": "按月查询游玩项目的每日价格和可接待状态。", - "operationId": "getPriceCalendarUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "activityId", - "in": "path", - "description": "游玩项目ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "month", - "in": "query", - "description": "月份", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "year", - "in": "query", - "description": "年份", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«活动价格日历视图»", - "originalRef": "统一响应结果«活动价格日历视图»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«活动价格日历视图»", - "originalRef": "统一响应结果«活动价格日历视图»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "游玩项目价格日历" - ], - "summary": "批量设置价格", - "description": "在指定日期范围内批量设置成本价和可接待状态。支持按星期过滤和排除特定日期。", - "operationId": "batchSetPricesUsingPUT_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "activityId", - "in": "path", - "description": "游玩项目ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "价格日历设置请求", - "required": false, - "schema": { - "$ref": "#/definitions/活动价格日历设置请求", - "originalRef": "活动价格日历设置请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "游玩项目价格日历" - ], - "summary": "批量清除价格", - "description": "删除指定日期范围内的所有价格记录。日期格式:yyyy-MM-dd。", - "operationId": "deletePricesUsingDELETE_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "activityId", - "in": "path", - "description": "游玩项目ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "endDate", - "in": "query", - "description": "结束日期", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "startDate", - "in": "query", - "description": "开始日期", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/activity/item/{activityId}/prices/batch-status": { - "put": { - "tags": [ - "游玩项目价格日历" - ], - "summary": "批量修改可接待状态", - "description": "批量修改指定日期范围内的可接待状态,不影响价格。", - "operationId": "batchUpdateStatusUsingPUT_5", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "activityId", - "in": "path", - "description": "游玩项目ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "价格日历状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/活动价格日历状态变更请求", - "originalRef": "活动价格日历状态变更请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/activity/item/{activityId}/status": { - "put": { - "tags": [ - "游玩项目管理" - ], - "summary": "启用/禁用切换", - "description": "直接修改状态(跳过审批),仅限SUPER_ADMIN。状态值:0=下架,1=上架。", - "operationId": "updateStatusUsingPUT_3", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "activityId", - "in": "path", - "description": "游玩项目ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "游玩项目状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/活动项目状态变更请求", - "originalRef": "活动项目状态变更请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/activity/item/{activityId}/submit-approval": { - "post": { - "tags": [ - "游玩项目管理" - ], - "summary": "提交启用/禁用审批", - "description": "向企微OA提交审批。targetStatus=1申请上架,targetStatus=2申请下架。审批通过后自动更新状态,返回审批单号spNo。", - "operationId": "submitApprovalUsingPOST_3", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "activityId", - "in": "path", - "description": "游玩项目ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "审批提交请求", - "required": false, - "schema": { - "$ref": "#/definitions/活动项目审批提交请求", - "originalRef": "活动项目审批提交请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/activity/item/{activityId}/tags": { - "put": { - "tags": [ - "游玩项目标签管理" - ], - "summary": "更新项目标签", - "description": "全量替换指定项目的标签列表。传入tagIds为最终关联的标签ID列表,为空则清除所有标签。", - "operationId": "updateActivityTagsUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "activityId", - "in": "path", - "description": "游玩项目ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "游玩项目标签更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/活动项目标签更新请求", - "originalRef": "活动项目标签更新请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/activity/items": { - "get": { - "tags": [ - "游玩项目管理" - ], - "summary": "游玩项目列表", - "description": "分页查询游玩项目列表,支持按名称、状态、分类等条件筛选。返回摘要信息,按sortOrder倒序+创建时间倒序排列。\n\n**关联字典**:\n- activity_category:活动分类(筛选+列表显示)\n- activity_billing_type:计费方式(列表显示)", - "operationId": "listActivitiesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "billingType", - "in": "query", - "description": "计费方式:PER_PERSON=按人 PER_GROUP=按团 PER_HOUR=按时", - "required": false, - "type": "string", - "x-example": "PER_PERSON" - }, - { - "name": "categoryCode", - "in": "query", - "description": "分类编码", - "required": false, - "type": "string", - "x-example": "OUTDOOR" - }, - { - "name": "city", - "in": "query", - "description": "城市", - "required": false, - "type": "string", - "x-example": "拉萨市" - }, - { - "name": "cityKeyword", - "in": "query", - "description": "城市/区域关键词模糊搜索(匹配城市名、省份、地址)", - "required": false, - "type": "string", - "x-example": "海拉尔" - }, - { - "name": "environmentType", - "in": "query", - "description": "环境类型:INDOOR=室内 OUTDOOR=室外 BOTH=室内外", - "required": false, - "type": "string", - "x-example": "OUTDOOR" - }, - { - "name": "keyword", - "in": "query", - "description": "搜索关键词(名称/副标题模糊搜索)", - "required": false, - "type": "string", - "x-example": "骑马" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 20 - }, - { - "name": "physicalLevel", - "in": "query", - "description": "体力要求:LOW=低 MEDIUM=中 HIGH=高", - "required": false, - "type": "string", - "x-example": "MEDIUM" - }, - { - "name": "sortBy", - "in": "query", - "description": "排序字段", - "required": false, - "type": "string", - "x-example": "createdAt" - }, - { - "name": "sortDir", - "in": "query", - "description": "排序方向:asc=升序 desc=降序", - "required": false, - "type": "string", - "x-example": "desc" - }, - { - "name": "status", - "in": "query", - "description": "状态:0=下架 1=上架", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "tagId", - "in": "query", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64", - "x-example": 100 - }, - { - "name": "tagIds", - "in": "query", - "description": "标签ID列表(逗号分隔)", - "required": false, - "type": "string", - "x-example": "100,101,102" - }, - { - "name": "weatherDependent", - "in": "query", - "description": "是否受天气影响:0=否 1=是", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«活动项目列表视图»»", - "originalRef": "统一响应结果«分页结果«活动项目列表视图»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«活动项目列表视图»»", - "originalRef": "统一响应结果«分页结果«活动项目列表视图»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/activity/items/batch": { - "delete": { - "tags": [ - "游玩项目管理" - ], - "summary": "批量删除", - "description": "批量软删除多个游玩项目。仅SUPER_ADMIN或创建者可操作。", - "operationId": "batchDeleteUsingDELETE_3", - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "批量删除请求", - "required": false, - "schema": { - "$ref": "#/definitions/活动项目批量删除请求", - "originalRef": "活动项目批量删除请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/activity/items/batch/status": { - "put": { - "tags": [ - "游玩项目管理" - ], - "summary": "批量启用/禁用", - "description": "批量修改多个游玩项目的状态,跳过审批流程。", - "operationId": "batchUpdateStatusUsingPUT_4", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "游玩项目状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/活动项目状态变更请求", - "originalRef": "活动项目状态变更请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/activity/items/batch/tags": { - "put": { - "tags": [ - "游玩项目标签管理" - ], - "summary": "批量打标签", - "description": "对多个项目批量添加/移除标签。增量操作,不影响未指定的标签。", - "operationId": "batchUpdateTagsUsingPUT_3", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "批量标签请求", - "required": false, - "schema": { - "$ref": "#/definitions/活动项目批量标签操作请求", - "originalRef": "活动项目批量标签操作请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/activity/tag": { - "post": { - "tags": [ - "游玩项目标签管理" - ], - "summary": "创建管理标签", - "description": "创建预设标签,标签名不可重复。可指定颜色(tagColor),默认#409EFF。", - "operationId": "createTagUsingPOST_3", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/活动标签创建请求", - "originalRef": "活动标签创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«活动标签视图»", - "originalRef": "统一响应结果«活动标签视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«活动标签视图»", - "originalRef": "统一响应结果«活动标签视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/activity/tag/adhoc": { - "post": { - "tags": [ - "游玩项目标签管理" - ], - "summary": "解析自定义标签", - "description": "按名称查找或自动创建标签。用于项目编辑时快速输入新标签。", - "operationId": "resolveAdHocTagUsingPOST_3", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/活动标签创建请求", - "originalRef": "活动标签创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«活动标签视图»", - "originalRef": "统一响应结果«活动标签视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«活动标签视图»", - "originalRef": "统一响应结果«活动标签视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/activity/tag/{tagId}": { - "put": { - "tags": [ - "游玩项目标签管理" - ], - "summary": "编辑标签", - "description": "修改标签名称或颜色,所有关联项目自动生效。", - "operationId": "updateTagUsingPUT_3", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/活动标签更新请求", - "originalRef": "活动标签更新请求" - } - }, - { - "name": "tagId", - "in": "path", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«活动标签视图»", - "originalRef": "统一响应结果«活动标签视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«活动标签视图»", - "originalRef": "统一响应结果«活动标签视图»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "游玩项目标签管理" - ], - "summary": "删除标签", - "description": "删除标签并自动解除所有项目与该标签的关联。", - "operationId": "deleteTagUsingDELETE_3", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "tagId", - "in": "path", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/activity/tags": { - "get": { - "tags": [ - "游玩项目标签管理" - ], - "summary": "获取管理标签列表(分页)", - "description": "分页查询游玩项目标签库,支持按关键词搜索。包含预设标签和自定义标签。", - "operationId": "listManagedTagsUsingGET_3", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«活动标签视图»»", - "originalRef": "统一响应结果«分页结果«活动标签视图»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«活动标签视图»»", - "originalRef": "统一响应结果«分页结果«活动标签视图»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/activity/tags/all": { - "get": { - "tags": [ - "游玩项目标签管理" - ], - "summary": "获取全部标签", - "description": "不分页返回所有标签,用于项目编辑时的标签选择下拉。", - "operationId": "listAllTagsUsingGET_3", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«活动标签视图»»", - "originalRef": "统一响应结果«List«活动标签视图»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«活动标签视图»»", - "originalRef": "统一响应结果«List«活动标签视图»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/item": { - "post": { - "tags": [ - "住宿管理" - ], - "summary": "创建住宿", - "description": "新建住宿资源(酒店/民宿/营地等),初始状态为下架(status=0)。创建后需通过「提交启用/禁用审批」走企微OA审批流程才能上架。住宿下可继续创建房型(RoomType),房型有独立的价格日历。\n\n**关联字典**:\n- hotel_type:住宿类型(表单选择)\n- hotel_star_level:酒店星级(表单选择)\n- hotel_facility:酒店设施(表单多选)", - "operationId": "createHotelUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "住宿创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/酒店创建请求", - "originalRef": "酒店创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«酒店详情VO»", - "originalRef": "统一响应结果«酒店详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«酒店详情VO»", - "originalRef": "统一响应结果«酒店详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/item/{hotelId}": { - "get": { - "tags": [ - "住宿管理" - ], - "summary": "住宿详情", - "description": "获取住宿完整信息,包含素材URL、标签列表、房型列表等。素材ID会自动解析为OSS访问地址。\n\n**关联字典**:\n- hotel_type:住宿类型(详情显示)\n- hotel_star_level:酒店星级(详情显示)\n- hotel_facility:酒店设施(详情显示)", - "operationId": "getHotelUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "hotelId", - "in": "path", - "description": "住宿ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«酒店详情VO»", - "originalRef": "统一响应结果«酒店详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«酒店详情VO»", - "originalRef": "统一响应结果«酒店详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "住宿管理" - ], - "summary": "更新住宿", - "description": "更新住宿基本信息。更新不会改变当前状态,已上架的住宿修改后仍保持上架状态。\n\n**关联字典**:\n- hotel_type:住宿类型(表单选择)\n- hotel_star_level:酒店星级(表单选择)\n- hotel_facility:酒店设施(表单多选)", - "operationId": "updateHotelUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "hotelId", - "in": "path", - "description": "住宿ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "住宿更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/酒店更新请求", - "originalRef": "酒店更新请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«酒店详情VO»", - "originalRef": "统一响应结果«酒店详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«酒店详情VO»", - "originalRef": "统一响应结果«酒店详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "住宿管理" - ], - "summary": "删除住宿", - "description": "软删除住宿。仅房务管理员(ROOM_MANAGER)或超级管理员可操作,且只能删除未启用(下架)的住宿。删除住宿会同时删除其下所有房型和价格日历数据。", - "operationId": "deleteHotelUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "hotelId", - "in": "path", - "description": "住宿ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/item/{hotelId}/status": { - "put": { - "tags": [ - "住宿管理" - ], - "summary": "启用/禁用切换", - "description": "直接修改住宿状态(跳过审批),仅限SUPER_ADMIN使用。状态值:0=下架,1=上架。", - "operationId": "updateStatusUsingPUT_4", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "hotelId", - "in": "path", - "description": "住宿ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "住宿状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/酒店状态变更请求", - "originalRef": "酒店状态变更请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/item/{hotelId}/submit-approval": { - "post": { - "tags": [ - "住宿管理" - ], - "summary": "提交启用/禁用审批", - "description": "向企微OA提交住宿启用/禁用审批。targetStatus=1申请上架,targetStatus=2申请下架。审批通过后自动更新状态。返回企微审批单号spNo。", - "operationId": "submitApprovalUsingPOST_4", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "hotelId", - "in": "path", - "description": "住宿ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "审批提交请求", - "required": false, - "schema": { - "$ref": "#/definitions/酒店审批提交请求", - "originalRef": "酒店审批提交请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/item/{hotelId}/tags": { - "put": { - "tags": [ - "住宿标签管理" - ], - "summary": "设置住宿标签", - "description": "全量替换指定住宿的标签列表。", - "operationId": "updateHotelTagsUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "hotelId", - "in": "path", - "description": "住宿ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "住宿标签更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/酒店标签更新请求_1", - "originalRef": "酒店标签更新请求_1" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/items": { - "get": { - "tags": [ - "住宿管理" - ], - "summary": "住宿列表", - "description": "分页查询住宿列表,支持按名称关键词、状态、住宿类型等条件筛选。返回列表摘要信息,按sortOrder倒序+创建时间倒序排列。\n\n**关联字典**:\n- hotel_type:住宿类型(筛选+列表显示)\n- hotel_star_level:酒店星级(筛选+列表显示)\n- hotel_facility:酒店设施(列表显示)", - "operationId": "listHotelsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "city", - "in": "query", - "description": "城市筛选", - "required": false, - "type": "string", - "x-example": "丽江市" - }, - { - "name": "cityKeyword", - "in": "query", - "description": "城市/区域关键词模糊搜索(匹配城市名、省份、地址)", - "required": false, - "type": "string", - "x-example": "海拉尔" - }, - { - "name": "hotelType", - "in": "query", - "description": "住宿类型筛选", - "required": false, - "type": "string", - "x-example": "HOTEL" - }, - { - "name": "keyword", - "in": "query", - "description": "搜索关键词(名称/地址模糊匹配)", - "required": false, - "type": "string", - "x-example": "丽江" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 20 - }, - { - "name": "sortBy", - "in": "query", - "description": "排序字段", - "required": false, - "type": "string", - "x-example": "createdAt" - }, - { - "name": "sortDir", - "in": "query", - "description": "排序方向:asc/desc", - "required": false, - "type": "string", - "x-example": "desc" - }, - { - "name": "starLevel", - "in": "query", - "description": "星级筛选(字典: hotel_star_level)", - "required": false, - "type": "string", - "x-example": "FIVE_STAR" - }, - { - "name": "status", - "in": "query", - "description": "状态筛选:0=下架 1=上架", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "tagId", - "in": "query", - "description": "标签ID(单个)", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "tagIds", - "in": "query", - "description": "标签ID列表(逗号分隔)", - "required": false, - "type": "string", - "x-example": "1,2,3" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«酒店列表VO»»", - "originalRef": "统一响应结果«分页结果«酒店列表VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«酒店列表VO»»", - "originalRef": "统一响应结果«分页结果«酒店列表VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/items/all-simple": { - "get": { - "tags": [ - "住宿管理" - ], - "summary": "所有启用的住宿(不分页,仅ID和名称)", - "description": "返回所有已上架(status=1)的住宿简要信息,用于下拉选择框。每项只含hotelId和name字段。适用于房型管理时选择所属住宿、产品编排时绑定住宿资源等场景。", - "operationId": "listAllSimpleUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/items/batch": { - "delete": { - "tags": [ - "住宿管理" - ], - "summary": "批量删除", - "description": "批量软删除多个住宿及其关联的房型和价格日历。仅房务管理员(ROOM_MANAGER)或超级管理员可操作,且只能删除未启用(下架)的住宿。", - "operationId": "batchDeleteUsingDELETE_4", - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "批量删除请求", - "required": false, - "schema": { - "$ref": "#/definitions/酒店批量删除请求", - "originalRef": "酒店批量删除请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/items/batch/status": { - "put": { - "tags": [ - "住宿管理" - ], - "summary": "批量启用/禁用", - "description": "批量修改多个住宿的状态,跳过审批流程。hotelIds为住宿ID列表(字符串格式)。", - "operationId": "batchUpdateStatusUsingPUT_6", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "住宿状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/酒店状态变更请求", - "originalRef": "酒店状态变更请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/items/batch/tags": { - "put": { - "tags": [ - "住宿标签管理" - ], - "summary": "批量添加/移除标签", - "description": "对多个住宿批量添加/移除标签。增量操作,不影响未指定的标签。", - "operationId": "batchUpdateTagsUsingPUT_4", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "批量标签请求", - "required": false, - "schema": { - "$ref": "#/definitions/酒店批量标签操作请求", - "originalRef": "酒店批量标签操作请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/room-type/{roomTypeId}": { - "get": { - "tags": [ - "房型管理" - ], - "summary": "房型详情", - "description": "获取房型完整信息,包含价格、入住人数、素材等。\n\n**关联字典**:\n- room_category:房型分类(列表/详情显示)\n- bed_type:床型(列表/详情显示)\n- window_type:窗户类型(列表/详情显示)\n- bathroom_type:卫浴类型(列表/详情显示)\n- room_facility:房间设施(列表/详情显示)", - "operationId": "getRoomTypeUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "roomTypeId", - "in": "path", - "description": "房型ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«房型详情VO»", - "originalRef": "统一响应结果«房型详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«房型详情VO»", - "originalRef": "统一响应结果«房型详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "房型管理" - ], - "summary": "更新房型", - "description": "更新房型基本信息,不改变当前状态。\n\n**关联字典**:\n- room_category:房型分类(表单选择)\n- bed_type:床型(表单选择)\n- window_type:窗户类型(表单选择)\n- bathroom_type:卫浴类型(表单选择)\n- room_facility:房间设施(表单多选)", - "operationId": "updateRoomTypeUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "房型更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/房型更新请求", - "originalRef": "房型更新请求" - } - }, - { - "name": "roomTypeId", - "in": "path", - "description": "房型ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«房型详情VO»", - "originalRef": "统一响应结果«房型详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«房型详情VO»", - "originalRef": "统一响应结果«房型详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "房型管理" - ], - "summary": "删除房型", - "description": "软删除房型及其价格日历数据。", - "operationId": "deleteRoomTypeUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "roomTypeId", - "in": "path", - "description": "房型ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/room-type/{roomTypeId}/prices": { - "get": { - "tags": [ - "房型价格日历" - ], - "summary": "查询价格日历", - "description": "按月查询房型的每日价格和可售状态。每个房型有独立的价格日历。", - "operationId": "getPriceCalendarUsingGET_2", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "month", - "in": "query", - "description": "月份", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "roomTypeId", - "in": "path", - "description": "房型ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "year", - "in": "query", - "description": "年份", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«酒店房型价格日历VO»", - "originalRef": "统一响应结果«酒店房型价格日历VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«酒店房型价格日历VO»", - "originalRef": "统一响应结果«酒店房型价格日历VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "房型价格日历" - ], - "summary": "批量设置价格日历", - "description": "在指定日期范围内批量设置房型的成本价和可售状态。支持按星期过滤和排除特定日期。", - "operationId": "batchSetPricesUsingPUT_2", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "价格日历设置请求", - "required": false, - "schema": { - "$ref": "#/definitions/酒店房型价格日历设置请求", - "originalRef": "酒店房型价格日历设置请求" - } - }, - { - "name": "roomTypeId", - "in": "path", - "description": "房型ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "房型价格日历" - ], - "summary": "删除价格日历", - "description": "删除指定日期范围内房型的所有价格记录。日期格式:yyyy-MM-dd。", - "operationId": "deletePricesUsingDELETE_2", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "endDate", - "in": "query", - "description": "结束日期", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "roomTypeId", - "in": "path", - "description": "房型ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "startDate", - "in": "query", - "description": "开始日期", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/room-type/{roomTypeId}/prices/batch-status": { - "put": { - "tags": [ - "房型价格日历" - ], - "summary": "批量修改日期可售状态", - "description": "批量修改指定日期范围内房型的可售状态,不影响价格。", - "operationId": "batchUpdateStatusUsingPUT_7", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "价格日历状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/酒店房型价格日历状态变更请求", - "originalRef": "酒店房型价格日历状态变更请求" - } - }, - { - "name": "roomTypeId", - "in": "path", - "description": "房型ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/room-type/{roomTypeId}/status": { - "put": { - "tags": [ - "房型管理" - ], - "summary": "启用/禁用房型", - "description": "直接修改房型状态(跳过审批)。status=0禁用,status=1启用。禁用后该房型不会出现在C端展示中。", - "operationId": "updateRoomTypeStatusUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "房型状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/房型状态变更请求", - "originalRef": "房型状态变更请求" - } - }, - { - "name": "roomTypeId", - "in": "path", - "description": "房型ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/room-type/{roomTypeId}/submit-approval": { - "post": { - "tags": [ - "房型管理" - ], - "summary": "提交房型启用/禁用审批", - "description": "向企微OA提交房型启用/禁用审批。审批流程与住宿共享同一模板。返回审批单号spNo。", - "operationId": "submitRoomTypeApprovalUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "审批提交请求", - "required": false, - "schema": { - "$ref": "#/definitions/酒店审批提交请求", - "originalRef": "酒店审批提交请求" - } - }, - { - "name": "roomTypeId", - "in": "path", - "description": "房型ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/tag": { - "post": { - "tags": [ - "住宿标签管理" - ], - "summary": "创建标签", - "description": "创建预设标签,标签名不可重复。", - "operationId": "createTagUsingPOST_4", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/酒店标签创建请求", - "originalRef": "酒店标签创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«酒店标签VO»", - "originalRef": "统一响应结果«酒店标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«酒店标签VO»", - "originalRef": "统一响应结果«酒店标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/tag/adhoc": { - "post": { - "tags": [ - "住宿标签管理" - ], - "summary": "查找或创建自定义标签", - "description": "按名称查找标签,不存在则自动创建。用于住宿编辑时快速输入新标签。", - "operationId": "resolveAdHocTagUsingPOST_4", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/酒店标签创建请求", - "originalRef": "酒店标签创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«酒店标签VO»", - "originalRef": "统一响应结果«酒店标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«酒店标签VO»", - "originalRef": "统一响应结果«酒店标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/tag/{tagId}": { - "put": { - "tags": [ - "住宿标签管理" - ], - "summary": "更新标签", - "description": "修改标签名称或颜色,所有关联住宿自动生效。", - "operationId": "updateTagUsingPUT_4", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/酒店标签更新请求", - "originalRef": "酒店标签更新请求" - } - }, - { - "name": "tagId", - "in": "path", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«酒店标签VO»", - "originalRef": "统一响应结果«酒店标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«酒店标签VO»", - "originalRef": "统一响应结果«酒店标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "住宿标签管理" - ], - "summary": "删除标签", - "description": "删除标签并解除所有住宿与该标签的关联。", - "operationId": "deleteTagUsingDELETE_4", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "tagId", - "in": "path", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/tags": { - "get": { - "tags": [ - "住宿标签管理" - ], - "summary": "预设标签列表(分页)", - "description": "分页查询住宿标签库,支持按关键词搜索。", - "operationId": "listManagedTagsUsingGET_4", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«酒店标签VO»»", - "originalRef": "统一响应结果«分页结果«酒店标签VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«酒店标签VO»»", - "originalRef": "统一响应结果«分页结果«酒店标签VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/tags/all": { - "get": { - "tags": [ - "住宿标签管理" - ], - "summary": "所有标签列表", - "description": "不分页返回所有标签,用于住宿编辑时的标签选择。", - "operationId": "listAllTagsUsingGET_4", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«酒店标签VO»»", - "originalRef": "统一响应结果«List«酒店标签VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«酒店标签VO»»", - "originalRef": "统一响应结果«List«酒店标签VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/{hotelId}/room-type": { - "post": { - "tags": [ - "房型管理" - ], - "summary": "创建房型", - "description": "在指定住宿下创建房型(如标准间、大床房、套房等)。每个房型有独立的价格日历、最大入住人数(maxOccupancy)和基础价格(basePrice)。房型初始状态为下架(status=0),需独立审批后才能启用。创建后可通过「提交房型启用审批」接口提交企微OA审批。\n\n**关联字典**:\n- room_category:房型分类(表单选择)\n- bed_type:床型(表单选择)\n- window_type:窗户类型(表单选择)\n- bathroom_type:卫浴类型(表单选择)\n- room_facility:房间设施(表单多选)", - "operationId": "createRoomTypeUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "hotelId", - "in": "path", - "description": "住宿ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "房型创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/房型创建请求", - "originalRef": "房型创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«房型详情VO»", - "originalRef": "统一响应结果«房型详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«房型详情VO»", - "originalRef": "统一响应结果«房型详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/hotel/{hotelId}/room-types": { - "get": { - "tags": [ - "房型管理" - ], - "summary": "房型列表", - "description": "获取指定住宿下的所有房型列表(不分页),按sortOrder排序。\n\n**关联字典**:\n- room_category:房型分类(列表/详情显示)\n- bed_type:床型(列表/详情显示)\n- window_type:窗户类型(列表/详情显示)\n- bathroom_type:卫浴类型(列表/详情显示)\n- room_facility:房间设施(列表/详情显示)", - "operationId": "listRoomTypesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "hotelId", - "in": "path", - "description": "住宿ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«房型详情VO»»", - "originalRef": "统一响应结果«List«房型详情VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«房型详情VO»»", - "originalRef": "统一响应结果«List«房型详情VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/service/item": { - "post": { - "tags": [ - "增值服务管理" - ], - "summary": "创建增值服务", - "description": "新建增值服务项目(如保险、签证代办、接送机等),初始状态为下架(status=0)。支持免费(isPaid=false)和付费两种模式,付费服务有独立的价格日历。需走企微审批上架。\n\n**关联字典**:\n- service_category:服务分类(表单选择)\n- billing_type_service:服务计费方式(表单选择)\n- service_unit:服务计量单位(表单选择)", - "operationId": "createServiceItemUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "服务创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/服务项创建请求", - "originalRef": "服务项创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务项详情VO»", - "originalRef": "统一响应结果«服务项详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务项详情VO»", - "originalRef": "统一响应结果«服务项详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/service/item/{serviceId}": { - "get": { - "tags": [ - "增值服务管理" - ], - "summary": "增值服务详情", - "description": "获取增值服务完整信息,包含素材URL、标签、计费方式等。\n\n**关联字典**:\n- service_category:服务分类(详情显示)\n- billing_type_service:服务计费方式(详情显示)\n- service_unit:服务计量单位(详情显示)", - "operationId": "getServiceItemUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "serviceId", - "in": "path", - "description": "服务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务项详情VO»", - "originalRef": "统一响应结果«服务项详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务项详情VO»", - "originalRef": "统一响应结果«服务项详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "增值服务管理" - ], - "summary": "更新增值服务", - "description": "更新增值服务基本信息,不改变当前状态。\n\n**关联字典**:\n- service_category:服务分类(表单选择)\n- billing_type_service:服务计费方式(表单选择)\n- service_unit:服务计量单位(表单选择)", - "operationId": "updateServiceItemUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "服务更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/服务项更新请求", - "originalRef": "服务项更新请求" - } - }, - { - "name": "serviceId", - "in": "path", - "description": "服务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务项详情VO»", - "originalRef": "统一响应结果«服务项详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务项详情VO»", - "originalRef": "统一响应结果«服务项详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "增值服务管理" - ], - "summary": "删除增值服务", - "description": "软删除增值服务。仅SUPER_ADMIN或创建者可操作。", - "operationId": "deleteServiceItemUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "serviceId", - "in": "path", - "description": "服务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/service/item/{serviceId}/prices": { - "get": { - "tags": [ - "服务价格日历" - ], - "summary": "查询价格日历", - "description": "按月查询增值服务的每日价格和可售状态。仅付费服务(isPaid=true)需要设置价格日历。", - "operationId": "getPriceCalendarUsingGET_3", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "month", - "in": "query", - "description": "月份", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "serviceId", - "in": "path", - "description": "服务ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "year", - "in": "query", - "description": "年份", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务项价格日历VO»", - "originalRef": "统一响应结果«服务项价格日历VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务项价格日历VO»", - "originalRef": "统一响应结果«服务项价格日历VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "服务价格日历" - ], - "summary": "批量设置价格", - "description": "在指定日期范围内批量设置服务的成本价和可售状态。", - "operationId": "batchSetPricesUsingPUT_3", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "价格日历设置请求", - "required": false, - "schema": { - "$ref": "#/definitions/服务项价格日历设置请求", - "originalRef": "服务项价格日历设置请求" - } - }, - { - "name": "serviceId", - "in": "path", - "description": "服务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "服务价格日历" - ], - "summary": "批量清除价格", - "description": "删除指定日期范围内的价格记录。日期格式:yyyy-MM-dd。", - "operationId": "deletePricesUsingDELETE_3", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "endDate", - "in": "query", - "description": "结束日期", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "serviceId", - "in": "path", - "description": "服务ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "startDate", - "in": "query", - "description": "开始日期", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/service/item/{serviceId}/prices/batch-status": { - "put": { - "tags": [ - "服务价格日历" - ], - "summary": "批量修改可售状态", - "description": "批量修改日期范围内的可售状态,不影响价格。", - "operationId": "batchUpdateStatusUsingPUT_9", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "价格日历状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/服务项价格日历状态变更请求", - "originalRef": "服务项价格日历状态变更请求" - } - }, - { - "name": "serviceId", - "in": "path", - "description": "服务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/service/item/{serviceId}/status": { - "put": { - "tags": [ - "增值服务管理" - ], - "summary": "启用/禁用切换", - "description": "直接修改状态(跳过审批),仅限SUPER_ADMIN。状态值:0=下架,1=上架。", - "operationId": "updateStatusUsingPUT_5", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "服务状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/服务项状态变更请求", - "originalRef": "服务项状态变更请求" - } - }, - { - "name": "serviceId", - "in": "path", - "description": "服务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/service/item/{serviceId}/submit-approval": { - "post": { - "tags": [ - "增值服务管理" - ], - "summary": "提交启用/禁用审批", - "description": "向企微OA提交审批。targetStatus=1申请上架,targetStatus=2申请下架。返回审批单号spNo。", - "operationId": "submitApprovalUsingPOST_5", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "审批提交请求", - "required": false, - "schema": { - "$ref": "#/definitions/服务项审批提交请求", - "originalRef": "服务项审批提交请求" - } - }, - { - "name": "serviceId", - "in": "path", - "description": "服务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/service/item/{serviceId}/tags": { - "put": { - "tags": [ - "服务标签管理" - ], - "summary": "更新服务标签", - "description": "全量替换指定服务的标签列表。", - "operationId": "updateServiceTagsUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "服务标签更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/服务项标签更新请求", - "originalRef": "服务项标签更新请求" - } - }, - { - "name": "serviceId", - "in": "path", - "description": "服务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/service/items": { - "get": { - "tags": [ - "增值服务管理" - ], - "summary": "增值服务列表", - "description": "分页查询增值服务列表,支持按名称、状态、分类等条件筛选。\n\n**关联字典**:\n- service_category:服务分类(筛选+列表显示)\n- billing_type_service:服务计费方式(列表显示)\n- service_unit:服务计量单位(列表显示)", - "operationId": "listServiceItemsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "billingType", - "in": "query", - "description": "计费方式筛选", - "required": false, - "type": "string", - "x-example": "PER_DAY" - }, - { - "name": "categoryCode", - "in": "query", - "description": "分类编码筛选", - "required": false, - "type": "string", - "x-example": "GUIDE" - }, - { - "name": "city", - "in": "query", - "description": "城市筛选", - "required": false, - "type": "string", - "x-example": "丽江市" - }, - { - "name": "cityKeyword", - "in": "query", - "description": "城市/区域关键词模糊搜索(匹配城市名、省份、地址)", - "required": false, - "type": "string", - "x-example": "海拉尔" - }, - { - "name": "instantConfirm", - "in": "query", - "description": "是否即时确认筛选:0=否 1=是", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "isPaid", - "in": "query", - "description": "是否收费筛选:0=免费 1=收费", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "keyword", - "in": "query", - "description": "搜索关键词(名称模糊匹配)", - "required": false, - "type": "string", - "x-example": "导游" - }, - { - "name": "maxPrice", - "in": "query", - "description": "最高价格筛选", - "required": false, - "type": "number", - "x-example": 1000.0 - }, - { - "name": "minPrice", - "in": "query", - "description": "最低价格筛选", - "required": false, - "type": "number", - "x-example": 100.0 - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 20 - }, - { - "name": "sortBy", - "in": "query", - "description": "排序字段", - "required": false, - "type": "string", - "x-example": "createdAt" - }, - { - "name": "sortDir", - "in": "query", - "description": "排序方向:asc/desc", - "required": false, - "type": "string", - "x-example": "desc" - }, - { - "name": "status", - "in": "query", - "description": "状态筛选:0=下架 1=上架", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "tagId", - "in": "query", - "description": "标签ID(单个)", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "tagIds", - "in": "query", - "description": "标签ID列表(逗号分隔)", - "required": false, - "type": "string", - "x-example": "1,2,3" - }, - { - "name": "vehicleType", - "in": "query", - "description": "配套车型筛选", - "required": false, - "type": "string", - "x-example": "商务车" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«服务项列表VO»»", - "originalRef": "统一响应结果«分页结果«服务项列表VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«服务项列表VO»»", - "originalRef": "统一响应结果«分页结果«服务项列表VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/service/items/batch": { - "delete": { - "tags": [ - "增值服务管理" - ], - "summary": "批量删除", - "description": "批量软删除多个增值服务。仅SUPER_ADMIN或创建者可操作。", - "operationId": "batchDeleteUsingDELETE_5", - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "批量删除请求", - "required": false, - "schema": { - "$ref": "#/definitions/服务项批量删除请求", - "originalRef": "服务项批量删除请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/service/items/batch/status": { - "put": { - "tags": [ - "增值服务管理" - ], - "summary": "批量启用/禁用", - "description": "批量修改多个增值服务的状态,跳过审批流程。", - "operationId": "batchUpdateStatusUsingPUT_8", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "服务状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/服务项状态变更请求", - "originalRef": "服务项状态变更请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/service/items/batch/tags": { - "put": { - "tags": [ - "服务标签管理" - ], - "summary": "批量打标签", - "description": "对多个服务批量添加/移除标签。增量操作。", - "operationId": "batchUpdateTagsUsingPUT_5", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "批量标签请求", - "required": false, - "schema": { - "$ref": "#/definitions/服务项批量标签操作请求", - "originalRef": "服务项批量标签操作请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/service/tag": { - "post": { - "tags": [ - "服务标签管理" - ], - "summary": "创建管理标签", - "description": "创建预设标签,标签名不可重复。", - "operationId": "createTagUsingPOST_5", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/服务标签创建请求", - "originalRef": "服务标签创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务标签VO»", - "originalRef": "统一响应结果«服务标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务标签VO»", - "originalRef": "统一响应结果«服务标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/service/tag/adhoc": { - "post": { - "tags": [ - "服务标签管理" - ], - "summary": "解析自定义标签", - "description": "按名称查找或自动创建标签。", - "operationId": "resolveAdHocTagUsingPOST_5", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/服务标签创建请求", - "originalRef": "服务标签创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务标签VO»", - "originalRef": "统一响应结果«服务标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务标签VO»", - "originalRef": "统一响应结果«服务标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/service/tag/{tagId}": { - "put": { - "tags": [ - "服务标签管理" - ], - "summary": "编辑标签", - "description": "修改标签名称或颜色,所有关联服务自动生效。", - "operationId": "updateTagUsingPUT_5", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/服务标签更新请求", - "originalRef": "服务标签更新请求" - } - }, - { - "name": "tagId", - "in": "path", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务标签VO»", - "originalRef": "统一响应结果«服务标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务标签VO»", - "originalRef": "统一响应结果«服务标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "服务标签管理" - ], - "summary": "删除标签", - "description": "删除标签并解除所有服务与该标签的关联。", - "operationId": "deleteTagUsingDELETE_5", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "tagId", - "in": "path", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/service/tags": { - "get": { - "tags": [ - "服务标签管理" - ], - "summary": "获取管理标签列表(分页)", - "description": "分页查询增值服务标签库,支持按关键词搜索。", - "operationId": "listManagedTagsUsingGET_5", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«服务标签VO»»", - "originalRef": "统一响应结果«分页结果«服务标签VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«服务标签VO»»", - "originalRef": "统一响应结果«分页结果«服务标签VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/service/tags/all": { - "get": { - "tags": [ - "服务标签管理" - ], - "summary": "获取全部标签", - "description": "不分页返回所有标签,用于服务编辑时的标签选择。", - "operationId": "listAllTagsUsingGET_5", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«服务标签VO»»", - "originalRef": "统一响应结果«List«服务标签VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«服务标签VO»»", - "originalRef": "统一响应结果«List«服务标签VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/vehicle/model": { - "post": { - "tags": [ - "车型管理" - ], - "summary": "创建车型", - "description": "新建车型资源(如7座商务车、14座中巴等),初始状态为下架(status=0)。车型有独立的价格日历用于报价计算。需走企微审批上架。\n\n**关联字典**:\n- vehicle_type:车辆类型(表单选择)", - "operationId": "createVehicleUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "车型创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/车型创建请求", - "originalRef": "车型创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«车型详情VO»", - "originalRef": "统一响应结果«车型详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«车型详情VO»", - "originalRef": "统一响应结果«车型详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/vehicle/model/{vehicleId}": { - "get": { - "tags": [ - "车型管理" - ], - "summary": "车型详情", - "description": "获取车型完整信息,包含座位数、品牌、素材URL、标签等。\n\n**关联字典**:\n- vehicle_type:车辆类型(详情显示)", - "operationId": "getVehicleUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "vehicleId", - "in": "path", - "description": "车型ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«车型详情VO»", - "originalRef": "统一响应结果«车型详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«车型详情VO»", - "originalRef": "统一响应结果«车型详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "车型管理" - ], - "summary": "更新车型", - "description": "更新车型基本信息,不改变当前状态。\n\n**关联字典**:\n- vehicle_type:车辆类型(表单选择)", - "operationId": "updateVehicleUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "车型更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/车型更新请求", - "originalRef": "车型更新请求" - } - }, - { - "name": "vehicleId", - "in": "path", - "description": "车型ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«车型详情VO»", - "originalRef": "统一响应结果«车型详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«车型详情VO»", - "originalRef": "统一响应结果«车型详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "车型管理" - ], - "summary": "删除车型", - "description": "软删除车型。仅SUPER_ADMIN或创建者可操作。", - "operationId": "deleteVehicleUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "vehicleId", - "in": "path", - "description": "车型ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/vehicle/model/{vehicleId}/prices": { - "get": { - "tags": [ - "车型价格日历" - ], - "summary": "查询价格日历", - "description": "按月查询车型的每日租赁价格和可调度状态。", - "operationId": "getPriceCalendarUsingGET_4", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "month", - "in": "query", - "description": "月份", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "vehicleId", - "in": "path", - "description": "车型ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "year", - "in": "query", - "description": "年份", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«车型价格日历VO»", - "originalRef": "统一响应结果«车型价格日历VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«车型价格日历VO»", - "originalRef": "统一响应结果«车型价格日历VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "车型价格日历" - ], - "summary": "批量设置价格", - "description": "在指定日期范围内批量设置车型的租赁成本价和可调度状态。", - "operationId": "batchSetPricesUsingPUT_4", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "价格日历设置请求", - "required": false, - "schema": { - "$ref": "#/definitions/车型价格日历设置请求", - "originalRef": "车型价格日历设置请求" - } - }, - { - "name": "vehicleId", - "in": "path", - "description": "车型ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "车型价格日历" - ], - "summary": "清除价格日历", - "description": "删除指定日期范围内车型的价格记录。日期格式:yyyy-MM-dd。", - "operationId": "deletePricesUsingDELETE_4", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "endDate", - "in": "query", - "description": "结束日期", - "required": false, - "type": "string", - "format": "date", - "allowEmptyValue": false - }, - { - "name": "startDate", - "in": "query", - "description": "开始日期", - "required": false, - "type": "string", - "format": "date", - "allowEmptyValue": false - }, - { - "name": "vehicleId", - "in": "path", - "description": "车型ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/vehicle/model/{vehicleId}/prices/batch-status": { - "put": { - "tags": [ - "车型价格日历" - ], - "summary": "批量修改调度状态", - "description": "批量修改日期范围内车型的可调度状态,不影响价格。", - "operationId": "batchUpdateStatusUsingPUT_11", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "价格日历状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/车型价格日历状态变更请求", - "originalRef": "车型价格日历状态变更请求" - } - }, - { - "name": "vehicleId", - "in": "path", - "description": "车型ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/vehicle/model/{vehicleId}/status": { - "put": { - "tags": [ - "车型管理" - ], - "summary": "更新状态", - "description": "直接修改车型状态(跳过审批),仅限SUPER_ADMIN。状态值:0=下架,1=上架。", - "operationId": "updateStatusUsingPUT_6", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "状态请求体", - "required": false, - "schema": { - "$ref": "#/definitions/车型状态请求", - "originalRef": "车型状态请求" - } - }, - { - "name": "vehicleId", - "in": "path", - "description": "车型ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/vehicle/model/{vehicleId}/submit-approval": { - "post": { - "tags": [ - "车型管理" - ], - "summary": "提交审批", - "description": "向企微OA提交车型启用/禁用审批。targetStatus=1申请上架,targetStatus=2申请下架。返回审批单号spNo。", - "operationId": "submitApprovalUsingPOST_6", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "审批提交请求体", - "required": false, - "schema": { - "$ref": "#/definitions/车型审批提交请求", - "originalRef": "车型审批提交请求" - } - }, - { - "name": "vehicleId", - "in": "path", - "description": "车型ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/vehicle/model/{vehicleId}/tags": { - "put": { - "tags": [ - "车型标签管理" - ], - "summary": "设置车型标签", - "description": "全量替换指定车型的标签列表。", - "operationId": "updateVehicleTagsUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签ID列表请求", - "required": false, - "schema": { - "$ref": "#/definitions/设置车型标签请求", - "originalRef": "设置车型标签请求" - } - }, - { - "name": "vehicleId", - "in": "path", - "description": "车型ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/vehicle/models": { - "get": { - "tags": [ - "车型管理" - ], - "summary": "车型列表", - "description": "分页查询车型列表,支持按名称、状态、车辆类型等条件筛选。\n\n**关联字典**:\n- vehicle_type:车辆类型(筛选+列表显示)", - "operationId": "listVehiclesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "brand", - "in": "query", - "description": "品牌筛选", - "required": false, - "type": "string", - "x-example": "别克" - }, - { - "name": "keyword", - "in": "query", - "description": "搜索关键词(名称/品牌模糊匹配)", - "required": false, - "type": "string", - "x-example": "别克" - }, - { - "name": "maxPrice", - "in": "query", - "description": "最高价格筛选", - "required": false, - "type": "number", - "x-example": 2000.0 - }, - { - "name": "maxSeatCount", - "in": "query", - "description": "最多座位数筛选", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 15 - }, - { - "name": "minPrice", - "in": "query", - "description": "最低价格筛选", - "required": false, - "type": "number", - "x-example": 500.0 - }, - { - "name": "minSeatCount", - "in": "query", - "description": "最少座位数筛选", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 5 - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 20 - }, - { - "name": "sortBy", - "in": "query", - "description": "排序字段", - "required": false, - "type": "string", - "x-example": "createdAt" - }, - { - "name": "sortDir", - "in": "query", - "description": "排序方向:asc/desc", - "required": false, - "type": "string", - "x-example": "desc" - }, - { - "name": "status", - "in": "query", - "description": "状态筛选:0=下架 1=上架", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "tagId", - "in": "query", - "description": "标签ID(单个)", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "tagIds", - "in": "query", - "description": "标签ID列表(逗号分隔)", - "required": false, - "type": "string", - "x-example": "1,2,3" - }, - { - "name": "vehicleType", - "in": "query", - "description": "车型分类筛选", - "required": false, - "type": "string", - "x-example": "MPV" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«车型列表VO»»", - "originalRef": "统一响应结果«分页结果«车型列表VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«车型列表VO»»", - "originalRef": "统一响应结果«分页结果«车型列表VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/vehicle/models/all": { - "get": { - "tags": [ - "车型管理" - ], - "summary": "车型全量列表(不分页,用于下拉选择)", - "description": "返回所有车型列表,可选按状态筛选。适用于产品编排时选择车型的下拉选择框。不分页返回全部数据。\n\n**关联字典**:\n- vehicle_type:车辆类型(列表显示)", - "operationId": "listAllVehiclesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "status", - "in": "query", - "description": "状态筛选:1=上架", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«车型列表VO»»", - "originalRef": "统一响应结果«List«车型列表VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«车型列表VO»»", - "originalRef": "统一响应结果«List«车型列表VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/vehicle/models/batch": { - "delete": { - "tags": [ - "车型管理" - ], - "summary": "批量删除", - "description": "批量软删除多个车型。仅SUPER_ADMIN或创建者可操作。", - "operationId": "batchDeleteUsingDELETE_6", - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "批量删除请求体", - "required": false, - "schema": { - "$ref": "#/definitions/车型批量删除请求", - "originalRef": "车型批量删除请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/vehicle/models/batch/status": { - "put": { - "tags": [ - "车型管理" - ], - "summary": "批量更新状态", - "description": "批量修改多个车型的状态,跳过审批流程。", - "operationId": "batchUpdateStatusUsingPUT_10", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "批量状态请求体", - "required": false, - "schema": { - "$ref": "#/definitions/车型状态请求", - "originalRef": "车型状态请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/vehicle/models/batch/tags": { - "put": { - "tags": [ - "车型标签管理" - ], - "summary": "批量添加/移除标签", - "description": "对多个车型批量添加/移除标签。增量操作。", - "operationId": "batchUpdateTagsUsingPUT_6", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "批量标签请求", - "required": false, - "schema": { - "$ref": "#/definitions/车型批量标签操作请求", - "originalRef": "车型批量标签操作请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/vehicle/tag": { - "post": { - "tags": [ - "车型标签管理" - ], - "summary": "创建标签", - "description": "创建预设标签,标签名不可重复。", - "operationId": "createTagUsingPOST_6", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/车辆标签创建请求", - "originalRef": "车辆标签创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«车辆标签VO»", - "originalRef": "统一响应结果«车辆标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«车辆标签VO»", - "originalRef": "统一响应结果«车辆标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/vehicle/tag/adhoc": { - "post": { - "tags": [ - "车型标签管理" - ], - "summary": "解析自定义标签", - "description": "按名称查找或自动创建标签。", - "operationId": "resolveAdHocTagUsingPOST_6", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签名称请求体", - "required": false, - "schema": { - "$ref": "#/definitions/车辆标签创建请求", - "originalRef": "车辆标签创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«车辆标签VO»", - "originalRef": "统一响应结果«车辆标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«车辆标签VO»", - "originalRef": "统一响应结果«车辆标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/vehicle/tag/{tagId}": { - "put": { - "tags": [ - "车型标签管理" - ], - "summary": "更新标签", - "description": "修改标签名称或颜色。", - "operationId": "updateTagUsingPUT_6", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/车辆标签更新请求", - "originalRef": "车辆标签更新请求" - } - }, - { - "name": "tagId", - "in": "path", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«车辆标签VO»", - "originalRef": "统一响应结果«车辆标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«车辆标签VO»", - "originalRef": "统一响应结果«车辆标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "车型标签管理" - ], - "summary": "删除标签", - "description": "删除标签并解除所有车型与该标签的关联。", - "operationId": "deleteTagUsingDELETE_6", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "tagId", - "in": "path", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/vehicle/tags": { - "get": { - "tags": [ - "车型标签管理" - ], - "summary": "预设标签列表(分页)", - "description": "分页查询车型标签库,支持按关键词搜索。", - "operationId": "listManagedTagsUsingGET_6", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«车辆标签VO»»", - "originalRef": "统一响应结果«分页结果«车辆标签VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«车辆标签VO»»", - "originalRef": "统一响应结果«分页结果«车辆标签VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/vehicle/tags/all": { - "get": { - "tags": [ - "车型标签管理" - ], - "summary": "全部标签列表", - "description": "不分页返回所有标签,用于车型编辑时的标签选择。", - "operationId": "listAllTagsUsingGET_6", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«车辆标签VO»»", - "originalRef": "统一响应结果«List«车辆标签VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«车辆标签VO»»", - "originalRef": "统一响应结果«List«车辆标签VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/cost/item": { - "post": { - "tags": [ - "费用项管理" - ], - "summary": "创建费用项", - "description": "新建费用项(如门票成本、餐费、保险费等),用于产品报价计算。费用项有独立的价格日历,价格变更会记录变更日志。创建后需走企微审批上架。\n\n**关联字典**:\n- cost_category:费用分类(表单选择)\n- cost_apply_role:适用角色(表单选择)\n- cost_unit:计量单位(表单选择)", - "operationId": "createCostItemUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "费用项创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/费用项创建请求", - "originalRef": "费用项创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«费用项详情VO»", - "originalRef": "统一响应结果«费用项详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«费用项详情VO»", - "originalRef": "统一响应结果«费用项详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/cost/item/{costId}": { - "get": { - "tags": [ - "费用项管理" - ], - "summary": "费用项详情", - "description": "获取费用项完整信息,包含当前价格、引用计数等。\n\n**关联字典**:\n- cost_category:费用分类(详情显示)\n- cost_apply_role:适用角色(详情显示)\n- cost_unit:计量单位(详情显示)", - "operationId": "getCostItemUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "costId", - "in": "path", - "description": "费用项ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«费用项详情VO»", - "originalRef": "统一响应结果«费用项详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«费用项详情VO»", - "originalRef": "统一响应结果«费用项详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "费用项管理" - ], - "summary": "更新费用项", - "description": "更新费用项信息。如果修改了价格,会自动记录价格变更日志。\n\n**关联字典**:\n- cost_category:费用分类(表单选择)\n- cost_apply_role:适用角色(表单选择)\n- cost_unit:计量单位(表单选择)", - "operationId": "updateCostItemUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "costId", - "in": "path", - "description": "费用项ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "费用项更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/费用项更新请求", - "originalRef": "费用项更新请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«费用项详情VO»", - "originalRef": "统一响应结果«费用项详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«费用项详情VO»", - "originalRef": "统一响应结果«费用项详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "费用项管理" - ], - "summary": "删除费用项", - "description": "软删除费用项。仅SUPER_ADMIN或创建者可操作。被产品引用(refCount>0)的费用项不建议删除。", - "operationId": "deleteCostItemUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "costId", - "in": "path", - "description": "费用项ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/cost/item/{costId}/price-logs": { - "get": { - "tags": [ - "费用项管理" - ], - "summary": "费用项价格变更记录", - "description": "查询费用项的历史价格变更记录,按时间倒序排列。用于追溯价格调整历史。", - "operationId": "getPriceLogsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "costId", - "in": "path", - "description": "费用项ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«费用项价格变更日志VO»»", - "originalRef": "统一响应结果«List«费用项价格变更日志VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«费用项价格变更日志VO»»", - "originalRef": "统一响应结果«List«费用项价格变更日志VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/cost/item/{costId}/prices": { - "get": { - "tags": [ - "费用项价格日历" - ], - "summary": "查询价格日历", - "description": "按月查询费用项的每日价格。费用项价格日历用于产品报价计算时按日期获取成本价。", - "operationId": "getPriceCalendarUsingGET_5", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "costId", - "in": "path", - "description": "费用项ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "month", - "in": "query", - "description": "月份", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "year", - "in": "query", - "description": "年份", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«费用项价格日历VO»", - "originalRef": "统一响应结果«费用项价格日历VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«费用项价格日历VO»", - "originalRef": "统一响应结果«费用项价格日历VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "费用项价格日历" - ], - "summary": "批量设置价格", - "description": "在指定日期范围内批量设置费用项的成本价。", - "operationId": "batchSetPricesUsingPUT_5", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "costId", - "in": "path", - "description": "费用项ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "价格日历设置请求", - "required": false, - "schema": { - "$ref": "#/definitions/费用项价格日历设置请求", - "originalRef": "费用项价格日历设置请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "费用项价格日历" - ], - "summary": "清除价格日历", - "description": "删除指定日期范围内费用项的价格记录。日期格式:yyyy-MM-dd。", - "operationId": "deletePricesUsingDELETE_5", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "costId", - "in": "path", - "description": "费用项ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "endDate", - "in": "query", - "description": "结束日期", - "required": false, - "type": "string", - "format": "date", - "allowEmptyValue": false - }, - { - "name": "startDate", - "in": "query", - "description": "开始日期", - "required": false, - "type": "string", - "format": "date", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/cost/item/{costId}/submit-approval": { - "post": { - "tags": [ - "费用项管理" - ], - "summary": "提交审批", - "description": "向企微OA提交费用项启用/禁用审批。targetStatus=1申请上架,targetStatus=2申请下架。返回审批单号spNo。", - "operationId": "submitApprovalUsingPOST_7", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "costId", - "in": "path", - "description": "费用项ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "审批提交请求体", - "required": false, - "schema": { - "$ref": "#/definitions/费用项审批提交请求", - "originalRef": "费用项审批提交请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/cost/items": { - "get": { - "tags": [ - "费用项管理" - ], - "summary": "费用项列表", - "description": "分页查询费用项列表,支持按名称、状态等条件筛选。\n\n**关联字典**:\n- cost_category:费用分类(筛选+列表显示)\n- cost_apply_role:适用角色(筛选+列表显示)\n- cost_unit:计量单位(列表显示)", - "operationId": "listCostItemsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "applyRole", - "in": "query", - "description": "适用角色筛选", - "required": false, - "type": "string", - "x-example": "ADULT" - }, - { - "name": "categoryCode", - "in": "query", - "description": "费用分类编码筛选", - "required": false, - "type": "string", - "x-example": "GUIDE" - }, - { - "name": "keyword", - "in": "query", - "description": "搜索关键词(名称模糊匹配)", - "required": false, - "type": "string", - "x-example": "导游" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 20 - }, - { - "name": "sortBy", - "in": "query", - "description": "排序字段", - "required": false, - "type": "string", - "x-example": "createdAt" - }, - { - "name": "sortDir", - "in": "query", - "description": "排序方向:asc/desc", - "required": false, - "type": "string", - "x-example": "desc" - }, - { - "name": "status", - "in": "query", - "description": "状态筛选:0=下架 1=上架", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«费用项列表VO»»", - "originalRef": "统一响应结果«分页结果«费用项列表VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«费用项列表VO»»", - "originalRef": "统一响应结果«分页结果«费用项列表VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/cost/items/enabled": { - "get": { - "tags": [ - "费用项管理" - ], - "summary": "启用的费用项列表", - "description": "查询所有已启用(status=1)的费用项,不分页。用于产品编排时选择费用项的下拉列表。\n\n**关联字典**:\n- cost_category:费用分类(列表显示)\n- cost_apply_role:适用角色(列表显示)\n- cost_unit:计量单位(列表显示)", - "operationId": "listEnabledCostItemsUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«费用项详情VO»»", - "originalRef": "统一响应结果«List«费用项详情VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«费用项详情VO»»", - "originalRef": "统一响应结果«List«费用项详情VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/staff": { - "post": { - "tags": [ - "服务人员管理" - ], - "summary": "创建服务人员", - "description": "新建服务人员(导游/领队/摄影师/助理等)。人员类型(staffType)决定了其在价格日历中的归类。需走企微审批上架后才能被产品引用。\n\n**关联字典**:\n- staff_type:人员类型(表单选择)\n- guide_level:导游等级(表单选择)\n- driver_license_type:驾照类型(表单选择)\n- language:语言能力(表单多选)\n- guide_specialty:导游专长(表单多选)\n- guide_service_area:服务区域(表单多选)", - "operationId": "createStaffUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "服务人员创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/服务人员创建请求", - "originalRef": "服务人员创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务人员详情VO»", - "originalRef": "统一响应结果«服务人员详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务人员详情VO»", - "originalRef": "统一响应结果«服务人员详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/staff/batch": { - "delete": { - "tags": [ - "服务人员管理" - ], - "summary": "批量删除", - "description": "批量软删除多个服务人员。仅SUPER_ADMIN或创建者可操作。", - "operationId": "batchDeleteUsingDELETE_7", - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "批量删除请求体", - "required": false, - "schema": { - "$ref": "#/definitions/人员批量删除请求", - "originalRef": "人员批量删除请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/staff/batch-basic": { - "get": { - "tags": [ - "服务人员管理" - ], - "summary": "批量查人员简要信息", - "description": "根据ID列表批量查人员简要信息(ID+姓名+类型),用于备选人员回显。", - "operationId": "batchBriefUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "staffIds", - "in": "query", - "description": "人员ID列表(逗号分隔)", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/staff/batch-brief": { - "get": { - "tags": [ - "服务人员管理" - ], - "summary": "批量查人员简要信息", - "description": "根据ID列表批量查人员简要信息(ID+姓名+类型),用于备选人员回显。", - "operationId": "batchBriefUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "staffIds", - "in": "query", - "description": "人员ID列表(逗号分隔)", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»", - "originalRef": "统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/staff/batch/status": { - "put": { - "tags": [ - "服务人员管理" - ], - "summary": "批量更新状态", - "description": "批量修改多个服务人员的状态,跳过审批流程。", - "operationId": "batchUpdateStatusUsingPUT_12", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "批量状态请求体", - "required": false, - "schema": { - "$ref": "#/definitions/人员状态请求", - "originalRef": "人员状态请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/staff/batch/tags": { - "put": { - "tags": [ - "服务人员标签管理" - ], - "summary": "批量添加/移除标签", - "description": "对多个人员批量添加/移除标签。增量操作。", - "operationId": "batchUpdateTagsUsingPUT_7", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "批量标签请求", - "required": false, - "schema": { - "$ref": "#/definitions/人员批量标签操作请求", - "originalRef": "人员批量标签操作请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/staff/list": { - "get": { - "tags": [ - "服务人员管理" - ], - "summary": "服务人员列表", - "description": "分页查询服务人员列表,支持按姓名、状态、人员类型等条件筛选。\n\n**关联字典**:\n- staff_type:人员类型(筛选+列表显示)\n- guide_level:导游等级(列表显示)\n- driver_license_type:驾照类型(列表显示)\n- language:语言能力(列表显示)\n- guide_specialty:导游专长(列表显示)\n- guide_service_area:服务区域(列表显示)", - "operationId": "listStaffUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "搜索关键词(姓名/描述模糊匹配)", - "required": false, - "type": "string", - "x-example": "张导" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 20 - }, - { - "name": "sortBy", - "in": "query", - "description": "排序字段", - "required": false, - "type": "string", - "x-example": "createdAt" - }, - { - "name": "sortDir", - "in": "query", - "description": "排序方向:asc/desc", - "required": false, - "type": "string", - "x-example": "desc" - }, - { - "name": "staffType", - "in": "query", - "description": "人员类型筛选", - "required": false, - "type": "string", - "x-example": "GUIDE" - }, - { - "name": "status", - "in": "query", - "description": "状态筛选:0=下架 1=上架", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "tagId", - "in": "query", - "description": "标签ID(单个)", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "tagIds", - "in": "query", - "description": "标签ID列表(逗号分隔)", - "required": false, - "type": "string", - "x-example": "1,2,3" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«服务人员列表VO»»", - "originalRef": "统一响应结果«分页结果«服务人员列表VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«服务人员列表VO»»", - "originalRef": "统一响应结果«分页结果«服务人员列表VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/staff/tag": { - "post": { - "tags": [ - "服务人员标签管理" - ], - "summary": "创建标签", - "description": "创建预设标签,标签名不可重复。", - "operationId": "createTagUsingPOST_7", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签创建请求", - "required": false, - "schema": { - "$ref": "#/definitions/服务人员标签创建请求", - "originalRef": "服务人员标签创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务人员标签VO»", - "originalRef": "统一响应结果«服务人员标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务人员标签VO»", - "originalRef": "统一响应结果«服务人员标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/staff/tag/adhoc": { - "post": { - "tags": [ - "服务人员标签管理" - ], - "summary": "解析自定义标签", - "description": "按名称查找或自动创建标签。", - "operationId": "resolveAdHocTagUsingPOST_7", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签名称请求体", - "required": false, - "schema": { - "$ref": "#/definitions/服务人员标签创建请求", - "originalRef": "服务人员标签创建请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务人员标签VO»", - "originalRef": "统一响应结果«服务人员标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务人员标签VO»", - "originalRef": "统一响应结果«服务人员标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/staff/tag/{tagId}": { - "put": { - "tags": [ - "服务人员标签管理" - ], - "summary": "更新标签", - "description": "修改标签名称或颜色。", - "operationId": "updateTagUsingPUT_7", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/服务人员标签更新请求", - "originalRef": "服务人员标签更新请求" - } - }, - { - "name": "tagId", - "in": "path", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务人员标签VO»", - "originalRef": "统一响应结果«服务人员标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务人员标签VO»", - "originalRef": "统一响应结果«服务人员标签VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "服务人员标签管理" - ], - "summary": "删除标签", - "description": "删除标签并解除所有人员与该标签的关联。", - "operationId": "deleteTagUsingDELETE_7", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "tagId", - "in": "path", - "description": "标签ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/staff/tags": { - "get": { - "tags": [ - "服务人员标签管理" - ], - "summary": "预设标签列表(分页)", - "description": "分页查询服务人员标签库,支持按关键词搜索。", - "operationId": "listManagedTagsUsingGET_7", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«服务人员标签VO»»", - "originalRef": "统一响应结果«分页结果«服务人员标签VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«服务人员标签VO»»", - "originalRef": "统一响应结果«分页结果«服务人员标签VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/staff/tags/all": { - "get": { - "tags": [ - "服务人员标签管理" - ], - "summary": "全部标签列表", - "description": "不分页返回所有标签,用于人员编辑时的标签选择。", - "operationId": "listAllTagsUsingGET_7", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«服务人员标签VO»»", - "originalRef": "统一响应结果«List«服务人员标签VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«服务人员标签VO»»", - "originalRef": "统一响应结果«List«服务人员标签VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/staff/type/{staffType}/prices": { - "get": { - "tags": [ - "服务人员价格日历" - ], - "summary": "查询价格日历(按人员类型)", - "description": "按月查询指定人员类型的每日服务费用和可调度状态。注意:价格日历按人员类型维度管理,非按个人维度。同一类型的所有人员共享同一套价格。\n\n**关联字典**:\n- staff_type(人员类型)→ staffType路径参数", - "operationId": "getPriceCalendarUsingGET_6", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "month", - "in": "query", - "description": "月份", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "staffType", - "in": "path", - "description": "人员类型: GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER", - "required": false, - "type": "string" - }, - { - "name": "year", - "in": "query", - "description": "年份", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务人员价格日历VO»", - "originalRef": "统一响应结果«服务人员价格日历VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务人员价格日历VO»", - "originalRef": "统一响应结果«服务人员价格日历VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "服务人员价格日历" - ], - "summary": "批量设置价格(按人员类型)", - "description": "在指定日期范围内批量设置该类型人员的服务成本价和可调度状态。\n\n**关联字典**:\n- staff_type(人员类型)→ staffType路径参数", - "operationId": "batchSetPricesUsingPUT_6", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "价格日历设置请求", - "required": false, - "schema": { - "$ref": "#/definitions/服务人员价格日历设置请求", - "originalRef": "服务人员价格日历设置请求" - } - }, - { - "name": "staffType", - "in": "path", - "description": "人员类型: GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "服务人员价格日历" - ], - "summary": "清除价格日历(按人员类型)", - "description": "删除指定日期范围内该类型人员的价格记录。日期格式:yyyy-MM-dd。\n\n**关联字典**:\n- staff_type(人员类型)→ staffType路径参数", - "operationId": "deletePricesUsingDELETE_6", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "endDate", - "in": "query", - "description": "结束日期", - "required": false, - "type": "string", - "format": "date", - "allowEmptyValue": false - }, - { - "name": "staffType", - "in": "path", - "description": "人员类型: GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER", - "required": false, - "type": "string" - }, - { - "name": "startDate", - "in": "query", - "description": "开始日期", - "required": false, - "type": "string", - "format": "date", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/staff/type/{staffType}/prices/batch-status": { - "put": { - "tags": [ - "服务人员价格日历" - ], - "summary": "批量修改调度状态(按人员类型)", - "description": "批量修改日期范围内的可调度状态,不影响价格。\n\n**关联字典**:\n- staff_type(人员类型)→ staffType路径参数", - "operationId": "batchUpdateStatusUsingPUT_13", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "价格日历状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/服务人员价格日历状态变更请求", - "originalRef": "服务人员价格日历状态变更请求" - } - }, - { - "name": "staffType", - "in": "path", - "description": "人员类型: GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/staff/{staffId}": { - "get": { - "tags": [ - "服务人员管理" - ], - "summary": "服务人员详情", - "description": "获取服务人员完整信息,包含素材URL、标签、技能描述等。\n\n**关联字典**:\n- staff_type:人员类型(详情显示)\n- guide_level:导游等级(详情显示)\n- driver_license_type:驾照类型(详情显示)\n- language:语言能力(详情显示)\n- guide_specialty:导游专长(详情显示)\n- guide_service_area:服务区域(详情显示)", - "operationId": "getStaffUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "staffId", - "in": "path", - "description": "人员ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务人员详情VO»", - "originalRef": "统一响应结果«服务人员详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务人员详情VO»", - "originalRef": "统一响应结果«服务人员详情VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "服务人员管理" - ], - "summary": "更新服务人员", - "description": "更新服务人员基本信息,不改变当前状态。\n\n**关联字典**:\n- staff_type:人员类型(表单选择)\n- guide_level:导游等级(表单选择)\n- driver_license_type:驾照类型(表单选择)\n- language:语言能力(表单多选)\n- guide_specialty:导游专长(表单多选)\n- guide_service_area:服务区域(表单多选)", - "operationId": "updateStaffUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "服务人员更新请求", - "required": false, - "schema": { - "$ref": "#/definitions/服务人员更新请求", - "originalRef": "服务人员更新请求" - } - }, - { - "name": "staffId", - "in": "path", - "description": "人员ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务人员详情VO»", - "originalRef": "统一响应结果«服务人员详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«服务人员详情VO»", - "originalRef": "统一响应结果«服务人员详情VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "服务人员管理" - ], - "summary": "删除服务人员", - "description": "软删除服务人员。仅SUPER_ADMIN或创建者可操作。", - "operationId": "deleteStaffUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "staffId", - "in": "path", - "description": "人员ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/staff/{staffId}/status": { - "put": { - "tags": [ - "服务人员管理" - ], - "summary": "更新状态", - "description": "直接修改人员状态(跳过审批),仅限SUPER_ADMIN。状态值:0=下架,1=上架。", - "operationId": "updateStatusUsingPUT_7", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "状态请求体", - "required": false, - "schema": { - "$ref": "#/definitions/人员状态请求", - "originalRef": "人员状态请求" - } - }, - { - "name": "staffId", - "in": "path", - "description": "人员ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/staff/{staffId}/submit-approval": { - "post": { - "tags": [ - "服务人员管理" - ], - "summary": "提交审批", - "description": "向企微OA提交人员启用/禁用审批。targetStatus=1申请启用,targetStatus=2申请禁用。返回审批单号spNo。", - "operationId": "submitApprovalUsingPOST_8", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "审批提交请求体", - "required": false, - "schema": { - "$ref": "#/definitions/人员审批提交请求", - "originalRef": "人员审批提交请求" - } - }, - { - "name": "staffId", - "in": "path", - "description": "人员ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Map«string,string»»", - "originalRef": "统一响应结果«Map«string,string»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/staff/{staffId}/tags": { - "put": { - "tags": [ - "服务人员标签管理" - ], - "summary": "设置人员标签", - "description": "全量替换指定人员的标签列表。", - "operationId": "updateStaffTagsUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "标签ID列表请求", - "required": false, - "schema": { - "$ref": "#/definitions/设置人员标签请求", - "originalRef": "设置人员标签请求" - } - }, - { - "name": "staffId", - "in": "path", - "description": "人员ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - } - }, - "definitions": { - "Map«string,string»": { - "type": "object", - "title": "Map«string,string»", - "additionalProperties": { - "type": "string" - } - }, - "价格日历批量设置请求": { - "type": "object", - "required": [ - "costPrice", - "endDate", - "startDate" - ], - "properties": { - "costPrice": { - "type": "number", - "example": 150.0, - "description": "成本价(元)" - }, - "endDate": { - "type": "string", - "example": "2026-03-31", - "description": "结束日期" - }, - "excludeDates": { - "type": "array", - "example": [ - "2026-03-08", - "2026-03-15" - ], - "description": "排除的日期列表", - "items": { - "type": "string" - } - }, - "remark": { - "type": "string", - "example": "春季特价", - "description": "备注" - }, - "selectedWeekdays": { - "type": "array", - "example": [ - 1, - 2, - 3, - 4, - 5 - ], - "description": "选中的星期(1=周一...7=周日),为空时不做过滤", - "items": { - "type": "integer", - "format": "int32" - } - }, - "startDate": { - "type": "string", - "example": "2026-03-01", - "description": "开始日期" - }, - "status": { - "type": "string", - "example": "AVAILABLE", - "description": "日历状态(字典 calendar_status:AVAILABLE=可售 SOLD_OUT=已售罄 CLOSED=已关闭)" - }, - "stock": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "库存数量" - }, - "weekdayOnly": { - "type": "boolean", - "example": false, - "description": "仅工作日" - }, - "weekendOnly": { - "type": "boolean", - "example": false, - "description": "仅周末" - } - }, - "title": "价格日历批量设置请求" - }, - "价格日历日数据": { - "type": "object", - "properties": { - "costPrice": { - "type": "number", - "description": "成本价(元)" - }, - "date": { - "type": "string", - "format": "date", - "description": "日期" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "status": { - "type": "string", - "description": "日历状态(字典 calendar_status:AVAILABLE=可售 SOLD_OUT=已售罄 CLOSED=已关闭)" - }, - "stock": { - "type": "integer", - "format": "int32", - "description": "总库存" - }, - "stockUsed": { - "type": "integer", - "format": "int32", - "description": "已用库存" - } - }, - "title": "价格日历日数据" - }, - "价格日历月视图": { - "type": "object", - "properties": { - "month": { - "type": "integer", - "format": "int32", - "description": "月份" - }, - "prices": { - "type": "array", - "description": "每日价格列表", - "items": { - "$ref": "#/definitions/价格日历日数据", - "originalRef": "价格日历日数据" - } - }, - "scenicId": { - "type": "string", - "description": "景区ID" - }, - "scenicName": { - "type": "string", - "description": "景区名称" - }, - "stockEnabled": { - "type": "boolean", - "description": "是否启用库存管理" - }, - "year": { - "type": "integer", - "format": "int32", - "description": "年份" - } - }, - "title": "价格日历月视图" - }, - "价格日历状态变更请求": { - "type": "object", - "required": [ - "endDate", - "startDate", - "status" - ], - "properties": { - "endDate": { - "type": "string", - "example": "2026-03-31", - "description": "结束日期" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "startDate": { - "type": "string", - "example": "2026-03-01", - "description": "开始日期" - }, - "status": { - "type": "string", - "example": "CLOSED", - "description": "目标状态(字典 calendar_status:AVAILABLE=可售 SOLD_OUT=已售罄 CLOSED=已关闭)" - } - }, - "title": "价格日历状态变更请求" - }, - "分页结果«景区列表项»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/景区列表项", - "originalRef": "景区列表项" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«景区列表项»" - }, - "分页结果«景区标签»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/景区标签", - "originalRef": "景区标签" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«景区标签»" - }, - "审批提交请求": { - "type": "object", - "required": [ - "reason", - "targetStatus" - ], - "properties": { - "reason": { - "type": "string", - "example": "内容审核完毕,申请上架", - "description": "审批理由" - }, - "targetStatus": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "目标状态:0=下架 1=上架" - } - }, - "title": "审批提交请求" - }, - "景区列表项": { - "type": "object", - "properties": { - "approvalNo": { - "type": "string", - "description": "审批编号(审批中时有值)" - }, - "cityName": { - "type": "string", - "description": "所在城市" - }, - "contactPerson": { - "type": "string", - "description": "联系人姓名" - }, - "contactPhone": { - "type": "string", - "description": "联系人电话" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "highlights": { - "type": "string", - "description": "亮点简介" - }, - "honors": { - "type": "array", - "description": "荣誉称号列表", - "items": { - "type": "string" - } - }, - "latitude": { - "type": "number", - "description": "纬度" - }, - "longitude": { - "type": "number", - "description": "经度" - }, - "name": { - "type": "string", - "description": "景区名称" - }, - "pendingStatus": { - "type": "integer", - "format": "int32", - "description": "待审批目标状态" - }, - "rating": { - "type": "number", - "description": "评分" - }, - "reviewCount": { - "type": "integer", - "format": "int32", - "description": "评论数" - }, - "scenicId": { - "type": "string", - "description": "景区ID" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序权重" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下架 1=上架" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "$ref": "#/definitions/景区标签", - "originalRef": "景区标签" - } - }, - "viewCount": { - "type": "integer", - "format": "int32", - "description": "浏览量" - } - }, - "title": "景区列表项" - }, - "景区创建请求": { - "type": "object", - "required": [ - "city", - "cityName", - "latitude", - "longitude", - "name", - "province" - ], - "properties": { - "address": { - "type": "string", - "example": "西湖风景名胜区", - "description": "详细地址" - }, - "arrangement": { - "type": "string", - "description": "行程安排(富文本JSON)" - }, - "backupContactPerson": { - "type": "string", - "description": "备用联系人姓名" - }, - "backupContactPhone": { - "type": "string", - "description": "备用联系人电话" - }, - "bannerMaterialIds": { - "type": "array", - "description": "轮播图素材ID列表", - "items": { - "type": "string" - } - }, - "city": { - "type": "string", - "example": "杭州市", - "description": "城市(行政区划)" - }, - "cityName": { - "type": "string", - "example": "杭州", - "description": "所在城市(展示用)" - }, - "closedDay": { - "type": "string", - "example": "每周一", - "description": "闭园日" - }, - "contactPerson": { - "type": "string", - "example": "张三", - "description": "联系人姓名" - }, - "contactPhone": { - "type": "string", - "example": 13800138000, - "description": "联系人电话" - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "cultureExperience": { - "type": "string", - "description": "文化体验(富文本JSON)" - }, - "description": { - "type": "string", - "description": "景区描述" - }, - "detailContent": { - "type": "string", - "description": "详情内容(富文本JSON)" - }, - "district": { - "type": "string", - "example": "西湖区", - "description": "区/县" - }, - "facilities": { - "type": "array", - "example": [ - "parking", - "wifi", - "toilet" - ], - "description": "设施编码列表", - "items": { - "type": "string" - } - }, - "featureIntro": { - "type": "string", - "description": "特色介绍(富文本JSON)" - }, - "highlightSpots": { - "type": "string", - "description": "亮点景点(富文本JSON)" - }, - "highlights": { - "type": "string", - "example": "湖光山色,人间天堂", - "description": "亮点简介" - }, - "honors": { - "type": "array", - "example": [ - "5A级景区", - "世界遗产" - ], - "description": "荣誉称号列表", - "items": { - "type": "string" - } - }, - "interactiveExperience": { - "type": "string", - "description": "互动体验(富文本JSON)" - }, - "latitude": { - "type": "number", - "example": 30.2617, - "description": "纬度" - }, - "longitude": { - "type": "number", - "example": 120.1536, - "description": "经度" - }, - "name": { - "type": "string", - "example": "杭州西湖", - "description": "景区名称" - }, - "openTime": { - "type": "string", - "example": "08:00-17:30", - "description": "开放时间" - }, - "photographyGuide": { - "type": "string", - "description": "摄影指南(富文本JSON)" - }, - "province": { - "type": "string", - "example": "浙江省", - "description": "省份" - }, - "sceneryExperience": { - "type": "string", - "description": "风景体验(富文本JSON)" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序权重,越大越靠前" - }, - "status": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "状态:0=下架 1=上架" - }, - "travelPrep": { - "type": "string", - "description": "出行准备(富文本JSON)" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - } - }, - "title": "景区创建请求" - }, - "景区季节保存请求": { - "type": "object", - "required": [ - "monthEnd", - "monthStart" - ], - "properties": { - "bannerMaterialIds": { - "type": "array", - "description": "轮播图素材ID列表", - "items": { - "type": "string" - } - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "description": { - "type": "string", - "description": "季节描述" - }, - "highlights": { - "type": "string", - "description": "季节亮点" - }, - "monthEnd": { - "type": "integer", - "format": "int32", - "example": 5, - "description": "结束月份(1-12)" - }, - "monthStart": { - "type": "integer", - "format": "int32", - "example": 3, - "description": "开始月份(1-12)" - }, - "playGuide": { - "type": "string", - "description": "游玩攻略(富文本JSON)" - }, - "seasonName": { - "type": "string", - "example": "樱花季", - "description": "季节别名" - }, - "tips": { - "type": "string", - "description": "温馨提示" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - } - }, - "title": "景区季节保存请求" - }, - "景区季节内容": { - "type": "object", - "properties": { - "bannerMaterialIds": { - "type": "array", - "description": "轮播图素材ID列表", - "items": { - "type": "string" - } - }, - "bannerUrls": { - "type": "array", - "description": "轮播图URL列表", - "items": { - "type": "string" - } - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "description": { - "type": "string", - "description": "季节描述" - }, - "highlights": { - "type": "string", - "description": "季节亮点" - }, - "monthEnd": { - "type": "integer", - "format": "int32", - "description": "结束月份" - }, - "monthStart": { - "type": "integer", - "format": "int32", - "description": "开始月份" - }, - "playGuide": { - "type": "string", - "description": "游玩攻略(富文本JSON)" - }, - "scenicId": { - "type": "string", - "description": "景区ID" - }, - "seasonId": { - "type": "string", - "description": "季节ID" - }, - "seasonName": { - "type": "string", - "description": "季节别名" - }, - "seasonType": { - "type": "string", - "description": "季节类型:spring/summer/autumn/winter" - }, - "tips": { - "type": "string", - "description": "温馨提示" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - }, - "videoUrls": { - "type": "array", - "description": "视频URL列表", - "items": { - "type": "string" - } - } - }, - "title": "景区季节内容" - }, - "景区批量删除请求": { - "type": "object", - "required": [ - "scenicIds" - ], - "properties": { - "scenicIds": { - "type": "array", - "description": "景区ID列表", - "items": { - "type": "string" - } - } - }, - "title": "景区批量删除请求" - }, - "景区批量标签操作请求": { - "type": "object", - "required": [ - "scenicIds" - ], - "properties": { - "addTagIds": { - "type": "array", - "description": "要添加的标签ID列表", - "items": { - "type": "string" - } - }, - "removeTagIds": { - "type": "array", - "description": "要移除的标签ID列表", - "items": { - "type": "string" - } - }, - "scenicIds": { - "type": "array", - "description": "景区ID列表", - "items": { - "type": "string" - } - } - }, - "title": "景区批量标签操作请求" - }, - "景区更新请求": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "详细地址" - }, - "arrangement": { - "type": "string", - "description": "行程安排(富文本JSON)" - }, - "backupContactPerson": { - "type": "string", - "description": "备用联系人姓名" - }, - "backupContactPhone": { - "type": "string", - "description": "备用联系人电话" - }, - "bannerMaterialIds": { - "type": "array", - "description": "轮播图素材ID列表", - "items": { - "type": "string" - } - }, - "city": { - "type": "string", - "example": "杭州市", - "description": "城市(行政区划)" - }, - "cityName": { - "type": "string", - "example": "杭州", - "description": "所在城市(展示用)" - }, - "closedDay": { - "type": "string", - "example": "每周一", - "description": "闭园日" - }, - "contactPerson": { - "type": "string", - "description": "联系人姓名" - }, - "contactPhone": { - "type": "string", - "description": "联系人电话" - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "cultureExperience": { - "type": "string", - "description": "文化体验(富文本JSON)" - }, - "description": { - "type": "string", - "description": "景区描述" - }, - "detailContent": { - "type": "string", - "description": "详情内容(富文本JSON)" - }, - "district": { - "type": "string", - "example": "西湖区", - "description": "区/县" - }, - "facilities": { - "type": "array", - "description": "设施编码列表", - "items": { - "type": "string" - } - }, - "featureIntro": { - "type": "string", - "description": "特色介绍(富文本JSON)" - }, - "highlightSpots": { - "type": "string", - "description": "亮点景点(富文本JSON)" - }, - "highlights": { - "type": "string", - "description": "亮点简介" - }, - "honors": { - "type": "array", - "description": "荣誉称号列表", - "items": { - "type": "string" - } - }, - "interactiveExperience": { - "type": "string", - "description": "互动体验(富文本JSON)" - }, - "latitude": { - "type": "number", - "example": 30.2617, - "description": "纬度" - }, - "longitude": { - "type": "number", - "example": 120.1536, - "description": "经度" - }, - "name": { - "type": "string", - "example": "杭州西湖", - "description": "景区名称" - }, - "openTime": { - "type": "string", - "example": "08:00-17:30", - "description": "开放时间" - }, - "photographyGuide": { - "type": "string", - "description": "摄影指南(富文本JSON)" - }, - "province": { - "type": "string", - "example": "浙江省", - "description": "省份" - }, - "sceneryExperience": { - "type": "string", - "description": "风景体验(富文本JSON)" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序权重,越大越靠前" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下架 1=上架" - }, - "travelPrep": { - "type": "string", - "description": "出行准备(富文本JSON)" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - } - }, - "title": "景区更新请求" - }, - "景区标签": { - "type": "object", - "properties": { - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "tagColor": { - "type": "string", - "description": "标签颜色(十六进制)" - }, - "tagId": { - "type": "string", - "description": "标签ID" - }, - "tagName": { - "type": "string", - "description": "标签名称" - }, - "tagType": { - "type": "integer", - "format": "int32", - "description": "标签类型:0=自定义 1=系统预设" - }, - "useCount": { - "type": "integer", - "format": "int32", - "description": "使用次数" - } - }, - "title": "景区标签" - }, - "景区标签更新请求": { - "type": "object", - "properties": { - "tagIds": { - "type": "array", - "description": "标签ID列表(全量替换)", - "items": { - "type": "string" - } - } - }, - "title": "景区标签更新请求" - }, - "景区状态变更请求": { - "type": "object", - "required": [ - "status" - ], - "properties": { - "scenicIds": { - "type": "array", - "description": "景区ID列表", - "items": { - "type": "string" - } - }, - "status": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "目标状态:0=下架 1=上架" - } - }, - "title": "景区状态变更请求" - }, - "景区详情": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "详细地址" - }, - "arrangement": { - "type": "string", - "description": "行程安排(富文本JSON)" - }, - "backupContactPerson": { - "type": "string", - "description": "备用联系人姓名" - }, - "backupContactPhone": { - "type": "string", - "description": "备用联系人电话" - }, - "bannerMaterialIds": { - "type": "array", - "description": "轮播图素材ID列表", - "items": { - "type": "string" - } - }, - "bannerUrls": { - "type": "array", - "description": "轮播图URL列表", - "items": { - "type": "string" - } - }, - "city": { - "type": "string", - "description": "城市(行政区划)" - }, - "cityName": { - "type": "string", - "description": "所在城市(展示用)" - }, - "closedDay": { - "type": "string", - "description": "闭园日" - }, - "contactPerson": { - "type": "string", - "description": "联系人姓名" - }, - "contactPhone": { - "type": "string", - "description": "联系人电话" - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "string", - "description": "创建人ID" - }, - "createdByName": { - "type": "string", - "description": "创建人姓名" - }, - "cultureExperience": { - "type": "string", - "description": "文化体验(富文本JSON)" - }, - "description": { - "type": "string", - "description": "景区描述" - }, - "detailContent": { - "type": "string", - "description": "详情内容(富文本JSON)" - }, - "district": { - "type": "string", - "description": "区/县" - }, - "facilities": { - "type": "array", - "description": "设施编码列表", - "items": { - "type": "string" - } - }, - "facilityNames": { - "type": "array", - "description": "设施名称列表", - "items": { - "type": "string" - } - }, - "featureIntro": { - "type": "string", - "description": "特色介绍(富文本JSON)" - }, - "highlightSpots": { - "type": "string", - "description": "亮点景点(富文本JSON)" - }, - "highlights": { - "type": "string", - "description": "亮点简介" - }, - "honors": { - "type": "array", - "description": "荣誉称号列表", - "items": { - "type": "string" - } - }, - "interactiveExperience": { - "type": "string", - "description": "互动体验(富文本JSON)" - }, - "latitude": { - "type": "number", - "description": "纬度" - }, - "longitude": { - "type": "number", - "description": "经度" - }, - "name": { - "type": "string", - "description": "景区名称" - }, - "openTime": { - "type": "string", - "description": "开放时间" - }, - "photographyGuide": { - "type": "string", - "description": "摄影指南(富文本JSON)" - }, - "province": { - "type": "string", - "description": "省份" - }, - "rating": { - "type": "number", - "description": "评分" - }, - "reviewCount": { - "type": "integer", - "format": "int32", - "description": "评论数" - }, - "sceneryExperience": { - "type": "string", - "description": "风景体验(富文本JSON)" - }, - "scenicId": { - "type": "string", - "description": "景区ID" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序权重" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下架 1=上架" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "$ref": "#/definitions/景区标签", - "originalRef": "景区标签" - } - }, - "travelPrep": { - "type": "string", - "description": "出行准备(富文本JSON)" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - }, - "videoUrls": { - "type": "array", - "description": "视频URL列表", - "items": { - "type": "string" - } - }, - "viewCount": { - "type": "integer", - "format": "int32", - "description": "浏览量" - } - }, - "title": "景区详情" - }, - "标签创建请求": { - "type": "object", - "required": [ - "tagName" - ], - "properties": { - "tagColor": { - "type": "string", - "example": "#409EFF", - "description": "标签颜色(十六进制)" - }, - "tagName": { - "type": "string", - "example": "热门", - "description": "标签名称" - } - }, - "title": "标签创建请求" - }, - "标签更新请求": { - "type": "object", - "properties": { - "tagColor": { - "type": "string", - "example": "#409EFF", - "description": "标签颜色(十六进制)" - }, - "tagName": { - "type": "string", - "example": "热门", - "description": "标签名称" - } - }, - "title": "标签更新请求" - }, - "统一响应结果«List«景区季节内容»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/景区季节内容", - "originalRef": "景区季节内容" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«景区季节内容»»" - }, - "统一响应结果«List«景区标签»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/景区标签", - "originalRef": "景区标签" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«景区标签»»" - }, - "统一响应结果«Map«string,string»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "object", - "description": "响应数据", - "additionalProperties": { - "type": "string" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Map«string,string»»" - }, - "统一响应结果«Void»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Void»" - }, - "统一响应结果«价格日历月视图»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/价格日历月视图", - "originalRef": "价格日历月视图" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«价格日历月视图»" - }, - "统一响应结果«分页结果«景区列表项»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«景区列表项»", - "originalRef": "分页结果«景区列表项»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«景区列表项»»" - }, - "统一响应结果«分页结果«景区标签»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«景区标签»", - "originalRef": "分页结果«景区标签»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«景区标签»»" - }, - "统一响应结果«景区季节内容»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/景区季节内容", - "originalRef": "景区季节内容" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«景区季节内容»" - }, - "统一响应结果«景区标签»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/景区标签", - "originalRef": "景区标签" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«景区标签»" - }, - "统一响应结果«景区详情»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/景区详情", - "originalRef": "景区详情" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«景区详情»" - }, - "分页结果«餐厅列表视图»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/餐厅列表视图", - "originalRef": "餐厅列表视图" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«餐厅列表视图»" - }, - "分页结果«餐厅标签视图»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/餐厅标签视图", - "originalRef": "餐厅标签视图" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«餐厅标签视图»" - }, - "统一响应结果«List«餐厅标签视图»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/餐厅标签视图", - "originalRef": "餐厅标签视图" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«餐厅标签视图»»" - }, - "统一响应结果«分页结果«餐厅列表视图»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«餐厅列表视图»", - "originalRef": "分页结果«餐厅列表视图»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«餐厅列表视图»»" - }, - "统一响应结果«分页结果«餐厅标签视图»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«餐厅标签视图»", - "originalRef": "分页结果«餐厅标签视图»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«餐厅标签视图»»" - }, - "统一响应结果«餐厅标签视图»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/餐厅标签视图", - "originalRef": "餐厅标签视图" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«餐厅标签视图»" - }, - "统一响应结果«餐厅详情视图»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/餐厅详情视图", - "originalRef": "餐厅详情视图" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«餐厅详情视图»" - }, - "餐厅列表视图": { - "type": "object", - "properties": { - "approvalNo": { - "type": "string", - "description": "审批编号" - }, - "categoryCode": { - "type": "string", - "description": "分类编码" - }, - "categoryName": { - "type": "string", - "description": "分类名称" - }, - "cityName": { - "type": "string", - "description": "城市名称(纯文本)" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "cuisineType": { - "type": "string", - "description": "菜系类型编码" - }, - "cuisineTypeName": { - "type": "string", - "description": "菜系类型名称" - }, - "highlights": { - "type": "string", - "description": "亮点摘要" - }, - "name": { - "type": "string", - "description": "餐厅名称" - }, - "pendingStatus": { - "type": "integer", - "format": "int32", - "description": "待审批目标状态" - }, - "pricePerPerson": { - "type": "number", - "description": "人均消费(元)" - }, - "rating": { - "type": "number", - "description": "评分" - }, - "recommended": { - "type": "integer", - "format": "int32", - "description": "是否推荐:0=否 1=是" - }, - "restaurantId": { - "type": "string", - "description": "餐厅ID" - }, - "reviewCount": { - "type": "integer", - "format": "int32", - "description": "评论数" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序权重" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下架 1=上架" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "$ref": "#/definitions/餐厅标签视图", - "originalRef": "餐厅标签视图" - } - }, - "viewCount": { - "type": "integer", - "format": "int32", - "description": "浏览量" - } - }, - "title": "餐厅列表视图" - }, - "餐厅创建请求": { - "type": "object", - "required": [ - "categoryCode", - "city", - "cityName", - "latitude", - "longitude", - "name", - "province" - ], - "properties": { - "address": { - "type": "string", - "example": "北京中路100号", - "description": "详细地址" - }, - "arrangement": { - "type": "string", - "description": "座位布局说明" - }, - "bannerMaterialIds": { - "type": "array", - "description": "轮播图素材ID列表", - "items": { - "type": "string" - } - }, - "businessHours": { - "type": "string", - "example": "10:00-22:00", - "description": "营业时间" - }, - "capacity": { - "type": "integer", - "format": "int32", - "example": 80, - "description": "容纳人数" - }, - "categoryCode": { - "type": "string", - "example": "TIBETAN", - "description": "分类编码" - }, - "city": { - "type": "string", - "example": "拉萨市", - "description": "城市" - }, - "cityName": { - "type": "string", - "example": "拉萨", - "description": "城市名称(纯文本输入)" - }, - "closedDay": { - "type": "string", - "example": "每周一", - "description": "休息日" - }, - "coverMaterialId": { - "type": "string", - "example": 1001, - "description": "封面素材ID" - }, - "cuisineType": { - "type": "string", - "example": "TIBETAN", - "description": "菜系类型" - }, - "description": { - "type": "string", - "description": "餐厅描述" - }, - "district": { - "type": "string", - "example": "城关区", - "description": "区县" - }, - "environmentType": { - "type": "string", - "example": "INDOOR", - "description": "环境类型" - }, - "facilities": { - "type": "array", - "description": "设施列表", - "items": { - "type": "string" - } - }, - "featureIntro": { - "type": "string", - "description": "图文详情(JSON格式)" - }, - "featuredMenu": { - "type": "string", - "description": "招牌菜单(JSON格式)" - }, - "groupSizeMax": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "最多接待人数" - }, - "groupSizeMin": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "最少成行人数" - }, - "hasPrivateRoom": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "是否有包间:0=无 1=有" - }, - "highlights": { - "type": "string", - "example": "地道藏餐、酥油茶、糌粑", - "description": "亮点摘要" - }, - "latitude": { - "type": "number", - "example": 29.66, - "description": "纬度" - }, - "longitude": { - "type": "number", - "example": 91.132, - "description": "经度" - }, - "minAdvanceHours": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "最少提前预约小时数" - }, - "name": { - "type": "string", - "example": "云端藏餐", - "description": "餐厅名称" - }, - "phone": { - "type": "string", - "example": "0891-6812345", - "description": "联系电话" - }, - "pricePerPerson": { - "type": "number", - "example": 88.0, - "description": "人均消费(元)" - }, - "province": { - "type": "string", - "example": "西藏自治区", - "description": "省份" - }, - "recommended": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "是否推荐:0=否 1=是" - }, - "reservationRequired": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "是否需要预约:0=否 1=是" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序权重(数字越大越靠前)" - }, - "subtitle": { - "type": "string", - "example": "正宗藏式风味体验", - "description": "副标题" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - } - }, - "title": "餐厅创建请求" - }, - "餐厅审批提交请求": { - "type": "object", - "required": [ - "reason", - "targetStatus" - ], - "properties": { - "reason": { - "type": "string", - "example": "餐厅信息已完善,申请上架", - "description": "审批理由" - }, - "targetStatus": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "目标状态:0=下架 1=上架" - } - }, - "title": "餐厅审批提交请求" - }, - "餐厅批量删除请求": { - "type": "object", - "required": [ - "restaurantIds" - ], - "properties": { - "restaurantIds": { - "type": "array", - "example": [ - "1", - "2", - "3" - ], - "description": "餐厅ID列表", - "items": { - "type": "string" - } - } - }, - "title": "餐厅批量删除请求" - }, - "餐厅批量标签操作请求": { - "type": "object", - "required": [ - "restaurantIds" - ], - "properties": { - "addTagIds": { - "type": "array", - "example": [ - "10", - "11" - ], - "description": "要添加的标签ID列表", - "items": { - "type": "string" - } - }, - "removeTagIds": { - "type": "array", - "example": [ - "12" - ], - "description": "要移除的标签ID列表", - "items": { - "type": "string" - } - }, - "restaurantIds": { - "type": "array", - "example": [ - "1", - "2" - ], - "description": "餐厅ID列表", - "items": { - "type": "string" - } - } - }, - "title": "餐厅批量标签操作请求" - }, - "餐厅更新请求": { - "type": "object", - "properties": { - "address": { - "type": "string", - "example": "北京中路100号", - "description": "详细地址" - }, - "arrangement": { - "type": "string", - "description": "座位布局说明" - }, - "bannerMaterialIds": { - "type": "array", - "description": "轮播图素材ID列表", - "items": { - "type": "string" - } - }, - "businessHours": { - "type": "string", - "example": "10:00-22:00", - "description": "营业时间" - }, - "capacity": { - "type": "integer", - "format": "int32", - "example": 80, - "description": "容纳人数" - }, - "categoryCode": { - "type": "string", - "example": "TIBETAN", - "description": "分类编码" - }, - "city": { - "type": "string", - "example": "拉萨市", - "description": "城市" - }, - "cityName": { - "type": "string", - "example": "拉萨", - "description": "城市名称(纯文本输入)" - }, - "closedDay": { - "type": "string", - "example": "每周一", - "description": "休息日" - }, - "coverMaterialId": { - "type": "string", - "example": 1001, - "description": "封面素材ID" - }, - "cuisineType": { - "type": "string", - "example": "TIBETAN", - "description": "菜系类型" - }, - "description": { - "type": "string", - "description": "餐厅描述" - }, - "district": { - "type": "string", - "example": "城关区", - "description": "区县" - }, - "environmentType": { - "type": "string", - "example": "INDOOR", - "description": "环境类型" - }, - "facilities": { - "type": "array", - "description": "设施列表", - "items": { - "type": "string" - } - }, - "featureIntro": { - "type": "string", - "description": "图文详情(JSON格式)" - }, - "featuredMenu": { - "type": "string", - "description": "招牌菜单(JSON格式)" - }, - "groupSizeMax": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "最多接待人数" - }, - "groupSizeMin": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "最少成行人数" - }, - "hasPrivateRoom": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "是否有包间:0=无 1=有" - }, - "highlights": { - "type": "string", - "example": "地道藏餐、酥油茶、糌粑", - "description": "亮点摘要" - }, - "latitude": { - "type": "number", - "example": 29.66, - "description": "纬度" - }, - "longitude": { - "type": "number", - "example": 91.132, - "description": "经度" - }, - "minAdvanceHours": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "最少提前预约小时数" - }, - "name": { - "type": "string", - "example": "云端藏餐", - "description": "餐厅名称" - }, - "phone": { - "type": "string", - "example": "0891-6812345", - "description": "联系电话" - }, - "pricePerPerson": { - "type": "number", - "example": 88.0, - "description": "人均消费(元)" - }, - "province": { - "type": "string", - "example": "西藏自治区", - "description": "省份" - }, - "recommended": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "是否推荐:0=否 1=是" - }, - "reservationRequired": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "是否需要预约:0=否 1=是" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序权重(数字越大越靠前)" - }, - "status": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "状态:0=下架 1=上架" - }, - "subtitle": { - "type": "string", - "example": "正宗藏式风味体验", - "description": "副标题" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - } - }, - "title": "餐厅更新请求" - }, - "餐厅标签创建请求": { - "type": "object", - "required": [ - "tagName" - ], - "properties": { - "tagColor": { - "type": "string", - "example": "#FF5733", - "description": "标签颜色(十六进制)" - }, - "tagName": { - "type": "string", - "example": "藏餐", - "description": "标签名称" - } - }, - "title": "餐厅标签创建请求" - }, - "餐厅标签更新请求": { - "type": "object", - "properties": { - "tagColor": { - "type": "string", - "example": "#FF5733", - "description": "标签颜色(十六进制)" - }, - "tagName": { - "type": "string", - "example": "藏餐", - "description": "标签名称" - } - }, - "title": "餐厅标签更新请求" - }, - "餐厅标签更新请求_1": { - "type": "object", - "properties": { - "tagIds": { - "type": "array", - "description": "标签ID列表", - "items": { - "type": "string" - } - } - }, - "title": "餐厅标签更新请求_1" - }, - "餐厅标签视图": { - "type": "object", - "properties": { - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "tagColor": { - "type": "string", - "description": "标签颜色" - }, - "tagId": { - "type": "string", - "description": "标签ID" - }, - "tagName": { - "type": "string", - "description": "标签名称" - }, - "tagType": { - "type": "integer", - "format": "int32", - "description": "标签类型:1=系统标签 2=自定义标签" - }, - "useCount": { - "type": "integer", - "format": "int32", - "description": "使用次数" - } - }, - "title": "餐厅标签视图" - }, - "餐厅状态变更请求": { - "type": "object", - "required": [ - "status" - ], - "properties": { - "restaurantIds": { - "type": "array", - "description": "餐厅ID列表(批量操作)", - "items": { - "type": "string" - } - }, - "status": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "目标状态:0=下架 1=上架" - } - }, - "title": "餐厅状态变更请求" - }, - "餐厅详情视图": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "详细地址" - }, - "arrangement": { - "type": "string", - "description": "座位布局说明" - }, - "bannerMaterialIds": { - "type": "array", - "description": "轮播图素材ID列表", - "items": { - "type": "string" - } - }, - "bannerUrls": { - "type": "array", - "description": "轮播图URL列表", - "items": { - "type": "string" - } - }, - "businessHours": { - "type": "string", - "description": "营业时间" - }, - "capacity": { - "type": "integer", - "format": "int32", - "description": "容纳人数" - }, - "categoryCode": { - "type": "string", - "description": "分类编码" - }, - "categoryName": { - "type": "string", - "description": "分类名称" - }, - "city": { - "type": "string", - "description": "城市" - }, - "cityName": { - "type": "string", - "description": "城市名称(纯文本)" - }, - "closedDay": { - "type": "string", - "description": "休息日" - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "string", - "description": "创建人ID" - }, - "createdByName": { - "type": "string", - "description": "创建人姓名" - }, - "cuisineType": { - "type": "string", - "description": "菜系类型编码" - }, - "cuisineTypeName": { - "type": "string", - "description": "菜系类型名称" - }, - "description": { - "type": "string", - "description": "餐厅描述" - }, - "district": { - "type": "string", - "description": "区县" - }, - "environmentType": { - "type": "string", - "description": "环境类型" - }, - "facilities": { - "type": "array", - "description": "设施编码列表", - "items": { - "type": "string" - } - }, - "facilityNames": { - "type": "array", - "description": "设施名称列表", - "items": { - "type": "string" - } - }, - "featureIntro": { - "type": "string", - "description": "图文详情(JSON格式)" - }, - "featuredMenu": { - "type": "string", - "description": "招牌菜单(JSON格式)" - }, - "groupSizeMax": { - "type": "integer", - "format": "int32", - "description": "最多接待人数" - }, - "groupSizeMin": { - "type": "integer", - "format": "int32", - "description": "最少成行人数" - }, - "hasPrivateRoom": { - "type": "integer", - "format": "int32", - "description": "是否有包间:0=无 1=有" - }, - "highlights": { - "type": "string", - "description": "亮点摘要" - }, - "latitude": { - "type": "number", - "description": "纬度" - }, - "longitude": { - "type": "number", - "description": "经度" - }, - "minAdvanceHours": { - "type": "integer", - "format": "int32", - "description": "最少提前预约小时数" - }, - "name": { - "type": "string", - "description": "餐厅名称" - }, - "phone": { - "type": "string", - "description": "联系电话" - }, - "pricePerPerson": { - "type": "number", - "description": "人均消费(元)" - }, - "province": { - "type": "string", - "description": "省份" - }, - "rating": { - "type": "number", - "description": "评分" - }, - "recommended": { - "type": "integer", - "format": "int32", - "description": "是否推荐:0=否 1=是" - }, - "reservationRequired": { - "type": "integer", - "format": "int32", - "description": "是否需要预约:0=否 1=是" - }, - "restaurantId": { - "type": "string", - "description": "餐厅ID" - }, - "reviewCount": { - "type": "integer", - "format": "int32", - "description": "评论数" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序权重" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下架 1=上架" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "$ref": "#/definitions/餐厅标签视图", - "originalRef": "餐厅标签视图" - } - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - }, - "videoUrls": { - "type": "array", - "description": "视频URL列表", - "items": { - "type": "string" - } - }, - "viewCount": { - "type": "integer", - "format": "int32", - "description": "浏览量" - } - }, - "title": "餐厅详情视图" - }, - "分页结果«备品列表视图»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/备品列表视图", - "originalRef": "备品列表视图" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«备品列表视图»" - }, - "分页结果«备品标签视图»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/备品标签视图", - "originalRef": "备品标签视图" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«备品标签视图»" - }, - "备品列表视图": { - "type": "object", - "properties": { - "approvalNo": { - "type": "string", - "description": "审批编号" - }, - "basePrice": { - "type": "number", - "description": "基础单价(元)" - }, - "billingType": { - "type": "string", - "description": "计费方式编码" - }, - "billingTypeName": { - "type": "string", - "description": "计费方式名称" - }, - "categoryCode": { - "type": "string", - "description": "分类编码" - }, - "categoryName": { - "type": "string", - "description": "分类名称" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "highlights": { - "type": "string", - "description": "亮点摘要" - }, - "name": { - "type": "string", - "description": "备品名称" - }, - "pendingStatus": { - "type": "integer", - "format": "int32", - "description": "待审批目标状态" - }, - "recommended": { - "type": "integer", - "format": "int32", - "description": "是否推荐:0=否 1=是" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序权重" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下架 1=上架" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "suppliesId": { - "type": "string", - "description": "备品ID" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "$ref": "#/definitions/备品标签视图", - "originalRef": "备品标签视图" - } - }, - "unit": { - "type": "string", - "description": "计量单位" - }, - "viewCount": { - "type": "integer", - "format": "int32", - "description": "浏览量" - } - }, - "title": "备品列表视图" - }, - "备品创建请求": { - "type": "object", - "required": [ - "basePrice", - "billingType", - "categoryCode", - "name" - ], - "properties": { - "bannerMaterialIds": { - "type": "array", - "description": "轮播图素材ID列表", - "items": { - "type": "string" - } - }, - "basePrice": { - "type": "number", - "example": 25.0, - "description": "基础单价(元)" - }, - "billingType": { - "type": "string", - "example": "PER_ITEM", - "description": "计费方式:PER_ITEM=按件 PER_DAY=按天" - }, - "brand": { - "type": "string", - "example": "Black Diamond", - "description": "品牌" - }, - "categoryCode": { - "type": "string", - "example": "OUTDOOR_GEAR", - "description": "分类编码" - }, - "coverMaterialId": { - "type": "string", - "example": 1001, - "description": "封面素材ID" - }, - "description": { - "type": "string", - "description": "备品描述" - }, - "featureIntro": { - "type": "string", - "description": "图文详情(JSON格式)" - }, - "highlights": { - "type": "string", - "example": "超轻碳纤维材质,可折叠收纳", - "description": "亮点摘要" - }, - "includes": { - "type": "array", - "description": "包含物品清单", - "items": { - "type": "string" - } - }, - "model": { - "type": "string", - "example": "Trail Ergo Cork", - "description": "型号" - }, - "name": { - "type": "string", - "example": "登山杖", - "description": "备品名称" - }, - "recommended": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "是否推荐:0=否 1=是" - }, - "sizeOptions": { - "type": "array", - "description": "可选尺码列表", - "items": { - "type": "string" - } - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序权重(数字越大越靠前)" - }, - "specifications": { - "type": "string", - "description": "规格参数(JSON格式)" - }, - "subtitle": { - "type": "string", - "example": "碳纤维轻量登山杖", - "description": "副标题" - }, - "unit": { - "type": "string", - "example": "根", - "description": "计量单位" - }, - "usageNotes": { - "type": "string", - "description": "使用注意事项" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - }, - "weight": { - "type": "number", - "example": 0.35, - "description": "重量(kg)" - } - }, - "title": "备品创建请求" - }, - "备品审批提交请求": { - "type": "object", - "required": [ - "reason", - "targetStatus" - ], - "properties": { - "reason": { - "type": "string", - "example": "备品信息已完善,申请上架", - "description": "审批理由" - }, - "targetStatus": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "目标状态:0=下架 1=上架" - } - }, - "title": "备品审批提交请求" - }, - "备品批量删除请求": { - "type": "object", - "required": [ - "suppliesIds" - ], - "properties": { - "suppliesIds": { - "type": "array", - "example": [ - "1", - "2", - "3" - ], - "description": "备品ID列表", - "items": { - "type": "string" - } - } - }, - "title": "备品批量删除请求" - }, - "备品批量标签操作请求": { - "type": "object", - "required": [ - "suppliesIds" - ], - "properties": { - "addTagIds": { - "type": "array", - "example": [ - "10", - "11" - ], - "description": "要添加的标签ID列表", - "items": { - "type": "string" - } - }, - "removeTagIds": { - "type": "array", - "example": [ - "12" - ], - "description": "要移除的标签ID列表", - "items": { - "type": "string" - } - }, - "suppliesIds": { - "type": "array", - "example": [ - "1", - "2" - ], - "description": "备品ID列表", - "items": { - "type": "string" - } - } - }, - "title": "备品批量标签操作请求" - }, - "备品更新请求": { - "type": "object", - "properties": { - "bannerMaterialIds": { - "type": "array", - "description": "轮播图素材ID列表", - "items": { - "type": "string" - } - }, - "basePrice": { - "type": "number", - "example": 25.0, - "description": "基础单价(元)" - }, - "billingType": { - "type": "string", - "example": "PER_ITEM", - "description": "计费方式:PER_ITEM=按件 PER_DAY=按天" - }, - "brand": { - "type": "string", - "example": "Black Diamond", - "description": "品牌" - }, - "categoryCode": { - "type": "string", - "example": "OUTDOOR_GEAR", - "description": "分类编码" - }, - "coverMaterialId": { - "type": "string", - "example": 1001, - "description": "封面素材ID" - }, - "description": { - "type": "string", - "description": "备品描述" - }, - "featureIntro": { - "type": "string", - "description": "图文详情(JSON格式)" - }, - "highlights": { - "type": "string", - "example": "超轻碳纤维材质,可折叠收纳", - "description": "亮点摘要" - }, - "includes": { - "type": "array", - "description": "包含物品清单", - "items": { - "type": "string" - } - }, - "model": { - "type": "string", - "example": "Trail Ergo Cork", - "description": "型号" - }, - "name": { - "type": "string", - "example": "登山杖", - "description": "备品名称" - }, - "recommended": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "是否推荐:0=否 1=是" - }, - "sizeOptions": { - "type": "array", - "description": "可选尺码列表", - "items": { - "type": "string" - } - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序权重(数字越大越靠前)" - }, - "specifications": { - "type": "string", - "description": "规格参数(JSON格式)" - }, - "status": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "状态:0=下架 1=上架" - }, - "subtitle": { - "type": "string", - "example": "碳纤维轻量登山杖", - "description": "副标题" - }, - "unit": { - "type": "string", - "example": "根", - "description": "计量单位" - }, - "usageNotes": { - "type": "string", - "description": "使用注意事项" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - }, - "weight": { - "type": "number", - "example": 0.35, - "description": "重量(kg)" - } - }, - "title": "备品更新请求" - }, - "备品标签创建请求": { - "type": "object", - "required": [ - "tagName" - ], - "properties": { - "tagColor": { - "type": "string", - "example": "#FF5733", - "description": "标签颜色(十六进制)" - }, - "tagName": { - "type": "string", - "example": "户外装备", - "description": "标签名称" - } - }, - "title": "备品标签创建请求" - }, - "备品标签更新请求": { - "type": "object", - "properties": { - "tagColor": { - "type": "string", - "example": "#FF5733", - "description": "标签颜色(十六进制)" - }, - "tagName": { - "type": "string", - "example": "户外装备", - "description": "标签名称" - } - }, - "title": "备品标签更新请求" - }, - "备品标签更新请求_1": { - "type": "object", - "properties": { - "tagIds": { - "type": "array", - "description": "标签ID列表", - "items": { - "type": "string" - } - } - }, - "title": "备品标签更新请求_1" - }, - "备品标签视图": { - "type": "object", - "properties": { - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "tagColor": { - "type": "string", - "description": "标签颜色" - }, - "tagId": { - "type": "string", - "description": "标签ID" - }, - "tagName": { - "type": "string", - "description": "标签名称" - }, - "tagType": { - "type": "integer", - "format": "int32", - "description": "标签类型:1=系统标签 2=自定义标签" - }, - "useCount": { - "type": "integer", - "format": "int32", - "description": "使用次数" - } - }, - "title": "备品标签视图" - }, - "备品状态变更请求": { - "type": "object", - "required": [ - "status" - ], - "properties": { - "status": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "目标状态:0=下架 1=上架" - }, - "suppliesIds": { - "type": "array", - "description": "备品ID列表(批量操作)", - "items": { - "type": "string" - } - } - }, - "title": "备品状态变更请求" - }, - "备品详情视图": { - "type": "object", - "properties": { - "bannerMaterialIds": { - "type": "array", - "description": "轮播图素材ID列表", - "items": { - "type": "string" - } - }, - "bannerUrls": { - "type": "array", - "description": "轮播图URL列表", - "items": { - "type": "string" - } - }, - "basePrice": { - "type": "number", - "description": "基础单价(元)" - }, - "billingType": { - "type": "string", - "description": "计费方式编码" - }, - "billingTypeName": { - "type": "string", - "description": "计费方式名称" - }, - "brand": { - "type": "string", - "description": "品牌" - }, - "categoryCode": { - "type": "string", - "description": "分类编码" - }, - "categoryName": { - "type": "string", - "description": "分类名称" - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "string", - "description": "创建人ID" - }, - "createdByName": { - "type": "string", - "description": "创建人姓名" - }, - "description": { - "type": "string", - "description": "备品描述" - }, - "featureIntro": { - "type": "string", - "description": "图文详情(JSON格式)" - }, - "highlights": { - "type": "string", - "description": "亮点摘要" - }, - "includes": { - "type": "array", - "description": "包含物品清单", - "items": { - "type": "string" - } - }, - "model": { - "type": "string", - "description": "型号" - }, - "name": { - "type": "string", - "description": "备品名称" - }, - "recommended": { - "type": "integer", - "format": "int32", - "description": "是否推荐:0=否 1=是" - }, - "sizeOptions": { - "type": "array", - "description": "可选尺码列表", - "items": { - "type": "string" - } - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序权重" - }, - "specifications": { - "type": "string", - "description": "规格参数(JSON格式)" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下架 1=上架" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "suppliesId": { - "type": "string", - "description": "备品ID" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "$ref": "#/definitions/备品标签视图", - "originalRef": "备品标签视图" - } - }, - "unit": { - "type": "string", - "description": "计量单位" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "usageNotes": { - "type": "string", - "description": "使用注意事项" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - }, - "videoUrls": { - "type": "array", - "description": "视频URL列表", - "items": { - "type": "string" - } - }, - "viewCount": { - "type": "integer", - "format": "int32", - "description": "浏览量" - }, - "weight": { - "type": "number", - "description": "重量(kg)" - } - }, - "title": "备品详情视图" - }, - "统一响应结果«List«备品标签视图»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/备品标签视图", - "originalRef": "备品标签视图" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«备品标签视图»»" - }, - "统一响应结果«分页结果«备品列表视图»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«备品列表视图»", - "originalRef": "分页结果«备品列表视图»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«备品列表视图»»" - }, - "统一响应结果«分页结果«备品标签视图»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«备品标签视图»", - "originalRef": "分页结果«备品标签视图»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«备品标签视图»»" - }, - "统一响应结果«备品标签视图»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/备品标签视图", - "originalRef": "备品标签视图" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«备品标签视图»" - }, - "统一响应结果«备品详情视图»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/备品详情视图", - "originalRef": "备品详情视图" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«备品详情视图»" - }, - "分页结果«活动标签视图»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/活动标签视图", - "originalRef": "活动标签视图" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«活动标签视图»" - }, - "分页结果«活动项目列表视图»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/活动项目列表视图", - "originalRef": "活动项目列表视图" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«活动项目列表视图»" - }, - "活动价格日历日视图": { - "type": "object", - "properties": { - "costPrice": { - "type": "number", - "description": "成本价(元)" - }, - "date": { - "type": "string", - "format": "date", - "description": "日期" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "status": { - "type": "string", - "description": "日历状态(字典 calendar_status:AVAILABLE=可售 SOLD_OUT=已售罄 CLOSED=已关闭)" - }, - "stock": { - "type": "integer", - "format": "int32", - "description": "库存数量" - }, - "stockUsed": { - "type": "integer", - "format": "int32", - "description": "已用库存" - } - }, - "title": "活动价格日历日视图" - }, - "活动价格日历状态变更请求": { - "type": "object", - "required": [ - "endDate", - "startDate", - "status" - ], - "properties": { - "endDate": { - "type": "string", - "example": "2026-03-31", - "description": "结束日期" - }, - "remark": { - "type": "string", - "example": "临时关闭", - "description": "备注" - }, - "startDate": { - "type": "string", - "example": "2026-03-01", - "description": "开始日期" - }, - "status": { - "type": "string", - "example": "CLOSED", - "description": "目标状态(字典 calendar_status:AVAILABLE=可售 SOLD_OUT=已售罄 CLOSED=已关闭)" - } - }, - "title": "活动价格日历状态变更请求" - }, - "活动价格日历视图": { - "type": "object", - "properties": { - "activityId": { - "type": "string", - "description": "活动项目ID" - }, - "activityName": { - "type": "string", - "description": "活动项目名称" - }, - "month": { - "type": "integer", - "format": "int32", - "description": "月份" - }, - "prices": { - "type": "array", - "description": "价格日历每日数据列表", - "items": { - "$ref": "#/definitions/活动价格日历日视图", - "originalRef": "活动价格日历日视图" - } - }, - "stockEnabled": { - "type": "boolean", - "description": "是否启用库存管理" - }, - "year": { - "type": "integer", - "format": "int32", - "description": "年份" - } - }, - "title": "活动价格日历视图" - }, - "活动价格日历设置请求": { - "type": "object", - "required": [ - "costPrice", - "endDate", - "startDate" - ], - "properties": { - "costPrice": { - "type": "number", - "example": 150.0, - "description": "成本价(元)" - }, - "endDate": { - "type": "string", - "example": "2026-03-31", - "description": "结束日期" - }, - "excludeDates": { - "type": "array", - "example": [ - "2026-03-08", - "2026-03-15" - ], - "description": "排除日期列表", - "items": { - "type": "string" - } - }, - "remark": { - "type": "string", - "example": "旺季价格", - "description": "备注" - }, - "selectedWeekdays": { - "type": "array", - "example": [ - 1, - 2, - 3, - 4, - 5 - ], - "description": "指定星期几(1=周一 7=周日)", - "items": { - "type": "integer", - "format": "int32" - } - }, - "startDate": { - "type": "string", - "example": "2026-03-01", - "description": "开始日期" - }, - "status": { - "type": "string", - "example": "AVAILABLE", - "description": "日历状态(字典 calendar_status:AVAILABLE=可售 SOLD_OUT=已售罄 CLOSED=已关闭)" - }, - "stock": { - "type": "integer", - "format": "int32", - "example": 50, - "description": "库存数量" - }, - "weekdayOnly": { - "type": "boolean", - "example": false, - "description": "是否仅工作日" - }, - "weekendOnly": { - "type": "boolean", - "example": false, - "description": "是否仅周末" - } - }, - "title": "活动价格日历设置请求" - }, - "活动标签创建请求": { - "type": "object", - "required": [ - "tagName" - ], - "properties": { - "tagColor": { - "type": "string", - "example": "#FF5733", - "description": "标签颜色(十六进制)" - }, - "tagName": { - "type": "string", - "example": "户外探险", - "description": "标签名称" - } - }, - "title": "活动标签创建请求" - }, - "活动标签更新请求": { - "type": "object", - "properties": { - "tagColor": { - "type": "string", - "example": "#FF5733", - "description": "标签颜色(十六进制)" - }, - "tagName": { - "type": "string", - "example": "户外探险", - "description": "标签名称" - } - }, - "title": "活动标签更新请求" - }, - "活动标签视图": { - "type": "object", - "properties": { - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "tagColor": { - "type": "string", - "description": "标签颜色" - }, - "tagId": { - "type": "string", - "description": "标签ID" - }, - "tagName": { - "type": "string", - "description": "标签名称" - }, - "tagType": { - "type": "integer", - "format": "int32", - "description": "标签类型:1=系统标签 2=自定义标签" - }, - "useCount": { - "type": "integer", - "format": "int32", - "description": "使用次数" - } - }, - "title": "活动标签视图" - }, - "活动项目列表视图": { - "type": "object", - "properties": { - "activityId": { - "type": "string", - "description": "活动项目ID" - }, - "approvalNo": { - "type": "string", - "description": "审批编号" - }, - "billingType": { - "type": "string", - "description": "计费方式编码" - }, - "categoryCode": { - "type": "string", - "description": "分类编码" - }, - "city": { - "type": "string", - "description": "城市" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "durationMinutes": { - "type": "integer", - "format": "int32", - "description": "体验时长(分钟)" - }, - "environmentType": { - "type": "string", - "description": "环境类型:INDOOR=室内 OUTDOOR=室外 BOTH=室内外" - }, - "highlights": { - "type": "string", - "description": "项目亮点" - }, - "latitude": { - "type": "number", - "description": "纬度" - }, - "longitude": { - "type": "number", - "description": "经度" - }, - "name": { - "type": "string", - "description": "项目名称" - }, - "pendingStatus": { - "type": "integer", - "format": "int32", - "description": "待审批目标状态" - }, - "physicalLevel": { - "type": "string", - "description": "体力要求:LOW=低 MEDIUM=中 HIGH=高" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序权重" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下架 1=上架" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "$ref": "#/definitions/活动标签视图", - "originalRef": "活动标签视图" - } - }, - "unit": { - "type": "string", - "description": "计量单位" - }, - "viewCount": { - "type": "integer", - "format": "int32", - "description": "浏览量" - }, - "weatherDependent": { - "type": "integer", - "format": "int32", - "description": "是否受天气影响:0=否 1=是" - } - }, - "title": "活动项目列表视图" - }, - "活动项目创建请求": { - "type": "object", - "required": [ - "billingType", - "categoryCode", - "name" - ], - "properties": { - "address": { - "type": "string", - "example": "拉萨河谷骑马基地", - "description": "详细地址" - }, - "ageMax": { - "type": "integer", - "format": "int32", - "example": 65, - "description": "最大年龄限制" - }, - "ageMin": { - "type": "integer", - "format": "int32", - "example": 8, - "description": "最小年龄限制" - }, - "bannerMaterialIds": { - "type": "array", - "description": "轮播图素材ID列表", - "items": { - "type": "string" - } - }, - "bestSeason": { - "type": "string", - "example": "5月-10月", - "description": "最佳季节" - }, - "billingType": { - "type": "string", - "example": "PER_PERSON", - "description": "计费方式:PER_PERSON=按人 PER_GROUP=按团 PER_HOUR=按时" - }, - "categoryCode": { - "type": "string", - "example": "OUTDOOR", - "description": "分类编码" - }, - "city": { - "type": "string", - "example": "拉萨市", - "description": "城市" - }, - "contactPhone": { - "type": "string", - "example": 13800138000, - "description": "联系电话" - }, - "coverMaterialId": { - "type": "string", - "example": 1001, - "description": "封面素材ID" - }, - "dailyCapacity": { - "type": "integer", - "format": "int32", - "example": 50, - "description": "每日接待上限" - }, - "description": { - "type": "string", - "description": "项目描述" - }, - "district": { - "type": "string", - "example": "城关区", - "description": "区县" - }, - "durationMinutes": { - "type": "integer", - "format": "int32", - "example": 120, - "description": "体验时长(分钟)" - }, - "environmentType": { - "type": "string", - "example": "OUTDOOR", - "description": "环境类型:INDOOR=室内 OUTDOOR=室外 BOTH=室内外" - }, - "groupSizeMax": { - "type": "integer", - "format": "int32", - "example": 10, - "description": "单次最多人数" - }, - "groupSizeMin": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "最少成行人数" - }, - "healthNotes": { - "type": "string", - "description": "健康须知" - }, - "highlights": { - "type": "string", - "example": "专业马术教练全程指导", - "description": "项目亮点" - }, - "latitude": { - "type": "number", - "example": 29.66, - "description": "纬度" - }, - "longitude": { - "type": "number", - "example": 91.132, - "description": "经度" - }, - "name": { - "type": "string", - "example": "高原骑马体验", - "description": "项目名称" - }, - "physicalLevel": { - "type": "string", - "example": "MEDIUM", - "description": "体力要求:LOW=低 MEDIUM=中 HIGH=高" - }, - "providedEquipment": { - "type": "string", - "description": "提供装备说明" - }, - "province": { - "type": "string", - "example": "西藏自治区", - "description": "省份" - }, - "requiredEquipment": { - "type": "string", - "description": "需自备装备说明" - }, - "safetyNotes": { - "type": "string", - "description": "安全须知" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序权重(数字越大越靠前)" - }, - "subtitle": { - "type": "string", - "example": "策马奔腾在雪域高原", - "description": "副标题" - }, - "unit": { - "type": "string", - "example": "人/次", - "description": "计量单位" - }, - "usageNotes": { - "type": "string", - "description": "使用注意事项" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - }, - "weatherDependent": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "是否受天气影响:0=否 1=是" - }, - "whatExcluded": { - "type": "string", - "description": "费用不包含说明" - }, - "whatIncluded": { - "type": "string", - "description": "费用包含说明" - } - }, - "title": "活动项目创建请求" - }, - "活动项目审批提交请求": { - "type": "object", - "required": [ - "reason", - "targetStatus" - ], - "properties": { - "reason": { - "type": "string", - "example": "活动信息已完善,申请上架", - "description": "审批理由" - }, - "targetStatus": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "目标状态:0=下架 1=上架" - } - }, - "title": "活动项目审批提交请求" - }, - "活动项目批量删除请求": { - "type": "object", - "required": [ - "activityIds" - ], - "properties": { - "activityIds": { - "type": "array", - "example": [ - "1", - "2", - "3" - ], - "description": "活动项目ID列表", - "items": { - "type": "string" - } - } - }, - "title": "活动项目批量删除请求" - }, - "活动项目批量标签操作请求": { - "type": "object", - "required": [ - "activityIds" - ], - "properties": { - "activityIds": { - "type": "array", - "example": [ - "1", - "2" - ], - "description": "活动项目ID列表", - "items": { - "type": "string" - } - }, - "addTagIds": { - "type": "array", - "example": [ - "10", - "11" - ], - "description": "要添加的标签ID列表", - "items": { - "type": "string" - } - }, - "removeTagIds": { - "type": "array", - "example": [ - "12" - ], - "description": "要移除的标签ID列表", - "items": { - "type": "string" - } - } - }, - "title": "活动项目批量标签操作请求" - }, - "活动项目更新请求": { - "type": "object", - "properties": { - "address": { - "type": "string", - "example": "拉萨河谷骑马基地", - "description": "详细地址" - }, - "ageMax": { - "type": "integer", - "format": "int32", - "example": 65, - "description": "最大年龄限制" - }, - "ageMin": { - "type": "integer", - "format": "int32", - "example": 8, - "description": "最小年龄限制" - }, - "bannerMaterialIds": { - "type": "array", - "description": "轮播图素材ID列表", - "items": { - "type": "string" - } - }, - "bestSeason": { - "type": "string", - "example": "5月-10月", - "description": "最佳季节" - }, - "billingType": { - "type": "string", - "example": "PER_PERSON", - "description": "计费方式:PER_PERSON=按人 PER_GROUP=按团 PER_HOUR=按时" - }, - "categoryCode": { - "type": "string", - "example": "OUTDOOR", - "description": "分类编码" - }, - "city": { - "type": "string", - "example": "拉萨市", - "description": "城市" - }, - "contactPhone": { - "type": "string", - "example": 13800138000, - "description": "联系电话" - }, - "coverMaterialId": { - "type": "string", - "example": 1001, - "description": "封面素材ID" - }, - "dailyCapacity": { - "type": "integer", - "format": "int32", - "example": 50, - "description": "每日接待上限" - }, - "description": { - "type": "string", - "description": "项目描述" - }, - "district": { - "type": "string", - "example": "城关区", - "description": "区县" - }, - "durationMinutes": { - "type": "integer", - "format": "int32", - "example": 120, - "description": "体验时长(分钟)" - }, - "environmentType": { - "type": "string", - "example": "OUTDOOR", - "description": "环境类型:INDOOR=室内 OUTDOOR=室外 BOTH=室内外" - }, - "groupSizeMax": { - "type": "integer", - "format": "int32", - "example": 10, - "description": "单次最多人数" - }, - "groupSizeMin": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "最少成行人数" - }, - "healthNotes": { - "type": "string", - "description": "健康须知" - }, - "highlights": { - "type": "string", - "example": "专业马术教练全程指导", - "description": "项目亮点" - }, - "latitude": { - "type": "number", - "example": 29.66, - "description": "纬度" - }, - "longitude": { - "type": "number", - "example": 91.132, - "description": "经度" - }, - "name": { - "type": "string", - "example": "高原骑马体验", - "description": "项目名称" - }, - "physicalLevel": { - "type": "string", - "example": "MEDIUM", - "description": "体力要求:LOW=低 MEDIUM=中 HIGH=高" - }, - "providedEquipment": { - "type": "string", - "description": "提供装备说明" - }, - "province": { - "type": "string", - "example": "西藏自治区", - "description": "省份" - }, - "requiredEquipment": { - "type": "string", - "description": "需自备装备说明" - }, - "safetyNotes": { - "type": "string", - "description": "安全须知" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序权重(数字越大越靠前)" - }, - "subtitle": { - "type": "string", - "example": "策马奔腾在雪域高原", - "description": "副标题" - }, - "unit": { - "type": "string", - "example": "人/次", - "description": "计量单位" - }, - "usageNotes": { - "type": "string", - "description": "使用注意事项" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - }, - "weatherDependent": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "是否受天气影响:0=否 1=是" - }, - "whatExcluded": { - "type": "string", - "description": "费用不包含说明" - }, - "whatIncluded": { - "type": "string", - "description": "费用包含说明" - } - }, - "title": "活动项目更新请求" - }, - "活动项目标签更新请求": { - "type": "object", - "properties": { - "tagIds": { - "type": "array", - "description": "标签ID列表", - "items": { - "type": "string" - } - } - }, - "title": "活动项目标签更新请求" - }, - "活动项目状态变更请求": { - "type": "object", - "required": [ - "status" - ], - "properties": { - "activityIds": { - "type": "array", - "description": "活动项目ID列表(批量操作)", - "items": { - "type": "string" - } - }, - "status": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "目标状态:0=下架 1=上架" - } - }, - "title": "活动项目状态变更请求" - }, - "活动项目详情视图": { - "type": "object", - "properties": { - "activityId": { - "type": "string", - "description": "活动项目ID" - }, - "address": { - "type": "string", - "description": "详细地址" - }, - "ageMax": { - "type": "integer", - "format": "int32", - "description": "最大年龄限制" - }, - "ageMin": { - "type": "integer", - "format": "int32", - "description": "最小年龄限制" - }, - "bannerMaterialIds": { - "type": "array", - "description": "轮播图素材ID列表", - "items": { - "type": "string" - } - }, - "bannerUrls": { - "type": "array", - "description": "轮播图URL列表", - "items": { - "type": "string" - } - }, - "bestSeason": { - "type": "string", - "description": "最佳季节" - }, - "billingType": { - "type": "string", - "description": "计费方式:PER_PERSON=按人 PER_GROUP=按团 PER_HOUR=按时" - }, - "categoryCode": { - "type": "string", - "description": "分类编码" - }, - "city": { - "type": "string", - "description": "城市" - }, - "contactPhone": { - "type": "string", - "description": "联系电话" - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "string", - "description": "创建人ID" - }, - "dailyCapacity": { - "type": "integer", - "format": "int32", - "description": "每日接待上限" - }, - "description": { - "type": "string", - "description": "项目描述" - }, - "district": { - "type": "string", - "description": "区县" - }, - "durationMinutes": { - "type": "integer", - "format": "int32", - "description": "体验时长(分钟)" - }, - "environmentType": { - "type": "string", - "description": "环境类型:INDOOR=室内 OUTDOOR=室外 BOTH=室内外" - }, - "groupSizeMax": { - "type": "integer", - "format": "int32", - "description": "单次最多人数" - }, - "groupSizeMin": { - "type": "integer", - "format": "int32", - "description": "最少成行人数" - }, - "healthNotes": { - "type": "string", - "description": "健康须知" - }, - "highlights": { - "type": "string", - "description": "项目亮点" - }, - "latitude": { - "type": "number", - "description": "纬度" - }, - "longitude": { - "type": "number", - "description": "经度" - }, - "name": { - "type": "string", - "description": "项目名称" - }, - "physicalLevel": { - "type": "string", - "description": "体力要求:LOW=低 MEDIUM=中 HIGH=高" - }, - "providedEquipment": { - "type": "string", - "description": "提供装备说明" - }, - "province": { - "type": "string", - "description": "省份" - }, - "requiredEquipment": { - "type": "string", - "description": "需自备装备说明" - }, - "safetyNotes": { - "type": "string", - "description": "安全须知" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序权重" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下架 1=上架" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "$ref": "#/definitions/活动标签视图", - "originalRef": "活动标签视图" - } - }, - "unit": { - "type": "string", - "description": "计量单位" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "usageNotes": { - "type": "string", - "description": "使用注意事项" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - }, - "videoUrls": { - "type": "array", - "description": "视频URL列表", - "items": { - "type": "string" - } - }, - "viewCount": { - "type": "integer", - "format": "int32", - "description": "浏览量" - }, - "weatherDependent": { - "type": "integer", - "format": "int32", - "description": "是否受天气影响:0=否 1=是" - }, - "whatExcluded": { - "type": "string", - "description": "费用不包含说明" - }, - "whatIncluded": { - "type": "string", - "description": "费用包含说明" - } - }, - "title": "活动项目详情视图" - }, - "统一响应结果«List«活动标签视图»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/活动标签视图", - "originalRef": "活动标签视图" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«活动标签视图»»" - }, - "统一响应结果«分页结果«活动标签视图»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«活动标签视图»", - "originalRef": "分页结果«活动标签视图»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«活动标签视图»»" - }, - "统一响应结果«分页结果«活动项目列表视图»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«活动项目列表视图»", - "originalRef": "分页结果«活动项目列表视图»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«活动项目列表视图»»" - }, - "统一响应结果«活动价格日历视图»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/活动价格日历视图", - "originalRef": "活动价格日历视图" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«活动价格日历视图»" - }, - "统一响应结果«活动标签视图»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/活动标签视图", - "originalRef": "活动标签视图" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«活动标签视图»" - }, - "统一响应结果«活动项目详情视图»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/活动项目详情视图", - "originalRef": "活动项目详情视图" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«活动项目详情视图»" - }, - "Map«string,object»": { - "type": "object", - "title": "Map«string,object»", - "additionalProperties": { - "type": "object" - } - }, - "分页结果«酒店列表VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/酒店列表VO", - "originalRef": "酒店列表VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«酒店列表VO»" - }, - "分页结果«酒店标签VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/酒店标签VO", - "originalRef": "酒店标签VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«酒店标签VO»" - }, - "房型创建请求": { - "type": "object", - "required": [ - "bedType", - "name", - "roomCategory" - ], - "properties": { - "bannerMaterialIds": { - "type": "array", - "description": "横幅素材ID列表", - "items": { - "type": "string" - } - }, - "basePrice": { - "type": "number", - "example": 580.0, - "description": "基础成本价(元)" - }, - "bathroomType": { - "type": "string", - "example": "独立卫浴", - "description": "卫浴类型" - }, - "bedCount": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "床位数量" - }, - "bedSize": { - "type": "string", - "example": "1.8m*2.0m", - "description": "床尺寸" - }, - "bedType": { - "type": "string", - "example": "大床", - "description": "床型" - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "description": { - "type": "string", - "description": "房型描述" - }, - "floorInfo": { - "type": "string", - "example": "3-8层", - "description": "楼层信息" - }, - "maxOccupancy": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "最多入住人数" - }, - "name": { - "type": "string", - "example": "豪华大床房", - "description": "房型名称" - }, - "roomArea": { - "type": "number", - "example": 45.0, - "description": "房间面积(平方米)" - }, - "roomCategory": { - "type": "string", - "example": "STANDARD", - "description": "房型分类" - }, - "roomFacilities": { - "type": "string", - "description": "房间设施(JSON)" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序权重,值越大越靠前" - }, - "totalRooms": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "总房间数" - }, - "videoMaterialId": { - "type": "string", - "description": "视频素材ID" - }, - "windowType": { - "type": "string", - "example": "落地窗", - "description": "窗型" - } - }, - "title": "房型创建请求" - }, - "房型更新请求": { - "type": "object", - "properties": { - "bannerMaterialIds": { - "type": "array", - "description": "横幅素材ID列表", - "items": { - "type": "string" - } - }, - "basePrice": { - "type": "number", - "example": 580.0, - "description": "基础成本价(元)" - }, - "bathroomType": { - "type": "string", - "example": "独立卫浴", - "description": "卫浴类型" - }, - "bedCount": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "床位数量" - }, - "bedSize": { - "type": "string", - "example": "1.8m*2.0m", - "description": "床尺寸" - }, - "bedType": { - "type": "string", - "example": "大床", - "description": "床型" - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "description": { - "type": "string", - "description": "房型描述" - }, - "floorInfo": { - "type": "string", - "example": "3-8层", - "description": "楼层信息" - }, - "maxOccupancy": { - "type": "integer", - "format": "int32", - "example": 2, - "description": "最多入住人数" - }, - "name": { - "type": "string", - "example": "豪华大床房", - "description": "房型名称" - }, - "roomArea": { - "type": "number", - "example": 45.0, - "description": "房间面积(平方米)" - }, - "roomCategory": { - "type": "string", - "example": "STANDARD", - "description": "房型分类" - }, - "roomFacilities": { - "type": "string", - "description": "房间设施(JSON)" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序权重,值越大越靠前" - }, - "totalRooms": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "总房间数" - }, - "videoMaterialId": { - "type": "string", - "description": "视频素材ID" - }, - "windowType": { - "type": "string", - "example": "落地窗", - "description": "窗型" - } - }, - "title": "房型更新请求" - }, - "房型状态变更请求": { - "type": "object", - "required": [ - "status" - ], - "properties": { - "status": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "状态:0=下架 1=上架" - } - }, - "title": "房型状态变更请求" - }, - "房型详情VO": { - "type": "object", - "properties": { - "approvalNo": { - "type": "string", - "description": "审批单号" - }, - "bannerMaterialIds": { - "type": "array", - "description": "横幅素材ID列表", - "items": { - "type": "string" - } - }, - "bannerUrls": { - "type": "array", - "description": "横幅图URL列表", - "items": { - "type": "string" - } - }, - "basePrice": { - "type": "number", - "description": "基础成本价(元)" - }, - "bathroomType": { - "type": "string", - "description": "卫浴类型" - }, - "bedCount": { - "type": "integer", - "format": "int32", - "description": "床位数量" - }, - "bedSize": { - "type": "string", - "description": "床尺寸" - }, - "bedType": { - "type": "string", - "description": "床型" - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "description": { - "type": "string", - "description": "房型描述" - }, - "floorInfo": { - "type": "string", - "description": "楼层信息" - }, - "hotelId": { - "type": "string", - "description": "所属酒店ID" - }, - "maxOccupancy": { - "type": "integer", - "format": "int32", - "description": "最多入住人数" - }, - "name": { - "type": "string", - "description": "房型名称" - }, - "pendingStatus": { - "type": "integer", - "format": "int32", - "description": "待审批目标状态" - }, - "roomArea": { - "type": "number", - "description": "房间面积(平方米)" - }, - "roomCategory": { - "type": "string", - "description": "房型分类" - }, - "roomFacilities": { - "type": "string", - "description": "房间设施(JSON)" - }, - "roomTypeId": { - "type": "string", - "description": "房型ID" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序权重" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下架 1=上架" - }, - "totalRooms": { - "type": "integer", - "format": "int32", - "description": "总房间数" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "videoMaterialId": { - "type": "string", - "description": "视频素材ID" - }, - "videoUrl": { - "type": "string", - "description": "视频URL" - }, - "windowType": { - "type": "string", - "description": "窗型" - } - }, - "title": "房型详情VO" - }, - "统一响应结果«List«Map«string,object»»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/Map«string,object»", - "originalRef": "Map«string,object»" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«Map«string,object»»»" - }, - "统一响应结果«List«房型详情VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/房型详情VO", - "originalRef": "房型详情VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«房型详情VO»»" - }, - "统一响应结果«List«酒店标签VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/酒店标签VO", - "originalRef": "酒店标签VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«酒店标签VO»»" - }, - "统一响应结果«分页结果«酒店列表VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«酒店列表VO»", - "originalRef": "分页结果«酒店列表VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«酒店列表VO»»" - }, - "统一响应结果«分页结果«酒店标签VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«酒店标签VO»", - "originalRef": "分页结果«酒店标签VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«酒店标签VO»»" - }, - "统一响应结果«房型详情VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/房型详情VO", - "originalRef": "房型详情VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«房型详情VO»" - }, - "统一响应结果«酒店房型价格日历VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/酒店房型价格日历VO", - "originalRef": "酒店房型价格日历VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«酒店房型价格日历VO»" - }, - "统一响应结果«酒店标签VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/酒店标签VO", - "originalRef": "酒店标签VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«酒店标签VO»" - }, - "统一响应结果«酒店详情VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/酒店详情VO", - "originalRef": "酒店详情VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«酒店详情VO»" - }, - "酒店列表VO": { - "type": "object", - "properties": { - "approvalNo": { - "type": "string", - "description": "审批单号" - }, - "city": { - "type": "string", - "description": "城市" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "diamondLevel": { - "type": "integer", - "format": "int32", - "description": "钻级:0-5" - }, - "hotelId": { - "type": "string", - "description": "酒店ID" - }, - "hotelType": { - "type": "string", - "description": "住宿类型" - }, - "name": { - "type": "string", - "description": "酒店名称" - }, - "pendingStatus": { - "type": "integer", - "format": "int32", - "description": "待审批目标状态" - }, - "roomTypeCount": { - "type": "integer", - "format": "int32", - "description": "房型数量" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序权重" - }, - "starLevel": { - "type": "string", - "description": "星级(字典: hotel_star_level)" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下架 1=上架" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "$ref": "#/definitions/酒店标签VO", - "originalRef": "酒店标签VO" - } - }, - "viewCount": { - "type": "integer", - "format": "int32", - "description": "浏览量" - } - }, - "title": "酒店列表VO" - }, - "酒店创建请求": { - "type": "object", - "required": [ - "address", - "hotelType", - "latitude", - "longitude", - "name" - ], - "properties": { - "address": { - "type": "string", - "example": "束河古镇悦榕路1号", - "description": "详细地址" - }, - "bannerMaterialIds": { - "type": "array", - "description": "横幅素材ID列表", - "items": { - "type": "string" - } - }, - "checkInNotes": { - "type": "string", - "description": "入住须知" - }, - "checkInTime": { - "type": "string", - "example": "14:00", - "description": "入住时间" - }, - "checkOutTime": { - "type": "string", - "example": "12:00", - "description": "退房时间" - }, - "city": { - "type": "string", - "example": "丽江市", - "description": "城市" - }, - "contactPerson": { - "type": "string", - "example": "张经理", - "description": "联系人姓名" - }, - "contactPhone": { - "type": "string", - "example": 13800138000, - "description": "联系电话" - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "description": { - "type": "string", - "description": "酒店描述" - }, - "diamondLevel": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "钻级:0-5" - }, - "district": { - "type": "string", - "example": "古城区", - "description": "区县" - }, - "facilities": { - "type": "string", - "description": "设施配置(JSON)" - }, - "highlights": { - "type": "string", - "description": "酒店亮点(JSON)" - }, - "hotelType": { - "type": "string", - "example": "HOTEL", - "description": "住宿类型" - }, - "latitude": { - "type": "number", - "example": 26.8721, - "description": "纬度" - }, - "longitude": { - "type": "number", - "example": 100.2134, - "description": "经度" - }, - "luggageInfo": { - "type": "string", - "description": "行李服务说明" - }, - "name": { - "type": "string", - "example": "丽江悦榕庄", - "description": "酒店名称" - }, - "parkingInfo": { - "type": "string", - "description": "停车信息" - }, - "province": { - "type": "string", - "example": "云南省", - "description": "省份" - }, - "roomSharePhone": { - "type": "string", - "example": 13800138002, - "description": "合房电话" - }, - "salesPhone": { - "type": "string", - "example": 13800138001, - "description": "销售电话" - }, - "shuttleInfo": { - "type": "string", - "description": "接驳服务说明" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序权重,值越大越靠前" - }, - "starLevel": { - "type": "string", - "example": "FIVE_STAR", - "description": "星级(字典: hotel_star_level)" - }, - "subtitle": { - "type": "string", - "example": "古城边的世外桃源", - "description": "副标题" - }, - "usageNotes": { - "type": "string", - "description": "使用须知" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - } - }, - "title": "酒店创建请求" - }, - "酒店审批提交请求": { - "type": "object", - "required": [ - "reason", - "targetStatus" - ], - "properties": { - "reason": { - "type": "string", - "example": "信息已核实,申请上架", - "description": "审批理由" - }, - "targetStatus": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "目标状态:0=下架 1=上架" - } - }, - "title": "酒店审批提交请求" - }, - "酒店房型价格日历VO": { - "type": "object", - "properties": { - "hotelId": { - "type": "string", - "description": "酒店ID" - }, - "month": { - "type": "integer", - "format": "int32", - "description": "月份" - }, - "prices": { - "type": "array", - "description": "价格日历明细列表", - "items": { - "$ref": "#/definitions/酒店房型价格日历日VO", - "originalRef": "酒店房型价格日历日VO" - } - }, - "roomTypeId": { - "type": "string", - "description": "房型ID" - }, - "roomTypeName": { - "type": "string", - "description": "房型名称" - }, - "stockEnabled": { - "type": "boolean", - "description": "是否启用库存管理" - }, - "year": { - "type": "integer", - "format": "int32", - "description": "年份" - } - }, - "title": "酒店房型价格日历VO" - }, - "酒店房型价格日历日VO": { - "type": "object", - "properties": { - "costPrice": { - "type": "number", - "description": "成本价(元)" - }, - "date": { - "type": "string", - "format": "date", - "description": "日期" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "status": { - "type": "string", - "description": "日历状态(字典 calendar_status:AVAILABLE=可售 SOLD_OUT=已售罄 CLOSED=已关闭)" - }, - "stock": { - "type": "integer", - "format": "int32", - "description": "库存数量" - }, - "stockUsed": { - "type": "integer", - "format": "int32", - "description": "已用库存" - } - }, - "title": "酒店房型价格日历日VO" - }, - "酒店房型价格日历状态变更请求": { - "type": "object", - "required": [ - "endDate", - "startDate", - "status" - ], - "properties": { - "endDate": { - "type": "string", - "example": "2026-03-31", - "description": "结束日期(yyyy-MM-dd)" - }, - "remark": { - "type": "string", - "example": "临时关闭预订", - "description": "备注" - }, - "startDate": { - "type": "string", - "example": "2026-03-01", - "description": "开始日期(yyyy-MM-dd)" - }, - "status": { - "type": "string", - "example": "CLOSED", - "description": "目标状态(字典 calendar_status:AVAILABLE=可售 SOLD_OUT=已售罄 CLOSED=已关闭)" - } - }, - "title": "酒店房型价格日历状态变更请求" - }, - "酒店房型价格日历设置请求": { - "type": "object", - "required": [ - "costPrice", - "endDate", - "startDate" - ], - "properties": { - "costPrice": { - "type": "number", - "example": 580.0, - "description": "成本价(元)" - }, - "endDate": { - "type": "string", - "example": "2026-03-31", - "description": "结束日期(yyyy-MM-dd)" - }, - "excludeDates": { - "type": "array", - "example": [ - "2026-03-08", - "2026-03-15" - ], - "description": "排除日期列表", - "items": { - "type": "string" - } - }, - "remark": { - "type": "string", - "example": "旺季价格", - "description": "备注" - }, - "selectedWeekdays": { - "type": "array", - "example": [ - 1, - 2, - 3, - 4, - 5 - ], - "description": "指定星期几(1=周一 7=周日)", - "items": { - "type": "integer", - "format": "int32" - } - }, - "startDate": { - "type": "string", - "example": "2026-03-01", - "description": "开始日期(yyyy-MM-dd)" - }, - "status": { - "type": "string", - "example": "AVAILABLE", - "description": "日历状态(字典 calendar_status:AVAILABLE=可售 SOLD_OUT=已售罄 CLOSED=已关闭)" - }, - "stock": { - "type": "integer", - "format": "int32", - "example": 10, - "description": "库存数量" - }, - "weekdayOnly": { - "type": "boolean", - "example": false, - "description": "是否仅工作日" - }, - "weekendOnly": { - "type": "boolean", - "example": false, - "description": "是否仅周末" - } - }, - "title": "酒店房型价格日历设置请求" - }, - "酒店批量删除请求": { - "type": "object", - "required": [ - "hotelIds" - ], - "properties": { - "hotelIds": { - "type": "array", - "example": [ - "1", - "2", - "3" - ], - "description": "酒店ID列表", - "items": { - "type": "string" - } - } - }, - "title": "酒店批量删除请求" - }, - "酒店批量标签操作请求": { - "type": "object", - "required": [ - "hotelIds" - ], - "properties": { - "addTagIds": { - "type": "array", - "example": [ - "10", - "11" - ], - "description": "要添加的标签ID列表", - "items": { - "type": "string" - } - }, - "hotelIds": { - "type": "array", - "example": [ - "1", - "2", - "3" - ], - "description": "酒店ID列表", - "items": { - "type": "string" - } - }, - "removeTagIds": { - "type": "array", - "example": [ - "12" - ], - "description": "要移除的标签ID列表", - "items": { - "type": "string" - } - } - }, - "title": "酒店批量标签操作请求" - }, - "酒店更新请求": { - "type": "object", - "properties": { - "address": { - "type": "string", - "example": "束河古镇悦榕路1号", - "description": "详细地址" - }, - "bannerMaterialIds": { - "type": "array", - "description": "横幅素材ID列表", - "items": { - "type": "string" - } - }, - "checkInNotes": { - "type": "string", - "description": "入住须知" - }, - "checkInTime": { - "type": "string", - "example": "14:00", - "description": "入住时间" - }, - "checkOutTime": { - "type": "string", - "example": "12:00", - "description": "退房时间" - }, - "city": { - "type": "string", - "example": "丽江市", - "description": "城市" - }, - "contactPerson": { - "type": "string", - "example": "张经理", - "description": "联系人姓名" - }, - "contactPhone": { - "type": "string", - "example": 13800138000, - "description": "联系电话" - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "description": { - "type": "string", - "description": "酒店描述" - }, - "diamondLevel": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "钻级:0-5" - }, - "district": { - "type": "string", - "example": "古城区", - "description": "区县" - }, - "facilities": { - "type": "string", - "description": "设施配置(JSON)" - }, - "highlights": { - "type": "string", - "description": "酒店亮点(JSON)" - }, - "hotelType": { - "type": "string", - "example": "HOTEL", - "description": "住宿类型" - }, - "latitude": { - "type": "number", - "example": 26.8721, - "description": "纬度" - }, - "longitude": { - "type": "number", - "example": 100.2134, - "description": "经度" - }, - "luggageInfo": { - "type": "string", - "description": "行李服务说明" - }, - "name": { - "type": "string", - "example": "丽江悦榕庄", - "description": "酒店名称" - }, - "parkingInfo": { - "type": "string", - "description": "停车信息" - }, - "province": { - "type": "string", - "example": "云南省", - "description": "省份" - }, - "roomSharePhone": { - "type": "string", - "example": 13800138002, - "description": "合房电话" - }, - "salesPhone": { - "type": "string", - "example": 13800138001, - "description": "销售电话" - }, - "shuttleInfo": { - "type": "string", - "description": "接驳服务说明" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序权重,值越大越靠前" - }, - "starLevel": { - "type": "string", - "example": "FIVE_STAR", - "description": "星级(字典: hotel_star_level)" - }, - "subtitle": { - "type": "string", - "example": "古城边的世外桃源", - "description": "副标题" - }, - "usageNotes": { - "type": "string", - "description": "使用须知" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - } - }, - "title": "酒店更新请求" - }, - "酒店标签VO": { - "type": "object", - "properties": { - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "tagColor": { - "type": "string", - "description": "标签颜色(十六进制)" - }, - "tagId": { - "type": "string", - "description": "标签ID" - }, - "tagName": { - "type": "string", - "description": "标签名称" - }, - "tagType": { - "type": "integer", - "format": "int32", - "description": "标签类型:0=自定义 1=系统" - }, - "useCount": { - "type": "integer", - "format": "int32", - "description": "使用次数" - } - }, - "title": "酒店标签VO" - }, - "酒店标签创建请求": { - "type": "object", - "required": [ - "tagName" - ], - "properties": { - "tagColor": { - "type": "string", - "example": "#FF6600", - "description": "标签颜色(十六进制)" - }, - "tagName": { - "type": "string", - "example": "温泉酒店", - "description": "标签名称" - } - }, - "title": "酒店标签创建请求" - }, - "酒店标签更新请求": { - "type": "object", - "properties": { - "tagColor": { - "type": "string", - "example": "#FF6600", - "description": "标签颜色(十六进制)" - }, - "tagName": { - "type": "string", - "example": "温泉酒店", - "description": "标签名称" - } - }, - "title": "酒店标签更新请求" - }, - "酒店标签更新请求_1": { - "type": "object", - "properties": { - "tagIds": { - "type": "array", - "description": "标签ID列表(全量替换)", - "items": { - "type": "string" - } - } - }, - "title": "酒店标签更新请求_1" - }, - "酒店状态变更请求": { - "type": "object", - "required": [ - "status" - ], - "properties": { - "hotelIds": { - "type": "array", - "description": "酒店ID列表(批量操作时使用)", - "items": { - "type": "string" - } - }, - "status": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "目标状态:0=下架 1=上架" - } - }, - "title": "酒店状态变更请求" - }, - "酒店详情VO": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "详细地址" - }, - "bannerMaterialIds": { - "type": "array", - "description": "横幅素材ID列表", - "items": { - "type": "string" - } - }, - "bannerUrls": { - "type": "array", - "description": "横幅图URL列表", - "items": { - "type": "string" - } - }, - "checkInNotes": { - "type": "string", - "description": "入住须知" - }, - "checkInTime": { - "type": "string", - "description": "入住时间" - }, - "checkOutTime": { - "type": "string", - "description": "退房时间" - }, - "city": { - "type": "string", - "description": "城市" - }, - "contactPerson": { - "type": "string", - "description": "联系人姓名" - }, - "contactPhone": { - "type": "string", - "description": "联系电话" - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "string", - "description": "创建者ID" - }, - "description": { - "type": "string", - "description": "酒店描述" - }, - "diamondLevel": { - "type": "integer", - "format": "int32", - "description": "钻级:0-5" - }, - "district": { - "type": "string", - "description": "区县" - }, - "facilities": { - "type": "string", - "description": "设施配置(JSON)" - }, - "highlights": { - "type": "string", - "description": "酒店亮点(JSON)" - }, - "hotelId": { - "type": "string", - "description": "酒店ID" - }, - "hotelType": { - "type": "string", - "description": "住宿类型" - }, - "latitude": { - "type": "number", - "description": "纬度" - }, - "longitude": { - "type": "number", - "description": "经度" - }, - "luggageInfo": { - "type": "string", - "description": "行李服务说明" - }, - "name": { - "type": "string", - "description": "酒店名称" - }, - "parkingInfo": { - "type": "string", - "description": "停车信息" - }, - "province": { - "type": "string", - "description": "省份" - }, - "roomSharePhone": { - "type": "string", - "description": "合房电话" - }, - "roomTypeCount": { - "type": "integer", - "format": "int32", - "description": "房型数量" - }, - "roomTypes": { - "type": "array", - "description": "房型列表(C端详情返回,仅包含已启用房型)", - "items": { - "$ref": "#/definitions/房型详情VO", - "originalRef": "房型详情VO" - } - }, - "salesPhone": { - "type": "string", - "description": "销售电话" - }, - "shuttleInfo": { - "type": "string", - "description": "接驳服务说明" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序权重" - }, - "starLevel": { - "type": "string", - "description": "星级(字典: hotel_star_level)" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下架 1=上架" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "$ref": "#/definitions/酒店标签VO", - "originalRef": "酒店标签VO" - } - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "usageNotes": { - "type": "string", - "description": "使用须知" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - }, - "videoUrls": { - "type": "array", - "description": "视频URL列表", - "items": { - "type": "string" - } - }, - "viewCount": { - "type": "integer", - "format": "int32", - "description": "浏览量" - } - }, - "title": "酒店详情VO" - }, - "分页结果«服务标签VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/服务标签VO", - "originalRef": "服务标签VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«服务标签VO»" - }, - "分页结果«服务项列表VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/服务项列表VO", - "originalRef": "服务项列表VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«服务项列表VO»" - }, - "服务标签VO": { - "type": "object", - "properties": { - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "tagColor": { - "type": "string", - "description": "标签颜色(十六进制)" - }, - "tagId": { - "type": "string", - "description": "标签ID" - }, - "tagName": { - "type": "string", - "description": "标签名称" - }, - "tagType": { - "type": "integer", - "format": "int32", - "description": "标签类型:0=自定义 1=系统" - }, - "useCount": { - "type": "integer", - "format": "int32", - "description": "使用次数" - } - }, - "title": "服务标签VO" - }, - "服务标签创建请求": { - "type": "object", - "required": [ - "tagName" - ], - "properties": { - "tagColor": { - "type": "string", - "example": "#FF6600", - "description": "标签颜色(十六进制)" - }, - "tagName": { - "type": "string", - "example": "精品服务", - "description": "标签名称" - } - }, - "title": "服务标签创建请求" - }, - "服务标签更新请求": { - "type": "object", - "properties": { - "tagColor": { - "type": "string", - "example": "#FF6600", - "description": "标签颜色(十六进制)" - }, - "tagName": { - "type": "string", - "example": "精品服务", - "description": "标签名称" - } - }, - "title": "服务标签更新请求" - }, - "服务项价格日历VO": { - "type": "object", - "properties": { - "month": { - "type": "integer", - "format": "int32", - "description": "月份" - }, - "prices": { - "type": "array", - "description": "价格日历明细列表", - "items": { - "$ref": "#/definitions/服务项价格日历日VO", - "originalRef": "服务项价格日历日VO" - } - }, - "serviceId": { - "type": "string", - "description": "服务项ID" - }, - "serviceName": { - "type": "string", - "description": "服务项名称" - }, - "stockEnabled": { - "type": "boolean", - "description": "是否启用库存管理" - }, - "year": { - "type": "integer", - "format": "int32", - "description": "年份" - } - }, - "title": "服务项价格日历VO" - }, - "服务项价格日历日VO": { - "type": "object", - "properties": { - "costPrice": { - "type": "number", - "description": "成本价(元)" - }, - "date": { - "type": "string", - "format": "date", - "description": "日期" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "status": { - "type": "string", - "description": "日历状态(字典 calendar_status:AVAILABLE=可售 SOLD_OUT=已售罄 CLOSED=已关闭)" - }, - "stock": { - "type": "integer", - "format": "int32", - "description": "库存数量" - }, - "stockUsed": { - "type": "integer", - "format": "int32", - "description": "已用库存" - } - }, - "title": "服务项价格日历日VO" - }, - "服务项价格日历状态变更请求": { - "type": "object", - "required": [ - "endDate", - "startDate", - "status" - ], - "properties": { - "endDate": { - "type": "string", - "example": "2026-03-31", - "description": "结束日期(yyyy-MM-dd)" - }, - "remark": { - "type": "string", - "example": "临时关闭预订", - "description": "备注" - }, - "startDate": { - "type": "string", - "example": "2026-03-01", - "description": "开始日期(yyyy-MM-dd)" - }, - "status": { - "type": "string", - "example": "CLOSED", - "description": "目标状态(字典 calendar_status:AVAILABLE=可售 SOLD_OUT=已售罄 CLOSED=已关闭)" - } - }, - "title": "服务项价格日历状态变更请求" - }, - "服务项价格日历设置请求": { - "type": "object", - "required": [ - "costPrice", - "endDate", - "startDate" - ], - "properties": { - "costPrice": { - "type": "number", - "example": 200.0, - "description": "成本价(元)" - }, - "endDate": { - "type": "string", - "example": "2026-03-31", - "description": "结束日期(yyyy-MM-dd)" - }, - "excludeDates": { - "type": "array", - "example": [ - "2026-03-08", - "2026-03-15" - ], - "description": "排除日期列表", - "items": { - "type": "string" - } - }, - "remark": { - "type": "string", - "example": "旺季价格", - "description": "备注" - }, - "selectedWeekdays": { - "type": "array", - "example": [ - 1, - 2, - 3, - 4, - 5 - ], - "description": "指定星期几(1=周一 7=周日)", - "items": { - "type": "integer", - "format": "int32" - } - }, - "startDate": { - "type": "string", - "example": "2026-03-01", - "description": "开始日期(yyyy-MM-dd)" - }, - "status": { - "type": "string", - "example": "AVAILABLE", - "description": "日历状态(字典 calendar_status:AVAILABLE=可售 SOLD_OUT=已售罄 CLOSED=已关闭)" - }, - "stock": { - "type": "integer", - "format": "int32", - "example": 50, - "description": "库存数量" - }, - "weekdayOnly": { - "type": "boolean", - "example": false, - "description": "是否仅工作日" - }, - "weekendOnly": { - "type": "boolean", - "example": false, - "description": "是否仅周末" - } - }, - "title": "服务项价格日历设置请求" - }, - "服务项列表VO": { - "type": "object", - "properties": { - "approvalNo": { - "type": "string", - "description": "审批单号" - }, - "basePrice": { - "type": "number", - "description": "基础价格(元)" - }, - "billingType": { - "type": "string", - "description": "计费方式" - }, - "categoryCode": { - "type": "string", - "description": "分类编码" - }, - "city": { - "type": "string", - "description": "城市" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "durationHours": { - "type": "number", - "description": "服务时长(小时)" - }, - "highlights": { - "type": "string", - "description": "服务亮点" - }, - "instantConfirm": { - "type": "integer", - "format": "int32", - "description": "是否即时确认:0=否 1=是" - }, - "isPaid": { - "type": "integer", - "format": "int32", - "description": "是否收费:0=免费 1=收费" - }, - "latitude": { - "type": "number", - "description": "纬度" - }, - "longitude": { - "type": "number", - "description": "经度" - }, - "name": { - "type": "string", - "description": "服务名称" - }, - "pendingStatus": { - "type": "integer", - "format": "int32", - "description": "待审批目标状态" - }, - "serviceId": { - "type": "string", - "description": "服务项ID" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序权重" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下架 1=上架" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "$ref": "#/definitions/服务标签VO", - "originalRef": "服务标签VO" - } - }, - "unit": { - "type": "string", - "description": "计价单位" - }, - "vehicleType": { - "type": "string", - "description": "配套车型" - }, - "viewCount": { - "type": "integer", - "format": "int32", - "description": "浏览量" - } - }, - "title": "服务项列表VO" - }, - "服务项创建请求": { - "type": "object", - "required": [ - "categoryCode", - "isPaid", - "name" - ], - "properties": { - "address": { - "type": "string", - "example": "丽江古城区", - "description": "详细地址" - }, - "advanceBookingHours": { - "type": "integer", - "format": "int32", - "example": 24, - "description": "提前预订时间(小时)" - }, - "bannerMaterialIds": { - "type": "array", - "description": "横幅素材ID列表", - "items": { - "type": "string" - } - }, - "basePrice": { - "type": "number", - "example": 500.0, - "description": "基础价格(元)" - }, - "billingType": { - "type": "string", - "example": "PER_DAY", - "description": "计费方式" - }, - "cancellationPolicy": { - "type": "string", - "description": "取消政策说明" - }, - "capacityMax": { - "type": "integer", - "format": "int32", - "example": 10, - "description": "最多服务人数" - }, - "capacityMin": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "最少服务人数" - }, - "categoryCode": { - "type": "string", - "example": "GUIDE", - "description": "分类编码" - }, - "city": { - "type": "string", - "example": "丽江市", - "description": "城市" - }, - "contactPhone": { - "type": "string", - "example": 13800138000, - "description": "联系电话" - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "description": { - "type": "string", - "description": "服务描述" - }, - "durationHours": { - "type": "number", - "example": 8.0, - "description": "服务时长(小时)" - }, - "equipmentList": { - "type": "string", - "description": "设备清单(JSON)" - }, - "freeCancelHours": { - "type": "integer", - "format": "int32", - "example": 48, - "description": "免费取消期限(小时)" - }, - "highlights": { - "type": "string", - "description": "服务亮点" - }, - "includedItems": { - "type": "string", - "description": "包含项目说明" - }, - "instantConfirm": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "是否即时确认:0=否 1=是" - }, - "isPaid": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "是否收费:0=免费 1=收费" - }, - "languageSupport": { - "type": "string", - "example": "中文,英文", - "description": "语言支持" - }, - "latitude": { - "type": "number", - "example": 26.8721, - "description": "纬度" - }, - "longitude": { - "type": "number", - "example": 100.2134, - "description": "经度" - }, - "name": { - "type": "string", - "example": "专属导游服务", - "description": "服务名称" - }, - "priceExcludes": { - "type": "string", - "description": "价格不包含内容" - }, - "priceIncludes": { - "type": "string", - "description": "价格包含内容" - }, - "province": { - "type": "string", - "example": "云南省", - "description": "省份" - }, - "serviceHours": { - "type": "string", - "example": "08:00-18:00", - "description": "服务时段" - }, - "serviceProcess": { - "type": "string", - "description": "服务流程说明" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序权重,值越大越靠前" - }, - "staffCount": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "服务人员数量" - }, - "subtitle": { - "type": "string", - "example": "资深导游全程陪同", - "description": "副标题" - }, - "unit": { - "type": "string", - "example": "天", - "description": "计价单位" - }, - "usageNotes": { - "type": "string", - "description": "使用须知" - }, - "vehicleType": { - "type": "string", - "example": "商务车", - "description": "配套车型" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - } - }, - "title": "服务项创建请求" - }, - "服务项审批提交请求": { - "type": "object", - "required": [ - "reason", - "targetStatus" - ], - "properties": { - "reason": { - "type": "string", - "example": "信息已核实,申请上架", - "description": "审批理由" - }, - "targetStatus": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "目标状态:0=下架 1=上架" - } - }, - "title": "服务项审批提交请求" - }, - "服务项批量删除请求": { - "type": "object", - "required": [ - "serviceIds" - ], - "properties": { - "serviceIds": { - "type": "array", - "example": [ - "1", - "2", - "3" - ], - "description": "服务ID列表", - "items": { - "type": "string" - } - } - }, - "title": "服务项批量删除请求" - }, - "服务项批量标签操作请求": { - "type": "object", - "required": [ - "serviceIds" - ], - "properties": { - "addTagIds": { - "type": "array", - "example": [ - "10", - "11" - ], - "description": "要添加的标签ID列表", - "items": { - "type": "string" - } - }, - "removeTagIds": { - "type": "array", - "example": [ - "12" - ], - "description": "要移除的标签ID列表", - "items": { - "type": "string" - } - }, - "serviceIds": { - "type": "array", - "example": [ - "1", - "2", - "3" - ], - "description": "服务ID列表", - "items": { - "type": "string" - } - } - }, - "title": "服务项批量标签操作请求" - }, - "服务项更新请求": { - "type": "object", - "properties": { - "address": { - "type": "string", - "example": "丽江古城区", - "description": "详细地址" - }, - "advanceBookingHours": { - "type": "integer", - "format": "int32", - "example": 24, - "description": "提前预订时间(小时)" - }, - "bannerMaterialIds": { - "type": "array", - "description": "横幅素材ID列表", - "items": { - "type": "string" - } - }, - "basePrice": { - "type": "number", - "example": 500.0, - "description": "基础价格(元)" - }, - "billingType": { - "type": "string", - "example": "PER_DAY", - "description": "计费方式" - }, - "cancellationPolicy": { - "type": "string", - "description": "取消政策说明" - }, - "capacityMax": { - "type": "integer", - "format": "int32", - "example": 10, - "description": "最多服务人数" - }, - "capacityMin": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "最少服务人数" - }, - "categoryCode": { - "type": "string", - "example": "GUIDE", - "description": "分类编码" - }, - "city": { - "type": "string", - "example": "丽江市", - "description": "城市" - }, - "contactPhone": { - "type": "string", - "example": 13800138000, - "description": "联系电话" - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "description": { - "type": "string", - "description": "服务描述" - }, - "durationHours": { - "type": "number", - "example": 8.0, - "description": "服务时长(小时)" - }, - "equipmentList": { - "type": "string", - "description": "设备清单(JSON)" - }, - "freeCancelHours": { - "type": "integer", - "format": "int32", - "example": 48, - "description": "免费取消期限(小时)" - }, - "highlights": { - "type": "string", - "description": "服务亮点" - }, - "includedItems": { - "type": "string", - "description": "包含项目说明" - }, - "instantConfirm": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "是否即时确认:0=否 1=是" - }, - "isPaid": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "是否收费:0=免费 1=收费" - }, - "languageSupport": { - "type": "string", - "example": "中文,英文", - "description": "语言支持" - }, - "latitude": { - "type": "number", - "example": 26.8721, - "description": "纬度" - }, - "longitude": { - "type": "number", - "example": 100.2134, - "description": "经度" - }, - "name": { - "type": "string", - "example": "专属导游服务", - "description": "服务名称" - }, - "priceExcludes": { - "type": "string", - "description": "价格不包含内容" - }, - "priceIncludes": { - "type": "string", - "description": "价格包含内容" - }, - "province": { - "type": "string", - "example": "云南省", - "description": "省份" - }, - "serviceHours": { - "type": "string", - "example": "08:00-18:00", - "description": "服务时段" - }, - "serviceProcess": { - "type": "string", - "description": "服务流程说明" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序权重,值越大越靠前" - }, - "staffCount": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "服务人员数量" - }, - "subtitle": { - "type": "string", - "example": "资深导游全程陪同", - "description": "副标题" - }, - "unit": { - "type": "string", - "example": "天", - "description": "计价单位" - }, - "usageNotes": { - "type": "string", - "description": "使用须知" - }, - "vehicleType": { - "type": "string", - "example": "商务车", - "description": "配套车型" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - } - }, - "title": "服务项更新请求" - }, - "服务项标签更新请求": { - "type": "object", - "properties": { - "tagIds": { - "type": "array", - "description": "标签ID列表(全量替换)", - "items": { - "type": "string" - } - } - }, - "title": "服务项标签更新请求" - }, - "服务项状态变更请求": { - "type": "object", - "required": [ - "status" - ], - "properties": { - "serviceIds": { - "type": "array", - "description": "服务ID列表(批量操作时使用)", - "items": { - "type": "string" - } - }, - "status": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "目标状态:0=下架 1=上架" - } - }, - "title": "服务项状态变更请求" - }, - "服务项详情VO": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "详细地址" - }, - "advanceBookingHours": { - "type": "integer", - "format": "int32", - "description": "提前预订时间(小时)" - }, - "bannerMaterialIds": { - "type": "array", - "description": "横幅素材ID列表", - "items": { - "type": "string" - } - }, - "bannerUrls": { - "type": "array", - "description": "横幅图URL列表", - "items": { - "type": "string" - } - }, - "basePrice": { - "type": "number", - "description": "基础价格(元)" - }, - "billingType": { - "type": "string", - "description": "计费方式" - }, - "cancellationPolicy": { - "type": "string", - "description": "取消政策说明" - }, - "capacityMax": { - "type": "integer", - "format": "int32", - "description": "最多服务人数" - }, - "capacityMin": { - "type": "integer", - "format": "int32", - "description": "最少服务人数" - }, - "categoryCode": { - "type": "string", - "description": "分类编码" - }, - "city": { - "type": "string", - "description": "城市" - }, - "contactPhone": { - "type": "string", - "description": "联系电话" - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "string", - "description": "创建者ID" - }, - "description": { - "type": "string", - "description": "服务描述" - }, - "durationHours": { - "type": "number", - "description": "服务时长(小时)" - }, - "equipmentList": { - "type": "string", - "description": "设备清单(JSON)" - }, - "freeCancelHours": { - "type": "integer", - "format": "int32", - "description": "免费取消期限(小时)" - }, - "highlights": { - "type": "string", - "description": "服务亮点" - }, - "includedItems": { - "type": "string", - "description": "包含项目说明" - }, - "instantConfirm": { - "type": "integer", - "format": "int32", - "description": "是否即时确认:0=否 1=是" - }, - "isPaid": { - "type": "integer", - "format": "int32", - "description": "是否收费:0=免费 1=收费" - }, - "languageSupport": { - "type": "string", - "description": "语言支持" - }, - "latitude": { - "type": "number", - "description": "纬度" - }, - "longitude": { - "type": "number", - "description": "经度" - }, - "name": { - "type": "string", - "description": "服务名称" - }, - "priceExcludes": { - "type": "string", - "description": "价格不包含内容" - }, - "priceIncludes": { - "type": "string", - "description": "价格包含内容" - }, - "province": { - "type": "string", - "description": "省份" - }, - "serviceHours": { - "type": "string", - "description": "服务时段" - }, - "serviceId": { - "type": "string", - "description": "服务项ID" - }, - "serviceProcess": { - "type": "string", - "description": "服务流程说明" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序权重" - }, - "staffCount": { - "type": "integer", - "format": "int32", - "description": "服务人员数量" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下架 1=上架" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "$ref": "#/definitions/服务标签VO", - "originalRef": "服务标签VO" - } - }, - "unit": { - "type": "string", - "description": "计价单位" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "usageNotes": { - "type": "string", - "description": "使用须知" - }, - "vehicleType": { - "type": "string", - "description": "配套车型" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - }, - "videoUrls": { - "type": "array", - "description": "视频URL列表", - "items": { - "type": "string" - } - }, - "viewCount": { - "type": "integer", - "format": "int32", - "description": "浏览量" - } - }, - "title": "服务项详情VO" - }, - "统一响应结果«List«服务标签VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/服务标签VO", - "originalRef": "服务标签VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«服务标签VO»»" - }, - "统一响应结果«分页结果«服务标签VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«服务标签VO»", - "originalRef": "分页结果«服务标签VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«服务标签VO»»" - }, - "统一响应结果«分页结果«服务项列表VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«服务项列表VO»", - "originalRef": "分页结果«服务项列表VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«服务项列表VO»»" - }, - "统一响应结果«服务标签VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/服务标签VO", - "originalRef": "服务标签VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«服务标签VO»" - }, - "统一响应结果«服务项价格日历VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/服务项价格日历VO", - "originalRef": "服务项价格日历VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«服务项价格日历VO»" - }, - "统一响应结果«服务项详情VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/服务项详情VO", - "originalRef": "服务项详情VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«服务项详情VO»" - }, - "分页结果«车型列表VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/车型列表VO", - "originalRef": "车型列表VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«车型列表VO»" - }, - "分页结果«车辆标签VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/车辆标签VO", - "originalRef": "车辆标签VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«车辆标签VO»" - }, - "统一响应结果«List«车型列表VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/车型列表VO", - "originalRef": "车型列表VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«车型列表VO»»" - }, - "统一响应结果«List«车辆标签VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/车辆标签VO", - "originalRef": "车辆标签VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«车辆标签VO»»" - }, - "统一响应结果«分页结果«车型列表VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«车型列表VO»", - "originalRef": "分页结果«车型列表VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«车型列表VO»»" - }, - "统一响应结果«分页结果«车辆标签VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«车辆标签VO»", - "originalRef": "分页结果«车辆标签VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«车辆标签VO»»" - }, - "统一响应结果«车型价格日历VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/车型价格日历VO", - "originalRef": "车型价格日历VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«车型价格日历VO»" - }, - "统一响应结果«车型详情VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/车型详情VO", - "originalRef": "车型详情VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«车型详情VO»" - }, - "统一响应结果«车辆标签VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/车辆标签VO", - "originalRef": "车辆标签VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«车辆标签VO»" - }, - "设置车型标签请求": { - "type": "object", - "required": [ - "tagIds" - ], - "properties": { - "tagIds": { - "type": "array", - "description": "标签ID列表", - "items": { - "type": "integer", - "format": "int64" - } - } - }, - "title": "设置车型标签请求" - }, - "车型价格日历VO": { - "type": "object", - "properties": { - "month": { - "type": "integer", - "format": "int32", - "description": "月份" - }, - "prices": { - "type": "array", - "description": "价格日历明细列表", - "items": { - "$ref": "#/definitions/车型价格日历日VO", - "originalRef": "车型价格日历日VO" - } - }, - "stockEnabled": { - "type": "boolean", - "description": "是否启用库存管理" - }, - "vehicleId": { - "type": "string", - "description": "车型ID" - }, - "vehicleName": { - "type": "string", - "description": "车型名称" - }, - "year": { - "type": "integer", - "format": "int32", - "description": "年份" - } - }, - "title": "车型价格日历VO" - }, - "车型价格日历日VO": { - "type": "object", - "properties": { - "costPrice": { - "type": "number", - "description": "日租价(元)" - }, - "date": { - "type": "string", - "format": "date", - "description": "日期" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "status": { - "type": "string", - "description": "日历状态(字典 calendar_status:AVAILABLE=可售 SOLD_OUT=已售罄 CLOSED=已关闭)" - }, - "stock": { - "type": "integer", - "format": "int32", - "description": "库存数量" - }, - "stockUsed": { - "type": "integer", - "format": "int32", - "description": "已用库存" - } - }, - "title": "车型价格日历日VO" - }, - "车型价格日历状态变更请求": { - "type": "object", - "required": [ - "endDate", - "startDate", - "status" - ], - "properties": { - "endDate": { - "type": "string", - "format": "date", - "example": "2026-03-31", - "description": "结束日期" - }, - "remark": { - "type": "string", - "example": "临时停租", - "description": "备注" - }, - "startDate": { - "type": "string", - "format": "date", - "example": "2026-03-01", - "description": "开始日期" - }, - "status": { - "type": "string", - "example": "CLOSED", - "description": "目标状态(字典 calendar_status:AVAILABLE=可售 SOLD_OUT=已售罄 CLOSED=已关闭)" - } - }, - "title": "车型价格日历状态变更请求" - }, - "车型价格日历设置请求": { - "type": "object", - "required": [ - "costPrice", - "endDate", - "startDate" - ], - "properties": { - "costPrice": { - "type": "number", - "example": 800.0, - "description": "日租价(元)" - }, - "endDate": { - "type": "string", - "format": "date", - "example": "2026-03-31", - "description": "结束日期" - }, - "excludeDates": { - "type": "array", - "description": "排除日期列表", - "items": { - "$ref": "#/definitions/LocalDate", - "originalRef": "LocalDate" - } - }, - "remark": { - "type": "string", - "example": "旺季价格", - "description": "备注" - }, - "selectedWeekdays": { - "type": "array", - "example": [ - 1, - 2, - 3, - 4, - 5 - ], - "description": "指定星期几(1=周一 7=周日)", - "items": { - "type": "integer", - "format": "int32" - } - }, - "startDate": { - "type": "string", - "format": "date", - "example": "2026-03-01", - "description": "开始日期" - }, - "status": { - "type": "string", - "example": "AVAILABLE", - "description": "日历状态(字典 calendar_status:AVAILABLE=可售 SOLD_OUT=已售罄 CLOSED=已关闭)" - }, - "stock": { - "type": "integer", - "format": "int32", - "example": 5, - "description": "库存数量" - }, - "weekdayOnly": { - "type": "boolean", - "example": false, - "description": "是否仅工作日" - }, - "weekendOnly": { - "type": "boolean", - "example": false, - "description": "是否仅周末" - } - }, - "title": "车型价格日历设置请求" - }, - "车型列表VO": { - "type": "object", - "properties": { - "approvalNo": { - "type": "string", - "description": "审批单号" - }, - "basePrice": { - "type": "number", - "description": "基础日租价(元)" - }, - "brand": { - "type": "string", - "description": "品牌" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "highlights": { - "type": "string", - "description": "车型亮点" - }, - "modelSeries": { - "type": "string", - "description": "车系" - }, - "name": { - "type": "string", - "description": "车型名称" - }, - "passengerCount": { - "type": "integer", - "format": "int32", - "description": "可乘坐人数" - }, - "pendingStatus": { - "type": "integer", - "format": "int32", - "description": "待审批目标状态" - }, - "seatCount": { - "type": "integer", - "format": "int32", - "description": "座位数" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序权重" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下架 1=上架" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "$ref": "#/definitions/车辆标签VO", - "originalRef": "车辆标签VO" - } - }, - "vehicleId": { - "type": "string", - "description": "车型ID" - }, - "vehicleType": { - "type": "string", - "description": "车型分类" - }, - "viewCount": { - "type": "integer", - "format": "int32", - "description": "浏览量" - } - }, - "title": "车型列表VO" - }, - "车型创建请求": { - "type": "object", - "required": [ - "brand", - "name", - "passengerCount", - "seatCount", - "vehicleType" - ], - "properties": { - "bannerMaterialIds": { - "type": "array", - "description": "横幅素材ID列表", - "items": { - "type": "string" - } - }, - "basePrice": { - "type": "number", - "example": 800.0, - "description": "基础日租价(元)" - }, - "brand": { - "type": "string", - "example": "别克", - "description": "品牌" - }, - "comfortFeatures": { - "type": "string", - "description": "舒适配置(JSON)" - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "description": { - "type": "string", - "description": "车型描述" - }, - "driveType": { - "type": "string", - "example": "前驱", - "description": "驱动方式" - }, - "engineType": { - "type": "string", - "example": "汽油", - "description": "动力类型" - }, - "highlights": { - "type": "string", - "description": "车型亮点" - }, - "luggageCapacity": { - "type": "string", - "example": "可放3个28寸行李箱", - "description": "行李容量描述" - }, - "modelSeries": { - "type": "string", - "example": "GL8", - "description": "车系" - }, - "modelYear": { - "type": "integer", - "format": "int32", - "example": 2025, - "description": "年款" - }, - "name": { - "type": "string", - "example": "别克GL8 ES", - "description": "车型名称" - }, - "passengerCount": { - "type": "integer", - "format": "int32", - "example": 6, - "description": "可乘坐人数" - }, - "priceExcludes": { - "type": "string", - "description": "价格不包含内容" - }, - "priceIncludes": { - "type": "string", - "description": "价格包含内容" - }, - "seatCount": { - "type": "integer", - "format": "int32", - "example": 7, - "description": "座位数" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序权重,值越大越靠前" - }, - "subtitle": { - "type": "string", - "example": "商务出行首选", - "description": "副标题" - }, - "transmission": { - "type": "string", - "example": "自动", - "description": "变速箱类型" - }, - "usageNotes": { - "type": "string", - "description": "使用须知" - }, - "vehicleType": { - "type": "string", - "example": "MPV", - "description": "车型分类" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - } - }, - "title": "车型创建请求" - }, - "车型审批提交请求": { - "type": "object", - "required": [ - "targetStatus" - ], - "properties": { - "reason": { - "type": "string", - "description": "审批原因" - }, - "targetStatus": { - "type": "integer", - "format": "int32", - "description": "目标状态" - } - }, - "title": "车型审批提交请求" - }, - "车型批量删除请求": { - "type": "object", - "required": [ - "vehicleIds" - ], - "properties": { - "vehicleIds": { - "type": "array", - "description": "车型ID列表", - "items": { - "type": "integer", - "format": "int64" - } - } - }, - "title": "车型批量删除请求" - }, - "车型批量标签操作请求": { - "type": "object", - "required": [ - "vehicleIds" - ], - "properties": { - "addTagIds": { - "type": "array", - "description": "要添加的标签ID列表", - "items": { - "type": "integer", - "format": "int64" - } - }, - "removeTagIds": { - "type": "array", - "description": "要移除的标签ID列表", - "items": { - "type": "integer", - "format": "int64" - } - }, - "vehicleIds": { - "type": "array", - "description": "车型ID列表", - "items": { - "type": "integer", - "format": "int64" - } - } - }, - "title": "车型批量标签操作请求" - }, - "车型更新请求": { - "type": "object", - "properties": { - "bannerMaterialIds": { - "type": "array", - "description": "横幅素材ID列表", - "items": { - "type": "string" - } - }, - "basePrice": { - "type": "number", - "example": 800.0, - "description": "基础日租价(元)" - }, - "brand": { - "type": "string", - "example": "别克", - "description": "品牌" - }, - "comfortFeatures": { - "type": "string", - "description": "舒适配置(JSON)" - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "description": { - "type": "string", - "description": "车型描述" - }, - "driveType": { - "type": "string", - "example": "前驱", - "description": "驱动方式" - }, - "engineType": { - "type": "string", - "example": "汽油", - "description": "动力类型" - }, - "highlights": { - "type": "string", - "description": "车型亮点" - }, - "luggageCapacity": { - "type": "string", - "example": "可放3个28寸行李箱", - "description": "行李容量描述" - }, - "modelSeries": { - "type": "string", - "example": "GL8", - "description": "车系" - }, - "modelYear": { - "type": "integer", - "format": "int32", - "example": 2025, - "description": "年款" - }, - "name": { - "type": "string", - "example": "别克GL8 ES", - "description": "车型名称" - }, - "passengerCount": { - "type": "integer", - "format": "int32", - "example": 6, - "description": "可乘坐人数" - }, - "priceExcludes": { - "type": "string", - "description": "价格不包含内容" - }, - "priceIncludes": { - "type": "string", - "description": "价格包含内容" - }, - "seatCount": { - "type": "integer", - "format": "int32", - "example": 7, - "description": "座位数" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序权重,值越大越靠前" - }, - "subtitle": { - "type": "string", - "example": "商务出行首选", - "description": "副标题" - }, - "transmission": { - "type": "string", - "example": "自动", - "description": "变速箱类型" - }, - "usageNotes": { - "type": "string", - "description": "使用须知" - }, - "vehicleType": { - "type": "string", - "example": "MPV", - "description": "车型分类" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - } - }, - "title": "车型更新请求" - }, - "车型状态请求": { - "type": "object", - "required": [ - "status" - ], - "properties": { - "status": { - "type": "integer", - "format": "int32", - "description": "目标状态:0=下架 1=上架" - }, - "vehicleIds": { - "type": "array", - "description": "车型ID列表(批量操作时使用)", - "items": { - "type": "integer", - "format": "int64" - } - } - }, - "title": "车型状态请求" - }, - "车型详情VO": { - "type": "object", - "properties": { - "bannerMaterialIds": { - "type": "array", - "description": "横幅素材ID列表", - "items": { - "type": "string" - } - }, - "bannerUrls": { - "type": "array", - "description": "横幅图URL列表", - "items": { - "type": "string" - } - }, - "basePrice": { - "type": "number", - "description": "基础日租价(元)" - }, - "brand": { - "type": "string", - "description": "品牌" - }, - "comfortFeatures": { - "type": "string", - "description": "舒适配置(JSON)" - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "string", - "description": "创建者ID" - }, - "description": { - "type": "string", - "description": "车型描述" - }, - "driveType": { - "type": "string", - "description": "驱动方式" - }, - "engineType": { - "type": "string", - "description": "动力类型" - }, - "highlights": { - "type": "string", - "description": "车型亮点" - }, - "luggageCapacity": { - "type": "string", - "description": "行李容量描述" - }, - "modelSeries": { - "type": "string", - "description": "车系" - }, - "modelYear": { - "type": "integer", - "format": "int32", - "description": "年款" - }, - "name": { - "type": "string", - "description": "车型名称" - }, - "passengerCount": { - "type": "integer", - "format": "int32", - "description": "可乘坐人数" - }, - "priceExcludes": { - "type": "string", - "description": "价格不包含内容" - }, - "priceIncludes": { - "type": "string", - "description": "价格包含内容" - }, - "seatCount": { - "type": "integer", - "format": "int32", - "description": "座位数" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序权重" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下架 1=上架" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "$ref": "#/definitions/车辆标签VO", - "originalRef": "车辆标签VO" - } - }, - "transmission": { - "type": "string", - "description": "变速箱类型" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "usageNotes": { - "type": "string", - "description": "使用须知" - }, - "vehicleId": { - "type": "string", - "description": "车型ID" - }, - "vehicleType": { - "type": "string", - "description": "车型分类" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - }, - "videoUrls": { - "type": "array", - "description": "视频URL列表", - "items": { - "type": "string" - } - }, - "viewCount": { - "type": "integer", - "format": "int32", - "description": "浏览量" - } - }, - "title": "车型详情VO" - }, - "车辆标签VO": { - "type": "object", - "properties": { - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "tagColor": { - "type": "string", - "description": "标签颜色(十六进制)" - }, - "tagId": { - "type": "string", - "description": "标签ID" - }, - "tagName": { - "type": "string", - "description": "标签名称" - }, - "tagType": { - "type": "integer", - "format": "int32", - "description": "标签类型:0=自定义 1=系统" - }, - "useCount": { - "type": "integer", - "format": "int32", - "description": "使用次数" - } - }, - "title": "车辆标签VO" - }, - "车辆标签创建请求": { - "type": "object", - "required": [ - "tagName" - ], - "properties": { - "tagColor": { - "type": "string", - "example": "#3366FF", - "description": "标签颜色(十六进制)" - }, - "tagName": { - "type": "string", - "example": "商务车", - "description": "标签名称" - } - }, - "title": "车辆标签创建请求" - }, - "车辆标签更新请求": { - "type": "object", - "properties": { - "tagColor": { - "type": "string", - "example": "#3366FF", - "description": "标签颜色(十六进制)" - }, - "tagName": { - "type": "string", - "example": "商务车", - "description": "标签名称" - } - }, - "title": "车辆标签更新请求" - }, - "分页结果«费用项列表VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/费用项列表VO", - "originalRef": "费用项列表VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«费用项列表VO»" - }, - "统一响应结果«List«费用项价格变更日志VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/费用项价格变更日志VO", - "originalRef": "费用项价格变更日志VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«费用项价格变更日志VO»»" - }, - "统一响应结果«List«费用项详情VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/费用项详情VO", - "originalRef": "费用项详情VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«费用项详情VO»»" - }, - "统一响应结果«分页结果«费用项列表VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«费用项列表VO»", - "originalRef": "分页结果«费用项列表VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«费用项列表VO»»" - }, - "统一响应结果«费用项价格日历VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/费用项价格日历VO", - "originalRef": "费用项价格日历VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«费用项价格日历VO»" - }, - "统一响应结果«费用项详情VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/费用项详情VO", - "originalRef": "费用项详情VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«费用项详情VO»" - }, - "费用项价格变更日志VO": { - "type": "object", - "properties": { - "changeReason": { - "type": "string", - "description": "变更原因" - }, - "changedAt": { - "type": "string", - "format": "date-time", - "description": "变更时间" - }, - "changedBy": { - "type": "string", - "description": "变更人ID" - }, - "costId": { - "type": "string", - "description": "费用项ID" - }, - "id": { - "type": "integer", - "format": "int64", - "description": "日志ID" - }, - "newPrice": { - "type": "number", - "description": "变更后价格(元)" - }, - "oldPrice": { - "type": "number", - "description": "变更前价格(元)" - } - }, - "title": "费用项价格变更日志VO" - }, - "费用项价格日历VO": { - "type": "object", - "properties": { - "days": { - "type": "array", - "description": "价格日历明细列表", - "items": { - "$ref": "#/definitions/费用项价格日历日VO", - "originalRef": "费用项价格日历日VO" - } - }, - "yearMonth": { - "type": "string", - "description": "年月(yyyy-MM)" - } - }, - "title": "费用项价格日历VO" - }, - "费用项价格日历日VO": { - "type": "object", - "properties": { - "date": { - "type": "string", - "description": "日期(yyyy-MM-dd)" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "status": { - "type": "string", - "description": "日历状态(字典 calendar_status:AVAILABLE=可售 SOLD_OUT=已售罄 CLOSED=已关闭)" - }, - "unitPrice": { - "type": "number", - "description": "单价(元)" - } - }, - "title": "费用项价格日历日VO" - }, - "费用项价格日历设置请求": { - "type": "object", - "required": [ - "endDate", - "startDate", - "unitPrice" - ], - "properties": { - "dayFilter": { - "type": "string", - "example": "weekday", - "description": "日期过滤:weekday=仅工作日 weekend=仅周末" - }, - "endDate": { - "type": "string", - "format": "date", - "example": "2026-03-31", - "description": "结束日期" - }, - "excludeDates": { - "type": "array", - "description": "排除日期列表", - "items": { - "$ref": "#/definitions/LocalDate", - "originalRef": "LocalDate" - } - }, - "remark": { - "type": "string", - "example": "旺季价格", - "description": "备注" - }, - "selectedWeekdays": { - "type": "array", - "example": [ - 1, - 2, - 3, - 4, - 5 - ], - "description": "指定星期几(1=周一 7=周日)", - "items": { - "type": "integer", - "format": "int32" - } - }, - "startDate": { - "type": "string", - "format": "date", - "example": "2026-03-01", - "description": "开始日期" - }, - "unitPrice": { - "type": "number", - "example": 200.0, - "description": "单价(元)" - } - }, - "title": "费用项价格日历设置请求" - }, - "费用项列表VO": { - "type": "object", - "properties": { - "applyRole": { - "type": "string", - "description": "适用角色编码(字典:cost_apply_role)" - }, - "applyRoleLabel": { - "type": "string", - "description": "适用角色中文标签" - }, - "approvalNo": { - "type": "string", - "description": "审批单号" - }, - "categoryCode": { - "type": "string", - "description": "费用分类编码(字典:cost_category)" - }, - "categoryLabel": { - "type": "string", - "description": "费用分类中文标签" - }, - "costId": { - "type": "string", - "description": "费用项ID" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "name": { - "type": "string", - "description": "费用名称" - }, - "pendingStatus": { - "type": "integer", - "format": "int32", - "description": "待审批目标状态" - }, - "refCount": { - "type": "integer", - "format": "int32", - "description": "引用次数" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序权重" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下架 1=上架" - }, - "unit": { - "type": "string", - "description": "计价单位" - }, - "unitPrice": { - "type": "number", - "description": "单价(元)" - } - }, - "title": "费用项列表VO" - }, - "费用项创建请求": { - "type": "object", - "required": [ - "applyRole", - "categoryCode", - "name", - "unitPrice" - ], - "properties": { - "applyRole": { - "type": "string", - "example": "ADULT", - "description": "适用角色" - }, - "calcHint": { - "type": "string", - "example": "按人头*天数计算", - "description": "计算提示" - }, - "categoryCode": { - "type": "string", - "example": "GUIDE", - "description": "费用分类编码" - }, - "defaultFormula": { - "type": "string", - "example": "人数*天数*单价", - "description": "默认计算公式" - }, - "description": { - "type": "string", - "description": "费用描述" - }, - "name": { - "type": "string", - "example": "导游服务费", - "description": "费用名称" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序权重,值越大越靠前" - }, - "unit": { - "type": "string", - "example": "人/天", - "description": "计价单位" - }, - "unitPrice": { - "type": "number", - "example": 200.0, - "description": "单价(元)" - } - }, - "title": "费用项创建请求" - }, - "费用项审批提交请求": { - "type": "object", - "required": [ - "targetStatus" - ], - "properties": { - "reason": { - "type": "string", - "description": "审批原因" - }, - "targetStatus": { - "type": "integer", - "format": "int32", - "description": "目标状态" - } - }, - "title": "费用项审批提交请求" - }, - "费用项更新请求": { - "type": "object", - "properties": { - "applyRole": { - "type": "string", - "example": "ADULT", - "description": "适用角色" - }, - "calcHint": { - "type": "string", - "example": "按人头*天数计算", - "description": "计算提示" - }, - "categoryCode": { - "type": "string", - "example": "GUIDE", - "description": "费用分类编码" - }, - "changeReason": { - "type": "string", - "example": "供应商调价", - "description": "价格变更原因(修改单价时必填)" - }, - "defaultFormula": { - "type": "string", - "example": "人数*天数*单价", - "description": "默认计算公式" - }, - "description": { - "type": "string", - "description": "费用描述" - }, - "name": { - "type": "string", - "example": "导游服务费", - "description": "费用名称" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序权重,值越大越靠前" - }, - "unit": { - "type": "string", - "example": "人/天", - "description": "计价单位" - }, - "unitPrice": { - "type": "number", - "example": 250.0, - "description": "单价(元)" - } - }, - "title": "费用项更新请求" - }, - "费用项详情VO": { - "type": "object", - "properties": { - "applyRole": { - "type": "string", - "description": "适用角色编码(字典:cost_apply_role)" - }, - "applyRoleLabel": { - "type": "string", - "description": "适用角色中文标签" - }, - "approvalNo": { - "type": "string", - "description": "审批单号" - }, - "calcHint": { - "type": "string", - "description": "计算提示" - }, - "categoryCode": { - "type": "string", - "description": "费用分类编码(字典:cost_category)" - }, - "categoryLabel": { - "type": "string", - "description": "费用分类中文标签" - }, - "costId": { - "type": "string", - "description": "费用项ID" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "string", - "description": "创建者ID" - }, - "defaultFormula": { - "type": "string", - "description": "默认计算公式" - }, - "description": { - "type": "string", - "description": "费用描述" - }, - "name": { - "type": "string", - "description": "费用名称" - }, - "pendingStatus": { - "type": "integer", - "format": "int32", - "description": "待审批目标状态" - }, - "refCount": { - "type": "integer", - "format": "int32", - "description": "引用次数" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序权重" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下架 1=上架" - }, - "unit": { - "type": "string", - "description": "计价单位" - }, - "unitPrice": { - "type": "number", - "description": "单价(元)" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "费用项详情VO" - }, - "Map«string,string»_1": { - "type": "object", - "title": "Map«string,string»_1", - "additionalProperties": { - "type": "string" - } - }, - "Map«string,string»_2": { - "type": "object", - "title": "Map«string,string»_2", - "additionalProperties": { - "type": "string" - } - }, - "Map«string,string»_3": { - "type": "object", - "title": "Map«string,string»_3", - "additionalProperties": { - "type": "string" - } - }, - "Map«string,string»_4": { - "type": "object", - "title": "Map«string,string»_4", - "additionalProperties": { - "type": "string" - } - }, - "人员审批提交请求": { - "type": "object", - "required": [ - "targetStatus" - ], - "properties": { - "reason": { - "type": "string", - "description": "审批原因" - }, - "targetStatus": { - "type": "integer", - "format": "int32", - "description": "目标状态" - } - }, - "title": "人员审批提交请求" - }, - "人员批量删除请求": { - "type": "object", - "required": [ - "staffIds" - ], - "properties": { - "staffIds": { - "type": "array", - "description": "人员ID列表", - "items": { - "type": "integer", - "format": "int64" - } - } - }, - "title": "人员批量删除请求" - }, - "人员批量标签操作请求": { - "type": "object", - "required": [ - "staffIds" - ], - "properties": { - "addTagIds": { - "type": "array", - "description": "要添加的标签ID列表", - "items": { - "type": "integer", - "format": "int64" - } - }, - "removeTagIds": { - "type": "array", - "description": "要移除的标签ID列表", - "items": { - "type": "integer", - "format": "int64" - } - }, - "staffIds": { - "type": "array", - "description": "人员ID列表", - "items": { - "type": "integer", - "format": "int64" - } - } - }, - "title": "人员批量标签操作请求" - }, - "人员状态请求": { - "type": "object", - "required": [ - "status" - ], - "properties": { - "staffIds": { - "type": "array", - "description": "人员ID列表(批量操作时使用)", - "items": { - "type": "integer", - "format": "int64" - } - }, - "status": { - "type": "integer", - "format": "int32", - "description": "目标状态:0=下架 1=上架" - } - }, - "title": "人员状态请求" - }, - "分页结果«服务人员列表VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/服务人员列表VO", - "originalRef": "服务人员列表VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«服务人员列表VO»" - }, - "分页结果«服务人员标签VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/服务人员标签VO", - "originalRef": "服务人员标签VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«服务人员标签VO»" - }, - "服务人员价格日历VO": { - "type": "object", - "properties": { - "month": { - "type": "integer", - "format": "int32", - "description": "月份" - }, - "prices": { - "type": "array", - "description": "价格日历明细列表", - "items": { - "$ref": "#/definitions/服务人员价格日历日VO", - "originalRef": "服务人员价格日历日VO" - } - }, - "staffType": { - "type": "string", - "description": "人员类型: GUIDE/GUIDE_ASSISTANT/PHOTOGRAPHER/LEADER/OTHER" - }, - "staffTypeName": { - "type": "string", - "description": "人员类型名称" - }, - "stockEnabled": { - "type": "boolean", - "description": "是否启用库存管理" - }, - "year": { - "type": "integer", - "format": "int32", - "description": "年份" - } - }, - "title": "服务人员价格日历VO" - }, - "服务人员价格日历日VO": { - "type": "object", - "properties": { - "costPrice": { - "type": "number", - "description": "日薪(元)" - }, - "date": { - "type": "string", - "format": "date", - "description": "日期" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "status": { - "type": "string", - "description": "日历状态(字典 calendar_status:AVAILABLE=可售 SOLD_OUT=已售罄 CLOSED=已关闭)" - }, - "stock": { - "type": "integer", - "format": "int32", - "description": "库存数量" - }, - "stockUsed": { - "type": "integer", - "format": "int32", - "description": "已用库存" - } - }, - "title": "服务人员价格日历日VO" - }, - "服务人员价格日历状态变更请求": { - "type": "object", - "required": [ - "endDate", - "startDate", - "status" - ], - "properties": { - "endDate": { - "type": "string", - "format": "date", - "example": "2026-03-31", - "description": "结束日期" - }, - "remark": { - "type": "string", - "example": "临时停用", - "description": "备注" - }, - "startDate": { - "type": "string", - "format": "date", - "example": "2026-03-01", - "description": "开始日期" - }, - "status": { - "type": "string", - "example": "CLOSED", - "description": "目标状态(字典 calendar_status:AVAILABLE=可售 SOLD_OUT=已售罄 CLOSED=已关闭)" - } - }, - "title": "服务人员价格日历状态变更请求" - }, - "服务人员价格日历设置请求": { - "type": "object", - "required": [ - "costPrice", - "endDate", - "startDate" - ], - "properties": { - "costPrice": { - "type": "number", - "example": 500.0, - "description": "日薪(元)" - }, - "endDate": { - "type": "string", - "format": "date", - "example": "2026-03-31", - "description": "结束日期" - }, - "excludeDates": { - "type": "array", - "description": "排除日期列表", - "items": { - "$ref": "#/definitions/LocalDate", - "originalRef": "LocalDate" - } - }, - "remark": { - "type": "string", - "example": "旺季价格", - "description": "备注" - }, - "selectedWeekdays": { - "type": "array", - "example": [ - 1, - 2, - 3, - 4, - 5 - ], - "description": "指定星期几(1=周一 7=周日)", - "items": { - "type": "integer", - "format": "int32" - } - }, - "startDate": { - "type": "string", - "format": "date", - "example": "2026-03-01", - "description": "开始日期" - }, - "status": { - "type": "string", - "example": "AVAILABLE", - "description": "日历状态(字典 calendar_status:AVAILABLE=可售 SOLD_OUT=已售罄 CLOSED=已关闭)" - }, - "stock": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "库存数量" - }, - "weekdayOnly": { - "type": "boolean", - "example": false, - "description": "是否仅工作日" - }, - "weekendOnly": { - "type": "boolean", - "example": false, - "description": "是否仅周末" - } - }, - "title": "服务人员价格日历设置请求" - }, - "服务人员列表VO": { - "type": "object", - "properties": { - "approvalNo": { - "type": "string", - "description": "审批单号" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "highlights": { - "type": "string", - "description": "人员亮点" - }, - "name": { - "type": "string", - "description": "姓名" - }, - "pendingStatus": { - "type": "integer", - "format": "int32", - "description": "待审批目标状态" - }, - "phone": { - "type": "string", - "description": "手机号" - }, - "rating": { - "type": "number", - "description": "评分" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序权重" - }, - "staffId": { - "type": "string", - "description": "人员ID" - }, - "staffType": { - "type": "string", - "description": "人员类型" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下架 1=上架" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "$ref": "#/definitions/服务人员标签VO", - "originalRef": "服务人员标签VO" - } - }, - "viewCount": { - "type": "integer", - "format": "int32", - "description": "浏览量" - } - }, - "title": "服务人员列表VO" - }, - "服务人员创建请求": { - "type": "object", - "required": [ - "name", - "staffType" - ], - "properties": { - "bannerMaterialIds": { - "type": "array", - "description": "横幅素材ID列表", - "items": { - "type": "string" - } - }, - "birthDate": { - "type": "string", - "format": "date", - "example": "1990-01-15", - "description": "出生日期" - }, - "certificateTags": { - "type": "array", - "description": "证书标签列表(旧字段,建议用certificates)", - "items": { - "type": "string" - } - }, - "certificateUrls": { - "type": "array", - "description": "资质证书URL列表(旧字段,建议用certificates)", - "items": { - "type": "string" - } - }, - "certificates": { - "type": "array", - "example": [ - { - "tag": "急救证书", - "url": "https://xxx/cert.jpg" - } - ], - "description": "证书列表(标签+附件一一对应)", - "items": { - "$ref": "#/definitions/Map«string,string»", - "originalRef": "Map«string,string»" - } - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "description": { - "type": "string", - "description": "人员描述" - }, - "emergencyContact": { - "type": "string", - "description": "紧急联系人" - }, - "emergencyPhone": { - "type": "string", - "description": "紧急联系电话" - }, - "ethnicity": { - "type": "string", - "example": "汉族", - "description": "民族" - }, - "gender": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "性别:0=女 1=男" - }, - "guideCardNo": { - "type": "string", - "example": "D-5101-000001", - "description": "导游证号" - }, - "guideLanguage": { - "type": "string", - "example": "中文", - "description": "导游语种" - }, - "guideLevel": { - "type": "string", - "example": "中级", - "description": "导游等级" - }, - "highlights": { - "type": "string", - "description": "人员亮点" - }, - "idCardUrls": { - "type": "array", - "description": "证件照URL列表", - "items": { - "type": "string" - } - }, - "languages": { - "type": "array", - "description": "掌握语言(JSON数组)", - "items": { - "type": "string" - } - }, - "licenseExpiry": { - "type": "string", - "format": "date", - "description": "执照到期日" - }, - "licenseNo": { - "type": "string", - "description": "执照编号" - }, - "licenseType": { - "type": "string", - "description": "执照类型" - }, - "name": { - "type": "string", - "example": "张导", - "description": "姓名" - }, - "nationality": { - "type": "string", - "example": "中国", - "description": "国籍" - }, - "nativePlace": { - "type": "string", - "example": "四川成都", - "description": "籍贯" - }, - "phone": { - "type": "string", - "example": 13800138000, - "description": "手机号" - }, - "photoUrls": { - "type": "array", - "description": "个人照片URL列表", - "items": { - "type": "string" - } - }, - "priceExcludes": { - "type": "string", - "description": "价格不包含内容" - }, - "priceIncludes": { - "type": "string", - "description": "价格包含内容" - }, - "serviceAreas": { - "type": "array", - "description": "服务区域(JSON数组)", - "items": { - "type": "string" - } - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序权重,值越大越靠前" - }, - "specialties": { - "type": "array", - "description": "擅长领域(JSON数组)", - "items": { - "type": "string" - } - }, - "staffType": { - "type": "string", - "example": "GUIDE", - "description": "人员类型" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - }, - "yearsOfExperience": { - "type": "integer", - "format": "int32", - "example": 5, - "description": "从业年限" - } - }, - "title": "服务人员创建请求" - }, - "服务人员更新请求": { - "type": "object", - "properties": { - "bannerMaterialIds": { - "type": "array", - "description": "横幅素材ID列表", - "items": { - "type": "string" - } - }, - "birthDate": { - "type": "string", - "format": "date", - "example": "1990-01-15", - "description": "出生日期" - }, - "certificateTags": { - "type": "array", - "description": "证书标签列表(旧字段,建议用certificates)", - "items": { - "type": "string" - } - }, - "certificateUrls": { - "type": "array", - "description": "资质证书URL列表(旧字段,建议用certificates)", - "items": { - "type": "string" - } - }, - "certificates": { - "type": "array", - "example": [ - { - "tag": "急救证书", - "url": "https://xxx/cert.jpg" - } - ], - "description": "证书列表(标签+附件一一对应)", - "items": { - "$ref": "#/definitions/Map«string,string»", - "originalRef": "Map«string,string»" - } - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "description": { - "type": "string", - "description": "人员描述" - }, - "emergencyContact": { - "type": "string", - "description": "紧急联系人" - }, - "emergencyPhone": { - "type": "string", - "description": "紧急联系电话" - }, - "ethnicity": { - "type": "string", - "example": "汉族", - "description": "民族" - }, - "gender": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "性别:0=女 1=男" - }, - "guideCardNo": { - "type": "string", - "description": "导游证号" - }, - "guideLanguage": { - "type": "string", - "description": "导游语种" - }, - "guideLevel": { - "type": "string", - "description": "导游等级" - }, - "highlights": { - "type": "string", - "description": "人员亮点" - }, - "idCardUrls": { - "type": "array", - "description": "证件照URL列表", - "items": { - "type": "string" - } - }, - "languages": { - "type": "array", - "description": "掌握语言(JSON数组)", - "items": { - "type": "string" - } - }, - "licenseExpiry": { - "type": "string", - "format": "date", - "description": "执照到期日" - }, - "licenseNo": { - "type": "string", - "description": "执照编号" - }, - "licenseType": { - "type": "string", - "description": "执照类型" - }, - "name": { - "type": "string", - "example": "张导", - "description": "姓名" - }, - "nationality": { - "type": "string", - "example": "中国", - "description": "国籍" - }, - "nativePlace": { - "type": "string", - "example": "四川成都", - "description": "籍贯" - }, - "phone": { - "type": "string", - "example": 13800138000, - "description": "手机号" - }, - "photoUrls": { - "type": "array", - "description": "个人照片URL列表", - "items": { - "type": "string" - } - }, - "priceExcludes": { - "type": "string", - "description": "价格不包含内容" - }, - "priceIncludes": { - "type": "string", - "description": "价格包含内容" - }, - "serviceAreas": { - "type": "array", - "description": "服务区域(JSON数组)", - "items": { - "type": "string" - } - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序权重,值越大越靠前" - }, - "specialties": { - "type": "array", - "description": "擅长领域(JSON数组)", - "items": { - "type": "string" - } - }, - "staffType": { - "type": "string", - "example": "GUIDE", - "description": "人员类型" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - }, - "yearsOfExperience": { - "type": "integer", - "format": "int32", - "description": "从业年限" - } - }, - "title": "服务人员更新请求" - }, - "服务人员标签VO": { - "type": "object", - "properties": { - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "tagColor": { - "type": "string", - "description": "标签颜色(十六进制)" - }, - "tagId": { - "type": "string", - "description": "标签ID" - }, - "tagName": { - "type": "string", - "description": "标签名称" - }, - "tagType": { - "type": "integer", - "format": "int32", - "description": "标签类型:0=预设 1=自定义" - }, - "useCount": { - "type": "integer", - "format": "int32", - "description": "使用次数" - } - }, - "title": "服务人员标签VO" - }, - "服务人员标签创建请求": { - "type": "object", - "required": [ - "tagName" - ], - "properties": { - "tagColor": { - "type": "string", - "example": "#3366FF", - "description": "标签颜色(十六进制)" - }, - "tagName": { - "type": "string", - "example": "金牌导游", - "description": "标签名称" - } - }, - "title": "服务人员标签创建请求" - }, - "服务人员标签更新请求": { - "type": "object", - "properties": { - "tagColor": { - "type": "string", - "example": "#3366FF", - "description": "标签颜色(十六进制)" - }, - "tagName": { - "type": "string", - "example": "金牌导游", - "description": "标签名称" - } - }, - "title": "服务人员标签更新请求" - }, - "服务人员详情VO": { - "type": "object", - "properties": { - "bannerMaterialIds": { - "type": "array", - "description": "横幅素材ID列表", - "items": { - "type": "string" - } - }, - "bannerUrls": { - "type": "array", - "description": "横幅图URL列表", - "items": { - "type": "string" - } - }, - "birthDate": { - "type": "string", - "format": "date", - "description": "出生日期" - }, - "certificateTags": { - "type": "array", - "description": "证书标签列表(旧字段,建议用certificates)", - "items": { - "type": "string" - } - }, - "certificateUrls": { - "type": "array", - "description": "资质证书URL列表(旧字段,建议用certificates)", - "items": { - "type": "string" - } - }, - "certificates": { - "type": "array", - "description": "证书列表(标签+附件一一对应)[{tag,url}]", - "items": { - "$ref": "#/definitions/Map«string,string»", - "originalRef": "Map«string,string»" - } - }, - "coverMaterialId": { - "type": "string", - "description": "封面素材ID" - }, - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "string", - "description": "创建者ID" - }, - "description": { - "type": "string", - "description": "人员描述" - }, - "emergencyContact": { - "type": "string", - "description": "紧急联系人" - }, - "emergencyPhone": { - "type": "string", - "description": "紧急联系电话" - }, - "ethnicity": { - "type": "string", - "description": "民族" - }, - "gender": { - "type": "integer", - "format": "int32", - "description": "性别:0=女 1=男" - }, - "guideCardNo": { - "type": "string", - "description": "导游证号" - }, - "guideLanguage": { - "type": "string", - "description": "导游语种" - }, - "guideLevel": { - "type": "string", - "description": "导游等级" - }, - "highlights": { - "type": "string", - "description": "人员亮点" - }, - "idCardUrls": { - "type": "array", - "description": "证件照URL列表", - "items": { - "type": "string" - } - }, - "languages": { - "type": "array", - "description": "掌握语言", - "items": { - "type": "string" - } - }, - "licenseExpiry": { - "type": "string", - "format": "date", - "description": "执照到期日" - }, - "licenseNo": { - "type": "string", - "description": "执照编号" - }, - "licenseType": { - "type": "string", - "description": "执照类型" - }, - "name": { - "type": "string", - "description": "姓名" - }, - "nationality": { - "type": "string", - "description": "国籍" - }, - "nativePlace": { - "type": "string", - "description": "籍贯" - }, - "phone": { - "type": "string", - "description": "手机号" - }, - "photoUrls": { - "type": "array", - "description": "个人照片URL列表", - "items": { - "type": "string" - } - }, - "priceExcludes": { - "type": "string", - "description": "价格不包含内容" - }, - "priceIncludes": { - "type": "string", - "description": "价格包含内容" - }, - "rating": { - "type": "number", - "description": "评分" - }, - "reviewCount": { - "type": "integer", - "format": "int32", - "description": "评价数" - }, - "serviceAreas": { - "type": "array", - "description": "服务区域", - "items": { - "type": "string" - } - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序权重" - }, - "specialties": { - "type": "array", - "description": "擅长领域", - "items": { - "type": "string" - } - }, - "staffId": { - "type": "string", - "description": "人员ID" - }, - "staffType": { - "type": "string", - "description": "人员类型" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下架 1=上架" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "$ref": "#/definitions/服务人员标签VO", - "originalRef": "服务人员标签VO" - } - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "videoMaterialIds": { - "type": "array", - "description": "视频素材ID列表", - "items": { - "type": "string" - } - }, - "videoUrls": { - "type": "array", - "description": "视频URL列表", - "items": { - "type": "string" - } - }, - "viewCount": { - "type": "integer", - "format": "int32", - "description": "浏览量" - }, - "yearsOfExperience": { - "type": "integer", - "format": "int32", - "description": "从业年限" - } - }, - "title": "服务人员详情VO" - }, - "统一响应结果«List«服务人员标签VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/服务人员标签VO", - "originalRef": "服务人员标签VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«服务人员标签VO»»" - }, - "统一响应结果«分页结果«服务人员列表VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«服务人员列表VO»", - "originalRef": "分页结果«服务人员列表VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«服务人员列表VO»»" - }, - "统一响应结果«分页结果«服务人员标签VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«服务人员标签VO»", - "originalRef": "分页结果«服务人员标签VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«服务人员标签VO»»" - }, - "统一响应结果«服务人员价格日历VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/服务人员价格日历VO", - "originalRef": "服务人员价格日历VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«服务人员价格日历VO»" - }, - "统一响应结果«服务人员标签VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/服务人员标签VO", - "originalRef": "服务人员标签VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«服务人员标签VO»" - }, - "统一响应结果«服务人员详情VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/服务人员详情VO", - "originalRef": "服务人员详情VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«服务人员详情VO»" - }, - "设置人员标签请求": { - "type": "object", - "required": [ - "tagIds" - ], - "properties": { - "tagIds": { - "type": "array", - "description": "标签ID列表", - "items": { - "type": "integer", - "format": "int64" - } - } - }, - "title": "设置人员标签请求" - } - } -} \ No newline at end of file diff --git a/.swagger/hl-review-service.json b/.swagger/hl-review-service.json deleted file mode 100644 index 3f6a1c5..0000000 --- a/.swagger/hl-review-service.json +++ /dev/null @@ -1,1029 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "评价服务", - "version": "1.0.0" - }, - "basePath": "/", - "paths": { - "/admin/review/list": { - "get": { - "tags": [ - "管理端-评价审核" - ], - "summary": "评价列表(支持好中差评/有图/有视频筛选)", - "description": "分页查询全部评价(含待审核/已通过/已拒绝),支持按评价等级、是否有图/视频、目标类型筛选\n\n**关联字典**:\n- review_status:评价审核状态(列表筛选+显示)\n- rating_level:评价等级(列表筛选+显示)", - "operationId": "listReviewsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "hasImage", - "in": "query", - "description": "是否有图片: true/false", - "required": false, - "type": "boolean" - }, - { - "name": "hasVideo", - "in": "query", - "description": "是否有视频: true/false", - "required": false, - "type": "boolean" - }, - { - "name": "keyword", - "in": "query", - "description": "搜索关键词", - "required": false, - "type": "string", - "x-example": "风景" - }, - { - "name": "maxRating", - "in": "query", - "description": "最高评分(整体满意度)", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 5 - }, - { - "name": "minRating", - "in": "query", - "description": "最低评分(整体满意度)", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 3 - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 1 - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "format": "int32", - "x-example": 20 - }, - { - "name": "productType", - "in": "query", - "description": "产品类型(字典 review_product_type)", - "required": false, - "type": "string", - "x-example": "CORE" - }, - { - "name": "ratingLevel", - "in": "query", - "description": "评价等级: GOOD/MEDIUM/BAD", - "required": false, - "type": "string", - "x-example": "GOOD" - }, - { - "name": "reviewType", - "in": "query", - "description": "评论类型(字典 review_type)", - "required": false, - "type": "string", - "x-example": "PRODUCT" - }, - { - "name": "status", - "in": "query", - "description": "评价状态", - "required": false, - "type": "string", - "x-example": "APPROVED" - }, - { - "name": "targetId", - "in": "query", - "description": "评价目标ID", - "required": false, - "type": "integer", - "format": "int64", - "x-example": 2001 - }, - { - "name": "targetType", - "in": "query", - "description": "评价目标类型", - "required": false, - "type": "string", - "x-example": "PRODUCT" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«评价列表项(管理端)»»", - "originalRef": "统一响应结果«分页结果«评价列表项(管理端)»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«分页结果«评价列表项(管理端)»»", - "originalRef": "统一响应结果«分页结果«评价列表项(管理端)»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/review/{reviewId}": { - "get": { - "tags": [ - "管理端-评价审核" - ], - "summary": "评价详情", - "description": "**关联字典**:\n- review_status:评价审核状态(显示)\n- rating_level:评价等级(显示)", - "operationId": "getReviewDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "reviewId", - "in": "path", - "description": "评价ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«评价详情»", - "originalRef": "统一响应结果«评价详情»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«评价详情»", - "originalRef": "统一响应结果«评价详情»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/review/{reviewId}/approve": { - "post": { - "tags": [ - "管理端-评价审核" - ], - "summary": "通过评价", - "description": "审核通过评价,通过后评价在小程序端公开展示。状态流转:PENDING_REVIEW → APPROVED", - "operationId": "approveUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "reviewId", - "in": "path", - "description": "评价ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/review/{reviewId}/override-approve": { - "post": { - "tags": [ - "管理端-评价审核" - ], - "summary": "覆盖通过(机器拒绝的)", - "description": "对阿里云内容审核自动拒绝的评价进行人工覆盖通过。状态流转:AUTO_REJECTED → APPROVED", - "operationId": "overrideApproveUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "reviewId", - "in": "path", - "description": "评价ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/review/{reviewId}/reject": { - "post": { - "tags": [ - "管理端-评价审核" - ], - "summary": "拒绝评价", - "description": "审核拒绝评价,需填写拒绝原因。拒绝后评价不公开展示。状态流转:PENDING_REVIEW → REJECTED", - "operationId": "rejectUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "拒绝请求", - "required": false, - "schema": { - "$ref": "#/definitions/拒绝评价请求", - "originalRef": "拒绝评价请求" - } - }, - { - "name": "reviewId", - "in": "path", - "description": "评价ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/review/{reviewId}/reply": { - "post": { - "tags": [ - "管理端-评价审核" - ], - "summary": "回复评价(每条评价仅可回复一次)", - "description": "管理员回复用户评价,回复内容在小程序端公开展示。每条评价仅允许回复一次,不可修改。\n\n**权限**:需管理员登录。", - "operationId": "adminReplyUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "回复内容", - "required": false, - "schema": { - "$ref": "#/definitions/管理员回复请求", - "originalRef": "管理员回复请求" - } - }, - { - "name": "reviewId", - "in": "path", - "description": "评价ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - } - }, - "definitions": { - "分页结果«评价列表项(管理端)»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "$ref": "#/definitions/评价列表项(管理端)", - "originalRef": "评价列表项(管理端)" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«评价列表项(管理端)»" - }, - "拒绝评价请求": { - "type": "object", - "required": [ - "rejectReason" - ], - "properties": { - "rejectReason": { - "type": "string", - "example": "评价内容包含不当言论", - "description": "拒绝原因" - } - }, - "title": "拒绝评价请求" - }, - "管理员回复请求": { - "type": "object", - "required": [ - "replyContent" - ], - "properties": { - "replyContent": { - "type": "string", - "example": "感谢您的评价,期待下次为您服务!", - "description": "回复内容" - } - }, - "title": "管理员回复请求" - }, - "统一响应结果«Void»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Void»" - }, - "统一响应结果«分页结果«评价列表项(管理端)»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/分页结果«评价列表项(管理端)»", - "originalRef": "分页结果«评价列表项(管理端)»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«分页结果«评价列表项(管理端)»»" - }, - "统一响应结果«评价详情»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/评价详情", - "originalRef": "评价详情" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«评价详情»" - }, - "评价列表项(管理端)": { - "type": "object", - "properties": { - "auditedAt": { - "type": "string", - "format": "date-time", - "description": "审核时间" - }, - "auditorName": { - "type": "string", - "description": "审核人姓名" - }, - "content": { - "type": "string", - "description": "评价内容" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "hasReply": { - "type": "boolean", - "description": "是否已回复" - }, - "imageCount": { - "type": "integer", - "format": "int32", - "description": "图片数量" - }, - "orderId": { - "type": "string", - "description": "订单ID" - }, - "orderNo": { - "type": "string", - "description": "订单编号" - }, - "productType": { - "type": "string", - "description": "产品类型" - }, - "productTypeLabel": { - "type": "string", - "description": "产品类型标签" - }, - "ratingAccommodation": { - "type": "integer", - "format": "int32", - "description": "住宿安排评分(1-5)" - }, - "ratingDining": { - "type": "integer", - "format": "int32", - "description": "餐饮质量评分(1-5)" - }, - "ratingDriver": { - "type": "integer", - "format": "int32", - "description": "司机服务评分(1-5)" - }, - "ratingItinerary": { - "type": "integer", - "format": "int32", - "description": "行程安排评分(1-5)" - }, - "ratingLevel": { - "type": "string", - "description": "评价等级: GOOD/MEDIUM/BAD" - }, - "ratingLevelLabel": { - "type": "string", - "description": "评价等级标签" - }, - "ratingOverall": { - "type": "integer", - "format": "int32", - "description": "整体满意度评分(1-5)" - }, - "rejectReason": { - "type": "string", - "description": "拒绝原因" - }, - "reviewId": { - "type": "string", - "description": "评价ID" - }, - "reviewType": { - "type": "string", - "description": "评论类型" - }, - "reviewTypeLabel": { - "type": "string", - "description": "评论类型标签" - }, - "status": { - "type": "string", - "description": "评价状态" - }, - "statusLabel": { - "type": "string", - "description": "评价状态标签" - }, - "targetId": { - "type": "string", - "description": "评价目标ID" - }, - "targetName": { - "type": "string", - "description": "评价目标名称" - }, - "targetType": { - "type": "string", - "description": "评价目标类型" - }, - "targetTypeLabel": { - "type": "string", - "description": "评价目标类型标签" - }, - "userAvatar": { - "type": "string", - "description": "用户头像" - }, - "userNickname": { - "type": "string", - "description": "用户昵称" - }, - "videoCount": { - "type": "integer", - "format": "int32", - "description": "视频数量" - } - }, - "title": "评价列表项(管理端)" - }, - "评价图片信息": { - "type": "object", - "properties": { - "fileId": { - "type": "string", - "description": "文件ID" - }, - "imageId": { - "type": "string", - "description": "图片ID" - }, - "imageUrl": { - "type": "string", - "description": "图片URL" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - } - }, - "title": "评价图片信息" - }, - "评价视频信息": { - "type": "object", - "properties": { - "coverUrl": { - "type": "string", - "description": "视频封面URL" - }, - "duration": { - "type": "integer", - "format": "int32", - "description": "视频时长(秒)" - }, - "fileId": { - "type": "string", - "description": "文件ID" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "videoId": { - "type": "string", - "description": "视频ID" - }, - "videoUrl": { - "type": "string", - "description": "视频URL" - } - }, - "title": "评价视频信息" - }, - "评价详情": { - "type": "object", - "properties": { - "adminReply": { - "type": "string", - "description": "管理员回复内容" - }, - "adminReplyAt": { - "type": "string", - "format": "date-time", - "description": "回复时间" - }, - "adminReplyName": { - "type": "string", - "description": "回复管理员姓名" - }, - "auditedAt": { - "type": "string", - "format": "date-time", - "description": "审核时间" - }, - "auditorAdminId": { - "type": "string", - "description": "审核人ID" - }, - "auditorName": { - "type": "string", - "description": "审核人姓名" - }, - "content": { - "type": "string", - "description": "评价内容" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "departureDate": { - "type": "string", - "format": "date", - "description": "出发日期(冗余自订单)" - }, - "hasImage": { - "type": "boolean", - "description": "是否有图片" - }, - "hasVideo": { - "type": "boolean", - "description": "是否有视频" - }, - "imageCount": { - "type": "integer", - "format": "int32", - "description": "图片数量" - }, - "images": { - "type": "array", - "description": "评价图片列表", - "items": { - "$ref": "#/definitions/评价图片信息", - "originalRef": "评价图片信息" - } - }, - "machineResult": { - "type": "string", - "description": "机审结果" - }, - "orderId": { - "type": "string", - "description": "订单ID" - }, - "orderNo": { - "type": "string", - "description": "订单编号" - }, - "productType": { - "type": "string", - "description": "产品类型" - }, - "productTypeLabel": { - "type": "string", - "description": "产品类型标签" - }, - "ratingAccommodation": { - "type": "integer", - "format": "int32", - "description": "住宿安排评分(1-5)" - }, - "ratingDining": { - "type": "integer", - "format": "int32", - "description": "餐饮质量评分(1-5)" - }, - "ratingDriver": { - "type": "integer", - "format": "int32", - "description": "司机服务评分(1-5)" - }, - "ratingItinerary": { - "type": "integer", - "format": "int32", - "description": "行程安排评分(1-5)" - }, - "ratingLevel": { - "type": "string", - "description": "评价等级: GOOD/MEDIUM/BAD" - }, - "ratingLevelLabel": { - "type": "string", - "description": "评价等级标签: 好评/中评/差评" - }, - "ratingOverall": { - "type": "integer", - "format": "int32", - "description": "整体满意度评分(1-5)" - }, - "rejectReason": { - "type": "string", - "description": "拒绝原因" - }, - "reviewId": { - "type": "string", - "description": "评价ID" - }, - "reviewType": { - "type": "string", - "description": "评论类型" - }, - "reviewTypeLabel": { - "type": "string", - "description": "评论类型标签" - }, - "status": { - "type": "string", - "description": "评价状态" - }, - "statusLabel": { - "type": "string", - "description": "评价状态标签" - }, - "targetId": { - "type": "string", - "description": "评价目标ID" - }, - "targetName": { - "type": "string", - "description": "评价目标名称" - }, - "targetType": { - "type": "string", - "description": "评价目标类型" - }, - "targetTypeLabel": { - "type": "string", - "description": "评价目标类型标签" - }, - "userAvatar": { - "type": "string", - "description": "用户头像" - }, - "userId": { - "type": "string", - "description": "用户ID" - }, - "userNickname": { - "type": "string", - "description": "用户昵称" - }, - "videoCount": { - "type": "integer", - "format": "int32", - "description": "视频数量" - }, - "videos": { - "type": "array", - "description": "评价视频列表", - "items": { - "$ref": "#/definitions/评价视频信息", - "originalRef": "评价视频信息" - } - } - }, - "title": "评价详情" - } - } -} \ No newline at end of file diff --git a/.swagger/hl-task-service.json b/.swagger/hl-task-service.json deleted file mode 100644 index 1a35580..0000000 --- a/.swagger/hl-task-service.json +++ /dev/null @@ -1,2762 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "任务服务", - "version": "1.0.0" - }, - "basePath": "/", - "paths": { - "/admin/task/board": { - "post": { - "tags": [ - "任务看板管理" - ], - "summary": "创建自定义看板", - "description": "创建自定义看板,自动添加创建者为看板成员,并创建默认状态列(待办、进行中、已完成)。\n\n**权限**:需管理员登录。", - "operationId": "createBoardUsingPOST_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "req", - "description": "创建看板请求", - "required": false, - "schema": { - "$ref": "#/definitions/创建看板请求", - "originalRef": "创建看板请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«看板信息»", - "originalRef": "统一响应结果«看板信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«看板信息»", - "originalRef": "统一响应结果«看板信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/task/board/ws-doc/info": { - "get": { - "tags": [ - "WebSocket 实时推送" - ], - "summary": "WebSocket 连接说明", - "description": "## 连接信息\n\n| 项目 | 值 |\n|------|-------|\n| **连接地址** | `ws://{host}:8092/ws/task` |\n| **协议** | STOMP over WebSocket(SockJS 降级方案) |\n| **跨域** | 允许所有源 (`*`) |\n\n## 订阅频道\n\n| 订阅地址 | 说明 |\n|------------|-------------|\n| `/topic/board/{boardId}` | 订阅指定看板,接收该看板下的实时任务事件 |\n\n## 推送消息格式\n\n```json\n{\n \"event\": \"TASK_CREATED\",\n \"data\": { ... },\n \"timestamp\": 1709539200000\n}\n```\n\n## 事件类型\n\n| 事件 | 说明 | data 内容 |\n|-------|------------|------|\n| TASK_CREATED | 任务创建 | 任务对象 |\n| TASK_UPDATED | 任务更新 | 任务对象 |\n| TASK_DELETED | 任务删除 | 任务ID |\n| TASK_MOVED | 任务移动(状态变更) | 任务对象 |\n| COMMENT_ADDED | 新增评论 | 评论对象 |\n\n## 前端接入示例 (SockJS + STOMP)\n\n```javascript\nimport SockJS from 'sockjs-client'\nimport { Stomp } from '@stomp/stompjs'\n\nconst socket = new SockJS('http://localhost:8092/ws/task')\nconst stompClient = Stomp.over(socket)\n\nstompClient.connect({}, () => {\n stompClient.subscribe('/topic/board/123', (msg) => {\n const { event, data, timestamp } = JSON.parse(msg.body)\n console.log('Event:', event, 'Data:', data)\n })\n})\n```", - "operationId": "websocketInfoUsingGET_1", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/task/board/{boardId}": { - "get": { - "tags": [ - "任务看板管理" - ], - "summary": "看板详情", - "description": "返回看板基本信息(名称、描述、创建者),不含任务数据。查看任务请使用「获取看板任务」接口", - "operationId": "getBoardDetailUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "boardId", - "in": "path", - "description": "看板ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«看板信息»", - "originalRef": "统一响应结果«看板信息»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«看板信息»", - "originalRef": "统一响应结果«看板信息»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "任务看板管理" - ], - "summary": "更新看板", - "description": "更新看板的名称和描述。仅看板创建者或超级管理员可操作。\n\n**权限**:需管理员登录,且为看板创建者或超级管理员。", - "operationId": "updateBoardUsingPUT_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "boardId", - "in": "path", - "description": "看板ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "req", - "description": "更新看板请求", - "required": false, - "schema": { - "$ref": "#/definitions/更新看板请求", - "originalRef": "更新看板请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«看板信息»", - "originalRef": "统一响应结果«看板信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«看板信息»", - "originalRef": "统一响应结果«看板信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "任务看板管理" - ], - "summary": "删除看板", - "description": "删除看板及其下所有状态列和任务(级联删除)。仅看板创建者或超级管理员可操作", - "operationId": "deleteBoardUsingDELETE_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "boardId", - "in": "path", - "description": "看板ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/task/board/{boardId}/member/{targetAdminId}": { - "delete": { - "tags": [ - "任务看板管理" - ], - "summary": "移除成员", - "description": "从看板中移除指定成员。仅看板创建者或超级管理员可操作,不能移除创建者自己", - "operationId": "removeMemberUsingDELETE_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "boardId", - "in": "path", - "description": "看板ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "targetAdminId", - "in": "path", - "description": "目标管理员ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/task/board/{boardId}/members": { - "get": { - "tags": [ - "任务看板管理" - ], - "summary": "获取看板成员", - "description": "返回看板的所有成员列表,包含成员的管理员ID和姓名", - "operationId": "getMembersUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "boardId", - "in": "path", - "description": "看板ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«看板成员信息»»", - "originalRef": "统一响应结果«List«看板成员信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«看板成员信息»»", - "originalRef": "统一响应结果«List«看板成员信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "任务看板管理" - ], - "summary": "添加成员", - "description": "批量添加管理员为看板成员,成为成员后可以查看看板、创建和操作任务。\n\n**权限**:需管理员登录,且为看板创建者或超级管理员。", - "operationId": "addMembersUsingPOST_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "boardId", - "in": "path", - "description": "看板ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "req", - "description": "添加成员请求", - "required": false, - "schema": { - "$ref": "#/definitions/添加成员请求", - "originalRef": "添加成员请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/task/board/{boardId}/status": { - "post": { - "tags": [ - "任务看板管理" - ], - "summary": "创建状态列", - "description": "在看板中创建新的状态列(如测试中、待发布等),自动排到末尾。任务通过拖拽在不同状态列间流转。\n\n**权限**:需管理员登录且为看板成员。", - "operationId": "createStatusUsingPOST_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "boardId", - "in": "path", - "description": "看板ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "req", - "description": "创建状态列请求", - "required": false, - "schema": { - "$ref": "#/definitions/创建状态请求", - "originalRef": "创建状态请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«看板状态信息»", - "originalRef": "统一响应结果«看板状态信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«看板状态信息»", - "originalRef": "统一响应结果«看板状态信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/task/board/{boardId}/status/sort": { - "put": { - "tags": [ - "任务看板管理" - ], - "summary": "状态列排序", - "description": "批量更新状态列的排序顺序。传入状态列ID数组,数组下标即为新的排序值。操作完成后通过WebSocket推送STATUS_REORDERED事件", - "operationId": "sortStatusesUsingPUT_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "boardId", - "in": "path", - "description": "看板ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "req", - "description": "状态列排序请求", - "required": false, - "schema": { - "$ref": "#/definitions/状态排序请求", - "originalRef": "状态排序请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/task/board/{boardId}/statuses": { - "get": { - "tags": [ - "任务看板管理" - ], - "summary": "获取看板状态列", - "description": "返回看板的所有状态列(如待办、进行中、已完成),按排序字段升序排列。拖拽任务到不同状态列实现状态流转", - "operationId": "getStatusesUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "boardId", - "in": "path", - "description": "看板ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«看板状态信息»»", - "originalRef": "统一响应结果«List«看板状态信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«看板状态信息»»", - "originalRef": "统一响应结果«List«看板状态信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/task/board/{boardId}/tasks": { - "get": { - "tags": [ - "任务管理" - ], - "summary": "获取看板任务(按状态分组)", - "description": "返回看板下所有任务,按状态列分组。支持按优先级(HIGH/MEDIUM/LOW)和负责人筛选,每组内按排序值升序排列\n\n**关联字典**:\n- task_priority:任务优先级(列表筛选+显示)", - "operationId": "getBoardTasksUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "assigneeId", - "in": "query", - "description": "负责人ID", - "required": false, - "type": "integer", - "format": "int64", - "allowEmptyValue": false - }, - { - "name": "boardId", - "in": "path", - "description": "看板ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "priority", - "in": "query", - "description": "优先级", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«看板任务分组信息»»", - "originalRef": "统一响应结果«List«看板任务分组信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«看板任务分组信息»»", - "originalRef": "统一响应结果«List«看板任务分组信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/task": { - "post": { - "tags": [ - "任务管理" - ], - "summary": "创建任务", - "description": "在指定看板和状态列下创建任务。创建成功后通过WebSocket推送TASK_CREATED事件,并通知被分配的负责人\n\n**关联字典**:\n- task_priority:任务优先级(创建时选择)", - "operationId": "createTaskUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "req", - "description": "创建任务请求", - "required": false, - "schema": { - "$ref": "#/definitions/创建任务请求", - "originalRef": "创建任务请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«任务信息»", - "originalRef": "统一响应结果«任务信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«任务信息»", - "originalRef": "统一响应结果«任务信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/task/boards": { - "get": { - "tags": [ - "任务看板管理" - ], - "summary": "获取可见看板列表", - "description": "返回当前管理员可见的看板列表:超级管理员可见所有看板,普通管理员仅可见自己创建的或作为成员的看板", - "operationId": "getBoardsUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«看板信息»»", - "originalRef": "统一响应结果«List«看板信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«看板信息»»", - "originalRef": "统一响应结果«List«看板信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/task/comment/{commentId}": { - "delete": { - "tags": [ - "任务管理" - ], - "summary": "删除评论", - "description": "仅评论作者本人可删除自己的评论,系统自动生成的活动记录不可删除", - "operationId": "deleteCommentUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "commentId", - "in": "path", - "description": "评论ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/task/status/{statusId}": { - "put": { - "tags": [ - "任务看板管理" - ], - "summary": "更新状态列", - "description": "更新状态列的名称和颜色。\n\n**权限**:需管理员登录且为看板成员。", - "operationId": "updateStatusUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "req", - "description": "更新状态列请求", - "required": false, - "schema": { - "$ref": "#/definitions/更新状态请求", - "originalRef": "更新状态请求" - } - }, - { - "name": "statusId", - "in": "path", - "description": "状态列ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«看板状态信息»", - "originalRef": "统一响应结果«看板状态信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«看板状态信息»", - "originalRef": "统一响应结果«看板状态信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "任务看板管理" - ], - "summary": "删除状态列", - "description": "删除看板的状态列。如果状态列下有任务则不允许删除,需先移动或删除任务", - "operationId": "deleteStatusUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "statusId", - "in": "path", - "description": "状态列ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/task/subtask/{subtaskId}": { - "delete": { - "tags": [ - "任务管理" - ], - "summary": "删除子任务", - "description": "删除指定子任务。\n\n**权限**:需管理员登录且为看板成员。", - "operationId": "deleteSubtaskUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "subtaskId", - "in": "path", - "description": "子任务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/task/subtask/{subtaskId}/toggle": { - "put": { - "tags": [ - "任务管理" - ], - "summary": "切换子任务完成状态", - "description": "切换子任务的完成/未完成状态(toggle),完成状态切换会自动记录到任务时间线", - "operationId": "toggleSubtaskUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "subtaskId", - "in": "path", - "description": "子任务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/task/{taskId}": { - "get": { - "tags": [ - "任务管理" - ], - "summary": "任务详情", - "description": "返回任务完整信息,包含子任务列表、负责人信息、附件列表等\n\n**关联字典**:\n- task_priority:任务优先级(显示)", - "operationId": "getTaskDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "taskId", - "in": "path", - "description": "任务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«任务信息»", - "originalRef": "统一响应结果«任务信息»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«任务信息»", - "originalRef": "统一响应结果«任务信息»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "任务管理" - ], - "summary": "更新任务", - "description": "更新任务的标题、描述、优先级、截止日期、负责人等信息。更新后通过WebSocket推送TASK_UPDATED事件,如果修改了负责人则额外通知新负责人。\n\n**权限**:需管理员登录且为看板成员。\n\n**关联字典**:\n- task_priority:任务优先级(编辑时选择)", - "operationId": "updateTaskUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "req", - "description": "更新任务请求", - "required": false, - "schema": { - "$ref": "#/definitions/更新任务请求", - "originalRef": "更新任务请求" - } - }, - { - "name": "taskId", - "in": "path", - "description": "任务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«任务信息»", - "originalRef": "统一响应结果«任务信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«任务信息»", - "originalRef": "统一响应结果«任务信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "任务管理" - ], - "summary": "删除任务", - "description": "删除任务及其所有子任务、评论和时间线记录(级联删除)。删除后通过WebSocket推送TASK_DELETED事件。\n\n**权限**:需管理员登录且为看板成员。", - "operationId": "deleteTaskUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "taskId", - "in": "path", - "description": "任务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/task/{taskId}/comment": { - "post": { - "tags": [ - "任务管理" - ], - "summary": "添加评论", - "description": "在任务时间线中添加评论,添加后自动通知任务负责人", - "operationId": "addCommentUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "req", - "description": "创建评论请求", - "required": false, - "schema": { - "$ref": "#/definitions/创建评论请求", - "originalRef": "创建评论请求" - } - }, - { - "name": "taskId", - "in": "path", - "description": "任务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«时间线条目»", - "originalRef": "统一响应结果«时间线条目»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«时间线条目»", - "originalRef": "统一响应结果«时间线条目»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/task/{taskId}/sort": { - "put": { - "tags": [ - "任务管理" - ], - "summary": "任务排序", - "description": "更新任务在同一状态列内的排序位置,用于拖拽排序", - "operationId": "sortTasksUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "req", - "description": "任务排序请求", - "required": false, - "schema": { - "$ref": "#/definitions/任务排序请求", - "originalRef": "任务排序请求" - } - }, - { - "name": "taskId", - "in": "path", - "description": "任务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/task/{taskId}/status": { - "put": { - "tags": [ - "任务管理" - ], - "summary": "变更任务状态", - "description": "将任务移动到指定状态列(拖拽操作),自动记录状态变更到时间线,并通过WebSocket推送TASK_STATUS_CHANGED事件", - "operationId": "changeStatusUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "req", - "description": "变更状态请求", - "required": false, - "schema": { - "$ref": "#/definitions/变更任务状态请求", - "originalRef": "变更任务状态请求" - } - }, - { - "name": "taskId", - "in": "path", - "description": "任务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«Void»", - "originalRef": "统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/task/{taskId}/subtask": { - "post": { - "tags": [ - "任务管理" - ], - "summary": "创建子任务", - "description": "在指定任务下创建子任务(待办项),用于拆分任务的执行步骤。子任务默认为未完成状态。\n\n**权限**:需管理员登录且为看板成员。", - "operationId": "createSubtaskUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "req", - "description": "创建子任务请求", - "required": false, - "schema": { - "$ref": "#/definitions/创建子任务请求", - "originalRef": "创建子任务请求" - } - }, - { - "name": "taskId", - "in": "path", - "description": "任务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«子任务信息»", - "originalRef": "统一响应结果«子任务信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«子任务信息»", - "originalRef": "统一响应结果«子任务信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/task/{taskId}/timeline": { - "get": { - "tags": [ - "任务管理" - ], - "summary": "获取任务时间线", - "description": "返回任务的完整操作记录,包含评论和系统自动记录的状态变更、人员分配等活动,按时间正序排列", - "operationId": "getTimelineUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "taskId", - "in": "path", - "description": "任务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«时间线条目»»", - "originalRef": "统一响应结果«List«时间线条目»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/统一响应结果«List«时间线条目»»", - "originalRef": "统一响应结果«List«时间线条目»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "deprecated": false, - "x-order": "2147483647" - } - } - }, - "definitions": { - "任务信息": { - "type": "object", - "properties": { - "assignees": { - "type": "array", - "description": "负责人列表", - "items": { - "$ref": "#/definitions/负责人信息", - "originalRef": "负责人信息" - } - }, - "boardId": { - "type": "integer", - "format": "int64", - "description": "看板ID" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "integer", - "format": "int64", - "description": "创建人ID" - }, - "creatorName": { - "type": "string", - "description": "创建人姓名" - }, - "description": { - "type": "string", - "description": "任务描述" - }, - "dueDate": { - "type": "string", - "format": "date", - "description": "截止日期" - }, - "overdue": { - "type": "boolean", - "description": "是否逾期" - }, - "parentId": { - "type": "integer", - "format": "int64", - "description": "父任务ID" - }, - "priority": { - "type": "string", - "description": "优先级: LOW/MEDIUM/HIGH/URGENT" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "statusColor": { - "type": "string", - "description": "状态颜色" - }, - "statusId": { - "type": "integer", - "format": "int64", - "description": "状态ID" - }, - "statusName": { - "type": "string", - "description": "状态名称" - }, - "subtaskCompleted": { - "type": "integer", - "format": "int32", - "description": "已完成子任务数" - }, - "subtaskTotal": { - "type": "integer", - "format": "int32", - "description": "子任务总数" - }, - "subtasks": { - "type": "array", - "description": "子任务列表", - "items": { - "$ref": "#/definitions/子任务信息", - "originalRef": "子任务信息" - } - }, - "taskId": { - "type": "integer", - "format": "int64", - "description": "任务ID" - }, - "title": { - "type": "string", - "description": "任务标题" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "任务信息" - }, - "创建状态请求": { - "type": "object", - "required": [ - "statusName" - ], - "properties": { - "statusColor": { - "type": "string", - "example": "#409EFF", - "description": "状态颜色" - }, - "statusName": { - "type": "string", - "example": "进行中", - "description": "状态名称" - } - }, - "title": "创建状态请求" - }, - "创建看板请求": { - "type": "object", - "required": [ - "boardName" - ], - "properties": { - "boardName": { - "type": "string", - "example": "产品迭代看板", - "description": "看板名称" - }, - "deptId": { - "type": "integer", - "format": "int64", - "example": 1001, - "description": "部门ID" - }, - "description": { - "type": "string", - "example": "用于跟踪产品迭代任务", - "description": "看板描述" - }, - "memberIds": { - "type": "array", - "description": "成员ID列表", - "items": { - "type": "integer", - "format": "int64" - } - } - }, - "title": "创建看板请求" - }, - "子任务信息": { - "type": "object", - "properties": { - "completed": { - "type": "boolean", - "description": "是否已完成" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "integer", - "format": "int64", - "description": "创建人ID" - }, - "creatorName": { - "type": "string", - "description": "创建人姓名" - }, - "taskId": { - "type": "integer", - "format": "int64", - "description": "子任务ID" - }, - "title": { - "type": "string", - "description": "子任务标题" - } - }, - "title": "子任务信息" - }, - "更新看板请求": { - "type": "object", - "properties": { - "boardName": { - "type": "string", - "example": "产品迭代看板", - "description": "看板名称" - }, - "description": { - "type": "string", - "example": "用于跟踪产品迭代任务", - "description": "看板描述" - } - }, - "title": "更新看板请求" - }, - "添加成员请求": { - "type": "object", - "required": [ - "adminIds" - ], - "properties": { - "adminIds": { - "type": "array", - "description": "管理员ID列表", - "items": { - "type": "integer", - "format": "int64" - } - } - }, - "title": "添加成员请求" - }, - "状态排序请求": { - "type": "object", - "required": [ - "statusIds" - ], - "properties": { - "statusIds": { - "type": "array", - "description": "状态ID列表(按排序顺序)", - "items": { - "type": "integer", - "format": "int64" - } - } - }, - "title": "状态排序请求" - }, - "看板任务分组信息": { - "type": "object", - "properties": { - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "statusColor": { - "type": "string", - "description": "状态颜色" - }, - "statusId": { - "type": "integer", - "format": "int64", - "description": "状态ID" - }, - "statusName": { - "type": "string", - "description": "状态名称" - }, - "tasks": { - "type": "array", - "description": "该状态下的任务列表", - "items": { - "$ref": "#/definitions/任务信息", - "originalRef": "任务信息" - } - } - }, - "title": "看板任务分组信息" - }, - "看板信息": { - "type": "object", - "properties": { - "boardId": { - "type": "integer", - "format": "int64", - "description": "看板ID" - }, - "boardName": { - "type": "string", - "description": "看板名称" - }, - "boardType": { - "type": "string", - "description": "看板类型" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "createdBy": { - "type": "integer", - "format": "int64", - "description": "创建人ID" - }, - "creatorName": { - "type": "string", - "description": "创建人姓名" - }, - "deptId": { - "type": "integer", - "format": "int64", - "description": "部门ID" - }, - "deptName": { - "type": "string", - "description": "部门名称" - }, - "description": { - "type": "string", - "description": "看板描述" - }, - "statuses": { - "type": "array", - "description": "状态列表", - "items": { - "$ref": "#/definitions/看板状态信息", - "originalRef": "看板状态信息" - } - }, - "taskCount": { - "type": "integer", - "format": "int32", - "description": "任务总数" - } - }, - "title": "看板信息" - }, - "看板成员信息": { - "type": "object", - "properties": { - "adminId": { - "type": "integer", - "format": "int64", - "description": "管理员ID" - }, - "avatarUrl": { - "type": "string", - "description": "头像地址" - }, - "joinedAt": { - "type": "string", - "format": "date-time", - "description": "加入时间" - }, - "role": { - "type": "string", - "description": "角色: OWNER/MEMBER" - }, - "username": { - "type": "string", - "description": "用户名" - } - }, - "title": "看板成员信息" - }, - "看板状态信息": { - "type": "object", - "properties": { - "isPreset": { - "type": "boolean", - "description": "是否预设状态" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序序号" - }, - "statusColor": { - "type": "string", - "description": "状态颜色" - }, - "statusId": { - "type": "integer", - "format": "int64", - "description": "状态ID" - }, - "statusName": { - "type": "string", - "description": "状态名称" - }, - "taskCount": { - "type": "integer", - "format": "int32", - "description": "该状态下的任务数量" - } - }, - "title": "看板状态信息" - }, - "统一响应结果«List«看板任务分组信息»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/看板任务分组信息", - "originalRef": "看板任务分组信息" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«看板任务分组信息»»" - }, - "统一响应结果«List«看板成员信息»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/看板成员信息", - "originalRef": "看板成员信息" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«看板成员信息»»" - }, - "统一响应结果«List«看板状态信息»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/看板状态信息", - "originalRef": "看板状态信息" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«看板状态信息»»" - }, - "统一响应结果«Void»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«Void»" - }, - "统一响应结果«看板信息»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/看板信息", - "originalRef": "看板信息" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«看板信息»" - }, - "统一响应结果«看板状态信息»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/看板状态信息", - "originalRef": "看板状态信息" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«看板状态信息»" - }, - "负责人信息": { - "type": "object", - "properties": { - "adminId": { - "type": "integer", - "format": "int64", - "description": "管理员ID" - }, - "avatarUrl": { - "type": "string", - "description": "头像地址" - }, - "username": { - "type": "string", - "description": "用户名" - }, - "wechatName": { - "type": "string", - "description": "企微昵称" - } - }, - "title": "负责人信息" - }, - "任务排序请求": { - "type": "object", - "required": [ - "statusId", - "taskIds" - ], - "properties": { - "statusId": { - "type": "integer", - "format": "int64", - "example": 1001, - "description": "状态ID" - }, - "taskIds": { - "type": "array", - "description": "任务ID列表(按排序顺序)", - "items": { - "type": "integer", - "format": "int64" - } - } - }, - "title": "任务排序请求" - }, - "创建任务请求": { - "type": "object", - "required": [ - "boardId", - "title" - ], - "properties": { - "assigneeIds": { - "type": "array", - "description": "负责人ID列表", - "items": { - "type": "integer", - "format": "int64" - } - }, - "boardId": { - "type": "integer", - "format": "int64", - "example": 1001, - "description": "看板ID" - }, - "description": { - "type": "string", - "example": "根据产品原型完成首页所有组件的UI设计", - "description": "任务描述" - }, - "dueDate": { - "type": "string", - "format": "date", - "example": "2026-03-15", - "description": "截止日期" - }, - "priority": { - "type": "string", - "example": "HIGH", - "description": "优先级: LOW/MEDIUM/HIGH/URGENT" - }, - "statusId": { - "type": "integer", - "format": "int64", - "example": 1001, - "description": "状态ID" - }, - "title": { - "type": "string", - "example": "完成首页UI设计", - "description": "任务标题" - } - }, - "title": "创建任务请求" - }, - "创建子任务请求": { - "type": "object", - "required": [ - "title" - ], - "properties": { - "title": { - "type": "string", - "example": "完成导航栏组件", - "description": "子任务标题" - } - }, - "title": "创建子任务请求" - }, - "创建评论请求": { - "type": "object", - "required": [ - "content" - ], - "properties": { - "content": { - "type": "string", - "example": "这个任务需要优先处理", - "description": "评论内容" - } - }, - "title": "创建评论请求" - }, - "变更任务状态请求": { - "type": "object", - "required": [ - "statusId" - ], - "properties": { - "statusId": { - "type": "integer", - "format": "int64", - "example": 1002, - "description": "目标状态ID" - } - }, - "title": "变更任务状态请求" - }, - "时间线条目": { - "type": "object", - "properties": { - "action": { - "type": "string", - "description": "操作类型" - }, - "adminAvatar": { - "type": "string", - "description": "管理员头像" - }, - "adminId": { - "type": "integer", - "format": "int64", - "description": "管理员ID" - }, - "adminName": { - "type": "string", - "description": "管理员姓名" - }, - "content": { - "type": "string", - "description": "内容" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "id": { - "type": "integer", - "format": "int64", - "description": "条目ID" - }, - "newValue": { - "type": "string", - "description": "新值" - }, - "oldValue": { - "type": "string", - "description": "旧值" - }, - "type": { - "type": "string", - "description": "类型: COMMENT/ACTIVITY" - } - }, - "title": "时间线条目" - }, - "更新任务请求": { - "type": "object", - "properties": { - "assigneeIds": { - "type": "array", - "description": "负责人ID列表", - "items": { - "type": "integer", - "format": "int64" - } - }, - "description": { - "type": "string", - "example": "根据产品原型完成首页所有组件的UI设计", - "description": "任务描述" - }, - "dueDate": { - "type": "string", - "format": "date", - "example": "2026-03-15", - "description": "截止日期" - }, - "priority": { - "type": "string", - "example": "MEDIUM", - "description": "优先级: LOW/MEDIUM/HIGH/URGENT" - }, - "title": { - "type": "string", - "example": "完成首页UI设计", - "description": "任务标题" - } - }, - "title": "更新任务请求" - }, - "更新状态请求": { - "type": "object", - "properties": { - "statusColor": { - "type": "string", - "example": "#67C23A", - "description": "状态颜色" - }, - "statusName": { - "type": "string", - "example": "已完成", - "description": "状态名称" - } - }, - "title": "更新状态请求" - }, - "统一响应结果«List«时间线条目»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/时间线条目", - "originalRef": "时间线条目" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«时间线条目»»" - }, - "统一响应结果«List«看板信息»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "$ref": "#/definitions/看板信息", - "originalRef": "看板信息" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«List«看板信息»»" - }, - "统一响应结果«任务信息»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/任务信息", - "originalRef": "任务信息" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«任务信息»" - }, - "统一响应结果«子任务信息»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/子任务信息", - "originalRef": "子任务信息" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«子任务信息»" - }, - "统一响应结果«时间线条目»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "$ref": "#/definitions/时间线条目", - "originalRef": "时间线条目" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - } - }, - "title": "统一响应结果«时间线条目»" - } - } -} \ No newline at end of file diff --git a/.swagger/hl-user-service.json b/.swagger/hl-user-service.json deleted file mode 100644 index a97df09..0000000 --- a/.swagger/hl-user-service.json +++ /dev/null @@ -1,15051 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "用户服务", - "version": "1.0.0" - }, - "basePath": "/", - "paths": { - "/dict/all": { - "get": { - "tags": [ - "小程序接口" - ], - "summary": "获取所有字典数据(公开接口)", - "description": "获取系统全部字典类型及其字典数据,供小程序C端使用。无需认证即可调用。返回格式与管理端 /admin/dict/all 一致。\n\n**字典层级说明**:\n- 每个元素包含 dictType(编码)、dictName(名称)、dataList(字典数据列表)\n- 前端通过 dictType 匹配业务字段,用 dataList 中的 dictValue/dictLabel 做翻译展示\n- 常用字典:order_status、product_status、id_card_type、gender、traveler_type、favorite_resource_type、footprint_resource_type\n", - "operationId": "getAllDictUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«字典VO»»", - "$ref": "#/definitions/统一响应结果«List«字典VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«字典VO»»", - "$ref": "#/definitions/统一响应结果«List«字典VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/user/account": { - "delete": { - "tags": [ - "小程序接口" - ], - "summary": "注销账号", - "description": "永久注销当前用户账号(软删除)。注销后该账号的openid和手机号将被释放,可用于重新注册。注销操作不可撤销,请谨慎调用。需要小程序用户认证。", - "operationId": "deleteAccountUsingDELETE", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/user/favorite": { - "get": { - "tags": [ - "小程序接口" - ], - "summary": "收藏列表", - "description": "分页查询当前用户的所有收藏记录,按收藏时间倒序排列。返回收藏记录的基础信息(不包含资源详情),需前端根据targetType和targetId再查详情。需要小程序用户认证。\n\n**关联字典**:\n- favorite_resource_type(收藏资源类型):返回字段targetType,前端据此判断跳转到哪种资源详情页\n", - "operationId": "listFavoritesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«Favorite»»", - "$ref": "#/definitions/统一响应结果«分页结果«Favorite»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«Favorite»»", - "$ref": "#/definitions/统一响应结果«分页结果«Favorite»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "小程序接口" - ], - "summary": "添加收藏", - "description": "将指定资源添加到当前用户的收藏列表。同一用户对同一资源不可重复收藏,重复收藏会报错。targetType取值:SCENIC_SPOT/ACTIVITY/HOTEL/PRODUCT/EXPLORE等。需要小程序用户认证。\n\n**关联字典**:\n- favorite_resource_type(收藏资源类型):SCENIC_SPOT=景区, ACTIVITY=活动, HOTEL=酒店, PRODUCT=产品, EXPLORE=探索(请求参数targetType)\n", - "operationId": "addFavoriteUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "favoriteRequest", - "description": "收藏请求", - "required": false, - "schema": { - "originalRef": "收藏请求", - "$ref": "#/definitions/收藏请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Favorite»", - "$ref": "#/definitions/统一响应结果«Favorite»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Favorite»", - "$ref": "#/definitions/统一响应结果«Favorite»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/user/favorite/check": { - "get": { - "tags": [ - "小程序接口" - ], - "summary": "检查是否已收藏", - "description": "检查当前用户是否已收藏指定类型的资源。返回true=已收藏,false=未收藏。targetType取值:SCENIC_SPOT/ACTIVITY/HOTEL/PRODUCT/EXPLORE等。需要小程序用户认证。\n\n**关联字典**:\n- favorite_resource_type(收藏资源类型):SCENIC_SPOT=景区, ACTIVITY=活动, HOTEL=酒店, PRODUCT=产品, EXPLORE=探索(请求参数targetType)\n", - "operationId": "checkFavoriteUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "targetId", - "in": "query", - "description": "目标资源ID", - "required": false, - "type": "integer", - "format": "int64", - "allowEmptyValue": false - }, - { - "name": "targetType", - "in": "query", - "description": "目标类型", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«boolean»", - "$ref": "#/definitions/统一响应结果«boolean»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«boolean»", - "$ref": "#/definitions/统一响应结果«boolean»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/user/favorite/{favoriteId}": { - "delete": { - "tags": [ - "小程序接口" - ], - "summary": "删除收藏", - "description": "根据收藏记录ID取消收藏。只能删除自己的收藏记录,删除他人的收藏会报权限错误。需要小程序用户认证。", - "operationId": "deleteFavoriteUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "favoriteId", - "in": "path", - "description": "收藏ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/user/footprint": { - "get": { - "tags": [ - "小程序接口" - ], - "summary": "足迹列表", - "description": "分页查询当前用户的浏览足迹,按浏览时间倒序排列。需要小程序用户认证。\n\n**关联字典**:\n- footprint_resource_type(足迹资源类型):返回字段resourceType,前端据此判断跳转到哪种资源详情页\n", - "operationId": "listFootprintsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«Footprint»»", - "$ref": "#/definitions/统一响应结果«分页结果«Footprint»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«Footprint»»", - "$ref": "#/definitions/统一响应结果«分页结果«Footprint»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "小程序接口" - ], - "summary": "添加足迹", - "description": "记录用户浏览资源的足迹。同一用户对同一资源多次浏览只保留最新一条记录(更新时间)。resourceType取值:SCENIC_SPOT/ACTIVITY/HOTEL/PRODUCT等。通常由前端在进入资源详情页时自动调用。需要小程序用户认证。\n\n**关联字典**:\n- footprint_resource_type(足迹资源类型):SCENIC_SPOT=景区, ACTIVITY=活动, HOTEL=酒店, PRODUCT=产品(请求参数resourceType)\n", - "operationId": "addFootprintUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "footprintRequest", - "description": "足迹请求", - "required": false, - "schema": { - "originalRef": "足迹请求", - "$ref": "#/definitions/足迹请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Footprint»", - "$ref": "#/definitions/统一响应结果«Footprint»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Footprint»", - "$ref": "#/definitions/统一响应结果«Footprint»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/user/footprint/{footprintId}": { - "delete": { - "tags": [ - "小程序接口" - ], - "summary": "删除足迹", - "description": "根据足迹记录ID删除单条浏览足迹。只能删除自己的足迹记录。需要小程序用户认证。", - "operationId": "deleteFootprintUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "footprintId", - "in": "path", - "description": "足迹ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/user/login": { - "post": { - "tags": [ - "小程序接口" - ], - "summary": "微信登录", - "description": "小程序用户通过微信授权码(wx.login获取的code)登录。可选传入phoneCode用于获取手机号绑定,avatar和nickname用于设置头像昵称。首次登录自动注册,返回JWT Token。needProfile=true表示需补充实名信息。无需认证即可调用。", - "operationId": "loginUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "微信登录请求", - "required": false, - "schema": { - "originalRef": "微信小程序登录请求", - "$ref": "#/definitions/微信小程序登录请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«用户登录响应»", - "$ref": "#/definitions/统一响应结果«用户登录响应»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«用户登录响应»", - "$ref": "#/definitions/统一响应结果«用户登录响应»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/user/login/sms": { - "post": { - "tags": [ - "小程序接口" - ], - "summary": "手机号验证码登录", - "description": "小程序用户通过手机号+短信验证码登录。首次登录自动注册账号,返回JWT Token。登录成功后若needProfile=true,表示需要补充个人信息(实名认证),前端应跳转到信息补充页。无需认证即可调用。", - "operationId": "loginBySmsUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "短信验证码登录请求", - "required": false, - "schema": { - "originalRef": "短信验证码登录请求", - "$ref": "#/definitions/短信验证码登录请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«用户登录响应»", - "$ref": "#/definitions/统一响应结果«用户登录响应»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«用户登录响应»", - "$ref": "#/definitions/统一响应结果«用户登录响应»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/user/logout": { - "post": { - "tags": [ - "小程序接口" - ], - "summary": "用户登出", - "description": "清除当前用户的登录状态并使Token失效。需要小程序用户认证。", - "operationId": "logoutUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/user/profile": { - "get": { - "tags": [ - "小程序接口" - ], - "summary": "获取用户信息", - "description": "获取当前登录用户的个人资料,包括昵称、头像、手机号(脱敏)、实名信息等。手机号返回脱敏格式(如138****0000),证件号同样脱敏处理。需要小程序用户认证(Token中的userId)。\n\n**关联字典**:\n- id_card_type(证件类型):ID_CARD=身份证, PASSPORT=护照\n- gender(性别):0=女, 1=男\n", - "operationId": "getProfileUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«用户信息VO»", - "$ref": "#/definitions/统一响应结果«用户信息VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«用户信息VO»", - "$ref": "#/definitions/统一响应结果«用户信息VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "小程序接口" - ], - "summary": "更新用户信息", - "description": "更新当前用户的个人资料。首次登录补充信息时realName/idCardType/idCardNo为必填(使用ProfileCompletion验证组)。如果传入身份证号,后端自动解析性别和出生日期。更新手机号后会自动绑定匹配的待绑定订单。需要小程序用户认证。\n\n**关联字典**:\n- id_card_type(证件类型):ID_CARD=身份证, PASSPORT=护照(请求参数idCardType)\n- gender(性别):0=女, 1=男\n", - "operationId": "updateProfileUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "updateRequest", - "description": "更新用户信息请求", - "required": false, - "schema": { - "originalRef": "更新用户资料请求", - "$ref": "#/definitions/更新用户资料请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«用户信息VO»", - "$ref": "#/definitions/统一响应结果«用户信息VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«用户信息VO»", - "$ref": "#/definitions/统一响应结果«用户信息VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/user/sms/send": { - "post": { - "tags": [ - "小程序接口" - ], - "summary": "发送短信验证码", - "description": "向指定手机号发送6位数字短信验证码,用于小程序手机号登录。同一手机号60秒内不可重复发送,每日最多发送10次。验证码有效期5分钟。无需认证即可调用。", - "operationId": "sendSmsCodeUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "发送短信验证码请求", - "required": false, - "schema": { - "originalRef": "发送短信验证码请求", - "$ref": "#/definitions/发送短信验证码请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/user/traveler": { - "get": { - "tags": [ - "小程序接口" - ], - "summary": "出行人列表", - "description": "获取当前用户的所有出行人列表。如果用户已完成实名认证(realName不为空),列表首项会自动注入一个'本人'虚拟出行人(travelerId=0)。默认出行人排在前面,其余按创建时间排序。需要小程序用户认证。\n\n**关联字典**:\n- gender(性别):返回字段gender\n- id_card_type(证件类型):返回字段idCardType\n- traveler_type(出行人类型):返回字段travelerType", - "operationId": "listTravelersUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«Traveler»»", - "$ref": "#/definitions/统一响应结果«List«Traveler»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«Traveler»»", - "$ref": "#/definitions/统一响应结果«List«Traveler»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "小程序接口" - ], - "summary": "新增出行人", - "description": "为当前用户添加一位出行人信息,用于下单时选择。出行人类型(成人/儿童/婴儿)根据出生日期自动判断,无需手动传入。如果传入身份证号,后端自动校验格式并解析性别。每个用户最多可添加20位出行人。需要小程序用户认证。\n\n**关联字典**:\n- gender(性别):请求/返回字段gender(0=女, 1=男)\n- id_card_type(证件类型):请求/返回字段idCardType(ID_CARD=身份证, PASSPORT=护照等)\n- traveler_type(出行人类型):返回字段travelerType(ADULT=成人, CHILD=儿童, INFANT=婴儿,自动计算)", - "operationId": "addTravelerUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "travelerRequest", - "description": "出行人信息", - "required": false, - "schema": { - "originalRef": "出行人请求", - "$ref": "#/definitions/出行人请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Traveler»", - "$ref": "#/definitions/统一响应结果«Traveler»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Traveler»", - "$ref": "#/definitions/统一响应结果«Traveler»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/user/traveler/{travelerId}": { - "get": { - "tags": [ - "小程序接口" - ], - "summary": "出行人详情", - "description": "获取指定出行人的详细信息。\n\n**关联字典**:\n- gender(性别):返回字段gender\n- id_card_type(证件类型):返回字段idCardType\n- traveler_type(出行人类型):返回字段travelerType", - "operationId": "getTravelerUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "travelerId", - "in": "path", - "description": "出行人ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Traveler»", - "$ref": "#/definitions/统一响应结果«Traveler»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Traveler»", - "$ref": "#/definitions/统一响应结果«Traveler»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "小程序接口" - ], - "summary": "更新出行人", - "description": "更新指定出行人的信息。\n\n**关联字典**:\n- gender(性别):请求/返回字段gender\n- id_card_type(证件类型):请求/返回字段idCardType\n- traveler_type(出行人类型):返回字段travelerType(自动计算)", - "operationId": "updateTravelerUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "travelerId", - "in": "path", - "description": "出行人ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "travelerRequest", - "description": "出行人信息", - "required": false, - "schema": { - "originalRef": "出行人请求", - "$ref": "#/definitions/出行人请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Traveler»", - "$ref": "#/definitions/统一响应结果«Traveler»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Traveler»", - "$ref": "#/definitions/统一响应结果«Traveler»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "小程序接口" - ], - "summary": "删除出行人", - "description": "删除指定的出行人记录(软删除)。\n\n**权限**:需要小程序用户认证。\n**注意**:如果该出行人已关联到未完成的订单,删除不影响订单中的出行人快照数据。", - "operationId": "deleteTravelerUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "travelerId", - "in": "path", - "description": "出行人ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/user/traveler/{travelerId}/default": { - "put": { - "tags": [ - "小程序接口" - ], - "summary": "设为默认出行人", - "description": "将指定出行人设为默认。每个用户只能有一个默认出行人,设置新的默认会自动取消原来的默认。默认出行人在下单时会被自动选中。需要小程序用户认证。", - "operationId": "setDefaultUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "travelerId", - "in": "path", - "description": "出行人ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/user": { - "get": { - "tags": [ - "管理员管理接口" - ], - "summary": "管理员列表", - "description": "分页查询管理员列表,支持按角色、状态、企微绑定状态、关键词筛选。keyword支持模糊匹配用户名和企业微信名称。status取值:ACTIVE=正常 LOCKED=已锁定 DISABLED=已禁用。wechatBound:true=已绑定企业微信 false=未绑定。需要管理员认证。\n\n**关联字典**:\n- admin_status(管理员状态):ACTIVE=启用, LOCKED=锁定, DISABLED=禁用(筛选条件+列表展示)\n", - "operationId": "listAdminsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "关键词(模糊匹配用户名/企业微信名称)", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "roleId", - "in": "query", - "description": "角色ID", - "required": false, - "type": "integer", - "format": "int64", - "allowEmptyValue": false - }, - { - "name": "status", - "in": "query", - "description": "状态", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "wechatBound", - "in": "query", - "description": "是否绑定企业微信: true=已绑定, false=未绑定", - "required": false, - "type": "boolean", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«AdminUser»»", - "$ref": "#/definitions/统一响应结果«分页结果«AdminUser»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«AdminUser»»", - "$ref": "#/definitions/统一响应结果«分页结果«AdminUser»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "管理员管理接口" - ], - "summary": "创建管理员", - "description": "创建新的后台管理员账号。默认密码为Admin@123456,管理员首次登录后建议修改密码。可通过roleIds分配多个角色,也兼容旧的单角色roleId参数。需要SUPER_ADMIN或ADMIN角色。\n\n**关联字典**:\n- admin_status(管理员状态):ACTIVE=启用, LOCKED=锁定, DISABLED=禁用\n", - "operationId": "createAdminUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "创建管理员请求", - "required": false, - "schema": { - "originalRef": "创建管理员请求", - "$ref": "#/definitions/创建管理员请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«AdminUser»", - "$ref": "#/definitions/统一响应结果«AdminUser»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«AdminUser»", - "$ref": "#/definitions/统一响应结果«AdminUser»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/user/designers": { - "get": { - "tags": [ - "管理员管理接口" - ], - "summary": "全部定制师(不分页)", - "description": "返回所有已上线的定制师列表,不分页。用于订单指派定制师、下拉选择等场景。\n返回定制师ID、姓名、头像、认证等级等基本信息。", - "operationId": "listAllDesignersUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«旅行设计师VO»»", - "$ref": "#/definitions/统一响应结果«List«旅行设计师VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«旅行设计师VO»»", - "$ref": "#/definitions/统一响应结果«List«旅行设计师VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/user/{adminId}": { - "get": { - "tags": [ - "管理员管理接口" - ], - "summary": "获取管理员详情", - "description": "获取指定管理员的完整信息。\n\n**关联字典**:\n- admin_status(管理员状态):ACTIVE=启用, LOCKED=锁定, DISABLED=禁用\n", - "operationId": "getAdminUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "adminId", - "in": "path", - "description": "管理员ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«AdminUser»", - "$ref": "#/definitions/统一响应结果«AdminUser»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«AdminUser»", - "$ref": "#/definitions/统一响应结果«AdminUser»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "管理员管理接口" - ], - "summary": "更新管理员", - "description": "更新管理员信息,包括用户名、状态、角色分配等。\n\n**关联字典**:\n- admin_status(管理员状态):ACTIVE=启用, LOCKED=锁定, DISABLED=禁用\n", - "operationId": "updateAdminUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "adminId", - "in": "path", - "description": "管理员ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "更新管理员请求", - "required": false, - "schema": { - "originalRef": "更新管理员请求", - "$ref": "#/definitions/更新管理员请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«AdminUser»", - "$ref": "#/definitions/统一响应结果«AdminUser»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«AdminUser»", - "$ref": "#/definitions/统一响应结果«AdminUser»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "管理员管理接口" - ], - "summary": "删除管理员", - "description": "删除指定管理员账号(软删除)。不能删除自己的账号,不能删除SUPER_ADMIN角色的账号(除非操作者也是SUPER_ADMIN)。删除后该管理员的登录状态自动失效。需要SUPER_ADMIN或ADMIN角色。", - "operationId": "deleteAdminUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "adminId", - "in": "path", - "description": "管理员ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/user/{adminId}/reset-password": { - "post": { - "tags": [ - "管理员管理接口" - ], - "summary": "重置密码", - "description": "将指定管理员的密码重置为默认密码(Admin@123456)。用于管理员忘记密码时由上级管理员操作重置。重置后管理员可用默认密码登录,建议立即修改。需要SUPER_ADMIN或ADMIN角色。", - "operationId": "resetPasswordUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "adminId", - "in": "path", - "description": "管理员ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/user/{adminId}/unlock": { - "post": { - "tags": [ - "管理员管理接口" - ], - "summary": "解锁管理员", - "description": "解锁因登录失败次数过多而被锁定的管理员账号。管理员连续5次登录失败后账号自动锁定30分钟,此接口可立即解锁。需要SUPER_ADMIN或ADMIN角色。", - "operationId": "unlockAdminUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "adminId", - "in": "path", - "description": "管理员ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/user/{adminId}/wechat-binding": { - "put": { - "tags": [ - "管理员管理接口" - ], - "summary": "修改企业微信绑定(支持换绑)", - "description": "为管理员绑定或更换企业微信账号。绑定后管理员可通过企业微信扫码登录,并可接收审批通知。如果目标企微ID已被其他管理员绑定,需设置forceRebind=true强制换绑。需要管理员认证。", - "operationId": "updateWechatBindingUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "adminId", - "in": "path", - "description": "管理员ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "body", - "description": "企业微信绑定信息", - "required": false, - "schema": { - "originalRef": "企业微信绑定请求", - "$ref": "#/definitions/企业微信绑定请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Map«string,object»»", - "$ref": "#/definitions/统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Map«string,object»»", - "$ref": "#/definitions/统一响应结果«Map«string,object»»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/banner": { - "get": { - "tags": [ - "Banner管理接口" - ], - "summary": "Banner列表", - "description": "分页查询Banner列表,支持按关键词和状态筛选。\n\n**关联字典**:\n- common_status(通用状态):请求参数status和返回字段status(0=禁用, 1=启用)", - "operationId": "listBannersUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "搜索关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "status", - "in": "query", - "description": "状态", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«Banner VO»»", - "$ref": "#/definitions/统一响应结果«分页结果«Banner VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«Banner VO»»", - "$ref": "#/definitions/统一响应结果«分页结果«Banner VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "Banner管理接口" - ], - "summary": "创建Banner", - "description": "创建新的首页轮播图,包括标题、封面图、跳转链接、排序等。\n\n**权限**:需要管理员登录。\n**注意**:创建后默认为启用状态,小程序端将按排序展示。", - "operationId": "createBannerUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "轮播图创建请求", - "required": false, - "schema": { - "originalRef": "Banner请求", - "$ref": "#/definitions/Banner请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Banner VO»", - "$ref": "#/definitions/统一响应结果«Banner VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Banner VO»", - "$ref": "#/definitions/统一响应结果«Banner VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/banner/{id}": { - "get": { - "tags": [ - "Banner管理接口" - ], - "summary": "Banner详情", - "description": "获取指定Banner的详细信息,包括标题、图片、跳转链接、排序等。\n\n**权限**:需要管理员登录。\n\n**关联字典**:\n- common_status(通用状态):返回字段status(0=禁用, 1=启用)", - "operationId": "getBannerUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "轮播图ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Banner VO»", - "$ref": "#/definitions/统一响应结果«Banner VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Banner VO»", - "$ref": "#/definitions/统一响应结果«Banner VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "Banner管理接口" - ], - "summary": "更新Banner", - "description": "更新指定Banner的标题、封面图、跳转链接、排序、状态等信息。\n\n**权限**:需要管理员登录。", - "operationId": "updateBannerUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "轮播图ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "轮播图更新请求", - "required": false, - "schema": { - "originalRef": "Banner请求", - "$ref": "#/definitions/Banner请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Banner VO»", - "$ref": "#/definitions/统一响应结果«Banner VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Banner VO»", - "$ref": "#/definitions/统一响应结果«Banner VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "Banner管理接口" - ], - "summary": "删除Banner", - "description": "删除指定的Banner记录(软删除)。\n\n**权限**:需要管理员登录。\n**注意**:删除后小程序首页将不再展示该Banner。", - "operationId": "deleteBannerUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "轮播图ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/contact": { - "get": { - "tags": [ - "联系我们管理接口" - ], - "summary": "联系方式列表", - "description": "分页查询联系方式列表,支持按关键词和状态筛选。\n\n**关联字典**:\n- contact_channel_type(联系渠道类型):返回字段channelType(PHONE=电话, WECHAT=微信, EMAIL=邮箱等)\n- common_status(通用状态):请求参数status和返回字段status", - "operationId": "listContactsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "搜索关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "status", - "in": "query", - "description": "状态", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«联系我们 VO»»", - "$ref": "#/definitions/统一响应结果«分页结果«联系我们 VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«联系我们 VO»»", - "$ref": "#/definitions/统一响应结果«分页结果«联系我们 VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "联系我们管理接口" - ], - "summary": "创建联系方式", - "description": "新增一条联系方式记录。\n\n**关联字典**:\n- contact_channel_type(联系渠道类型):请求字段channelType", - "operationId": "createContactUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "联系方式创建请求", - "required": false, - "schema": { - "originalRef": "联系我们请求", - "$ref": "#/definitions/联系我们请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«联系我们 VO»", - "$ref": "#/definitions/统一响应结果«联系我们 VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«联系我们 VO»", - "$ref": "#/definitions/统一响应结果«联系我们 VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/contact/{id}": { - "get": { - "tags": [ - "联系我们管理接口" - ], - "summary": "联系方式详情", - "description": "获取指定联系方式的详细信息。\n\n**关联字典**:\n- contact_channel_type(联系渠道类型):返回字段channelType\n- common_status(通用状态):返回字段status", - "operationId": "getContactUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "联系方式ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«联系我们 VO»", - "$ref": "#/definitions/统一响应结果«联系我们 VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«联系我们 VO»", - "$ref": "#/definitions/统一响应结果«联系我们 VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "联系我们管理接口" - ], - "summary": "更新联系方式", - "description": "更新指定联系方式记录。\n\n**关联字典**:\n- contact_channel_type(联系渠道类型):请求字段channelType", - "operationId": "updateContactUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "联系方式ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "联系方式更新请求", - "required": false, - "schema": { - "originalRef": "联系我们请求", - "$ref": "#/definitions/联系我们请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«联系我们 VO»", - "$ref": "#/definitions/统一响应结果«联系我们 VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«联系我们 VO»", - "$ref": "#/definitions/统一响应结果«联系我们 VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "联系我们管理接口" - ], - "summary": "删除联系方式", - "description": "删除指定的联系方式记录(软删除)。\n\n**权限**:需要管理员登录。\n**注意**:删除后小程序端将不再展示该联系方式。", - "operationId": "deleteContactUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "联系方式ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/explore/category": { - "get": { - "tags": [ - "探索分类管理接口" - ], - "summary": "探索分类列表", - "description": "分页查询探索分类列表,支持按关键词和状态筛选。\n\n**关联字典**:\n- common_status(通用状态):请求参数status和返回字段status(0=禁用, 1=启用)", - "operationId": "listCategoriesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "搜索关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "status", - "in": "query", - "description": "状态", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«探索分类 VO»»", - "$ref": "#/definitions/统一响应结果«分页结果«探索分类 VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«探索分类 VO»»", - "$ref": "#/definitions/统一响应结果«分页结果«探索分类 VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "探索分类管理接口" - ], - "summary": "创建探索分类", - "description": "创建新的探索分类,用于小程序探索页面的分类展示。\n可关联多个景区资源,设置封面图和描述文字。\n\n**权限**:需要管理员登录。", - "operationId": "createCategoryUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "分类创建请求", - "required": false, - "schema": { - "originalRef": "探索分类请求", - "$ref": "#/definitions/探索分类请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/explore/category/{id}": { - "get": { - "tags": [ - "探索分类管理接口" - ], - "summary": "探索分类详情", - "description": "获取指定探索分类的详细信息,包括标题、封面图、描述、关联的景区资源列表等。\n\n**权限**:需要管理员登录。\n\n**关联字典**:\n- common_status(通用状态):返回字段status(0=禁用, 1=启用)", - "operationId": "getCategoryUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "分类ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«探索分类详情 VO»", - "$ref": "#/definitions/统一响应结果«探索分类详情 VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«探索分类详情 VO»", - "$ref": "#/definitions/统一响应结果«探索分类详情 VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "探索分类管理接口" - ], - "summary": "更新探索分类", - "description": "更新指定探索分类的标题、封面图、描述、关联资源、状态等信息。\n\n**权限**:需要管理员登录。", - "operationId": "updateCategoryUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "分类ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "分类更新请求", - "required": false, - "schema": { - "originalRef": "探索分类请求", - "$ref": "#/definitions/探索分类请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "探索分类管理接口" - ], - "summary": "删除探索分类", - "description": "删除指定的探索分类(软删除),同时清除关联的资源绑定关系。\n\n**权限**:需要管理员登录。\n**注意**:删除后小程序探索页面将不再展示该分类。", - "operationId": "deleteCategoryUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "分类ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/frontend-config": { - "get": { - "tags": [ - "前端配置管理接口" - ], - "summary": "配置列表", - "description": "分页查询前端配置列表,支持按关键词、分组和状态筛选。\n\n**关联字典**:\n- common_status(通用状态):请求参数status和返回字段status(0=禁用, 1=启用)", - "operationId": "listConfigsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "configGroup", - "in": "query", - "description": "配置分组", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "keyword", - "in": "query", - "description": "搜索关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "status", - "in": "query", - "description": "状态", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«前端配置 VO»»", - "$ref": "#/definitions/统一响应结果«分页结果«前端配置 VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«前端配置 VO»»", - "$ref": "#/definitions/统一响应结果«分页结果«前端配置 VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "前端配置管理接口" - ], - "summary": "创建配置", - "description": "创建新的前端配置项,用于控制前端页面的展示和行为。\n\n**权限**:需要管理员登录。\n**注意**:configKey 必须全局唯一,不能与已有配置重复。可通过 sensitive 字段标记是否为敏感配置(敏感配置不会通过公开接口暴露给小程序)。", - "operationId": "createConfigUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "配置创建请求", - "required": false, - "schema": { - "originalRef": "前端配置请求", - "$ref": "#/definitions/前端配置请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«前端配置 VO»", - "$ref": "#/definitions/统一响应结果«前端配置 VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«前端配置 VO»", - "$ref": "#/definitions/统一响应结果«前端配置 VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/frontend-config/all": { - "get": { - "tags": [ - "前端配置管理接口" - ], - "summary": "配置列表(不分页)", - "description": "获取所有前端配置项的完整列表(不分页),支持按分组和状态筛选。\n适用于需要一次性加载全部配置的场景。\n\n**权限**:需要管理员登录。", - "operationId": "listAllConfigsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "configGroup", - "in": "query", - "description": "配置分组", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "status", - "in": "query", - "description": "状态", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«前端配置 VO»»", - "$ref": "#/definitions/统一响应结果«List«前端配置 VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«前端配置 VO»»", - "$ref": "#/definitions/统一响应结果«List«前端配置 VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/frontend-config/by-key/{key}": { - "get": { - "tags": [ - "前端配置管理接口" - ], - "summary": "按key查询配置", - "description": "根据配置键(configKey)获取指定的前端配置项。\nconfigKey为全局唯一标识,如 app_name、primary_color 等。\n\n**权限**:需要管理员登录。", - "operationId": "getConfigByKeyUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "key", - "in": "path", - "description": "配置键", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«前端配置 VO»", - "$ref": "#/definitions/统一响应结果«前端配置 VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«前端配置 VO»", - "$ref": "#/definitions/统一响应结果«前端配置 VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/frontend-config/groups": { - "get": { - "tags": [ - "前端配置管理接口" - ], - "summary": "获取所有分组", - "description": "获取前端配置中所有已使用的分组名称列表。\n用于配置管理页面的分组筛选下拉框。\n\n**权限**:需要管理员登录。", - "operationId": "listGroupsUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«string»»", - "$ref": "#/definitions/统一响应结果«List«string»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«string»»", - "$ref": "#/definitions/统一响应结果«List«string»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/frontend-config/{id}": { - "get": { - "tags": [ - "前端配置管理接口" - ], - "summary": "配置详情", - "description": "根据配置ID获取指定前端配置项的详细信息,包括key、value、分组、描述等。\n\n**权限**:需要管理员登录。", - "operationId": "getConfigUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "配置ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«前端配置 VO»", - "$ref": "#/definitions/统一响应结果«前端配置 VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«前端配置 VO»", - "$ref": "#/definitions/统一响应结果«前端配置 VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "前端配置管理接口" - ], - "summary": "更新配置", - "description": "更新指定前端配置项的值、分组、描述、状态等信息。\n\n**权限**:需要管理员登录。\n**注意**:修改后前端会实时使用新值(如有缓存需等待刷新)。", - "operationId": "updateConfigUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "配置ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "配置更新请求", - "required": false, - "schema": { - "originalRef": "前端配置请求", - "$ref": "#/definitions/前端配置请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«前端配置 VO»", - "$ref": "#/definitions/统一响应结果«前端配置 VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«前端配置 VO»", - "$ref": "#/definitions/统一响应结果«前端配置 VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "前端配置管理接口" - ], - "summary": "删除配置", - "description": "删除指定的前端配置项(软删除)。\n\n**权限**:需要管理员登录。\n**注意**:删除后前端将无法获取该配置,可能影响页面展示,请确认无引用后再删除。", - "operationId": "deleteConfigUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "配置ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/faq/categories": { - "get": { - "tags": [ - "常见问题管理接口" - ], - "summary": "分类列表", - "description": "获取所有FAQ分类的完整列表(不分页)。\n每个分类包含名称、排序号、状态等信息。\n\n**权限**:需要管理员登录。", - "operationId": "listCategoriesUsingGET_1", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«常见问题分类VO»»", - "$ref": "#/definitions/统一响应结果«List«常见问题分类VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«常见问题分类VO»»", - "$ref": "#/definitions/统一响应结果«List«常见问题分类VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "常见问题管理接口" - ], - "summary": "创建分类", - "description": "创建新的FAQ分类,用于对常见问题进行归类。\n\n**权限**:需要管理员登录。\n**注意**:分类名称不能重复。", - "operationId": "createCategoryUsingPOST_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "originalRef": "常见问题分类请求", - "$ref": "#/definitions/常见问题分类请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«常见问题分类VO»", - "$ref": "#/definitions/统一响应结果«常见问题分类VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«常见问题分类VO»", - "$ref": "#/definitions/统一响应结果«常见问题分类VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/faq/categories/{id}": { - "put": { - "tags": [ - "常见问题管理接口" - ], - "summary": "更新分类", - "description": "更新指定FAQ分类的名称、排序号、状态等信息。\n\n**权限**:需要管理员登录。", - "operationId": "updateCategoryUsingPUT_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "分类ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "originalRef": "常见问题分类请求", - "$ref": "#/definitions/常见问题分类请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«常见问题分类VO»", - "$ref": "#/definitions/统一响应结果«常见问题分类VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«常见问题分类VO»", - "$ref": "#/definitions/统一响应结果«常见问题分类VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "常见问题管理接口" - ], - "summary": "删除分类", - "description": "删除指定的FAQ分类(软删除)。\n\n**权限**:需要管理员登录。\n**注意**:删除分类不会删除其下的条目,但条目将变为无分类状态。", - "operationId": "deleteCategoryUsingDELETE_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "分类ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/faq/items": { - "get": { - "tags": [ - "常见问题管理接口" - ], - "summary": "条目列表", - "description": "查询FAQ条目列表,支持按分类ID筛选。\n返回问题标题、回答内容(富文本)、排序号等。\n\n**权限**:需要管理员登录。", - "operationId": "listItemsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "categoryId", - "in": "query", - "description": "分类ID(可选)", - "required": false, - "type": "integer", - "format": "int64", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«常见问题条目VO»»", - "$ref": "#/definitions/统一响应结果«List«常见问题条目VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«常见问题条目VO»»", - "$ref": "#/definitions/统一响应结果«List«常见问题条目VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "常见问题管理接口" - ], - "summary": "创建条目", - "description": "创建一条常见问题,包含问题标题和回答(支持富文本)。\n\n**权限**:需要管理员登录。\n**注意**:需指定所属分类ID,排序号越小越靠前。", - "operationId": "createItemUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "originalRef": "常见问题条目请求", - "$ref": "#/definitions/常见问题条目请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«常见问题条目VO»", - "$ref": "#/definitions/统一响应结果«常见问题条目VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«常见问题条目VO»", - "$ref": "#/definitions/统一响应结果«常见问题条目VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/faq/items/{id}": { - "put": { - "tags": [ - "常见问题管理接口" - ], - "summary": "更新条目", - "description": "更新指定FAQ条目的问题标题、回答内容、排序号等信息。\n\n**权限**:需要管理员登录。", - "operationId": "updateItemUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "条目ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "originalRef": "常见问题条目请求", - "$ref": "#/definitions/常见问题条目请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«常见问题条目VO»", - "$ref": "#/definitions/统一响应结果«常见问题条目VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«常见问题条目VO»", - "$ref": "#/definitions/统一响应结果«常见问题条目VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "常见问题管理接口" - ], - "summary": "删除条目", - "description": "删除指定的FAQ条目(软删除)。\n\n**权限**:需要管理员登录。\n**注意**:删除后小程序FAQ页面将不再展示该条目。", - "operationId": "deleteItemUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "条目ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/agreement": { - "get": { - "tags": [ - "用户协议管理接口" - ], - "summary": "协议列表", - "description": "分页查询用户协议列表,支持按关键词和状态筛选。\n\n**关联字典**:\n- common_status(通用状态):请求参数status和返回字段status(0=禁用, 1=启用)", - "operationId": "listAgreementsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "搜索关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "status", - "in": "query", - "description": "状态", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«协议 VO»»", - "$ref": "#/definitions/统一响应结果«分页结果«协议 VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«协议 VO»»", - "$ref": "#/definitions/统一响应结果«分页结果«协议 VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "用户协议管理接口" - ], - "summary": "新增协议", - "description": "创建新的用户协议,如用户服务协议、隐私政策等。\n\n**权限**:需要管理员登录。\n**注意**:协议类型(type)需唯一,同一类型不能重复创建。内容支持富文本。", - "operationId": "createAgreementUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "originalRef": "协议请求", - "$ref": "#/definitions/协议请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«协议 VO»", - "$ref": "#/definitions/统一响应结果«协议 VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«协议 VO»", - "$ref": "#/definitions/统一响应结果«协议 VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/agreement/{id}": { - "get": { - "tags": [ - "用户协议管理接口" - ], - "summary": "协议详情", - "description": "获取指定用户协议的详细信息,包括标题、内容(富文本)、版本号等。\n\n**权限**:需要管理员登录。\n\n**关联字典**:\n- common_status(通用状态):返回字段status(0=禁用, 1=启用)", - "operationId": "getAgreementUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "协议ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«协议 VO»", - "$ref": "#/definitions/统一响应结果«协议 VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«协议 VO»", - "$ref": "#/definitions/统一响应结果«协议 VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "用户协议管理接口" - ], - "summary": "编辑协议", - "description": "更新指定用户协议的标题、内容、状态等信息。\n\n**权限**:需要管理员登录。\n**注意**:修改后小程序端会实时展示新内容。", - "operationId": "updateAgreementUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "协议ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "request", - "required": true, - "schema": { - "originalRef": "协议请求", - "$ref": "#/definitions/协议请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«协议 VO»", - "$ref": "#/definitions/统一响应结果«协议 VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«协议 VO»", - "$ref": "#/definitions/统一响应结果«协议 VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "用户协议管理接口" - ], - "summary": "删除协议", - "description": "删除指定的用户协议记录(软删除)。\n\n**权限**:需要管理员登录。\n**注意**:删除后小程序端将无法查看该协议。", - "operationId": "deleteAgreementUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "协议ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/auth/2fa/callback": { - "get": { - "tags": [ - "管理员认证接口" - ], - "summary": "2FA企微扫码回调", - "description": "企业微信OAuth回调地址,用户扫码授权后微信服务器回调此接口。此接口由微信服务器调用,非前端直接调用。回调成功后将state对应的会话标记为已扫码,前端轮询 /2fa/check 即可获取结果。返回HTML页面(成功/失败提示),不返回JSON。", - "operationId": "handle2FaCallbackUsingGET", - "produces": [ - "text/html" - ], - "parameters": [ - { - "name": "code", - "in": "query", - "description": "授权码", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "state", - "in": "query", - "description": "会话状态", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/auth/2fa/check": { - "get": { - "tags": [ - "管理员认证接口" - ], - "summary": "查询2FA扫码状态", - "description": "前端轮询此接口检查2FA扫码验证是否完成。返回status字段:PENDING=等待扫码,SCANNED=已完成验证(附带token和用户信息)。建议轮询间隔2秒,超过5分钟未扫码会话自动失效。无需认证即可调用(登录流程中使用)。", - "operationId": "check2FaStatusUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "state", - "in": "query", - "description": "会话状态", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Map«string,object»»", - "$ref": "#/definitions/统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Map«string,object»»", - "$ref": "#/definitions/统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/auth/2fa/confirm": { - "post": { - "tags": [ - "管理员认证接口" - ], - "summary": "手动确认扫码(内网穿透环境workaround,默认关闭)", - "description": "在内网穿透环境下,企微回调可能无法正常到达,此接口作为手动替代方案。\n需在Nacos配置中开启 auth.2fa-confirm-enabled=true 才可使用。\n\n**权限**:无需认证(登录流程中使用)。\n**注意**:生产环境应保持关闭,仅限开发/测试时使用。", - "operationId": "confirm2FaScanUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "adminId", - "in": "query", - "description": "管理员ID", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "state", - "in": "query", - "description": "会话状态", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/auth/2fa/qrcode": { - "get": { - "tags": [ - "管理员认证接口" - ], - "summary": "生成2FA扫码会话", - "description": "生成企业微信扫码二维码的会话信息,用于新设备二次验证。返回包含qrcodeUrl(二维码链接)和state(会话标识)。前端展示二维码后通过轮询 /2fa/check 接口检查扫码状态。无需认证即可调用(登录流程中使用)。", - "operationId": "generate2FaQrcodeUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "adminId", - "in": "query", - "description": "管理员ID", - "required": false, - "type": "integer", - "format": "int64", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Map«string,object»»", - "$ref": "#/definitions/统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Map«string,object»»", - "$ref": "#/definitions/统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/auth/avatar": { - "put": { - "tags": [ - "管理员认证接口" - ], - "summary": "更新头像", - "description": "管理员更新自己的头像。需先通过文件服务上传图片获取OSS URL和fileId,再调用此接口绑定。旧头像的文件引用会自动解绑。需要管理员认证。", - "operationId": "updateAvatarUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "头像更新请求", - "required": false, - "schema": { - "originalRef": "头像更新请求", - "$ref": "#/definitions/头像更新请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/auth/info": { - "get": { - "tags": [ - "管理员认证接口" - ], - "summary": "获取当前管理员信息", - "description": "获取当前登录管理员的完整信息,包括用户名、头像、角色列表、当前角色、菜单权限等。前端页面初始化时调用此接口获取用户信息和权限数据。需要管理员认证。", - "operationId": "getAdminInfoUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«管理员登录响应»", - "$ref": "#/definitions/统一响应结果«管理员登录响应»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«管理员登录响应»", - "$ref": "#/definitions/统一响应结果«管理员登录响应»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/auth/login": { - "post": { - "tags": [ - "管理员认证接口" - ], - "summary": "管理员登录", - "description": "管理员通过用户名+密码登录后台管理系统。首次在新设备登录时需要进行企业微信扫码二次验证(2FA),返回needTwoFa=true。登录失败5次后账号将被锁定30分钟。无需认证即可调用。", - "operationId": "loginUsingPOST_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "管理员登录请求", - "required": false, - "schema": { - "originalRef": "管理员登录请求", - "$ref": "#/definitions/管理员登录请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«管理员登录响应»", - "$ref": "#/definitions/统一响应结果«管理员登录响应»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«管理员登录响应»", - "$ref": "#/definitions/统一响应结果«管理员登录响应»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/auth/logout": { - "post": { - "tags": [ - "管理员认证接口" - ], - "summary": "管理员登出", - "description": "清除管理员的登录状态并使当前Token失效。前端应在登出后清除本地存储的Token和用户信息。需要管理员认证。", - "operationId": "logoutUsingPOST_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/auth/password": { - "put": { - "tags": [ - "管理员认证接口" - ], - "summary": "修改密码", - "description": "管理员修改自己的登录密码。需验证旧密码正确后才能设置新密码,新密码须满足复杂度要求(8-128位,含大小写字母和数字)。修改成功后当前Token仍然有效,无需重新登录。需要管理员认证(Token中的adminId)。", - "operationId": "changePasswordUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "changeRequest", - "description": "修改密码请求", - "required": false, - "schema": { - "originalRef": "修改密码请求", - "$ref": "#/definitions/修改密码请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/auth/switch-role": { - "post": { - "tags": [ - "管理员认证接口" - ], - "summary": "切换当前角色", - "description": "多角色管理员切换当前活跃角色。切换后返回新的Token和角色对应的菜单权限,前端需更新本地Token并刷新菜单。只能切换到该管理员已分配的角色,否则报错。需要管理员认证。", - "operationId": "switchRoleUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "角色切换请求", - "required": false, - "schema": { - "originalRef": "角色切换请求", - "$ref": "#/definitions/角色切换请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«管理员登录响应»", - "$ref": "#/definitions/统一响应结果«管理员登录响应»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«管理员登录响应»", - "$ref": "#/definitions/统一响应结果«管理员登录响应»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/auth/wechat-qr": { - "get": { - "tags": [ - "管理员认证接口" - ], - "summary": "生成企业微信扫码登录会话", - "description": "生成企业微信扫码直接登录的会话信息(非2FA验证,而是扫码替代密码登录)。返回包含qrcodeUrl和state。前端展示二维码后通过轮询 /wechat-qr/status 检查登录状态。无需认证即可调用。", - "operationId": "generateWechatLoginQrUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Map«string,object»»", - "$ref": "#/definitions/统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Map«string,object»»", - "$ref": "#/definitions/统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/auth/wechat-qr/callback": { - "get": { - "tags": [ - "管理员认证接口" - ], - "summary": "企业微信扫码登录回调", - "description": "企业微信OAuth回调地址,扫码登录授权后微信服务器回调此接口。此接口由微信服务器调用,非前端直接调用。回调后标记会话为已扫码,前端通过轮询 /wechat-qr/status 获取登录结果。返回HTML页面,不返回JSON。", - "operationId": "handleWechatLoginCallbackUsingGET", - "produces": [ - "text/html" - ], - "parameters": [ - { - "name": "code", - "in": "query", - "description": "授权码", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "state", - "in": "query", - "description": "会话状态", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/auth/wechat-qr/status": { - "get": { - "tags": [ - "管理员认证接口" - ], - "summary": "查询企业微信扫码登录状态", - "description": "前端轮询此接口检查扫码登录是否完成。返回status字段:PENDING=等待扫码,SCANNED=已扫码登录成功(附带token和用户信息)。建议轮询间隔2秒,超过5分钟未扫码会话自动失效。无需认证即可调用。", - "operationId": "checkWechatLoginStatusUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "state", - "in": "query", - "description": "会话状态", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Map«string,object»»", - "$ref": "#/definitions/统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Map«string,object»»", - "$ref": "#/definitions/统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/auth/wechat/verify-2fa": { - "post": { - "tags": [ - "管理员认证接口" - ], - "summary": "2FA验证", - "description": "新设备登录时的企业微信二次验证。管理员登录返回needTwoFa=true后,前端调用此接口提交验证码完成登录。验证通过后设备将被标记为可信设备,后续登录不再需要2FA。无需认证即可调用。", - "operationId": "verifyTwoFaUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "adminId", - "in": "query", - "description": "管理员ID", - "required": false, - "type": "integer", - "format": "int64", - "allowEmptyValue": false - }, - { - "in": "body", - "name": "request", - "description": "2FA验证请求", - "required": false, - "schema": { - "originalRef": "二次验证请求", - "$ref": "#/definitions/二次验证请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«管理员登录响应»", - "$ref": "#/definitions/统一响应结果«管理员登录响应»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«管理员登录响应»", - "$ref": "#/definitions/统一响应结果«管理员登录响应»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/role": { - "get": { - "tags": [ - "角色管理接口" - ], - "summary": "分页查询角色", - "description": "分页查询系统角色列表,支持按状态筛选。\n\n**关联字典**:\n- common_status(通用状态):ACTIVE=启用, DISABLED=禁用(筛选条件+列表展示)\n", - "operationId": "listRolesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "status", - "in": "query", - "description": "状态", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«SysRole»»", - "$ref": "#/definitions/统一响应结果«分页结果«SysRole»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«SysRole»»", - "$ref": "#/definitions/统一响应结果«分页结果«SysRole»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "角色管理接口" - ], - "summary": "创建角色", - "description": "创建新的系统角色。角色标识(roleKey)全局唯一,创建后不可修改,用于代码中的权限判断。创建后需通过[分配菜单权限]接口为角色授权菜单。需要SUPER_ADMIN角色。", - "operationId": "createRoleUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "创建角色请求", - "required": false, - "schema": { - "originalRef": "创建角色请求", - "$ref": "#/definitions/创建角色请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysRole»", - "$ref": "#/definitions/统一响应结果«SysRole»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysRole»", - "$ref": "#/definitions/统一响应结果«SysRole»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/role/all": { - "get": { - "tags": [ - "角色管理接口" - ], - "summary": "获取所有角色(下拉)", - "description": "获取所有状态正常的角色列表,用于下拉选择框。不分页,返回全部角色。创建管理员、筛选管理员列表时使用。需要管理员认证。", - "operationId": "getAllRolesUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«SysRole»»", - "$ref": "#/definitions/统一响应结果«List«SysRole»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«SysRole»»", - "$ref": "#/definitions/统一响应结果«List«SysRole»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/role/{roleId}": { - "get": { - "tags": [ - "角色管理接口" - ], - "summary": "获取角色详情(含菜单ID)", - "description": "获取角色基本信息及其已分配的菜单ID列表。返回role对象和menuIds数组,用于角色编辑页面回显已勾选的菜单。需要管理员认证。", - "operationId": "getRoleDetailUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "roleId", - "in": "path", - "description": "角色ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Map«string,object»»", - "$ref": "#/definitions/统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Map«string,object»»", - "$ref": "#/definitions/统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "角色管理接口" - ], - "summary": "更新角色", - "description": "更新角色名称、状态等信息。角色标识(roleKey)不可修改。\n\n**关联字典**:\n- common_status(通用状态):ACTIVE=启用, DISABLED=禁用\n", - "operationId": "updateRoleUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "更新角色请求", - "required": false, - "schema": { - "originalRef": "更新角色请求", - "$ref": "#/definitions/更新角色请求" - } - }, - { - "name": "roleId", - "in": "path", - "description": "角色ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysRole»", - "$ref": "#/definitions/统一响应结果«SysRole»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysRole»", - "$ref": "#/definitions/统一响应结果«SysRole»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "角色管理接口" - ], - "summary": "删除角色", - "description": "删除指定角色(软删除)。如果该角色下还有关联的管理员,将无法删除,需先解除绑定关系。内置角色(SUPER_ADMIN等)不可删除。需要SUPER_ADMIN角色。", - "operationId": "deleteRoleUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "roleId", - "in": "path", - "description": "角色ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/role/{roleId}/menus": { - "put": { - "tags": [ - "角色管理接口" - ], - "summary": "分配菜单权限", - "description": "为指定角色分配菜单权限(全量覆盖模式)。传入的menuIds将完全替换该角色原有的菜单权限。分配后该角色的所有在线管理员下次请求 /admin/menu/my 时会获取到新的菜单树。注意:需同步清除Redis中的菜单缓存,否则前端拿到的是旧菜单。需要SUPER_ADMIN角色。", - "operationId": "assignMenusUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "分配菜单请求", - "required": false, - "schema": { - "originalRef": "分配菜单权限请求", - "$ref": "#/definitions/分配菜单权限请求" - } - }, - { - "name": "roleId", - "in": "path", - "description": "角色ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/menu": { - "post": { - "tags": [ - "菜单管理接口" - ], - "summary": "创建菜单", - "description": "创建新的菜单/目录/按钮。menuType取值:D=目录(含子菜单) M=页面菜单 B=操作按钮。目录和菜单需设置path路由路径,菜单还需设置component组件路径。按钮类型需设置permissionCode权限标识(如system:user:add)。需要SUPER_ADMIN角色。\n\n**关联字典**:\n- menu_type(菜单类型):请求/返回字段menuType(D=目录, M=菜单, B=按钮)\n- common_status(通用状态):返回字段status", - "operationId": "createMenuUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "创建菜单请求", - "required": false, - "schema": { - "originalRef": "创建菜单请求", - "$ref": "#/definitions/创建菜单请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysMenu»", - "$ref": "#/definitions/统一响应结果«SysMenu»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysMenu»", - "$ref": "#/definitions/统一响应结果«SysMenu»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/menu/my": { - "get": { - "tags": [ - "菜单管理接口" - ], - "summary": "获取当前管理员菜单", - "description": "获取当前登录管理员的菜单树(基于其当前角色的权限)。SUPER_ADMIN角色返回完整菜单树,其他角色返回已授权的菜单子集。前端登录后调用此接口动态生成路由和侧边栏菜单。需要管理员认证。", - "operationId": "getMyMenusUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«SysMenu»»", - "$ref": "#/definitions/统一响应结果«List«SysMenu»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«SysMenu»»", - "$ref": "#/definitions/统一响应结果«List«SysMenu»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/menu/tree": { - "get": { - "tags": [ - "菜单管理接口" - ], - "summary": "获取完整菜单树", - "description": "获取系统所有菜单的完整树形结构。用于角色权限配置页面展示完整的菜单树供勾选。仅SUPER_ADMIN可查看完整菜单树。需要管理员认证。\n\n**关联字典**:\n- menu_type(菜单类型):返回字段menuType\n- common_status(通用状态):返回字段status", - "operationId": "getMenuTreeUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«SysMenu»»", - "$ref": "#/definitions/统一响应结果«List«SysMenu»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«SysMenu»»", - "$ref": "#/definitions/统一响应结果«List«SysMenu»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/menu/tree/role/{roleId}": { - "get": { - "tags": [ - "菜单管理接口" - ], - "summary": "获取角色菜单树", - "description": "获取指定角色已分配的菜单树形结构。\n用于角色权限配置页面,展示该角色已拥有的菜单权限。\n\n**权限**:需要管理员登录。", - "operationId": "getMenuTreeByRoleIdUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "roleId", - "in": "path", - "description": "角色ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«SysMenu»»", - "$ref": "#/definitions/统一响应结果«List«SysMenu»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«SysMenu»»", - "$ref": "#/definitions/统一响应结果«List«SysMenu»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/menu/{menuId}": { - "get": { - "tags": [ - "菜单管理接口" - ], - "summary": "获取菜单详情", - "description": "获取指定菜单的详细信息,包括名称、路径、组件、图标、排序、权限标识等。\n\n**权限**:需要管理员登录。\n\n**关联字典**:\n- menu_type(菜单类型):返回字段menuType(D=目录, M=菜单, B=按钮)\n- common_status(通用状态):返回字段status", - "operationId": "getMenuUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "menuId", - "in": "path", - "description": "菜单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysMenu»", - "$ref": "#/definitions/统一响应结果«SysMenu»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysMenu»", - "$ref": "#/definitions/统一响应结果«SysMenu»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "菜单管理接口" - ], - "summary": "更新菜单", - "description": "更新指定菜单的名称、路径、组件、图标、排序、状态等信息。\n\n**权限**:需要SUPER_ADMIN角色。\n**注意**:修改后需清除 Redis 菜单缓存才能生效。\n\n**关联字典**:\n- menu_type(菜单类型):请求字段menuType(D=目录, M=菜单, B=按钮)\n- common_status(通用状态):请求字段status", - "operationId": "updateMenuUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "menuId", - "in": "path", - "description": "菜单ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "更新菜单请求", - "required": false, - "schema": { - "originalRef": "更新菜单请求", - "$ref": "#/definitions/更新菜单请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysMenu»", - "$ref": "#/definitions/统一响应结果«SysMenu»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysMenu»", - "$ref": "#/definitions/统一响应结果«SysMenu»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "菜单管理接口" - ], - "summary": "删除菜单", - "description": "删除指定的菜单/目录/按钮(软删除)。\n\n**权限**:需要SUPER_ADMIN角色。\n**注意**:如果该菜单有子菜单,需先删除子菜单才能删除父菜单。删除后需清除 Redis 菜单缓存才能生效。", - "operationId": "deleteMenuUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "menuId", - "in": "path", - "description": "菜单ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/dict/all": { - "get": { - "tags": [ - "字典管理接口" - ], - "summary": "获取所有字典数据", - "description": "获取系统全部字典类型及其字典数据,按字典类型分组返回。用于后台管理系统初始化时一次性加载所有下拉选项。返回结果包含dictType编码、dictName名称、dataList数据列表。需要管理员认证。\n\n**字典层级说明**:\n- 字典类型(SysDictType):一级分类,如 admin_status、order_status、id_card_type 等\n- 字典数据(SysDictData):二级选项,归属于某个字典类型,如 admin_status 下的 ACTIVE/LOCKED/DISABLED\n- 前端通过 dictType 编码查找对应的 dataList,用 dictValue 匹配实际数据进行翻译展示\n", - "operationId": "getAllDictUsingGET_1", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«字典VO»»", - "$ref": "#/definitions/统一响应结果«List«字典VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«字典VO»»", - "$ref": "#/definitions/统一响应结果«List«字典VO»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/dict/data": { - "post": { - "tags": [ - "字典管理接口" - ], - "summary": "创建字典数据", - "description": "在指定字典类型下新增一条字典数据项。dictValue为前端匹配的值(如ACTIVE),dictLabel为前端展示的标签(如'启用')。支持树形字典数据(通过parentId设置父级)。", - "operationId": "createDictDataUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "创建字典数据请求", - "required": false, - "schema": { - "originalRef": "创建字典数据请求", - "$ref": "#/definitions/创建字典数据请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysDictData»", - "$ref": "#/definitions/统一响应结果«SysDictData»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysDictData»", - "$ref": "#/definitions/统一响应结果«SysDictData»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/dict/data/detail/{dictDataId}": { - "get": { - "tags": [ - "字典管理接口" - ], - "summary": "根据ID获取字典数据详情", - "description": "获取单个字典数据项的详细信息,包括dictValue、dictLabel、cssClass等。", - "operationId": "getDictDataByIdUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "dictDataId", - "in": "path", - "description": "字典数据ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysDictData»", - "$ref": "#/definitions/统一响应结果«SysDictData»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysDictData»", - "$ref": "#/definitions/统一响应结果«SysDictData»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/dict/data/tree/{dictTypeId}": { - "get": { - "tags": [ - "字典管理接口" - ], - "summary": "按类型查询字典数据(树形结构)", - "description": "根据字典类型ID查询其下所有字典数据,以树形结构返回(支持父子级字典数据)。用于多级联动下拉框场景(如省市区)。需要管理员认证。", - "operationId": "getDictDataTreeUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "dictTypeId", - "in": "path", - "description": "字典类型ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«SysDictData»»", - "$ref": "#/definitions/统一响应结果«List«SysDictData»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«SysDictData»»", - "$ref": "#/definitions/统一响应结果«List«SysDictData»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/dict/data/{dictType}": { - "get": { - "tags": [ - "字典管理接口" - ], - "summary": "按类型查询字典数据", - "description": "根据字典类型编码(如order_status)查询其下所有字典数据(平铺列表)。用于单层下拉框场景。需要管理员认证。", - "operationId": "getDictDataByTypeUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "dictType", - "in": "path", - "description": "字典类型编码", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«SysDictData»»", - "$ref": "#/definitions/统一响应结果«List«SysDictData»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«SysDictData»»", - "$ref": "#/definitions/统一响应结果«List«SysDictData»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/dict/data/{id}": { - "put": { - "tags": [ - "字典管理接口" - ], - "summary": "更新字典数据", - "description": "更新字典数据项的标签、样式类型、排序号等。dictValue建议不修改以免影响已有业务数据。", - "operationId": "updateDictDataUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "字典数据ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "更新字典数据请求", - "required": false, - "schema": { - "originalRef": "更新字典数据请求", - "$ref": "#/definitions/更新字典数据请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysDictData»", - "$ref": "#/definitions/统一响应结果«SysDictData»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysDictData»", - "$ref": "#/definitions/统一响应结果«SysDictData»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "字典管理接口" - ], - "summary": "删除字典数据", - "description": "删除指定字典数据项(软删除)。删除后不影响已引用该字典值的业务数据。", - "operationId": "deleteDictDataUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "字典数据ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/dict/type": { - "get": { - "tags": [ - "字典管理接口" - ], - "summary": "分页查询字典类型", - "description": "分页查询字典类型列表,支持按分类(category)筛选、关键词(keyword)搜索。keyword 同时匹配字典类型编码(dict_type)和字典名称(dict_name),模糊搜索。字典类型是字典数据的上级分组,管理字典类型即管理有哪些可供前端使用的下拉选项组。", - "operationId": "listDictTypesUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "category", - "in": "query", - "description": "字典分类", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "keyword", - "in": "query", - "description": "搜索关键词(匹配字典编码或名称)", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«SysDictType»»", - "$ref": "#/definitions/统一响应结果«分页结果«SysDictType»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«SysDictType»»", - "$ref": "#/definitions/统一响应结果«分页结果«SysDictType»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "字典管理接口" - ], - "summary": "创建字典类型", - "description": "新建一个字典类型(如:订单状态、证件类型等)。字典类型编码(dictType)全局唯一,创建后不可修改。需要管理员认证,建议仅SUPER_ADMIN/ADMIN角色操作。\n\n**已有字典类型示例**:\n- admin_status(管理员状态)、common_status(通用状态)、login_status(登录状态)\n- order_status(订单状态)、product_status(产品状态)、rating_level(评价等级)\n- id_card_type(证件类型)、gender(性别)、traveler_type(出行人类型)\n- contact_channel_type(联系方式渠道类型)、favorite_resource_type(收藏资源类型)、footprint_resource_type(足迹资源类型)\n", - "operationId": "createDictTypeUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "创建字典类型请求", - "required": false, - "schema": { - "originalRef": "创建字典类型请求", - "$ref": "#/definitions/创建字典类型请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysDictType»", - "$ref": "#/definitions/统一响应结果«SysDictType»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysDictType»", - "$ref": "#/definitions/统一响应结果«SysDictType»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/dict/type/{dictTypeId}": { - "get": { - "tags": [ - "字典管理接口" - ], - "summary": "根据ID获取字典类型详情", - "description": "获取单个字典类型的详细信息,包括编码、名称、分类、状态等。", - "operationId": "getDictTypeByIdUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "dictTypeId", - "in": "path", - "description": "字典类型ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysDictType»", - "$ref": "#/definitions/统一响应结果«SysDictType»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysDictType»", - "$ref": "#/definitions/统一响应结果«SysDictType»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/dict/type/{id}": { - "put": { - "tags": [ - "字典管理接口" - ], - "summary": "更新字典类型", - "description": "更新字典类型的名称、分类、备注等信息。字典类型编码(dictType)不可修改。", - "operationId": "updateDictTypeUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "字典类型ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "更新字典类型请求", - "required": false, - "schema": { - "originalRef": "更新字典类型请求", - "$ref": "#/definitions/更新字典类型请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysDictType»", - "$ref": "#/definitions/统一响应结果«SysDictType»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«SysDictType»", - "$ref": "#/definitions/统一响应结果«SysDictType»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "字典管理接口" - ], - "summary": "删除字典类型", - "description": "删除字典类型及其下所有字典数据(软删除)。如果该字典类型已被业务引用,删除后不影响已有数据,但新的表单将无法选择该字典值。需要管理员认证。", - "operationId": "deleteDictTypeUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "id", - "in": "path", - "description": "字典类型ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/job": { - "get": { - "tags": [ - "定时任务接口" - ], - "summary": "分页查询定时任务", - "description": "分页查询定时任务列表。\n\n**关联字典**:\n- job_group(任务分组):DEFAULT=默认分组, SYSTEM=系统任务, WECHAT=企微同步, INSURANCE=保险同步\n- job_misfire_policy(执行策略):DEFAULT=默认策略, FIRE_ONCE=立即触发一次, DO_NOTHING=不触发\n- job_status(任务状态):ACTIVE=启用, PAUSED=已暂停", - "operationId": "listJobsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«定时任务信息»»", - "$ref": "#/definitions/统一响应结果«分页结果«定时任务信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«定时任务信息»»", - "$ref": "#/definitions/统一响应结果«分页结果«定时任务信息»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "post": { - "tags": [ - "定时任务接口" - ], - "summary": "创建定时任务", - "description": "创建新的定时任务。invokeTarget格式为'Bean名称.方法名'(如wechatSyncService.syncAll),方法必须是无参公开方法。cronExpression为标准6位Cron表达式(秒 分 时 日 月 周)。创建后任务默认为暂停状态(PAUSED),需手动调用[恢复任务]接口启用。\n\n**关联字典**:\n- job_group(任务分组):DEFAULT=默认分组, SYSTEM=系统任务, WECHAT=企微同步, INSURANCE=保险同步\n- job_misfire_policy(执行策略):DEFAULT=默认策略, FIRE_ONCE=立即触发一次, DO_NOTHING=不触发\n- job_status(任务状态):ACTIVE=启用, PAUSED=已暂停\n\n需要SUPER_ADMIN角色。", - "operationId": "createJobUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "request", - "description": "创建定时任务请求", - "required": false, - "schema": { - "originalRef": "创建定时任务请求", - "$ref": "#/definitions/创建定时任务请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«定时任务信息»", - "$ref": "#/definitions/统一响应结果«定时任务信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«定时任务信息»", - "$ref": "#/definitions/统一响应结果«定时任务信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/job/{jobId}": { - "put": { - "tags": [ - "定时任务接口" - ], - "summary": "更新定时任务", - "description": "更新指定定时任务的名称、Cron表达式、调用目标等信息。\n修改Cron表达式后任务将按新的计划执行。\n\n**关联字典**:\n- job_group(任务分组):DEFAULT=默认分组, SYSTEM=系统任务, WECHAT=企微同步, INSURANCE=保险同步\n- job_misfire_policy(执行策略):DEFAULT=默认策略, FIRE_ONCE=立即触发一次, DO_NOTHING=不触发\n\n**权限**:需要SUPER_ADMIN角色。", - "operationId": "updateJobUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "jobId", - "in": "path", - "description": "定时任务ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "in": "body", - "name": "request", - "description": "更新定时任务请求", - "required": false, - "schema": { - "originalRef": "更新定时任务请求", - "$ref": "#/definitions/更新定时任务请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«定时任务信息»", - "$ref": "#/definitions/统一响应结果«定时任务信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«定时任务信息»", - "$ref": "#/definitions/统一响应结果«定时任务信息»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "delete": { - "tags": [ - "定时任务接口" - ], - "summary": "删除定时任务", - "description": "删除指定的定时任务(软删除),同时从调度器中移除该任务。\n\n**权限**:需要SUPER_ADMIN角色。\n**注意**:删除后任务将不再执行,但历史执行日志仍可查看。", - "operationId": "deleteJobUsingDELETE", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "jobId", - "in": "path", - "description": "定时任务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "204": { - "description": "No Content" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/job/{jobId}/logs": { - "get": { - "tags": [ - "定时任务接口" - ], - "summary": "查询任务日志", - "description": "分页查询指定定时任务的执行日志,按执行时间倒序排列。日志包含执行状态(成功/失败)、执行耗时、异常信息等。\n\n**关联字典**:job_log_status(日志状态):SUCCESS=成功, FAIL=失败\n\n需要管理员认证。", - "operationId": "listJobLogsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "jobId", - "in": "path", - "description": "定时任务ID", - "required": false, - "type": "integer", - "format": "int64" - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«定时任务执行日志»»", - "$ref": "#/definitions/统一响应结果«分页结果«定时任务执行日志»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«定时任务执行日志»»", - "$ref": "#/definitions/统一响应结果«分页结果«定时任务执行日志»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/job/{jobId}/pause": { - "post": { - "tags": [ - "定时任务接口" - ], - "summary": "暂停任务", - "description": "暂停指定的定时任务,任务状态变为PAUSED。暂停后任务不再按Cron计划执行,但可通过[恢复任务]接口重新启用。\n\n**关联字典**:job_status(任务状态):ACTIVE=启用, PAUSED=已暂停\n\n需要SUPER_ADMIN角色。", - "operationId": "pauseJobUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "jobId", - "in": "path", - "description": "定时任务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/job/{jobId}/resume": { - "post": { - "tags": [ - "定时任务接口" - ], - "summary": "恢复任务", - "description": "恢复已暂停的定时任务,任务状态变为ACTIVE。恢复后任务按Cron计划继续执行。\n\n**关联字典**:job_status(任务状态):ACTIVE=启用, PAUSED=已暂停\n\n需要SUPER_ADMIN角色。", - "operationId": "resumeJobUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "jobId", - "in": "path", - "description": "定时任务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/job/{jobId}/trigger": { - "post": { - "tags": [ - "定时任务接口" - ], - "summary": "立即执行一次", - "description": "立即触发一次定时任务的执行,不影响原有的Cron计划。无论任务当前状态是ACTIVE还是PAUSED,都可以手动触发。执行结果可在任务日志中查看。需要SUPER_ADMIN角色。", - "operationId": "triggerJobUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "jobId", - "in": "path", - "description": "定时任务ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/wechat/departments": { - "get": { - "tags": [ - "企业微信同步接口" - ], - "summary": "部门列表(部门管理页面)", - "description": "获取已同步的所有企业微信部门列表(平铺结构),用于部门管理页面展示。\n包含部门ID、名称、上级部门ID、排序等信息。\n\n**权限**:需要管理员登录。", - "operationId": "listAllDepartmentsUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«WechatDepartment»»", - "$ref": "#/definitions/统一响应结果«List«WechatDepartment»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«WechatDepartment»»", - "$ref": "#/definitions/统一响应结果«List«WechatDepartment»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/wechat/departments/tree": { - "get": { - "tags": [ - "企业微信同步接口" - ], - "summary": "部门树(下拉筛选)", - "description": "以树形结构返回企业微信部门数据。用于部门筛选下拉框,每个节点包含id/label/children。需要管理员认证。", - "operationId": "listDepartmentsTreeUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«Map«string,object»»»", - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«List«Map«string,object»»»", - "$ref": "#/definitions/统一响应结果«List«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/wechat/sync/all": { - "post": { - "tags": [ - "企业微信同步接口" - ], - "summary": "手动同步全部(部门+用户)", - "description": "一键同步企业微信的部门和用户数据,先同步部门再同步用户。推荐使用此接口而非单独同步,确保部门和用户数据一致性。同步过程为异步执行,接口立即返回成功。需要SUPER_ADMIN角色。", - "operationId": "syncAllUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/wechat/sync/departments": { - "post": { - "tags": [ - "企业微信同步接口" - ], - "summary": "手动同步部门", - "description": "从企业微信拉取最新的部门列表并同步到本地数据库。通常在企业微信后台调整组织架构后手动触发。也可通过定时任务自动执行。需要SUPER_ADMIN角色。", - "operationId": "syncDepartmentsUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/wechat/sync/status": { - "get": { - "tags": [ - "企业微信同步接口" - ], - "summary": "同步状态(最后同步时间)", - "description": "获取企业微信数据的最后同步时间和状态。\n返回部门和用户各自的最后同步时间,用于管理页面展示同步状态。\n\n**权限**:需要管理员登录。", - "operationId": "getSyncStatusUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Map«string,object»»", - "$ref": "#/definitions/统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Map«string,object»»", - "$ref": "#/definitions/统一响应结果«Map«string,object»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/wechat/sync/users": { - "post": { - "tags": [ - "企业微信同步接口" - ], - "summary": "手动同步用户", - "description": "从企业微信拉取所有部门的成员列表并同步到本地数据库。包括姓名、手机号、职位、部门归属等信息。需先同步部门再同步用户,或直接使用[同步全部]接口。需要SUPER_ADMIN角色。", - "operationId": "syncUsersUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/wechat/users": { - "get": { - "tags": [ - "企业微信同步接口" - ], - "summary": "查询企业微信用户(分页+搜索)", - "description": "分页查询已同步的企业微信用户列表。支持按姓名/手机号/职位关键词搜索,按部门ID和状态筛选。status取值:1=已激活 2=已禁用 4=未关注。用于管理员绑定企微账号时选择企微用户。需要管理员认证。\n\n**关联字典**:\n- wechat_user_status(企微用户状态):请求参数status和返回字段status(1=已激活, 2=已禁用, 4=未关注)", - "operationId": "listWechatUsersUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "deptId", - "in": "query", - "description": "部门ID筛选", - "required": false, - "type": "integer", - "format": "int64", - "allowEmptyValue": false - }, - { - "name": "keyword", - "in": "query", - "description": "关键词搜索(姓名/手机/职位)", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "status", - "in": "query", - "description": "状态筛选(1=已激活,2=已禁用,4=未关注)", - "required": false, - "type": "integer", - "format": "int32", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«WechatUser»»", - "$ref": "#/definitions/统一响应结果«分页结果«WechatUser»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«WechatUser»»", - "$ref": "#/definitions/统一响应结果«分页结果«WechatUser»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/designer/dashboard": { - "get": { - "tags": [ - "个人中心(旧路径,已废弃)" - ], - "summary": "工作台概览(已废弃,请使用 /admin/profile/dashboard)", - "description": "已废弃接口,请迁移至 GET /admin/profile/dashboard。\n\n**权限**:需要管理员登录。", - "operationId": "getDashboardUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«定制师工作台VO(重构版)»", - "$ref": "#/definitions/统一响应结果«定制师工作台VO(重构版)»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«定制师工作台VO(重构版)»", - "$ref": "#/definitions/统一响应结果«定制师工作台VO(重构版)»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": true, - "x-order": "2147483647" - } - }, - "/admin/designer/orders": { - "get": { - "tags": [ - "个人中心(旧路径,已废弃)" - ], - "summary": "我的订单列表(已废弃,请使用 /admin/profile/orders)", - "description": "已废弃接口。\n\n**关联字典**:\n- order_status(订单状态):请求参数status和返回字段status", - "operationId": "getMyOrdersUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "keyword", - "required": false, - "type": "string" - }, - { - "name": "page", - "in": "query", - "description": "page", - "required": false, - "type": "integer", - "default": 1, - "format": "int32" - }, - { - "name": "pageSize", - "in": "query", - "description": "pageSize", - "required": false, - "type": "integer", - "default": 20, - "format": "int32" - }, - { - "name": "status", - "in": "query", - "description": "status", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«Map«string,object»»»", - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«Map«string,object»»»", - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": true, - "x-order": "2147483647" - } - }, - "/admin/designer/products": { - "get": { - "tags": [ - "个人中心(旧路径,已废弃)" - ], - "summary": "我的产品列表(已废弃,请使用 /admin/profile/products)", - "description": "已废弃接口。\n\n**关联字典**:\n- product_status(产品状态):请求参数status和返回字段status", - "operationId": "getMyProductsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "keyword", - "required": false, - "type": "string" - }, - { - "name": "page", - "in": "query", - "description": "page", - "required": false, - "type": "integer", - "default": 1, - "format": "int32" - }, - { - "name": "pageSize", - "in": "query", - "description": "pageSize", - "required": false, - "type": "integer", - "default": 20, - "format": "int32" - }, - { - "name": "status", - "in": "query", - "description": "status", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«Map«string,object»»»", - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«Map«string,object»»»", - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": true, - "x-order": "2147483647" - } - }, - "/admin/designer/profile": { - "get": { - "tags": [ - "个人中心(旧路径,已废弃)" - ], - "summary": "获取我的个人资料(已废弃,请使用 /admin/profile/me)", - "description": "已废弃接口。\n\n**关联字典**:\n- designer_cert_level(认证等级):返回字段certLevel(none/bronze/silver/gold/diamond)", - "operationId": "getMyProfileUsingGET", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«定制师个人资料VO»", - "$ref": "#/definitions/统一响应结果«定制师个人资料VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«定制师个人资料VO»", - "$ref": "#/definitions/统一响应结果«定制师个人资料VO»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": true, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "个人中心(旧路径,已废弃)" - ], - "summary": "更新我的个人资料(已废弃,请使用 PUT /admin/profile/me)", - "description": "已废弃接口,请迁移至 PUT /admin/profile/me。\n\n**权限**:需要管理员登录。", - "operationId": "updateMyProfileUsingPUT", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "originalRef": "更新定制师个人资料请求", - "$ref": "#/definitions/更新定制师个人资料请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«定制师个人资料VO»", - "$ref": "#/definitions/统一响应结果«定制师个人资料VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«定制师个人资料VO»", - "$ref": "#/definitions/统一响应结果«定制师个人资料VO»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": true, - "x-order": "2147483647" - } - }, - "/admin/profile/dashboard": { - "get": { - "tags": [ - "个人中心" - ], - "summary": "工作台仪表盘(角色分发,支持时间范围)", - "description": "根据当前管理员角色返回不同的仪表盘数据。CUSTOMIZER(定制师):待处理订单数、产品数、评价统计等。SUPER_ADMIN/ADMIN:全局概览(订单、收入、用户增长等)。ROOM_MANAGER(客房管理):房间分配概览。VEHICLE_MANAGER(车辆管理):车辆调度概览。FINANCE(财务):收支统计。MATERIAL_ADMIN(素材管理):素材库概览。period取值:today=今日 week=本周 month=本月。需要管理员认证。\n\n**关联字典**:\n- order_status(订单状态):仪表盘中订单统计按状态分组展示", - "operationId": "getDashboardUsingGET_1", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "period", - "in": "query", - "description": "时间范围: today/week/month", - "required": false, - "type": "string", - "default": "today", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«object»", - "$ref": "#/definitions/统一响应结果«object»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«object»", - "$ref": "#/definitions/统一响应结果«object»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/profile/me": { - "get": { - "tags": [ - "个人中心" - ], - "summary": "获取我的个人资料", - "description": "获取当前登录管理员的个人资料,根据角色返回不同的资料内容。\n定制师角色会返回认证等级、个人简介、擅长领域等附加信息。\n\n**权限**:需要管理员登录。\n\n**关联字典**:\n- designer_cert_level(认证等级):返回字段certLevel(none/bronze/silver/gold/diamond)", - "operationId": "getMyProfileUsingGET_1", - "produces": [ - "*/*" - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«个人资料VO(角色感知)»", - "$ref": "#/definitions/统一响应结果«个人资料VO(角色感知)»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«个人资料VO(角色感知)»", - "$ref": "#/definitions/统一响应结果«个人资料VO(角色感知)»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - }, - "put": { - "tags": [ - "个人中心" - ], - "summary": "更新我的个人资料", - "description": "更新当前登录管理员的个人资料,支持修改昵称、头像、个人简介等。\n定制师角色可额外更新擅长领域、服务区域等信息。\n\n**权限**:需要管理员登录。", - "operationId": "updateMyProfileUsingPUT_1", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "body", - "required": true, - "schema": { - "originalRef": "更新定制师个人资料请求", - "$ref": "#/definitions/更新定制师个人资料请求" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«个人资料VO(角色感知)»", - "$ref": "#/definitions/统一响应结果«个人资料VO(角色感知)»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«个人资料VO(角色感知)»", - "$ref": "#/definitions/统一响应结果«个人资料VO(角色感知)»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/profile/orders": { - "get": { - "tags": [ - "个人中心" - ], - "summary": "订单列表", - "description": "查询当前定制师的订单列表,支持按状态筛选。\n\n**关联字典**:\n- order_status(订单状态):请求参数status和返回字段status", - "operationId": "getOrdersUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "搜索关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "status", - "in": "query", - "description": "订单状态", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«Map«string,object»»»", - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«Map«string,object»»»", - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/profile/products": { - "get": { - "tags": [ - "个人中心" - ], - "summary": "产品列表", - "description": "查询当前定制师的产品列表,支持按状态筛选。\n\n**关联字典**:\n- product_status(产品状态):请求参数status和返回字段status", - "operationId": "getProductsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "搜索关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "status", - "in": "query", - "description": "产品状态", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«Map«string,object»»»", - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«Map«string,object»»»", - "$ref": "#/definitions/统一响应结果«分页结果«Map«string,object»»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/profile/reviews": { - "get": { - "tags": [ - "个人中心" - ], - "summary": "我的评价列表", - "description": "查询当前定制师收到的评价列表,支持按评价等级筛选。\n\n**关联字典**:\n- rating_level(评价等级):GOOD=好评, MEDIUM=中评, BAD=差评(筛选条件+列表展示)\n", - "operationId": "getReviewsUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "ratingLevel", - "in": "query", - "description": "评价等级: GOOD/MEDIUM/BAD", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«object»", - "$ref": "#/definitions/统一响应结果«object»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«object»", - "$ref": "#/definitions/统一响应结果«object»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/customer": { - "get": { - "tags": [ - "客户管理接口" - ], - "summary": "客户列表", - "description": "分页查询小程序注册的C端用户(客户)列表。支持按昵称/手机号/真实姓名关键词搜索,按状态筛选。status取值:ACTIVE=正常 BANNED=已封禁。需要管理员认证。\n\n**关联字典**:\n- user_status(用户状态):请求参数status和返回字段status(ACTIVE=正常, BANNED=已封禁)\n- gender(性别):返回字段gender(0=女, 1=男)\n- id_card_type(证件类型):返回字段idCardType", - "operationId": "listCustomersUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "keyword", - "in": "query", - "description": "搜索关键词", - "required": false, - "type": "string", - "allowEmptyValue": false - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "type": "integer", - "default": 1, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "pageSize", - "in": "query", - "description": "每页条数", - "required": false, - "type": "integer", - "default": 20, - "format": "int32", - "allowEmptyValue": false - }, - { - "name": "status", - "in": "query", - "description": "状态", - "required": false, - "type": "string", - "allowEmptyValue": false - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«客户信息VO(管理端)»»", - "$ref": "#/definitions/统一响应结果«分页结果«客户信息VO(管理端)»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«分页结果«客户信息VO(管理端)»»", - "$ref": "#/definitions/统一响应结果«分页结果«客户信息VO(管理端)»»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/customer/{userId}": { - "get": { - "tags": [ - "客户管理接口" - ], - "summary": "客户详情", - "description": "获取指定客户的详细信息。\n\n**关联字典**:\n- user_status(用户状态):返回字段status\n- gender(性别):返回字段gender\n- id_card_type(证件类型):返回字段idCardType", - "operationId": "getCustomerUsingGET", - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "userId", - "in": "path", - "description": "用户ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«客户信息VO(管理端)»", - "$ref": "#/definitions/统一响应结果«客户信息VO(管理端)»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«客户信息VO(管理端)»", - "$ref": "#/definitions/统一响应结果«客户信息VO(管理端)»" - } - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/customer/{userId}/ban": { - "post": { - "tags": [ - "客户管理接口" - ], - "summary": "封禁客户", - "description": "封禁指定的C端用户,状态变为BANNED。封禁后该用户无法登录小程序,已有的Token将失效。封禁操作不会删除用户数据,可通过[解封客户]接口恢复。需要管理员认证。", - "operationId": "banCustomerUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "userId", - "in": "path", - "description": "用户ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - }, - "/admin/customer/{userId}/unban": { - "post": { - "tags": [ - "客户管理接口" - ], - "summary": "解封客户", - "description": "解封已封禁的C端用户,状态恢复为ACTIVE。解封后用户可正常登录小程序。需要管理员认证。", - "operationId": "unbanCustomerUsingPOST", - "consumes": [ - "application/json" - ], - "produces": [ - "*/*" - ], - "parameters": [ - { - "name": "userId", - "in": "path", - "description": "用户ID", - "required": false, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "responsesObject": { - "200": { - "description": "OK", - "schema": { - "originalRef": "统一响应结果«Void»", - "$ref": "#/definitions/统一响应结果«Void»" - } - }, - "201": { - "description": "Created" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - }, - "404": { - "description": "Not Found" - } - }, - "security": [ - { - "Authorization": [ - "global" - ] - } - ], - "deprecated": false, - "x-order": "2147483647" - } - } - }, - "definitions": { - "Favorite": { - "type": "object", - "properties": { - "createdAt": { - "type": "string", - "format": "date-time" - }, - "deletedAt": { - "type": "string", - "format": "date-time" - }, - "favoriteId": { - "type": "integer", - "format": "int64" - }, - "targetId": { - "type": "integer", - "format": "int64" - }, - "targetType": { - "type": "string" - }, - "updatedAt": { - "type": "string", - "format": "date-time" - }, - "userId": { - "type": "integer", - "format": "int64" - } - }, - "title": "Favorite" - }, - "Footprint": { - "type": "object", - "properties": { - "createdAt": { - "type": "string", - "format": "date-time" - }, - "deletedAt": { - "type": "string", - "format": "date-time" - }, - "footprintId": { - "type": "integer", - "format": "int64" - }, - "resourceId": { - "type": "integer", - "format": "int64" - }, - "resourceType": { - "type": "string" - }, - "updatedAt": { - "type": "string", - "format": "date-time" - }, - "userId": { - "type": "integer", - "format": "int64" - }, - "visitTime": { - "type": "string", - "format": "date-time" - } - }, - "title": "Footprint" - }, - "Traveler": { - "type": "object", - "properties": { - "birthday": { - "type": "string", - "format": "date" - }, - "createdAt": { - "type": "string", - "format": "date-time" - }, - "deletedAt": { - "type": "string", - "format": "date-time" - }, - "email": { - "type": "string" - }, - "emergencyContact": { - "type": "string" - }, - "emergencyPhone": { - "type": "string" - }, - "gender": { - "type": "string" - }, - "idCardNo": { - "type": "string" - }, - "idCardType": { - "type": "string" - }, - "isDefault": { - "type": "integer", - "format": "int32" - }, - "name": { - "type": "string" - }, - "nationality": { - "type": "string" - }, - "phone": { - "type": "string" - }, - "travelerId": { - "type": "integer", - "format": "int64" - }, - "travelerType": { - "type": "string" - }, - "updatedAt": { - "type": "string", - "format": "date-time" - }, - "userId": { - "type": "integer", - "format": "int64" - } - }, - "title": "Traveler" - }, - "出行人请求": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "birthday": { - "type": "string", - "format": "date", - "example": "1990-01-01", - "description": "出生日期(后端根据此字段自动判断人员类型,未传则默认ADULT)" - }, - "email": { - "type": "string", - "example": "zhangsan@example.com", - "description": "邮箱" - }, - "emergencyContact": { - "type": "string", - "example": "李四", - "description": "紧急联系人姓名" - }, - "emergencyPhone": { - "type": "string", - "example": 13900139000, - "description": "紧急联系人电话" - }, - "gender": { - "type": "string", - "example": 1, - "description": "性别,关联字典gender:1=男, 2=女" - }, - "idCardNo": { - "type": "string", - "example": 110101199001011234, - "description": "证件号码" - }, - "idCardType": { - "type": "string", - "example": "ID_CARD", - "description": "证件类型,关联字典id_card_type:ID_CARD=身份证, PASSPORT=护照" - }, - "isDefault": { - "type": "boolean", - "example": false, - "description": "是否设为默认出行人" - }, - "name": { - "type": "string", - "example": "张三", - "description": "出行人姓名" - }, - "nationality": { - "type": "string", - "example": "中国", - "description": "国籍" - }, - "phone": { - "type": "string", - "example": 13800138000, - "description": "手机号" - } - }, - "title": "出行人请求" - }, - "分页结果«Favorite»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "originalRef": "Favorite", - "$ref": "#/definitions/Favorite" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«Favorite»" - }, - "分页结果«Footprint»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "originalRef": "Footprint", - "$ref": "#/definitions/Footprint" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«Footprint»" - }, - "发送短信验证码请求": { - "type": "object", - "required": [ - "phone" - ], - "properties": { - "phone": { - "type": "string", - "example": 13800138000, - "description": "手机号" - } - }, - "title": "发送短信验证码请求" - }, - "字典VO": { - "type": "object", - "properties": { - "dataList": { - "type": "array", - "description": "字典数据列表", - "items": { - "originalRef": "字典数据项VO", - "$ref": "#/definitions/字典数据项VO" - } - }, - "dictName": { - "type": "string", - "description": "字典名称" - }, - "dictType": { - "type": "string", - "description": "字典类型标识" - } - }, - "title": "字典VO" - }, - "字典数据项VO": { - "type": "object", - "properties": { - "dictLabel": { - "type": "string", - "description": "字典标签" - }, - "dictValue": { - "type": "string", - "description": "字典值" - }, - "remark": { - "type": "string", - "description": "备注(扩展信息,如年龄规则JSON)" - }, - "sort": { - "type": "integer", - "format": "int32", - "description": "排序号" - } - }, - "title": "字典数据项VO" - }, - "微信小程序登录请求": { - "type": "object", - "required": [ - "code" - ], - "properties": { - "avatar": { - "type": "string", - "example": "https://thirdwx.qlogo.cn/xxx", - "description": "用户头像URL" - }, - "code": { - "type": "string", - "example": "0c3NKj000...", - "description": "微信登录授权码" - }, - "nickname": { - "type": "string", - "example": "微信用户", - "description": "用户昵称" - }, - "phoneCode": { - "type": "string", - "example": "0c3NKj000...", - "description": "手机号授权码(用于获取手机号)" - } - }, - "title": "微信小程序登录请求", - "description": "通过wx.login获取code进行登录,首次登录自动注册" - }, - "收藏请求": { - "type": "object", - "required": [ - "targetId", - "targetType" - ], - "properties": { - "targetId": { - "type": "integer", - "format": "int64", - "example": 1, - "description": "收藏目标ID" - }, - "targetType": { - "type": "string", - "example": "SCENIC_SPOT", - "description": "收藏类型,关联字典favorite_resource_type" - } - }, - "title": "收藏请求", - "description": "添加收藏时的请求体,指定收藏的资源类型和ID" - }, - "更新用户资料请求": { - "type": "object", - "properties": { - "avatar": { - "type": "string", - "example": "https://oss.example.com/avatar/1.jpg", - "description": "头像URL" - }, - "birthday": { - "type": "string", - "format": "date", - "example": "1990-01-01", - "description": "出生日期(从身份证号自动解析)" - }, - "email": { - "type": "string", - "example": "zhangsan@example.com", - "description": "邮箱" - }, - "gender": { - "type": "string", - "example": "MALE", - "description": "性别:MALE=男 FEMALE=女(从身份证号自动解析)" - }, - "idCardNo": { - "type": "string", - "example": 110101199001011234, - "description": "证件号码(首次登录必填)" - }, - "idCardType": { - "type": "string", - "example": "ID_CARD", - "description": "证件类型:ID_CARD=身份证 PASSPORT=护照(首次登录必填)" - }, - "nationality": { - "type": "string", - "example": "中国", - "description": "国籍(默认中国)" - }, - "nickname": { - "type": "string", - "example": "旅行达人", - "description": "昵称" - }, - "phone": { - "type": "string", - "example": 13800138000, - "description": "手机号" - }, - "realName": { - "type": "string", - "example": "张三", - "description": "真实姓名(首次登录必填)" - } - }, - "title": "更新用户资料请求" - }, - "用户信息VO": { - "type": "object", - "properties": { - "avatar": { - "type": "string", - "description": "头像URL" - }, - "birthday": { - "type": "string", - "format": "date", - "description": "出生日期" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "email": { - "type": "string", - "description": "邮箱" - }, - "gender": { - "type": "integer", - "format": "int32", - "description": "性别,关联字典gender:1=男, 2=女" - }, - "idCardNo": { - "type": "string", - "description": "证件号码" - }, - "idCardType": { - "type": "string", - "description": "证件类型,关联字典id_card_type:ID_CARD=身份证, PASSPORT=护照" - }, - "nationality": { - "type": "string", - "description": "国籍" - }, - "needProfile": { - "type": "boolean", - "description": "是否需要完善资料(realName为空时为true)" - }, - "nickname": { - "type": "string", - "description": "昵称" - }, - "phone": { - "type": "string", - "description": "手机号(脱敏)" - }, - "realName": { - "type": "string", - "description": "真实姓名" - }, - "status": { - "type": "string", - "description": "状态,关联字典user_status:ACTIVE=正常, BANNED=已封禁" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "userId": { - "type": "integer", - "format": "int64", - "description": "用户ID" - } - }, - "title": "用户信息VO" - }, - "用户登录响应": { - "type": "object", - "properties": { - "avatar": { - "type": "string", - "description": "头像URL" - }, - "isNewUser": { - "type": "boolean", - "description": "是否新用户" - }, - "needProfile": { - "type": "boolean", - "description": "是否需要完善资料(realName为空时为true)" - }, - "nickname": { - "type": "string", - "description": "昵称" - }, - "phone": { - "type": "string", - "description": "手机号" - }, - "token": { - "type": "string", - "description": "登录令牌" - }, - "userId": { - "type": "integer", - "format": "int64", - "description": "用户ID" - } - }, - "title": "用户登录响应" - }, - "短信验证码登录请求": { - "type": "object", - "required": [ - "code", - "phone" - ], - "properties": { - "code": { - "type": "string", - "example": 123456, - "description": "短信验证码(6位数字)" - }, - "phone": { - "type": "string", - "example": 13800138000, - "description": "手机号" - } - }, - "title": "短信验证码登录请求" - }, - "统一响应结果«Favorite»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "Favorite", - "$ref": "#/definitions/Favorite" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«Favorite»" - }, - "统一响应结果«Footprint»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "Footprint", - "$ref": "#/definitions/Footprint" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«Footprint»" - }, - "统一响应结果«List«Traveler»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "Traveler", - "$ref": "#/definitions/Traveler" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«Traveler»»" - }, - "统一响应结果«List«字典VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "字典VO", - "$ref": "#/definitions/字典VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«字典VO»»" - }, - "统一响应结果«Traveler»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "Traveler", - "$ref": "#/definitions/Traveler" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«Traveler»" - }, - "统一响应结果«Void»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«Void»" - }, - "统一响应结果«boolean»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "boolean", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«boolean»" - }, - "统一响应结果«分页结果«Favorite»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分页结果«Favorite»", - "$ref": "#/definitions/分页结果«Favorite»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«分页结果«Favorite»»" - }, - "统一响应结果«分页结果«Footprint»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分页结果«Footprint»", - "$ref": "#/definitions/分页结果«Footprint»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«分页结果«Footprint»»" - }, - "统一响应结果«用户信息VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "用户信息VO", - "$ref": "#/definitions/用户信息VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«用户信息VO»" - }, - "统一响应结果«用户登录响应»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "用户登录响应", - "$ref": "#/definitions/用户登录响应" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«用户登录响应»" - }, - "足迹请求": { - "type": "object", - "required": [ - "resourceId", - "resourceType" - ], - "properties": { - "resourceId": { - "type": "integer", - "format": "int64", - "example": 1, - "description": "资源ID" - }, - "resourceType": { - "type": "string", - "example": "SCENIC_SPOT", - "description": "资源类型,关联字典footprint_resource_type" - } - }, - "title": "足迹请求", - "description": "记录用户浏览足迹时的请求体" - }, - "AdminUser": { - "type": "object", - "properties": { - "adminId": { - "type": "integer", - "format": "int64" - }, - "avatar": { - "type": "string" - }, - "contactQrUrl": { - "type": "string" - }, - "createdAt": { - "type": "string", - "format": "date-time" - }, - "currentRoleId": { - "type": "integer", - "format": "int64" - }, - "effectiveAvatar": { - "type": "string" - }, - "enterpriseWechatDeptNames": { - "type": "string" - }, - "enterpriseWechatId": { - "type": "string" - }, - "enterpriseWechatName": { - "type": "string" - }, - "failedLoginCount": { - "type": "integer", - "format": "int32" - }, - "lockedUntil": { - "type": "string", - "format": "date-time" - }, - "passwordChangedAt": { - "type": "string", - "format": "date-time" - }, - "roleKey": { - "type": "string" - }, - "roleName": { - "type": "string" - }, - "roles": { - "type": "array", - "items": { - "originalRef": "SysRole", - "$ref": "#/definitions/SysRole" - } - }, - "status": { - "type": "string" - }, - "updatedAt": { - "type": "string", - "format": "date-time" - }, - "username": { - "type": "string" - } - }, - "title": "AdminUser" - }, - "SysRole": { - "type": "object", - "properties": { - "createdAt": { - "type": "string", - "format": "date-time" - }, - "remark": { - "type": "string" - }, - "roleId": { - "type": "integer", - "format": "int64" - }, - "roleKey": { - "type": "string" - }, - "roleName": { - "type": "string" - }, - "sortOrder": { - "type": "integer", - "format": "int32" - }, - "status": { - "type": "string" - }, - "updatedAt": { - "type": "string", - "format": "date-time" - } - }, - "title": "SysRole" - }, - "企业微信绑定请求": { - "type": "object", - "properties": { - "enterpriseWechatId": { - "type": "string", - "description": "企业微信ID(为空则解绑)" - }, - "forceRebind": { - "type": "boolean", - "description": "是否强制换绑(当ID已被其他管理员占用时)" - } - }, - "title": "企业微信绑定请求" - }, - "分页结果«AdminUser»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "originalRef": "AdminUser", - "$ref": "#/definitions/AdminUser" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«AdminUser»" - }, - "创建管理员请求": { - "type": "object", - "required": [ - "username" - ], - "properties": { - "roleId": { - "type": "integer", - "format": "int64", - "example": 1, - "description": "角色ID(已废弃,请使用roleIds)" - }, - "roleIds": { - "type": "array", - "example": [ - 1, - 2 - ], - "description": "角色ID列表(多角色)", - "items": { - "type": "integer", - "format": "int64" - } - }, - "username": { - "type": "string", - "example": "zhangsan", - "description": "用户名" - } - }, - "title": "创建管理员请求", - "description": "创建后台管理员账号,默认密码Admin@123456" - }, - "旅行设计师VO": { - "type": "object", - "properties": { - "avatar": { - "type": "string", - "description": "头像URL" - }, - "certLevel": { - "type": "string", - "description": "认证等级:none/bronze/silver/gold/diamond" - }, - "certLevelLabel": { - "type": "string", - "description": "认证等级中文标签" - }, - "certified": { - "type": "boolean", - "description": "是否已认证" - }, - "description": { - "type": "string", - "description": "个人简介" - }, - "experience": { - "type": "integer", - "format": "int32", - "description": "从业年限" - }, - "id": { - "type": "string", - "description": "设计师ID" - }, - "motto": { - "type": "string", - "description": "座右铭" - }, - "name": { - "type": "string", - "description": "设计师姓名" - }, - "phone": { - "type": "string", - "description": "联系电话" - }, - "rating": { - "type": "string", - "description": "评分" - }, - "routeCount": { - "type": "integer", - "format": "int32", - "description": "设计路线数量" - }, - "serviceAreas": { - "type": "array", - "description": "服务区域", - "items": { - "type": "string" - } - }, - "specialties": { - "type": "array", - "description": "擅长领域", - "items": { - "type": "string" - } - } - }, - "title": "旅行设计师VO" - }, - "更新管理员请求": { - "type": "object", - "properties": { - "enterpriseWechatId": { - "type": "string", - "example": 842, - "description": "企业微信用户ID" - }, - "roleId": { - "type": "integer", - "format": "int64", - "example": 1, - "description": "角色ID(已废弃,请使用roleIds)" - }, - "roleIds": { - "type": "array", - "example": [ - 1, - 2 - ], - "description": "角色ID列表(多角色)", - "items": { - "type": "integer", - "format": "int64" - } - } - }, - "title": "更新管理员请求" - }, - "统一响应结果«AdminUser»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "AdminUser", - "$ref": "#/definitions/AdminUser" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«AdminUser»" - }, - "统一响应结果«List«旅行设计师VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "旅行设计师VO", - "$ref": "#/definitions/旅行设计师VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«旅行设计师VO»»" - }, - "统一响应结果«Map«string,object»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "object", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«Map«string,object»»" - }, - "统一响应结果«分页结果«AdminUser»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分页结果«AdminUser»", - "$ref": "#/definitions/分页结果«AdminUser»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«分页结果«AdminUser»»" - }, - "Banner VO": { - "type": "object", - "properties": { - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "endTime": { - "type": "string", - "format": "date-time", - "description": "展示结束时间" - }, - "id": { - "type": "string", - "description": "Banner ID" - }, - "imageUrl": { - "type": "string", - "description": "图片URL(图片类型为图片,视频类型为封面图)" - }, - "linkId": { - "type": "string", - "description": "链接目标ID(PRODUCT/SCENIC/ACTIVITY/HOTEL时有值)" - }, - "linkTargetName": { - "type": "string", - "description": "链接目标名称(用于后台展示)" - }, - "linkType": { - "type": "string", - "description": "链接类型:NONE=无链接 PRODUCT=产品 SCENIC=景区 ACTIVITY=活动 HOTEL=酒店 PAGE=小程序页面 WEBVIEW=网页" - }, - "linkUrl": { - "type": "string", - "description": "链接URL(PAGE时为路由名,WEBVIEW时为完整URL)" - }, - "materialId": { - "type": "integer", - "format": "int64", - "description": "素材库关联ID" - }, - "mediaType": { - "type": "string", - "description": "媒体类型: IMAGE/VIDEO" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序号" - }, - "startTime": { - "type": "string", - "format": "date-time", - "description": "展示开始时间" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下线 1=上线" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "tags": { - "type": "array", - "description": "标签列表", - "items": { - "type": "string" - } - }, - "title": { - "type": "string", - "description": "标题" - }, - "videoUrl": { - "type": "string", - "description": "视频URL(媒体类型为VIDEO时有值)" - } - }, - "title": "Banner VO" - }, - "Banner请求": { - "type": "object", - "required": [ - "imageUrl", - "title" - ], - "properties": { - "endTime": { - "type": "string", - "format": "date-time", - "example": "2026-03-31T23:59:59", - "description": "展示结束时间" - }, - "imageUrl": { - "type": "string", - "example": "https://oss.example.com/banner/1.jpg", - "description": "Banner图片URL(图片类型时为图片,视频类型时为封面图)" - }, - "linkId": { - "type": "string", - "example": 1, - "description": "链接目标ID(linkType=PRODUCT时为产品ID)" - }, - "linkTargetName": { - "type": "string", - "example": "甘南秘境之旅", - "description": "链接目标名称(用于后台展示)" - }, - "linkType": { - "type": "string", - "example": "PRODUCT", - "description": "链接类型:NONE=无链接 PRODUCT=产品 SCENIC=景区 ACTIVITY=活动 HOTEL=酒店 PAGE=小程序页面 WEBVIEW=网页" - }, - "linkUrl": { - "type": "string", - "example": "https://example.com", - "description": "链接URL(linkType=WEBVIEW/PAGE时生效)" - }, - "materialId": { - "type": "integer", - "format": "int64", - "description": "素材库关联ID(从素材库选择时传入)" - }, - "mediaType": { - "type": "string", - "example": "IMAGE", - "description": "媒体类型: IMAGE/VIDEO" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序号(越小越靠前)" - }, - "startTime": { - "type": "string", - "format": "date-time", - "example": "2026-03-01T00:00:00", - "description": "展示开始时间" - }, - "status": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "状态:0=下线 1=上线" - }, - "subtitle": { - "type": "string", - "example": "限时优惠,不容错过", - "description": "副标题" - }, - "tags": { - "type": "string", - "example": "热门,推荐", - "description": "标签(逗号分隔)" - }, - "title": { - "type": "string", - "example": "春季特惠", - "description": "Banner标题" - }, - "videoUrl": { - "type": "string", - "example": "https://oss.example.com/banner/1.mp4", - "description": "视频URL(媒体类型为VIDEO时必填)" - } - }, - "title": "Banner请求" - }, - "分页结果«Banner VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "originalRef": "Banner VO", - "$ref": "#/definitions/Banner VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«Banner VO»" - }, - "统一响应结果«Banner VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "Banner VO", - "$ref": "#/definitions/Banner VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«Banner VO»" - }, - "统一响应结果«分页结果«Banner VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分页结果«Banner VO»", - "$ref": "#/definitions/分页结果«Banner VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«分页结果«Banner VO»»" - }, - "分页结果«联系我们 VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "originalRef": "联系我们 VO", - "$ref": "#/definitions/联系我们 VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«联系我们 VO»" - }, - "统一响应结果«分页结果«联系我们 VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分页结果«联系我们 VO»", - "$ref": "#/definitions/分页结果«联系我们 VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«分页结果«联系我们 VO»»" - }, - "统一响应结果«联系我们 VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "联系我们 VO", - "$ref": "#/definitions/联系我们 VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«联系我们 VO»" - }, - "联系我们 VO": { - "type": "object", - "properties": { - "channelType": { - "type": "string", - "description": "渠道类型,关联字典contact_channel_type:ABOUT=关于我们, ONLINE_CS=在线客服, PHONE=电话咨询" - }, - "content": { - "type": "string", - "description": "富文本内容(关于我们类型使用)" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "icon": { - "type": "string", - "description": "图标URL" - }, - "id": { - "type": "string", - "description": "联系方式ID" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序号" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态,关联字典common_status:ACTIVE=启用, INACTIVE=停用" - }, - "subtitle": { - "type": "string", - "description": "副标题/描述" - }, - "title": { - "type": "string", - "description": "标题" - }, - "value": { - "type": "string", - "description": "渠道值" - } - }, - "title": "联系我们 VO" - }, - "联系我们请求": { - "type": "object", - "required": [ - "channelType", - "title" - ], - "properties": { - "channelType": { - "type": "string", - "example": "PHONE", - "description": "渠道类型,关联字典contact_channel_type:ABOUT=关于我们, ONLINE_CS=在线客服, PHONE=电话咨询" - }, - "content": { - "type": "string", - "description": "富文本内容(关于我们类型使用)" - }, - "icon": { - "type": "string", - "example": "https://oss.example.com/icon/phone.png", - "description": "图标URL" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序号(越小越靠前)" - }, - "status": { - "type": "integer", - "format": "int32", - "example": "ACTIVE", - "description": "状态,关联字典common_status:ACTIVE=启用, INACTIVE=停用" - }, - "subtitle": { - "type": "string", - "example": "客服热线", - "description": "副标题/描述" - }, - "title": { - "type": "string", - "example": "电话咨询", - "description": "标题" - }, - "value": { - "type": "string", - "example": "400-000-0000", - "description": "渠道值(电话号码/客服链接等)" - } - }, - "title": "联系我们请求" - }, - "分页结果«探索分类 VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "originalRef": "探索分类 VO", - "$ref": "#/definitions/探索分类 VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«探索分类 VO»" - }, - "探索分类 VO": { - "type": "object", - "properties": { - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "favoriteCount": { - "type": "integer", - "format": "int32", - "description": "收藏数" - }, - "iconUrl": { - "type": "string", - "description": "图标URL" - }, - "id": { - "type": "string", - "description": "分类ID" - }, - "likeCount": { - "type": "integer", - "format": "int32", - "description": "点赞数" - }, - "resourceCount": { - "type": "integer", - "format": "int32", - "description": "关联资源数量" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序号" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下线 1=上线" - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "title": { - "type": "string", - "description": "分类标题" - }, - "viewCount": { - "type": "integer", - "format": "int32", - "description": "浏览量" - } - }, - "title": "探索分类 VO" - }, - "探索分类关联资源项": { - "type": "object", - "properties": { - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "description": { - "type": "string", - "description": "资源简介(支持HTML)" - }, - "resourceId": { - "type": "string", - "description": "资源ID" - }, - "resourceName": { - "type": "string", - "description": "资源名称" - }, - "resourceType": { - "type": "string", - "description": "资源类型" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序号" - } - }, - "title": "探索分类关联资源项" - }, - "探索分类详情 VO": { - "type": "object", - "properties": { - "coverUrl": { - "type": "string", - "description": "封面图URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "description": { - "type": "string", - "description": "分类描述" - }, - "favoriteCount": { - "type": "integer", - "format": "int32", - "description": "收藏数" - }, - "iconUrl": { - "type": "string", - "description": "图标URL" - }, - "id": { - "type": "string", - "description": "分类ID" - }, - "isFavorited": { - "type": "boolean", - "description": "当前用户是否已收藏" - }, - "isLiked": { - "type": "boolean", - "description": "当前用户是否已点赞" - }, - "likeCount": { - "type": "integer", - "format": "int32", - "description": "点赞数" - }, - "resources": { - "type": "array", - "description": "关联资源列表", - "items": { - "originalRef": "探索分类关联资源项", - "$ref": "#/definitions/探索分类关联资源项" - } - }, - "subtitle": { - "type": "string", - "description": "副标题" - }, - "title": { - "type": "string", - "description": "分类标题" - }, - "viewCount": { - "type": "integer", - "format": "int32", - "description": "浏览量" - } - }, - "title": "探索分类详情 VO" - }, - "探索分类请求": { - "type": "object", - "required": [ - "coverUrl", - "title" - ], - "properties": { - "coverUrl": { - "type": "string", - "example": "https://oss.example.com/explore/cover.jpg", - "description": "封面图URL" - }, - "description": { - "type": "string", - "example": "阳光沙滩,碧海蓝天", - "description": "分类描述" - }, - "iconUrl": { - "type": "string", - "example": "https://oss.example.com/explore/icon.png", - "description": "图标URL" - }, - "resources": { - "type": "array", - "description": "关联资源列表", - "items": { - "originalRef": "探索分类资源请求", - "$ref": "#/definitions/探索分类资源请求" - } - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序号(越小越靠前)" - }, - "status": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "状态:0=下线 1=上线" - }, - "subtitle": { - "type": "string", - "example": "精选海岛度假目的地", - "description": "副标题" - }, - "title": { - "type": "string", - "example": "海岛度假", - "description": "分类标题" - } - }, - "title": "探索分类请求" - }, - "探索分类资源请求": { - "type": "object", - "properties": { - "coverUrl": { - "type": "string", - "example": "https://oss.example.com/scenic/1.jpg", - "description": "封面图URL" - }, - "description": { - "type": "string", - "description": "资源简介(支持HTML)" - }, - "resourceId": { - "type": "integer", - "format": "int64", - "example": 100, - "description": "资源ID" - }, - "resourceName": { - "type": "string", - "example": "西湖风景区", - "description": "资源名称" - }, - "resourceType": { - "type": "string", - "example": "SCENIC_SPOT", - "description": "资源类型" - } - }, - "title": "探索分类资源请求" - }, - "统一响应结果«分页结果«探索分类 VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分页结果«探索分类 VO»", - "$ref": "#/definitions/分页结果«探索分类 VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«分页结果«探索分类 VO»»" - }, - "统一响应结果«探索分类详情 VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "探索分类详情 VO", - "$ref": "#/definitions/探索分类详情 VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«探索分类详情 VO»" - }, - "分页结果«前端配置 VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "originalRef": "前端配置 VO", - "$ref": "#/definitions/前端配置 VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«前端配置 VO»" - }, - "前端配置 VO": { - "type": "object", - "properties": { - "configGroup": { - "type": "string", - "description": "配置分组: COLOR/PAGE/SECRET/GENERAL" - }, - "configKey": { - "type": "string", - "description": "配置键" - }, - "configType": { - "type": "string", - "description": "值类型" - }, - "configValue": { - "type": "string", - "description": "配置值(SECRET类型脱敏)" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "description": { - "type": "string", - "description": "配置项描述" - }, - "id": { - "type": "string", - "description": "配置ID" - }, - "label": { - "type": "string", - "description": "配置项中文名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序号" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态: 0=禁用 1=启用" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "前端配置 VO" - }, - "前端配置请求": { - "type": "object", - "required": [ - "configGroup", - "configKey", - "configType", - "label" - ], - "properties": { - "configGroup": { - "type": "string", - "example": "COLOR", - "description": "配置分组" - }, - "configKey": { - "type": "string", - "example": "primaryColor", - "description": "配置键" - }, - "configType": { - "type": "string", - "example": "COLOR", - "description": "值类型" - }, - "configValue": { - "type": "string", - "example": "#1890FF", - "description": "配置值" - }, - "description": { - "type": "string", - "example": "系统主色调", - "description": "配置项描述" - }, - "label": { - "type": "string", - "example": "主题色", - "description": "配置项中文名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "排序号" - }, - "status": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "状态: 0=禁用 1=启用" - } - }, - "title": "前端配置请求" - }, - "统一响应结果«List«string»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "type": "string" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«string»»" - }, - "统一响应结果«List«前端配置 VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "前端配置 VO", - "$ref": "#/definitions/前端配置 VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«前端配置 VO»»" - }, - "统一响应结果«分页结果«前端配置 VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分页结果«前端配置 VO»", - "$ref": "#/definitions/分页结果«前端配置 VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«分页结果«前端配置 VO»»" - }, - "统一响应结果«前端配置 VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "前端配置 VO", - "$ref": "#/definitions/前端配置 VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«前端配置 VO»" - }, - "常见问题分类VO": { - "type": "object", - "properties": { - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "id": { - "type": "integer", - "format": "int64", - "description": "分类ID" - }, - "items": { - "type": "array", - "description": "条目列表(仅内部接口返回)", - "items": { - "originalRef": "常见问题条目VO", - "$ref": "#/definitions/常见问题条目VO" - } - }, - "name": { - "type": "string", - "description": "分类名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序号" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=禁用 1=启用" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "常见问题分类VO" - }, - "常见问题分类请求": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "type": "string", - "example": "常见问题", - "description": "分类名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序号" - }, - "status": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "状态:0=禁用 1=启用" - } - }, - "title": "常见问题分类请求" - }, - "常见问题条目VO": { - "type": "object", - "properties": { - "answer": { - "type": "string", - "description": "回答" - }, - "categoryId": { - "type": "integer", - "format": "int64", - "description": "所属分类ID" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "id": { - "type": "integer", - "format": "int64", - "description": "条目ID" - }, - "question": { - "type": "string", - "description": "问题" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序号" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=禁用 1=启用" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "常见问题条目VO" - }, - "常见问题条目请求": { - "type": "object", - "required": [ - "categoryId", - "question" - ], - "properties": { - "answer": { - "type": "string", - "example": "您可以在首页浏览路线产品...", - "description": "回答(支持富文本)" - }, - "categoryId": { - "type": "integer", - "format": "int64", - "description": "所属分类ID" - }, - "question": { - "type": "string", - "example": "如何预订行程?", - "description": "问题" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序号" - }, - "status": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "状态:0=禁用 1=启用" - } - }, - "title": "常见问题条目请求" - }, - "统一响应结果«List«常见问题分类VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "常见问题分类VO", - "$ref": "#/definitions/常见问题分类VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«常见问题分类VO»»" - }, - "统一响应结果«List«常见问题条目VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "常见问题条目VO", - "$ref": "#/definitions/常见问题条目VO" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«常见问题条目VO»»" - }, - "统一响应结果«常见问题分类VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "常见问题分类VO", - "$ref": "#/definitions/常见问题分类VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«常见问题分类VO»" - }, - "统一响应结果«常见问题条目VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "常见问题条目VO", - "$ref": "#/definitions/常见问题条目VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«常见问题条目VO»" - }, - "分页结果«协议 VO»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "originalRef": "协议 VO", - "$ref": "#/definitions/协议 VO" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«协议 VO»" - }, - "协议 VO": { - "type": "object", - "properties": { - "content": { - "type": "string", - "description": "协议内容(HTML富文本)" - }, - "createTime": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "id": { - "type": "string", - "description": "协议ID" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "排序号" - }, - "status": { - "type": "integer", - "format": "int32", - "description": "状态:0=下线 1=上线" - }, - "title": { - "type": "string", - "description": "协议标题" - }, - "type": { - "type": "string", - "description": "协议类型标识" - }, - "updateTime": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "version": { - "type": "string", - "description": "版本号" - } - }, - "title": "协议 VO" - }, - "协议请求": { - "type": "object", - "required": [ - "content", - "title", - "type" - ], - "properties": { - "content": { - "type": "string", - "description": "协议内容(HTML富文本)" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序号(越小越靠前)" - }, - "status": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "状态:0=下线 1=上线" - }, - "title": { - "type": "string", - "example": "隐私政策", - "description": "协议标题" - }, - "type": { - "type": "string", - "example": "privacy", - "description": "协议类型标识(唯一)" - }, - "version": { - "type": "string", - "example": 1.0, - "description": "版本号" - } - }, - "title": "协议请求" - }, - "统一响应结果«分页结果«协议 VO»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分页结果«协议 VO»", - "$ref": "#/definitions/分页结果«协议 VO»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«分页结果«协议 VO»»" - }, - "统一响应结果«协议 VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "协议 VO", - "$ref": "#/definitions/协议 VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«协议 VO»" - }, - "二次验证请求": { - "type": "object", - "required": [ - "code" - ], - "properties": { - "code": { - "type": "string", - "example": 123456, - "description": "验证码" - } - }, - "title": "二次验证请求" - }, - "修改密码请求": { - "type": "object", - "required": [ - "newPassword", - "oldPassword" - ], - "properties": { - "newPassword": { - "type": "string", - "example": "NewPass@456", - "description": "新密码(8-128位,须含大小写字母和数字)" - }, - "oldPassword": { - "type": "string", - "example": "OldPass@123", - "description": "旧密码" - } - }, - "title": "修改密码请求" - }, - "头像更新请求": { - "type": "object", - "required": [ - "avatar" - ], - "properties": { - "avatar": { - "type": "string", - "description": "头像URL" - }, - "fileId": { - "type": "integer", - "format": "int64", - "description": "文件ID" - } - }, - "title": "头像更新请求", - "description": "更新管理员头像,需先通过文件服务上传图片" - }, - "管理员登录响应": { - "type": "object", - "properties": { - "adminId": { - "type": "integer", - "format": "int64", - "description": "管理员ID" - }, - "avatar": { - "type": "string", - "description": "头像URL" - }, - "requireTwoFa": { - "type": "boolean", - "description": "是否需要二次验证" - }, - "requireWechatBind": { - "type": "boolean", - "description": "是否需要绑定企业微信" - }, - "role": { - "type": "string", - "description": "角色标识(主角色)" - }, - "roleName": { - "type": "string", - "description": "角色名称(主角色)" - }, - "roles": { - "type": "array", - "description": "角色列表(多角色)", - "items": { - "originalRef": "角色信息", - "$ref": "#/definitions/角色信息" - } - }, - "token": { - "type": "string", - "description": "登录令牌" - }, - "username": { - "type": "string", - "description": "用户名" - } - }, - "title": "管理员登录响应" - }, - "管理员登录请求": { - "type": "object", - "required": [ - "password", - "username" - ], - "properties": { - "password": { - "type": "string", - "example": "Admin@2026", - "description": "密码" - }, - "username": { - "type": "string", - "example": "admin", - "description": "用户名" - } - }, - "title": "管理员登录请求", - "description": "后台管理员通过用户名+密码登录,新设备首次登录需2FA验证" - }, - "统一响应结果«管理员登录响应»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "管理员登录响应", - "$ref": "#/definitions/管理员登录响应" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«管理员登录响应»" - }, - "角色信息": { - "type": "object", - "properties": { - "roleId": { - "type": "integer", - "format": "int64", - "description": "角色ID" - }, - "roleKey": { - "type": "string", - "description": "角色标识" - }, - "roleName": { - "type": "string", - "description": "角色名称" - } - }, - "title": "角色信息" - }, - "角色切换请求": { - "type": "object", - "required": [ - "roleId" - ], - "properties": { - "roleId": { - "type": "integer", - "format": "int64", - "description": "目标角色ID" - } - }, - "title": "角色切换请求", - "description": "多角色管理员切换当前活跃角色" - }, - "分配菜单权限请求": { - "type": "object", - "required": [ - "menuIds" - ], - "properties": { - "menuIds": { - "type": "array", - "example": [ - 1, - 2, - 3 - ], - "description": "菜单ID列表", - "items": { - "type": "integer", - "format": "int64" - } - } - }, - "title": "分配菜单权限请求" - }, - "分页结果«SysRole»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "originalRef": "SysRole", - "$ref": "#/definitions/SysRole" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«SysRole»" - }, - "创建角色请求": { - "type": "object", - "required": [ - "roleKey", - "roleName" - ], - "properties": { - "remark": { - "type": "string", - "example": "负责日常运营管理", - "description": "备注" - }, - "roleKey": { - "type": "string", - "example": "OPERATOR", - "description": "角色标识" - }, - "roleName": { - "type": "string", - "example": "运营专员", - "description": "角色名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序号" - } - }, - "title": "创建角色请求" - }, - "更新角色请求": { - "type": "object", - "properties": { - "remark": { - "type": "string", - "example": "负责日常运营管理", - "description": "备注" - }, - "roleName": { - "type": "string", - "example": "运营专员", - "description": "角色名称" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序号" - }, - "status": { - "type": "string", - "example": "ACTIVE", - "description": "状态:ACTIVE=启用 DISABLED=禁用" - } - }, - "title": "更新角色请求" - }, - "统一响应结果«List«SysRole»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "SysRole", - "$ref": "#/definitions/SysRole" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«SysRole»»" - }, - "统一响应结果«SysRole»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "SysRole", - "$ref": "#/definitions/SysRole" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«SysRole»" - }, - "统一响应结果«分页结果«SysRole»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分页结果«SysRole»", - "$ref": "#/definitions/分页结果«SysRole»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«分页结果«SysRole»»" - }, - "SysMenu": { - "type": "object", - "properties": { - "children": { - "type": "array", - "items": { - "originalRef": "SysMenu", - "$ref": "#/definitions/SysMenu" - } - }, - "component": { - "type": "string" - }, - "createdAt": { - "type": "string", - "format": "date-time" - }, - "icon": { - "type": "string" - }, - "isCache": { - "type": "boolean" - }, - "menuId": { - "type": "integer", - "format": "int64" - }, - "menuName": { - "type": "string" - }, - "menuType": { - "type": "string" - }, - "parentId": { - "type": "integer", - "format": "int64" - }, - "path": { - "type": "string" - }, - "permissionCode": { - "type": "string" - }, - "sortOrder": { - "type": "integer", - "format": "int32" - }, - "status": { - "type": "string" - }, - "updatedAt": { - "type": "string", - "format": "date-time" - }, - "visible": { - "type": "boolean" - } - }, - "title": "SysMenu" - }, - "创建菜单请求": { - "type": "object", - "required": [ - "menuName", - "menuType" - ], - "properties": { - "component": { - "type": "string", - "example": "system/user/index", - "description": "组件路径" - }, - "icon": { - "type": "string", - "example": "user", - "description": "菜单图标" - }, - "isCache": { - "type": "boolean", - "example": true, - "description": "是否缓存(true=缓存 false=不缓存)" - }, - "menuName": { - "type": "string", - "example": "用户管理", - "description": "菜单名称" - }, - "menuType": { - "type": "string", - "example": "M", - "description": "菜单类型:D=目录 M=菜单 B=按钮(关联字典menu_type)" - }, - "parentId": { - "type": "integer", - "format": "int64", - "example": 0, - "description": "父菜单ID(顶级菜单为空)" - }, - "path": { - "type": "string", - "example": "/system/user", - "description": "路由路径" - }, - "permissionCode": { - "type": "string", - "example": "system:user:list", - "description": "权限标识" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序号" - }, - "visible": { - "type": "boolean", - "example": true, - "description": "是否可见" - } - }, - "title": "创建菜单请求" - }, - "更新菜单请求": { - "type": "object", - "properties": { - "component": { - "type": "string", - "example": "system/user/index", - "description": "组件路径" - }, - "icon": { - "type": "string", - "example": "user", - "description": "菜单图标" - }, - "isCache": { - "type": "boolean", - "example": true, - "description": "是否缓存(true=缓存 false=不缓存)" - }, - "menuName": { - "type": "string", - "example": "用户管理", - "description": "菜单名称" - }, - "menuType": { - "type": "string", - "example": "M", - "description": "菜单类型:D=目录 M=菜单 B=按钮(关联字典menu_type)" - }, - "parentId": { - "type": "integer", - "format": "int64", - "example": 0, - "description": "父菜单ID" - }, - "path": { - "type": "string", - "example": "/system/user", - "description": "路由路径" - }, - "permissionCode": { - "type": "string", - "example": "system:user:list", - "description": "权限标识" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序号" - }, - "status": { - "type": "string", - "example": "ACTIVE", - "description": "状态:ACTIVE=启用 DISABLED=禁用" - }, - "visible": { - "type": "boolean", - "example": true, - "description": "是否可见" - } - }, - "title": "更新菜单请求" - }, - "统一响应结果«List«SysMenu»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "SysMenu", - "$ref": "#/definitions/SysMenu" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«SysMenu»»" - }, - "统一响应结果«SysMenu»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "SysMenu", - "$ref": "#/definitions/SysMenu" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«SysMenu»" - }, - "SysDictData": { - "type": "object", - "properties": { - "createdAt": { - "type": "string", - "format": "date-time" - }, - "dictDataId": { - "type": "integer", - "format": "int64" - }, - "dictLabel": { - "type": "string" - }, - "dictType": { - "type": "string" - }, - "dictValue": { - "type": "string" - }, - "remark": { - "type": "string" - }, - "sortOrder": { - "type": "integer", - "format": "int32" - }, - "status": { - "type": "string" - }, - "updatedAt": { - "type": "string", - "format": "date-time" - } - }, - "title": "SysDictData" - }, - "SysDictType": { - "type": "object", - "properties": { - "category": { - "type": "string" - }, - "createdAt": { - "type": "string", - "format": "date-time" - }, - "dictName": { - "type": "string" - }, - "dictType": { - "type": "string" - }, - "dictTypeId": { - "type": "integer", - "format": "int64" - }, - "remark": { - "type": "string" - }, - "status": { - "type": "string" - }, - "updatedAt": { - "type": "string", - "format": "date-time" - } - }, - "title": "SysDictType" - }, - "分页结果«SysDictType»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "originalRef": "SysDictType", - "$ref": "#/definitions/SysDictType" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«SysDictType»" - }, - "创建字典数据请求": { - "type": "object", - "required": [ - "dictLabel", - "dictType", - "dictValue" - ], - "properties": { - "dictLabel": { - "type": "string", - "example": "男", - "description": "字典标签" - }, - "dictType": { - "type": "string", - "example": "sys_gender", - "description": "字典类型" - }, - "dictValue": { - "type": "string", - "example": 1, - "description": "字典值" - }, - "remark": { - "type": "string", - "example": "男性", - "description": "备注" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序号" - } - }, - "title": "创建字典数据请求" - }, - "创建字典类型请求": { - "type": "object", - "required": [ - "dictName", - "dictType" - ], - "properties": { - "category": { - "type": "string", - "example": "BASE", - "description": "字典分类(如BASE=基础字典, BUSINESS=业务字典,也可自定义)" - }, - "dictName": { - "type": "string", - "example": "性别", - "description": "字典名称" - }, - "dictType": { - "type": "string", - "example": "sys_gender", - "description": "字典类型标识" - }, - "remark": { - "type": "string", - "example": "用户性别字典", - "description": "备注" - } - }, - "title": "创建字典类型请求" - }, - "更新字典数据请求": { - "type": "object", - "properties": { - "dictLabel": { - "type": "string", - "example": "男", - "description": "字典标签" - }, - "dictValue": { - "type": "string", - "example": 1, - "description": "字典值" - }, - "remark": { - "type": "string", - "example": "男性", - "description": "备注" - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "排序号" - }, - "status": { - "type": "string", - "example": "ACTIVE", - "description": "状态:ACTIVE=启用 DISABLED=禁用" - } - }, - "title": "更新字典数据请求" - }, - "更新字典类型请求": { - "type": "object", - "properties": { - "dictName": { - "type": "string", - "example": "性别", - "description": "字典名称" - }, - "remark": { - "type": "string", - "example": "用户性别字典", - "description": "备注" - }, - "status": { - "type": "string", - "example": "ACTIVE", - "description": "状态:ACTIVE=启用 DISABLED=禁用" - } - }, - "title": "更新字典类型请求" - }, - "统一响应结果«List«SysDictData»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "SysDictData", - "$ref": "#/definitions/SysDictData" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«SysDictData»»" - }, - "统一响应结果«SysDictData»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "SysDictData", - "$ref": "#/definitions/SysDictData" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«SysDictData»" - }, - "统一响应结果«SysDictType»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "SysDictType", - "$ref": "#/definitions/SysDictType" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«SysDictType»" - }, - "统一响应结果«分页结果«SysDictType»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分页结果«SysDictType»", - "$ref": "#/definitions/分页结果«SysDictType»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«分页结果«SysDictType»»" - }, - "分页结果«定时任务信息»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "originalRef": "定时任务信息", - "$ref": "#/definitions/定时任务信息" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«定时任务信息»" - }, - "分页结果«定时任务执行日志»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "originalRef": "定时任务执行日志", - "$ref": "#/definitions/定时任务执行日志" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«定时任务执行日志»" - }, - "创建定时任务请求": { - "type": "object", - "required": [ - "cronExpression", - "invokeTarget", - "jobName" - ], - "properties": { - "concurrent": { - "type": "boolean", - "example": false, - "description": "是否允许并发执行" - }, - "cronExpression": { - "type": "string", - "example": "0 0 2 * * ?", - "description": "Cron表达式,标准6位(秒 分 时 日 月 周)" - }, - "invokeTarget": { - "type": "string", - "example": "wechatSyncService.syncDepartments", - "description": "调用目标(Bean名称.方法名),方法必须是无参公开方法" - }, - "jobGroup": { - "type": "string", - "example": "SYSTEM", - "description": "任务分组,字典类型:job_group(DEFAULT=默认分组, SYSTEM=系统任务, WECHAT=企微同步, INSURANCE=保险同步)" - }, - "jobName": { - "type": "string", - "example": "同步企微通讯录", - "description": "任务名称" - }, - "misfirePolicy": { - "type": "string", - "example": "DEFAULT", - "description": "计划执行策略,字典类型:job_misfire_policy(DEFAULT=默认策略, FIRE_ONCE=立即触发一次, DO_NOTHING=不触发)" - }, - "remark": { - "type": "string", - "example": "每天凌晨2点同步企微通讯录", - "description": "备注" - } - }, - "title": "创建定时任务请求" - }, - "定时任务信息": { - "type": "object", - "properties": { - "concurrent": { - "type": "boolean", - "description": "是否允许并发执行" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "cronExpression": { - "type": "string", - "description": "Cron表达式" - }, - "invokeTarget": { - "type": "string", - "description": "调用目标(Bean名称.方法名)" - }, - "jobGroup": { - "type": "string", - "description": "任务分组" - }, - "jobId": { - "type": "integer", - "format": "int64", - "description": "任务ID" - }, - "jobName": { - "type": "string", - "description": "任务名称" - }, - "misfirePolicy": { - "type": "string", - "description": "计划执行策略" - }, - "remark": { - "type": "string", - "description": "备注" - }, - "status": { - "type": "string", - "description": "任务状态" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "定时任务信息" - }, - "定时任务执行日志": { - "type": "object", - "properties": { - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "endTime": { - "type": "string", - "format": "date-time", - "description": "结束时间" - }, - "invokeTarget": { - "type": "string", - "description": "调用目标" - }, - "jobId": { - "type": "integer", - "format": "int64", - "description": "任务ID" - }, - "jobLogId": { - "type": "integer", - "format": "int64", - "description": "日志ID" - }, - "jobName": { - "type": "string", - "description": "任务名称" - }, - "message": { - "type": "string", - "description": "执行结果/异常信息" - }, - "startTime": { - "type": "string", - "format": "date-time", - "description": "开始时间" - }, - "status": { - "type": "string", - "description": "执行状态" - } - }, - "title": "定时任务执行日志" - }, - "更新定时任务请求": { - "type": "object", - "properties": { - "concurrent": { - "type": "boolean", - "example": false, - "description": "是否允许并发执行" - }, - "cronExpression": { - "type": "string", - "example": "0 0 2 * * ?", - "description": "Cron表达式,标准6位(秒 分 时 日 月 周)" - }, - "invokeTarget": { - "type": "string", - "example": "wechatSyncService.syncDepartments", - "description": "调用目标(Bean名称.方法名),方法必须是无参公开方法" - }, - "jobGroup": { - "type": "string", - "example": "SYSTEM", - "description": "任务分组,字典类型:job_group(DEFAULT=默认分组, SYSTEM=系统任务, WECHAT=企微同步, INSURANCE=保险同步)" - }, - "jobName": { - "type": "string", - "example": "同步企微通讯录", - "description": "任务名称" - }, - "misfirePolicy": { - "type": "string", - "example": "DEFAULT", - "description": "计划执行策略,字典类型:job_misfire_policy(DEFAULT=默认策略, FIRE_ONCE=立即触发一次, DO_NOTHING=不触发)" - }, - "remark": { - "type": "string", - "example": "每天凌晨2点同步企微通讯录", - "description": "备注" - } - }, - "title": "更新定时任务请求" - }, - "统一响应结果«分页结果«定时任务信息»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分页结果«定时任务信息»", - "$ref": "#/definitions/分页结果«定时任务信息»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«分页结果«定时任务信息»»" - }, - "统一响应结果«分页结果«定时任务执行日志»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分页结果«定时任务执行日志»", - "$ref": "#/definitions/分页结果«定时任务执行日志»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«分页结果«定时任务执行日志»»" - }, - "统一响应结果«定时任务信息»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "定时任务信息", - "$ref": "#/definitions/定时任务信息" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«定时任务信息»" - }, - "Map«string,object»": { - "type": "object", - "title": "Map«string,object»", - "additionalProperties": { - "type": "object" - } - }, - "WechatDepartment": { - "type": "object", - "properties": { - "createdAt": { - "type": "string", - "format": "date-time" - }, - "deptId": { - "type": "integer", - "format": "int64" - }, - "deptName": { - "type": "string" - }, - "orderIndex": { - "type": "integer", - "format": "int32" - }, - "parentId": { - "type": "integer", - "format": "int64" - }, - "status": { - "type": "string" - }, - "syncedAt": { - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "type": "string", - "format": "date-time" - } - }, - "title": "WechatDepartment" - }, - "WechatUser": { - "type": "object", - "properties": { - "avatar": { - "type": "string" - }, - "createdAt": { - "type": "string", - "format": "date-time" - }, - "deptIds": { - "type": "string" - }, - "deptNames": { - "type": "string" - }, - "email": { - "type": "string" - }, - "gender": { - "type": "integer", - "format": "int32" - }, - "mobile": { - "type": "string" - }, - "name": { - "type": "string" - }, - "position": { - "type": "string" - }, - "status": { - "type": "integer", - "format": "int32" - }, - "syncedAt": { - "type": "string", - "format": "date-time" - }, - "updatedAt": { - "type": "string", - "format": "date-time" - }, - "userid": { - "type": "string" - } - }, - "title": "WechatUser" - }, - "分页结果«WechatUser»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "originalRef": "WechatUser", - "$ref": "#/definitions/WechatUser" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«WechatUser»" - }, - "统一响应结果«List«Map«string,object»»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "Map«string,object»", - "$ref": "#/definitions/Map«string,object»" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«Map«string,object»»»" - }, - "统一响应结果«List«WechatDepartment»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "array", - "description": "响应数据", - "items": { - "originalRef": "WechatDepartment", - "$ref": "#/definitions/WechatDepartment" - } - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«List«WechatDepartment»»" - }, - "统一响应结果«分页结果«WechatUser»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分页结果«WechatUser»", - "$ref": "#/definitions/分页结果«WechatUser»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«分页结果«WechatUser»»" - }, - "Map«string,object»_1": { - "type": "object", - "title": "Map«string,object»_1", - "additionalProperties": { - "type": "object" - } - }, - "Map«string,object»_2": { - "type": "object", - "title": "Map«string,object»_2", - "additionalProperties": { - "type": "object" - } - }, - "Map«string,object»_3": { - "type": "object", - "title": "Map«string,object»_3", - "additionalProperties": { - "type": "object" - } - }, - "Map«string,object»_4": { - "type": "object", - "title": "Map«string,object»_4", - "additionalProperties": { - "type": "object" - } - }, - "个人资料VO(角色感知)": { - "type": "object", - "properties": { - "adminId": { - "type": "string", - "description": "管理员用户ID" - }, - "avatar": { - "type": "string", - "description": "头像URL" - }, - "certLevel": { - "type": "string", - "description": "认证等级(定制师专属)" - }, - "certified": { - "type": "boolean", - "description": "是否已认证(定制师专属)" - }, - "contactQrUrl": { - "type": "string", - "description": "企业微信联系二维码URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "description": { - "type": "string", - "description": "个人简介(定制师专属)" - }, - "experience": { - "type": "integer", - "format": "int32", - "description": "从业年限(定制师专属)" - }, - "isFeatured": { - "type": "boolean", - "description": "是否推荐(定制师专属)" - }, - "motto": { - "type": "string", - "description": "座右铭(定制师专属)" - }, - "name": { - "type": "string", - "description": "姓名" - }, - "phone": { - "type": "string", - "description": "手机号" - }, - "role": { - "type": "string", - "description": "当前角色key" - }, - "roleName": { - "type": "string", - "description": "角色中文名" - }, - "serviceAreas": { - "type": "array", - "description": "服务区域(定制师专属)", - "items": { - "type": "string" - } - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "展示排序(定制师专属)" - }, - "specialties": { - "type": "array", - "description": "擅长领域(定制师专属)", - "items": { - "type": "string" - } - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "个人资料VO(角色感知)" - }, - "产品统计": { - "type": "object", - "properties": { - "publishedProducts": { - "type": "integer", - "format": "int32", - "description": "已上架产品数" - }, - "totalProducts": { - "type": "integer", - "format": "int32", - "description": "产品总数" - } - }, - "title": "产品统计" - }, - "分页结果«Map«string,object»»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "originalRef": "Map«string,object»", - "$ref": "#/definitions/Map«string,object»" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«Map«string,object»»" - }, - "定制师个人资料VO": { - "type": "object", - "properties": { - "adminId": { - "type": "string", - "description": "管理员用户ID" - }, - "avatar": { - "type": "string", - "description": "头像URL" - }, - "certLevel": { - "type": "string", - "description": "认证等级:none/bronze/silver/gold/diamond" - }, - "certified": { - "type": "boolean", - "description": "是否已认证" - }, - "contactQrUrl": { - "type": "string", - "description": "企业微信联系二维码URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "description": { - "type": "string", - "description": "个人简介" - }, - "experience": { - "type": "integer", - "format": "int32", - "description": "从业年限" - }, - "isFeatured": { - "type": "boolean", - "description": "是否推荐" - }, - "motto": { - "type": "string", - "description": "座右铭" - }, - "name": { - "type": "string", - "description": "姓名(优先取企微名称,否则管理员用户名)" - }, - "phone": { - "type": "string", - "description": "手机号" - }, - "serviceAreas": { - "type": "array", - "description": "服务区域列表", - "items": { - "type": "string" - } - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "description": "展示排序" - }, - "specialties": { - "type": "array", - "description": "擅长领域列表", - "items": { - "type": "string" - } - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - } - }, - "title": "定制师个人资料VO" - }, - "定制师工作台VO(重构版)": { - "type": "object", - "properties": { - "calendarEvents": { - "type": "array", - "description": "日历事件", - "items": { - "originalRef": "Map«string,object»", - "$ref": "#/definitions/Map«string,object»" - } - }, - "customerStats": { - "description": "客户统计", - "originalRef": "客户统计", - "$ref": "#/definitions/客户统计" - }, - "funnel": { - "type": "object", - "description": "转化漏斗" - }, - "overview": { - "description": "数据概览", - "originalRef": "数据概览", - "$ref": "#/definitions/数据概览" - }, - "productStats": { - "description": "产品统计", - "originalRef": "产品统计", - "$ref": "#/definitions/产品统计" - }, - "ranking": { - "type": "array", - "description": "本月业绩排行", - "items": { - "originalRef": "Map«string,object»", - "$ref": "#/definitions/Map«string,object»" - } - }, - "reviewStats": { - "description": "评价统计", - "originalRef": "评价统计", - "$ref": "#/definitions/评价统计" - }, - "shortcuts": { - "type": "array", - "description": "快捷入口列表", - "items": { - "originalRef": "快捷入口", - "$ref": "#/definitions/快捷入口" - } - }, - "todos": { - "type": "object", - "description": "待办汇总" - }, - "trend": { - "type": "array", - "description": "数据趋势(按天)", - "items": { - "originalRef": "Map«string,object»", - "$ref": "#/definitions/Map«string,object»" - } - }, - "upcomingTrips": { - "type": "array", - "description": "即将出行列表", - "items": { - "originalRef": "Map«string,object»", - "$ref": "#/definitions/Map«string,object»" - } - } - }, - "title": "定制师工作台VO(重构版)" - }, - "客户统计": { - "type": "object", - "properties": { - "customerAddCount": { - "type": "integer", - "format": "int32", - "description": "新增客户数" - }, - "customerLossCount": { - "type": "integer", - "format": "int32", - "description": "客户流失数" - } - }, - "title": "客户统计" - }, - "快捷入口": { - "type": "object", - "properties": { - "icon": { - "type": "string", - "description": "图标" - }, - "name": { - "type": "string", - "description": "名称" - }, - "path": { - "type": "string", - "description": "路径" - } - }, - "title": "快捷入口" - }, - "数据概览": { - "type": "object", - "properties": { - "gmv": { - "type": "number", - "description": "当期GMV" - }, - "gmvDiffRate": { - "type": "number", - "description": "与前一期GMV增长率" - }, - "orderCount": { - "type": "integer", - "format": "int64", - "description": "当期订单数" - }, - "orderCountDiff": { - "type": "integer", - "format": "int64", - "description": "与前一期订单数差值" - }, - "period": { - "type": "string", - "description": "当期时间范围" - } - }, - "title": "数据概览" - }, - "更新定制师个人资料请求": { - "type": "object", - "properties": { - "certLevel": { - "type": "string", - "example": "gold", - "description": "认证等级:none/bronze/silver/gold/diamond" - }, - "certified": { - "type": "boolean", - "example": true, - "description": "是否已认证" - }, - "description": { - "type": "string", - "example": "10年+旅行定制师", - "description": "个人简介" - }, - "experience": { - "type": "integer", - "format": "int32", - "example": 5, - "description": "从业年限" - }, - "isFeatured": { - "type": "boolean", - "example": false, - "description": "是否推荐" - }, - "motto": { - "type": "string", - "example": "让每一次旅行都值得回忆", - "description": "座右铭" - }, - "serviceAreas": { - "type": "array", - "example": [ - "西南地区", - "华中地区" - ], - "description": "服务区域列表", - "items": { - "type": "string" - } - }, - "sortOrder": { - "type": "integer", - "format": "int32", - "example": 0, - "description": "展示排序" - }, - "specialties": { - "type": "array", - "example": [ - "云南", - "西藏" - ], - "description": "擅长领域列表", - "items": { - "type": "string" - } - } - }, - "title": "更新定制师个人资料请求" - }, - "统一响应结果«object»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "type": "object", - "description": "响应数据" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«object»" - }, - "统一响应结果«个人资料VO(角色感知)»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "个人资料VO(角色感知)", - "$ref": "#/definitions/个人资料VO(角色感知)" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«个人资料VO(角色感知)»" - }, - "统一响应结果«分页结果«Map«string,object»»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分页结果«Map«string,object»»", - "$ref": "#/definitions/分页结果«Map«string,object»»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«分页结果«Map«string,object»»»" - }, - "统一响应结果«定制师个人资料VO»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "定制师个人资料VO", - "$ref": "#/definitions/定制师个人资料VO" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«定制师个人资料VO»" - }, - "统一响应结果«定制师工作台VO(重构版)»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "定制师工作台VO(重构版)", - "$ref": "#/definitions/定制师工作台VO(重构版)" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«定制师工作台VO(重构版)»" - }, - "评价统计": { - "type": "object", - "properties": { - "averageRating": { - "type": "number", - "description": "平均评分(1-5)" - }, - "goodRate": { - "type": "number", - "description": "好评率(%)" - }, - "totalReviews": { - "type": "integer", - "format": "int32", - "description": "评价总数" - } - }, - "title": "评价统计" - }, - "分页结果«客户信息VO(管理端)»": { - "type": "object", - "properties": { - "page": { - "type": "integer", - "format": "int32", - "example": 1, - "description": "当前页码" - }, - "pageSize": { - "type": "integer", - "format": "int32", - "example": 20, - "description": "每页条数" - }, - "records": { - "type": "array", - "description": "数据列表", - "items": { - "originalRef": "客户信息VO(管理端)", - "$ref": "#/definitions/客户信息VO(管理端)" - } - }, - "total": { - "type": "integer", - "format": "int32", - "example": 100, - "description": "总记录数" - } - }, - "title": "分页结果«客户信息VO(管理端)»" - }, - "客户信息VO(管理端)": { - "type": "object", - "properties": { - "avatar": { - "type": "string", - "description": "头像URL" - }, - "createdAt": { - "type": "string", - "format": "date-time", - "description": "创建时间" - }, - "nickname": { - "type": "string", - "description": "昵称" - }, - "phone": { - "type": "string", - "description": "手机号(不脱敏)" - }, - "status": { - "type": "string", - "description": "状态,关联字典user_status:ACTIVE=正常, BANNED=已封禁" - }, - "updatedAt": { - "type": "string", - "format": "date-time", - "description": "更新时间" - }, - "userId": { - "type": "integer", - "format": "int64", - "description": "用户ID" - } - }, - "title": "客户信息VO(管理端)" - }, - "统一响应结果«分页结果«客户信息VO(管理端)»»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "分页结果«客户信息VO(管理端)»", - "$ref": "#/definitions/分页结果«客户信息VO(管理端)»" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«分页结果«客户信息VO(管理端)»»" - }, - "统一响应结果«客户信息VO(管理端)»": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32", - "example": 200, - "description": "状态码" - }, - "data": { - "description": "响应数据", - "originalRef": "客户信息VO(管理端)", - "$ref": "#/definitions/客户信息VO(管理端)" - }, - "message": { - "type": "string", - "example": "成功", - "description": "响应消息" - }, - "success": { - "type": "boolean" - } - }, - "title": "统一响应结果«客户信息VO(管理端)»" - } - } -} \ No newline at end of file diff --git a/BACKEND_CHANGELOG_DELIVERY_GUIDE.md b/BACKEND_CHANGELOG_DELIVERY_GUIDE.md deleted file mode 100644 index a1212da..0000000 --- a/BACKEND_CHANGELOG_DELIVERY_GUIDE.md +++ /dev/null @@ -1,75 +0,0 @@ -# 后端 API Changelog 推送说明 - -接口发生新增、修改或删除时,在 `hl-api-changelog` 仓库提交一份 changelog。 - -## 1. 放在哪里 - -- 管理后台:`changelogs-v2/YYYY-MM/` -- 小程序:`changelogs-v2-mp/YYYY-MM/` - -文件名: - -```text -DD_issue_业务标题-{新增接口|修改接口|删除接口}-{管理后台|小程序端}.md -``` - -例如: - -```text -changelogs-v2/2026-07/24_5205_车务首页汇总状态补全-修改接口-管理后台.md -``` - -日期使用提交时的上海日期;不要把“前端待处理”“已完成”等状态写进文件名。 - -## 2. 写什么 - -可以复制仓库根目录的 `CHANGELOG_TEMPLATE.md`,至少写清: - -- 关联的 Issue 和后端 PR; -- 接口路径和 HTTP 方法; -- 新增、修改或删除的请求/响应字段; -- 字段必填性、枚举、状态、空值、金额和兼容规则; -- 前端需要做什么; -- 后端测试、部署和网关验证结果。 - -元数据中: - -```yaml -backend_status: "deployed" -gateway_status: "verified" -frontend_status: "pending" -frontend_owner: "" -frontend_ref: "" -target_release: "" -verified_at: "" -``` - -- 需要前端修改:`frontend_status: "pending"` -- 不需要前端修改:`frontend_status: "not_required"` -- 后端不要代替前端填写 `implemented`、`released` 或 `verified` - -## 3. 校验 - -在 `hl-api-changelog` 仓库执行: - -```powershell -npm test -npm run check:filenames -- --base origin/main --head HEAD -npm run check:frontmatter -- --base origin/main --head HEAD -``` - -确保正文没有 `TODO`、`待补充` 或模板占位符。 - -## 4. 提交和推送 - -只暂存本次 changelog 文件: - -```powershell -git status --short -git add -- changelogs-v2/2026-07/24_5205_车务首页汇总状态补全-修改接口-管理后台.md -git diff --cached --check -git commit -m "docs: hand off API contract (#5205)" -git push -u origin <任务分支> -``` - -然后向 `main` 创建 PR。不要提交其他任务的 changelog、`.tmp-*` 文件或任何凭据。 diff --git a/CHANGELOG_TEMPLATE.md b/CHANGELOG_TEMPLATE.md deleted file mode 100644 index ab4d9f3..0000000 --- a/CHANGELOG_TEMPLATE.md +++ /dev/null @@ -1,195 +0,0 @@ ---- -schema: "hl-changelog/v2" -ticket: "{issue-no}" -title: "{一句话概括变化}" -consumer: "{admin|mp|internal|multiple}" -change_type: "{新增接口|修改接口|删除接口}" -backend_status: "pending" -gateway_status: "pending" -frontend_status: "{pending|not_required}" -frontend_owner: "" -frontend_ref: "" -target_release: "" -verified_at: "" -status_note: "" -updated_at: "YYYY-MM-DD" -base: "{dev|dev-v3}" ---- - -# {模块名}: {一句话概括变化} - -> **存放目录**: -> - 一期(v2,无 `order-v3` 标签的工单)→ `changelogs/{YYYY-MM}/` -> - 二期(v3,`order-v3` 标签的工单)→ `changelogs-v2/{YYYY-MM}/` -> -> **服务**: hl-{服务名} (端口 80XX) -> **PR**: #{pr-no} -> **Issue**: #{issue-no} -> **日期**: YYYY-MM-DD -> **影响范围**: {只写一行,比如"管理端产品编辑订金表单" 或 "C 端行程详情三字段"} - ---- - -## ⚠️ 关键变化(非必须,本版与上版行为不同 / 纠错 / 撤销时必写) - -一行红字说清: -- 本次变了什么 -- 前端/调用方以前以为的是什么 -- 实际现在是什么 - -示例: "前一版 #903 说 4 个接口会对 CUSTOM 返回 500。**这个判断是错的,现已撤销**。" - ---- - -## 一、背景(选填) - -业务原因。纠错/撤销时尤其应该用 **DB 实证** 或 **实际数据** 驳回上一版的误判。 - -| 维度 | 证据 A | 证据 B | -|------|--------|--------| -| 档位数 | 1 档 | 2 档 | -| 价格日历记录 | 62 条 | 92 条 | - ---- - -## 二、变更接口清单 - -| # | 接口 | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|------|----------|------| -| 1 | 保存产品基础信息 | POST | `/admin/product-basic/save` | 请求体新增校验 | 字段互斥 | - ---- - -## 三、接口详情 - -### 1. {接口名} `{METHOD} {路径}` - -**VO**: `{VO 类名}` - -#### 入参 - -| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | -|------|------|------|------|------|------| -| xxx | Body | String | ✅ | - | - | - -#### 出参 `Result` - -| 字段 | 类型 | 说明 | -|------|------|------| -| xxx | String | - | - -#### 请求示例 - -```json -{ "xxx": "yyy" } -``` - -#### 响应示例 - -```json -{ - "code": 200, - "message": "成功", - "data": { "xxx": "yyy" }, - "success": true -} -``` - -#### 空数据 / 降级响应 - -```json -{ "code": 200, "data": [], "success": true } -``` - -#### 错误响应 - -```json -{ - "code": 400, - "message": "depositMutex: 订金固定金额与比例互斥,只能填写其中一个", - "success": false, - "data": null -} -``` - ---- - -## 四、契约约束与正确调用方式(选填,字段互斥/联动/切换场景必写) - -> 本节只写**后端接受/拒绝 payload 的规则**,不写 UI 渲染建议。 - -### ✅ 正确 / ❌ 错误 payload 对照 - -| 场景 | payload | -|------|---------| -| ✅ 单独填固定金额 | `{ "depositAmount": 500, "depositRatio": null }` | -| ✅ 单独填比例 | `{ "depositAmount": null, "depositRatio": 10 }` | -| ✅ 全款(无订金) | `{ "paymentType": "FULL", "depositAmount": null, "depositRatio": null }` | -| ❌ 两字段同时有值 | `{ "depositAmount": 500, "depositRatio": 10 }` → 400 | - -### 切换状态时的必要动作 - -若字段有"要么 A 要么 B"的互斥关系,请求前必须把对方字段显式置 null,不要依赖"隐藏输入框"的 UI 行为(后端只看 payload)。 - ---- - -## 五、数据库行为(涉及写操作时必写) - -| 前端提交 | `deposit_amount` 列 | `deposit_ratio` 列 | -|----------|---------------------|---------------------| -| `depositAmount=500, depositRatio=null` | `500.00` | `NULL` | -| `depositAmount=null, depositRatio=10` | `NULL` | `10` | - -**显式 SET NULL 说明**: 即使前端不传"对方字段", 后端也会显式 `SET column = NULL`, 不保留数据库历史残留值。 - ---- - -## 六、边界行为 - -- 未登录 → 401 (网关拦截) -- 资源不存在 → 404 -- 下游服务降级 → 返 `[]` / null, 不 500 不阻断页面 -- 老数据兼容 → 旧 snapshot 无新字段 → 字段为 null, 不异常 - ---- - -## 七、不影响范围(显式声明, 帮前端/QA 缩小排查面) - -- **仅影响**: 管理后台 X 表单 -- **零影响**: - - C 端算价接口 - - 订单创建接口 - - 订单详情读取 - - 历史数据(存量不迁移, 下次编辑保存时才触发新校验) - ---- - -## 八、测试环境已验证 - -真实接口 curl/DBeaver 输出, 带 ✓ 标记: - -``` -GET /mp/product/{id}/price-calendar?month=2026-04 → 200 + days 数组 ✓ -GET /mp/product/{id}/tier-compare → 200 + tiers ✓ -POST /mp/product/{id}/quote → 200 + 报价成功 ✓ -``` - -验证产品: `productId=2045390643479412737` (测试定制wx-01) - ---- - -## 九、相关历史 PR(纠错 / 功能演进时必写) - -| PR | Issue | 说明 | 是否仍有效 | -|----|-------|------|------------| -| #900 | #898 | 首次放行主详情 | ✅ 有效 | -| #903 | #901 | 误判定性 CUSTOM 不支持 | ❌ 已被 #906 撤销 | -| **本 PR #906** | **#905** | 撤销 #903, 全量放行 | ✅ 最新 | - ---- - -## 十、相关文档 - -- 关联 Issue: [wx/HL#{issue}](https://git.1814.love:8443/wx/HL/issues/{issue}) -- 关联 PR: [wx/HL#{pr}](https://git.1814.love:8443/wx/HL/pulls/{pr}) -- 后续计划: 见 `{另一条 changelog 路径}` diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index f32a8a8..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,89 +0,0 @@ -# Changelog 贡献规则 - -## 二期文件名 - -`/v3/admin/*` 接口写入 `changelogs-v2/`: - -```text -changelogs-v2/YYYY-MM/DD_issue_业务标题-{新增接口|修改接口|删除接口}-管理后台.md -``` - -`/v3/mp/*` 接口写入 `changelogs-v2-mp/`: - -```text -changelogs-v2-mp/YYYY-MM/DD_issue_业务标题-{新增接口|修改接口|删除接口}-小程序端.md -``` - -其中: - -- `YYYY-MM` 和 `DD` 必须是校验运行时 `Asia/Shanghai` 的真实年月日,且均须补齐两位。跨越上海零点后仍未合并的 PR,需要把新文件重命名为当天日期。 -- `issue` 必须是不带 `#` 的十进制正整数,不允许 `0`、负数或前缀符号。 -- 业务标题不能为空。 -- 变更类型只能是 `新增接口`、`修改接口` 或 `删除接口`。 -- 端类型由目录唯一决定:`changelogs-v2/` 固定为 `管理后台`,`changelogs-v2-mp/` 固定为 `小程序端`。 -- 同一改动同时影响 `/v3/admin/*` 和 `/v3/mp/*` 时,应按目录拆成两份。 - -一期 `changelogs/` 沿用现行格式,不套用上述强制模板。 - -## 校验范围 - -检测器读取 `git diff --name-status -z --find-renames` 的结果,只校验本次 diff 新出现的目标路径: - -- `A`(新增)、`C`(复制)和 `R`(重命名)的目标路径必须通过规则。 -- `M`(修改历史文件)和 `D`(删除)豁免,不会因存量错误命名阻断。 -- 重命名到受控目录时,新目标路径必须使用校验当天的上海日期。 - -本地校验: - -```bash -npm test -npm run check:filenames -- --base origin/main --head HEAD -``` - -生产 CLI 故意不提供 `--date` 或日期环境变量;测试只通过导出的纯函数注入 `Date`。规则失败返回退出码 `1`,Git/事件/参数等基础设施错误返回 `2`。 - -## 前端消费状态 - -新增二期 changelog 必须使用 `hl-changelog/v2` YAML Front Matter。状态只写在元数据中,不写入文件名: - -```yaml -backend_status: "deployed" -gateway_status: "verified" -frontend_status: "pending" -frontend_owner: "" -frontend_ref: "" -target_release: "" -verified_at: "" -updated_at: "2026-07-24" -``` - -前端状态正常流转为: - -```text -pending → claimed → implemented → released → verified -``` - -不需要前端修改时使用 `not_required`。字段一致性、必填证据和新增文档 frontmatter 由 `check:frontmatter` 校验。 - -完整职责和命令见: - -- `FRONTEND_CONSUMPTION_STATUS_GUIDE.md` -- `BACKEND_CHANGELOG_DELIVERY_GUIDE.md` - -本地校验: - -```bash -npm test -npm run check:filenames -- --base origin/main --head HEAD -npm run check:frontmatter -- --base origin/main --head HEAD -``` - -## CI 与服务端阻断边界 - -Gitea Actions 会在指向 `main` 的 PR 和 `main` 的 push 上运行回归测试与文件名检测。该 workflow 是检测器: - -- 在 `main` 未开启分支保护和 required status 时,失败状态不能硬性阻止合并。 -- `push` 事件发生在写入之后,只能检测/报警,不能撤销直推。 -- 只有管理员另行保护 `main`、关闭直推,并在 workflow 首次成功运行后,从 Gitea 最近上报的 status context 列表中选择实际值作为 required status,才能宣称服务端 hard gate 已激活。激活记录必须保存首次运行链接和 status API/分支保护回读证据;不得预设 job id/name `validate` 就是 Gitea 实际上报的 context。 - -因此,本仓库文件交付的准确表述是:**detector 已安装;在 `main` 未保护时,服务端 hard gate 尚未激活。** diff --git a/FRONTEND_CONSUMPTION_STATUS_GUIDE.md b/FRONTEND_CONSUMPTION_STATUS_GUIDE.md deleted file mode 100644 index 19ef852..0000000 --- a/FRONTEND_CONSUMPTION_STATUS_GUIDE.md +++ /dev/null @@ -1,109 +0,0 @@ -# API Changelog 前端消费状态协作说明 - -## 可直接转发给前端的通知 - -API changelog 从 `hl-changelog/v2` 开始记录前端消费进度。后端交接时会填写: - -```yaml -backend_status: "deployed" -frontend_status: "pending" -frontend_owner: "" -frontend_ref: "" -target_release: "" -verified_at: "" -``` - -请前端在领取、实现、发布和页面验证时更新对应状态,并填写可追溯的前端 PR、提交或发布版本。 - -这不会把前端工作纳入后端工单验收,也不要求在 `hl-ui` 创建配合工单。它只用于区分: - -- 后端接口是否已经部署并验证; -- 前端是否已经领取; -- 前端代码是否已经实现; -- 页面是否已经发布并验证。 - -只有 `frontend_status: "verified"` 才表示用户页面形成完整闭环。 - -## 状态流转 - -```text -pending → claimed → implemented → released → verified -``` - -不需要前端修改时: - -```text -not_required -``` - -| 状态 | 含义 | 必填证据 | -|---|---|---| -| `not_required` | 不需要前端修改 | 不填写前端负责人、引用和版本 | -| `pending` | 等待前端领取 | 无 | -| `claimed` | 前端已领取 | `frontend_owner` | -| `implemented` | 前端代码已实现 | `frontend_owner`、`frontend_ref` | -| `released` | 已发布 | 再填写 `target_release` | -| `verified` | 页面已验证 | 再填写 `verified_at` | - -跨级迁移会被自动校验拒绝。状态回退或改为/取消 `not_required` 时必须填写原因。 - -## 更新命令 - -领取: - -```powershell -hl changelog transition 5205 D:/path/changelog.md claimed ` - --owner frontend-team --write -``` - -实现: - -```powershell -hl changelog transition 5205 D:/path/changelog.md implemented ` - --owner frontend-team ` - --frontend-ref "mmg/hl-ui@abc1234" ` - --write -``` - -发布: - -```powershell -hl changelog transition 5205 D:/path/changelog.md released ` - --target-release "test-2026.07.24" ` - --write -``` - -验证: - -```powershell -hl changelog transition 5205 D:/path/changelog.md verified ` - --verified-at "2026-07-24" ` - --write -``` - -命令默认只预览;只有 `--write` 才修改文件。写入命令会自动获取 `changelog` 单写租约。 - -## 职责边界 - -后端负责: - -- 完成后端测试、部署和网关验证; -- 初始化 v2 元数据; -- 需要前端时设置 `pending`,不需要时设置 `not_required`; -- 不替前端填写 `implemented`、`released` 或 `verified`。 - -前端负责: - -- 领取时填写负责人; -- 实现后填写前端引用; -- 发布后填写目标版本或环境; -- 页面验证后填写验证日期。 - -QA 或产品可以协助更新 `verified_at`,但必须基于实际页面验证,不能只根据接口成功或代码已合并标记完成。 - -## 存量文档 - -- 新 changelog 全部使用 `hl-changelog/v2`。 -- `hl-changelog/v1` 继续可读和索引,不强制一次性迁移。 -- 文件名带“前端待处理”不代表真实状态;需要继续流转时补充 v2 元数据。 -- 不通过重命名表达消费状态,避免破坏文件名校验和历史链接。 diff --git a/changelogs-v2-mp/.gitkeep b/changelogs-v2-mp/.gitkeep deleted file mode 100644 index 36cdc86..0000000 --- a/changelogs-v2-mp/.gitkeep +++ /dev/null @@ -1,15 +0,0 @@ -# changelogs-v2-mp/ - -二期(v3)**小程序端** changelog 目录。 - -| 接口路径 | 写到 | -|---|---| -| `/v3/mp/*` | 本目录(changelogs-v2-mp/) | -| `/v3/admin/*` | `../changelogs-v2/` | -| 非 `/v3/*`(一期 admin / mp) | `../changelogs/` | - -文件命名:`{YYYY-MM}/{DD}_{issue号}_{业务标题}-{变更类型}-小程序端.md` -- 变更类型三选一:新增接口 / 修改接口 / 删除接口 -- 端类型固定写「小程序端」 - -详见 HL 项目 `.claude/CLAUDE.md` § Changelog / 通知约定。 diff --git a/changelogs-v2-mp/2026-06/01_3315_景区是否收费-修改接口-小程序端.md b/changelogs-v2-mp/2026-06/01_3315_景区是否收费-修改接口-小程序端.md deleted file mode 100644 index 7cfaef7..0000000 --- a/changelogs-v2-mp/2026-06/01_3315_景区是否收费-修改接口-小程序端.md +++ /dev/null @@ -1,244 +0,0 @@ -# 景区新增「是否收费」字段(小程序端) - -- **端类型**:小程序端 -- **变更类型**:修改接口 -- **日期**:2026-06-01 -- **Issue**:[#3315](https://git.1814.love:8443/wx/HL/issues/3315) -- **PR**:[#3316](https://git.1814.love:8443/wx/HL/pulls/3316) -- **Commit**:[63539c3](https://git.1814.love:8443/wx/HL/commit/63539c3dd2435c0e3d499302e53877944311e27b) -- **后端负责人**:腰苏图(yst@1814.love) - ---- - -## ① 接口背景 - -景区资源新增「是否收费」属性。小程序端的景区详情接口和列表接口均已同步透传该字段,供小程序展示景区是否需要付费(如收取门票费)。字典来源 `sys_yes_no`,后端已配置并完成翻译,小程序无需任何字典配置。上游依赖 #3313/#3314(resource-service 新增字段)。 - ---- - -## ② 变更清单 - -| 接口 | 方法 | 路径 | 变更内容 | -|------|------|------|----------| -| 景区详情 | GET | `/mp/scenic/{scenicId}` | 出参新增 `isCharged` + `isChargedLabel` | -| 景区列表 | GET | `/mp/scenic/list` | 出参新增 `isCharged` + `isChargedLabel` | - -所有变更均为**向后兼容新增字段**,小程序现有调用代码无需修改。 - ---- - -## ③ 接口详情 - -| 项目 | 说明 | -|------|------| -| **认证方式** | 小程序 JWT Token,请求头 `Authorization: Bearer {mp_token}` | -| **幂等性** | GET 查询,天然幂等 | -| **限流** | 无单独限流配置,走网关全局限流 | -| **缓存** | 详情接口缓存 300 秒(`scenic:detail:{id}`),列表接口缓存 600 秒(`scenic:list:{keyword}:{city}:{page}:{pageSize}`)。新字段随正常缓存刷新即可,无需额外处理 | -| **权限** | 小程序用户,已登录状态 | - ---- - -## ④ 接口入参 - -### GET `/mp/scenic/{scenicId}` 详情 - -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| scenicId | Long | 是 | 景区 ID(路径参数) | - -### GET `/mp/scenic/list` 列表 - -| 参数名 | 类型 | 必填 | 默认值 | 说明 | -|--------|------|------|--------|------| -| keyword | String | 否 | - | 关键词搜索 | -| city | String | 否 | - | 城市筛选 | -| page | Integer | 否 | 1 | 页码 | -| pageSize | Integer | 否 | 20 | 每页条数 | - -> 入参无变化,以上为完整入参文档。 - ---- - -## ⑤ 出参字段 - -### GET `/mp/scenic/{scenicId}` 详情(`MpScenicDetailVO`,新增字段) - -| 字段名 | 类型 | 说明 | 可能为 null | -|--------|------|------|-------------| -| isCharged | Integer | 是否收费,1=是 0=否 | 否(DB 默认 0) | -| isChargedLabel | String | 是否收费中文文本,取自字典 sys_yes_no("是"/"否") | 是(字典缺失时为 null) | - -### GET `/mp/scenic/list` 列表(`MpScenicListItemVO`,新增字段) - -| 字段名 | 类型 | 说明 | 可能为 null | -|--------|------|------|-------------| -| isCharged | Integer | 是否收费,1=是 0=否 | 否(DB 默认 0) | -| isChargedLabel | String | 是否收费中文文本,取自字典 sys_yes_no("是"/"否") | 是(字典缺失时为 null) | - ---- - -## ⑥ 枚举 / 数据字典 - -### sys_yes_no 字典(后端已配置,小程序无需维护) - -| 字典值(isCharged) | 中文标签(isChargedLabel) | 说明 | -|--------------------|-----------------------------|------| -| 1 | 是 | 该景区收费 | -| 0 | 否 | 该景区免费 | - -> `isChargedLabel` 由后端查字典自动翻译并返回,小程序可直接展示。若字典配置异常(不正常情况),该字段返回 null。 - ---- - -## ⑦ 错误码 - -| 错误码 | HTTP 状态 | 场景 | -|--------|-----------|------| -| 401 | 401 | 未登录或 Token 失效 | -| 404 | 404 | 景区 ID 不存在、已删除或已下架 | - ---- - -## ⑧ 示例 - -### 8.1 典型成功 — 获取收费景区详情 - -**请求** -``` -GET /mp/scenic/1900123456789000001 -Authorization: Bearer {mp_token} -``` - -**响应** -```json -{ - "code": 200, - "msg": "成功", - "data": { - "scenicId": "1900123456789000001", - "name": "呼伦贝尔大草原景区", - "cityName": "呼伦贝尔", - "coverUrl": "https://oss.example.com/scenic/cover.jpg", - "isCharged": 1, - "isChargedLabel": "是", - "rating": 4.8, - "status": 1, - "mapImageUrl": "https://restapi.amap.com/v3/staticmap?..." - } -} -``` - -### 8.2 边界情况 — 历史景区(isCharged 默认 0,列表返回"否") - -**请求** -``` -GET /mp/scenic/list?page=1&pageSize=20 -Authorization: Bearer {mp_token} -``` - -**响应**(列表含收费和免费景区,均有 isCharged/isChargedLabel) -```json -{ - "code": 200, - "msg": "成功", - "data": { - "total": 2, - "list": [ - { - "scenicId": "1900123456789000001", - "name": "呼伦贝尔大草原景区", - "isCharged": 1, - "isChargedLabel": "是" - }, - { - "scenicId": "1900000000000000001", - "name": "某历史免费景区", - "isCharged": 0, - "isChargedLabel": "否" - } - ] - } -} -``` - -### 8.3 业务失败 — 访问不存在的景区 - -**请求** -``` -GET /mp/scenic/9999999999999999999 -Authorization: Bearer {mp_token} -``` - -**响应**(404,景区不存在) -```json -{ - "code": 404, - "msg": "景区不存在", - "data": null -} -``` - ---- - -## ⑨ 业务边界 - -**适用场景**: -- 小程序景区详情页展示"是否收费"标签(如"免费"/"付费"徽标) -- 小程序景区列表卡片可展示收费状态,帮助用户快速识别 - -**不适用场景**: -- `isCharged` 仅为展示属性,不影响小程序下单流程或费用计算 -- 不可作为用户端过滤条件(列表接口不支持按 `isCharged` 筛选) - -**特殊边界**: -- 历史存量景区(PR #3314 上线前创建)`isCharged` 默认为 0(否),`isChargedLabel` 返回 "否" -- 两个接口均有 BFF 缓存,景区数据更新后缓存最多延迟 5 分钟(详情)/ 10 分钟(列表)才生效 - ---- - -## ⑩ 修改前后对比 - -### 字段级对比 - -**出参(详情 + 列表)** - -| 字段名 | 变更前 | 变更后 | -|--------|--------|--------| -| isCharged | 不存在 | ✨ 新增,Integer,1=是/0=否 | -| isChargedLabel | 不存在 | ✨ 新增,String,字典翻译文本,可能为 null | - -### 行为级对比 - -| 行为 | 变更前 | 变更后 | -|------|--------|--------| -| 景区详情接口 | 无收费信息 | 新增 isCharged + isChargedLabel | -| 景区列表接口 | 无收费信息 | 新增 isCharged + isChargedLabel | - ---- - -## ⑪ 影响评估 / 回滚 - -**破坏兼容性**:无,新增字段,现有小程序代码可忽略不用。 - -**前端同步上线**:无强制要求,可选接入展示。 - -**回滚方案**:仅 VO 新增字段,无 DDL 变更;回滚只需回退 hl-mp-service 即可,`isCharged` 和 `isChargedLabel` 字段从响应中消失,小程序侧字段不存在时不展示即可。 - ---- - -## ⑫ 注意事项 - -1. 小程序**无需**配置 `sys_yes_no` 字典,后端已完成翻译并在 `isChargedLabel` 中直接返回中文 -2. 若不需要展示该字段,忽略即可,不影响任何现有功能 -3. 受缓存影响,运营后台修改后小程序侧缓存最多 5-10 分钟后自动刷新,属正常现象 - ---- - -## ⑬ 关联 / 联系人 - -- **Issue**:[https://git.1814.love:8443/wx/HL/issues/3315](https://git.1814.love:8443/wx/HL/issues/3315) -- **PR**:[https://git.1814.love:8443/wx/HL/pulls/3316](https://git.1814.love:8443/wx/HL/pulls/3316) -- **Commit**:[https://git.1814.love:8443/wx/HL/commit/63539c3dd2435c0e3d499302e53877944311e27b](https://git.1814.love:8443/wx/HL/commit/63539c3dd2435c0e3d499302e53877944311e27b) -- **上游依赖**:[https://git.1814.love:8443/wx/HL/issues/3313](https://git.1814.love:8443/wx/HL/issues/3313) / [https://git.1814.love:8443/wx/HL/pulls/3314](https://git.1814.love:8443/wx/HL/pulls/3314) -- **后端负责人**:腰苏图(企微 / yst@1814.love) diff --git a/changelogs-v2-mp/2026-06/01_3317_餐厅是否收费-修改接口-小程序端.md b/changelogs-v2-mp/2026-06/01_3317_餐厅是否收费-修改接口-小程序端.md deleted file mode 100644 index f671f50..0000000 --- a/changelogs-v2-mp/2026-06/01_3317_餐厅是否收费-修改接口-小程序端.md +++ /dev/null @@ -1,249 +0,0 @@ -# 餐厅新增「是否收费」字段(小程序端) - -- **端类型**:小程序端 -- **变更类型**:修改接口 -- **日期**:2026-06-01 -- **Issue**:[#3317](https://git.1814.love:8443/wx/HL/issues/3317) -- **PR**:[#3318](https://git.1814.love:8443/wx/HL/pulls/3318) -- **Commit**:[3ad5860](https://git.1814.love:8443/wx/HL/commit/3ad5860883819058a58ec384de0c5aac7c918804) -- **后端负责人**:腰苏图(yst@1814.love) - ---- - -## ① 接口背景 - -餐厅资源新增「是否收费」属性。小程序端的餐厅详情接口和列表接口均已同步透传该字段,供小程序展示餐厅是否需要付费(如在餐厅卡片或详情页展示"收费"/"免费"标签)。字典来源 `sys_yes_no`,后端已配置并完成翻译,小程序无需任何字典配置。 - ---- - -## ② 变更清单 - -| 接口 | 方法 | 路径 | 变更内容 | -|------|------|------|----------| -| 餐厅详情 | GET | `/mp/restaurant/{restaurantId}` | 出参新增 `isCharged` + `isChargedLabel` | -| 餐厅列表 | GET | `/mp/restaurant/list` | 出参新增 `isCharged` + `isChargedLabel` | - -所有变更均为**向后兼容新增字段**,小程序现有调用代码无需修改。 - ---- - -## ③ 接口详情 - -| 项目 | 说明 | -|------|------| -| **认证方式** | 小程序 JWT Token,请求头 `Authorization: Bearer {mp_token}` | -| **幂等性** | GET 查询,天然幂等 | -| **限流** | 无单独限流配置,走网关全局限流 | -| **缓存** | 详情接口缓存 300 秒(`restaurant:detail:{id}`),列表接口缓存 600 秒(`restaurant:list:{keyword}:{city}:{page}:{pageSize}`)。新字段随正常缓存刷新即可,无需额外处理 | -| **权限** | 小程序用户,已登录状态 | - ---- - -## ④ 接口入参 - -### GET `/mp/restaurant/{restaurantId}` 详情 - -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| restaurantId | Long | 是 | 餐厅 ID(路径参数) | - -### GET `/mp/restaurant/list` 列表 - -| 参数名 | 类型 | 必填 | 默认值 | 说明 | -|--------|------|------|--------|------| -| keyword | String | 否 | - | 关键词搜索 | -| city | String | 否 | - | 城市筛选 | -| page | Integer | 否 | 1 | 页码 | -| pageSize | Integer | 否 | 20 | 每页条数 | - -> 入参无变化,以上为完整入参文档。 - ---- - -## ⑤ 出参字段 - -### GET `/mp/restaurant/{restaurantId}` 详情(`MpRestaurantDetailVO`,新增字段) - -| 字段名 | 类型 | 说明 | 可能为 null | -|--------|------|------|-------------| -| isCharged | Integer | 是否收费,1=是 0=否 | 否(DB 默认 0) | -| isChargedLabel | String | 是否收费中文文本,取自字典 sys_yes_no("是"/"否") | 是(字典缺失时为 null) | - -### GET `/mp/restaurant/list` 列表(`MpRestaurantListItemVO`,新增字段) - -| 字段名 | 类型 | 说明 | 可能为 null | -|--------|------|------|-------------| -| isCharged | Integer | 是否收费,1=是 0=否 | 否(DB 默认 0) | -| isChargedLabel | String | 是否收费中文文本,取自字典 sys_yes_no("是"/"否") | 是(字典缺失时为 null) | - ---- - -## ⑥ 枚举 / 数据字典 - -### sys_yes_no 字典(后端已配置,小程序无需维护) - -| 字典值(isCharged) | 中文标签(isChargedLabel) | 建议小程序展示 | -|--------------------|-----------------------------|----------------| -| 1 | 是 | 收费 / 付费 | -| 0 | 否 | 免费 | - -> `isChargedLabel` 由后端查字典自动翻译并返回,小程序可直接展示。若字典配置异常(不正常情况),该字段返回 null,建议展示"-"或不显示该标签。 - ---- - -## ⑦ 错误码 - -| 错误码 | HTTP 状态 | 场景 | -|--------|-----------|------| -| 401 | 401 | 未登录或 Token 失效 | -| 404 | 404 | 餐厅 ID 不存在、已删除或已下架 | - ---- - -## ⑧ 示例 - -### 8.1 典型成功 — 获取收费餐厅详情 - -**请求** -``` -GET /mp/restaurant/1927000000000001 -Authorization: Bearer {mp_token} -``` - -**响应** -```json -{ - "code": 200, - "msg": "成功", - "data": { - "restaurantId": "1927000000000001", - "name": "云端藏餐", - "subtitle": "正宗藏式风味体验", - "categoryCode": "TIBETAN", - "categoryName": "藏式", - "isCharged": 1, - "isChargedLabel": "是", - "status": 1, - "cityName": "拉萨", - "pricePerPerson": 88.00, - ... - } -} -``` - -### 8.2 边界情况 — 免费餐厅列表(isChargedLabel 返回"否") - -**请求** -``` -GET /mp/restaurant/list?city=拉萨&page=1&pageSize=20 -Authorization: Bearer {mp_token} -``` - -**响应**(列表中包含收费和免费餐厅,均有 isCharged/isChargedLabel) -```json -{ - "code": 200, - "msg": "成功", - "data": { - "total": 2, - "list": [ - { - "restaurantId": "1927000000000001", - "name": "云端藏餐", - "isCharged": 1, - "isChargedLabel": "是", - ... - }, - { - "restaurantId": "1927000000000002", - "name": "团队免费体验餐", - "isCharged": 0, - "isChargedLabel": "否", - ... - } - ] - } -} -``` - -### 8.3 业务失败 — 访问已下架餐厅 - -**请求** -``` -GET /mp/restaurant/1927000000000099 -Authorization: Bearer {mp_token} -``` - -**响应**(404,餐厅不存在或下架) -```json -{ - "code": 404, - "msg": "餐厅不存在", - "data": null -} -``` - ---- - -## ⑨ 业务边界 - -**适用场景**: -- 小程序餐厅详情页展示"是否收费"标签(如"免费"/"付费"徽标) -- 小程序餐厅列表卡片可展示收费状态,帮助用户快速识别 - -**不适用场景**: -- `isCharged` 仅为展示属性,不影响小程序下单流程或费用计算 -- 不可作为用户端过滤条件(列表接口不支持按 `isCharged` 筛选) - -**特殊边界**: -- 历史存量餐厅(PR #3318 上线前创建)`isCharged` 默认为 0,`isChargedLabel` 返回 "否" -- `isChargedLabel` 为 null 属于后台字典配置异常,小程序侧可用 isCharged 自行映射(1→"是",0→"否") -- 该字段受缓存影响:管理后台修改 isCharged 后,小程序侧缓存最多 5-10 分钟后自动刷新(详情 300s / 列表 600s) - ---- - -## ⑩ 修改前后对比 - -### 字段级对比 - -**出参(详情 + 列表)** - -| 字段名 | 变更前 | 变更后 | -|--------|--------|--------| -| isCharged | 不存在 | ✨ 新增,Integer,1=是/0=否 | -| isChargedLabel | 不存在 | ✨ 新增,String,字典翻译文本,可能为 null | - -### 行为级对比 - -| 行为 | 变更前 | 变更后 | -|------|--------|--------| -| 餐厅详情接口 | 无收费信息 | 新增 isCharged + isChargedLabel | -| 餐厅列表接口 | 无收费信息 | 新增 isCharged + isChargedLabel | - ---- - -## ⑪ 影响评估 / 回滚 - -**破坏兼容性**:无,新增字段,现有小程序代码可忽略不用。 - -**前端同步上线**:无强制要求,可选接入展示。建议在餐厅卡片/详情增加"免费"/"收费"标签。 - -**回滚方案**:若后端回滚,`isCharged` 和 `isChargedLabel` 字段会从响应中消失,小程序需做防御性处理(字段不存在时不展示)。 - ---- - -## ⑫ 注意事项 - -1. 小程序**无需**配置 `sys_yes_no` 字典,后端已完成翻译并在 `isChargedLabel` 中直接返回中文 -2. 若不需要展示该字段,忽略即可,不影响任何现有功能 -3. 建议小程序对 `isChargedLabel` 做 null 防御(`isChargedLabel ?? isCharged === 1 ? '是' : '否'`) -4. 受缓存影响,运营后台修改后小程序最长延迟 10 分钟可见,属正常现象 - ---- - -## ⑬ 关联 / 联系人 - -- **Issue**:[https://git.1814.love:8443/wx/HL/issues/3317](https://git.1814.love:8443/wx/HL/issues/3317) -- **PR**:[https://git.1814.love:8443/wx/HL/pulls/3318](https://git.1814.love:8443/wx/HL/pulls/3318) -- **Commit**:[https://git.1814.love:8443/wx/HL/commit/3ad5860883819058a58ec384de0c5aac7c918804](https://git.1814.love:8443/wx/HL/commit/3ad5860883819058a58ec384de0c5aac7c918804) -- **后端负责人**:腰苏图(企微 / yst@1814.love) diff --git a/changelogs-v2-mp/2026-06/01_3325_酒店是否收费-修改接口-小程序端.md b/changelogs-v2-mp/2026-06/01_3325_酒店是否收费-修改接口-小程序端.md deleted file mode 100644 index a14b979..0000000 --- a/changelogs-v2-mp/2026-06/01_3325_酒店是否收费-修改接口-小程序端.md +++ /dev/null @@ -1,243 +0,0 @@ -# 酒店新增「是否收费」字段(小程序端) - -- **端类型**:小程序端 -- **变更类型**:修改接口 -- **日期**:2026-06-01 -- **Issue**:[#3325](https://git.1814.love:8443/wx/HL/issues/3325) -- **PR**:[#3326](https://git.1814.love:8443/wx/HL/pulls/3326) -- **Commit**:[58afda7](https://git.1814.love:8443/wx/HL/commit/58afda7f72031b8055dd65805815176f88dfe08c) -- **后端负责人**:腰苏图(yst@1814.love) - ---- - -## ① 接口背景 - -酒店资源新增「是否收费」属性。小程序端的酒店详情接口和列表接口均已同步透传该字段,供小程序展示酒店是否需要游客付费。字典来源 `sys_yes_no`,后端已配置并完成翻译,小程序无需任何字典配置。 - ---- - -## ② 变更清单 - -| 接口 | 方法 | 路径 | 变更内容 | -|------|------|------|----------| -| 酒店详情 | GET | `/mp/hotel/{hotelId}` | 出参新增 `isCharged` + `isChargedLabel` | -| 酒店列表 | GET | `/mp/hotel/list` | 出参新增 `isCharged` + `isChargedLabel` | - -所有变更均为**向后兼容新增字段**,小程序现有调用代码无需修改。 - ---- - -## ③ 接口详情 - -| 项目 | 说明 | -|------|------| -| **认证方式** | 小程序 JWT Token,请求头 `Authorization: Bearer {mp_token}` | -| **幂等性** | GET 查询,天然幂等 | -| **限流** | 无单独限流配置,走网关全局限流 | -| **缓存** | 详情接口缓存 300 秒(`hotel:detail:{id}`),列表接口缓存 600 秒(`hotel:list:{keyword}:{city}:{starLevel}:{page}:{pageSize}`)。新字段随正常缓存刷新即可,无需额外处理 | -| **权限** | 小程序用户,已登录状态 | - ---- - -## ④ 接口入参 - -### GET `/mp/hotel/{hotelId}` 详情 - -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| hotelId | Long | 是 | 酒店 ID(路径参数) | - -### GET `/mp/hotel/list` 列表 - -| 参数名 | 类型 | 必填 | 默认值 | 说明 | -|--------|------|------|--------|------| -| keyword | String | 否 | - | 关键词搜索 | -| city | String | 否 | - | 城市筛选 | -| starLevel | String | 否 | - | 星级筛选(字典: hotel_star_level) | -| page | Integer | 否 | 1 | 页码 | -| pageSize | Integer | 否 | 20 | 每页条数 | - -> 入参无变化,以上为完整入参文档。 - ---- - -## ⑤ 出参字段 - -### GET `/mp/hotel/{hotelId}` 详情(`MpHotelDetailVO`,新增字段) - -| 字段名 | 类型 | 说明 | 可能为 null | -|--------|------|------|-------------| -| isCharged | Integer | 是否收费,1=是 0=否 | 否(DB 默认 0) | -| isChargedLabel | String | 是否收费中文文本,取自字典 sys_yes_no("是"/"否") | 是(字典缺失时为 null) | - -### GET `/mp/hotel/list` 列表(`MpHotelListItemVO`,新增字段) - -| 字段名 | 类型 | 说明 | 可能为 null | -|--------|------|------|-------------| -| isCharged | Integer | 是否收费,1=是 0=否 | 否(DB 默认 0) | -| isChargedLabel | String | 是否收费中文文本,取自字典 sys_yes_no("是"/"否") | 是(字典缺失时为 null) | - ---- - -## ⑥ 枚举 / 数据字典 - -### sys_yes_no 字典(后端已配置,小程序无需维护) - -| 字典值(isCharged) | 中文标签(isChargedLabel) | 说明 | -|--------------------|-----------------------------|------| -| 1 | 是 | 该酒店收费 | -| 0 | 否 | 该酒店免费 | - -> `isChargedLabel` 由后端查字典自动翻译并返回,小程序可直接展示。若字典配置异常(不正常情况),该字段返回 null。 - ---- - -## ⑦ 错误码 - -| 错误码 | HTTP 状态 | 场景 | -|--------|-----------|------| -| 401 | 401 | 未登录或 Token 失效 | -| 404 | 404 | 酒店 ID 不存在、已删除或已下架 | - ---- - -## ⑧ 示例 - -### 8.1 典型成功 — 获取收费酒店详情 - -**请求** -``` -GET /mp/hotel/1928000000000001 -Authorization: Bearer {mp_token} -``` - -**响应** -```json -{ - "code": 200, - "msg": "成功", - "data": { - "hotelId": "1928000000000001", - "name": "丽江悦榕庄", - "subtitle": "古城边的世外桃源", - "hotelType": "HOTEL", - "isCharged": 1, - "isChargedLabel": "是", - "status": 1, - "city": "丽江市" - } -} -``` - -### 8.2 边界情况 — 列表中混合收费/免费酒店(均返回 isCharged + isChargedLabel) - -**请求** -``` -GET /mp/hotel/list?city=丽江市&page=1&pageSize=20 -Authorization: Bearer {mp_token} -``` - -**响应** -```json -{ - "code": 200, - "msg": "成功", - "data": { - "total": 2, - "list": [ - { - "hotelId": "1928000000000001", - "name": "丽江悦榕庄", - "isCharged": 1, - "isChargedLabel": "是" - }, - { - "hotelId": "1928000000000002", - "name": "团队免费住宿点", - "isCharged": 0, - "isChargedLabel": "否" - } - ] - } -} -``` - -### 8.3 业务失败 — 访问已下架酒店 - -**请求** -``` -GET /mp/hotel/1928000000000099 -Authorization: Bearer {mp_token} -``` - -**响应**(404,酒店不存在或下架) -```json -{ - "code": 404, - "msg": "酒店不存在", - "data": null -} -``` - ---- - -## ⑨ 业务边界 - -**适用场景**: -- 小程序酒店详情页展示"是否收费"信息 -- 小程序酒店列表卡片可展示收费状态,帮助用户快速识别 - -**不适用场景**: -- `isCharged` 仅为展示属性,不影响小程序下单流程或费用计算 -- 列表接口不支持按 `isCharged` 筛选 - -**特殊边界**: -- 历史存量酒店(PR #3326 上线前创建)`isCharged` 默认为 0,`isChargedLabel` 返回 "否" -- 该字段受缓存影响:管理后台修改 isCharged 后,小程序侧缓存最多 5-10 分钟后自动刷新(详情 300s / 列表 600s) - ---- - -## ⑩ 修改前后对比 - -### 字段级对比 - -**出参(详情 + 列表)** - -| 字段名 | 变更前 | 变更后 | -|--------|--------|--------| -| isCharged | 不存在 | ✨ 新增,Integer,1=是/0=否 | -| isChargedLabel | 不存在 | ✨ 新增,String,字典翻译文本,可能为 null | - -### 行为级对比 - -| 行为 | 变更前 | 变更后 | -|------|--------|--------| -| 酒店详情接口 | 无收费信息 | 新增 isCharged + isChargedLabel | -| 酒店列表接口 | 无收费信息 | 新增 isCharged + isChargedLabel | - ---- - -## ⑪ 影响评估 / 回滚 - -**破坏兼容性**:无,新增字段,现有小程序代码可忽略不用。 - -**前端同步上线**:无强制要求,可选接入展示。 - -**回滚方案**:若后端回滚,`isCharged` 和 `isChargedLabel` 字段会从响应中消失,小程序侧无感(原本不存在该字段)。 - ---- - -## ⑫ 注意事项 - -1. 小程序**无需**配置 `sys_yes_no` 字典,后端已完成翻译并在 `isChargedLabel` 中直接返回中文 -2. 若不需要展示该字段,忽略即可,不影响任何现有功能 -3. 受缓存影响,运营后台修改后小程序最长延迟 10 分钟可见,属正常现象 - ---- - -## ⑬ 关联 / 联系人 - -- **Issue**:[https://git.1814.love:8443/wx/HL/issues/3325](https://git.1814.love:8443/wx/HL/issues/3325) -- **PR**:[https://git.1814.love:8443/wx/HL/pulls/3326](https://git.1814.love:8443/wx/HL/pulls/3326) -- **Commit**:[https://git.1814.love:8443/wx/HL/commit/58afda7f72031b8055dd65805815176f88dfe08c](https://git.1814.love:8443/wx/HL/commit/58afda7f72031b8055dd65805815176f88dfe08c) -- **后端负责人**:腰苏图(企微 / yst@1814.love) diff --git a/changelogs-v2-mp/2026-06/01_3331_活动是否收费-修改接口-小程序端.md b/changelogs-v2-mp/2026-06/01_3331_活动是否收费-修改接口-小程序端.md deleted file mode 100644 index 699beb7..0000000 --- a/changelogs-v2-mp/2026-06/01_3331_活动是否收费-修改接口-小程序端.md +++ /dev/null @@ -1,239 +0,0 @@ -# 游玩项目(活动)新增「是否收费」字段(小程序端) - -- **端类型**:小程序端 -- **变更类型**:修改接口 -- **日期**:2026-06-01 -- **Issue**:[#3331](https://git.1814.love:8443/wx/HL/issues/3331) -- **PR**:[#3334](https://git.1814.love:8443/wx/HL/pulls/3334) -- **Commit**:[5da05a3](https://git.1814.love:8443/wx/HL/commit/5da05a324813cf8109d35c521c5e7bb9719627be) -- **后端负责人**:腰苏图(yst@1814.love) - ---- - -## ① 接口背景 - -游玩项目(活动)资源新增「是否收费」属性。小程序端的活动详情接口和活动列表接口均已同步透传该字段,供小程序展示活动是否需要游客付费。字典来源 `sys_yes_no`,后端已配置并完成翻译,小程序无需任何字典配置。备品(物资)域不涉及小程序端接口,本文档不包含备品。 - ---- - -## ② 变更清单 - -| 接口 | 方法 | 路径 | 变更内容 | -|------|------|------|----------| -| 活动详情 | GET | `/mp/activity/{activityId}` | 出参新增 `isCharged` + `isChargedLabel` | -| 活动列表 | GET | `/mp/activity/list` | 出参新增 `isCharged` + `isChargedLabel` | - -所有变更均为**向后兼容新增字段**,小程序现有调用代码无需修改。 - ---- - -## ③ 接口详情 - -| 项目 | 说明 | -|------|------| -| **认证方式** | 小程序 JWT Token,请求头 `Authorization: Bearer {mp_token}` | -| **幂等性** | GET 查询,天然幂等 | -| **限流** | 无单独限流配置,走网关全局限流 | -| **权限** | 小程序用户,已登录状态 | - ---- - -## ④ 接口入参 - -### GET `/mp/activity/{activityId}` 详情 - -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| activityId | Long | 是 | 游玩项目 ID(路径参数) | - -### GET `/mp/activity/list` 列表 - -| 参数名 | 类型 | 必填 | 默认值 | 说明 | -|--------|------|------|--------|------| -| keyword | String | 否 | - | 关键词搜索 | -| categoryCode | String | 否 | - | 分类筛选(字典: activity_category) | -| page | Integer | 否 | 1 | 页码 | -| pageSize | Integer | 否 | 20 | 每页条数 | - -> 入参无变化,以上为完整入参文档。 - ---- - -## ⑤ 出参字段 - -### GET `/mp/activity/{activityId}` 详情(`MpActivityDetailVO`,新增字段) - -| 字段名 | 类型 | 说明 | 可能为 null | -|--------|------|------|-------------| -| isCharged | Integer | 是否收费,1=是 0=否 | 否(DB 默认 0) | -| isChargedLabel | String | 是否收费中文文本,取自字典 sys_yes_no("是"/"否") | 是(字典缺失时为 null) | - -### GET `/mp/activity/list` 列表(`MpActivityListItemVO`,新增字段) - -| 字段名 | 类型 | 说明 | 可能为 null | -|--------|------|------|-------------| -| isCharged | Integer | 是否收费,1=是 0=否 | 否(DB 默认 0) | -| isChargedLabel | String | 是否收费中文文本,取自字典 sys_yes_no("是"/"否") | 是(字典缺失时为 null) | - ---- - -## ⑥ 枚举 / 数据字典 - -### sys_yes_no 字典(后端已配置,小程序无需维护) - -| 字典值(isCharged) | 中文标签(isChargedLabel) | 说明 | -|--------------------|-----------------------------|------| -| 1 | 是 | 该活动收费 | -| 0 | 否 | 该活动免费 | - -> `isChargedLabel` 由后端查字典自动翻译并返回,小程序可直接展示。若字典配置异常(不正常情况),该字段返回 null。 - ---- - -## ⑦ 错误码 - -| 错误码 | HTTP 状态 | 场景 | -|--------|-----------|------| -| 401 | 401 | 未登录或 Token 失效 | -| 404 | 404 | 活动 ID 不存在、已删除或已下架 | - ---- - -## ⑧ 示例 - -### 8.1 典型成功 — 获取收费活动详情 - -**请求** -``` -GET /mp/activity/1929000000000001 -Authorization: Bearer {mp_token} -``` - -**响应** -```json -{ - "code": 200, - "msg": "成功", - "data": { - "activityId": "1929000000000001", - "name": "高原骑马体验", - "categoryCode": "OUTDOOR", - "isCharged": 1, - "isChargedLabel": "是", - "status": 1 - } -} -``` - -### 8.2 边界情况 — 列表中混合收费/免费活动(均返回 isCharged + isChargedLabel) - -**请求** -``` -GET /mp/activity/list?categoryCode=OUTDOOR&page=1&pageSize=20 -Authorization: Bearer {mp_token} -``` - -**响应** -```json -{ - "code": 200, - "msg": "成功", - "data": { - "total": 2, - "list": [ - { - "activityId": "1929000000000001", - "name": "高原骑马体验", - "isCharged": 1, - "isChargedLabel": "是" - }, - { - "activityId": "1929000000000002", - "name": "免费篝火晚会", - "isCharged": 0, - "isChargedLabel": "否" - } - ] - } -} -``` - -### 8.3 业务失败 — 访问已下架活动 - -**请求** -``` -GET /mp/activity/1929000000000099 -Authorization: Bearer {mp_token} -``` - -**响应**(404,活动不存在或下架) -```json -{ - "code": 404, - "msg": "活动不存在", - "data": null -} -``` - ---- - -## ⑨ 业务边界 - -**适用场景**: -- 小程序活动详情页展示"是否收费"信息 -- 小程序活动列表卡片可展示收费状态,帮助用户快速识别 - -**不适用场景**: -- `isCharged` 仅为展示属性,不影响小程序下单流程或费用计算 -- 列表接口不支持按 `isCharged` 筛选 - -**特殊边界**: -- 历史存量活动(PR #3334 上线前创建)`isCharged` 默认为 0,`isChargedLabel` 返回 "否" -- 备品(物资)域无小程序端接口,本次不涉及 - ---- - -## ⑩ 修改前后对比 - -### 字段级对比 - -**出参(详情 + 列表)** - -| 字段名 | 变更前 | 变更后 | -|--------|--------|--------| -| isCharged | 不存在 | ✨ 新增,Integer,1=是/0=否 | -| isChargedLabel | 不存在 | ✨ 新增,String,字典翻译文本,可能为 null | - -### 行为级对比 - -| 行为 | 变更前 | 变更后 | -|------|--------|--------| -| 活动详情接口 | 无收费信息 | 新增 isCharged + isChargedLabel | -| 活动列表接口 | 无收费信息 | 新增 isCharged + isChargedLabel | - ---- - -## ⑪ 影响评估 / 回滚 - -**破坏兼容性**:无,新增字段,现有小程序代码可忽略不用。 - -**前端同步上线**:无强制要求,可选接入展示。 - -**回滚方案**:若后端回滚,`isCharged` 和 `isChargedLabel` 字段会从响应中消失,小程序侧无感(原本不存在该字段)。 - ---- - -## ⑫ 注意事项 - -1. 小程序**无需**配置 `sys_yes_no` 字典,后端已完成翻译并在 `isChargedLabel` 中直接返回中文 -2. 若不需要展示该字段,忽略即可,不影响任何现有功能 -3. 本次仅活动有小程序端接口变更,备品(物资)无小程序端接口,不在本文档范围内 - ---- - -## ⑬ 关联 / 联系人 - -- **Issue**:[https://git.1814.love:8443/wx/HL/issues/3331](https://git.1814.love:8443/wx/HL/issues/3331) -- **PR**:[https://git.1814.love:8443/wx/HL/pulls/3334](https://git.1814.love:8443/wx/HL/pulls/3334) -- **Commit**:[https://git.1814.love:8443/wx/HL/commit/5da05a324813cf8109d35c521c5e7bb9719627be](https://git.1814.love:8443/wx/HL/commit/5da05a324813cf8109d35c521c5e7bb9719627be) -- **后端负责人**:腰苏图(企微 / yst@1814.love) diff --git a/changelogs-v2-mp/2026-06/06_3549_C端自主取消订单-新增接口-小程序端.md b/changelogs-v2-mp/2026-06/06_3549_C端自主取消订单-新增接口-小程序端.md deleted file mode 100644 index c40e60d..0000000 --- a/changelogs-v2-mp/2026-06/06_3549_C端自主取消订单-新增接口-小程序端.md +++ /dev/null @@ -1,73 +0,0 @@ -# C 端用户自主取消订单(小程序端) - -> 端类型:**小程序端**(v3)|变更类型:**新增接口**|服务:hl-mp-service(Feign → hl-order-service-v3) -> Epic #3540 | PR #3549 |日期:2026-06-06 - -## 接口地址 - -`POST /mp/order/{orderId}/cancel` - -## 接口介绍 - -小程序 C 端用户自主取消**自己**的订单。仅出行前可取消,按退款政策(距出发天数阶梯)退款,取消后订单进入 `CANCELLED` 终态、不可恢复。 - -## 本次修改点 - -新增接口。此前小程序无自主取消能力(取消只能走后台定制师)。本接口固定 `POLICY` 退款模式(C 端不暴露退款模式选择),并校验订单归属当前登录用户。 - -## 入参 - -- 路径参数:`orderId`(Long,订单 ID,必填) -- 请求头:`Authorization`(登录 token,必填) -- 请求体(可选,可不传): - -| 字段 | 类型 | 必填 | 含义 | -|---|---|---|---| -| reason | String | 否 | 取消原因 | - -**入参示例** -``` -POST /mp/order/2063151085698134017/cancel -Authorization: Bearer -Content-Type: application/json - -{ "reason": "行程有变,需要取消" } -``` -(body 也可整体不传。) - -## 出参 - -`Result` - -**出参示例** -```json -{ "code": 200, "message": "成功", "success": true, "data": null } -``` - -## 可取消状态(调用约束) - -| 订单状态 | 是否可取消 | -|---|---| -| PENDING_PAY 待支付 | ✅ | -| CUSTOMIZING 定制中 | ✅ | -| PENDING_DEPARTURE 待出行 | ✅ | -| TRAVELLING 出行中 | ❌(行程中只能联系客服终止行程) | -| COMPLETED 已完成 | ❌ | -| CANCELLED 已取消 | ❌ | - -- 退款模式固定 `POLICY`,按退款政策阶梯计算退款金额(已付订金时退款,未支付时无退款)。 -- 仅可取消归属当前登录用户的订单(非本人订单返回 581037)。 - -## 错误码 - -| code | message | 触发 | -|---|---|---| -| 581017 | 当前订单状态不允许取消 | 出行中 / 已完成 / 已取消订单调用 | -| 581037 | 无权取消该订单 | 取消非本人(userId 不匹配)订单 | -| 401 | 缺少有效的 Authorization 头 | 未携带 token | - -## 关联 - -- Epic:https://git.1814.love:8443/wx/HL/issues/3540 -- PR:https://git.1814.love:8443/wx/HL/pulls/3549 -- 后端负责人:腰苏图(订单 v3) diff --git a/changelogs-v2-mp/2026-06/17_3911_相册接口横向越权安全热修-IDOR-小程序.md b/changelogs-v2-mp/2026-06/17_3911_相册接口横向越权安全热修-IDOR-小程序.md deleted file mode 100644 index 9245364..0000000 --- a/changelogs-v2-mp/2026-06/17_3911_相册接口横向越权安全热修-IDOR-小程序.md +++ /dev/null @@ -1,33 +0,0 @@ -# 🔴 安全热修:小程序相册接口横向越权(IDOR)修复 — 小程序 - -> 变更类型:安全修复(后端归属校验加固,**正常使用无影响**,无契约变更) -> 端类型:小程序(相册) -> 日期:2026-06-17 -> 服务:hl-order-service-v2(相册域) -> PR:https://git.1814.love:8443/wx/HL/pulls/3911 - ---- - -## 说明 - -`api-contract-audit` 审计小程序 BFF 时发现:相册的 4 个接口存在**横向越权(IDOR)**——后端收到当前用户 userId 后未做归属校验,任意登录用户改 URL 里的 orderId/folderId/albumFileId 即可读取/操作他人订单的相册。本次已修复:后端强制校验"相册所属订单归属当前登录用户",越权一律返回"不存在"。 - -涉及接口(小程序相册): -- 订单文件夹列表、文件夹文件列表、文件下载地址获取、文件夹公开授权(写)。 - -## 前端影响:无需改动 - -- **正常使用完全不受影响**:用户访问自己订单的相册照常工作。 -- 仅"访问他人订单相册"这种越权请求会被拒(返回资源不存在)——前端正常逻辑不会触发。 -- 接口路径、入参、返回结构均未变。 - -> 如果前端有任何调试/测试代码用了非当前用户的 orderId/folderId 访问相册,请改为只访问当前用户自己的资源(之前能拿到是 bug,现已封堵)。 - -## 校验 - -| 项目 | 信息 | -|---|---| -| PR | https://git.1814.love:8443/wx/HL/pulls/3911(squash 合并 dev-v3,via api-contract-audit workflow) | -| 部署 | 已部署测试服,order-v2 双实例健康(滚动重启 uptime 刷新) | -| 测试 | 相册模块单测全绿(新增越权拒绝反例:非本人订单/null-userId/订单缺失 + happy path + 防穿透 verify) | -| 后端负责人 | wx | diff --git a/changelogs-v2-mp/2026-06/17_3915_小程序BFF接口契约审计修复-金额String+字段映射+可见性+缓存-修改接口-小程序.md b/changelogs-v2-mp/2026-06/17_3915_小程序BFF接口契约审计修复-金额String+字段映射+可见性+缓存-修改接口-小程序.md deleted file mode 100644 index e84cbf5..0000000 --- a/changelogs-v2-mp/2026-06/17_3915_小程序BFF接口契约审计修复-金额String+字段映射+可见性+缓存-修改接口-小程序.md +++ /dev/null @@ -1,85 +0,0 @@ -# 小程序 BFF 接口契约审计修复(金额 String + 字段映射 + 可见性 + 缓存)— 修改接口 — 小程序 - -> 变更类型:⚠️ 多项修复(金额类型 / 字段补全 / 可见性收紧 / 缓存行为,多数前端正向受益) -> 端类型:小程序(hl-mp-service BFF) -> 日期:2026-06-17 -> 服务:hl-mp-service -> PR:https://git.1814.love:8443/wx/HL/pulls/3915 - ---- - -## ⚠️ 关键说明 - -`api-contract-audit` 全量审计小程序 BFF 40 个核心 Controller,对抗复核实锤 100 项契约偏差。mp 是聚合层,本次修复 **mp BFF 自身的 67 处**;另有约 40 项根因在下游服务(订单/用户/资源服务),列在文末「待修清单」,会在后续审计中处理。已合并 dev-v3、部署测试服、双实例健康。 - -最影响前端的是第 1 节(金额→字符串)和第 2 节(原本恒 null 的字段现已修复)。 - ---- - -## 1. 金额字段统一为 JSON 字符串 - -多个 mp 响应 VO 的金额(BigDecimal)此前输出成 JSON 数字,本次统一改为**字符串**(与平台口径一致)。涉及:退款(退款预览/进度/详情)、发票、订单详情/列表、票务、价格明细(含按人群/优惠/附加费的逐项明细)、保费、推荐产品起价等。 - -> 前端处理:相关金额字段一律按**字符串**接收;若做过数字运算需先转数值。非金额(里程/经纬度/评分)不变。 - ---- - -## 2. 原本恒为 null 的字段已修复(前端可正常取值) - -以下字段此前因 BFF 与下游字段名不一致(反序列化失败)或 BFF 未填充而恒为 null,现已修复: - -| 模块 | 字段 | -|---|---| -| 相册文件 | thumbnailUrl、fileName、fileSize、createdAt | -| 相册订单 | coverUrl、fileCount | -| 发票详情 | invoiceTitle、taxNumber、createdAt | -| 合同 | 状态日志 *Label、出行人证件类型标签 | -| 出行人 | race、roomGroupNo(订单出行人)、travelerTypeLabel | -| 到达计划 | updateTime | - -> 前端处理:这些字段现在会返回真实值,可直接使用(之前拿到的是 null)。 - ---- - -## 3. 行为收紧(前端需配合) - -### 3.1 下架资源详情不再返回(可见性收紧) -景点 / 酒店 / 餐厅 / 活动 详情接口在 BFF 层补了「是否上架」校验,**下架(status=0)的资源详情不再返回**给小程序(之前会原样返回)。前端访问已下架资源详情会得到「不存在/不可见」,请正常处理空态。 - -### 3.2 浏览量统计 / 错误不再被缓存 -- 探索/百科详情的「浏览量+1」此前在缓存命中时不执行(统计失真),现已修复(浏览量正确累加)。 -- BFF 缓存不再缓存下游降级错误(避免 TTL 内持续返回陈旧错误)。 -- 前端无感,仅数据更准确。 - -### 3.3 定制需求状态字典修正 -定制(/mp/custom)相关接口的状态字典此前文档值有误,实际枚举为 `PENDING/PROCESSING/REPLIED/CONVERTED/CANCELLED`,请前端按此映射。 - ---- - -## 4. 待修清单(根因在下游服务,本次未修,后续处理) - -以下问题审计已发现,但根因在下游服务,不在本 PR;记录在此供前端知晓(暂仍按现状): - -- **订单服务(order-v2)相关 ~21 项**:部分字段缺失/状态机/错误码等(其中相册 4 个越权 P0 已由 PR #3911 安全热修修复)。 -- **用户服务相关 ~11 项**:出行人默认删除守卫、token 轮转、资料完善校验、足迹 HOTEL 等 — 将在用户服务审计时在源头修复。 -- **资源服务相关 ~3 项**:百科推荐排序、足迹等 — 将在资源服务审计时修复。 - ---- - -## 5. 前端 Action 清单 - -1. 第 1 节金额字段按字符串解析。 -2. 第 2 节字段现在有值,可接入使用。 -3. 下架资源详情做空态处理(第 3.1)。 -4. 定制状态映射用真实枚举(第 3.3)。 - ---- - -## 6. 关联 - -| 项目 | 信息 | -|---|---| -| PR | https://git.1814.love:8443/wx/HL/pulls/3915(squash 合并 dev-v3,via api-contract-audit + mp-internal-fix workflow) | -| 部署 | 已部署测试服,mp 双实例健康(滚动重启 uptime 刷新);公开端点 /mp/banner/active 等返 code:200 | -| 测试 | 963 单测,本次改动 add 0 新失败(另有 3 个 dev-v3 预存红与本次无关,已单独反馈后端) | -| 后端负责人 | wx | diff --git a/changelogs-v2-mp/2026-06/17_3924_用户服务接口契约审计修复-mp侧字段对齐-修改接口-小程序.md b/changelogs-v2-mp/2026-06/17_3924_用户服务接口契约审计修复-mp侧字段对齐-修改接口-小程序.md deleted file mode 100644 index 973e6cb..0000000 --- a/changelogs-v2-mp/2026-06/17_3924_用户服务接口契约审计修复-mp侧字段对齐-修改接口-小程序.md +++ /dev/null @@ -1,37 +0,0 @@ -# 用户服务接口契约审计修复(mp 侧字段/契约对齐)— 修改接口 — 小程序 - -> 变更类型:字段/契约对齐(无破坏性删除),小程序侧影响较小 -> 端类型:小程序(用户中心/首页配置/收藏足迹/出行人 OCR) -> 日期:2026-06-17 -> 服务:hl-user-service -> PR:https://git.1814.love:8443/wx/HL/pulls/3924 -> 说明:本文件随 user-service 契约审计一并产出,**暂缓推送**(与小程序侧统一节奏)。admin 侧见 changelogs-v2/2026-06/17_3924_*.md。 - ---- - -## 关键说明 - -用接口契约语义审计工作流扫描 hl-user-service 全部 Controller,mp(小程序 BFF)侧修复一批字段名/null 语义/响应结构与 Swagger 契约不符项。已合并 dev-v3、部署测试服、本地全量 2793 单测零新增回归。下面列 mp 侧对接相关变更。 - ---- - -## 1. 收藏 / 足迹(FavoriteRespVO / FootprintRespVO) - -- 响应 VO 字段名/缺字段与契约对齐;金额类字段(如有)补 `@JsonSerialize(ToStringSerializer)` 输出字符串。 -- 字段语义不变,前端按现有字段名接收即可;如此前对金额字段做数字运算,改为先转数值。 - -## 2. 首页配置(MpHomeConfig / MpHomeScreen2VO) - -- 响应结构与 Swagger 契约对齐(字段名/层级稳定化),无破坏性删除。 - -## 3. 出行人 OCR / 内容安全(MpTravelerOcr / MpContentSecurity) - -- 入参校验(`@Valid` / 校验分组)与错误码规范化;正常路径返回结构不变。 - -## 4. 站内信(InternalMpMessage / 未读数 UnreadCountRespVO) - -- 未读数等响应改强类型 VO,字段名不变。 - ---- - -> 待小程序侧统一接线时一并对照本文件;如需提前对接某一节请单独知会。 diff --git a/changelogs-v2-mp/2026-06/18_3951_到达计划出行人类型中文-修改接口-小程序端.md b/changelogs-v2-mp/2026-06/18_3951_到达计划出行人类型中文-修改接口-小程序端.md deleted file mode 100644 index da1584f..0000000 --- a/changelogs-v2-mp/2026-06/18_3951_到达计划出行人类型中文-修改接口-小程序端.md +++ /dev/null @@ -1,227 +0,0 @@ -# 【修改接口·小程序端】✨ 到达计划出行人类型中文名 travelerTypeName 新增字段 (#3951) - -> **PR**: #3954 | **服务**: hl-order-service-v3 / hl-mp-service | **更新时间**: 2026-06-18 - -## 1. 接口背景 - -小程序到达计划接口返回的出行人对象(ArrivalPlanTravelerSimpleVO)原先只包含 `travelerType` 英文枚举值,前端展示出行人类型标签时需自行维护一套映射表。本次新增 `travelerTypeName` 字段,由后端查数据字典 `traveler_type` 派生中文名直接下发,小程序侧可零配置展示类型标签。原 `travelerType` 字段保留不变,属纯新增、非破坏性变更。 - -## 2. 变更清单 - -| # | 接口 | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|------|----------|------| -| 1 | 获取到达计划(一期路径) | GET | /mp/order/{orderId}/arrival | 新增出参字段 | 出行人对象新增 `travelerTypeName` | -| 2 | 获取到达计划(v3 路径) | GET | /mp/v3/order/arrival/{orderId} | 新增出参字段 | 出行人对象新增 `travelerTypeName` | - -> 以上两个路径均经网关路由至 hl-mp-service,数据源为 order-v3 侧透传。 - -## 3. 接口详情 - -### 3.1 获取到达计划(一期路径) - -- **使用场景**:小程序出行人填写或出行信息确认页,加载出行人到达计划详情。 -- **认证**:需要微信登录态 JWT(C 端 token)。 -- **幂等性**:是(只读)。 -- **限流**:无。 - -入参无变化。出参中 `travelers[]` 数组每个 `ArrivalPlanTravelerSimpleVO` 元素新增 `travelerTypeName` 字段(String)。 - -### 3.2 获取到达计划(v3 路径) - -- **使用场景**:同上,v3 版本接口路径,功能与 3.1 等价。 -- **认证**:需要微信登录态 JWT(C 端 token)。 -- **幂等性**:是(只读)。 -- **限流**:无。 - -入参无变化。出参中 `travelers[]` 数组每个 `ArrivalPlanTravelerSimpleVO` 元素新增 `travelerTypeName` 字段(String)。 - -## 4. 接口入参 - -### 4.1 路径参数 / Query 参数 - -| 接口 | 字段 | 类型 | 必填 | 说明 | -|------|------|------|------|------| -| GET /mp/order/{orderId}/arrival | orderId | String(Long) | 是 | 路径参数,订单 ID | -| GET /mp/v3/order/arrival/{orderId} | orderId | String(Long) | 是 | 路径参数,订单 ID | - -### 4.2 请求体字段 - -均为 GET 接口,无请求体。入参无变化。 - -## 5. 出参(响应) - -### 5.1 ArrivalPlanTravelerSimpleVO 字段 - -| 字段 | 类型 | 变更 | 说明 | -|------|------|------|------| -| id | String | 不变 | 出行人记录 ID | -| name | String | 不变 | 出行人姓名(脱敏后) | -| travelerType | String | 不变 | 出行人类型枚举值,见 §6 | -| travelerTypeName | String | **新增** | 出行人类型中文名,由数据字典 `traveler_type` 派生 | - -> 其余字段视接口版本可能含到达信息、证件信息等,本次仅新增 `travelerTypeName`,其余字段不变。 - -## 6. 枚举 / 数据字典 - -### 6.1 travelerType(数据字典:traveler_type) - -**所属字段**:`travelerType`(出参,保留不变)与 `travelerTypeName`(出参,新增中文名) | **类型**:`String` - -| 枚举值 | 中文名(travelerTypeName) | 说明 | -|--------|--------------------------|------| -| `ADULT` | 成人 | 成年旅客 | -| `CHILD` | 儿童 | 儿童旅客(含独立占位) | -| `YOUNG_CHILD` | 小童 | 小童旅客(不占位或半占位) | -| `BABY` | 幼童 | 婴幼儿(不占位) | - -> 字典降级说明:若数据字典 `traveler_type` 中对应 key 缺失,后端使用枚举内置 label 兜底,小程序侧无需处理。 - -## 7. 错误码 - -本次为纯新增字段,无新增错误码。原有错误码不变。 - -| code | 含义 | 触发场景 | -|------|------|----------| -| 581201 | 订单不存在 | orderId 无效 | -| 401 | 未认证 | 未携带或微信 JWT 过期 | -| 403 | 无权限 | 当前用户无权查看该订单的到达计划 | - -## 8. 示例(3 组:典型 / 边界 / 异常) - -### 8.1 典型成功 — 获取到达计划(含新字段) - -请求: -``` -GET /mp/v3/order/arrival/2067178767255560193 -Authorization: Bearer -``` - -响应: -```json -{ - "code": 200, - "data": { - "orderId": "2067178767255560193", - "travelers": [ - { - "id": "2067178767255560201", - "name": "张*明", - "travelerType": "ADULT", - "travelerTypeName": "成人" - }, - { - "id": "2067178767255560202", - "name": "张*", - "travelerType": "YOUNG_CHILD", - "travelerTypeName": "小童" - } - ] - }, - "message": "ok", - "success": true -} -``` - -### 8.2 边界情况 — 仅含 BABY 类型出行人 - -请求: -``` -GET /mp/order/2067178767255560194/arrival -Authorization: Bearer -``` - -响应(含 BABY 类型,travelerTypeName 正常返回): -```json -{ - "code": 200, - "data": { - "orderId": "2067178767255560194", - "travelers": [ - { - "id": "2067178767255560211", - "name": "李*强", - "travelerType": "ADULT", - "travelerTypeName": "成人" - }, - { - "id": "2067178767255560212", - "name": "李小宝", - "travelerType": "BABY", - "travelerTypeName": "幼童" - } - ] - }, - "message": "ok", - "success": true -} -``` - -### 8.3 业务失败 — 订单不存在 - -请求: -``` -GET /mp/v3/order/arrival/9999999999999999999 -Authorization: Bearer -``` - -响应: -```json -{ - "code": 581201, - "data": null, - "message": "订单不存在", - "success": false -} -``` - -## 9. 业务边界 - -- 适用:用户已登录且有权限访问该订单,处于任何订单状态均可查询到达计划(只读接口)。 -- 适用:四种出行人类型(ADULT / CHILD / YOUNG_CHILD / BABY)均有对应 `travelerTypeName` 中文名。 -- 特殊边界:若数据字典维护缺失某枚举值,`travelerTypeName` 降级返回枚举内置中文名,不会返回 null,小程序无需做 null 保护。 -- 特殊边界:`travelerType` 原字段值不变,若小程序已有本地映射逻辑,可继续保留或切换为直接展示 `travelerTypeName`,两者等价。 - -## 10. 修改前后对比 - -### 10.1 字段级对比 - -| VO | 字段 | 改前 | 改后 | -|----|------|------|------| -| ArrivalPlanTravelerSimpleVO | travelerTypeName | 不存在 | **新增** String,出行人类型中文名 | -| ArrivalPlanTravelerSimpleVO | travelerType | 原样返回英文枚举值 | 保留不变 | - -### 10.2 行为级对比 - -| 行为 | 改前 | 改后 | -|------|------|------| -| 出行人类型展示 | 小程序自行维护 ADULT→成人 等映射表 | 后端直接下发 travelerTypeName,小程序可直接渲染 | -| 字典缺失兜底 | 无 | 降级用枚举内置 label,小程序无感知 | - -## 11. 影响评估 / 回滚 - -### 11.1 影响评估 - -- **是否破坏向后兼容**:**否**,纯新增字段,原字段不变、原结构不变。 -- **前端是否必须同步上线**:**否**,旧小程序代码不读新字段也不会出错,可按需对接。 - -### 11.2 回滚方案 - -- **回滚方式**:revert PR #3954 并重新部署 hl-order-service-v3 及 hl-mp-service,返回字段恢复为无 travelerTypeName 的旧结构。 - -## 12. 注意事项 - -- 前端 workaround 清理点:若小程序已有本地 `travelerType → 中文` 映射对象/函数,上线后可切换为直接读取 `travelerTypeName`,原映射逻辑可清理。 -- `travelerTypeName` 由后端数据字典派生,字典修改后立即生效(无需小程序发版),字典当前值为:ADULT=成人 / CHILD=儿童 / YOUNG_CHILD=小童 / BABY=幼童。 -- `/mp/order/{orderId}/arrival`(一期路径)与 `/mp/v3/order/arrival/{orderId}`(v3 路径)行为一致,都已包含新字段,小程序按当前接入的路径对接即可。 - -## 13. 关联 / 联系人 - -### 13.1 链接 - -- **Issue**: [#3951](https://git.1814.love:8443/wx/HL/issues/3951) -- **PR**: [#3954](https://git.1814.love:8443/wx/HL/pulls/3954) -- **Merge commit**: [16d77c9a5](https://git.1814.love:8443/wx/HL/commit/16d77c9a5) - -### 13.2 联系人 - -- **后端负责人**: @yaosutu diff --git a/changelogs-v2-mp/2026-06/18_3976_出行人类型由出生日期派生-修改接口-小程序端.md b/changelogs-v2-mp/2026-06/18_3976_出行人类型由出生日期派生-修改接口-小程序端.md deleted file mode 100644 index a350e5a..0000000 --- a/changelogs-v2-mp/2026-06/18_3976_出行人类型由出生日期派生-修改接口-小程序端.md +++ /dev/null @@ -1,316 +0,0 @@ -# 【修改接口·小程序端】出行人类型改为由出生日期自动派生,birthday 必填、travelerType 入参移除 (#3976) - -> **PR**: #3981 | **服务**: hl-order-service-v3 | **更新时间**: 2026-06-18 - -## 1. 接口背景 - -小程序客户出行人补全接口(batch-edit)原先要求客户端传入 `travelerType`(出行人类型枚举值)。本次调整将出行人类型的计算权收归后端:**客户端只需传 `birthday`(出生日期),后端按年龄段自动派生 `travelerType`**,入参不再接受 `travelerType` 字段(传了也会被忽略)。 - -`birthday` 同步从选填升级为**必填**,不传报 400。响应 VO 不变,`travelerType` / `travelerTypeName` 仍正常返回,展示层无需改动。 - -> 本次为破坏性入参变更:移除 `travelerType` 入参 + `birthday` 改必填。 - -## 2. 变更清单 - -| # | 接口 | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|------|----------|------| -| 1 | 客户出行人补全 | POST | /v3/internal/mp/order/{id}/traveler/batch-edit | 入参破坏性变更 | 出行人对象移除 `travelerType`,`birthday` 改必填 | - -## 3. 接口详情 - -### 3.1 客户出行人补全(POST /v3/internal/mp/order/{id}/traveler/batch-edit) - -- **使用场景**:小程序用户自助补全出行信息时,批量 upsert 出行人列表(id=null 新增,id 有值则更新)。 -- **认证**:需要微信登录态 JWT(C 端 token)。 -- **幂等性**:否(写入操作)。 -- **限流**:无。 - -入参中每个出行人对象移除 `travelerType` 字段,`birthday` 改为必填。响应 VO 不变。 - -## 4. 接口入参 - -### 4.1 路径参数 / Query 参数 - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| id | String(Long) | 是 | 路径参数,订单 ID | - -### 4.2 请求体字段 - -请求体外层结构示例: - -```json -{ - "travelers": [{}] -} -``` - -**出行人对象字段表**: - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| id | String(Long) | 否 | null 或不传=新增;有值=更新已有出行人 | -| name | String | 否 | 出行人姓名 | -| gender | String | 否 | 性别字典码(1=男 / 2=女 / 0=未知) | -| birthday | String | **是** | 出生日期,格式 yyyy-MM-dd,不能晚于今天。**本次改为必填** | -| idType | String | 否 | 证件类型枚举值,见第 6 节 | -| idNo | String | 否 | 证件号码(明文) | -| nationality | String | 否 | 国籍 | -| race | String | 否 | 民族 | -| phone | String | 否 | 手机号 | -| emergencyContact | String | 否 | 紧急联系人 | -| emergencyPhone | String | 否 | 紧急联系人电话 | -| roomGroupNo | Integer | 否 | 房间分组编号(团期订单使用) | -| travelerType(已移除) | — | — | 入参已移除,传入将被忽略;后端按 birthday 自动派生 | - -## 5. 出参(响应) - -响应 VO 结构**不变**,`travelerType` 和 `travelerTypeName` 仍正常返回。 - -### 5.1 响应列表元素(TravelerVO 关键字段) - -| 字段 | 类型 | 说明 | -|------|------|------| -| id | String | 出行人记录 ID | -| orderId | String | 所属订单 ID | -| travelerType | String | 出行人类型枚举值(后端由 birthday 派生后返回) | -| travelerTypeName | String | 出行人类型中文名(成人 / 儿童 / 小童 / 幼童) | -| name | String | 出行人姓名 | -| birthday | String | 出生日期(yyyy-MM-dd) | -| idType | String | 证件类型枚举值 | -| idTypeName | String | 证件类型中文名 | -| idCardMasked | String | 证件号(脱敏后) | -| gender | String | 性别字典码 | -| nationality | String | 国籍 | - -## 6. 枚举 / 数据字典 - -### 6.1 travelerType 派生规则(后端自动计算,前端仅需理解出参含义) - -| 年龄段(按 birthday 计算) | travelerType 枚举值 | travelerTypeName | -|--------------------------|-------------------|-----------------| -| 0-1 岁(未满 2 周岁) | BABY | 幼童 | -| 2-6 岁(未满 7 周岁) | YOUNG_CHILD | 小童 | -| 7-17 岁(未满 18 周岁) | CHILD | 儿童 | -| 18 岁及以上 | ADULT | 成人 | - -### 6.2 idType(证件类型字典:id_card_type) - -| 枚举值 | 中文名 | 说明 | -|--------|--------|------| -| ID_CARD | 身份证 | 中国居民身份证 | -| PASSPORT | 护照 | 中外护照 | -| BIRTH_CERT | 出生证明 | 婴幼儿出生医学证明 | -| HK_MACAU | 港澳通行证 | 港澳居民来往内地通行证 | -| TAIWAN | 台胞证 | 台湾居民来往大陆通行证 | -| MILITARY | 军官证 | 军人证件 | - -## 7. 错误码 - -| code | 含义 | 触发场景 | -|------|------|----------| -| 400 | 出生日期不能为空 | 出行人对象未传 birthday 或传 null | -| 400 | 出生日期不能晚于今天 | birthday 传入了未来日期 | -| 581201 | 订单不存在 | orderId 无效 | -| 581200 | 出行人不存在 | 传了无效的出行人 id(更新场景) | -| 401 | 未认证 | 未携带或微信 JWT 过期 | -| 403 | 无权限 | 当前用户无权操作该订单的出行人 | - -## 8. 示例(3 组:典型 / 边界 / 异常) - -### 8.1 典型成功 — 补全两位出行人(成人 + 儿童,含 birthday,不传 travelerType) - -请求:POST /v3/internal/mp/order/2067178767255560193/traveler/batch-edit,Authorization: Bearer - -请求体示例: - -```json -{ - "travelers": [ - { - "id": null, - "name": "张三", - "gender": "1", - "birthday": "1990-05-20", - "idType": "ID_CARD", - "idNo": "110101199005201234" - }, - { - "id": null, - "name": "张小宝", - "gender": "1", - "birthday": "2019-08-10", - "idType": "BIRTH_CERT", - "idNo": "P110101201908101234" - } - ] -} -``` - -响应示例: - -```json -{ - "code": 200, - "data": [ - { - "id": "2067178767255560201", - "orderId": "2067178767255560193", - "travelerType": "ADULT", - "travelerTypeName": "成人", - "name": "张三", - "birthday": "1990-05-20", - "idType": "ID_CARD", - "idTypeName": "身份证", - "idCardMasked": "110***********1234", - "gender": "1" - }, - { - "id": "2067178767255560202", - "orderId": "2067178767255560193", - "travelerType": "CHILD", - "travelerTypeName": "儿童", - "name": "张小宝", - "birthday": "2019-08-10", - "idType": "BIRTH_CERT", - "idTypeName": "出生证明", - "idCardMasked": "P1101012019****1234", - "gender": "1" - } - ], - "message": "ok", - "success": true -} -``` - -### 8.2 边界情况 — 幼童(birthday 未满 2 周岁,派生 BABY) - -请求体示例: - -```json -{ - "travelers": [ - { - "id": null, - "name": "李小婴", - "gender": "2", - "birthday": "2025-06-01", - "idType": "BIRTH_CERT", - "idNo": "P110101202506011234" - } - ] -} -``` - -响应示例: - -```json -{ - "code": 200, - "data": [ - { - "id": "2067178767255560210", - "orderId": "2067178767255560193", - "travelerType": "BABY", - "travelerTypeName": "幼童", - "name": "李小婴", - "birthday": "2025-06-01", - "idType": "BIRTH_CERT", - "idTypeName": "出生证明", - "idCardMasked": "P1101012025****1234", - "gender": "2" - } - ], - "message": "ok", - "success": true -} -``` - -### 8.3 业务失败 — birthday 缺失,报出生日期不能为空 - -请求体示例(缺少 birthday): - -```json -{ - "travelers": [ - { - "name": "王五", - "gender": "1" - } - ] -} -``` - -响应示例: - -```json -{ - "code": 400, - "data": null, - "message": "出生日期不能为空", - "success": false -} -``` - -## 9. 业务边界 - -- 适用:用户已登录且有权限操作该订单,且订单处于可编辑出行人的状态时可调用。 -- 不适用:订单已完成(COMPLETED)或已取消(CANCELLED)后,出行人信息不可再写入。 -- 特殊边界:birthday 为整周岁当天(如刚满 2 岁、7 岁、18 岁生日当天)时,当天即按新档位计算(满龄升档)。 -- 特殊边界:如果小程序端表单中仍有 travelerType 字段的存储或传入,不影响功能(后端忽略),建议同步清理。 -- 特殊边界:birthday 只允许不晚于今天的日期,传入未来日期(包括明天)报 400。 -- 特殊边界:birthday 格式须为 yyyy-MM-dd,格式错误报 400。 - -## 10. 修改前后对比 - -### 10.1 字段级对比(入参) - -| 字段 | 改前 | 改后 | -|------|------|------| -| travelerType(入参) | 选填,由客户端传入,控制出行人类型 | 已移除,传入被忽略 | -| birthday(入参) | 选填 | 必填,不传报 400 | - -### 10.2 字段级对比(出参,不变) - -| 字段 | 改前 | 改后 | -|------|------|------| -| travelerType(出参) | 返回客户端传入值 | 返回后端按 birthday 派生值(语义不变) | -| travelerTypeName(出参) | 返回中文名 | 不变 | -| birthday(出参) | 原样返回 | 不变 | - -### 10.3 行为级对比 - -| 行为 | 改前 | 改后 | -|------|------|------| -| 出行人类型来源 | 客户端传入 travelerType,后端直接存储 | 后端按 birthday 自动派生,客户端无需传 | -| birthday 必填性 | 选填,不传不报错 | 必填,不传报 400 | - -## 11. 影响评估 / 回滚 - -### 11.1 影响评估 - -- **是否破坏向后兼容**:是,birthday 改必填属破坏性变更。旧版小程序表单若未传 birthday,保存时报 400。 -- **小程序是否必须同步上线**:是。调用 batch-edit 接口时,必须确保每个出行人对象带 birthday;原有 travelerType 入参代码可同步清理。 - -### 11.2 回滚方案 - -- **回滚方式**:revert PR #3981 并重新部署 hl-order-service-v3,恢复 travelerType 入参有效 + birthday 选填的旧行为。 - -## 12. 注意事项 - -- 出行人类型选择器如果仅用于控制 travelerType 入参,本次可直接移除,出行人类型由 birthday 派生后在响应中正常回显,展示无需调整。 -- birthday 格式严格为 yyyy-MM-dd(如 1990-05-20),不接受时间戳或其他格式。 -- 响应中的 travelerType / travelerTypeName 仍正常返回,出行人卡片上的类型标签展示逻辑无需改动。 -- 年龄以服务器当天日期(北京时间)计算,生日当天视为满周岁。 - -## 13. 关联 / 联系人 - -### 13.1 链接 - -- **Issue**: [#3976](https://git.1814.love:8443/wx/HL/issues/3976) -- **PR**: [#3981](https://git.1814.love:8443/wx/HL/pulls/3981) -- **Merge commit**: [8209c5702](https://git.1814.love:8443/wx/HL/commit/8209c5702) - -### 13.2 联系人 - -- **后端负责人**: @yaosutu diff --git a/changelogs-v2-mp/2026-06/19_4058_到达计划自驾时段label含时间范围-修改接口-小程序端.md b/changelogs-v2-mp/2026-06/19_4058_到达计划自驾时段label含时间范围-修改接口-小程序端.md deleted file mode 100644 index 49e652d..0000000 --- a/changelogs-v2-mp/2026-06/19_4058_到达计划自驾时段label含时间范围-修改接口-小程序端.md +++ /dev/null @@ -1,44 +0,0 @@ -# 【修改接口·小程序端】到达计划自驾时段 selfDrivePeriodLabel 文案口径含时间范围 - -> **PR**: #4061 | **服务**: hl-order-service-v3(经 mp-service 透传)| **更新时间**: 2026-06-19 - -## 1. 接口背景 - -大交通枚举改造(#4061)统一了自驾时段 `SelfDrivePeriod` 枚举的中文 label 口径,含时间范围。到达计划(mp)出参 `ArrivalPlanRespVO.selfDrivePeriodLabel` 随之变化。前端直接显示该 label,**无需改代码**,只是显示文案更详细了。 - -## 2. 变更清单 - -| 接口 | 方法 | 路径 | 变更 | -|---|---|---|---| -| 到达计划查询 | GET | /v3/internal/mp/order/arrival/{orderId} | 出参 selfDrivePeriodLabel 文案口径变化 | - -(同枚举也用于 mp 创建/更新/批量接口的回显出参) - -## 3. 出参变化 - -| 字段 | 类型 | 变更 | 说明 | -|---|---|---|---| -| selfDrivePeriodLabel | String | 文案口径调整 | 自驾时段中文,由「上午/下午/晚上」改为含时间范围 | - -## 4. 枚举 / 数据字典 - -| selfDrivePeriod 码值 | 改前 label | 改后 label | -|---|---|---| -| MORNING | 上午 | **上午(06:00-12:00)** | -| AFTERNOON | 下午 | **下午(12:00-18:00)** | -| EVENING | 晚上 | **晚上(18:00-24:00)** | - -## 5. 影响评估 - -- **破坏向后兼容**:否。`selfDrivePeriod` 码值不变,仅 `selfDrivePeriodLabel` 展示文案更详细。 -- **前端是否需改**:否,前端直接展示 label 即可(显示内容自动变详细)。**例外**:若前端有按 label 文案做精确匹配/判断的逻辑(不推荐),需改为按 `selfDrivePeriod` 码值判断。 - -## 6. 注意事项 - -- 自驾时段判断逻辑请用 `selfDrivePeriod` 码值(MORNING/AFTERNOON/EVENING),不要依赖 `selfDrivePeriodLabel` 文案。 - -## 7. 关联 / 联系人 - -- **Issue**: [#4058](https://git.1814.love:8443/wx/HL/issues/4058) -- **PR**: [#4061](https://git.1814.love:8443/wx/HL/pulls/4061) -- **后端负责人**: @yaosutu diff --git a/changelogs-v2-mp/2026-06/21_4154_出行人补全订单确认后禁止mp编辑-修改接口-小程序端.md b/changelogs-v2-mp/2026-06/21_4154_出行人补全订单确认后禁止mp编辑-修改接口-小程序端.md deleted file mode 100644 index 0f83ee3..0000000 --- a/changelogs-v2-mp/2026-06/21_4154_出行人补全订单确认后禁止mp编辑-修改接口-小程序端.md +++ /dev/null @@ -1,65 +0,0 @@ -# 【修改接口·小程序端】客户出行人补全:订单确认后禁止 mp 端编辑(新增门禁 + 错误码 581145)(CR) - -> **PR**: #4154 | **服务**: hl-order-service-v3 | **更新时间**: 2026-06-21 - -## 1. 接口背景 - -小程序客户出行人补全接口(batch-edit)此前**未在后端强制限制可编辑的订单阶段**:客户端只要订单属于本人,任意阶段都能提交编辑。本次安全/一致性收紧:**仅订单确认前(待支付 / 定制中)允许经小程序编辑出行人;订单确认后(待出行起)及已完成 / 已取消一律拒绝**,返回新错误码 `581145`。 - -收紧原因:订单确认后修改出行人 PII(姓名 / 手机 / 生日等)会误触发后端「合同作废重签 + 退保重投保」链路,造成非预期的合同与保单churn。证件号此前已在签约后冻结,本次把整个编辑动作按订单阶段收口。 - -> 本次为行为收紧(破坏性变更面向「确认后仍调用」的旧逻辑)。按产品生命周期,出行人补全本就发生在「待补全信息」窗口(定制中阶段),正常流程不受影响。 - -## 2. 变更清单 - -| # | 接口 | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|------|----------|------| -| 1 | 客户出行人补全 | POST | /v3/internal/mp/order/{id}/traveler/batch-edit | 行为收紧 | 订单非「待支付/定制中」阶段调用直接拒绝(581145);入参 / 出参结构不变 | - -## 3. 关键说明 - -- **放行阶段(白名单)**:`order_status ∈ {PENDING_PAY 待支付, CUSTOMIZING 定制中}`。 -- **拒绝阶段**:`PENDING_DEPARTURE 待出行(确认后)/ TRAVELLING 出行中 / COMPLETED 已完成 / CANCELLED 已取消`,以及任何其他状态(白名单 fail-closed)。 -- 拒绝时**整单不写入**(事务回滚),返回 `code=581145`。 -- 入参字段、出参 VO 结构**完全不变**,仅新增前置阶段校验。 -- 本门禁**只约束小程序(mp)路径**;定制师 / admin 后台路径不受限(如需确认后变更出行人,请走定制师后台)。 - -## 4. 入参 / 出参 - -入参(请求体 travelers[] + 路径 id)与响应 VO **均不变**,详见既有文档(如 #3976 出行人补全契约)。本次仅在订单阶段不满足时提前抛 581145。 - -## 5. 错误码 - -| code | 含义 | 触发场景 | 本次 | -|------|------|----------|------| -| **581145** | 订单已确认,出行人信息不可再经小程序修改,如需变更请联系定制师 | 订单 status 不在 {待支付, 定制中} 白名单(即确认后 / 已完成 / 已取消)时调用 batch-edit | **新增** | -| 581102 | 订单不存在,无法编辑出行人 | orderId 无效 | 不变 | -| 581122 | 订单不属于当前用户 | 当前登录 userId 与订单归属不一致(横向越权拦截) | 不变 | - -## 6. 前端处理建议 - -- 出行人编辑入口建议按订单状态控制:仅在「待支付 / 定制中(待补全信息)」展示可编辑表单;订单确认后置为只读。 -- 若仍调用 batch-edit 命中 581145,按 message 文案提示用户「订单已确认,如需修改出行人请联系定制师」,不要静默失败。 -- 正常按生命周期编辑(确认前补全)的前端流程**无需改动**。 - -## 7. 业务边界 - -- 适用:订单 `order_status = PENDING_PAY` 或 `CUSTOMIZING`,且出行人属本人订单(581122 越权拦截照旧)。 -- 不适用:订单确认后(PENDING_DEPARTURE 起)/ 已完成 / 已取消 —— 一律 581145 拒绝。 -- 证件号(idNo)在合同已签(contract_status=SIGNED)时本就冻结(581111),本次门禁覆盖范围更靠前(按订单阶段整体拦截)。 - -## 8. 影响评估 / 回滚 - -- **向后兼容**:对「确认前编辑」的正常流程兼容;对「确认后仍调用 batch-edit」的旧行为为破坏性收紧(此前会误触发重签,属应修缺陷)。 -- **小程序是否必须同步上线**:建议同步——确认后隐藏 / 禁用编辑入口 + 处理 581145 文案;不同步也不会造成数据错误(后端已兜底拒绝)。 -- **回滚**:revert PR #4154 重新部署 hl-order-service-v3,恢复不限阶段编辑的旧行为。 - -## 9. 关联 / 联系人 - -### 9.1 链接 - -- **PR**: [#4154](https://git.1814.love:8443/wx/HL/pulls/4154)(CR 发现,无关联 Issue) - -### 9.2 联系人 - -- **后端负责人**: @wx diff --git a/changelogs-v2-mp/2026-06/21_4174_发票小程序端申请+可见性+签名下载-新增接口-小程序端.md b/changelogs-v2-mp/2026-06/21_4174_发票小程序端申请+可见性+签名下载-新增接口-小程序端.md deleted file mode 100644 index 95fd971..0000000 --- a/changelogs-v2-mp/2026-06/21_4174_发票小程序端申请+可见性+签名下载-新增接口-小程序端.md +++ /dev/null @@ -1,241 +0,0 @@ -# 发票补齐 - 小程序端申请 + 可见性过滤 + 签名下载(小程序端) - -> Issue: [#4174](https://git.1814.love:8443/wx/HL/issues/4174) / [#4182](https://git.1814.love:8443/wx/HL/issues/4182) -> PR: [#4181](https://git.1814.love:8443/wx/HL/pulls/4181)(mp 端申请+可见性)/ [#4184](https://git.1814.love:8443/wx/HL/pulls/4184)(签名下载) -> 日期: 2026-06-21 -> 服务: hl-order-service-v3(invoice 域) -> 端类型: 小程序端 - ---- - -## 1. 接口背景 - -小程序发票模块本次补齐三项改动: - -- **申请门槛收紧**(PR4 / Issue #4174):原 collab 域 POST /v3/internal/mp/order/{orderId}/invoice/apply 路径不变,但实现从 collab 迁入 invoice 域,门槛由宽松(可叠加多张)改为严格(一单一票 + 订单必须 COMPLETED + 金额不超订单总价)。 -- **出参可见性过滤**(PR4):GET /v3/internal/mp/order/{orderId}/invoice/list 和 GET /v3/internal/mp/order/invoice/{invoiceId}/detail 出参中,fileUrl 字段现在仅在 ISSUED / PUSHED 状态时返回;REQUESTED 状态返回 null(处理中,前端勿展示 PDF 链接)。 -- **新增签名下载端点**(#4184 / Issue #4182):GET /v3/internal/mp/order/invoice/{invoiceId}/download,返回 1 小时有效期 OSS 签名 URL,供前端调 wx.openDocument 预览或下载发票 PDF。 - ---- - -## 2. 变更清单 - -| # | 接口 | 变更类型 | 说明 | -|---|------|----------|------| -| 1 | POST /v3/internal/mp/order/{orderId}/invoice/apply | 修改接口(行为收紧) | 申请门槛由宽松改严格:一单一票 + 订单 COMPLETED + 金额不超总价;resp status 字段值从 APPLIED 改为 REQUESTED | -| 2 | GET /v3/internal/mp/order/{orderId}/invoice/list | 修改接口(字段行为变化) | fileUrl 字段:REQUESTED 状态由有值改为 null;ISSUED / PUSHED 保持有值 | -| 3 | GET /v3/internal/mp/order/invoice/{invoiceId}/detail | 修改接口(字段行为变化) | fileUrl 字段同上:REQUESTED 返 null,ISSUED / PUSHED 有值 | -| 4 | GET /v3/internal/mp/order/invoice/{invoiceId}/download | 新增接口 | 返回发票 PDF 的 OSS 签名下载 URL(1 小时有效期),含 IDOR 鉴权 | - ---- - -## 3. 接口详情 - -认证:所有接口走小程序 JWT 认证,Header 携带 Authorization: Bearer token(小程序 openId → userId)。 -幂等性:apply 非幂等(一单一票,重复提交报 581511);download 幂等(每次生成新签名 URL)。 -限流:网关全局限流。 - ---- - -## 4. 接口入参 - -### 4.1 路径参数 / Query 参数 - -| 接口 | 参数名 | 类型 | 必填 | 说明 | -|------|--------|------|------|------| -| POST /{orderId}/apply | orderId | Long | 是 | 路径参数,订单 ID | -| GET /{orderId}/invoice/list | orderId | Long | 是 | 路径参数,订单 ID | -| GET /invoice/{invoiceId}/detail | invoiceId | Long | 是 | 路径参数,发票 ID | -| GET /invoice/{invoiceId}/download | invoiceId | Long | 是 | 路径参数,发票 ID | - -### 4.2 请求体字段 - -**POST /v3/internal/mp/order/{orderId}/invoice/apply** - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| amount | String | 是 | 开票金额(字符串,单位元),不超过订单总价 | -| invoiceType | String | 是 | 发票类型,枚举见 6 节 | -| titleType | String | 是 | 抬头类型:PERSONAL / COMPANY | -| title | String | 是 | 发票抬头(姓名或公司名) | -| taxNo | String | 条件必填 | 税号(titleType=COMPANY 时必填) | -| bankName | String | 条件必填 | 开户行(invoiceType=VAT_SPECIAL 时必填) | -| bankAccount | String | 条件必填 | 银行账号(invoiceType=VAT_SPECIAL 时必填) | -| registAddress | String | 条件必填 | 注册地址(invoiceType=VAT_SPECIAL 时必填) | -| registPhone | String | 条件必填 | 注册电话(invoiceType=VAT_SPECIAL 时必填) | -| email | String | 条件必填 | 收票邮箱(invoiceType=ELECTRONIC 时必填) | -| remark | String | 否 | 备注 | - -GET 接口无请求体。 - ---- - -## 5. 出参字段 - -**POST /v3/internal/mp/order/{orderId}/invoice/apply** - -| 字段 | 类型 | 说明 | -|------|------|------| -| id | String | 新建发票 ID(Long 序列化) | -| status | String | 固定为 REQUESTED | - -注意:status 值此前旧实现返回 APPLIED(collab 域),新实现返回 REQUESTED(invoice 域)。请前端对齐新值。 - -**GET /v3/internal/mp/order/{orderId}/invoice/list(单条字段,变化部分)** - -| 字段 | 原来行为 | 现在行为 | -|------|---------|---------| -| fileUrl | REQUESTED / ISSUED / PUSHED 均有值 | REQUESTED 返 null;ISSUED / PUSHED 有值 | - -其余字段不变(id / orderId / status / statusName / amount / invoiceType / title / taxNo / createTime 等)。 - -**GET /v3/internal/mp/order/invoice/{invoiceId}/detail(变化部分)** - -| 字段 | 原来行为 | 现在行为 | -|------|---------|---------| -| fileUrl | 同上,恒有值 | REQUESTED 返 null;ISSUED / PUSHED 有值 | - -**GET /v3/internal/mp/order/invoice/{invoiceId}/download(新增接口)** - -| 字段 | 类型 | 说明 | -|------|------|------| -| fileUrl | String | OSS 签名下载 URL(1 小时有效期,格式为 HTTPS 带签名参数的 URL) | -| pdfName | String | PDF 文件名(可选,用于 wx.openDocument 的 name 参数) | - ---- - -## 6. 枚举 / 数据字典 - -**InvoiceStatus - 发票状态(影响 fileUrl 可见性)** - -| 枚举值 | 中文名 | fileUrl 是否可见 | -|--------|--------|----------------| -| REQUESTED | 待开票 | null(处理中,前端勿展示 PDF 链接) | -| ISSUED | 已开票 | 有值 | -| PUSHED | 已推送 | 有值 | -| VOIDED | 已作废 | null | - -**InvoiceType - 发票类型** - -| 枚举值 | 中文名 | -|--------|--------| -| VAT_NORMAL | 增值税普通发票 | -| VAT_SPECIAL | 增值税专用发票 | -| ELECTRONIC | 电子发票 | - -**TitleType - 抬头类型** - -| 枚举值 | 中文名 | -|--------|--------| -| PERSONAL | 个人 | -| COMPANY | 公司 | - ---- - -## 7. 错误码 - -| 错误码 | 常量 | 触发场景 | -|--------|------|----------| -| 581510 | INVOICE_ORDER_NOT_COMPLETED | 订单状态非 COMPLETED,不可申请开票 | -| 581511 | INVOICE_ALREADY_EXISTS | 该订单已有有效发票,不可重复申请(一单一票) | -| 581512 | INVOICE_AMOUNT_EXCEED | 开票金额超过订单总价 | -| 581513 | INVOICE_TYPE_INVALID | 发票类型枚举值非法 | -| 581514 | INVOICE_TAX_NO_REQUIRED | 公司抬头 / 专票时税号为必填 | -| 581515 | INVOICE_VAT_SPECIAL_FIELDS_REQUIRED | 专票时开户行 / 银行账号 / 注册地址 / 注册电话为必填 | -| 581516 | INVOICE_EMAIL_REQUIRED | 电子发票时邮箱为必填 | -| 581517 | INVOICE_NOT_DOWNLOADABLE | 发票尚未开具(REQUESTED / VOIDED 状态),暂时无法下载 | -| 581518 | INVOICE_FORBIDDEN | 无权访问该发票(IDOR 防护,含发票不存在场景) | -| 581519 | INVOICE_SIGNED_URL_FAILED | 获取签名下载 URL 失败,请稍后重试(hl-user-service 暂时不可用) | - ---- - -## 8. 示例 - -### 8.1 典型成功:申请开票 - -POST /v3/internal/mp/order/1234567890123456789/invoice/apply - -请求体: - - -响应: - - -### 8.2 边界情况:列表中 REQUESTED 状态 fileUrl 为 null - -GET /v3/internal/mp/order/1234567890123456789/invoice/list 响应示例(某张待开票发票): - - -### 8.3 业务失败:REQUESTED 状态发票不可下载 - -GET /v3/internal/mp/order/invoice/111/download - -响应: - - ---- - -## 9. 业务边界 - -**适用:** -- 申请:订单状态必须为 COMPLETED;无有效发票(一单一票);金额不超订单总价 -- 下载:发票状态为 ISSUED 或 PUSHED;且该发票属于当前登录用户的订单 - -**不适用:** -- 订单 COMPLETED 之前不可申请 -- 已有有效发票,不可重复申请 -- REQUESTED / VOIDED 状态发票不可下载(报 581517) -- 访问他人订单的发票报 581518(IDOR 防护,不返回 404 以避免泄露存在性) - -**特殊边界:** -- 签名 URL 有效期 1 小时。前端如果缓存了 fileUrl,每次打开下载前须重新调 download 接口获取最新签名 URL,不可长期复用。 -- wx.openDocument 下载后端直接返回签名 URL,前端无需中转。 - ---- - -## 10. 修改前后对比 - -### POST apply 申请门槛变化 - -| 项目 | 变更前(旧 collab 实现) | 变更后(invoice 域) | -|------|----------------------|-------------------| -| 一单一票限制 | 无(可叠加多张) | 有(existsActiveByOrderId 拦截) | -| 金额校验 | 已开+本次 <= 总价 | 本次金额 <= 总价(一单一票前提下等价) | -| 响应 status 值 | APPLIED | REQUESTED | - -### GET list / detail fileUrl 可见性变化 - -| 发票状态 | 变更前 fileUrl | 变更后 fileUrl | -|---------|--------------|--------------| -| REQUESTED | 有值(OSS 公链) | null(前端显示处理中) | -| ISSUED | 有值 | 有值(不变) | -| PUSHED | 有值 | 有值(不变) | -| VOIDED | 有值 | null | - ---- - -## 11. 影响评估 / 回滚 - -- 破坏兼容性(重要):fileUrl 字段在 REQUESTED 状态下由有值变为 null。前端如果之前有展示 REQUESTED 状态下 PDF 链接的逻辑(点击打开 OSS 文件),现在会读到 null,需要做 null 判断,展示「处理中」状态文案。 -- apply status 值变化:从 APPLIED 改为 REQUESTED。前端如果有对 status 值做 hardcode 判断(if status == APPLIED),需要更新。 -- 前端同步上线建议:fileUrl null 判断 + apply 响应 status 对齐必须在本次版本同步更新。 -- 回滚方案:回滚旧版本,fileUrl 可见性恢复,download 端点返回 404。apply 的 status 回退为 APPLIED(如旧版本有此值)。 - ---- - -## 12. 注意事项 - -1. fileUrl null 判断:list / detail 接口读到 fileUrl 为 null 时,前端应显示「处理中」或「待开票」而不是空链接。 -2. 签名 URL 勿缓存超过 1 小时:download 返回的签名 URL 有效期 1 小时,前端每次用前须重新调接口,不可全局缓存复用。 -3. apply 响应 status 值变更:旧值 APPLIED 已废弃,现在返回 REQUESTED。如前端有 switch/if 判断该值,须对齐。 -4. download IDOR 防护:发票不存在或不属于当前用户均返回 581518(INVOICE_FORBIDDEN),不返回 404,避免存在性枚举攻击。 - ---- - -## 13. 关联 / 联系人 - -- Issue(小程序端 mp): https://git.1814.love:8443/wx/HL/issues/4174 -- Issue(签名下载): https://git.1814.love:8443/wx/HL/issues/4182 -- PR(mp 端 #4181): https://git.1814.love:8443/wx/HL/pulls/4181 -- PR(签名下载 #4184): https://git.1814.love:8443/wx/HL/pulls/4184 -- 后端负责人: yaosutu diff --git a/changelogs-v2-mp/2026-06/22_4161_售后申诉-新增接口-小程序端.md b/changelogs-v2-mp/2026-06/22_4161_售后申诉-新增接口-小程序端.md deleted file mode 100644 index dcedc70..0000000 --- a/changelogs-v2-mp/2026-06/22_4161_售后申诉-新增接口-小程序端.md +++ /dev/null @@ -1,340 +0,0 @@ -# 售后申诉 — 小程序端新增接口 - -- **端类型**:小程序端 -- **变更类型**:新增接口 -- **日期**:2026-06-22 -- **关联 Issue**:https://git.1814.love:8443/wx/HL/issues/4161 -- **关联 PR**:#4185(小程序端接口)/ #4162 #4165 #4168 #4187(基础能力) -- **后端负责人**:腰苏图(yaosutu) - ---- - -## 一、接口背景 - -v3 全新售后服务中心(com.hulalv.aftersale)上线。小程序端用户可发起投诉或申诉、查看自己的工单列表与详情、以及在工单未处置前随时撤回。 - -新增 4 个接口(含 1 个原有但归入本域):发起工单、我的工单列表、工单详情、撤回工单。 - -本次为全新域,不影响任何已有接口。 - ---- - -## 二、变更清单 - -| 编号 | 方法 | 路径 | 说明 | -|------|------|------|------| -| 1 | POST | /v3/mp/aftersale/ticket | 发起投诉/申诉工单 | -| 2 | GET | /v3/mp/aftersale/ticket/my | 我的工单列表(按订单分页) | -| 3 | GET | /v3/mp/aftersale/ticket/{id} | 工单详情 | -| 4 | POST | /v3/mp/aftersale/ticket/{id}/withdraw | 撤回工单 | - ---- - -## 三、接口详情 - -| 属性 | 说明 | -|------|------| -| 认证方式 | JWT Bearer Token(C 端 Token,Gateway 解析后注入 userId) | -| userId 传递 | Gateway 解析 JWT 后注入到请求属性,后端从 HttpServletRequest 取;前端无需传 userId 字段 | -| 限流 | Gateway 默认限流策略 | -| 路径前缀 | /v3/mp/aftersale/ticket | - ---- - -## 四、接口入参 - -### 4.1 POST /v3/mp/aftersale/ticket — 发起工单 - -请求体(JSON): - -| 字段 | 类型 | 必填 | 约束 | 说明 | -|------|------|------|------|------| -| orderId | Long | 是 | — | 订单 ID | -| category | String | 是 | COMPLAINT / APPEAL | 大类:投诉/申诉 | -| type | String | 是 | 见 §六枚举 | 细分类型,必须与 category 匹配 | -| title | String | 是 | 最多 100 字 | 工单标题 | -| description | String | 是 | 最多 2000 字 | 诉求描述 | -| targetRefId | Long | 条件必填 | — | 申诉时必填:关联退款申请 ID;投诉时可不传(不传则用 orderId) | -| claimType | String | 否 | REFUND / RECTIFY / EXPLANATION | 用户诉求类型,仅供参考 | -| claimAmount | Number | 否 | — | 用户期望金额,仅供参考,无约束力 | -| attachments | Array | 否 | 最多 10 个 | 附件 URL 列表(图片/视频) | - -### 4.2 GET /v3/mp/aftersale/ticket/my — 我的工单列表 - -Query 参数: - -| 字段 | 类型 | 必填 | 约束 | 说明 | -|------|------|------|------|------| -| orderId | Long | 是 | — | 订单 ID,只查该订单下的工单 | -| pageNo | Integer | 否 | >= 1 | 页码,默认 1 | -| pageSize | Integer | 否 | 1-50 | 每页条数,默认 20 | - -### 4.3 GET /v3/mp/aftersale/ticket/{id} — 工单详情 - -路径参数:id(String/Long)必填,工单 ID。 - -注:后端校验工单归属,非本人工单返回 586014。 - -### 4.4 POST /v3/mp/aftersale/ticket/{id}/withdraw — 撤回工单 - -路径参数:id(String/Long)必填,工单 ID。 - -无请求体。后端校验:1. 工单归属(非本人返回 586014);2. 状态(只有 SUBMITTED / PROCESSING 可撤回,否则返回 586013)。 - ---- - -## 五、出参字段 - -### 5.1 发起工单 — 返回工单 ID - -```json -{"code": 200, "data": "1895000000000001"} -``` - -data 为 String(Long),即新建工单的 ID。 - -### 5.2 我的工单列表 — PageResult 结构 - -```json -{ - "code": 200, - "data": { - "list": [], - "total": 5, - "pageNo": 1, - "pageSize": 20 - } -} -``` - -### 5.3 工单详情及列表行 — TicketMpRespVO 字段 - -| 字段 | 类型 | 说明 | -|------|------|------| -| id | String(Long) | 工单 ID | -| orderId | String(Long) | 关联订单 ID | -| category | String | 大类枚举值:COMPLAINT / APPEAL | -| categoryLabel | String | 大类中文名:投诉 / 申诉 | -| type | String | 细分类型枚举值,见 §六 | -| typeLabel | String | 细分类型中文名 | -| title | String | 工单标题 | -| description | String | 诉求描述 | -| claimType | String | 用户诉求类型(可选) | -| claimAmount | Number | 用户期望金额(可选) | -| attachments | Array | 附件 URL 列表 | -| status | String | 工单状态枚举值,见 §六 | -| statusLabel | String | 工单状态中文名 | -| resolutionRemark | String | 处置说明(RESOLVED / CLOSED 后可见,用于展示给用户) | -| canWithdraw | Boolean | 是否可撤回(SUBMITTED / PROCESSING 且非终态时为 true) | -| createdAt | String(ISO 8601) | 创建时间 | -| updatedAt | String(ISO 8601) | 更新时间 | - -注:C 端视图隐藏处置细节(decision / resolutionType / resolutionAmount / approvalNo / linkedRefundId),仅展示 status 和 resolutionRemark。 - -### 5.4 撤回工单 - -```json -{"code": 200, "data": null} -``` - ---- - -## 六、枚举 / 数据字典 - -### AftersaleCategory — 工单大类 - -| 枚举值 | 中文名 | 场景 | -|--------|--------|------| -| COMPLAINT | 投诉 | 对已发生的服务质量不满 | -| APPEAL | 申诉 | 对某个处理结果不服,求复核 | - -### AftersaleTicketType — 细分类型(type 字段) - -| 枚举值 | 中文名 | 归属大类 | -|--------|--------|----------| -| ITINERARY | 行程 | COMPLAINT | -| HOTEL | 酒店 | COMPLAINT | -| VEHICLE | 车 | COMPLAINT | -| GUIDE | 导游 | COMPLAINT | -| OTHER | 其他 | COMPLAINT | -| REFUND_REJECTED | 退款被拒 | APPEAL | -| REFUND_AMOUNT_DISPUTE | 退款金额异议 | APPEAL | - -注:type 必须与 category 匹配,否则返回 586012。 - -### AftersaleTicketStatus — 工单状态 - -| 枚举值 | 中文名 | 终态 | 说明 | -|--------|--------|------|------| -| SUBMITTED | 已提交 | 否 | 等待受理 | -| PROCESSING | 处理中 | 否 | 客服受理中 | -| RESOLVED | 已处置 | 否 | 处置方案落定(退款类等待到账) | -| CLOSED | 已关闭 | 是 | 流程终结 | -| WITHDRAWN | 已撤回 | 是 | 用户主动撤回 | - -canWithdraw = true 的条件:status 为 SUBMITTED 或 PROCESSING。 - -### claimType — 用户诉求类型(参考值,无强制约束) - -| 常见值 | 中文名 | -|--------|--------| -| REFUND | 退款 | -| RECTIFY | 整改 | -| EXPLANATION | 要个说法 | - ---- - -## 七、错误码 - -| 错误码 | 说明 | 触发场景 | -|--------|------|----------| -| 586009 | 工单不存在 | 传入 id 找不到工单 | -| 586011 | 同一对象已存在活跃工单 | 防重复提交(同订单下同 target 已有进行中工单) | -| 586012 | category 与 type 不匹配 | 如 COMPLAINT 传了 REFUND_REJECTED | -| 586013 | 撤回时状态非法 | 终态或 RESOLVED 工单不可撤回 | -| 586014 | 非本人工单 | 查看/撤回他人工单 | -| 586015 | 申诉必须关联退款申请 | APPEAL 类工单未传 targetRefId | -| 586016 | 申诉关联退款状态不合法 | 关联的退款申请状态不允许申诉 | - ---- - -## 八、示例 - -### 8.1 典型成功 — 发起投诉工单 - -请求: -``` -POST /v3/mp/aftersale/ticket -Authorization: Bearer {mp_token} -Content-Type: application/json - -{ - "orderId": 1800000000000099, - "category": "COMPLAINT", - "type": "HOTEL", - "title": "酒店降级投诉", - "description": "订单挂四星酒店实际入住三星,要求退差价", - "claimType": "REFUND", - "claimAmount": 600.00, - "attachments": ["https://oss.example.com/img1.jpg"] -} -``` - -响应: -```json -{"code": 200, "data": "1895000000000001"} -``` - -### 8.2 典型成功 — 发起申诉工单(退款被拒) - -``` -POST /v3/mp/aftersale/ticket -Authorization: Bearer {mp_token} -Content-Type: application/json - -{ - "orderId": 1800000000000099, - "category": "APPEAL", - "type": "REFUND_REJECTED", - "targetRefId": 9876543210, - "title": "退款申请被拒申诉", - "description": "退款申请被拒,但供应商确实未提供服务,要求重新审核" -} -``` - -响应: -```json -{"code": 200, "data": "1895000000000002"} -``` - -### 8.3 边界情况 — 查询工单详情(已处置,展示处置说明) - -```json -{ - "code": 200, - "data": { - "id": "1895000000000001", - "orderId": "1800000000000099", - "category": "COMPLAINT", - "categoryLabel": "投诉", - "type": "HOTEL", - "typeLabel": "酒店", - "title": "酒店降级投诉", - "description": "订单挂四星酒店实际入住三星,要求退差价", - "claimType": "REFUND", - "claimAmount": 600.00, - "attachments": ["https://oss.example.com/img1.jpg"], - "status": "CLOSED", - "statusLabel": "已关闭", - "resolutionRemark": "经核实酒店确实降级,已退差价 500 元", - "canWithdraw": false, - "createdAt": "2026-06-22T09:00:00", - "updatedAt": "2026-06-22T15:30:00" - } -} -``` - -### 8.4 业务失败 — 申诉未传 targetRefId - -```json -{"code": 586015, "msg": "申诉必须关联一笔有效的退款申请"} -``` - -### 8.5 业务失败 — 撤回已 CLOSED 工单 - -```json -{"code": 586013, "msg": "撤回时工单状态非法(只有 SUBMITTED / PROCESSING 可撤回)"} -``` - ---- - -## 九、业务边界 - -适用: -- 同一订单下同一 targetRef 只能有一个活跃工单(SUBMITTED / PROCESSING / RESOLVED),否则返回 586011 -- 申诉(APPEAL)类工单必须关联一笔有效的退款申请(targetRefId 必填) -- SUBMITTED / PROCESSING 状态的工单可撤回,canWithdraw=true - -不适用: -- 终态工单(CLOSED / WITHDRAWN)不可撤回 -- 非本人工单不可查看/撤回 - -特殊边界: -- 工单从 PROCESSING 撤回后,若该工单已提交企微 OA,后端会自动撤回 OA 审批(异步,不影响前端响应) -- attachments 最多 10 个,超出返回参数校验错误 - ---- - -## 十、修改前后对比 - -本次为全新域新增接口,无旧接口对比。 - ---- - -## 十一、影响评估 / 回滚 - -本次为全新域,不影响任何已有小程序接口,可独立上线。 - -回滚方案:回滚后端服务版本即可。 - ---- - -## 十二、注意事项 - -1. 发起工单返回值是 String(Long):data 字段为新建工单的 ID,是字符串而非数字。 -2. C 端视图隐藏处置细节:resolutionAmount / decision / approvalNo 等字段在 C 端不返回,不要在小程序页面展示。resolutionRemark 是给用户看的处置说明,可展示。 -3. canWithdraw 字段已由后端计算:前端直接用该字段判断是否显示撤回按钮,无需自行判断状态。 -4. 所有 ID 为字符串:id / orderId 均序列化为字符串,前端不要转 Number。 -5. category=APPEAL 时:targetRefId 必填(关联退款申请 ID),targetRefType 后端自动设为 REFUND_APPLICATION。 - ---- - -## 十三、关联 / 联系人 - -- Issue:https://git.1814.love:8443/wx/HL/issues/4161 -- PR #4185(小程序端接口):https://git.1814.love:8443/wx/HL/pulls/4185 -- PR #4162(售后基建):https://git.1814.love:8443/wx/HL/pulls/4162 -- PR #4165(受理/处置 + OA 接入):https://git.1814.love:8443/wx/HL/pulls/4165 -- PR #4168(OA 回调内部接口):https://git.1814.love:8443/wx/HL/pulls/4168 -- PR #4187(退款驱动联动):https://git.1814.love:8443/wx/HL/pulls/4187 -- 后端负责人:腰苏图(yaosutu) diff --git a/changelogs-v2-mp/2026-06/22_4196_售后工单机审-修改接口-小程序端.md b/changelogs-v2-mp/2026-06/22_4196_售后工单机审-修改接口-小程序端.md deleted file mode 100644 index 44b4330..0000000 --- a/changelogs-v2-mp/2026-06/22_4196_售后工单机审-修改接口-小程序端.md +++ /dev/null @@ -1,341 +0,0 @@ -# 售后工单接入 wx 内容安全机审 — 修改接口(小程序端) - -- **端类型**:小程序端 -- **日期**:2026-06-22 -- **Issue**:[#4196](https://git.1814.love:8443/wx/HL/issues/4196) -- **PR**:[#4203](https://git.1814.love:8443/wx/HL/pulls/4203) -- **Commit**:[8882eb156](https://git.1814.love:8443/wx/HL/commit/8882eb1568a7e5ab8f48a6db4b7e3d4d4b6f2c15) -- **后端负责人**:yaosutu - ---- - -## 1. 接口背景 - -用户在小程序发起售后工单(投诉/申诉)时,若附带图片或视频,前端需先通过微信内容安全 `msgSecCheck` 接口对媒体文件做内容审核,得到微信返回的 `traceId` 后,连同创建工单请求一并透传给后端。后端不直接调用微信安全接口,只存储 traceId,等待微信异步回调后更新审核状态。无图/无视频的工单跳过机审,直接置为 `APPROVED`。 - ---- - -## 2. 变更清单 - -| 变更类型 | 接口 | 字段 | 说明 | -|---------|------|------|------| -| ⚠️ 入参新增 | `POST /v3/mp/aftersale/ticket` | `mediaTraceIds` | 新增可选字段,机审 traceId 数组,最多 12 个 | -| ✨ 出参新增 | `GET /v3/mp/aftersale/ticket/{id}` | `auditStatus` | 工单 wx 内容安全机审状态 | -| ✨ 出参新增 | `GET /v3/mp/aftersale/ticket/list` | `auditStatus` | 工单列表每条记录新增机审状态 | - ---- - -## 3. 接口详情 - -### 3.1 发起售后工单 - -| 属性 | 值 | -|-----|-----| -| 方法 + 路径 | `POST /v3/mp/aftersale/ticket` | -| 接口描述 | 用户发起售后工单(投诉/申诉),支持附件 + 机审 traceId 透传 | -| 认证 | 需要用户 JWT(小程序登录 token) | -| 幂等性 | 非幂等,每次调用创建一条新工单 | -| 限流 | 无独立限流(受网关全局限流) | - -### 3.2 工单详情 - -| 属性 | 值 | -|-----|-----| -| 方法 + 路径 | `GET /v3/mp/aftersale/ticket/{id}` | -| 接口描述 | 获取单条售后工单详情 | -| 认证 | 需要用户 JWT,仅可查自己的工单 | -| 限流 | 无独立限流 | - -### 3.3 工单列表 - -| 属性 | 值 | -|-----|-----| -| 方法 + 路径 | `GET /v3/mp/aftersale/ticket/list` | -| 接口描述 | 查询当前用户的售后工单列表(分页) | -| 认证 | 需要用户 JWT | -| 限流 | 无独立限流 | - ---- - -## 4. 接口入参 - -### 4.1 路径参数 / Query 参数 - -`GET /v3/mp/aftersale/ticket/{id}` - -| 参数名 | 类型 | 必填 | 说明 | -|-------|------|------|------| -| id | Long | 是 | 工单 ID | - -### 4.2 请求体字段(POST /v3/mp/aftersale/ticket) - -| 字段名 | 类型 | 必填 | 校验 | 说明 | -|-------|------|------|------|------| -| orderId | Long | 是 | 不能为空 | 关联订单 ID | -| category | String | 是 | 枚举:COMPLAINT / APPEAL | 工单分类:投诉 / 申诉 | -| type | String | 是 | 枚举,见 §6 | 具体类型(如 HOTEL / GUIDE / PRICE) | -| title | String | 是 | max=100 | 工单标题 | -| description | String | 是 | max=2000 | 问题描述 | -| attachments | List\ | 否 | max=10 | 附件 URL 列表(图片/视频) | -| **mediaTraceIds** | **List\** | **否** | **max=12** | **微信内容安全 traceId 数组(前端透传,后端只存)** | - -> `mediaTraceIds` 与 `attachments` 一一对应关系由前端维护。后端不校验对应关系,仅存储用于异步机审回流。无附件时可不传或传空数组。 - ---- - -## 5. 出参字段 - -### TicketMpRespVO(工单详情/列表单条) - -| 字段名 | 类型 | 说明 | -|-------|------|------| -| id | Long | 工单 ID | -| orderId | Long | 关联订单 ID | -| orderNo | String | 订单编号 | -| category | String | 工单分类枚举:COMPLAINT / APPEAL | -| type | String | 工单类型 | -| title | String | 标题 | -| description | String | 描述 | -| status | String | 工单状态:SUBMITTED / PROCESSING / RESOLVED / CLOSED / WITHDRAWN | -| statusName | String | 工单状态中文名 | -| canWithdraw | Boolean | 是否可撤回 | -| **auditStatus** | **String** | **wx 内容安全机审状态,取值见 §6** | -| attachments | List\ | 附件 URL | -| createdAt | String | 创建时间(ISO 8601) | -| updatedAt | String | 更新时间(ISO 8601) | - ---- - -## 6. 枚举 / 数据字典 - -### auditStatus — wx 内容安全机审状态 - -| 值 | 含义 | 触发条件 | -|----|------|---------| -| `PENDING` | 机审中 | 创建工单时有 mediaTraceIds(异步等待微信回调) | -| `APPROVED` | 已通过 | 无 mediaTraceIds 的工单直接置此(免审);微信回调结果合规也置此 | -| `MANUAL_REVIEW` | 人工复审 | 微信机审认为需人工介入 | -| `REJECTED` | 已驳回 | 微信机审判定内容违规 | - -> **重要**:`PENDING` 状态为异步,工单创建成功后微信回调可能在数秒到数分钟内到达。前端建议在工单详情页轮询或基于页面刷新展示最新状态,不要把 `PENDING` 当作错误。 - -### category — 工单分类 - -| 值 | 含义 | -|----|------| -| `COMPLAINT` | 投诉 | -| `APPEAL` | 申诉 | - ---- - -## 7. 错误码 - -| 错误码 | HTTP 状态 | 含义 | 触发场景 | -|-------|---------|------|---------| -| 581001 | 400 | 工单关联订单不存在 | orderId 无效 | -| 581002 | 400 | 工单已存在,不可重复提交 | 同一订单同分类已有活跃工单 | -| 581003 | 400 | 订单状态不允许发起售后 | 订单未处于可售后状态 | -| 200-001 | 401 | 未授权 | JWT 缺失或过期 | -| 200-002 | 403 | 无权操作 | 工单不属于当前用户 | - ---- - -## 8. 示例 - -### 8.1 典型成功——带图片机审 - -**请求** -```http -POST /v3/mp/aftersale/ticket -Authorization: Bearer -Content-Type: application/json - -{ - "orderId": 1234567890, - "category": "COMPLAINT", - "type": "HOTEL", - "title": "酒店降级安排", - "description": "预订了四星酒店,实际安排了三星,差价未退。", - "attachments": [ - "https://oss.example.com/media/hotel_photo_1.jpg", - "https://oss.example.com/media/hotel_photo_2.jpg" - ], - "mediaTraceIds": [ - "trace_abc123def456", - "trace_xyz789uvw012" - ] -} -``` - -**响应** -```json -{ - "code": 200, - "msg": "success", - "data": { - "id": 987654321, - "orderId": 1234567890, - "orderNo": "HL20260622001", - "category": "COMPLAINT", - "type": "HOTEL", - "title": "酒店降级安排", - "description": "预订了四星酒店,实际安排了三星,差价未退。", - "status": "SUBMITTED", - "statusName": "已提交", - "canWithdraw": true, - "auditStatus": "PENDING", - "attachments": [ - "https://oss.example.com/media/hotel_photo_1.jpg", - "https://oss.example.com/media/hotel_photo_2.jpg" - ], - "createdAt": "2026-06-22T10:30:00", - "updatedAt": "2026-06-22T10:30:00" - } -} -``` - -> `auditStatus` 初始为 `PENDING`,等待微信异步回调后更新为 `APPROVED` / `MANUAL_REVIEW` / `REJECTED`。 - -### 8.2 边界情况——无附件工单(直接 APPROVED) - -**请求** -```http -POST /v3/mp/aftersale/ticket -Authorization: Bearer -Content-Type: application/json - -{ - "orderId": 1234567890, - "category": "APPEAL", - "type": "PRICE", - "title": "价格异议", - "description": "行程中临时要求加收费用,合同未约定。", - "attachments": [], - "mediaTraceIds": [] -} -``` - -**响应** -```json -{ - "code": 200, - "msg": "success", - "data": { - "id": 987654322, - "orderId": 1234567890, - "orderNo": "HL20260622001", - "category": "APPEAL", - "type": "PRICE", - "title": "价格异议", - "description": "行程中临时要求加收费用,合同未约定。", - "status": "SUBMITTED", - "statusName": "已提交", - "canWithdraw": true, - "auditStatus": "APPROVED", - "attachments": [], - "createdAt": "2026-06-22T10:35:00", - "updatedAt": "2026-06-22T10:35:00" - } -} -``` - -> 无 mediaTraceIds 或传空数组时,`auditStatus` 直接为 `APPROVED`,无需等待回调。 - -### 8.3 业务失败——订单已有活跃工单 - -**请求**(同一订单同分类已存在未关闭工单) -```http -POST /v3/mp/aftersale/ticket -Authorization: Bearer -Content-Type: application/json - -{ - "orderId": 1234567890, - "category": "COMPLAINT", - "type": "GUIDE", - "title": "导游服务差", - "description": "导游态度恶劣。", - "mediaTraceIds": [] -} -``` - -**响应** -```json -{ - "code": 581002, - "msg": "工单已存在,不可重复提交", - "data": null -} -``` - ---- - -## 9. 业务边界 - -**适用场景**: -- 订单处于可售后状态(已出行、出行中、已完成等,具体由后端校验) -- 有图片/视频附件时前端必须先完成 `wx.msgSecCheck` 得到 traceId 再调此接口 -- 无附件或不需要机审时,`mediaTraceIds` 可省略或传空数组 - -**不适用场景**: -- 已取消订单不可发起售后 -- 同一订单同分类已有活跃(非 CLOSED/WITHDRAWN)工单时,不可重复发起 - -**特殊边界**: -- `mediaTraceIds` 最多 12 个,超出返回参数校验错误 -- `auditStatus` 为 `PENDING` 时工单照常流转(客服可正常处理),机审结果不阻塞工单流程 -- `auditStatus` 为 `REJECTED` 时,仅作展示标记,工单处理流程由客服决定是否关闭 - ---- - -## 10. 修改前后对比 - -### 字段级对比 - -**CreateTicketReqVO(入参)** - -| 字段 | 变更前 | 变更后 | -|------|-------|-------| -| mediaTraceIds | 不存在 | 新增,List\,可选,max=12 | - -**TicketMpRespVO(出参)** - -| 字段 | 变更前 | 变更后 | -|------|-------|-------| -| auditStatus | 不存在 | 新增,String,wx 机审状态 | - -### 行为级对比 - -| 场景 | 变更前 | 变更后 | -|------|-------|-------| -| 带图片发起工单 | 无机审,无审核状态 | 存 traceId,初始 auditStatus=PENDING,微信异步回调更新 | -| 无图片发起工单 | 无机审状态字段 | auditStatus 直接置 APPROVED | - ---- - -## 11. 影响评估 / 回滚 - -| 维度 | 结论 | -|------|------| -| 破坏兼容性 | 否(入参新增可选字段,旧版不传兼容;出参新增字段,旧版忽略) | -| 前端同步上线 | 建议同步:入参传 mediaTraceIds 发挥机审能力;出参展示 auditStatus | -| 回滚方案 | 后端回滚 PR #4203 即可,无 DDL 数据损失风险(DDL 只加列不删) | - ---- - -## 12. 注意事项 - -1. `mediaTraceIds` 由前端在调用微信 `wx.msgSecCheck` 后获得,后端不直接调微信安全接口,只做存储和转发。 -2. `auditStatus=PENDING` 是异步状态,不代表工单异常,客服后台可正常处理。 -3. 历史工单(此 PR 上线前创建的)`auditStatus` 字段为 `null`,前端展示时建议视 `null` 等同于 `APPROVED` 处理。 -4. 微信机审结果 `REJECTED` 不自动关闭工单,仅打标记,由客服决定后续处理。 - ---- - -## 13. 关联 / 联系人 - -- **Issue**:[https://git.1814.love:8443/wx/HL/issues/4196](https://git.1814.love:8443/wx/HL/issues/4196) -- **PR**:[https://git.1814.love:8443/wx/HL/pulls/4203](https://git.1814.love:8443/wx/HL/pulls/4203) -- **Commit**:[https://git.1814.love:8443/wx/HL/commit/8882eb1568a7e5ab8f48a6db4b7e3d4d4b6f2c15](https://git.1814.love:8443/wx/HL/commit/8882eb1568a7e5ab8f48a6db4b7e3d4d4b6f2c15) -- **关联 Issue**:[#4161 售后申诉中心](https://git.1814.love:8443/wx/HL/issues/4161) -- **后端负责人**:yaosutu diff --git a/changelogs-v2-mp/2026-06/22_售后工单mp端归属校验加固_小程序.md b/changelogs-v2-mp/2026-06/22_售后工单mp端归属校验加固_小程序.md deleted file mode 100644 index b5a6249..0000000 --- a/changelogs-v2-mp/2026-06/22_售后工单mp端归属校验加固_小程序.md +++ /dev/null @@ -1,31 +0,0 @@ -# 【修正·小程序】售后工单 mp 端接口加归属校验(防横向越权) - -> 模块:order-v3 售后工单(aftersale)小程序端 -> 类型:安全加固(每日审查驱动,新模块上线前修正) -> 影响端点:`/v3/mp/aftersale/ticket/**`(我的工单列表 / 详情 / 撤回) -> 关联:售后工单中心 PR1-5(#4162/#4165/#4168/#4173/#4185)的每日审查修正 -> 测试服已部署验证(9443 实测端点 200) - -## ⚠️ 关键说明 - -售后工单 mp 端三个用户入口此前缺少归属校验,任意登录用户传他人 `ticketId`/`orderId` 即可读取或撤回他人工单(横向越权 IDOR)。本次加固:**经订单归属校验当前用户是否为下单人**,非本人操作返回错误码 **586014(TICKET_NOT_OWN)**。 - -正常业务流程下,小程序用户只操作自己订单的售后工单,**不会触发**该错误;前端无需改动,仅需对 586014 做兜底提示(如「无权访问该工单」)。 - -## 1. 受影响端点与行为 - -| 端点 | 修正 | -|------|------| -| `GET /v3/mp/aftersale/ticket/my`(我的工单列表) | 新增按当前用户校验 `orderId` 归属;端点入参不变,仅服务端加校验 | -| `GET /v3/mp/aftersale/ticket/{id}`(工单详情) | 校验工单所属订单归属当前用户,非本人抛 586014 | -| `POST /v3/mp/aftersale/ticket/{id}/withdraw`(撤回) | 同上归属校验,非本人不可撤回(且不再触发他人 OA 审批撤销) | - -## 2. 附带修正:撤回工单不再消失 - -撤回(WITHDRAWN)此前被误当软删处理,导致撤回后的工单在「我的工单」列表/详情中**永久不可见**。本次修正后,**撤回是可见终态**,撤回的工单仍可在列表与详情中查看(状态显示「已撤回」)。 - -## 3. 错误码 - -| code | 含义 | -|------|------| -| 586014 | 无权操作该售后工单(非本人订单)| diff --git a/changelogs-v2-mp/2026-06/23_4250_退款申诉新增+售后工单下线-小程序端.md b/changelogs-v2-mp/2026-06/23_4250_退款申诉新增+售后工单下线-小程序端.md deleted file mode 100644 index bc23332..0000000 --- a/changelogs-v2-mp/2026-06/23_4250_退款申诉新增+售后工单下线-小程序端.md +++ /dev/null @@ -1,222 +0,0 @@ -# 退款申诉(新增)+ 统一售后工单接口下线(小程序端) - -- 端类型:小程序端 -- 变更类型:新增接口(4)+ 删除接口(统一售后工单 mp 端) -- 关联 Issue:#4250 PR:#4251 #4254 -- 日期:2026-06-23 - ---- - -## ① 接口背景 - -售后体系重构:原"投诉 + 申诉统一售后工单"方向作废,拆为**投诉**与**申诉**两套独立能力。 -- **申诉**:用户对"退款被拒"或"退款金额"不服时发起,**小程序入口仍是「退款申诉」**。申诉记录单独存(不再混入退款申请表)。 -- **关键变化**:申诉**复用既有退款审批**——发起申诉后系统自动建一笔 PENDING 退款申请,由管理员在退款审批里复核(通过则退款 / 驳回则结束);申诉本身不再有独立审批。 -- 原统一售后工单接口(`/v3/mp/aftersale/ticket*`)**全部下线**。 - ---- - -## ② 变更清单 - -| # | 方法 | 路径 | 类型 | -|---|---|---|---| -| 1 | POST | `/v3/mp/refund/appeal` | 🆕 新增(发起申诉)| -| 2 | GET | `/v3/mp/refund/appeal/my` | 🆕 新增(我的申诉,分页)| -| 3 | GET | `/v3/mp/refund/appeal/{id}` | 🆕 新增(申诉详情)| -| 4 | POST | `/v3/mp/refund/appeal/{id}/withdraw` | 🆕 新增(撤回申诉)| -| 5 | ALL | `/v3/mp/aftersale/ticket*` | ❌ 删除(统一售后工单下线,调用返回 404)| - -统一响应包装 `Result`:`{ code, message, data, success }`,`code=200` 为成功。 - ---- - -## ③ 接口详情 - -### 1. 发起申诉 `POST /v3/mp/refund/appeal` -用户对一笔退款申请发起申诉。两种类型:`REFUND_REJECTED`(退款被拒,原退款 status=REJECTED 才可申诉)/ `REFUND_AMOUNT_DISPUTE`(退款金额异议,原退款 status=REFUNDED 求补差)。 -> 发起成功后:① 落一条申诉记录(PENDING)② **自动建一笔 PENDING 退款申请**走退款审批 ③ 订单进入「售后中」。 - -### 2. 我的申诉 `GET /v3/mp/refund/appeal/my` -当前登录用户的申诉分页列表。 - -### 3. 申诉详情 `GET /v3/mp/refund/appeal/{id}` -单条申诉详情,含关联的两笔退款(来源退款 + 申诉触发的退款)。 - -### 4. 撤回申诉 `POST /v3/mp/refund/appeal/{id}/withdraw` -仅 `PENDING`(审批中)状态可撤回;撤回会一并取消申诉触发的那笔 PENDING 退款申请。 - ---- - -## ④ 入参 - -### 接口1 create(`@RequestBody`,登录态 userId 由网关注入) -| 参数 | 类型 | 必填 | 说明 | -|---|---|---|---| -| refundApplicationId | long | 是 | 来源退款申请 ID(被申诉的那笔退款)| -| appealType | string | 是 | 申诉类型:`REFUND_REJECTED` / `REFUND_AMOUNT_DISPUTE` | -| appealReason | string | 是 | 申诉理由(≤2000 字)| -| appealAmount | string(decimal) | 否 | 期望退款金额(金额异议时填)| -| mediaTraceIds | string[] | 否 | 凭证图片机审 traceId 列表(前端上传后透传,≤12)| - -### 接口2 my -| 参数 | 类型 | 必填 | 说明 | -|---|---|---|---| -| pageNo | int | 否 | 页码,默认 1 | -| pageSize | int | 否 | 每页条数,默认 20 | - -### 接口3 detail / 接口4 withdraw -| 参数 | 位置 | 类型 | 说明 | -|---|---|---|---| -| id | path | long | 申诉 ID | - ---- - -## ⑤ 出参 - -### 接口1 create `Result` -`data` = 新建申诉 ID(字符串化 Long)。 - -### 接口2 my `Result>`;接口3 detail `Result` -`PageResult`:`{ records[], total, page, pageSize }`。`AppealMpRespVO`: - -| 字段 | 类型 | 说明 | -|---|---|---| -| id | string(Long) | 申诉 ID | -| orderId | string(Long) | 订单 ID | -| refundApplicationId | string(Long) | 来源退款申请 ID | -| appealType | string | 申诉类型(枚举值,见⑥)| -| appealTypeLabel | string | 申诉类型中文名 | -| appealReason | string | 申诉理由 | -| appealAmount | string(decimal) | 申诉退款金额 | -| appealStatus | string | 申诉状态(枚举值,见⑥)| -| appealStatusLabel | string | 申诉状态中文名 | -| applicantName | string | 申请人姓名 | -| reviewedAt | datetime | 审批完成时间(可空)| -| createTime | datetime | 创建时间 | -| sourceRefund | object | 来源退款信息(被申诉的原退款),见下 | -| triggeredRefund | object | 申诉触发的退款信息(申诉建单后自动生成的退款),见下 | - -`sourceRefund` / `triggeredRefund` 结构(关联退款信息): -| 字段 | 类型 | 说明 | -|---|---|---| -| refundApplicationId | string(Long) | 退款申请 ID | -| status | string | 退款状态(PENDING/APPROVED/REJECTED/REFUNDING/REFUNDED/CANCELLED/ABNORMAL)| -| actualAmount | string(decimal) | 实际退款金额(可空)| - -### 接口4 withdraw `Result` -`data` = null。 - ---- - -## ⑥ 枚举 / 数据字典 - -**申诉类型 appealType**: -| 值 | 含义 | -|---|---| -| REFUND_REJECTED | 退款被拒(原退款被驳回后申诉)| -| REFUND_AMOUNT_DISPUTE | 退款金额异议(已退款但金额有异议,求补差)| - -**申诉状态 appealStatus**: -| 值 | 含义 | -|---|---| -| PENDING | 审批中(申诉触发的退款申请待退款审批)| -| REJECTED | 已驳回(退款审批驳回)| -| REFUNDED | 退款到账(申诉成功,退款已退)| -| WITHDRAWN | 已撤回 | - ---- - -## ⑦ 错误码(段位 530600-530699) - -| code | message | -|---|---| -| 530601 | 申诉必须关联一笔退款申请 | -| 530602 | 关联的退款申请不存在 | -| 530603 | 退款申请当前状态不满足申诉条件 | -| 530604 | 该退款申请已有处理中的申诉,请勿重复提交 | -| 530605 | 申诉退款金额超出可退余额 | -| 530606 | 申诉记录不存在 | -| 530607 | 无权操作此申诉 | -| 530608 | 当前申诉状态不允许撤回,仅待审核状态可撤回 | -| 530609 | 申诉类型无效 | - ---- - -## ⑧ 示例 - -### 典型:发起申诉(退款被拒) -请求 `POST /v3/mp/refund/appeal`: -```json -{ "refundApplicationId": 20001, "appealType": "REFUND_REJECTED", - "appealReason": "退款审核不合理,申请复核", "appealAmount": "300.00", - "mediaTraceIds": [] } -``` -响应:`{ "code":200, "message":"成功", "data":"40001", "success":true }` - -### 典型:我的申诉 -请求 `GET /v3/mp/refund/appeal/my?pageNo=1&pageSize=10`,响应(节选一项): -```json -{ "code":200, "success":true, "data": { "total":1, "records":[ - { "id":"40001", "orderId":"10001", "appealType":"REFUND_REJECTED", "appealTypeLabel":"退款被拒", - "appealStatus":"PENDING", "appealStatusLabel":"审批中", "appealAmount":"300.00", - "sourceRefund": { "refundApplicationId":"20001", "status":"REJECTED", "actualAmount":null }, - "triggeredRefund": { "refundApplicationId":"20009", "status":"PENDING", "actualAmount":null } } -] } } -``` - -### 异常:重复申诉 -对同一退款申请已有处理中申诉时再发起: -```json -{ "code":530604, "message":"该退款申请已有处理中的申诉,请勿重复提交", "success":false } -``` - -### 异常:调用已下线的工单接口 -请求 `POST /v3/mp/aftersale/ticket`(旧统一售后工单接口): -```json -{ "code":404, "message":"Not Found" } -``` - ---- - -## ⑨ 业务边界 - -- 申诉**复用退款审批**:发起后自动建 PENDING 退款申请,管理员在退款审批里复核——**前端不要再调用任何"申诉审批"接口**(已无独立申诉审批)。 -- 申诉状态跟随其触发的退款申请:退款到账→REFUNDED,退款审批驳回→REJECTED。 -- 撤回仅 PENDING 可撤,且会取消触发的 PENDING 退款。 -- 申诉发起即把订单标记「售后中」,终结(REFUNDED/REJECTED/WITHDRAWN 且无其他活跃售后)后回切。 - ---- - -## ⑩ 修改前后对比 - -| | 修改前 | 修改后 | -|---|---|---| -| 申诉入口 | 统一售后工单 `POST /v3/mp/aftersale/ticket`(category=APPEAL)| `POST /v3/mp/refund/appeal` | -| 我的申诉 | `/v3/mp/aftersale/ticket/my` | `/v3/mp/refund/appeal/my` | -| 详情/撤回 | `/v3/mp/aftersale/ticket/{id}` `/{id}/withdraw` | `/v3/mp/refund/appeal/{id}` `/{id}/withdraw` | -| 审批 | 申诉独立 OA 审批 | 无(复用退款审批)| - ---- - -## ⑪ 影响评估 / 回滚 - -- **破坏性**:`/v3/mp/aftersale/ticket*` 已删,调用返回 404,前端涉及"退款申诉"的页面**必须切到新申诉接口**。 -- 投诉接口不在此列(投诉走 C 端经 BFF 的现有通道,无变化)。 -- 回滚:后端回滚 PR #4251 #4254。 - ---- - -## ⑫ 注意事项 - -- 金额字段(appealAmount / actualAmount)均为**字符串**,前端按字符串处理防精度丢失。 -- Long 型 ID 均字符串化返回(防 JS 精度)。 -- 上传凭证图片仍走既有 wx 内容安全机审通道(mediaTraceIds 透传)。 - ---- - -## ⑬ 关联 / 联系人 - -- Issue:https://git.1814.love:8443/wx/HL/issues/4250 -- PR:https://git.1814.love:8443/wx/HL/pulls/4251 ・ https://git.1814.love:8443/wx/HL/pulls/4254 -- 后端负责人:腰苏图 -- 已部署测试服并网关实调验证通过(申诉接口 200 / 工单接口 404)。 diff --git a/changelogs-v2-mp/2026-06/23_4290_发票申请票种修正-修改接口-小程序端.md b/changelogs-v2-mp/2026-06/23_4290_发票申请票种修正-修改接口-小程序端.md deleted file mode 100644 index 2f96ea1..0000000 --- a/changelogs-v2-mp/2026-06/23_4290_发票申请票种修正-修改接口-小程序端.md +++ /dev/null @@ -1,336 +0,0 @@ -# 发票申请票种修正(最终契约)— 小程序端 - -> 变更类型:修改接口(破坏性) -> 端类型:小程序端 -> 日期:2026-06-23 | Issue:#4296 | PR:#4292 / #4302 | 服务:hl-order-service-v3 - -> ⚠️ **破坏性变更**:`invoiceType` 删除 `ELECTRONIC`、`email` 改为始终必填 + 格式校验、专票限公司抬头 + 必填五项、删除 `mailAddress` 字段。小程序开票页与详情页均需同步改动,上线时前后端须同步发布。 - -> **勘误(截至 PR #4311 收口)**:抬头字段统一 `titleName`、金额 `amount` 改 JSON number(单位元,非分/x100)、票种仅 2 值(`VAT_NORMAL`/`VAT_SPECIAL`)、专票限公司抬头、入参和出参均无 `mailAddress`。关联 Issue [#4290](https://git.1814.love:8443/wx/HL/issues/4290) [#4296](https://git.1814.love:8443/wx/HL/issues/4296) [#4310](https://git.1814.love:8443/wx/HL/issues/4310) / PR [#4292](https://git.1814.love:8443/wx/HL/pulls/4292) [#4302](https://git.1814.love:8443/wx/HL/pulls/4302) [#4311](https://git.1814.love:8443/wx/HL/pulls/4311)。 - ---- - -## 接口背景 - -发票模型经 PR #4292 + #4302 多轮修正后定稿:删除「电子发票」票种(业务决策统一走普票),专票收严字段校验(限公司抬头 + 必填银行注册信息),email 改为始终必填(全系统电子交付),删除纸质邮寄字段 `mailAddress`。 - -本次涉及小程序两个接口:初次申请 `POST /v3/internal/mp/order/{orderId}/invoice/apply` 和重新开票 `POST /v3/internal/mp/invoice/{id}/reissue`,入参字段矩阵相同,出参亦做同步修正(删 `mailAddress`,invoiceType 去 ELECTRONIC)。 - ---- - -## 变更清单 - -| # | 变更类型 | 说明 | -|---|---------|------| -| 1 | ⚠️ 申请入参删枚举值 | `invoiceType` 删除 `ELECTRONIC`,只保留 `VAT_NORMAL` / `VAT_SPECIAL` | -| 2 | ⚠️ 申请入参删字段 | 删除 `mailAddress`(纸质邮寄地址) | -| 3 | ⚠️ 申请入参校验收严 | `email` 改为始终必填 + 邮箱格式校验 | -| 4 | ⚠️ 申请入参校验新增 | `taxNo`:单位抬头或专票时必填 | -| 5 | ⚠️ 申请入参校验新增 | 专票:`bankName` / `bankAccount` / `registAddress` / `registPhone` 四项必填 | -| 6 | ⚠️ 申请入参新增错误码 | `581523` 专票只能开给单位 | -| 7 | ⚠️ 详情出参删字段 | `GET /v3/internal/mp/order/{orderId}/invoice/detail` 出参删除 `mailAddress` | -| 8 | ⚠️ 列表出参枚举收窄 | `GET /v3/internal/mp/order/{orderId}/invoice/list` 出参 invoiceType 不再出现 ELECTRONIC | -| 9 | 重开接口同步 | `POST /v3/internal/mp/invoice/{id}/reissue` 入参字段矩阵与申请接口保持一致 | - ---- - -## 接口详情 - -### 小程序申请接口 - -| 项 | 说明 | -|---|------| -| **方法 + 路径** | `POST /v3/internal/mp/order/{orderId}/invoice/apply` | -| **接口名** | 小程序客户自主申请发票 | -| **描述** | 客户在订单完成后自主提交开票申请,支持普票/专票,全电子交付 | -| **认证** | 小程序 JWT(Bearer Token,C 端用户) | -| **幂等性** | 非幂等,重复提交触发 581511(一单一票) | -| **限流** | 无特殊限流 | - -### 小程序重开接口 - -| 项 | 说明 | -|---|------| -| **方法 + 路径** | `POST /v3/internal/mp/invoice/{id}/reissue` | -| **接口名** | 小程序重新开票 | -| **描述** | 旧发票作废后,客户重新提交开票申请;入参字段矩阵与 apply 接口相同 | -| **认证** | 小程序 JWT(Bearer Token,C 端用户) | -| **幂等性** | 非幂等 | -| **限流** | 无特殊限流 | - ---- - -## 接口入参 - -### 路径参数 - -**apply 接口:** - -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `orderId` | string(Long 雪花 ID) | 是 | 订单 ID | - -**reissue 接口:** - -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| `id` | string(Long 雪花 ID) | 是 | 被重开的旧发票 ID | - -### 请求体字段(两接口共用) - -| 字段名 | 类型 | 必填条件 | 说明 | -|--------|------|---------|------| -| `invoiceType` | string | 始终必填 | 发票类型:`VAT_NORMAL`(普票)/ `VAT_SPECIAL`(专票);**不含 ELECTRONIC** | -| `titleType` | string | 始终必填 | 抬头类型:`COMPANY`(单位)/ `PERSONAL`(个人);**VAT_SPECIAL 只能 COMPANY** | -| `titleName` | string | 始终必填 | 发票抬头 | -| `taxNo` | string | `titleType=COMPANY` 或 `invoiceType=VAT_SPECIAL` 时必填 | 纳税人识别号 | -| `bankName` | string | `invoiceType=VAT_SPECIAL` 时必填 | 开户银行 | -| `bankAccount` | string | `invoiceType=VAT_SPECIAL` 时必填 | 银行账号 | -| `registAddress` | string | `invoiceType=VAT_SPECIAL` 时必填 | 注册地址 | -| `registPhone` | string | `invoiceType=VAT_SPECIAL` 时必填 | 注册电话 | -| `amount` | number | 始终必填 | 开票金额,JSON number,单位**元**(如 `986.00`),须 > 0 且不超过订单总金额 | -| `email` | string | 始终必填 | 收件邮箱,须通过邮箱格式校验 | -| `remark` | string | 选填 | 备注 | - -> ⚠️ `mailAddress` 字段**已删除**,不再接收。 - ---- - -## 出参字段 - -### apply / reissue 接口出参 - -返回结构:`Result` - -| 字段名 | 类型 | 说明 | -|--------|------|------| -| `data` | string | 新建/重开发票 ID,字符串雪花 ID | - -### 发票详情出参变化(GET /v3/internal/mp/order/{orderId}/invoice/detail) - -| 字段名 | 变化 | 说明 | -|--------|------|------| -| `mailAddress` | **已删除** | 原出参中此字段已移除,前端不应再渲染邮寄地址 | -| `invoiceType` | 值范围收窄 | 只会出现 `VAT_NORMAL` / `VAT_SPECIAL`,不再出现 `ELECTRONIC` | -| `email` | 始终有值 | 原可能为 null,现始终有值 | - ---- - -## 枚举 / 数据字典 - -### 发票类型(invoiceType) - -| 枚举值 | 中文名 | 适用抬头 | 专票字段要求 | -|--------|--------|---------|------------| -| `VAT_NORMAL` | 增值税普通发票 | COMPANY / PERSONAL | 专票四项均不需要 | -| `VAT_SPECIAL` | 增值税专用发票 | **仅 COMPANY** | taxNo + bankName + bankAccount + registAddress + registPhone 全必填 | - -> ~~`ELECTRONIC`~~ 已删除,不得传入。 - -### 抬头类型(titleType) - -| 枚举值 | 中文名 | 可选票种 | -|--------|--------|---------| -| `COMPANY` | 单位 | VAT_NORMAL / VAT_SPECIAL | -| `PERSONAL` | 个人 | 只能 VAT_NORMAL,选 VAT_SPECIAL 返回 581523 | - ---- - -## 错误码 - -| 错误码 | 含义 | 触发场景 | -|--------|------|---------| -| `581510` | 订单未完成,不可开票 | 订单状态不是 COMPLETED | -| `581511` | 一单一票,已有有效发票 | 已有 REQUESTED / ISSUED / PUSHED 状态发票 | -| `581512` | 开票金额超订单总额 | `amount` > 订单 `orderAmount` | -| `581513` | 发票类型非法 | `invoiceType` 不是 VAT_NORMAL 或 VAT_SPECIAL | -| `581514` | 公司抬头或专票须填税号 | 单位抬头或专票时 `taxNo` 为空 | -| `581515` | 专票须填银行及注册信息 | 专票时任一四项为空 | -| `581516` | 收件邮箱不能为空 | HTTP 400,入参层 @NotBlank 校验;格式错误返回 400「邮箱格式不正确」 | -| `581523` | 专票只能开给单位 | `invoiceType=VAT_SPECIAL` 且 `titleType=PERSONAL` | -| `401` | 未授权 | 未携带有效 JWT | -| `403` | 无权限 / 越权 | 非订单归属用户操作 | - ---- - -## 示例 - -### 典型成功(增值税普通发票,个人抬头) - -请求: -``` -POST /v3/internal/mp/order/1920000000000000001/invoice/apply -Authorization: Bearer -Content-Type: application/json -``` -```json -{ - "invoiceType": "VAT_NORMAL", - "titleType": "PERSONAL", - "titleName": "张三", - "taxNo": null, - "amount": 986.00, - "email": "zhangsan@qq.com", - "remark": "旅游报销" -} -``` - -响应: -```json -{ - "code": 200, - "msg": "success", - "data": "1934567890123456789" -} -``` - -### 典型成功(增值税专用发票,公司抬头,全字段) - -请求: -``` -POST /v3/internal/mp/order/1920000000000000002/invoice/apply -Authorization: Bearer -Content-Type: application/json -``` -```json -{ - "invoiceType": "VAT_SPECIAL", - "titleType": "COMPANY", - "titleName": "某某科技有限公司", - "taxNo": "91310000XXXXXXXXXX", - "bankName": "招商银行上海支行", - "bankAccount": "1234567890123456", - "registAddress": "上海市浦东新区XX路XX号", - "registPhone": "021-88888888", - "amount": 2980.00, - "email": "finance@company.com" -} -``` - -响应: -```json -{ - "code": 200, - "msg": "success", - "data": "1934567890123456790" -} -``` - -### 业务失败(专票个人抬头,错误码 581523) - -请求: -``` -POST /v3/internal/mp/order/1920000000000000003/invoice/apply -Authorization: Bearer -Content-Type: application/json -``` -```json -{ - "invoiceType": "VAT_SPECIAL", - "titleType": "PERSONAL", - "titleName": "李四", - "taxNo": null, - "amount": 500.00, - "email": "lisi@example.com" -} -``` - -响应: -```json -{ - "code": 581523, - "msg": "增值税专用发票只能开给单位,个人抬头不可选专票", - "data": null -} -``` - ---- - -## 业务边界 - -**适用场景** -- 客户在小程序「我的订单 - 订单详情」中点「申请发票」,订单状态为 COMPLETED 时可用 -- 旧发票被作废后,客户在小程序发起重新申请(reissue 接口) - -**不适用场景** -- 订单未完成(非 COMPLETED 状态),返回 581510 -- 已有有效发票,须先由财务作废后才能 reissue,不能再次 apply -- 管理后台代客申请走 admin 专属接口 - -**特殊边界** -- 金额单位:`amount` 为 JSON number,单位**元**(如 `986.00`),前端输入框以元为单位直接提交,无需 x100 -- 一单一票:同一订单至多一张有效发票 -- 专票抬头联动:选专票后,抬头类型需强制为单位,个人选项需禁用或隐藏 -- 详情回显:`mailAddress` 字段已不存在,前端不应渲染邮寄地址块 - ---- - -## 修改前后对比 - -### 发票类型枚举 - -| 旧值 | 新值 | -|------|------| -| VAT_NORMAL(保留) | VAT_NORMAL(保留) | -| VAT_SPECIAL(保留) | VAT_SPECIAL(保留) | -| ELECTRONIC(电子发票) | **已删除** | - -### email 字段校验 - -| 旧行为 | 新行为 | -|--------|--------| -| 条件必填(ELECTRONIC 时才必填) | **始终必填 + 邮箱格式校验** | - -### mailAddress 字段 - -| 旧行为 | 新行为 | -|--------|--------| -| 申请入参可选填;详情/列表出参包含此字段 | **申请入参已删除;详情出参已删除** | - -### 专票限制 - -| 旧行为 | 新行为 | -|--------|--------| -| titleType 无限制 | 专票只能 COMPANY(个人返回 581523) | -| bankName 等无强制要求 | 专票 taxNo + 银行四项全部必填(返回 581515) | - ---- - -## 影响评估 / 回滚 - -### 小程序开票页必须改动 - -| 模块 | 必须改动 | -|------|---------| -| 发票类型选择 | 去掉「电子发票」,只保留「增值税普通发票」/「增值税专用发票」 | -| 专票表单区块 | 新增开户行、银行账号、注册地址、注册电话 4 个必填项,仅选专票时显示 | -| 抬头类型联动 | 选专票时隐藏/禁用「个人」选项 | -| email 输入框 | 改为必填(加红星),增加邮箱格式校验 | -| mailAddress 输入框 | 移除,不再渲染邮寄地址块 | -| 详情页 | 移除邮寄地址展示区,invoiceType 显示只有普票/专票两种文案 | - -### 回滚方案 - -后端回滚至 PR #4292 前,ELECTRONIC 重新有效,email 恢复条件必填,mailAddress 重新可用。小程序需同步回滚开票页逻辑。 - ---- - -## 注意事项 - -1. `ELECTRONIC` 已从枚举删除,小程序开票选项只有两项,禁止出现「电子发票」 -2. 重开接口(reissue)入参字段矩阵与 apply 完全相同,改动同步适用 -3. 专票五项(taxNo + 开户行 + 账号 + 注册地址 + 注册电话)在专票场景下全必填,缺一返回 581515 -4. 详情页 `mailAddress` 字段已消失,老版本小程序读到 undefined 需做好空值守卫(不报错) -5. `amount` 为 JSON number,单位**元**(如 `986.00`),小程序输入框直接传元值,无需 x100 - ---- - -## 关联 / 联系人 - -| 项 | 内容 | -|----|------| -| **Issue(功能)** | [#4290 发票申请票种修正](https://git.1814.love:8443/wx/HL/issues/4290) | -| **Issue(小程序)** | [#4296 小程序发票申请同步修正](https://git.1814.love:8443/wx/HL/issues/4296) | -| **PR(票种删 ELECTRONIC)** | [#4292](https://git.1814.love:8443/wx/HL/pulls/4292) | -| **PR(专票限公司/email 必填/删 mailAddress)** | [#4302](https://git.1814.love:8443/wx/HL/pulls/4302) | -| **后端负责人** | yst | diff --git a/changelogs-v2-mp/2026-06/25_4360_发票申请删amount+门槛放宽-修改接口-小程序端.md b/changelogs-v2-mp/2026-06/25_4360_发票申请删amount+门槛放宽-修改接口-小程序端.md deleted file mode 100644 index 89637f7..0000000 --- a/changelogs-v2-mp/2026-06/25_4360_发票申请删amount+门槛放宽-修改接口-小程序端.md +++ /dev/null @@ -1,217 +0,0 @@ -# 发票申请删 amount · 门槛放宽(小程序端) - -- **接口**:POST /v3/internal/mp/order/{orderId}/invoice/apply -- **变更类型**:修改接口,破坏性变更(申请入参删 amount;申请门槛扩展;新增错误码 581524) -- **端类型**:小程序端 -- **日期**:2026-06-25 -- **Issue**:[#4353](https://git.1814.love:8443/wx/HL/issues/4353) -- **PR**:[#4360](https://git.1814.love:8443/wx/HL/pulls/4360) - ---- - -## 1 接口背景 - -小程序端发票申请接口(POST /v3/internal/mp/order/{orderId}/invoice/apply)本次同步两项改动: - -1. **申请入参删 amount**:开票金额不再前端传入,开票时后端按规则自动计算(正常单=应收总额;取消单=净实收)。 -2. **申请门槛放宽**:原门槛仅允许 COMPLETED(已完成)订单申请;放宽为定制中及以后均可申请,同时支持已取消但净实收 > 0 的订单申请。 - ---- - -## 2 变更清单 - -| # | 变更项 | 变更前 | 变更后 | -|---|--------|--------|--------| -| 1 | 申请入参 amount | 必填字段,客户填写开票金额 | ⚠️ 已删除,后端开票时自动算 | -| 2 | 申请门槛(正常订单) | 订单状态必须 COMPLETED | 状态 ∈ {CUSTOMIZING / PENDING_DEPARTURE / TRAVELLING / COMPLETED} 均可申请 | -| 3 | 申请门槛(取消订单) | 不允许 | CANCELLED 且净实收(已付 - 已退)> 0 时可申请 | -| 4 | 不满足门槛的错误码 | 581510 INVOICE_ORDER_NOT_COMPLETED | ✨ 新增 581524 INVOICE_ORDER_NOT_APPLICABLE(更精确语义) | - ---- - -## 3 接口详情 - -| 属性 | 值 | -|------|----| -| 方法 | POST | -| 路径 | /v3/internal/mp/order/{orderId}/invoice/apply | -| 描述 | 客户自主申请开票(申请阶段不填金额,开票时后端自动算) | -| 认证 | Bearer JWT(小程序用户) | -| 幂等性 | 非幂等,重复提交触发 581511(一单一票) | -| 限流 | 无特殊限制 | - ---- - -## 4 接口入参 - -### 4.1 路径参数 - -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| orderId | string(Long 雪花) | 是 | 订单 ID | - -### 4.2 请求体字段(MpInvoiceApplyReqVO,⚠️ amount 已删) - -当前完整字段列表(无 amount): - -| 字段 | 类型 | 必填条件 | 说明 | -|------|------|---------|------| -| invoiceType | string | 始终必填 | 发票类型,只有 VAT_NORMAL / VAT_SPECIAL 两值 | -| titleType | string | 始终必填 | 抬头类型:COMPANY(单位)/ PERSONAL(个人);VAT_SPECIAL 只能 COMPANY | -| titleName | string | 始终必填 | 发票抬头(企业全称或个人姓名) | -| taxNo | string | titleType=COMPANY 或 invoiceType=VAT_SPECIAL 时必填 | 纳税人识别号 | -| bankName | string | invoiceType=VAT_SPECIAL 时必填 | 开户银行名称 | -| bankAccount | string | invoiceType=VAT_SPECIAL 时必填 | 银行账号 | -| registAddress | string | invoiceType=VAT_SPECIAL 时必填 | 注册地址 | -| registPhone | string | invoiceType=VAT_SPECIAL 时必填 | 注册电话 | -| email | string | 始终必填 | 收件邮箱,需通过邮箱格式校验 | -| remark | string | 选填 | 申请备注 | - ---- - -## 5 出参字段 - -响应:成功返回新建发票 ID(字符串,雪花 ID)。 - - - ---- - -## 6 枚举 / 数据字典 - -### 6.1 发票类型(invoiceType) - -| code | 说明 | -|------|------| -| VAT_NORMAL | 增值税普通发票 | -| VAT_SPECIAL | 增值税专用发票 | - -### 6.2 抬头类型(titleType) - -| code | 说明 | 限制 | -|------|------|------| -| COMPANY | 单位 | 普票/专票均可 | -| PERSONAL | 个人 | 只能选 VAT_NORMAL;选 VAT_SPECIAL 返回 581523 | - -### 6.3 订单状态与可申请关系 - -| 订单状态(code) | 中文 | 可申请? | 说明 | -|----------------|------|---------|------| -| CUSTOMIZING | 定制中 | 是 | 放宽新增 | -| PENDING_DEPARTURE | 待出行 | 是 | 放宽新增 | -| TRAVELLING | 出行中 | 是 | 放宽新增 | -| COMPLETED | 已完成 | 是 | 原有 | -| CANCELLED | 已取消 | 条件是 | 净实收(已付 - 已退)> 0 时可申请 | -| 其他状态 | - | 否 | 报 581524 | - -### 6.4 开票时金额自动计算规则 - -| 订单类型 | 金额计算公式 | -|----------|-------------| -| 正常单(非 CANCELLED) | 应收总额 = 订单总价 + 增项 - 优惠 | -| 取消单(CANCELLED) | 净实收 = 已付金额 - 已退金额 | - ---- - -## 7 错误码 - -| 错误码 | 常量 | 触发场景 | -|--------|------|----------| -| 581511 | INVOICE_ALREADY_EXISTS | 该订单已有有效发票,不可重复申请(一单一票) | -| 581513 | INVOICE_TYPE_INVALID | 发票类型枚举值非法 | -| 581514 | INVOICE_TAX_NO_REQUIRED | 公司抬头/专票时税号为必填 | -| 581515 | INVOICE_VAT_SPECIAL_FIELDS_REQUIRED | 专票时开户行/银行账号/注册地址/注册电话为必填 | -| 581516 | INVOICE_EMAIL_REQUIRED | 收件邮箱为必填或格式错误(HTTP 400) | -| 581518 | INVOICE_FORBIDDEN | 无权访问该订单(IDOR 防护) | -| 581523 | INVOICE_VAT_SPECIAL_PERSONAL_FORBIDDEN | 专票只能开给单位 | -| 581524 | INVOICE_ORDER_NOT_APPLICABLE | ✨ 新增:订单状态不在可申请集合内,或取消单净实收为 0 | - ---- - -## 8 示例 - -### 8.1 典型成功——普票申请(无 amount 字段) - -请求 - - - -响应 - - -### 8.2 边界情况——订单处于定制中提前申请 - -说明:订单状态 CUSTOMIZING(定制中),本次放宽后允许申请。开票金额将在财务执行开票操作时按当时应收总额计算。 - -请求(结构同 8.1,orderId 为定制中订单 ID) - -响应 - - -### 8.3 业务失败——取消订单净实收为 0 被拒 - -说明:订单已取消,实付 1000 元且已全额退款,净实收 = 0,无法申请开票。 - -请求(结构同 8.1,orderId 为该取消订单 ID) - -响应 - - ---- - -## 9 业务边界 - -适用: -- 订单状态 ∈ {CUSTOMIZING / PENDING_DEPARTURE / TRAVELLING / COMPLETED} 均可申请 -- CANCELLED 且净实收(已付 - 已退)> 0 时可申请 - -不适用: -- PAID(已支付但未进入定制阶段)等其他状态报 581524 -- CANCELLED 且净实收 = 0 报 581524 -- 订单不属于当前登录用户,报 581518(IDOR 防护) - -特殊边界: -- 一单一票:同一订单只允许一张有效发票(REQUESTED/ISSUED/PUSHED 状态),重复申请报 581511 -- 开票金额由后端在财务执行 issue 操作时自动计算,小程序端申请时不确定最终金额 - ---- - -## 10 修改前后对比 - -| 字段 / 规则 | 变更前 | 变更后 | -|-------------|--------|--------| -| 申请入参 amount | 必填,客户填写开票金额 | ⚠️ 已删除,后端开票时自动算 | -| 正常订单申请门槛 | 仅 COMPLETED | CUSTOMIZING / PENDING_DEPARTURE / TRAVELLING / COMPLETED | -| 取消订单申请 | 不允许 | 净实收 > 0 时可申请 | -| 不满足门槛错误码 | 581510 INVOICE_ORDER_NOT_COMPLETED(已废弃) | 581524 INVOICE_ORDER_NOT_APPLICABLE(新增) | - ---- - -## 11 影响评估 / 回滚 - -破坏兼容性:是 - -- 小程序申请发票表单必须删除金额输入框,不再传 amount 字段 -- 若现有流程中有基于 amount 的前端金额展示或校验逻辑,须同步移除 -- 不满足门槛的错误提示由旧 581510 改为 581524,前端若 hardcode 了 581510 的处理逻辑需同步更新 - -前端同步上线:申请表单删 amount 必须与后端同期上线。 - -回滚方案:回滚后端至 #4360 前版本,amount 字段恢复必填,申请门槛收回到仅 COMPLETED,581524 不再存在。 - ---- - -## 12 注意事项 - -1. **amount 字段已删**:小程序申请发票表单必须移除金额输入框,不传 amount,传入后端会忽略。 -2. **申请门槛放宽的注意点**:定制中等状态提前申请,开票时金额由财务执行 issue 操作时后端按当时应收总额计算,小程序无法在申请时预知最终开票金额。 -3. **581524 vs 旧 581510**:新错误码 581524 取代了旧的 581510,含义更精确(包含取消单净实收为 0 的场景)。若前端有 581510 的 hardcode 判断需更新为 581524。 -4. **开票金额由财务操作确定**:小程序端只负责申请,金额由后端在财务开票(PUT issue)时写入,前端无法在申请时展示最终金额。 - ---- - -## 13 关联 / 联系人 - -- **Issue**:[#4353 发票模块门槛放宽与开票规则优化](https://git.1814.love:8443/wx/HL/issues/4353) -- **PR**:[#4360](https://git.1814.love:8443/wx/HL/pulls/4360) -- **后端负责人**:腰苏图(yaosutu) diff --git a/changelogs-v2/2026-05/18_#2521_transport-plan-list-path.md b/changelogs-v2/2026-05/18_#2521_transport-plan-list-path.md deleted file mode 100644 index 515ce9f..0000000 --- a/changelogs-v2/2026-05/18_#2521_transport-plan-list-path.md +++ /dev/null @@ -1,238 +0,0 @@ -# 大交通批次列表: 接口路径破坏性迁移 (transport-plans → transport-plan/list) - -> **存放目录**: 二期(v3,`order-v3` 标签)→ `changelogs-v2/2026-05/` -> -> **服务**: hl-order-v3 (端口 8084) -> **PR**: #2544 (squash 后 commit `be3badaca`) -> **Issue**: #2521 -> **日期**: 2026-05-18 -> **影响范围**: 管理后台「行程安排 - 接送站」区块 - 大交通批次列表 - ---- - -## ⚠️ 关键变化(破坏性 - 前端必同步) - -一行红字说清: -- **本次变了什么**: 大交通批次列表接口路径从 `/transport-plans` 改为 `/transport-plan/list` -- **前端以前以为的是什么**: `GET /v3/admin/order/{id}/transport-plans` (旧式复数资源风格) -- **实际现在是什么**: `GET /v3/admin/order/{id}/transport-plan/list` (统一 list/add/edit/delete 动词风格) - -**配套破坏性**: §2.6 大交通批次模块 4 个接口路径风格 + 动词 + Method 全部统一迁移,见 #2522/#2523/#2524 changelog。前端需要 4 个接口一并改。 - ---- - -## 一、背景 - -V5.48 §2.6 大交通批次模块 4 个接口(list/add/edit/delete)统一为 `/transport-plan/{动词}` 子路径风格,与订单模块其他子资源(出行人 traveler/list、配房 hotel-requirement 等)保持一致: - -| 风格 | 旧 (V5.47 之前) | 新 (V5.48) | -|------|-----------------|------------| -| 列表 | `GET /transport-plans` | `GET /transport-plan/list` | -| 新增 | `POST /transport-plans` | `POST /transport-plan/add` | -| 编辑 | `PUT /transport-plans/{planId}` | `POST /transport-plan/{planId}/edit` | -| 软删 | `DELETE /transport-plans/{planId}` | `POST /transport-plan/{planId}/delete` | - -统一动词路径后,网关路由 / 权限 RBAC / 操作审计的资源前缀一致,便于配置和扫描。 - ---- - -## 二、变更接口清单 - -| # | 接口 | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|------|----------|------| -| 1 | 大交通批次列表 | GET | `/v3/admin/order/{id}/transport-plan/list` | 路径迁移 | 旧路径 `/transport-plans` 已下线 | - ---- - -## 三、接口详情 - -### 1. 大交通批次列表 `GET /v3/admin/order/{id}/transport-plan/list` - -**VO**: `TransportPlanVO` - -#### 入参 - -| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | -|------|------|------|------|------|------| -| `id` | Path | Long | ✅ | - | 订单 ID | - -#### 出参 `Result>` - -| 字段 | 类型 | 说明 | -|------|------|------| -| `id` | String | 批次 ID(雪花) | -| `orderId` | String | 订单 ID | -| `direction` | String | 方向 `ARRIVAL` / `DEPARTURE` | -| `transportType` | String | 类型 `FLIGHT` / `TRAIN` / `SELF_DRIVE` | -| `transportNo` | String | 航班号 / 车次号(SELF_DRIVE 时为 null) | -| `carrier` | String | 航司 / 铁路公司 | -| `departStation` | String | 出发站 | -| `arriveStation` | String | 到达站 | -| `departTime` | LocalDateTime | 出发时间(SELF_DRIVE 时为 null) | -| `arriveTime` | LocalDateTime | 到达时间(SELF_DRIVE 时为 null) | -| `selfDrivePeriod` | String | 仅 SELF_DRIVE: `MORNING` / `AFTERNOON` / `EVENING` | -| `selfDriveEta` | LocalDateTime | 仅 SELF_DRIVE: 预计抵达时间 | -| `travelers` | List | 桥接表关联出行人,元素 `{id, name}` | -| `remark` | String | 备注 | - -#### 请求示例 - -``` -GET /v3/admin/order/60123456789012/transport-plan/list -``` - -#### 响应示例 - -```json -{ - "code": 200, - "data": [ - { - "id": "80012345", - "orderId": "60123456789012", - "direction": "ARRIVAL", - "transportType": "FLIGHT", - "transportNo": "CA1234", - "carrier": "中国国际航空", - "departStation": "北京首都T3", - "arriveStation": "长春龙嘉", - "departTime": "2026-06-01T08:30:00", - "arriveTime": "2026-06-01T10:15:00", - "selfDrivePeriod": null, - "selfDriveEta": null, - "travelers": [ - {"id": "70123456789012", "name": "张三"}, - {"id": "70123456789013", "name": "王小明"} - ], - "remark": "需要接机举牌" - }, - { - "id": "80012346", - "orderId": "60123456789012", - "direction": "DEPARTURE", - "transportType": "SELF_DRIVE", - "transportNo": null, - "carrier": null, - "departStation": null, - "arriveStation": null, - "departTime": null, - "arriveTime": null, - "selfDrivePeriod": "AFTERNOON", - "selfDriveEta": "2026-06-05T15:00:00", - "travelers": [ - {"id": "70123456789012", "name": "张三"} - ], - "remark": null - } - ], - "msg": "success" -} -``` - -#### 空数据响应 - -订单尚未登记任何大交通批次时: - -```json -{ "code": 200, "data": [], "msg": "success" } -``` - -#### 错误响应 - -订单不存在: - -```json -{ - "code": 581100, - "msg": "订单不存在", - "data": null -} -``` - ---- - -## 四、契约约束与正确调用方式 - -### ✅ 正确 / ❌ 错误调用对照 - -| 场景 | 请求 | -|------|------| -| ✅ 新路径 | `GET /v3/admin/order/60123456789012/transport-plan/list` | -| ❌ 旧路径(已下线 404) | `GET /v3/admin/order/60123456789012/transport-plans` | - -### 字段语义约束 - -- `direction` 取值固定两值: `ARRIVAL`(到达) / `DEPARTURE`(离开) -- `transportType` 三值: `FLIGHT` / `TRAIN` / `SELF_DRIVE` -- `SELF_DRIVE` 类型行: `transportNo` / `departTime` / `arriveTime` 必为 null;`selfDrivePeriod` 必有值 -- `FLIGHT` / `TRAIN` 类型行: `transportNo` / `departTime` / `arriveTime` 必有值;`selfDrivePeriod` / `selfDriveEta` 必为 null -- `travelers` 数组永远非空(后端保证),元素至少 1 个 - ---- - -## 五、数据库行为 - -**只读查询**,无写动作。 - -| 查询步骤 | 表 | 说明 | -|----------|-----|------| -| 1 | `order_transport_plan` | `WHERE order_id = ? AND deleted = 0`,主表批次记录 | -| 2 | LEFT JOIN `order_transport_plan_traveler` | `WHERE deleted = 0`,桥接表关联出行人 ID | -| 3 | JOIN `order_traveler` | `WHERE deleted = 0`,出行人姓名补全 | -| 4 | 内存装配 | 同一 plan 多 traveler 聚合为 `travelers: [{id, name}]` 数组 | - -排序: `ORDER BY direction ASC, depart_time ASC, id ASC` (ARRIVAL 先于 DEPARTURE,同方向按时间升序)。 - ---- - -## 六、边界行为 - -- 未登录 → 401(网关拦截) -- 订单不存在 → `581100` -- 订单存在但无任何批次 → 200 + `data: []`(不报错) -- 批次存在但桥接表全软删 → `travelers: []`(理论上不应出现,后端保证) -- 老数据(v2 历史 plan 无 `mode` 字段)→ 字段为 null,不异常 - ---- - -## 七、不影响范围(显式声明,帮前端 / QA 缩小排查面) - -- **仅影响**: 管理后台 F21 行程安排 Tab 「接送站」区块 - 大交通批次列表渲染 -- **零影响**: - - C 端订单详情 mp 接口(不查 plan 表,只查 arrival_plan) - - 订单创建 / 支付 / 退款主流程 - - 出行人模块(travelers list 仍走 `/admin/order/{id}/traveler/list`) - - Feign 内部接口 `GET /internal/order/orders/{orderId}/travelers`(回传 `transportPlanIds`,使用的是同表数据但聚合方向相反,不受路径变化影响) - ---- - -## 八、测试环境已验证 - -测试服 9443 网关 + 真 admin token round-trip 验证: - -``` -GET https://web.test.1814.love:9443/v3/admin/order/{orderId}/transport-plan/list - → 200 + data 数组 ✓ - → travelers 嵌套字段返回正确 (id+name) ✓ - → ARRIVAL/DEPARTURE 排序正确 ✓ - → 空订单返 data: [] ✓ -``` - -(commit `15e2c7eeb` 含 hotfix #2550 修复 conflict markers,4 接口一并 9443 真测过) - ---- - -## 九、相关历史 PR - -| PR | Issue | 说明 | 是否仍有效 | -|----|-------|------|------------| -| **本 PR #2544** | **#2521** | 路径破坏性迁移 `/transport-plans` → `/transport-plan/list` | ✅ 最新 | - ---- - -## 十、相关文档 - -- 关联 Issue: [wx/HL#2521](https://git.1814.love:8443/wx/HL/issues/2521) -- 关联 PR: [wx/HL#2544](https://git.1814.love:8443/wx/HL/pulls/2544) -- API 文档: `docs/order-v3/api/API-SPEC-V5.48.html` §2.6.1 -- 配套破坏性: 见 `18_#2522_transport-plan-add.md` / `18_#2523_transport-plan-edit.md` / `18_#2524_transport-plan-delete.md` diff --git a/changelogs-v2/2026-05/18_#2522_transport-plan-add.md b/changelogs-v2/2026-05/18_#2522_transport-plan-add.md deleted file mode 100644 index d000998..0000000 --- a/changelogs-v2/2026-05/18_#2522_transport-plan-add.md +++ /dev/null @@ -1,239 +0,0 @@ -# 大交通批次新增: 接口路径破坏性迁移 + 4 个新错误码 - -> **存放目录**: 二期(v3,`order-v3` 标签)→ `changelogs-v2/2026-05/` -> -> **服务**: hl-order-v3 (端口 8084) -> **PR**: #2545 (commit `2c66137c7`) -> **Issue**: #2522 -> **日期**: 2026-05-18 -> **影响范围**: 管理后台「行程安排 - 接送站」区块 - 大交通批次新增弹窗 - ---- - -## ⚠️ 关键变化(破坏性 - 前端必同步) - -一行红字说清: -- **本次变了什么**: 新增大交通批次接口路径从 `/transport-plans` 改为 `/transport-plan/add`,并新增 4 个错误码 `581140`-`581143` -- **前端以前以为的是什么**: `POST /v3/admin/order/{id}/transport-plans` + Body `TransportPlanReqVO` -- **实际现在是什么**: `POST /v3/admin/order/{id}/transport-plan/add` + Body `TransportPlanReqVO`(字段不变) - -**配套破坏性**: §2.6 大交通批次模块 4 个接口路径风格 + 动词 + Method 全部统一迁移,见 #2521/#2523/#2524 changelog。 - ---- - -## 一、背景 - -V5.48 §2.6.2 将原 `POST /transport-plans` 拆为 `POST /transport-plan/add`,并补齐"字段组合 / 出行人合法性 / 时间顺序 / 同方向冲突"4 类业务校验错误码,与文档 §2.6 错误码段位 `581140`-`581143` 一一对应。 - -`orderId` 从 path 取,Body 不传;操作人从 JWT 派生(对齐 §2.6 通用约定)。 - ---- - -## 二、变更接口清单 - -| # | 接口 | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|------|----------|------| -| 1 | 大交通批次新增 | POST | `/v3/admin/order/{id}/transport-plan/add` | 路径迁移 + 错误码新增 | 旧 `/transport-plans` 下线;4 个业务错误码上线 | - ---- - -## 三、接口详情 - -### 1. 大交通批次新增 `POST /v3/admin/order/{id}/transport-plan/add` - -**VO**: `TransportPlanReqVO`(入参) / `TransportPlanVO`(出参) - -#### 入参 Body `TransportPlanReqVO` - -| 字段 | 类型 | 必填 | 约束 | 说明 | -|------|------|:----:|------|------| -| `direction` | String | ✅ | 枚举 | `ARRIVAL` / `DEPARTURE` | -| `transportType` | String | ✅ | 枚举 | `FLIGHT` / `TRAIN` / `SELF_DRIVE` | -| `transportNo` | String | 条件 | ≤50 | 航班号 / 车次号;`SELF_DRIVE` 时必须为 null | -| `carrier` | String | ❌ | ≤50 | 航司 / 铁路公司 | -| `departStation` | String | ❌ | ≤100 | 出发站 | -| `arriveStation` | String | ❌ | ≤100 | 到达站 | -| `departTime` | LocalDateTime | 条件 | - | `FLIGHT`/`TRAIN` 必填;`SELF_DRIVE` 必须为 null | -| `arriveTime` | LocalDateTime | 条件 | - | `FLIGHT`/`TRAIN` 必填;`SELF_DRIVE` 必须为 null;必须 ≥ `departTime` | -| `selfDrivePeriod` | String | 条件 | 枚举 | 仅 `SELF_DRIVE` 必填: `MORNING` / `AFTERNOON` / `EVENING` | -| `selfDriveEta` | LocalDateTime | ❌ | - | 仅 `SELF_DRIVE` 可选 | -| `travelerIds` | List | ✅ | size≥1 | 关联出行人 ID,至少 1 个 | -| `remark` | String | ❌ | ≤500 | 备注 | - -#### 出参 `Result` - -字段同 #2521 列表的元素结构(含 `travelers: [{id, name}]` 嵌套)。 - -#### 请求示例 - -```json -POST /v3/admin/order/60123456789012/transport-plan/add - -{ - "direction": "ARRIVAL", - "transportType": "FLIGHT", - "transportNo": "CA1234", - "carrier": "中国国际航空", - "departStation": "北京首都T3", - "arriveStation": "长春龙嘉", - "departTime": "2026-06-01T08:30:00", - "arriveTime": "2026-06-01T10:15:00", - "selfDrivePeriod": null, - "selfDriveEta": null, - "travelerIds": [70123456789012, 70123456789013], - "remark": "需要接机举牌" -} -``` - -#### 响应示例 - -```json -{ - "code": 200, - "data": { - "id": "80012345", - "orderId": "60123456789012", - "direction": "ARRIVAL", - "transportType": "FLIGHT", - "transportNo": "CA1234", - "carrier": "中国国际航空", - "departStation": "北京首都T3", - "arriveStation": "长春龙嘉", - "departTime": "2026-06-01T08:30:00", - "arriveTime": "2026-06-01T10:15:00", - "selfDrivePeriod": null, - "selfDriveEta": null, - "travelers": [ - {"id": "70123456789012", "name": "张三"}, - {"id": "70123456789013", "name": "王小明"} - ], - "remark": "需要接机举牌" - }, - "msg": "success" -} -``` - -#### 错误响应 - -| 错误码 | 含义 | 触发场景示例 | -|--------|------|--------------| -| `581140` | 大交通字段组合不合法 | `FLIGHT` 缺 `transportNo` / `SELF_DRIVE` 错带 `transportNo` 或 `departTime` | -| `581141` | travelerIds 含订单外的出行人 | 提交的 traveler ID 不属于当前订单或已软删 | -| `581142` | 出发时间晚于到达时间 | `departTime > arriveTime` | -| `581143` | 同方向同一出行人已在另一 plan | 张三已在 ARRIVAL plan A,再为 ARRIVAL plan B 提交张三 | -| `581100` | 订单不存在 | path 中 orderId 无效 | - -示例 `581140`: - -```json -{ "code": 581140, "msg": "大交通字段组合不合法: FLIGHT 类型必须填 transportNo", "data": null } -``` - -示例 `581143`: - -```json -{ "code": 581143, "msg": "同方向同一出行人已在另一 plan: 张三(70123456789012) 已存在 ARRIVAL 批次 80012340", "data": null } -``` - ---- - -## 四、契约约束与正确调用方式 - -### ✅ 正确 / ❌ 错误 payload 对照 - -| 场景 | payload 关键字段 | 结果 | -|------|------------------|------| -| ✅ FLIGHT 完整 | `transportType:FLIGHT, transportNo:CA1234, departTime/arriveTime 有值` | 201 | -| ✅ SELF_DRIVE 完整 | `transportType:SELF_DRIVE, transportNo:null, departTime:null, arriveTime:null, selfDrivePeriod:MORNING` | 201 | -| ❌ FLIGHT 缺航班号 | `transportType:FLIGHT, transportNo:null` | `581140` | -| ❌ SELF_DRIVE 带航班号 | `transportType:SELF_DRIVE, transportNo:CA1234` | `581140` | -| ❌ 时间倒挂 | `departTime:10:00, arriveTime:08:00` | `581142` | -| ❌ travelerIds 含他人 | `travelerIds:[别单出行人]` | `581141` | -| ❌ 同方向重复占用 | 同方向同 traveler 在另一 plan | `581143` | - -### 并发与幂等 - -- `@Idempotent(timeout = 3)`: 同 admin 3 秒内重复 POST 同请求体直接拿首次结果,防双击双提 -- `@Lock4j(keys = "#id")`: 同订单 30 秒锁,串行化 add/edit/delete,保证桥接表一致 - -### 同方向冲突规则 - -- 「同方向」= `direction` 相同的所有 plan(同 ARRIVAL 之间冲突,同 DEPARTURE 之间冲突) -- 「同一出行人」= 同一 `traveler_id` -- 不同方向不冲突(同一人可同时在 1 个 ARRIVAL plan + 1 个 DEPARTURE plan) -- 软删的 plan / 桥接行不参与冲突判定 - ---- - -## 五、数据库行为 - -单事务执行,失败整体回滚: - -| 步骤 | 表 | 动作 | -|------|-----|------| -| 1 | `order_transport_plan` | INSERT 新行,雪花 ID,`deleted=0`,`create_time`/`update_time` 自动填 | -| 2 | `order_transport_plan_traveler` | INSERT N 行(N = `travelerIds.size()`),每行 `{plan_id, traveler_id, deleted:0}` | - -校验顺序(任一失败即抛业务异常,事务回滚): - -1. 订单存在性 → `581100` -2. 字段组合校验(类型 × 字段必填矩阵)→ `581140` -3. 时间顺序校验 → `581142` -4. travelerIds 归属校验(SELECT order_traveler WHERE order_id 比对)→ `581141` -5. 同方向同 traveler 占用校验(SELECT bridge WHERE direction = ? AND traveler_id IN ?)→ `581143` - ---- - -## 六、边界行为 - -- 未登录 → 401(网关拦截) -- 订单不存在 → `581100` -- `travelerIds` 重复值 → 后端去重后再校验(不报错) -- `SELF_DRIVE` 仅传 `selfDrivePeriod` 不传 `selfDriveEta` → 通过(ETA 选填) -- 一次提交超过单订单合理上限(>10 plan)→ 不在此层拦截,业务上仅靠订单状态自然限制 - ---- - -## 七、不影响范围 - -- **仅影响**: 管理后台 F21 「接送站」新增弹窗 -- **零影响**: - - C 端订单详情 / 抵达计划(`order_arrival_plan` 表完全独立,见 detail 文档 §10.2 共存边界) - - 出行人模块自身 CRUD - - 订单状态机(plan 增删不直接变 `order_main.status`) - ---- - -## 八、测试环境已验证 - -测试服 9443 网关 + 真 admin token round-trip 验证: - -``` -POST https://web.test.1814.love:9443/v3/admin/order/{orderId}/transport-plan/add - → 200 + 返回新 plan(含 travelers 嵌套)✓ - → FLIGHT 缺 transportNo → 581140 ✓ - → SELF_DRIVE 错带 transportNo → 581140 ✓ - → departTime > arriveTime → 581142 ✓ - → travelerIds 含别单 → 581141 ✓ - → 同方向同 traveler 重复 → 581143 ✓ - → 重复 POST 3s 内同请求体 → 幂等返同结果 ✓ -``` - -(commit `15e2c7eeb` 含 hotfix #2550,4 接口一并 9443 真测过) - ---- - -## 九、相关历史 PR - -| PR | Issue | 说明 | 是否仍有效 | -|----|-------|------|------------| -| **本 PR #2545** | **#2522** | 路径迁移 + 错误码 581140-581143 上线 | ✅ 最新 | - ---- - -## 十、相关文档 - -- 关联 Issue: [wx/HL#2522](https://git.1814.love:8443/wx/HL/issues/2522) -- 关联 PR: [wx/HL#2545](https://git.1814.love:8443/wx/HL/pulls/2545) -- API 文档: `docs/order-v3/api/API-SPEC-V5.48.html` §2.6.2 -- 配套破坏性: 见 `18_#2521_transport-plan-list-path.md` / `18_#2523_transport-plan-edit.md` / `18_#2524_transport-plan-delete.md` diff --git a/changelogs-v2/2026-05/18_#2523_transport-plan-edit.md b/changelogs-v2/2026-05/18_#2523_transport-plan-edit.md deleted file mode 100644 index 1fb39b0..0000000 --- a/changelogs-v2/2026-05/18_#2523_transport-plan-edit.md +++ /dev/null @@ -1,234 +0,0 @@ -# 大交通批次编辑: Method 破坏性变更 (PUT → POST) + 错误码 581144 - -> **存放目录**: 二期(v3,`order-v3` 标签)→ `changelogs-v2/2026-05/` -> -> **服务**: hl-order-v3 (端口 8084) -> **PR**: #2546 (commit `1106b9d7f`) + hotfix #2550 (commit `15e2c7eeb` 修 conflict markers) -> **Issue**: #2523 -> **日期**: 2026-05-18 -> **影响范围**: 管理后台「行程安排 - 接送站」区块 - 大交通批次编辑弹窗 - ---- - -## ⚠️ 关键变化(破坏性 - 前端必同步) - -一行红字说清: -- **本次变了什么**: 编辑大交通批次接口 **Method 从 `PUT` 改为 `POST`** + 路径子段从 `/transport-plans/{planId}` 改为 `/transport-plan/{planId}/edit` -- **前端以前以为的是什么**: `PUT /v3/admin/order/{id}/transport-plans/{planId}` -- **实际现在是什么**: `POST /v3/admin/order/{id}/transport-plan/{planId}/edit` - -**Method 变化是头号陷阱**: 前端若沿用 `axios.put(...)` 会直接 404 / 405,必须改 `axios.post(...)`。 - -**配套破坏性**: §2.6 大交通批次模块 4 个接口路径风格 + 动词 + Method 全部统一迁移,见 #2521/#2522/#2524。 - ---- - -## 一、背景 - -V5.48 §2.6 统一管理后台所有变更动作走 `POST /{资源}/{动词}` 风格(对齐订单核心模块、出行人模块): - -| 旧风格 (REST 经典) | 新风格 (V5.48 统一) | -|--------------------|---------------------| -| `PUT /transport-plans/{id}` | `POST /transport-plan/{id}/edit` | -| `DELETE /transport-plans/{id}` | `POST /transport-plan/{id}/delete` | - -POST + 动词路径的好处: 网关 RBAC 配置统一只看 path 不看 Method、操作审计日志埋点统一、防误触缓存。 - -`#2550 hotfix` 修复合并 dev-v3 时 IDE 残留的 `<<<<<<<` conflict markers(扫描全代码确保零残留)。 - ---- - -## 二、变更接口清单 - -| # | 接口 | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|------|----------|------| -| 1 | 大交通批次编辑 | POST | `/v3/admin/order/{id}/transport-plan/{planId}/edit` | Method + 路径双破坏 | 旧 `PUT /transport-plans/{planId}` 下线;新增错误码 `581144` | - ---- - -## 三、接口详情 - -### 1. 大交通批次编辑 `POST /v3/admin/order/{id}/transport-plan/{planId}/edit` - -**VO**: `TransportPlanReqVO`(入参,与 add 同 VO) / `TransportPlanVO`(出参) - -#### 入参 - -| 字段 | 位置 | 类型 | 必填 | 说明 | -|------|------|------|:----:|------| -| `id` | Path | Long | ✅ | 订单 ID | -| `planId` | Path | Long | ✅ | 批次 ID | -| Body | Body | `TransportPlanReqVO` | ✅ | 字段同 add(见 #2522 入参表) | - -#### 出参 `Result` - -字段同 #2521 列表元素结构。 - -#### 请求示例 - -```json -POST /v3/admin/order/60123456789012/transport-plan/80012345/edit - -{ - "direction": "ARRIVAL", - "transportType": "FLIGHT", - "transportNo": "CA1234", - "carrier": "中国国际航空", - "departStation": "北京首都T3", - "arriveStation": "长春龙嘉", - "departTime": "2026-06-01T09:00:00", - "arriveTime": "2026-06-01T11:00:00", - "selfDrivePeriod": null, - "selfDriveEta": null, - "travelerIds": [70123456789012, 70123456789013, 70123456789014], - "remark": "改时间,加一人" -} -``` - -#### 响应示例 - -```json -{ - "code": 200, - "data": { - "id": "80012345", - "orderId": "60123456789012", - "direction": "ARRIVAL", - "transportType": "FLIGHT", - "transportNo": "CA1234", - "carrier": "中国国际航空", - "departStation": "北京首都T3", - "arriveStation": "长春龙嘉", - "departTime": "2026-06-01T09:00:00", - "arriveTime": "2026-06-01T11:00:00", - "selfDrivePeriod": null, - "selfDriveEta": null, - "travelers": [ - {"id": "70123456789012", "name": "张三"}, - {"id": "70123456789013", "name": "王小明"}, - {"id": "70123456789014", "name": "李四"} - ], - "remark": "改时间,加一人" - }, - "msg": "success" -} -``` - -#### 错误响应 - -复用 add 接口的 4 个错误码(`581140`-`581143`),并新增: - -| 错误码 | 含义 | 触发场景 | -|--------|------|----------| -| `581144` | plan 不存在 / 不属于该订单 | `planId` 无效 / 已软删 / order_id 与 path 不匹配 | - -示例 `581144`: - -```json -{ "code": 581144, "msg": "大交通批次不存在或不属于该订单: planId=80099999, orderId=60123456789012", "data": null } -``` - ---- - -## 四、契约约束与正确调用方式 - -### ✅ 正确 / ❌ 错误调用对照 - -| 场景 | 请求 | 结果 | -|------|------|------| -| ✅ 新调用 | `POST /transport-plan/80012345/edit` + Body | 200 | -| ❌ 沿用旧 PUT | `PUT /transport-plans/80012345` + Body | 404 / 405 | -| ❌ planId 跨单 | edit path `orderId=A`,planId 属于 `orderId=B` | `581144` | -| ❌ planId 已软删 | edit 已 deleted=1 的 plan | `581144` | - -### 全量重建语义 - -- **edit 不是"增量改字段"**: Body 提交什么就最终持久化什么(包括 `travelerIds` 全量) -- 想去掉 1 个 traveler: 在 `travelerIds` 数组中删掉该 ID 再提交,后端会 DELETE+INSERT 重建桥接表 -- 不能用 edit "局部改 1 个字段而保留其他字段不动"的语义,前端必须先 GET list 取完整 plan 再改 - -### 并发与幂等 - -- `@Lock4j(keys = "#id")`: 同订单 30 秒锁,串行化 add/edit/delete -- 编辑接口不加 `@Idempotent`(每次编辑都应被尊重,允许相同 Body 重复提交以触发 update_time 刷新) - ---- - -## 五、数据库行为 - -单事务执行,失败整体回滚: - -| 步骤 | 表 | 动作 | -|------|-----|------| -| 1 | `order_transport_plan` | UPDATE 该 plan 行所有业务字段(direction / transportType / transportNo / carrier / 各 station / 各 time / selfDrive* / remark),`update_time` 自动刷新 | -| 2 | `order_transport_plan_traveler` | DELETE(物理删除桥接行 WHERE `plan_id = ?`)| -| 3 | `order_transport_plan_traveler` | INSERT N 行(N = 新 `travelerIds.size()`)| - -> 桥接表用「全量重建」而非 diff 算法,简化业务逻辑;桥接表本身无业务历史价值,物理删除不留痕。`order_transport_plan` 主表的 `update_time` 会随 edit 刷新供前端展示「最后修改时间」。 - -校验顺序(同 add,附加 plan 归属校验): - -1. plan 存在性 + 归属 → `581144` -2. 订单存在性 → `581100` -3. 字段组合 → `581140` -4. 时间顺序 → `581142` -5. travelerIds 归属 → `581141` -6. 同方向同 traveler 占用(**排除自己**)→ `581143` - ---- - -## 六、边界行为 - -- 未登录 → 401(网关拦截) -- planId 不存在 / 跨单 / 已软删 → `581144` -- 同方向同 traveler 占用判定**排除当前 plan 自己**(改自己不算冲突,只跟其他 active plan 比对) -- Body 与原 plan 完全相同(无字段变化)→ 200 + 桥接表 DELETE+INSERT(等价 no-op 但 `update_time` 仍刷新) -- 老数据(v2 历史 plan 字段缺失)→ edit 会以 Body 全量值覆盖 - ---- - -## 七、不影响范围 - -- **仅影响**: 管理后台 F21 「接送站」编辑弹窗 -- **零影响**: - - C 端订单详情 / mp 抵达计划接口 - - 出行人 CRUD(traveler 表本身不动) - - 订单状态机 - - 操作日志(本接口暂不挂 `@OperationLog`,与 v2 行为一致) - ---- - -## 八、测试环境已验证 - -测试服 9443 网关 + 真 admin token round-trip 验证: - -``` -POST https://web.test.1814.love:9443/v3/admin/order/{orderId}/transport-plan/{planId}/edit - → 200 + 返回更新后 plan(travelers 重建)✓ - → planId 不存在 → 581144 ✓ - → planId 属于别单 → 581144 ✓ - → 业务校验复用 581140/581141/581142/581143 全覆盖 ✓ - → 同方向同 traveler 占用判定排除自己 → 200 ✓ - → 桥接表全量 DELETE+INSERT 重建生效 ✓ -``` - -**hotfix #2550**(commit `15e2c7eeb`)清理了合并 dev-v3 时残留的 `<<<<<<<` / `=======` / `>>>>>>>` conflict markers(本接口实现文件曾受影响,hotfix 后 mvn compile 通过 + 9443 验证通过)。 - ---- - -## 九、相关历史 PR - -| PR | Issue | 说明 | 是否仍有效 | -|----|-------|------|------------| -| **本 PR #2546** | **#2523** | Method PUT→POST + 路径迁移 + 错误码 581144 | ✅ 最新 | -| #2550 | (hotfix) | 修复 conflict markers,无功能变化 | ✅ 配套 | - ---- - -## 十、相关文档 - -- 关联 Issue: [wx/HL#2523](https://git.1814.love:8443/wx/HL/issues/2523) -- 关联 PR: [wx/HL#2546](https://git.1814.love:8443/wx/HL/pulls/2546) -- Hotfix PR: [wx/HL#2550](https://git.1814.love:8443/wx/HL/pulls/2550) -- API 文档: `docs/order-v3/api/API-SPEC-V5.48.html` §2.6.3 -- 配套破坏性: 见 `18_#2521_transport-plan-list-path.md` / `18_#2522_transport-plan-add.md` / `18_#2524_transport-plan-delete.md` diff --git a/changelogs-v2/2026-05/18_#2524_transport-plan-delete.md b/changelogs-v2/2026-05/18_#2524_transport-plan-delete.md deleted file mode 100644 index 106104c..0000000 --- a/changelogs-v2/2026-05/18_#2524_transport-plan-delete.md +++ /dev/null @@ -1,187 +0,0 @@ -# 大交通批次软删: Method 破坏性变更 (DELETE → POST) + 桥接表级联软删 - -> **存放目录**: 二期(v3,`order-v3` 标签)→ `changelogs-v2/2026-05/` -> -> **服务**: hl-order-v3 (端口 8084) -> **PR**: #2547 (commit `68887aba0`) -> **Issue**: #2524 -> **日期**: 2026-05-18 -> **影响范围**: 管理后台「行程安排 - 接送站」区块 - 大交通批次删除 - ---- - -## ⚠️ 关键变化(破坏性 - 前端必同步) - -一行红字说清: -- **本次变了什么**: 删除大交通批次接口 **Method 从 `DELETE` 改为 `POST`** + 路径子段从 `/transport-plans/{planId}` 改为 `/transport-plan/{planId}/delete` -- **前端以前以为的是什么**: `DELETE /v3/admin/order/{id}/transport-plans/{planId}` -- **实际现在是什么**: `POST /v3/admin/order/{id}/transport-plan/{planId}/delete` - -**Method 变化提醒**: `axios.delete(...)` 必须改 `axios.post(...)`;部分浏览器/代理对 `DELETE` 体行为不一致,统一 POST 后规避。 - -**配套破坏性**: §2.6 大交通批次模块 4 个接口路径风格 + 动词 + Method 全部统一迁移,见 #2521/#2522/#2523。 - ---- - -## 一、背景 - -V5.48 §2.6.4 与 §2.6.3 编辑接口同步,统一 POST + 动词路径风格(对齐订单核心模块、出行人模块写动作)。 - -软删行为: 主表 + 桥接表**同事务级联软删**,均置 `deleted=1`,不丢历史,可被审计回溯。 - ---- - -## 二、变更接口清单 - -| # | 接口 | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|------|----------|------| -| 1 | 大交通批次软删 | POST | `/v3/admin/order/{id}/transport-plan/{planId}/delete` | Method + 路径双破坏 | 旧 `DELETE /transport-plans/{planId}` 下线 | - ---- - -## 三、接口详情 - -### 1. 大交通批次软删 `POST /v3/admin/order/{id}/transport-plan/{planId}/delete` - -#### 入参 - -| 字段 | 位置 | 类型 | 必填 | 说明 | -|------|------|------|:----:|------| -| `id` | Path | Long | ✅ | 订单 ID | -| `planId` | Path | Long | ✅ | 批次 ID | - -> 无 Body。 - -#### 出参 `Result` - -| 字段 | 类型 | 说明 | -|------|------|------| -| `data` | Boolean | 始终 `true`(失败走错误码,不会返 `false`)| - -#### 请求示例 - -``` -POST /v3/admin/order/60123456789012/transport-plan/80012345/delete -``` - -#### 响应示例 - -```json -{ - "code": 200, - "data": true, - "msg": "success" -} -``` - -#### 错误响应 - -| 错误码 | 含义 | 触发场景 | -|--------|------|----------| -| `581100` | 订单不存在 | path 中 orderId 无效 | -| `581121` | plan 不属于该订单 | path orderId 与 plan.order_id 不一致 / planId 不存在 / 已软删 | - -> **错误码段位说明**: 本接口复用 §2 模块 baseline `581121`(plan 归属校验),而非 §2.6 add/edit 新增的 `581144`,这是 V5.48 §2.6.4 文档的有意约定(删除场景与新增/编辑的归属校验语义区分)。前端可对 `581121` / `581144` 做同样的"批次不存在"提示。 - -示例 `581121`: - -```json -{ "code": 581121, "msg": "大交通批次不属于该订单: planId=80099999", "data": null } -``` - ---- - -## 四、契约约束与正确调用方式 - -### ✅ 正确 / ❌ 错误调用对照 - -| 场景 | 请求 | 结果 | -|------|------|------| -| ✅ 新调用 | `POST /transport-plan/80012345/delete` | 200 + `data:true` | -| ❌ 沿用旧 DELETE | `DELETE /transport-plans/80012345` | 404 / 405 | -| ❌ planId 跨单 | path orderId=A,planId 属于 B | `581121` | -| ❌ 重复 delete | 已 `deleted=1` 的 plan 再 delete | `581121`(被软删的 plan 视同不存在) | - -### 幂等语义 - -- `@Idempotent(timeout = 3)`: 同 admin 3 秒内重复 POST 同 path 直接拿首次结果,防双击重复 -- `@Lock4j(keys = "#id")`: 同订单 30 秒锁,串行化 add/edit/delete -- 即使去掉幂等保护,二次 delete 也会因 `581121`(已软删视同不存在)被业务层正确拒绝,不会出现"软删后再软删"的脏数据 - ---- - -## 五、数据库行为 - -单事务执行,失败整体回滚: - -| 步骤 | 表 | 动作 | -|------|-----|------| -| 1 | `order_transport_plan` | UPDATE `deleted=1` WHERE `id = ? AND order_id = ? AND deleted = 0`,`update_time` 自动刷新 | -| 2 | `order_transport_plan_traveler` | UPDATE `deleted=1` WHERE `plan_id = ?`(级联软删所有桥接行) | - -> **级联软删而非物理删**: 桥接表保留 `deleted=1` 历史行,审计能查"曾经哪些出行人在该 plan",支持事后回溯。与 edit 接口的「全量重建桥接表用物理 DELETE」语义有意不同 — edit 重建后旧关联失去业务意义,delete 软删后旧关联是审计证据。 - -校验顺序: - -1. 订单存在性 → `581100` -2. plan 归属 + 未软删 → `581121`(若 UPDATE 影响 0 行表示 plan 不存在或已删 或 order_id 不匹配) - ---- - -## 六、边界行为 - -- 未登录 → 401(网关拦截) -- 订单不存在 → `581100` -- planId 不存在 / 已软删 / 跨单 → `581121`(用 UPDATE WHERE 复合条件一次判定,影响行数=0 即归一处理) -- 软删后,#2521 list 接口该 plan 不再返回(因 WHERE deleted=0 过滤) -- 软删后,该 plan 占用的"同方向同 traveler"释放,该出行人可在同方向 add 新 plan(`581143` 判定 WHERE deleted=0) -- 老数据 `order_transport_plan_traveler` 历史无 `deleted` 字段 → schema 已保证字段存在(V5.48 配套迁移已完成) - ---- - -## 七、不影响范围 - -- **仅影响**: 管理后台 F21 「接送站」删除按钮 -- **零影响**: - - C 端订单详情 / mp 抵达计划接口 - - 出行人模块本身(traveler 行不动,只动桥接关联) - - 订单状态机 - - 已签合同的 PDF 内容(合同生成时是快照,不会回溯查 plan) - ---- - -## 八、测试环境已验证 - -测试服 9443 网关 + 真 admin token round-trip 验证: - -``` -POST https://web.test.1814.love:9443/v3/admin/order/{orderId}/transport-plan/{planId}/delete - → 200 + data:true ✓ - → DB 验证 order_transport_plan.deleted=1 ✓ - → DB 验证 order_transport_plan_traveler.deleted=1 (级联) ✓ - → planId 不存在 → 581121 ✓ - → planId 跨单 → 581121 ✓ - → 重复 delete → 581121 (软删后视同不存在) ✓ - → delete 后 list 不再返回该 plan ✓ - → delete 后 add 同方向同 traveler 成功 (581143 占用释放) ✓ - → 3s 内重复 POST → 幂等返同结果 ✓ -``` - -(commit `15e2c7eeb` 含 hotfix #2550,4 接口一并 9443 真测过) - ---- - -## 九、相关历史 PR - -| PR | Issue | 说明 | 是否仍有效 | -|----|-------|------|------------| -| **本 PR #2547** | **#2524** | Method DELETE→POST + 路径迁移 + 桥接表级联软删 | ✅ 最新 | - ---- - -## 十、相关文档 - -- 关联 Issue: [wx/HL#2524](https://git.1814.love:8443/wx/HL/issues/2524) -- 关联 PR: [wx/HL#2547](https://git.1814.love:8443/wx/HL/pulls/2547) -- API 文档: `docs/order-v3/api/API-SPEC-V5.48.html` §2.6.4 -- 配套破坏性: 见 `18_#2521_transport-plan-list-path.md` / `18_#2522_transport-plan-add.md` / `18_#2523_transport-plan-edit.md` diff --git a/changelogs-v2/2026-05/18_#2525_internal-traveler-decrypt-with-audit.md b/changelogs-v2/2026-05/18_#2525_internal-traveler-decrypt-with-audit.md deleted file mode 100644 index b5f5abf..0000000 --- a/changelogs-v2/2026-05/18_#2525_internal-traveler-decrypt-with-audit.md +++ /dev/null @@ -1,225 +0,0 @@ -# order-v3 出行人模块: 新增 Feign 内部解密接口 + 审计表落库 - -> **存放目录**: 二期 v3(`order-v3` 标签) → `changelogs-v2/2026-05/` -> -> **服务**: hl-order-v3 (端口 8086) -> **PR**: #2552 -> **Issue**: #2525 -> **日期**: 2026-05-18 -> **影响范围**: **仅后端服务 Feign 内部调用**(合同签署 / 保险出单等内部模块),**前端无关** - ---- - -## ⚠️ 关键变化 - -- 新增一个 **/internal/** 路径,**仅供后端服务 Feign 调用**,经 9443 网关访问直接 403(网关白名单只放通 admin/mp/internal-feign)。前端/小程序不需要也不应调用。 -- 出参含 `decryptedAt` 字段(后端解密时间戳),用于下游业务幂等与审计回溯。 -- **新增审计表** `order_decrypt_audit_log`(9 字段 + 2 索引),每次解密同事务落审计行,**调用前请确认下游业务 purpose 取值正确**(枚举严格校验)。 - ---- - -## 一、背景 - -V5.48 §2.7 定义"敏感信息解密接口"。出行人 idNo/phone 在 v3 出行人表里为密文存储,合同签署/保险出单等内部业务需要明文。 - -风险点:任何解密动作必须留痕(谁、什么时候、为什么、查了哪个订单),否则一旦出现数据滥用无法溯源。本接口的关键不在"返明文",而在 **"返明文 + 强制同事务写审计"**。 - ---- - -## 二、变更接口清单 - -| # | 接口 | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|------|----------|------| -| 1 | 内部查询订单出行人明文(带解密审计) | GET | `/v3/internal/order/orders/{orderId}/travelers` | 新增 | Feign 内部调用,网关 9443 直接 403 | - ---- - -## 三、接口详情 - -### 1. 内部查询订单出行人明文 `GET /v3/internal/order/orders/{orderId}/travelers` - -**VO**: `InternalOrderTravelerRespVO` - -#### 入参 - -| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | -|------|------|------|------|------|------| -| orderId | Path | Long | 是 | 雪花 ID | 订单 ID | -| purpose | Query | String | 是 | 枚举:`CONTRACT_SIGN` / `INSURANCE_ISSUE` / `OTHER` | 解密用途,不在枚举内抛 589101 | - -#### 出参 `Result>` - -| 字段 | 类型 | 说明 | -|------|------|------| -| travelerId | Long | 出行人 ID | -| orderId | Long | 订单 ID | -| name | String | 姓名(明文) | -| idType | String | 证件类型 | -| idNo | String | 证件号(**明文**,已解密) | -| phone | String | 手机号(**明文**,已解密) | -| gender | String | 性别 | -| birthday | String | 生日 yyyy-MM-dd | -| race | String | 民族 | -| nationality | String | 国籍 | -| decryptedAt | String | 解密时间戳(yyyy-MM-dd HH:mm:ss),后端服务端时间 | - -#### 响应示例 - -```json -{ - "code": 200, - "message": "成功", - "data": [ - { - "travelerId": 9023400111, - "orderId": 9020000333, - "name": "张三", - "idType": "ID_CARD", - "idNo": "110101199001011234", - "phone": "13800138000", - "gender": "MALE", - "birthday": "1990-01-01", - "race": "汉", - "nationality": "CN", - "decryptedAt": "2026-05-18 14:23:11" - } - ], - "success": true -} -``` - -#### 错误响应 - -```json -{ - "code": 589100, - "message": "订单不存在或已删除,无法解密", - "success": false, - "data": null -} -``` - -```json -{ - "code": 589101, - "message": "解密用途 purpose 不在允许枚举(CONTRACT_SIGN/INSURANCE_ISSUE/OTHER)", - "success": false, - "data": null -} -``` - ---- - -## 四、契约约束 - -| 约束 | 说明 | -|------|------| -| 调用方式 | 仅 Feign 内部调用,网关 9443 直接 403(网关白名单不放通 `/v3/internal/`) | -| purpose 必填 | 不传或为空 → 589101 | -| purpose 取值 | 严格枚举:`CONTRACT_SIGN` / `INSURANCE_ISSUE` / `OTHER`,大小写敏感 | -| 订单不存在 | 589100,不区分软删/不存在 | -| 同事务 | 查 traveler → 写审计 → 返 VO,**审计写失败整体回滚不返明文** | - ---- - -## 五、数据库行为 - -### 新增审计表 `order_decrypt_audit_log` - -| 字段 | 类型 | 说明 | -|------|------|------| -| id | BIGINT | 主键雪花 | -| order_id | BIGINT | 被解密订单 | -| traveler_id | BIGINT | 被解密出行人 | -| purpose | VARCHAR(32) | 解密用途 | -| operator_type | VARCHAR(32) | 调用方类型(FEIGN_INTERNAL) | -| operator_id | VARCHAR(64) | 调用方服务名/标识 | -| field_name | VARCHAR(32) | 解密字段(idNo / phone) | -| decrypted_at | DATETIME | 解密时间 | -| create_time | DATETIME | 行写入时间 | - -**索引**:`idx_order_id` / `idx_decrypted_at` - -**Flyway**: `V20260518_002__create_order_decrypt_audit_log.sql` - -### 写入行为 - -- 每次调用,**每个出行人每个解密字段写 1 行**审计 -- 同事务写,接口返回 N 个出行人则审计行至少 2N(idNo + phone 各 1) -- 失败回滚:整体事务回滚,**已返明文绝不可能**(返回前已 commit) - ---- - -## 六、边界行为 - -- 网关 9443 调用 → 403(网关白名单拦截,**预期行为**) -- Feign 内部调用 (SSH 跳板内网 8086) → 200 -- 订单不存在 / 已删除 → 589100 -- purpose 非法 → 589101 -- 出行人列表为空 → 返 `[]`,**仍写空审计?否**:无 traveler 不写审计,只返空数组 -- 解密失败(密钥错乱等基础设施异常)→ 500,审计不落 - ---- - -## 七、不影响范围 - -- **仅影响**: 后端服务 Feign 内部调用链(合同签署 / 保险出单 / 财务对账等) -- **零影响**: - - 前端所有接口(管理端 + 小程序) - - 现有 `/v3/admin/order/{id}/traveler/*` 全部接口(明文 ↔ 密文转换逻辑不变) - - 出行人增/删/改接口 - - 订单创建/详情/列表 - - 历史数据(存量出行人无需迁移) - ---- - -## 八、测试环境已验证 - -SSH 跳板内网 8086 真测: - -``` -GET /v3/internal/order/orders/{orderId}/travelers?purpose=CONTRACT_SIGN -→ 200 + 1 出行人 + decryptedAt 字段非空 ✓ -→ audit log 写入 2 行(idNo + phone)✓ - -GET /v3/internal/order/orders/{orderId}/travelers?purpose=INSURANCE_ISSUE -→ 200 + 同上 ✓ -→ audit log 累计 4 行 ✓ - -GET /v3/internal/order/orders/{orderId}/travelers?purpose=OTHER -→ 200 ✓ -→ audit log 累计 6 行 ✓ - -GET /v3/internal/order/orders/9999999999/travelers?purpose=CONTRACT_SIGN -→ 589100 订单不存在 ✓ - -GET /v3/internal/order/orders/{orderId}/travelers?purpose=INVALID -→ 589101 purpose 非法 ✓ -``` - -**网关 9443 验证**: - -``` -GET https://web.test.1814.love:9443/v3/internal/order/orders/{orderId}/travelers?purpose=CONTRACT_SIGN -→ 403 ✓(网关白名单拦截,预期行为) -``` - -审计落库总计 5+1 = 6 行,与预期一致。 - ---- - -## 九、错误码段位说明 - -| 错误码 | 含义 | 文档期望 | 实际 | -|--------|------|----------|------| -| 589100 | INTERNAL_ORDER_NOT_FOUND_FOR_DECRYPT | 589100 | ✅ 一致 | -| 589101 | INTERNAL_DECRYPT_PURPOSE_INVALID | 589101 | ✅ 一致 | - ---- - -## 十、相关文档 - -- 关联 Issue: [wx/HL#2525](https://git.1814.love:8443/wx/HL/issues/2525) -- 关联 PR: [wx/HL#2552](https://git.1814.love:8443/wx/HL/pulls/2552) -- commit: `9cca41a5d` -- 设计文档: `docs/order-v3/V5.48 §2.7 敏感信息解密接口` diff --git a/changelogs-v2/2026-05/18_#2526_traveler-smart-parse.md b/changelogs-v2/2026-05/18_#2526_traveler-smart-parse.md deleted file mode 100644 index 52d82b1..0000000 --- a/changelogs-v2/2026-05/18_#2526_traveler-smart-parse.md +++ /dev/null @@ -1,240 +0,0 @@ -# order-v3 出行人模块: 新增智能批量解析接口 smart-parse - -> **存放目录**: 二期 v3(`order-v3` 标签) → `changelogs-v2/2026-05/` -> -> **服务**: hl-order-v3 (端口 8086) -> **PR**: #2554 -> **Issue**: #2526 -> **日期**: 2026-05-18 -> **影响范围**: 管理后台订单详情"批量导入出行人"功能 → **新增接口,前端必新对接** - ---- - -## ⚠️ 关键变化 - -- **新增接口** `POST /v3/admin/order/{id}/traveler/smart-parse`,前端需新对接,**不是改造现有接口**。 -- 支持 `dryRun=true` 预览解析结果不落库,`dryRun=false` 真正写入。 -- **P0 审计安全 5 红线全合规**:不挂 @OperationLog 避免明文落审计 / failures[].maskedSnippet 脱敏 / 限流 / Lock4j / status_log 仅写聚合统计不写明文。 - ---- - -## 一、背景 - -V5.48 §2.8 定义"智能批量解析"。客服收到客户微信发来的一大段文字(姓名+身份证+手机号混排),要求自动解析后批量录入出行人。 - -风险点 = **审计安全**:身份证/手机号是 P0 敏感字段,若任何中间环节(@OperationLog / 日志 / status_log)落了明文,即一次安全事故。本接口的关键设计就是 **正常落库走加密 TypeHandler,失败片段返脱敏**。 - ---- - -## 二、变更接口清单 - -| # | 接口 | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|------|----------|------| -| 1 | 智能批量解析出行人 | POST | `/v3/admin/order/{id}/traveler/smart-parse` | **新增** | 前端必新对接 | - ---- - -## 三、接口详情 - -### 1. 智能批量解析 `POST /v3/admin/order/{id}/traveler/smart-parse` - -**VO**: `TravelerSmartParseReqVO` / `TravelerSmartParseRespVO` - -#### 入参 - -| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | -|------|------|------|------|------|------| -| id | Path | Long | 是 | 雪花 ID | 订单 ID | -| rawText | Body | String | 是 | 非空,长度 ≤ 5000 | 客户原始文本(姓名+身份证+手机号混排) | -| dryRun | Body | Boolean | 否 | 默认 false | true=只预览不落库,false=真正写入 | - -#### 出参 `Result` - -| 字段 | 类型 | 说明 | -|------|------|------| -| successCount | Integer | 成功解析并落库的数量(dryRun=true 时为"预期会落库的数量") | -| failCount | Integer | 失败片段数量 | -| successList | List | 成功的出行人列表(返脱敏后的预览字段,**不返明文**) | -| failures | List | 失败片段列表 | -| failures[].maskedSnippet | String | 失败片段(idNo 前6后4、phone 前3后4 脱敏) | -| failures[].reason | String | 失败原因(中文) | - -#### 请求示例 - -```json -{ - "rawText": "张三 110101199001011234 13800138000\n李四 身份证: 320101198502028765 手机 13900139000", - "dryRun": false -} -``` - -#### 响应示例 - -```json -{ - "code": 200, - "message": "成功", - "data": { - "successCount": 2, - "failCount": 0, - "successList": [ - { "travelerId": 9023400777, "name": "张三", "idNo": "110101******1234", "phone": "138****8000" }, - { "travelerId": 9023400778, "name": "李四", "idNo": "320101******8765", "phone": "139****9000" } - ], - "failures": [] - }, - "success": true -} -``` - -#### 失败片段响应示例 - -```json -{ - "code": 200, - "data": { - "successCount": 1, - "failCount": 1, - "successList": [...], - "failures": [ - { - "maskedSnippet": "王五 1101******1234 1380***0000", - "reason": "身份证号校验位错误" - } - ] - }, - "success": true -} -``` - -#### 错误响应 - -```json -{ "code": 581131, "message": "原文本过长,最多 5000 字符", "success": false } -``` - -```json -{ "code": 581132, "message": "原文本为空或无法识别任何出行人", "success": false } -``` - -```json -{ "code": 581134, "message": "订单当前状态不允许批量导入出行人", "success": false } -``` - -```json -{ "code": 100501, "message": "请求过于频繁,请稍后再试", "success": false } -``` - ---- - -## 四、契约约束 - -| 约束 | 说明 | -|------|------| -| dryRun=true | 仅解析返回预览,不落 DB,不写 status_log,不锁订单 | -| dryRun=false | 同事务批量 insert 出行人 + 写 status_log + 加 @Lock4j 锁订单 | -| @Lock4j | `key=#id`,expire=30000ms,同订单串行 | -| @RateLimiter | `count=10, time=60`(每用户 60s 内最多 10 次) | -| 订单状态 | 仅"待出行/已支付"等状态允许,其它 → 581134 | -| 文本长度 | > 5000 字符 → 581131 | -| 无可解析片段 | 整段 0 个能识别 → 581132 | - ---- - -## 五、数据库行为 - -### dryRun=false 写入 - -- `order_traveler`: 批量 insert,idNo/phone 走 EncryptTypeHandler 加密落库 -- `order_status_log`: 写 1 行 `reason="批量导入出行人 N 人"`(**不含任何明文**) - -### dryRun=true - -- 无任何写操作 - -### 失败片段 - -- 不落 DB -- 仅出现在响应 `failures[]`,带脱敏 snippet - ---- - -## 六、P0 审计安全红线(本接口最核心设计) - -| # | 红线 | 实现 | -|---|------|------| -| 1 | **不挂 @OperationLog** | Controller 方法没有此注解,避免 idNo/phone 通过 requestParams 落 audit_log | -| 2 | **failures[].maskedSnippet 脱敏** | idNo 前 6 后 4(`110101******1234`),phone 前 3 后 4(`138****8000`) | -| 3 | **日志仅聚合统计** | `log.info("smart-parse orderId={} successCount={} failCount={}")`,**绝不打印 rawText / idNo / phone** | -| 4 | **限流** | @RateLimiter(count=10, time=60),防御暴力扫描 | -| 5 | **status_log 不写明文** | reason 只写 "批量导入出行人 N 人",不带任何字段值 | - ---- - -## 七、边界行为 - -- 未登录 → 401(网关) -- 订单不存在 → 404 -- 订单状态非法 → 581134 -- 限流触发 → 100501(框架统一限流码,非 581133) -- rawText 含全空白 → 581132 -- 部分成功部分失败 → 200,在 `successList` / `failures` 中体现 - ---- - -## 八、不影响范围 - -- **仅影响**: 管理后台订单详情页"批量导入出行人"入口 -- **零影响**: - - 现有 `/v3/admin/order/{id}/traveler/add`(单人新增) - - 现有 `/v3/admin/order/{id}/traveler/edit`(批量编辑) - - 现有 `/v3/admin/order/{id}/traveler/validate`(完整性校验,见 #2527) - - 现有 `/v3/internal/order/orders/{orderId}/travelers`(Feign 解密,见 #2525) - - 订单创建/详情/列表 - - 小程序所有接口 - ---- - -## 九、测试环境已验证 - -经 9443 网关真 admin token 测试: - -``` -POST /v3/admin/order/{id}/traveler/smart-parse rawText 超 5000 字符 -→ 581131 SMART_PARSE_RAW_TEXT_TOO_LONG ✓ - -POST /v3/admin/order/{id}/traveler/smart-parse 订单状态不允许 -→ 581134 SMART_PARSE_ORDER_STATUS_FORBID ✓ - -POST /v3/admin/order/{id}/traveler/smart-parse 连续 11 次调用 -→ 11 次返 100501 限流 ✓ - -POST /v3/admin/order/{id}/traveler/smart-parse 正常 dryRun=true -→ ⚠️ 测试服无 PENDING 订单,正常路径未在 9443 真测 -→ 代码层 UnitTest + IntegrationTest 已覆盖 -→ **前端联调阶段补做正常路径回归** -``` - ---- - -## 十、错误码段位说明(段位让位,与文档不一致) - -V5.48 §2.8 文档期望段位被 baseline 已占用,本 PR 实际段位如下,**调用方按本表为准**: - -| 错误码 | 含义 | 文档期望 | 实际 | 原因 | -|--------|------|----------|------|------| -| 581131 | SMART_PARSE_RAW_TEXT_TOO_LONG | 581120 | 581131 | 581120 已被 TRANSPORT_PLAN_NOT_FOUND 占用 | -| 581132 | SMART_PARSE_RAW_TEXT_EMPTY_OR_UNPARSABLE | 581121 | 581132 | 同段位让位 | -| 581133 | SMART_PARSE_RATE_LIMITED | 581122 | doc-only(实际抛 100501) | 框架统一限流码 | -| 581134 | SMART_PARSE_ORDER_STATUS_FORBID | 581123 | 581134 | 同段位让位 | - -后续文档侧 follow-up 修正文档段位与代码对齐(本 PR 不改文档)。 - ---- - -## 十一、相关文档 - -- 关联 Issue: [wx/HL#2526](https://git.1814.love:8443/wx/HL/issues/2526) -- 关联 PR: [wx/HL#2554](https://git.1814.love:8443/wx/HL/pulls/2554) -- commit: `f8a34607` -- 设计文档: `docs/order-v3/V5.48 §2.8 智能批量解析` diff --git a/changelogs-v2/2026-05/18_#2527_traveler-validate-align-v2.md b/changelogs-v2/2026-05/18_#2527_traveler-validate-align-v2.md deleted file mode 100644 index 19d38bd..0000000 --- a/changelogs-v2/2026-05/18_#2527_traveler-validate-align-v2.md +++ /dev/null @@ -1,212 +0,0 @@ -# order-v3 出行人模块: validate 接口字段判定对齐 v2(6 → 4 必填字段) - -> **存放目录**: 二期 v3(`order-v3` 标签) → `changelogs-v2/2026-05/` -> -> **服务**: hl-order-v3 (端口 8086) -> **PR**: #2553 -> **Issue**: #2527 -> **日期**: 2026-05-18 -> **影响范围**: 管理后台订单详情页"出行人完整性校验"提示文案 → **路径不变,字段判定变化** - ---- - -## ⚠️ 关键变化 - -- **路径不变**:`GET /v3/admin/order/{id}/traveler/validate` -- **字段判定变化**:必填字段从 **6 个 → 4 个**(name / idType / idNo / phone) -- `gender` / `birthday` / `race` / `nationality` **改为可选**,**不再进 incompleteList.missingFields** -- `incompleteList[].name` **改为脱敏**(首字符 + `*`) -- 前端调用方式不变,但**展示给客服的"缺哪些字段"提示会变少** - ---- - -## 一、背景 - -V5.48 §2.9 要求 v3 validate 与 v2 一期对齐。 - -v2 一期实战中,客服只关心 4 个字段(姓名/证件类型/证件号/手机号),其他字段(性别/生日/民族/国籍)由后端从身份证号自动解析或后续补录,**不算"出行人信息不完整"**。 - -v3 早期版本沿用了 V5.0 设计的 6 字段判定,导致客服侧总是看到"出行人信息不完整,缺生日"的红字提示,实则不影响出行,产生噪音。 - -本次对齐 v2,**4 字段全有就算完整**。 - ---- - -## 二、变更接口清单 - -| # | 接口 | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|------|----------|------| -| 1 | 出行人完整性校验 | GET | `/v3/admin/order/{id}/traveler/validate` | **字段判定变化**(路径不变) | 6 → 4 必填字段;name 脱敏 | - ---- - -## 三、接口详情 - -### 1. 出行人完整性校验 `GET /v3/admin/order/{id}/traveler/validate` - -**VO**: `TravelerValidateRespVO` - -#### 入参 - -| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | -|------|------|------|------|------|------| -| id | Path | Long | 是 | 雪花 ID | 订单 ID | - -#### 出参 `Result` - -| 字段 | 类型 | 说明 | -|------|------|------| -| expectedCount | Integer | 订单应有出行人数(来自订单 traveler_count) | -| actualCount | Integer | 实际已录入出行人数 | -| countMismatch | Boolean | 数量是否不一致 | -| incompleteList | List | 信息不完整的出行人列表 | -| incompleteList[].travelerId | Long | 出行人 ID | -| incompleteList[].name | String | **脱敏后姓名**(首字符 + `*`,如"张*"、"李*") | -| incompleteList[].missingFields | List | 缺失字段名,**仅可能为 `name`/`idType`/`idNo`/`phone` 4 个值之一** | - -#### 响应示例(完整) - -```json -{ - "code": 200, - "message": "成功", - "data": { - "expectedCount": 3, - "actualCount": 3, - "countMismatch": false, - "incompleteList": [] - }, - "success": true -} -``` - -#### 响应示例(数量不一致 + 信息不完整) - -```json -{ - "code": 200, - "data": { - "expectedCount": 3, - "actualCount": 2, - "countMismatch": true, - "incompleteList": [ - { - "travelerId": 9023400111, - "name": "张*", - "missingFields": ["phone"] - }, - { - "travelerId": 9023400112, - "name": "李*", - "missingFields": ["idNo", "phone"] - } - ] - }, - "success": true -} -``` - -#### 错误响应 - -```json -{ "code": 581102, "message": "订单不存在或已删除", "success": false } -``` - ---- - -## 四、字段判定规则(本次重点) - -| 字段 | v3 旧版判定 | v3 新版判定(本次) | v2 | -|------|-------------|---------------------|-----| -| name | 必填 | **必填** | 必填 | -| idType | 必填 | **必填** | 必填 | -| idNo | 必填 | **必填** | 必填 | -| phone | 必填 | **必填** | 必填 | -| gender | 必填 | **可选**(不进 missingFields) | 可选 | -| birthday | 必填 | **可选**(不进 missingFields) | 可选 | -| race | 必填 | **可选** | 可选 | -| nationality | 必填 | **可选** | 可选 | - -判定逻辑:**4 个必填字段任一为 null 或空字符串 → 该出行人进 incompleteList**,missingFields 只列出缺失的 4 字段之一。 - ---- - -## 五、契约约束 - -| 约束 | 说明 | -|------|------| -| 路径 | **不变**,前端无需改 URL | -| 入参 | **不变**,只有 path 上 orderId | -| 出参字段名 | **不变**,但 `missingFields` 内可能值从 8 → 4 | -| name 脱敏 | 出参 `incompleteList[].name` **改为脱敏**,前端无需自己再脱敏 | - ---- - -## 六、数据库行为 - -- **无写操作**(纯查询接口) -- 查询逻辑:order_traveler WHERE order_id = ? AND deleted_at IS NULL,在 Service 层逐字段判空 - ---- - -## 七、边界行为 - -- 订单不存在 / 已删除 → 581102 -- 订单存在但 traveler_count = 0 → expectedCount=0, actualCount=0, countMismatch=false, incompleteList=[] -- 订单存在但无出行人录入 → expectedCount=N, actualCount=0, countMismatch=true -- 所有出行人 4 字段齐全 → incompleteList=[] -- 出行人 name 字段本身为空 → name 字段返 `*`(单字符脱敏) - ---- - -## 八、不影响范围 - -- **仅影响**: 管理后台订单详情页"出行人完整性"提示文案的显示 -- **零影响**: - - 出行人增/删/改接口(`add` / `edit` / `delete`) - - smart-parse 智能批量解析(见 #2526) - - Feign 内部解密(见 #2525) - - 小程序所有接口 - - 订单状态机(本接口不参与状态流转) - - 数据库表结构 - ---- - -## 九、测试环境已验证 - -经 9443 网关真 admin token 测试: - -``` -GET /v3/admin/order/{id}/traveler/validate 正常订单 -→ 200 + expectedCount=2 + actualCount=2 + incompleteList=[] ✓ - -GET /v3/admin/order/{id}/traveler/validate 数量不一致 -→ 200 + countMismatch=true ✓ - -GET /v3/admin/order/{id}/traveler/validate 缺 phone 字段 -→ 200 + incompleteList[0].missingFields=["phone"] ✓ -→ name 脱敏 "张*" ✓ - -GET /v3/admin/order/{id}/traveler/validate 仅缺 gender/birthday(旧版应报缺,新版应通过) -→ 200 + incompleteList=[] ✓(新版 4 字段判定不算缺) - -GET /v3/admin/order/9999999999/traveler/validate -→ 581102 订单不存在 ✓ -``` - ---- - -## 十、错误码段位说明 - -| 错误码 | 含义 | 文档期望 | 实际 | 原因 | -|--------|------|----------|------|------| -| 581102 | TRAVELER_VALIDATE_ORDER_NOT_FOUND | 581124 | **581102 复用** | 581124 已被 TRANSPORT_PLAN_INVALID_MODE 占用,文档侧 follow-up 修文档 | - ---- - -## 十一、相关文档 - -- 关联 Issue: [wx/HL#2527](https://git.1814.love:8443/wx/HL/issues/2527) -- 关联 PR: [wx/HL#2553](https://git.1814.love:8443/wx/HL/pulls/2553) -- commit: `d9bc8371` -- 设计文档: `docs/order-v3/V5.48 §2.9 validate 接口对齐 v2` diff --git a/changelogs-v2/2026-05/18_2355_admin-order-v3-create-sharer-customizer.md b/changelogs-v2/2026-05/18_2355_admin-order-v3-create-sharer-customizer.md deleted file mode 100644 index 06ed44b..0000000 --- a/changelogs-v2/2026-05/18_2355_admin-order-v3-create-sharer-customizer.md +++ /dev/null @@ -1,196 +0,0 @@ -# ⚠️✨ 管理端代下单接口 v3 新增分享追踪字段 + consultantSource 枚举新增 SHARED - -> **服务**: hl-order-service-v3 -> **接口**: `POST /admin/v3/orders` -> **PR**: #2565 refactor(order-v3): [Agency PR-4 / PR-1] 订单创建补 5 项基础逻辑 -> **日期**: 2026-05-18 23:55 -> **影响页面**: 管理后台「代下单」流程 + 小程序下单(通过 hl-mp-service 透传同接口) - ---- - -## 变了什么(前端视角) - -### 1. 请求体新增 2 个非必填字段 - -`POST /admin/v3/orders` 的请求 body 新增以下字段,**不传或传 null 行为与改造前完全一致**: - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| `sharerOpenid` | String | 否 | 分享人微信 openid,用于 C 端裂变追踪 / 佣金归属。落表 `order_info.sharer_openid`,admin 代下单时通常不传 | -| `customizerId` | Long | 否 | C 端分享归因:从分享链接中带入的定制师 adminId。校验通过则锁定为该定制师(`consultantSource = SHARED`),校验失败兜底系统默认定制师 | - -**注意**:`customizerId` 类型必须是 **number(Long)**,不能传 string。 - -### 2. 响应体枚举 consultantSource 新增值 SHARED - -`OrderCreateRespVO` 中 `consultantSource` 字段的枚举值新增 `SHARED`: - -| 枚举值 | 含义 | 何时出现 | -|--------|------|---------| -| `DEFAULT_ASSIGNED` | 系统默认定制师 | C 端下单,customizerId 为空或校验不通过,且有系统默认定制师 | -| `LINK_BOUND` | 链接绑定定制师 | 历史逻辑(v2 遗留) | -| `MANUAL` | admin 手动指定 | admin 代下单时由 JWT adminId 指定 | -| `SHARED`(**新增**) | C 端分享锁定定制师 | C 端下单,customizerId 校验通过 | - -### 3. 新增可能抛出的错误码 - -| code | message | 触发场景 | -|------|---------|---------| -| `581035` | 订金金额不得超过订单总额 | DEPOSIT 模式下订金金额 > 订单总额时触发 | - -### 4. 行为收紧(字段名不变,错误码变化) - -| 场景 | 旧行为 | 新行为 | -|------|--------|--------| -| Agency 无默认 mchId | 抛 `MCH_RESOLVE_FAILED` | 抛 `AGENCY_NO_DEFAULT_MCHID` | -| customerName / customerRemark 含 HTML 标签 | 原样入库 | XSS 过滤后入库(前端无感,被清掉的标签不会报错) | - ---- - -## 前端要改的地方 - -### 管理后台 B 端 - -1. **consultantSource 展示标签**:若订单详情 / 列表有按 `consultantSource` 显示来源文案的地方,需补 `SHARED` 的 case,建议展示文案为**"分享锁定"**: - - ```js - // 建议 - const consultantSourceLabel = { - DEFAULT_ASSIGNED: '系统分配', - LINK_BOUND: '链接绑定', - MANUAL: '手动指定', - SHARED: '分享锁定', // 新增 - } - ``` - -2. **错误码监控 / 提示**:若代下单流程中有按错误码展示错误提示,建议给 `581035` 加 case,文案直接透传后端 message:`"订金金额不得超过订单总额"`。 - - 若之前有对 `MCH_RESOLVE_FAILED` 的特殊提示逻辑,需同步改为 `AGENCY_NO_DEFAULT_MCHID`。 - -### 小程序 C 端(通过 hl-mp-service 透传) - -3. **分享链接带 customizerId 下单**:从分享 URL 取出 `adminId`,下单时透传为 `customizerId`(参考 `07_feat_share_lock_customizer.md` 详细步骤): - - ```js - const customizerId = uni.getStorageSync('share_customizer_id') || null - // 放入 POST /mp/order/create 或 POST /admin/v3/orders 的请求体 - ``` - -4. **分享追踪 sharerOpenid**:若小程序有分享溯源需求(如显示"由 XXX 分享"),可在下单时透传 `sharerOpenid`;不传也不影响下单流程。 - ---- - -## 接口详细定义 - -### POST /admin/v3/orders — 管理端 / C 端创建订单 - -- **使用场景**:管理后台代客户下单,或 C 端小程序通过 hl-mp-service 创建订单 -- **方法**: `POST` -- **路径**: `/admin/v3/orders`(通过 gateway 路由到 hl-order-service-v3) - -#### 请求参数(Body JSON) - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| `productId` | Long | 是 | 产品 ID | -| `productType` | String | 是 | 产品类型(CORE / ACTIVITY 等) | -| `startDate` | String | 是 | 出发日期,格式 `yyyy-MM-dd` | -| `adultCount` | Integer | 是 | 成人人数,≥ 1 | -| `childCount` | Integer | 否 | 儿童人数,默认 0 | -| `customerName` | String | 是 | 客户姓名(会走 XSS 过滤,HTML 标签会被清除) | -| `customerPhone` | String | 是 | 客户手机号 | -| `customerRemark` | String | 否 | 客户备注(会走 XSS 过滤) | -| `sharerOpenid` | String | 否 | **[新增]** 分享人微信 openid,C 端裂变追踪用 | -| `customizerId` | Long | 否 | **[新增]** 分享人定制师 adminId,校验通过则锁定为本单定制师 | - -#### 请求示例(含新增字段) - -```json -{ - "productId": 10001, - "productType": "CORE", - "startDate": "2026-06-01", - "adultCount": 2, - "childCount": 0, - "customerName": "张三", - "customerPhone": "13800138000", - "customerRemark": "需要靠窗座位", - "sharerOpenid": "oXXXXXXXXXXX", - "customizerId": 50001 -} -``` - -#### 响应结构 - -```json -{ - "code": 200, - "msg": "success", - "data": { - "orderId": "202605181234567890", - "orderNo": "HL202605181234", - "totalAmount": 9800, - "depositAmount": 2000, - "consultantId": 50001, - "consultantName": "李定制师", - "consultantSource": "SHARED" - } -} -``` - -#### 响应字段说明 - -| 字段 | 类型 | 说明 | -|------|------|------| -| `orderId` | String | 雪花 ID,前端按字符串处理(Long 精度问题) | -| `orderNo` | String | 可读订单号 | -| `totalAmount` | Integer | 订单总额(分) | -| `depositAmount` | Integer | 订金金额(分),DEPOSIT 模式下有值 | -| `consultantId` | Long | 绑定的定制师 adminId | -| `consultantName` | String | 定制师姓名 | -| `consultantSource` | String | 定制师来源枚举,见下表 | - -#### consultantSource 枚举值完整列表 - -| 值 | 中文展示建议 | 触发场景 | -|----|------------|---------| -| `DEFAULT_ASSIGNED` | 系统分配 | C 端下单,customizerId 无效或未传,有系统默认定制师 | -| `LINK_BOUND` | 链接绑定 | 历史逻辑(v2 遗留,v3 基本不再出现) | -| `MANUAL` | 手动指定 | admin 代下单,由登录态 JWT adminId 指定 | -| `SHARED` | 分享锁定 | C 端下单,`customizerId` 校验通过(定制师有效且角色正确) | - ---- - -## 错误码完整列表(本接口可能返回) - -| code | message | 处理建议 | -|------|---------|---------| -| `200` | success | 正常 | -| `400` | 参数校验失败 | 检查必填字段 | -| `581035` | 订金金额不得超过订单总额 | **[新增]** 直接 toast 后端 message | -| `AGENCY_NO_DEFAULT_MCHID` | Agency 未配置默认收款账号 | 联系运营配置 agency 默认 mchId | - ---- - -## 兼容性 - -- 请求字段仅新增非必填字段,**向后兼容**(旧版前端不传新字段行为不变) -- 响应枚举仅新增值不删值,**向后兼容** -- 无 DDL 变更,无需数据迁移 -- 只需重启 `hl-order-service-v3`,`hl-mp-service` 无需重启 - ---- - -## customizerId 校验兜底语义(前端无需实现) - -后端 `CustomizerValidator` 校验失败时**全部静默兜底为系统默认定制师,不报错**: - -| 失败原因 | 触发条件 | 前端表现 | -|---------|---------|---------| -| `ADMIN_NOT_FOUND` | adminId 不存在 / 已删除 | 兜底随机,静默 | -| `INACTIVE_STATUS` | admin status ≠ ACTIVE | 兜底随机,静默 | -| `WRONG_ROLE` | admin roleKey ≠ CUSTOMIZER | 兜底随机,静默 | -| `FEIGN_ERROR` | user-service Feign 调用失败 | 兜底随机,静默 | -| `INVALID_INPUT` | customizerId == null / ≤ 0 | 兜底随机,静默 | - -前端不需要对这些失败场景做任何处理。 diff --git a/changelogs-v2/2026-05/18_2517_traveler-list-path.md b/changelogs-v2/2026-05/18_2517_traveler-list-path.md deleted file mode 100644 index 23b6c09..0000000 --- a/changelogs-v2/2026-05/18_2517_traveler-list-path.md +++ /dev/null @@ -1,188 +0,0 @@ -# 出行人列表: 路径迁移 /travelers → /traveler/list - -> **服务**: hl-order-service-v3 (端口 8084 / 二期) -> **PR**: #2531 -> **Issue**: #2517 -> **日期**: 2026-05-18 -> **影响范围**: 管理后台订单详情概览 Tab 出行人区块 / F27 出行人补全列表读取 -> **存放目录**: `changelogs-v2/2026-05/`(二期 v3 专属,带 -v2 后缀) -> **部署 commit**: dev-v3 `68fd00f85` -> **测试服已验证**: ✅(/@qa 通过 9443 网关 + 真 admin token round-trip) - ---- - -## ⚠️ 关键变化(破坏性路径迁移) - -接口路径从 v3 早期临时路径 `/travelers` 改为文档 V5.48 §2.1 正式路径 `/traveler/list`: - -| 维度 | before(老路径,即将下线) | after(本 PR 起生效) | -|---|---|---| -| 方法 | GET | GET | -| 路径 | `/v3/admin/order/{id}/travelers` | `/v3/admin/order/{id}/traveler/list` | - -**对前端的影响**: 调用方需把请求 URL 从 `/travelers` 替换为 `/traveler/list`。 -**响应结构无变化**(仍是 `Result>` + 16 字段),前端字段映射不需要改。 - ---- - -## 一、背景 - -V5.48 文档 §2.1 已把出行人列表正式路径定为 `/traveler/list`(与 add / batch-edit / delete 等 §2.2~§2.4 接口的路径风格统一: 一级名词 `traveler` + 二级动词)。早期实现用了简短复数形式 `/travelers`,本 PR 完成对齐。 - -同时清理了 TravelerConverter 内残留的 Mock 占位注释,补齐 `transportPlanIds` 字段的真实化(从桥接表 `order_transport_plan_traveler` LEFT JOIN 取真值,而非占位空数组)。 - ---- - -## 二、变更接口清单 - -| # | 接口 | 方法 | 老路径 | 新路径 | 变更类型 | -|---|------|------|--------|--------|----------| -| 1 | 订单出行人列表 | GET | `/v3/admin/order/{id}/travelers` | `/v3/admin/order/{id}/traveler/list` | 破坏性路径迁移 | - ---- - -## 三、接口详情 - -### 1. 订单出行人列表 `GET /v3/admin/order/{id}/traveler/list` - -**VO**: `TravelerVO`(16 字段,无 *Label 衍生字段) - -#### 入参 - -| 字段 | 位置 | 类型 | 必填 | 说明 | -|------|------|------|------|------| -| `id` | Path | Long | ✅ | 订单 ID(雪花 ID 字符串安全形式) | - -#### 出参 `Result>` - -| 字段 | 类型 | 说明 | -|------|------|------| -| `id` | Long | 出行人 ID | -| `orderId` | Long | 订单 ID | -| `travelerType` | String | ADULT / CHILD / YOUNG_CHILD / BABY | -| `name` | String? | 姓名(占位行为 null) | -| `gender` | String? | MALE / FEMALE / UNKNOWN | -| `birthday` | LocalDate? | 出生日期 | -| `idType` | String? | ID_CARD / PASSPORT / BIRTH_CERT | -| `idNo` | String? | 证件号(admin 明文,DB 加密) | -| `nationality` | String | 国籍(默认"中国") | -| `race` | String | 民族(默认"汉族") | -| `phone` | String? | 出行人手机(admin 明文) | -| `emergencyContact` | String? | 紧急联系人姓名 | -| `emergencyPhone` | String? | 紧急联系人电话(admin 明文) | -| `roomGroupNo` | Integer? | 同住分组号 | -| `profileStatus` | String | PENDING / COMPLETED | -| `transportPlanIds` | List\ | 关联大交通批次 ID 列表(来自桥接表) | - -#### 请求示例 - -``` -GET /v3/admin/order/60123456789012/traveler/list -Authorization: Bearer {admin_jwt} -``` - -#### 响应示例 - -```json -{ - "code": 200, - "data": [ - { - "id": 70123456789012, - "orderId": 60123456789012, - "travelerType": "ADULT", - "name": "张三", - "gender": "MALE", - "birthday": "1985-08-12", - "idType": "ID_CARD", - "idNo": "220103198508121234", - "nationality": "中国", - "race": "汉族", - "phone": "13800002046", - "emergencyContact": "李四", - "emergencyPhone": "13900008888", - "roomGroupNo": 1, - "profileStatus": "COMPLETED", - "transportPlanIds": [80012345, 80012346] - } - ], - "msg": "success" -} -``` - -#### 空数据响应 - -```json -{ "code": 200, "data": [], "msg": "success" } -``` - -#### 错误响应 - -| 错误码 | 含义 | -|---|---| -| `581100` | 出行人主段位—— 订单 / 出行人不存在(本接口下订单不存在时返回空集合即 200 + `data:[]`,不报错;此码主要给 batch-edit / add / delete 用) | - ---- - -## 四、契约约束 - -- 仅 admin JWT 可访问,网关层鉴权(无 token → 网关 401);跨公司读取由订单详情上下文接口在更上层校验,本接口本身只看订单 ID。 -- 敏感字段(idNo / phone / emergencyPhone)**明文返回**,前端勿做二次脱敏渲染(B 端定制师业务诉求,后端已通过 EncryptTypeHandler 在 DB 层加密,VO 层明文)。 - ---- - -## 五、数据库行为 - -只读接口,**不产生任何 DB 写入**。 - -读关联表: `order_traveler` + LEFT JOIN `order_transport_plan_traveler`(取 `transportPlanIds` 真值)。 - ---- - -## 六、边界行为 - -- 未登录 → 401(网关拦截) -- 订单不存在 / 该订单下无出行人 → 200 + `data: []`(不 404,不抛异常) -- 出行人有未关联任何大交通的 → `transportPlanIds: []` -- 占位出行人(`name=null` `idNo=null`) → 字段为 null,不异常 - ---- - -## 七、不影响范围 - -- **仅影响**: 管理后台调用 `/v3/admin/order/{id}/travelers` 的请求 URL 拼接 -- **零影响**: - - 响应结构 / 字段名 / 字段类型 / 字段值(VO 完全不变) - - mp 端出行人列表接口(走 `/v3/mp/...`,独立路径,未涉及) - - 订单详情主聚合接口 `/v3/admin/order/{id}` 内 `overview.travelers` 嵌套数组(已复用同 VO,本次未改) - - Feign 跨服务 internal 接口 `/internal/order/orders/{orderId}/travelers`(internal 路径独立,未涉及) - ---- - -## 八、测试环境已验证 - -``` -GET https://web.test.1814.love:9443/v3/admin/order/60123456789012/traveler/list - Authorization: Bearer {admin_jwt} - → 200 + List 16 字段齐全 ✓ - → transportPlanIds 真值(非占位空数组)✓ - → 老路径 /travelers 已无返回(404)✓ -``` - ---- - -## 九、相关历史 PR - -| PR | Issue | 说明 | 是否仍有效 | -|----|-------|------|------------| -| #2124 | #2123 | /traveler/list 入参精简 + 敏感字段改明文(早期路径用 /travelers) | 部分有效(敏感字段口径保留,路径被本 PR 覆盖) | -| #2125 | - | detail.overview.travelers 复用 TravelerVO 完整字段 | ✅ 有效 | -| **本 PR #2531** | **#2517** | 路径正式迁 /traveler/list + transportPlanIds 真实化 | ✅ 最新 | - ---- - -## 十、相关文档 - -- API SPEC: `D:/work2/HL-v3/docs/order-v3/api/API-SPEC-V5.48.html` §2.1 -- 关联 Issue: [wx/HL#2517](https://git.1814.love:8443/wx/HL/issues/2517) -- 关联 PR: [wx/HL#2531](https://git.1814.love:8443/wx/HL/pulls/2531) diff --git a/changelogs-v2/2026-05/18_2518_traveler-batch-edit.md b/changelogs-v2/2026-05/18_2518_traveler-batch-edit.md deleted file mode 100644 index 22f9f5a..0000000 --- a/changelogs-v2/2026-05/18_2518_traveler-batch-edit.md +++ /dev/null @@ -1,233 +0,0 @@ -# 出行人批量编辑: POST /traveler/batch-edit 真实业务化 - -> **服务**: hl-order-service-v3 (端口 8084 / 二期) -> **PR**: #2535 -> **Issue**: #2518 -> **日期**: 2026-05-18 -> **影响范围**: 管理后台 F27 出行人补全(B 端定制师代填) -> **存放目录**: `changelogs-v2/2026-05/`(二期 v3 专属,带 -v2 后缀) -> **部署 commit**: dev-v3 `83dbeedb4` -> **测试服已验证**: ✅(/@qa 通过 9443 网关 + 真 admin token round-trip) - ---- - -## ⚠️ 关键变化 - -1. **请求体字段名**: 文档原稿 §2.2 写的是 `items`,**实际 VO 定义为 `travelers`**,前端按 `travelers` 提交(下文示例为准)。 -2. **从 Mock 占位变真实业务**: 之前是空骨架返回固定假数据,本 PR 接通真实 UPDATE + 12301 校验 + 合同冻结 + 同住分组校验 + 资料状态联动。 -3. **新增 9 个错误码段位**: 581101 / 581102 / 581103 / 581104 / 581105 / 581111 / 581112 / 581113 / 581114(段位安排见下)。 -4. **加幂等 @Idempotent(3s)**: 同订单 3 秒窗口内重复提交直接拒绝,防止快速点击 / 网络重试导致补全双写。 - ---- - -## 一、背景 - -文档 V5.48 §2.2 定义 admin 端批量编辑出行人,任一行 12301 字段(国籍 / 民族)校验失败整体回滚,补全完成后异步重算 `profile_status` 并触发"已完善"系统标签。本 PR 完成真实业务化,以及合同 signed 状态对证件号的冻结约束。 - ---- - -## 二、变更接口清单 - -| # | 接口 | 方法 | 路径 | 变更类型 | -|---|------|------|------|----------| -| 1 | 出行人批量编辑 | POST | `/v3/admin/order/{id}/traveler/batch-edit` | 真实业务化 + 9 个新错误码 | - ---- - -## 三、接口详情 - -### 1. 出行人批量编辑 `POST /v3/admin/order/{id}/traveler/batch-edit` - -**VO**: `TravelerBatchEditReqVO` + `TravelerEditItem`(嵌套数组每行) - -#### 入参 - -| 字段 | 位置 | 类型 | 必填 | 说明 | -|------|------|------|------|------| -| `id` | Path | Long | ✅ | 订单 ID | -| `travelers` | Body | List\ | ✅ | 待修改出行人数组(≤30) | - -**TravelerEditItem 每行字段**: - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| `id` | Long | ✅ | 出行人 ID(必须属于该 orderId) | -| `name` | String | ❌ | 姓名 | -| `gender` | String | ❌ | MALE / FEMALE / UNKNOWN | -| `birthday` | LocalDate | ❌ | 出生日期 | -| `idType` | String | ❌ | ID_CARD / PASSPORT / BIRTH_CERT | -| `idNo` | String | ❌ | 证件号(明文传,DB 加密) | -| `nationality` | String | ❌ | 国籍(默认中国,不可设为空字符串) | -| `race` | String | ❌ | 民族(默认汉族,不可设为空字符串) | -| `phone` | String | ❌ | 出行人手机(明文传,DB 加密) | -| `emergencyContact` | String | ❌ | 紧急联系人姓名 | -| `emergencyPhone` | String | ❌ | 紧急联系人电话(明文传) | -| `roomGroupNo` | Integer | ❌ | 同住分组号 | - -#### 出参 `Result` - -| 字段 | 类型 | 说明 | -|------|------|------| -| `updatedCount` | Integer | 实际更新行数 | -| `completedCount` | Integer | 本次操作后变为 COMPLETED 的行数 | -| `pendingCount` | Integer | 仍为 PENDING 的行数 | -| `allCompleted` | Boolean | 该订单所有出行人是否已完善(联动 5 项 checklist) | - -#### 请求示例 - -```json -POST /v3/admin/order/60123456789012/traveler/batch-edit -Authorization: Bearer {admin_jwt} - -{ - "travelers": [ - { - "id": 70123456789012, - "name": "张三", - "gender": "MALE", - "birthday": "1985-08-12", - "idType": "ID_CARD", - "idNo": "220103198508121234", - "nationality": "中国", - "race": "汉族", - "phone": "13800002046", - "roomGroupNo": 1 - }, - { - "id": 70123456789013, - "name": "张小宝", - "gender": "MALE", - "birthday": "2018-05-01", - "idType": "BIRTH_CERT", - "idNo": "J012345678", - "roomGroupNo": 1 - } - ] -} -``` - -#### 响应示例 - -```json -{ - "code": 200, - "data": { - "updatedCount": 2, - "completedCount": 2, - "pendingCount": 0, - "allCompleted": true - }, - "msg": "success" -} -``` - -#### 错误响应清单(本工单新增段位) - -| 错误码 | 含义 | -|---|---| -| `581100` | 出行人不存在 | -| `581101` | 12301 必报字段缺失(国籍 / 民族不能为空字符串) | -| `581102` | 订单不存在,无法编辑出行人 | -| `581103` | 性别枚举不合法(应为 MALE / FEMALE / UNKNOWN) | -| `581104` | 同住分组号超出订单家庭数上限 | -| `581105` | 批量大小超限(>30,@Size 已 fallback,Service 层防御性二次校验) | -| `581110` | 出行人 ID 不属于该订单 | -| `581111` | 已签电子合同后禁止修改证件号(合同 signed 后 idNo 冻结) | -| `581112` | 证件号格式不合法(身份证 18 位 / 护照 5-20 位) | -| `581113` | 手机号格式非法(应为 11 位数字) | -| `581114` | 出生日期不能晚于今天 | -| `581119` | 出行人证件号重复(同订单内 idNo 去重) | - -错误响应体示例: - -```json -{ - "code": 581111, - "msg": "已签电子合同后禁止修改证件号", - "data": null -} -``` - ---- - -## 四、契约约束 - -### 校验顺序(任一失败整事务回滚) - -1. 批量大小 ≤30(581105) -2. 订单存在(581102) -3. 身份证去重(581119,同请求体内自查重) -4. 姓名硬拦截(异常态字符,跟 TravelerNameValidator 共享口径) -5. 12301 字段非空字符串(581101) -6. 格式校验: idNo / phone / birthday(581112 / 581113 / 581114) + gender 枚举(581103) + roomGroupNo 范围(581104) -7. 归属校验: 每行 id 必须属于该 orderId(581110) -8. **已签电子合同冻结**: `contract_status = SIGNED` 时禁改证件号(581111) - -### 并发控制 - -- `@Idempotent(timeout=3s)`: 同订单 3 秒重复提交直接拒绝 -- `@Lock4j(expire=30000ms)`: 同订单批量更新加 30 秒分布式锁,防 admin / mp 同时提交竞态 - ---- - -## 五、数据库行为 - -- UPDATE N 行 `order_traveler`(只更非 null 字段,null 入参不覆盖原值) -- 派生 `profile_status`(若 idType/idNo/name/birthday/gender 齐全 → COMPLETED 否则 PENDING) -- INSERT 1 行 `order_status_log`,reason="出行人补全" -- 触发"已完善"系统标签事件(联动 confirm-checklist 的 TRAVELER_COMPLETE) - ---- - -## 六、边界行为 - -- 未登录 → 401(网关拦截) -- 入参 travelers 为 null / 空数组 → 400(@NotEmpty) -- 入参 travelers.size > 30 → 400(@Size,@Idempotent 之前拦截) -- 订单不存在 → 581102 -- 重复提交(3 秒内) → 接口直接拒绝(@Idempotent 拦截) -- 已签电子合同 → 581111(只冻结 idNo,其他字段仍可改) - ---- - -## 七、不影响范围 - -- **仅影响**: 管理后台 F27 出行人补全表单 -- **零影响**: - - 单个新增 `/traveler/add`(#2519 独立接口) - - 软删 `/traveler/{travelerId}/delete`(#2520 独立接口) - - 列表 `/traveler/list`(只读,#2517) - - mp 端出行人编辑接口 - - 大交通批次 / 桥接表(本接口不动 transport_plan) - ---- - -## 八、测试环境已验证 - -``` -POST https://web.test.1814.love:9443/v3/admin/order/60123456789012/traveler/batch-edit - Body: {"travelers":[{id, name, ...}]} - → 200 + updatedCount/completedCount/pendingCount/allCompleted ✓ -反例: - - 12301 字段为空 → 581101 ✓ - - 出行人不属于订单 → 581110 ✓ - - 合同 SIGNED 改 idNo → 581111 ✓ - - 重复提交(3 秒内) → 接口拒绝 ✓ -``` - ---- - -## 九、相关历史 PR - -| PR | Issue | 说明 | 是否仍有效 | -|----|-------|------|------------| -| #1984 | - | [§2 traveler skeleton] 9 接口空骨架 + Mock ServiceImpl | ❌ 被本 PR 真实化覆盖 | -| **本 PR #2535** | **#2518** | batch-edit 接通真实业务 + 9 错误码 + 幂等 / 锁 | ✅ 最新 | - ---- - -## 十、相关文档 - -- API SPEC: `D:/work2/HL-v3/docs/order-v3/api/API-SPEC-V5.48.html` §2.2 -- 关联 Issue: [wx/HL#2518](https://git.1814.love:8443/wx/HL/issues/2518) -- 关联 PR: [wx/HL#2535](https://git.1814.love:8443/wx/HL/pulls/2535) diff --git a/changelogs-v2/2026-05/18_2519_traveler-add.md b/changelogs-v2/2026-05/18_2519_traveler-add.md deleted file mode 100644 index 87e32cb..0000000 --- a/changelogs-v2/2026-05/18_2519_traveler-add.md +++ /dev/null @@ -1,218 +0,0 @@ -# 出行人新增: POST /traveler/add 路径迁移 + 真实业务化 - -> **服务**: hl-order-service-v3 (端口 8084 / 二期) -> **PR**: #2536 -> **Issue**: #2519 -> **日期**: 2026-05-18 -> **影响范围**: 管理后台 F27 改人数场景(临时加 1 个出行人) -> **存放目录**: `changelogs-v2/2026-05/`(二期 v3 专属,带 -v2 后缀) -> **部署 commit**: dev-v3 `16e861a7d` -> **测试服已验证**: ✅(/@qa 通过 9443 网关 + 真 admin token round-trip) - ---- - -## ⚠️ 关键变化 - -1. **破坏性路径迁移**: 老 `POST /v3/admin/order/{id}/travelers` → 新 `POST /v3/admin/order/{id}/traveler/add`(对齐 V5.48 §2.3 命名规范) -2. **从 Mock 占位变真实业务**: 三道校验 + INSERT + UPDATE order_main 人数 + INSERT order_status_log,而不是直接 insert 不校验。 -3. **新增 4 个错误码**: 581115 / 581116 / 581117 / 581118 -4. **加幂等 @Idempotent(3s) + 分布式锁 @Lock4j(30s)**: 防止与 batch-edit / 自身重复提交并发,导致 order_main 人数计数 race。 - ---- - -## 一、背景 - -文档 V5.48 §2.3 定义: 当订单实际出行人数 > 创单声明人数(典型场景: 客户带了未声明的孩子)时,定制师 B 端临时加人。后端必须同步 UPDATE `order_main.Count`,且**不允许已结算 / 已取消 / 退款中的订单加人**(避免影响财务封账与退款冲账)。 - ---- - -## 二、变更接口清单 - -| # | 接口 | 方法 | 老路径 | 新路径 | 变更类型 | -|---|------|------|--------|--------|----------| -| 1 | 单个出行人新增 | POST | `/v3/admin/order/{id}/travelers` | `/v3/admin/order/{id}/traveler/add` | 破坏性路径迁移 + 真实业务化 | - ---- - -## 三、接口详情 - -### 1. 单个出行人新增 `POST /v3/admin/order/{id}/traveler/add` - -**VO**: `TravelerCreateReqVO`(请求体) / `TravelerVO`(响应,16 字段) - -#### 入参 - -| 字段 | 位置 | 类型 | 必填 | 说明 | -|------|------|------|------|------| -| `id` | Path | Long | ✅ | 订单 ID | -| `travelerType` | Body | String | ✅ | ADULT / CHILD / YOUNG_CHILD / BABY | -| `name` | Body | String | ❌ | 姓名(可后填) | -| `gender` | Body | String | ❌ | MALE / FEMALE / UNKNOWN | -| `birthday` | Body | LocalDate | ❌ | 出生日期 | -| `idType` | Body | String | ❌ | ID_CARD / PASSPORT / BIRTH_CERT | -| `idNo` | Body | String | ❌ | 证件号(明文传,DB 加密) | -| `nationality` | Body | String | ❌ | 国籍(默认"中国") | -| `race` | Body | String | ❌ | 民族(默认"汉族") | -| `phone` | Body | String | ❌ | 出行人手机(明文传) | -| `emergencyContact` | Body | String | ❌ | 紧急联系人姓名 | -| `emergencyPhone` | Body | String | ❌ | 紧急联系人电话 | -| `roomGroupNo` | Body | Integer | ❌ | 同住分组号 | - -#### 出参 `Result` - -与 §2.1 列表接口完全相同的 16 字段 VO(含 `id` / `orderId` / `travelerType` / `name` / `gender` / `birthday` / `idType` / `idNo` / `nationality` / `race` / `phone` / `emergencyContact` / `emergencyPhone` / `roomGroupNo` / `profileStatus` / `transportPlanIds`)。 - -#### 请求示例 - -```json -POST /v3/admin/order/60123456789012/traveler/add -Authorization: Bearer {admin_jwt} - -{ - "travelerType": "CHILD", - "name": "王小明", - "gender": "MALE", - "birthday": "2018-06-20", - "idType": "BIRTH_CERT", - "idNo": "J012345678", - "nationality": "中国", - "race": "汉族", - "roomGroupNo": 1 -} -``` - -#### 响应示例 - -```json -{ - "code": 200, - "data": { - "id": 70123456789014, - "orderId": 60123456789012, - "travelerType": "CHILD", - "name": "王小明", - "gender": "MALE", - "birthday": "2018-06-20", - "idType": "BIRTH_CERT", - "idNo": "J012345678", - "nationality": "中国", - "race": "汉族", - "phone": null, - "emergencyContact": null, - "emergencyPhone": null, - "roomGroupNo": 1, - "profileStatus": "COMPLETED", - "transportPlanIds": [] - }, - "msg": "success" -} -``` - -#### 错误响应清单(本工单新增段位) - -| 错误码 | 含义 | -|---|---| -| `581100` | 出行人主段位—— 订单不存在 | -| `581102` | 订单不存在,无法编辑出行人 | -| `581115` | 实际人数已等于声明人数,请先调整订单人数再新增出行人 | -| `581116` | 当前订单状态禁止新增出行人(已结算 / 已取消 / 退款中) | -| `581117` | 出行人类型与现有同住分组冲突 | -| `581118` | 新增出行人缺少必填字段(travelerType 必填) | - -错误响应体示例: - -```json -{ - "code": 581116, - "msg": "当前订单状态禁止新增出行人(已结算 / 已取消 / 退款中)", - "data": null -} -``` - ---- - -## 四、契约约束 - -### 校验顺序(任一失败整事务回滚) - -1. **订单存在**(581102) -2. **订单状态白名单**: 拒绝 SETTLED / CANCELLED / REFUNDING(581116) -3. **实际 vs 声明人数**: `count(order_traveler 未软删) >= sum(adultCount + childCount + youngChildCount + babyCount)` 时拒绝(581115,要求先调订单人数) -4. **同住分组冲突**(581117,可选字段校验) -5. **必填**: travelerType(581118) - -### 并发控制 - -- `@Idempotent(timeout=3s)`: 同订单 3 秒重复提交直接拒绝 -- `@Lock4j(expire=30000ms,keys="order:traveler:add:" + #id)`: 同订单 30 秒锁,防与 batch-edit 并发导致 order_main 人数计数 race - ---- - -## 五、数据库行为 - -- INSERT 1 行 `order_traveler`(派生 `profile_status`) -- UPDATE `order_main.Count` +1(按 `travelerType` 选择: adultCount / childCount / youngChildCount / babyCount) -- INSERT 1 行 `order_status_log`,reason="新增出行人",flowStatus 不变(from == to) - -| travelerType | order_main 字段 | delta | -|---|---|---| -| ADULT | `adult_count` | +1 | -| CHILD | `child_count` | +1 | -| YOUNG_CHILD | `young_child_count` | +1 | -| BABY | `baby_count` | +1 | - ---- - -## 六、边界行为 - -- 未登录 → 401(网关拦截) -- 订单不存在 → 581102 -- 订单 status = SETTLED / CANCELLED / REFUNDING → 581116(优先于人数校验) -- 实际人数已等于声明 → 581115(典型场景: 客户原本说 2 大 1 小现已 2 大 1 小,要先把声明改成 2 大 2 小再加人) -- travelerType 未识别 → 防御性 return(不报错也不更新人数,实际由前置 @NotBlank 拦截) - ---- - -## 七、不影响范围 - -- **仅影响**: 管理后台 F27 改人数(新增)场景 -- **零影响**: - - 批量编辑 `/traveler/batch-edit`(#2518 独立接口) - - 软删 `/traveler/{travelerId}/delete`(#2520 独立接口) - - 列表 `/traveler/list`(只读) - - mp 端出行人接口 - - 老路径 `POST /travelers` 已下线,前端调用必须改用 `/traveler/add` - ---- - -## 八、测试环境已验证 - -``` -POST https://web.test.1814.love:9443/v3/admin/order/60123456789012/traveler/add - Body: {"travelerType":"CHILD","name":"王小明","birthday":"2018-06-20",...} - → 200 + TravelerVO(含 id / profileStatus / transportPlanIds) ✓ - → order_main.child_count +1 ✓ - → order_status_log 新增 1 行 reason=新增出行人 ✓ -反例: - - 订单 status=SETTLED → 581116 ✓ - - 实际人数 = 声明人数 → 581115 ✓ - - 老路径 POST /travelers → 404 ✓ -``` - ---- - -## 九、相关历史 PR - -| PR | Issue | 说明 | 是否仍有效 | -|----|-------|------|------------| -| #1984 | - | [§2 traveler skeleton] 空骨架 Mock | ❌ 被本 PR 真实化覆盖 | -| #2535 | #2518 | batch-edit 真实业务化(同期工单,共用 581100-581114 段位) | ✅ 有效 | -| **本 PR #2536** | **#2519** | add 接通真实业务 + 路径迁移 + 4 错误码(581115-581118) | ✅ 最新 | - ---- - -## 十、相关文档 - -- API SPEC: `D:/work2/HL-v3/docs/order-v3/api/API-SPEC-V5.48.html` §2.3 -- 关联 Issue: [wx/HL#2519](https://git.1814.love:8443/wx/HL/issues/2519) -- 关联 PR: [wx/HL#2536](https://git.1814.love:8443/wx/HL/pulls/2536) diff --git a/changelogs-v2/2026-05/18_2520_traveler-delete.md b/changelogs-v2/2026-05/18_2520_traveler-delete.md deleted file mode 100644 index 62af89f..0000000 --- a/changelogs-v2/2026-05/18_2520_traveler-delete.md +++ /dev/null @@ -1,188 +0,0 @@ -# 出行人软删: DELETE → POST /traveler/{travelerId}/delete 路径迁移 + 真实业务化 - -> **服务**: hl-order-service-v3 (端口 8084 / 二期) -> **PR**: #2537 -> **Issue**: #2520 -> **日期**: 2026-05-18 -> **影响范围**: 管理后台 F27 改人数场景(临时取消同行 1 人) -> **存放目录**: `changelogs-v2/2026-05/`(二期 v3 专属,带 -v2 后缀) -> **部署 commit**: dev-v3 `34c294465` -> **测试服已验证**: ✅(/@qa 通过 9443 网关 + 真 admin token round-trip) - ---- - -## ⚠️ 关键变化 - -1. **破坏性路径 + 方法迁移**: - - **方法**: DELETE → POST(对齐 v3 风格,所有写操作统一 POST) - - **路径**: `/travelers/{travelerId}` → `/traveler/{travelerId}/delete`(对齐 V5.48 §2.4) -2. **从 Mock 占位变真实业务**: 4 道校验 + 软删 + 桥接表级联软删 + count-1 + status_log。 -3. **新增 2 个错误码**: `581106`(已签合同禁删) / `581107`(最后 1 成人禁删)。 - - ⚠️ 注意码段: **不是 581140/581141**,大交通段位 581120+ 已被占用,出行人主段位空挡是 581106/581107 紧贴主块(文档原稿写的 581119/581120 已被 TRAVELER_ID_CARD_DUPLICATE / TRANSPORT_PLAN_NOT_FOUND 占用)。 -4. **加幂等 + 锁整事务**: `@Idempotent(3s) + @Lock4j(30s)`。 - ---- - -## 一、背景 - -文档 V5.48 §2.4 定义: 软删除单行 `order_traveler`,同步: -1. UPDATE `order_main.Count` -1 -2. UPDATE `order_transport_plan_traveler.deleted=1`(级联解除其在大交通桥接表的所有关联) -3. INSERT `order_status_log`,reason="删除出行人" - -并有 2 条业务硬约束: -- **已签电子合同(contract_status = SIGNED)的订单禁止删人**(合同已固定参与人,删除会破坏合同人员一致性) -- **订单最后 1 位成人禁止删除**(无成人订单逻辑上无效,会影响保险 / 大交通 / 房型分配) - ---- - -## 二、变更接口清单 - -| # | 接口 | 方法 | 老路径 | 新路径 | 变更类型 | -|---|------|------|--------|--------|----------| -| 1 | 出行人软删 | DELETE → **POST** | `/v3/admin/order/{id}/travelers/{travelerId}` | `/v3/admin/order/{id}/traveler/{travelerId}/delete` | 破坏性方法 + 路径迁移 + 真实业务化 | - ---- - -## 三、接口详情 - -### 1. 出行人软删 `POST /v3/admin/order/{id}/traveler/{travelerId}/delete` - -#### 入参 - -| 字段 | 位置 | 类型 | 必填 | 说明 | -|------|------|------|------|------| -| `id` | Path | Long | ✅ | 订单 ID | -| `travelerId` | Path | Long | ✅ | 出行人 ID | - -(请求体: 无) - -#### 出参 `Result` - -```json -{ - "code": 200, - "data": true, - "msg": "success" -} -``` - -#### 请求示例 - -``` -POST /v3/admin/order/60123456789012/traveler/70123456789013/delete -Authorization: Bearer {admin_jwt} -``` - -#### 错误响应清单(本工单新增段位) - -| 错误码 | 含义 | -|---|---| -| `581100` | 出行人不存在 | -| `581102` | 订单不存在,无法删除出行人 | -| `581106` | **已签电子合同,禁止删除出行人**(本 PR 新增) | -| `581107` | **出行人是订单最后 1 位成人,禁止删除**(本 PR 新增) | -| `581110` | 出行人 ID 不属于该订单 | - -> 段位说明: 文档原稿 §2.4 期望 `581119 / 581120`,但 581119 已被 TRAVELER_ID_CARD_DUPLICATE 占用,581120 已被 TRANSPORT_PLAN_NOT_FOUND 占用。本 PR 落到出行人主段位空挡 **581106 / 581107**,紧贴主块,保留 581140-581144 给 §2.6 大交通后续工单。 - -错误响应体示例: - -```json -{ - "code": 581106, - "msg": "已签电子合同,禁止删除出行人", - "data": null -} -``` - ---- - -## 四、契约约束 - -### 校验顺序(任一失败整事务回滚,4 道闸) - -1. **订单存在性**(581102): 查 `order_main` by `id` -2. **出行人归属**(581110): 出行人的 `order_id` 必须等于 path `id`(防越权 / 错传) -3. **合同冻结**(581106): 订单 `contract_status = SIGNED` → 拒绝 -4. **最后 1 成人**(581107): 当前操作是 ADULT 且订单未软删的 ADULT 行数 = 1 → 拒绝 - -### 并发控制 - -- `@Idempotent(timeout=3s)`: 同 `(orderId, travelerId)` 3 秒重复提交直接拒绝(防快速双击) -- `@Lock4j(expire=30000ms)`: 同订单 30 秒锁,与 batch-edit / add 互斥,防 count 字段 race - ---- - -## 五、数据库行为 - -整事务: - -| 操作 | 表 | 说明 | -|------|------|------| -| UPDATE | `order_traveler` | `deleted=1` `deleted_at=NOW()` | -| UPDATE | `order_transport_plan_traveler` | 该出行人所有未软删的桥接行 `deleted=1`(级联解除大交通关联) | -| UPDATE | `order_main.Count` | -1(按 `travelerType` 选择: adultCount / childCount / youngChildCount / babyCount) | -| INSERT | `order_status_log` | reason="删除出行人",flowStatus 不变(from == to) | - ---- - -## 六、边界行为 - -- 未登录 → 401(网关拦截) -- 订单不存在 → 581102 -- 出行人不属于订单(越权) → 581110 -- 合同 SIGNED → 581106(优先于人数校验) -- 删最后 1 成人 → 581107(允许删 CHILD / YOUNG_CHILD / BABY 即使他们也是最后 1 个) -- 出行人有大交通关联 → 自动级联软删桥接表,不阻断主流程 -- 出行人已被软删过(重复删) → 581100(查不到行) - ---- - -## 七、不影响范围 - -- **仅影响**: 管理后台 F27 改人数(删除)场景 -- **零影响**: - - 批量编辑 `/traveler/batch-edit`(#2518 独立接口) - - 新增 `/traveler/add`(#2519 独立接口) - - 列表 `/traveler/list`(只读) - - 大交通错误码段位 581120-581129(保留) - - 老路径 `DELETE /travelers/{travelerId}` 已下线,前端调用必须改用 `POST /traveler/{travelerId}/delete` - ---- - -## 八、测试环境已验证 - -``` -POST https://web.test.1814.love:9443/v3/admin/order/60123456789012/traveler/70123456789013/delete - Authorization: Bearer {admin_jwt} - → 200 + data: true ✓ - → order_traveler.deleted=1 ✓ - → order_transport_plan_traveler 级联 deleted=1 ✓ - → order_main.child_count -1 ✓ - → order_status_log 新增 1 行 reason=删除出行人 ✓ -反例: - - 合同 SIGNED 删人 → 581106 ✓ - - 删最后 1 成人 → 581107 ✓ - - travelerId 不属于该订单 → 581110 ✓ - - DELETE 老方法老路径 → 404 / 405 ✓ -``` - ---- - -## 九、相关历史 PR - -| PR | Issue | 说明 | 是否仍有效 | -|----|-------|------|------------| -| #1984 | - | [§2 traveler skeleton] 空骨架 Mock | ❌ 被本 PR 真实化覆盖 | -| #2535 | #2518 | batch-edit 真实化(同期工单,共用 581100-581114) | ✅ 有效 | -| #2536 | #2519 | add 真实化(同期工单,581115-581118) | ✅ 有效 | -| **本 PR #2537** | **#2520** | delete 接通真实业务 + 方法+路径迁移 + 2 错误码(581106/581107) | ✅ 最新 | - ---- - -## 十、相关文档 - -- API SPEC: `D:/work2/HL-v3/docs/order-v3/api/API-SPEC-V5.48.html` §2.4 -- 关联 Issue: [wx/HL#2520](https://git.1814.love:8443/wx/HL/issues/2520) -- 关联 PR: [wx/HL#2537](https://git.1814.love:8443/wx/HL/pulls/2537) diff --git a/changelogs-v2/2026-05/18_§1_订单核心模块-新增接口-管理后台.md b/changelogs-v2/2026-05/18_§1_订单核心模块-新增接口-管理后台.md deleted file mode 100644 index 813acde..0000000 --- a/changelogs-v2/2026-05/18_§1_订单核心模块-新增接口-管理后台.md +++ /dev/null @@ -1,1775 +0,0 @@ -# 【新增接口·管理后台】v3 订单核心模块 §1 core - -> **更新时间**: 2026-05-18 -> **端类型**: 管理后台 -> **设计文档版本**: v5.49(API-SPEC / SRS / DETAIL-DESIGN / DATABASE-SCHEMA 4 份 HTML 同步) - ---- - -## 0. 模块全貌 - -| 子模块 | 含接口 | 接口数 | 状态 | -|---|---|---|---| -| **§1A 订单 CRUD + 详情** | §1.1 创建 / §1.2 列表 / §1.3.1 详情主聚合 / §1.3.2~§1.3.7 6 Tab 子接口 / §1.4 修改 | **10** | ✅ | -| **§1B 取消订单** | §1.5.0 预览 / §1.5.1 出行前 / §1.5.2 出行中 | **3** | ✅ | -| **§1C 状态机 + 锁单** | §1.7 transition / §1.8 confirm-checklist | **2** | ✅ | -| **§1 合计** | — | **15** | ✅ 本次推送 | - ---- - -## 1. 接口背景 - -订单服务 v3(hl-order-service-v3 全新二期)的订单核心模块 §1 core 提供订单管理基础能力,覆盖定制师 B 端代下单 / 多维度筛选列表 / 订单详情(首屏主聚合 + 6 个 Tab 独立懒加载)/ 非关键字段修改。 - -本次推送 §1 模块**全 15 个接口**,对应管理后台原型 F8-F20(订单列表+创建+详情主体)、F22-F26(详情各 Tab 单刷新)、F37(修改订单字段)、F30-F32(取消订单弹框+出行前/出行中)、F33-F34(确认锁单 checklist + 状态机操作)。 - ---- - -## 2. 变更清单 - -| # | § | 接口名 | 方法 | 路径 | -|---|---|--------|------|------| -| 1 | 1.1 | 创建订单 | POST | `/v3/admin/order` | -| 2 | 1.2 | 订单列表 | GET | `/v3/admin/order` | -| 3 | 1.3.1 | 订单详情主聚合 | GET | `/v3/admin/order/{id}` | -| 4 | 1.3.2 | 财务 Tab | GET | `/v3/admin/order/{id}/finance` | -| 5 | 1.3.3 | 合同保险 Tab | GET | `/v3/admin/order/{id}/contract-insurance` | -| 6 | 1.3.4 | 行程安排 Tab ⚠️Mock | GET | `/v3/admin/order/{id}/itinerary` | -| 7 | 1.3.5 | 状态记录 Tab | GET | `/v3/admin/order/{id}/status-log` | -| 8 | 1.3.6 | 退款明细 Tab | GET | `/v3/admin/order/{id}/refund` | -| 9 | 1.3.7 | 服务标准 Tab | GET | `/v3/admin/order/{id}/service-standard` | -| 10 | 1.4 | 修改订单字段 | PUT | `/v3/admin/order/{id}` | -| 11 | 1.5.0 | 取消订单预览 | GET | `/v3/admin/order/{id}/cancel-preview` | -| 12 | 1.5.1 | 取消订单(出行前) | POST | `/v3/admin/order/{id}/cancel/pre-trip` | -| 13 | 1.5.2 | 取消订单(出行中) | POST | `/v3/admin/order/{id}/cancel/on-trip` | -| 14 | 1.7 | 状态变更操作(状态机) | POST | `/v3/admin/order/{id}/transition` | -| 15 | 1.8 | 确认锁单前置 Checklist | GET | `/v3/admin/order/{id}/confirm-checklist` | - ---- - -## 3. 接口详情 - -> 每个接口自包含:使用场景 / 入参 / 出参 / 错误码 / 业务边界 / 示例(请求 + 响应)。 -> 跨接口共享枚举集中在 §6;模块整体影响评估在 §11。 - ---- - -### 3.1 §1.1 创建订单 - -**路径**:`POST /v3/admin/order` -**使用场景**:定制师 B 端代下单(电话 / 微信 / 线下渠道)。客户自助下单走 mp 端不在本模块。 -**认证**:JWT(admin 角色) | **幂等性**:否 | **限流**:无 - -#### 入参(`OrderCreateReqVO`,13 字段) - -| 字段 | 类型 | 必填 | 说明 | 校验规则 | -|------|------|:----:|------|----------| -| `productId` | Long | ✅ | 产品 ID | `@NotNull` | -| `tierSeq` | Integer | ✅ | 档位序号 | `@NotNull` | -| `departureDate` | LocalDate | ✅ | 出发日期 | `@NotNull` | -| `adultCount` | Integer | ✅ | 成人数 | `@NotNull` `@Min(1)` | -| `childCount` | Integer | ❌ | 儿童数 | `@Min(0)`,默认 0 | -| `youngChildCount` | Integer | ❌ | 幼儿数 | `@Min(0)`,默认 0 | -| `babyCount` | Integer | ❌ | 婴儿数 | `@Min(0)`,默认 0 | -| `customerName` | String | ✅ | 客户姓名 | `@NotBlank` | -| `customerPhone` | String | ✅ | 客户手机(明文传,11 位数字) | `@NotBlank` | -| `customerRemark` | String | ❌ | 客户备注 | `@Size(max=500)` | -| `createSource` | String | ❌ | 创建来源(不传默认 `CONSULTANT`) | 枚举见 §6.1 | -| `groupBatchId` | Long | ❌ | 拼团批次 ID(自由出团传空) | — | -| `roomCount` | Integer | ❌ | 房间数 | `@Min(1)` | -| `tags` | List\ | ❌ | 订单标签名列表 | — | - -#### 出参(`Result`,20 字段) - -| 字段 | 类型 | 说明 | -|------|------|------| -| `id` | String | 订单主键 | -| `orderNo` | String | 订单号,格式 `HL{yyyyMMddHHmmss}{3 位序号}` | -| `displayOrderNo` | String | 展示订单号 = `orderNo + teamNo`;`teamNo` 为空时等同 `orderNo` | -| `orderStatus` | String | 创单后固定 `PENDING_PAY`(枚举见 §6.2) | -| `flowStatus` | String | 创单后固定 `AWAITING_PROFILE`(枚举见 §6.3) | -| `consultantId` | String | 实际绑定的定制师 ID | -| `consultantSource` | String | 定制师来源(枚举见 §6.4) | -| `tags` | List\ | 标签列表(含入参 tags + 系统自动标签) | -| `createdAt` | LocalDateTime | 创单时间 | -| `productName` | String | 产品名称 | -| `tierName` | String | 档位名 | -| `groupBatchName` | String? | 拼团批次名(自由出团时 null) | -| `departureDate` | LocalDate | 出发日 | -| `returnDate` | LocalDate | 返团日 | -| `totalAmount` | BigDecimal | 订单总价(元,2 位小数) | -| `depositAmount` | BigDecimal | 建议定金金额 | -| `depositRatio` | Integer | 定金比例百分比(`DEPOSIT` 模式有值;`FULL` 模式恒为 100) | -| `paymentMode` | String | 支付模式(枚举见 §6.5) | -| `expiryMinutes` | Integer | 支付时限分钟数,默认 1440 | -| `payUrl` | String | 支付页绝对 URL | -| `customerName` | String | 客户姓名(回显) | - -#### 错误码 - -| code | 含义 | -|------|------| -| `510101` | 产品不存在 / 已下架 | -| `510102` | 档位不存在 | -| `510103` | 出发日期早于今天 | -| `510104` | 出发日期超过报名截止 | -| `510105` | 拼团批次不存在 / 已满员 | -| `510106` | 总人数 = 0 | -| `510107` | `createSource` 枚举非法 | -| `510108` | 客户手机格式非法 | -| `510109` | 系统未配置默认定制师 | -| `581013` | 定制师 ID 缺失(admin 端 JWT adminId 缺失) | -| `581014` | 产品域 Feign 调用失败 | -| `581015` | 产品域返回产品不存在 | -| `581020` | MQ 事件发布失败(非主路径,记审计) | -| `581021` | 跨公司访问被拒(公司隔离) | - -#### 业务边界 - -- ✅ **适用**:产品上架;档位有效;出发日期 ≥ 今天;总人数 ≥ 1;客户手机合法 -- ❌ **拒绝**:产品下架 / 出发日期过期 / 总人数 0 / 拼团满员 / 客户手机非 11 位 -- ⚠️ **可选字段省略**:不传 `createSource` 用默认 `CONSULTANT` / 不传 `roomCount` 返 null / 不传 `tags` 仅含系统自动标签 - -#### 示例 - -**典型成功 - 请求**: - -```http -POST /v3/admin/order -Authorization: Bearer {admin_jwt} -Content-Type: application/json - -{ - "productId": 30001234567, - "tierSeq": 1, - "departureDate": "2026-06-01", - "adultCount": 2, - "childCount": 1, - "customerName": "张三", - "customerPhone": "13800002046", - "customerRemark": "希望住朝阳房", - "createSource": "CONSULTANT", - "groupBatchId": 80001234567890, - "roomCount": 2, - "tags": ["VIP 客户"] -} -``` - -**典型成功 - 响应**: - -```json -{ - "code": 200, - "data": { - "id": "60123456789012", - "orderNo": "HL20260518220000001", - "displayOrderNo": "HL20260518220000001", - "orderStatus": "PENDING_PAY", - "flowStatus": "AWAITING_PROFILE", - "consultantId": "50001234567890", - "consultantSource": "DEFAULT_ASSIGNED", - "tags": ["VIP 客户", "含儿童"], - "createdAt": "2026-05-18T22:00:00", - "productName": "长白山天池3日深度游", - "tierName": "经典档", - "groupBatchName": "第 2 期", - "departureDate": "2026-06-01", - "returnDate": "2026-06-03", - "totalAmount": 8580.00, - "depositAmount": 2574.00, - "depositRatio": 30, - "paymentMode": "DEPOSIT", - "expiryMinutes": 1440, - "payUrl": "https://pay.hulalv.com/pay/HL20260518220000001", - "customerName": "张三" - }, - "msg": "success" -} -``` - -**异常(拼团满员 510105) - 请求**:(同上,但 `groupBatchId` 指向已满批次) - -**异常 - 响应**: - -```json -{ "code": 510105, "data": null, "msg": "拼团批次不存在或已满员" } -``` - ---- - -### 3.2 §1.2 订单列表 - -**路径**:`GET /v3/admin/order` -**使用场景**:定制师 / 主管 / 客服多维度筛选订单 -**认证**:JWT(admin 角色) | **分页**:继承 PageParam - -#### 入参(`OrderListReqVO extends PageParam`) - -| 字段 | 类型 | 必填 | 说明 | -|------|------|:----:|------| -| `page` | Integer | ❌ | 页码,默认 1 | -| `pageSize` | Integer | ❌ | 每页条数,默认 10 | -| `orderStatus` | String | ❌ | 粗状态过滤(传英文枚举值,多值用逗号,见 §6.2) | -| `flowStatus` | String | ❌ | 细状态过滤(传英文枚举值,见 §6.3) | -| `tagNames` | List\ | ❌ | 按标签过滤(多标签为 AND) | -| `keyword` | String | ❌ | 关键字(LIKE 团号 / 客户姓名 / 产品名 / 订单号 任一) | -| `departureDateFrom` | LocalDate | ❌ | 出发日期范围起始 | -| `departureDateTo` | LocalDate | ❌ | 出发日期范围结束 | -| `createSource` | String | ❌ | 来源过滤(枚举见 §6.1) | -| `cancelled` | Boolean | ❌ | 是否含已取消(默认 false) | - -#### 出参(`Result>`) - -`PageResult` 字段:`list: List` / `total: Long` / `page` / `pageSize` - -`OrderListItemRespVO`(18 字段): - -| 字段 | 类型 | 说明 | -|------|------|------| -| `id` | String | 订单 ID | -| `orderNo` | String | 订单号 | -| `teamNo` | String? | 团号(订金支付成功时生成,创单时为 null)| -| `displayOrderNo` | String | 完整展示订单号 | -| `productName` | String | 产品名(快照) | -| `productCoverImg` | String | 产品封面 URL | -| `tierName` | String | 档位名(快照) | -| `customerName` | String | 客户姓名 | -| `customerPhoneMasked` | String | 客户手机(脱敏 `138****2046`) | -| `peopleSummary` | String | 人数摘要("2 大 1 小") | -| `departureDate` | LocalDate? | 出发日(未定时 null) | -| `tripDays` | Integer | 行程天数 | -| `orderStatus` | String | 粗状态(枚举见 §6.2) | -| `flowStatus` | String | 细状态(枚举见 §6.3) | -| `totalAmount` | BigDecimal | 订单金额 | -| `paidAmount` | BigDecimal | 实付金额 | -| `balanceAmount` | BigDecimal | 待付金额 | -| `consultantName` | String | 定制师姓名 | -| `tags` | List\ | 标签列表 | -| `createdAt` | LocalDateTime | 创单时间 | - -#### 错误码 - -参数格式错误走全局 400,无业务错误码。 - -#### 业务边界 - -- ✅ **默认行为**:`cancelled` 不传 = 不含已取消订单 -- ⚠️ **关键字**:`keyword` 同时 LIKE 4 字段(团号 / 客户姓名 / 产品名 / 订单号)任一命中 -- ⚠️ **标签过滤**:`tagNames` 多值是 **AND**(订单必须含全部标签才命中),不是 OR - -#### 示例 - -**典型 - 请求**: - -```http -GET /v3/admin/order?page=1&pageSize=10&orderStatus=PENDING_DEPARTURE&tagNames=VIP%20%E5%AE%A2%E6%88%B7 -Authorization: Bearer {admin_jwt} -``` - -**典型 - 响应**: - -```json -{ - "code": 200, - "data": { - "list": [ - { - "id": "60123456789012", - "orderNo": "HL20260510143025001", - "teamNo": "20260601A", - "displayOrderNo": "HL20260510143025001-T20260601A", - "productName": "长白山天池3日深度游", - "productCoverImg": "https://oss.hulalv.com/p/changbai-cover.jpg", - "tierName": "经典档", - "customerName": "张三", - "customerPhoneMasked": "138****2046", - "peopleSummary": "2 大 1 小", - "departureDate": "2026-06-01", - "tripDays": 3, - "orderStatus": "PENDING_DEPARTURE", - "flowStatus": "PENDING_DEPARTURE", - "totalAmount": 8580.00, - "paidAmount": 8580.00, - "balanceAmount": 0.00, - "consultantName": "李定制", - "tags": ["VIP 客户", "二次复购"], - "createdAt": "2026-05-10T14:30:25" - } - ], - "total": 1, - "page": 1, - "pageSize": 10 - }, - "msg": "success" -} -``` - ---- - -### 3.3 §1.3.1 订单详情主聚合 - -**路径**:`GET /v3/admin/order/{id}` -**使用场景**:详情页**首屏加载**——一次请求拿到主单 + 标签 + 概览(出行人 / 备注 / 紧急联系人);Tab 详情按需懒加载(§1.3.2 ~ §1.3.7) -**认证**:JWT + 公司隔离 | **响应规模**:精简,不含 6 Tab 子接口数据 - -> 📌 **本接口只返回 main / tags / overview 3 个顶层字段**。原 v5.48 设计的"一次返 9 Tab 全部数据"已拆分:finance / itinerary / contractInsurance / serviceStandard / statusLog / refund 移到 §1.3.2 ~ §1.3.7 独立懒加载接口。 - -#### 入参 - -| 字段 | 类型 | 必填 | 说明 | -|------|------|:----:|------| -| `id` | Long | ✅ | 订单 ID(path) | - -#### 出参(`Result`,3 顶层字段) - -| 字段 | 类型 | 说明 | -|------|------|------| -| `main` | OrderMainVO | 订单主单 + 异常态横条 + progressStepper 步骤进度条 | -| `tags` | List\ | 标签列表 | -| `overview` | OverviewVO | Tab 1 概览(出行人 + 备注 + 紧急联系人) | - -`OrderMainVO` 关键字段: - -| 字段 | 类型 | 说明 | -|------|------|------| -| `id` | String | 订单 ID | -| `displayOrderNo` | String | 完整展示订单号 | -| `productName` / `tierName` | String | 产品名 / 档位名(快照) | -| `orderStatus` | String | 粗状态(枚举见 §6.2) | -| `flowStatus` | String | 细状态(枚举见 §6.3) | -| `totalAmount` / `paidAmount` / `balanceAmount` | BigDecimal | 金额三件套 | -| `departureDate` / `returnDate` | LocalDate | 出发日 / 返团日 | -| `tripDays` / `tripNights` | Integer | 行程天数 / 晚数 | -| `adultCount` / `childCount` / `youngChildCount` / `babyCount` | Integer | 4 类人数 | -| `customerName` | String | 客户姓名 | -| `customerPhoneMasked` | String | 客户手机(admin 也脱敏,如 138****2046) | -| `consultantName` | String | 定制师姓名 | -| `confirmedAt` | LocalDateTime? | 确认锁单时间 | -| `exceptionBadges` | Map | 异常态横条 9 类标识(见下方)⚠️ 运行时**暂返 null**,OrderInfoConverter 派生逻辑待 Issue 接通子表后实现 | -| `progressStepper` | Object | 步骤进度条(见下方)⚠️ 运行时**暂返 null**,OrderInfoConverter 派生逻辑待 Issue 接通子表后实现 | -| `contractStatus` | String? | [Tab 状态] 合同状态枚举:`NONE/GENERATING/GENERATED/SIGNED/VOIDED/RESIGNING`,直接读主表 contract_status | -| `insuranceStatus` | String? | [Tab 状态] 保险状态枚举:`NONE/ISSUING/ISSUED/CANCELLED/FAILED`,直接读主表 insurance_status | -| `refundStatus` | String | [Tab 状态] 退款汇总状态枚举:`NONE/PROCESSING/COMPLETED`(派生,见 OrderMainRefundStatus) | -| `hasRefund` | Boolean | [Tab 状态] 是否存在退款记录(refundedAmount > 0) | -| `hasServiceStandard` | Boolean | [Tab 状态] 是否存在服务标准快照(EXISTS order_product_snapshot) | -| `hasFinanceDetail` | Boolean | [Tab 状态] 是否有财务明细(discountAmount > 0 OR surchargeAmount > 0,派生无 SQL) | - -**`exceptionBadges`** 9 类布尔字段(全 false 表示无异常):`contractFail` / `insuranceFail` / `refundAbnormal` / `grabTimeout` / `hotelPending` / `vehiclePending` / `travelerIncomplete` / `longUnpaid` / `awaitingCustomerConfirm` - -**`progressStepper`**:`currentStage` (String) + `nodes` 数组,每节点 `{key, label, status, subItems?}` -- 节点 key 枚举:`INFO_COMPLETE` / `ASSIGN_PARALLEL` / `CONFIRM` / `DEPARTED` / `RETURNED` / `REVIEW` / `SETTLED` -- 节点 status:`DONE` / `ACTIVE` / `PENDING` / `NOT_APPLICABLE` -- `ASSIGN_PARALLEL` 含 `subItems`:`HOTEL` / `VEHICLE` / `LEADER` / `PHOTOGRAPHER` 子项,每子项 {key, label, subStatus, applicable};subStatus 枚举同节点 status:DONE / ACTIVE / PENDING / NOT_APPLICABLE - -`TagVO`:`name` / `type`(枚举见 §6.15) / `color` - -`OverviewVO` 关键字段: - -| 字段 | 类型 | 说明 | -|------|------|------| -| `travelers` | List\ | 出行人完整集合(复用 traveler 模块 TravelerVO,含证件 / 性别 / 生日 / 民族 / 手机 / 紧急联系人 / 同住分组等,admin 明文) | -| `customerRemark` | String? | 客户备注 | -| `consultantRemark` | String? | 定制师备注 | -| `emergencyContactName` | String? | 紧急联系人姓名 | -| `emergencyContactPhone` | String? | 紧急联系人手机 | - -`TravelerVO` 字段口径详见 traveler 模块 §2.1 出行人列表 changelog。 - -#### 错误码 - -| code | 含义 | -|------|------| -| `581020` | 订单不存在 | -| `581021` | 无权访问该订单(公司隔离) | - -#### 业务边界 - -- ✅ **首屏一次请求拿全 main + tags + overview** -- ⚠️ 6 Tab 数据**不在本响应**,按需调 §1.3.2 ~ §1.3.7 子接口 -- ⚠️ 跨公司访问 → `581021` - -#### 示例 - -**典型 - 请求**: - -```http -GET /v3/admin/order/60123456789012 -Authorization: Bearer {admin_jwt} -``` - -**典型 - 响应**: - -```json -{ - "code": 200, - "data": { - "main": { - "id": "60123456789012", - "displayOrderNo": "HL20260510143025001-T20260601A", - "productName": "长白山天池3日深度游", - "tierName": "经典档", - "orderStatus": "PENDING_DEPARTURE", - "flowStatus": "PENDING_DEPARTURE", - "totalAmount": 8580.00, - "paidAmount": 8580.00, - "balanceAmount": 0.00, - "departureDate": "2026-06-01", - "returnDate": "2026-06-03", - "tripDays": 3, - "tripNights": 2, - "adultCount": 2, - "childCount": 1, - "youngChildCount": 0, - "babyCount": 0, - "customerName": "张三", - "customerPhoneMasked": "138****2046", - "consultantName": "李定制", - "confirmedAt": "2026-05-12T10:25:00", - "exceptionBadges": { - "contractFail": false, "insuranceFail": false, "refundAbnormal": false, - "grabTimeout": false, "hotelPending": false, "vehiclePending": false, - "travelerIncomplete": false, "longUnpaid": false, "awaitingCustomerConfirm": false - }, - "progressStepper": { - "currentStage": "RETURNED", - "nodes": [ - {"key": "INFO_COMPLETE", "label": "补全信息", "status": "DONE"}, - {"key": "ASSIGN_PARALLEL", "label": null, "status": "DONE", "subItems": [ - {"key": "HOTEL", "label": "配房", "subStatus": "DONE", "applicable": true}, - {"key": "VEHICLE", "label": "配车", "subStatus": "DONE", "applicable": true}, - {"key": "LEADER", "label": "配领队", "subStatus": "DONE", "applicable": true}, - {"key": "PHOTOGRAPHER", "label": "配摄影", "subStatus": "DONE", "applicable": true} - ]}, - {"key": "CONFIRM", "label": "确认", "status": "DONE"}, - {"key": "DEPARTED", "label": "出行", "status": "DONE"}, - {"key": "RETURNED", "label": "返团", "status": "ACTIVE"}, - {"key": "REVIEW", "label": "核单", "status": "PENDING"}, - {"key": "SETTLED", "label": "结算", "status": "PENDING"} - ] - } - }, - "tags": [ - {"name": "二次复购", "type": "SYSTEM", "color": "#52C41A"}, - {"name": "VIP 客户", "type": "PERSONAL", "color": "#FAAD14"} - ], - "overview": { - "travelers": [ - { - "id": "70123456789012", - "orderId": "60123456789012", - "travelerType": "ADULT", - "name": "张三", - "gender": "MALE", - "birthday": "1985-08-12", - "idType": "ID_CARD", - "idNo": "220103198508121234", - "nationality": "中国", - "race": "汉族", - "phone": "13800002046", - "emergencyContact": "李四", - "emergencyPhone": "13900008888", - "roomGroupNo": 1, - "profileStatus": "COMPLETED", - "transportPlanIds": ["80012345678901234"] - } - ], - "customerRemark": "希望住朝阳房", - "consultantRemark": "VIP 客户,已沟通到达接机", - "emergencyContactName": "李四", - "emergencyContactPhone": "13900008888" - } - }, - "msg": "success" -} -``` - -**异常(跨公司访问 581021) - 请求**:(admin JWT 不属于订单所属公司) - -```http -GET /v3/admin/order/60999999999999 -Authorization: Bearer {admin_jwt} -``` - -**异常 - 响应**: - -```json -{ "code": 581021, "data": null, "msg": "无权访问该订单" } -``` - ---- - -### 3.4 §1.3.2 财务 Tab(懒加载) - -**路径**:`GET /v3/admin/order/{id}/finance` -**使用场景**:详情页财务 Tab 单独刷新(如优惠 / 退款操作完后刷新) -**认证**:JWT + 公司隔离 - -#### 入参 - -`id` (path, Long) — 订单 ID - -#### 出参(`Result`) - -| 字段 | 类型 | 说明 | -|------|------|------| -| `totalAmount` | BigDecimal | 订单总额 | -| `paidAmount` | BigDecimal | 实付金额 | -| `balanceAmount` | BigDecimal | 待付金额 | -| `discountAmount` | BigDecimal | 优惠金额汇总 | -| `surchargeAmount` | BigDecimal | 附加费用汇总 | -| `refundAmount` | BigDecimal | 退款金额汇总 | -| `payments` | List\ | 支付明细 | -| `discounts` | List\ | 优惠明细 | -| `surcharges` | List\ | 附加费用 | - -`PaymentVO`:`id` / `payType`(枚举见 §6.6) / `amount` / `paidAt` / `status`(枚举见 §6.7) -`DiscountVO`:`id` / `name` / `amount` / `type`(枚举见 §6.8) / `source`(枚举见 §6.9) / `createdAt` -`SurchargeVO`:`id` / `name` / `amount` / `type` / `source` / `createdAt` - -#### 错误码 - -| code | 含义 | -|------|------| -| `581020` | 订单不存在 | -| `581021` | 无权访问该订单 | - -#### 示例 - -**典型 - 请求**: - -```http -GET /v3/admin/order/60123456789012/finance -Authorization: Bearer {admin_jwt} -``` - -**典型 - 响应**: - -```json -{ - "code": 200, - "data": { - "totalAmount": 8580.00, - "paidAmount": 8580.00, - "balanceAmount": 0.00, - "discountAmount": 200.00, - "surchargeAmount": 0.00, - "refundAmount": 0.00, - "payments": [ - {"id": 90011, "payType": "DEPOSIT", "amount": 2000.00, "paidAt": "2026-05-10T15:00:00", "status": "SUCCESS"}, - {"id": 90012, "payType": "BALANCE", "amount": 6580.00, "paidAt": "2026-05-15T09:30:00", "status": "SUCCESS"} - ], - "discounts": [ - {"id": 95001, "name": "早鸟优惠", "amount": 200.00, "type": "EARLY_BIRD", "source": "MANUAL", "createdAt": "2026-05-10T14:30:00"} - ], - "surcharges": [] - }, - "msg": "success" -} -``` - ---- - -### 3.5 §1.3.3 合同保险 Tab(懒加载) - -**路径**:`GET /v3/admin/order/{id}/contract-insurance` -**使用场景**:合同重签 / 保险重投后单独刷新该 Tab -**响应结构**:`contract` / `insurance` 两个并列子对象(前端 Tab 内上下两栏布局) - -#### 入参 - -`id` (path, Long) — 订单 ID - -#### 出参(`Result`) - -| 字段 | 类型 | 说明 | -|------|------|------| -| `contract.contractStatus` | String | 合同状态(枚举见 §6.10) | -| `contract.contractSignedAt` | LocalDateTime? | 签约时间 | -| `contract.contractFileUrl` | String? | 合同文件 URL | -| `contract.events[].eventType` | String | 合同事件类型(枚举见 §6.11) | -| `contract.events[].occurredAt` | LocalDateTime | 事件发生时间 | -| `insurance.insuranceStatus` | String | 保险状态(枚举见 §6.12) | -| `insurance.insurancePolicyNo` | String? | 保单号 | -| `insurance.insurancePremium` | BigDecimal? | 保费 | -| `insurance.events[].eventType` | String | 保险事件类型(枚举见 §6.11) | -| `insurance.events[].occurredAt` | LocalDateTime | 事件发生时间 | - -#### 错误码 - -| code | 含义 | -|------|------| -| `581020` | 订单不存在 | -| `581021` | 无权访问该订单 | - -#### 示例 - -**典型 - 请求**: - -```http -GET /v3/admin/order/60123456789012/contract-insurance -Authorization: Bearer {admin_jwt} -``` - -**典型 - 响应**: - -```json -{ - "code": 200, - "data": { - "contract": { - "contractStatus": "SIGNED", - "contractSignedAt": "2026-05-12T11:00:00", - "contractFileUrl": "https://oss.hulalv.com/contract/HL20260510143025001.pdf", - "events": [ - {"eventType": "GENERATE", "occurredAt": "2026-05-12T10:55:00"}, - {"eventType": "SIGN", "occurredAt": "2026-05-12T11:00:00"} - ] - }, - "insurance": { - "insuranceStatus": "ACTIVE", - "insurancePolicyNo": "PICC2026060100123", - "insurancePremium": 88.00, - "events": [ - {"eventType": "ISSUE", "occurredAt": "2026-05-12T11:05:00"} - ] - } - }, - "msg": "success" -} -``` - ---- - -### 3.6 §1.3.4 行程安排 Tab(懒加载)⚠️ Mock - -**路径**:`GET /v3/admin/order/{id}/itinerary` -**使用场景**:调整行程节点 / 房车配置后单独刷新 - -> ⚠️ **当前数据 Mock**:行程节点 + 房车需求&实配为 Mock 数据,真实化进度见 follow-up Issue。前端可先按字段结构对接,真实化后无需改字段口径。 - -#### 入参 - -`id` (path, Long) — 订单 ID - -#### 出参(`Result`) - -| 字段 | 类型 | 说明 | -|------|------|------| -| `days[].dayIndex` | Integer | 天序 | -| `days[].dayDate` | String | 日期(`yyyy-MM-dd`) | -| `days[].title` | String | 标题 | -| `days[].nodes` | List\ | 节点列表(结构见 itinerary 模块 §5) | -| `hotelGroup.requirement` | Object | 配房需求(`requirementId / status / roomTypeSummary / claimedBy` 等) | -| `hotelGroup.assignments` | List\ | 实际配房(`hotelName / stayDate / roomType / roomCount / unitPrice / subtotal`) | -| `vehicleGroup.requirement` | Object | 配车需求(`requirementId / status / vehicleTypeSummary / claimedBy`) | -| `vehicleGroup.assignments` | List\ | 实际配车(`vehicleType / plate / driverName / dailyFee / totalFee`) | - -#### 错误码 - -| code | 含义 | -|------|------| -| `581020` | 订单不存在 | -| `581021` | 无权访问该订单 | - -#### 示例 - -**典型 - 请求**: - -```http -GET /v3/admin/order/60123456789012/itinerary -Authorization: Bearer {admin_jwt} -``` - -**典型 - 响应**(Mock 数据示意): - -```json -{ - "code": 200, - "data": { - "days": [ - { - "dayIndex": 1, - "dayDate": "2026-06-01", - "title": "抵达长春-接机", - "nodes": [ - {"nodeType": "TRANSPORT", "title": "接机", "startTime": "10:30"}, - {"nodeType": "HOTEL", "title": "入住凯悦酒店", "actualResourceName": "长春凯悦酒店"} - ] - } - ], - "hotelGroup": { - "requirement": { - "requirementId": "70011", "status": "DONE", "version": 2, - "roomTypeSummary": "1 大床房×2 + 1 标间×1", - "remark": "希望朝阳房,带浴缸优先", - "budgetRange": "500-800/晚", - "claimedBy": "房控-王芳", "claimedAt": "2026-05-11T14:20:00" - }, - "assignments": [ - {"id": "80011", "hotelName": "长春凯悦酒店", "stayDate": "2026-06-01", "roomType": "大床房", "roomCount": 2, "roomGroupNo": 1, "unitPrice": 680, "subtotal": 1360} - ] - }, - "vehicleGroup": { - "requirement": { - "requirementId": "70021", "status": "DONE", "version": 1, - "vehicleTypeSummary": "9 座商务车×1", - "claimedBy": "车控-李强", "claimedAt": "2026-05-11T15:00:00" - }, - "assignments": [ - {"id": "80021", "vehicleType": "MPV", "plate": "吉A·888XX", "driverName": "王师傅", "driverPhone": "138****1234", "dailyFee": 1100, "totalDays": 3, "totalFee": 3300} - ] - } - }, - "msg": "success" -} -``` - ---- - -### 3.7 §1.3.5 状态记录 Tab(懒加载) - -**路径**:`GET /v3/admin/order/{id}/status-log` -**使用场景**:执行状态变更后刷新时间线 -**数据来源**:5 张审计表联合(status_log / payment / refund / contract_event / insurance_event)按 `occurredAt desc` 倒序 - -#### 入参 - -`id` (path, Long) — 订单 ID - -#### 出参(`Result>`) - -| 字段 | 类型 | 说明 | -|------|------|------| -| `occurredAt` | LocalDateTime | 发生时间 | -| `operator` | String | 操作人 | -| `action` | String | 操作描述 | -| `fromStatus` | String? | 变更前状态(有状态变更时有值) | -| `toStatus` | String? | 变更后状态 | -| `amount` | BigDecimal? | 涉及金额(支付/退款时有值) | - -#### 错误码 - -| code | 含义 | -|------|------| -| `581020` | 订单不存在 | -| `581021` | 无权访问该订单 | - -#### 示例 - -**典型 - 请求**: - -```http -GET /v3/admin/order/60123456789012/status-log -Authorization: Bearer {admin_jwt} -``` - -**典型 - 响应**: - -```json -{ - "code": 200, - "data": [ - {"occurredAt": "2026-05-12T10:25:00", "operator": "李定制", "action": "确认锁单", "fromStatus": "定制中", "toStatus": "待出行"}, - {"occurredAt": "2026-05-10T15:00:00", "operator": "张三", "action": "支付订金", "amount": 2000.00}, - {"occurredAt": "2026-05-10T14:30:25", "operator": "李定制", "action": "创建订单"} - ], - "msg": "success" -} -``` - ---- - -### 3.8 §1.3.6 退款明细 Tab(懒加载,条件显示) - -**路径**:`GET /v3/admin/order/{id}/refund` -**使用场景**:退款流程节点变更后刷新;前端轮询等待退款到账 -**空值约定**:无退款时 `data=null`(前端据此判断是否渲染该 Tab) - -#### 入参 - -`id` (path, Long) — 订单 ID - -#### 出参(`Result` 或 `Result`) - -| 字段 | 类型 | 说明 | -|------|------|------| -| `totalRefundAmount` | BigDecimal | 合计退款金额(= `finance.refundAmount`) | -| `applications[].applicationId` | Long | 申请 ID | -| `applications[].status` | String | 进度状态(枚举见 §6.13) | -| `applications[].statusText` | String | 状态描述文案 | -| `applications[].refundAmount` | BigDecimal | 退款金额 | -| `applications[].refundChannel` | String | 退款渠道("原路退回(支付宝)") | -| `applications[].approverName` | String? | 审批人 | -| `applications[].approvedAt` | LocalDateTime? | 审批时间 | -| `applications[].estimatedArriveDate` | LocalDate? | 预计到账日期 | -| `applications[].actualArriveDate` | LocalDate? | 实际到账日期 | -| `applications[].progress[].step` | String | 步骤(枚举见 §6.14) | -| `applications[].progress[].label` | String | 步骤展示标签 | -| `applications[].progress[].status` | String | 步骤状态(`DONE` / `ACTIVE` / `PENDING`) | -| `applications[].progress[].occurredAt` | LocalDateTime? | 步骤发生时间 | -| `applications[].items[].itemName` | String | 项目名称 | -| `applications[].items[].reason` | String | 退款原因 | -| `applications[].items[].appliedAt` | LocalDateTime | 申请时间 | -| `applications[].items[].amount` | BigDecimal | 退款金额(负数) | - -#### 错误码 - -| code | 含义 | -|------|------| -| `581020` | 订单不存在 | -| `581021` | 无权访问该订单 | - -#### 示例 - -**典型(有退款) - 请求**: - -```http -GET /v3/admin/order/60123456789012/refund -Authorization: Bearer {admin_jwt} -``` - -**典型(有退款) - 响应**: - -```json -{ - "code": 200, - "data": { - "totalRefundAmount": 4800.00, - "applications": [ - { - "applicationId": 60101, - "status": "PENDING_PAYOUT", - "statusText": "财务已审批,等待打款", - "refundAmount": 4800.00, - "refundChannel": "原路退回(支付宝)", - "approverName": "财务 · 周经理", - "approvedAt": "2026-04-25T14:20:00", - "estimatedArriveDate": "2026-04-30", - "actualArriveDate": null, - "progress": [ - {"step": "APPLY", "label": "退款申请", "status": "DONE", "occurredAt": "2026-04-25T11:30:00"}, - {"step": "APPROVE", "label": "财务审批", "status": "DONE", "occurredAt": "2026-04-25T14:20:00"}, - {"step": "PAYOUT", "label": "退款打款", "status": "ACTIVE", "occurredAt": null}, - {"step": "ARRIVED", "label": "到账确认", "status": "PENDING", "occurredAt": null} - ], - "items": [ - {"itemName": "主行程退款(同行小孩临时不能出行)", "reason": "同行儿童突发感冒,不参与本次出行", "appliedAt": "2026-04-25T11:30:00", "amount": -4800.00} - ] - } - ] - }, - "msg": "success" -} -``` - -**边界(无退款) - 请求**:(同上路径) - -**边界 - 响应**: - -```json -{ "code": 200, "data": null, "msg": "success" } -``` - ---- - -### 3.9 §1.3.7 服务标准 Tab(懒加载,条件显示) - -**路径**:`GET /v3/admin/order/{id}/service-standard` -**使用场景**:服务标准 Tab 单独刷新 -**数据来源**:产品快照冻结(永不变) -**空值约定**:快照缺失时 `data=null` - -#### 入参 - -`id` (path, Long) — 订单 ID - -#### 出参(`Result` 或 `Result`) - -| 字段 | 类型 | 说明 | -|------|------|------| -| `itinerary` | List\ | 行程天纲(产品快照) | -| `notice.title` | String | 出团注意事项标题 | -| `notice.content` | String | 出团注意事项内容(Markdown) | -| `refundPolicy.policyId` | Long | 退改政策 ID | -| `refundPolicy.policyName` | String | 退改政策名称 | -| `refundPolicy.tiers[].minDays` | Integer | 出发前最小天数 | -| `refundPolicy.tiers[].refundRatio` | Integer | 退款比例(百分比 0-100) | -| `refundPolicy.tiers[].label` | String | 展示文案 | - -#### 错误码 - -| code | 含义 | -|------|------| -| `581020` | 订单不存在 | -| `581021` | 无权访问该订单 | - -#### 示例 - -**典型 - 请求**: - -```http -GET /v3/admin/order/60123456789012/service-standard -Authorization: Bearer {admin_jwt} -``` - -**典型 - 响应**: - -```json -{ - "code": 200, - "data": { - "itinerary": ["Day1 抵达长春-接机入住", "Day2 长白山天池1日游", "Day3 返程"], - "notice": { - "title": "长白山天池 3 日深度游 - 出团注意事项", - "content": "# 出团必读\n\n1. 高原反应:海拔 2691m,请提前服用红景天\n2. 天气:山顶常年低于 0℃,请备厚外套\n..." - }, - "refundPolicy": { - "policyId": 50001, - "policyName": "标准退改政策", - "tiers": [ - {"minDays": 15, "refundRatio": 100, "label": "出发前 15 天 100%退"}, - {"minDays": 7, "refundRatio": 80, "label": "出发前 7-14 天 80%退"}, - {"minDays": 3, "refundRatio": 50, "label": "出发前 3-6 天 50%退"}, - {"minDays": 0, "refundRatio": 0, "label": "出发前 2 天内不退"} - ] - } - }, - "msg": "success" -} -``` - ---- - -### 3.10 §1.4 修改订单字段 - -**路径**:`PUT /v3/admin/order/{id}` -**使用场景**:修改订单**非关键字段**(备注 / 紧急联系人 / 客户信息 / 转单),不触发状态机 -**关键字段约定**:订单金额 / 状态等不允许在此接口改,需走专用接口 -**语义**:PATCH(传哪个改哪个) -**审计**:每次修改写 1 行 `order_status_log`(即使状态未变也记录"字段被改") - -#### 入参(`OrderUpdateReqVO`,PATCH 语义) - -| 字段 | 类型 | 必填 | 说明 | -|------|------|:----:|------| -| `customerName` | String | ❌ | 客户姓名 | -| `customerPhone` | String | ❌ | 客户手机 | -| `emergencyContactName` | String | ❌ | 紧急联系人姓名 | -| `emergencyContactPhone` | String | ❌ | 紧急联系人电话 | -| `customerRemark` | String | ❌ | 客户备注 | -| `consultantRemark` | String | ❌ | 定制师备注 | -| `targetConsultantId` | Long | ❌ | 转单目标定制师 ID(仅主管 / 客服角色可传) | -| `transferReason` | String | ❌ | 转单原因(传 `targetConsultantId` 时必填) | - -#### 出参(`Result`) - -返回 `true` 表示成功,`false` 表示无字段实际变化。 - -#### 错误码 - -| code | 含义 | -|------|------| -| `581020` | 订单不存在 | -| `581021` | 无权访问该订单 | -| `581030` | 转单目标定制师不存在 | -| `581031` | 转单原因为空(传 `targetConsultantId` 时) | -| `581032` | 当前角色无转单权限(仅主管 / 客服可转单) | - -#### 业务边界 - -- ✅ **可改字段**:备注 / 紧急联系人 / 客户信息 / 转单(仅主管 / 客服角色) -- ❌ **不可改字段**:订单金额 / 订单状态 / 出发日期 / 出行人数 / 拼团批次 → 需走专用接口 -- ⚠️ **转单约束**:传 `targetConsultantId` 必须同时传 `transferReason` -- ⚠️ **PATCH 语义**:不传 = 不改;传空字符串 = 改成空(区分两者) - -#### 示例 - -**典型(转单) - 请求**: - -```http -PUT /v3/admin/order/60123456789012 -Authorization: Bearer {admin_jwt} -Content-Type: application/json - -{ - "targetConsultantId": 50009876543210, - "transferReason": "客户主动申请更换定制师", - "consultantRemark": "已联系新定制师" -} -``` - -**典型 - 响应**: - -```json -{ "code": 200, "data": true, "msg": "success" } -``` - -**异常(转单缺原因 581031) - 请求**: - -```http -PUT /v3/admin/order/60123456789012 -Authorization: Bearer {admin_jwt} -Content-Type: application/json - -{ - "targetConsultantId": 50009876543210 -} -``` - -**异常 - 响应**: - -```json -{ "code": 581031, "data": null, "msg": "转单原因为空" } -``` - ---- - -### 3.11 §1.5.0 取消订单预览(只读) - -**路径**:`GET /v3/admin/order/{id}/cancel-preview` -**使用场景**:定制师点击「取消订单」按钮,弹框打开瞬间调用,展示退款金额 + 扣费 + 退款政策 -**认证**:JWT(admin 角色) | **幂等性**:是(只读不入库) | **限流**:无 -**金额规则**:严格按订单创建时冻结的 `RefundPolicy` 快照计算,不接受人工覆盖 - -#### 入参 - -`id` (path, Long) — 订单 ID - -#### 出参(`Result`) - -| 字段 | 类型 | 说明 | -|------|------|------| -| `refundAmount` | BigDecimal | 退款金额(按 RefundPolicy 计算) | -| `paidAmount` | BigDecimal | 客户已付金额 | -| `deductAmount` | BigDecimal | 扣费金额 = `paidAmount - refundAmount` | -| `daysToDeparture` | Integer | 距出发天数(今天 - 出发日;负数表已过出发日) | -| `refundPolicy` | RefundPolicyVO | 退款政策快照(结构同 §3.9 `refundPolicy`) | - -#### 错误码 - -| code | 含义 | -|------|------| -| `581020` | 订单不存在 | -| `581021` | 无权访问该订单 | -| `581050` | 订单状态不允许取消(已取消 / 已完成 / 退款中等) | - -#### 业务边界 - -- ✅ **适用**:订单粗状态 ∈ {PENDING_PAY, PENDING_COMPLETE, CUSTOMIZING, PENDING_DEPARTURE, PENDING_BALANCE}(v3 状态机:CONFIRM event 直接迁到 PENDING_DEPARTURE;尾款重开切到 PENDING_BALANCE) -- ❌ **拒绝**:已取消 / 已完成 / 退款中 → `581050` -- ⚠️ **`daysToDeparture` 负数**:已过出发日,前端应引导走 §3.13 出行中取消(on-trip)而非本接口预览 - -#### 示例 - -**典型(出行前 12 天) - 请求**: - -```http -GET /v3/admin/order/60123456789012/cancel-preview -Authorization: Bearer {admin_jwt} -``` - -**典型 - 响应**: - -```json -{ - "code": 200, - "data": { - "refundAmount": 6864.00, - "paidAmount": 8580.00, - "deductAmount": 1716.00, - "daysToDeparture": 12, - "refundPolicy": { - "policyId": 50001, - "policyName": "标准退改政策", - "tiers": [ - {"minDays": 15, "refundRatio": 100, "label": "出发前 15 天 100%退"}, - {"minDays": 7, "refundRatio": 80, "label": "出发前 7-14 天 80%退"}, - {"minDays": 3, "refundRatio": 50, "label": "出发前 3-6 天 50%退"}, - {"minDays": 0, "refundRatio": 0, "label": "出发前 2 天内不退"} - ] - } - }, - "msg": "success" -} -``` - ---- - -### 3.12 §1.5.1 取消订单 - 出行前(pre-trip) - -**路径**:`POST /v3/admin/order/{id}/cancel/pre-trip` -**使用场景**:定制师代客取消出行前订单。走企微 OA 审批 + 通道退款 -**认证**:JWT(admin 角色) | **幂等性**:否(提交企微 OA + 创建退款申请) | **限流**:无 -**金额规则**:严格按 `RefundPolicy` 计算,不接受人工覆盖(金额由 §3.11 预览给定) - -#### 入参(`OrderCancelPreTripReqVO`) - -| 字段 | 类型 | 必填 | 说明 | 校验规则 | -|------|------|:----:|------|----------| -| `cancelReason` | String | ✅ | 取消原因(前端可选下拉 + 自由填写) | `@NotBlank` | -| `cancelDetail` | String | ❌ | 详细说明 | — | - -#### 出参(`Result`) - -| 字段 | 类型 | 说明 | -|------|------|------| -| `refundApplicationId` | Long | 退款申请 ID(已提企微 OA) | -| `refundAmount` | BigDecimal | 退款金额(按 RefundPolicy 政策计算) | -| `pendingApprovalMsg` | String | 审批中提示文案 | -| `newStatus` | String | 取消后订单状态(如 `退款中`) | - -#### 错误码 - -| code | 含义 | -|------|------| -| `581020` | 订单不存在 | -| `581021` | 无权访问该订单 | -| `581050` | 订单状态不允许取消(已取消 / 已完成 / 退款中) | -| `581051` | 订单已过出发日,需走 §3.13 on-trip 取消 | -| `581052` | 企微 OA 提交失败 | - -#### 业务边界 - -- ✅ **适用**:订单状态可取消 + `daysToDeparture` ≥ 0 -- ❌ **拒绝**:出发日过 / 状态不可取消 -- ⚠️ **不可重复提交**:同一订单存在 PENDING 退款申请时第二次调用返 `581050` - -#### 示例 - -**典型 - 请求**: - -```http -POST /v3/admin/order/60123456789012/cancel/pre-trip -Authorization: Bearer {admin_jwt} -Content-Type: application/json - -{ - "cancelReason": "客户临时有事无法出行", - "cancelDetail": "客户家属突发疾病需照顾" -} -``` - -**典型 - 响应**: - -```json -{ - "code": 200, - "data": { - "refundApplicationId": 95001234567890, - "refundAmount": 6864.00, - "pendingApprovalMsg": "已提交企微审批,预计 2 小时内完成", - "newStatus": "退款中" - }, - "msg": "success" -} -``` - ---- - -### 3.13 §1.5.2 取消订单 - 出行中(on-trip) - -**路径**:`POST /v3/admin/order/{id}/cancel/on-trip` -**使用场景**:定制师代客取消出行中订单。**仅登记返还金额**,不走支付通道(返还金额在核单 Step 5 自动拉取结算) -**认证**:JWT(admin 角色) - -#### 入参(`OrderCancelOnTripReqVO`) - -| 字段 | 类型 | 必填 | 说明 | 校验规则 | -|------|------|:----:|------|----------| -| `cancelReason` | String | ✅ | 取消原因 | `@NotBlank` | -| `returnAmount` | BigDecimal | ✅ | 定制师手填的返还金额(不走政策算) | `@NotNull` `@DecimalMin(0, exclusive)` | -| `returnRemark` | String | ✅ | 返还金额备注(说明已用成本扣除项) | `@NotBlank` | - -#### 出参(`Result`) - -| 字段 | 类型 | 说明 | -|------|------|------| -| `settlementRefundId` | Long | 返还登记 ID | -| `returnAmount` | BigDecimal | 已登记的返还金额(= 入参回显) | -| `newStatus` | String | 取消后状态(`已取消`) | - -#### 错误码 - -| code | 含义 | -|------|------| -| `581020` | 订单不存在 | -| `581021` | 无权访问该订单 | -| `581053` | 订单未出发,不能走 on-trip 取消 | -| `581054` | 订单已完成,不能取消 | -| `581055` | `returnAmount` 大于 `paidAmount` | - -#### 业务边界 - -- ✅ **适用**:订单粗状态 = `出行中` 或 `已确认` 但已过出发日 -- ❌ **拒绝**:未出发 → `581053`;已完成 → `581054`;返还金额超额 → `581055` -- ⚠️ **不走支付通道**:本接口**只登记**返还金额,不发起实退;实退在核单 Step 5 走 - -#### 示例 - -**典型 - 请求**: - -```http -POST /v3/admin/order/60123456789012/cancel/on-trip -Authorization: Bearer {admin_jwt} -Content-Type: application/json - -{ - "cancelReason": "客户中途突发疾病", - "returnAmount": 2500.00, - "returnRemark": "已用 2 天住宿+用车+导游,扣除 5880 元" -} -``` - -**典型 - 响应**: - -```json -{ - "code": 200, - "data": { - "settlementRefundId": 96001234567890, - "returnAmount": 2500.00, - "newStatus": "已取消" - }, - "msg": "success" -} -``` - ---- - -### 3.14 §1.7 状态变更操作(通用状态机) - -**路径**:`POST /v3/admin/order/{id}/transition` -**使用场景**:所有由状态机驱动的操作统一走此接口。例如「确认锁单」「关闭订单」「触发尾款支付」等 -**认证**:JWT(admin 角色) | **幂等性**:否(写 `order_status_log`) -**副作用**:根据 `eventCode` 触发不同副作用(生成合同 / 投保 / 通知司机等),副作用列表在响应 `triggeredEvents` 中返回 - -#### 入参(`OrderTransitionReqVO`) - -| 字段 | 类型 | 必填 | 说明 | 校验规则 | -|------|------|:----:|------|----------| -| `eventCode` | String | ✅ | 状态机事件代码,9 个:PAY_DEPOSIT / PAY_FULL / CANCEL / CONFIRM / INITIATE_REFUND / SET_PENDING_BALANCE / SET_PENDING_DEPARTURE / DEPART / FINISH(含义见 §6.17) | `@NotBlank` | -| `reason` | String | ❌ | 操作原因(按 event 强制要求时必填) | — | -| `payload` | Map\ | ❌ | 事件相关额外数据(不同 event 含义不同) | — | - -#### 出参(`Result`) - -| 字段 | 类型 | 说明 | -|------|------|------| -| `success` | Boolean | 是否成功 | -| `oldStatus` | String | 变更前粗状态 | -| `newStatus` | String | 变更后粗状态 | -| `oldFlowStatus` | String | 变更前细状态 | -| `newFlowStatus` | String | 变更后细状态 | -| `triggeredEvents` | List\ | 副作用事件列表(枚举见 §6.18) | - -#### 错误码 - -| code | 含义 | -|------|------| -| `581020` | 订单不存在 | -| `581021` | 无权访问该订单 | -| `581060` | `eventCode` 枚举非法 | -| `581061` | 当前状态不允许该 event(状态机迁移非法) | -| `581062` | `reason` 必填但未传(如 `CANCEL` event) | -| `581063` | 前置 checklist 未全通过(如 `CONFIRM` event 时需 §3.15 全 ✅) | - -#### 业务边界 - -- ✅ **状态机驱动**:触发条件由后端状态机定义,前端只传 `eventCode`,不需要懂迁移规则 -- ⚠️ **`CONFIRM` event 强约束**:调用前必须先调 §3.15 confirm-checklist 且 `allPassed=true`,否则返 `581063` -- ⚠️ **副作用异步**:`triggeredEvents` 中 `ASYNC_*` 前缀的事件是异步执行的,本接口返回时副作用可能未完成(用 status-log Tab §3.7 跟踪) - -#### 示例 - -**典型(确认锁单) - 请求**: - -```http -POST /v3/admin/order/60123456789012/transition -Authorization: Bearer {admin_jwt} -Content-Type: application/json - -{ - "eventCode": "CONFIRM", - "reason": "定制师确认所有前置条件已完成", - "payload": {} -} -``` - -**典型 - 响应**: - -```json -{ - "code": 200, - "data": { - "success": true, - "oldStatus": "CUSTOMIZING", - "newStatus": "PENDING_DEPARTURE", - "oldFlowStatus": "PENDING_CONFIRM", - "newFlowStatus": "PENDING_DEPARTURE", - "triggeredEvents": ["ASYNC_CONTRACT_GENERATE", "ASYNC_INSURANCE_ISSUE"] - }, - "msg": "success" -} -``` - -**异常(checklist 未通过 581063) - 请求**:(同上 `eventCode=CONFIRM`,但订单存在未完善出行人) - -**异常 - 响应**: - -```json -{ "code": 581063, "data": null, "msg": "前置 checklist 未全通过:出行人信息未完善 1/3" } -``` - ---- - -### 3.15 §1.8 确认锁单前置 Checklist - -**路径**:`GET /v3/admin/order/{id}/confirm-checklist` -**使用场景**:定制师点击「确认订单」按钮时调用。 -- 返回 5 项前置校验明细(决定按钮是否可点) -- 通过时返回"确认行程"弹框预览数据(行程概览 + 自动副作用 + 通知项) -- 不通过时 `preview=null`,前端展示 5 项 `failReason` 列表 + `actionPath` 跳转引导 - -**认证**:JWT(admin 角色) | **幂等性**:是(只读不入库) - -#### 入参 - -`id` (path, Long) — 订单 ID - -#### 出参(`Result`) - -| 字段 | 类型 | 说明 | -|------|------|------| -| `allPassed` | Boolean | 是否全部通过(任一项不通过则 false) | -| `items` | List\ | 5 项详细结果 | -| `preview` | PreviewVO? | 确认行程弹框预览(仅 `allPassed=true` 时返回) | - -`ChecklistItemVO`: -| 字段 | 类型 | 说明 | -|------|------|------| -| `code` | String | 检查项代码(枚举见 §6.19) | -| `passed` | Boolean | 是否通过 | -| `failReason` | String? | 未通过原因(通过时 null) | -| `actionPath` | String? | 引导操作路径(如配房页跳转;通过时 null) | - -`PreviewVO`(仅 `allPassed=true` 时存在): -| 字段 | 类型 | 说明 | -|------|------|------| -| `departureDate` | LocalDate | 出发日期 | -| `totalPeopleCount` | Integer | 总出行人数(4 类相加) | -| `driverName` | String | 司机姓名 | -| `driverPhoneMasked` | String | 司机手机(脱敏) | -| `hotels` | List\<{cityName, hotelName}\> | 酒店列表(按行程城市分组) | -| `contractAutoAction.planName` | String | 合同方案名(产品快照) | -| `contractAutoAction.autoSign` | Boolean | 是否自动发送给客户线上签署 | -| `insuranceAutoAction.planName` | String | 保险产品名 | -| `insuranceAutoAction.peopleCount` | Integer | 投保人数(= `totalPeopleCount`) | -| `insuranceAutoAction.effectiveDescription` | String | 生效时间描述 | -| `notifications.notifyDriver` | Boolean | 是否通知司机 | -| `notifications.notifyHotel` | Boolean | 是否通知酒店确认房态 | -| `notifications.notifyCustomer` | Boolean | 是否向客户发送出行提醒 | -| `notifications.customerChannel` | String | 客户通知渠道(`WX` / `SMS` / `MIXED`) | - -#### 错误码 - -| code | 含义 | -|------|------| -| `581020` | 订单不存在 | -| `581021` | 无权访问该订单 | - -#### 业务边界 - -- ✅ **前置校验**:5 项 checklist 用于阻止用户点【确认订单】按钮在前置条件未满足时 -- ⚠️ **`actionPath` 引导**:前端建议按字面值跳转(如 `/admin/order/orders/{id}?tab=overview`),不是后端约定渲染 -- ⚠️ **`preview` 条件返回**:`allPassed=false` 时 `preview` 为 null,前端不渲染预览区 -- ⚠️ **`preview` 数据是预演**:本接口返回的合同方案 / 保险方案是「点击确认后会执行什么」的预演,**不**意味着已经执行(实际执行由 §3.14 `eventCode=CONFIRM` 触发) - -#### 示例 - -**典型(未通过) - 请求**: - -```http -GET /v3/admin/order/60123456789012/confirm-checklist -Authorization: Bearer {admin_jwt} -``` - -**典型(未通过) - 响应**: - -```json -{ - "code": 200, - "data": { - "allPassed": false, - "items": [ - {"code": "TRAVELER_COMPLETE", "passed": false, "failReason": "出行人信息未完善 1/3 (小明缺证件号)", "actionPath": "/admin/order/orders/60123456789012?tab=overview"}, - {"code": "PAYMENT_OK", "passed": true, "failReason": null, "actionPath": null}, - {"code": "HOTEL_DONE", "passed": true, "failReason": null, "actionPath": null}, - {"code": "VEHICLE_DONE", "passed": true, "failReason": null, "actionPath": null}, - {"code": "CONTRACT_TEMPLATE_OK", "passed": true, "failReason": null, "actionPath": null} - ], - "preview": null - }, - "msg": "success" -} -``` - -**典型(全通过) - 请求**:(同上) - -**典型(全通过) - 响应**: - -```json -{ - "code": 200, - "data": { - "allPassed": true, - "items": [ - {"code": "TRAVELER_COMPLETE", "passed": true, "failReason": null, "actionPath": null}, - {"code": "PAYMENT_OK", "passed": true, "failReason": null, "actionPath": null}, - {"code": "HOTEL_DONE", "passed": true, "failReason": null, "actionPath": null}, - {"code": "VEHICLE_DONE", "passed": true, "failReason": null, "actionPath": null}, - {"code": "CONTRACT_TEMPLATE_OK", "passed": true, "failReason": null, "actionPath": null} - ], - "preview": { - "departureDate": "2026-05-30", - "totalPeopleCount": 14, - "driverName": "扎西师傅", - "driverPhoneMasked": "1398761****", - "hotels": [ - {"cityName": "拉萨", "hotelName": "瑞吉度假酒店"}, - {"cityName": "林芝", "hotelName": "悦榕庄"} - ], - "contractAutoAction": { - "planName": "标准跟团方案 v3.2", - "autoSign": true - }, - "insuranceAutoAction": { - "planName": "安联境内旅行险 · 尊享版", - "peopleCount": 14, - "effectiveDescription": "出发前 24h 内生效" - }, - "notifications": { - "notifyDriver": true, - "notifyHotel": true, - "notifyCustomer": true, - "customerChannel": "WX" - } - } - }, - "msg": "success" -} -``` - ---- - -## 6. 枚举 / 数据字典 - -> 跨接口共享枚举集中列出,按字段分组,标注「使用字段在哪里」。 - -### 6.1 createSource(订单创建来源) - -**使用字段**:§3.1 入参 `createSource` / §3.2 入参 `createSource` 过滤 - -| 值 | 中文 | 说明 | -|----|------|------| -| `CUSTOMER` | 客户自助 | 客户在小程序自助下单 | -| `CONSULTANT` | 定制师代下单 | 默认值 | -| `OTA` | OTA 渠道 | 携程 / 美团等 OTA 引流 | -| `WALK_IN` | 门店步入 | 线下门店现场下单 | -| `B2B` | B2B 渠道 | 旅行社代下单 | -| `VIP_REPURCHASE` | VIP 复购 | — | -| `REFERRAL` | 老客户转介绍 | — | -| `PROMOTION` | 营销活动 | — | -| `INTERNAL` | 内部测试 | 不计入业绩 | - -### 6.2 orderStatus(订单粗状态) - -**使用字段**:§3.1 出参 / §3.2 出参 / §3.3 main / §3.2 入参过滤 - -> 后端 enum:`com.hulalv.order.core.enums.OrderStatus`,共 **9 项**(v5.49 对齐 SRS:退款粗态已移除,退款发起瞬间订单 order_status 直接变为 `CANCELLED`,退款进度由 refund_status 子字段记录)。**API 传/返均为英文枚举值,中文标签前端自己映射**。 - -| 值 | 中文标签 | 说明 | -|----|------|------| -| `PENDING_PAY` | 待支付 | 创单后默认 | -| `PENDING_COMPLETE` | 待完善 | 订金到账后进入 | -| `CUSTOMIZING` | 定制中 | 出行人 + 房车齐前 | -| `PENDING_DEPARTURE` | 待出行 | 确认锁单后 | -| `PENDING_BALANCE` | 待付尾款 | 重开尾款场景(SET_PENDING_BALANCE 事件迁入) | -| `TRAVELLING` | 出行中 | 已发车 | -| `REVIEWING` | 核单中 | 出行结束待财务核算 | -| `SETTLED` | 已结算 | 财务核算完成 | -| `CANCELLED` | 已取消 | 含退款流程中的订单(refund_status 区分进度) | - -### 6.3 flowStatus(订单细状态) - -**使用字段**:§3.1 出参 / §3.2 出参 / §3.3 main / §3.2 入参过滤 - -> 后端 enum:`com.hulalv.order.core.enums.OrderFlowStatus`,共 **15 项**(v5.49 全量重写:原 13 项支付节奏视角已废,现采 SRS v5.48 §0.4 行 636 业务环节视角,与 SRS 中文 1:1 对齐)。flow_status 列只承载流程细节,不喂状态机;粗态见 §6.2。 - -| 值 | 中文标签 | 说明 | -|----|------|------| -| `AWAITING_PROFILE` | 待补全信息 | 订金到账后默认细态 | -| `AWAITING_HOTEL_SUBMIT` | 待提交房型 | 出行人齐全后等定制师提交房型需求 | -| `AWAITING_HOTEL_CLAIM` | 待抢房 | 房型需求提交后进入抢单池 | -| `HOTEL_IN_PROGRESS` | 房控处理中 | 房控已接单配置中 | -| `HOTEL_NEED_ADJUST` | 房控需调整 | 房控需求调整中 | -| `AWAITING_VEHICLE_SUBMIT` | 待提交用车 | 出行人齐全后等定制师提交用车需求 | -| `VEHICLE_IN_PROGRESS` | 车控处理中 | 车控已接单配置中 | -| `VEHICLE_NEED_ADJUST` | 车控需调整 | 车控需求调整中 | -| `PENDING_CONFIRM` | 待确认 | 房车齐后等定制师确认锁单 | -| `PENDING_DEPARTURE` | 待出行 | 确认锁单后默认细态 | -| `TRAVELLING` | 出行中 | 已发车 | -| `PENDING_REVIEW` | 待核单 | 出行结束等核单 | -| `REVIEWING` | 核单中 | 财务核单中 | -| `SETTLED` | 已结算 | 核单通过 | -| `CANCELLED` | 已取消 | 终态 | - -### 6.4 consultantSource(定制师分配来源) - -**使用字段**:§3.1 出参 / §3.3 main - -> 该字段为字符串而非强枚举类:admin 端硬编码 `MANUAL`;C 端分享下单硬编码 `SHARED`;C 端兜底默认定制师时透传 hl-user-service 派生值(如 `DEFAULT_ASSIGNED` / `ROUND_ROBIN`,由 user-service 决定)。 - -| 值 | 说明 | -|----|------| -| `MANUAL` | admin 端代下单(JWT adminId 即定制师) | -| `SHARED` | C 端客户扫定制师专属分享码下单 | -| `DEFAULT_ASSIGNED` | C 端兜底:hl-user-service 派发默认定制师 | -| `ROUND_ROBIN` | C 端兜底:hl-user-service 轮询派发(未来扩展) | -| `LINK_BOUND` | (DB comment 保留,当前代码路径未实际写入) | - -> ⚠️ 因 user-service 可能新增 source 值,前端**严禁**对该字段穷举判断;展示时未知值兜底为 `MANUAL` 的中文标签即可。 - -### 6.5 paymentMode(支付模式) - -**使用字段**:§3.1 出参 - -| 值 | 说明 | -|----|------| -| `DEPOSIT` | 定金模式(30% 定金 + 余款) | -| `FULL` | 全款模式(100% 一次付清) | - -### 6.6 payType(支付类型) - -**使用字段**:§3.4 出参 `payments[].payType` - -| 值 | 说明 | -|----|------| -| `DEPOSIT` | 定金 | -| `BALANCE` | 尾款 | - -### 6.7 payment status(支付记录状态) - -**使用字段**:§3.4 出参 `payments[].status` - -| 值 | 说明 | -|----|------| -| `SUCCESS` | 成功 | -| `PENDING` | 处理中 | -| `FAIL` | 失败 | - -### 6.8 discount type(优惠类型) - -**使用字段**:§3.4 出参 `discounts[].type` - -| 值 | 说明 | -|----|------| -| `EARLY_BIRD` | 早鸟优惠 | -| `VIP` | VIP 优惠 | -| `COUPON` | 优惠券 | -| `PROMOTION` | 营销活动优惠 | - -### 6.9 discount source(优惠 / 附加费来源) - -**使用字段**:§3.4 出参 `discounts[].source` / `surcharges[].source` - -| 值 | 说明 | -|----|------| -| `MANUAL` | 手动添加(定制师人工) | -| `AUTO` | 系统自动 | -| `HOTEL_ASSIGN` | 配房环节产生(仅 surcharge) | -| `VEHICLE_ASSIGN` | 配车环节产生(仅 surcharge) | - -### 6.10 contractStatus(合同状态) - -**使用字段**:§3.5 出参 `contract.contractStatus` - -| 值 | 说明 | -|----|------| -| `PENDING` | 待生成 | -| `GENERATED` | 已生成待签 | -| `SIGNED` | 已签约 | -| `VOIDED` | 已作废 | - -### 6.11 event type(合同 / 保险事件类型) - -**使用字段**:§3.5 出参 `contract.events[].eventType` / `insurance.events[].eventType` - -| 值 | 说明 | -|----|------| -| `GENERATE` | 合同生成 | -| `SIGN` | 合同签约 | -| `VOID` | 合同作废 | -| `REOPEN` | 合同重开 | -| `ISSUE` | 保险出单 | -| `CANCEL` | 保险退保 | - -### 6.12 insuranceStatus(保险状态) - -**使用字段**:§3.5 出参 `insurance.insuranceStatus` - -| 值 | 说明 | -|----|------| -| `PENDING` | 待出单 | -| `ACTIVE` | 已生效 | -| `FAILED` | 出单失败 | -| `CANCELLED` | 已退保 | - -### 6.13 refund application status(退款申请状态) - -**使用字段**:§3.8 出参 `applications[].status` - -| 值 | 说明 | -|----|------| -| `PENDING_APPROVE` | 待审批 | -| `PENDING_PAYOUT` | 财务已审批,待打款 | -| `PENDING_ARRIVAL` | 已打款,待到账 | -| `COMPLETED` | 退款完成(已到账) | -| `REJECTED` | 已拒绝 | - -### 6.14 refund progress step(退款进度步骤) - -**使用字段**:§3.8 出参 `applications[].progress[].step` - -| 值 | 说明 | -|----|------| -| `APPLY` | 退款申请 | -| `APPROVE` | 财务审批 | -| `PAYOUT` | 退款打款 | -| `ARRIVED` | 到账确认 | - -### 6.15 tag type(标签类型) - -**使用字段**:§3.3 出参 `tags[].type` - -| 值 | 说明 | -|----|------| -| `SYSTEM` | 系统自动打的标签 | -| `PERSONAL` | 定制师手动打的标签 | -| `MANUAL` | 主管手动打的标签 | - -### 6.16 traveler & exception badge(出行人 / 异常态字段) - -`OverviewVO.travelers[]` 的 `travelerType` / `idType` / `profileStatus` 等枚举详见 traveler 模块 §2.1 出行人列表 changelog。 - -`OrderMainVO.exceptionBadges` 9 类布尔标识 / `progressStepper.nodes[].key` / `progressStepper.nodes[].status` 字段含义已在 §3.3 出参说明中列出。 - -### 6.17 transition eventCode(状态机事件代码) - -**使用字段**:§3.14 入参 `eventCode` - -> 后端 enum:`com.hulalv.order.core.enums.OrderEvent`,共 **9 个值**。 -> 状态机由 `OrderStateMachineConfig` **16 条规则**驱动。 - -#### 6.17.1 完整规则表(事件 → 前置态 → 目标态) - -| 事件 | 前置态(orderStatus) | 目标态(orderStatus) | 业务语义 | -|------|---|---|---| -| `PAY_DEPOSIT` | `PENDING_PAY` | `CUSTOMIZING` | 客户支付订金 | -| `PAY_FULL` | `PENDING_PAY` | `CUSTOMIZING` | 客户支付全款 | -| `CANCEL` | `PENDING_PAY` | `CANCELLED` | 未付款取消 | -| `CONFIRM` ⚠️ | `CUSTOMIZING` | `PENDING_DEPARTURE` | **确认锁单**(语义 ①,需先通过 §3.15 checklist)| -| `SET_PENDING_BALANCE` | `PENDING_DEPARTURE` | `PENDING_BALANCE` | 重新开放尾款 / 调整价格 | -| `DEPART` | `PENDING_DEPARTURE` | `TRAVELLING` | 开始出行 | -| `SET_PENDING_DEPARTURE` | `PENDING_BALANCE` | `PENDING_DEPARTURE` | 尾款补齐 | -| `FINISH` | `TRAVELLING` | `REVIEWING` | 结团(进入核单)| -| `CONFIRM` ⚠️ | `REVIEWING` | `SETTLED` | **核单通过 / 确认结算**(语义 ②)| -| `CANCEL` | `CUSTOMIZING` | `CANCELLED` | 定制中取消 | -| `CANCEL` | `TRAVELLING` | `CANCELLED` | 出行中取消 | -| `INITIATE_REFUND` | `CUSTOMIZING` | `CANCELLED` | 定制中发起退款 | -| `INITIATE_REFUND` | `PENDING_DEPARTURE` | `CANCELLED` | 待出行发起退款 | -| `INITIATE_REFUND` | `PENDING_BALANCE` | `CANCELLED` | 待付尾款发起退款 | -| `INITIATE_REFUND` | `REVIEWING` | `CANCELLED` | 核单中发起退款 | -| `INITIATE_REFUND` | `SETTLED` | `CANCELLED` | 已结算售后退款 | - -⚠️ **`CONFIRM` 事件复用 2 种语义**:状态机以「当前粗态 + 事件」找规则,不会冲突,但前端按钮文案要按当前状态判断(CUSTOMIZING 下叫"确认锁单",REVIEWING 下叫"确认结算")。 - -#### 6.17.2 非 transition 业务路径(不走本接口) - -下列业务**不走** `POST /v3/admin/order/{id}/transition`,前端按对应独立接口调用: - -| 业务 | 独立接口 | 备注 | -|---|---|---| -| **核单结算(6 步)** | `PUT /v3/admin/order/{id}/settlement/step1` ~ `step4`
`GET / POST / DELETE /v3/admin/order/{id}/settlement/step5/*`
`POST /v3/admin/order/{id}/settlement/step6/submit`
`GET /v3/admin/order/{id}/settlement/summary` | Step 6 submit 内部事务自动推 `REVIEWING → SETTLED`,前端**不要**自己 fire `eventCode` | -| **退款发起** | 退款专用接口(详见 refund 模块 changelog) | `INITIATE_REFUND` 是 transition 事件,但前端入口走独立退款按钮 | -| **申请解锁** | **v3 已砍** | 原型 UnlockModal 按钮 v3 不实现;前端隐藏对应按钮 | - -### 6.18 transition triggeredEvents(状态机副作用事件) - -**使用字段**:§3.14 出参 `triggeredEvents[]` - -| 值 | 说明 | -|----|------| -| `ASYNC_CONTRACT_GENERATE` | 异步生成电子合同 | -| `ASYNC_INSURANCE_ISSUE` | 异步出保单 | -| `NOTIFY_DRIVER` | 通知司机 | -| `NOTIFY_HOTEL` | 通知酒店确认房态 | -| `NOTIFY_CUSTOMER` | 向客户发出行提醒 | -| `ASYNC_REFUND_APPLY` | 异步发起退款申请 | - -> 副作用异步执行,本接口返回时可能未完成;用 §3.7 status-log Tab 跟踪进度。 - -### 6.19 checklist item code(确认锁单前置 5 项) - -**使用字段**:§3.15 出参 `items[].code` - -| 值 | 说明 | -|----|------| -| `TRAVELER_COMPLETE` | 出行人信息完整(姓名 + 证件 + 手机 + 证件类型齐) | -| `PAYMENT_OK` | 支付状态满足(订金或全款到账) | -| `HOTEL_DONE` | 配房完成(hotel_stage = DONE) | -| `VEHICLE_DONE` | 配车完成(vehicle_stage = DONE) | -| `CONTRACT_TEMPLATE_OK` | 合同模板就绪(产品快照含合同方案) | - -### 6.20 customerChannel(客户通知渠道) - -**使用字段**:§3.15 出参 `preview.notifications.customerChannel` - -| 值 | 说明 | -|----|------| -| `WX` | 仅企微 / 微信 | -| `SMS` | 仅短信 | -| `MIXED` | 双通道(企微 + 短信) | - ---- - -## 11. 影响评估 - -- **是否破坏向后兼容**:否(v3 全新二期,前端 v3 项目仓库首次消费) -- **前端是否必须同步上线**:是 -- **本次推送范围**:§1 模块全 15 接口(§1A 10 接口 + §1B 取消 3 接口 + §1C 状态机+锁单 2 接口),覆盖订单核心全生命周期入口 - ---- - -## 12. 注意事项 - -- **§3.6 itinerary 子接口数据 Mock**:当前返回占位数据,前端按字段结构对接即可,真实化后无需改字段口径 -- **§3.8 / §3.9 条件显示**:`data=null` 时前端不渲染对应 Tab -- **首屏 vs 单 Tab 刷新**:详情页打开用 §3.3 主聚合(一次拿 main + tags + overview);Tab 切换 / 单 Tab 操作完按需调 §3.4 ~ §3.9 -- **公司隔离 581021**:所有 §1 接口均带跨公司隔离校验,前端无需自行过滤 -- **取消订单分支**:出行前走 §3.12 走政策算金额 + 企微 OA 审批;出行中走 §3.13 仅登记返还金额(核单 Step 5 自动拉取实退);前端按 §3.11 预览的 `daysToDeparture` 决定走哪个入口 -- **CONFIRM 锁单**:前端点【确认订单】按钮**必须**先调 §3.15 checklist 拿 `allPassed=true` 再调 §3.14 `eventCode=CONFIRM`,否则后端拒绝(`581063`) - ---- - -## 13. 关联 - -- **API 设计文档**: `docs/order-v3/api/API-SPEC-V5.50.html` §1.1 ~ §1.4 -- **SRS 业务规格**: `docs/order-v3/srs/order-cloud-v3-srs-v5.50.html` §F1 创单 / §1.0i 模型 / §1.3 创单流程 -- **数据库 Schema**: `docs/order-v3/database/DATABASE-SCHEMA-V5.50.html` §1.1 order_main / §1.2 order_tag -- **后端负责人**: @yaosutu - ---- - -## 📝 后续追加计划 - -§1 模块 15 接口全部首推完毕。后续若有接口字段调整 / 错误码新增 / 业务边界变化,通过追加 commit 扩充本文件。 diff --git a/changelogs-v2/2026-05/18_§2_traveler模块-新增接口-管理后台.md b/changelogs-v2/2026-05/18_§2_traveler模块-新增接口-管理后台.md deleted file mode 100644 index d32e50c..0000000 --- a/changelogs-v2/2026-05/18_§2_traveler模块-新增接口-管理后台.md +++ /dev/null @@ -1,1036 +0,0 @@ -# 【新增接口·管理后台】v3 traveler 模块 §2(出行人 + 大交通) - -> **更新时间**: 2026-05-18 -> **端类型**: 管理后台 -> **设计文档版本**: v5.50(API-SPEC / SRS / DETAIL-DESIGN / DATABASE-SCHEMA 4 份 HTML 同步) - ---- - -## 0. 模块全貌 - -| 子模块 | 含接口 | 接口数 | 状态 | -|---|---|---|---| -| **§2A 出行人 admin CRUD** | §2.1 列表 / §2.2 批量编辑 / §2.3 新增 / §2.4 软删 | **4** | ✅ | -| **§2B 大交通批次 admin CRUD** | §2.6.1 列表 / §2.6.2 新增 / §2.6.3 编辑 / §2.6.4 软删 | **4** | ✅ | -| **§2C 动词类操作** | §2.8 smart-parse(⚠️ 待新建,Issue #2526)/ §2.9 validate | **2** | §2.9 ✅,§2.8 ⏳ wx 实现中 | -| **§2 合计** | — | **10** | ✅ 本次推送(§2.8 字段先定,wx 实现后接口可立即对接) | - -> **不在本 changelog 范围内**:§2.7 `GET /v3/internal/order/orders/{orderId}/travelers`(internal Feign 跨服务查出行人 + 解密审计)属于**后端 changelog 范畴**(受众=其他后端服务/运维,不是前端),将单独推到 `hl-backend-changelog` 仓库。 - ---- - -## 1. 接口背景 - -订单服务 v3 traveler 模块(hl-order-service-v3)管理订单关联的**出行人信息**(含敏感字段:身份证 / 手机 / 紧急联系人)+ **大交通批次**(接送站 / 航班 / 火车 / 自驾)。 - -业务边界: -- 出行人不在 §1.1 创单接口里传,创单后通过 §2 单独添加(v4.8 取消占位行模型) -- admin 端明文返回 idNo / phone / emergencyPhone(仅 B 端定制师可见,JWT 鉴权保护) -- 大交通通过 `order_transport_plan_traveler` 桥接表(M:N)关联出行人,支持「一家分两批到达」场景 - -本次推送 §2 模块管理后台 10 个接口,对应管理后台原型 F20 / F21 / F27(详情概览 + 出行人补全 + 接送站 + 大交通登记弹窗)。`§2.7 internal feign` 不在本文档范围(见 §0 说明)。 - ---- - -## 2. 变更清单 - -| # | § | 接口名 | 方法 | 路径 | -|---|---|--------|------|------| -| 1 | 2.1 | 出行人列表 | GET | `/v3/admin/order/{id}/traveler/list` | -| 2 | 2.2 | 出行人批量编辑(upsert) | POST | `/v3/admin/order/{id}/traveler/batch-edit` | -| 3 | 2.3 | 单个出行人新增 | POST | `/v3/admin/order/{id}/traveler/add` | -| 4 | 2.4 | 出行人软删 | POST | `/v3/admin/order/{id}/traveler/{travelerId}/delete` | -| 5 | 2.6.1 | 大交通批次列表 | GET | `/v3/admin/order/{id}/transport-plans` | -| 6 | 2.6.2 | 大交通批次新增 | POST | `/v3/admin/order/{id}/transport-plans` | -| 7 | 2.6.3 | 大交通批次编辑 | PUT | `/v3/admin/order/{id}/transport-plans/{planId}` | -| 8 | 2.6.4 | 大交通批次软删 | DELETE | `/v3/admin/order/{id}/transport-plans/{planId}` | -| 9 | 2.8 ⏳ | 出行人智能批量解析 | POST | `/v3/admin/order/{id}/traveler/smart-parse` | -| 10 | 2.9 | 出行人信息校验 | GET | `/v3/admin/order/{id}/traveler/validate` | - -> §2.7 internal feign 接口不在本表(属后端 changelog)。 - ---- - -## 3. 接口详情 - -> 每个接口自包含:使用场景 / 入参 / 出参 / 错误码 / 业务边界 / 示例。 -> 跨接口共享枚举集中在 §6。 - ---- - -### 3.1 §2.1 出行人列表 - -**路径**:`GET /v3/admin/order/{id}/traveler/list` -**使用场景**:详情页 Tab 1 出行人区块 / F27 出行人补全页 -**认证**:JWT(admin 角色 + 公司隔离) -**敏感字段**:`idNo` / `phone` / `emergencyPhone` **明文返回**(admin JWT 鉴权保护) - -#### 入参 - -`id` (path, Long) — 订单 ID - -#### 出参(`Result>`,每条 16 字段) - -| 字段 | 类型 | 说明 | -|------|------|------| -| `id` | String | 出行人 ID | -| `orderId` | String | 订单 ID | -| `travelerType` | String | 枚举见 §6.1(ADULT / CHILD / YOUNG_CHILD / BABY) | -| `name` | String? | 姓名(占位行为 null) | -| `gender` | String | 枚举见 §6.2(MALE / FEMALE / UNKNOWN) | -| `birthday` | LocalDate? | 出生日期 | -| `idType` | String | 枚举见 §6.3(ID_CARD / PASSPORT / BIRTH_CERT) | -| `idNo` | String? | 证件号(admin 明文) | -| `nationality` | String | 国籍(默认中国) | -| `race` | String | 民族(默认汉族) | -| `phone` | String? | 出行人手机(admin 明文) | -| `emergencyContact` | String? | 紧急联系人姓名 | -| `emergencyPhone` | String? | 紧急联系人电话(admin 明文) | -| `roomGroupNo` | Integer? | 同住分组号 | -| `profileStatus` | String | 枚举见 §6.4(PENDING / COMPLETED) | -| `transportPlanIds` | List\ | 关联的大交通批次 ID 列表 | - -> ⚠️ **transportPlanIds 序列化规则**:后端字段类型 `List`,但 HL 全局 Jackson `NumberSerializer` 会自动把超过 JS 安全整数(2^53-1)的 Long 转 String 输出。大交通批次 ID 是雪花 ID(19 位),**实际响应中一定是 String 数组**;下面示例值 `80012345`(8 位短整数)仅为可读性目的,**生产值类似 `"80012345678901234"`**。前端按 String 数组接收。 - -#### 错误码 - -| code | 含义 | -|------|------| -| `581020` | 订单不存在 | -| `581021` | 无权访问该订单(公司隔离) | - -#### 示例 - -**典型 - 请求**: - -```http -GET /v3/admin/order/60123456789012/traveler/list -Authorization: Bearer {admin_jwt} -``` - -**典型 - 响应**: - -```json -{ - "code": 200, - "data": [ - { - "id": "70123456789012", - "orderId": "60123456789012", - "travelerType": "ADULT", - "name": "张三", - "gender": "MALE", - "birthday": "1985-08-12", - "idType": "ID_CARD", - "idNo": "220103198508121234", - "nationality": "中国", - "race": "汉族", - "phone": "13800002046", - "emergencyContact": "李四", - "emergencyPhone": "13900008888", - "roomGroupNo": 1, - "profileStatus": "COMPLETED", - "transportPlanIds": ["80012345678901234", "80012345678901235"] - }, - { - "id": "70123456789013", - "orderId": "60123456789012", - "travelerType": "CHILD", - "name": null, - "gender": "UNKNOWN", - "birthday": null, - "idType": null, - "idNo": null, - "nationality": "中国", - "race": "汉族", - "phone": null, - "emergencyContact": null, - "emergencyPhone": null, - "roomGroupNo": null, - "profileStatus": "PENDING", - "transportPlanIds": [] - } - ], - "msg": "success" -} -``` - ---- - -### 3.2 §2.2 出行人批量编辑(upsert 语义) - -**路径**:`POST /v3/admin/order/{id}/traveler/batch-edit` -**使用场景**:F27 出行人补全 B 端代填,定制师一次性提交订单内 N 行出行人的字段修改/新增(`id=null` 新增 / `id` 非 null 更新) -**整体事务**:任一行字段校验失败 → 全部回滚 - -#### 入参(`TravelerBatchEditReqVO`) - -| 字段 | 类型 | 必填 | 说明 | 校验规则 | -|------|------|:----:|------|----------| -| `travelers` | List\ | ✅ | 待修改/新增出行人数组 | `@NotEmpty` `@Size(max=30)` | - -`TravelerEditItem`(12 字段): - -| 字段 | 类型 | 必填 | 说明 | -|------|------|:----:|------| -| `id` | Long | ❌ | 出行人 ID(null=新增 / 非 null=更新) | -| `travelerType` | String | 新增必填 | 枚举见 §6.1(更新时 null 保留原值) | -| `name` | String | ❌ | 姓名 | -| `gender` | String | ❌ | 枚举见 §6.2 | -| `birthday` | LocalDate | ❌ | 出生日期 | -| `idType` | String | ❌ | 枚举见 §6.3 | -| `idNo` | String | ❌ | 证件号(明文传) | -| `nationality` | String | ❌ | 国籍(不可为空字符串) | -| `race` | String | ❌ | 民族(不可为空字符串) | -| `phone` | String | ❌ | 手机(明文传) | -| `emergencyContact` | String | ❌ | 紧急联系人姓名 | -| `emergencyPhone` | String | ❌ | 紧急联系人电话(明文传) | -| `roomGroupNo` | Integer | ❌ | 同住分组号 | - -#### 出参(`Result`) - -| 字段 | 类型 | 说明 | -|------|------|------| -| `createdCount` | Integer | 本次新增的出行人数(`id=null` 行) | -| `updatedCount` | Integer | 本次更新的出行人数(`id` 非 null 行) | -| `completedCount` | Integer | 本次操作后变为 COMPLETED 的行数 | -| `pendingCount` | Integer | 仍为 PENDING 的行数 | -| `allCompleted` | Boolean | 该订单所有出行人是否已完善 | - -#### 错误码 - -| code | 含义 | -|------|------| -| `581020` | 订单不存在 | -| `581100` | travelers 列表为空 / 超过 30 | -| `581101` | 字段格式校验失败(idNo 校验和 / phone 格式) | -| `581110` | 更新时出行人 ID 不属于该订单 | -| `581111` | 已签电子合同后禁止改证件号 | -| `581112` | 新增时缺 travelerType | - -#### 业务边界 - -- ✅ **upsert 语义**:单次请求可混合新增 + 更新 -- ✅ **整体事务**:任一行失败回滚 -- ⚠️ **size 上限 30**:超出走分批多次调用 -- ⚠️ **`allCompleted=true` 信号**:所有出行人字段齐 → 触发"已完善"系统标签 / 进入下一阶段 - -#### 示例 - -**典型 - 请求**: - -```http -POST /v3/admin/order/60123456789012/traveler/batch-edit -Authorization: Bearer {admin_jwt} -Content-Type: application/json - -{ - "travelers": [ - { - "id": 70123456789013, - "name": "王小明", - "gender": "MALE", - "birthday": "2018-06-20", - "idType": "ID_CARD", - "idNo": "220103201806201234", - "nationality": "中国", - "race": "汉族", - "phone": "13812342046", - "roomGroupNo": 1 - }, - { - "id": null, - "travelerType": "BABY", - "name": "王小宝", - "gender": "FEMALE", - "birthday": "2024-01-15" - } - ] -} -``` - -**典型 - 响应**: - -```json -{ - "code": 200, - "data": { - "createdCount": 1, - "updatedCount": 1, - "completedCount": 1, - "pendingCount": 1, - "allCompleted": false - }, - "msg": "success" -} -``` - -**异常(证件号格式非法 581101) - 响应**: - -```json -{ "code": 581101, "data": null, "msg": "证件号校验失败(idNo 校验位错误)" } -``` - ---- - -### 3.3 §2.3 单个出行人新增(占位补充) - -**路径**:`POST /v3/admin/order/{id}/traveler/add` -**使用场景**:F27 改人数场景(如临时加 1 个未声明儿童)。**会同步 UPDATE `order_main` 对应人数字段**(adultCount / childCount 等)+ 触发后续:保险重算 / 房车需求需重提示 - -#### 入参(`TravelerCreateReqVO`,12 字段) - -| 字段 | 类型 | 必填 | 说明 | -|------|------|:----:|------| -| `travelerType` | String | ✅ | 枚举见 §6.1 | -| `name` | String | ❌ | 姓名(可后填) | -| `gender` | String | ❌ | 枚举见 §6.2 | -| `birthday` | LocalDate | ❌ | 出生日期 | -| `idType` | String | ❌ | 枚举见 §6.3 | -| `idNo` | String | ❌ | 证件号(明文传) | -| `nationality` | String | ❌ | 国籍(默认中国) | -| `race` | String | ❌ | 民族(默认汉族) | -| `phone` | String | ❌ | 出行人手机(明文传) | -| `emergencyContact` | String | ❌ | 紧急联系人姓名 | -| `emergencyPhone` | String | ❌ | 紧急联系人电话 | -| `roomGroupNo` | Integer | ❌ | 同住分组号 | - -#### 出参(`Result`) - -字段同 §3.1 列表项,含新建行完整字段。 - -#### 错误码 - -| code | 含义 | -|------|------| -| `581020` | 订单不存在 | -| `581115` | 实际人数已等于 `order_main` 声明人数(v4.8 取消占位模型规则) | -| `581116` | 订单状态禁止加人(已结算 / 已取消) | -| `581117` | travelerType 与现有同住分组冲突 | - -#### 业务边界 - -- ✅ **创单后单独添加**:v4.8 取消占位模型,按需 INSERT 新行 -- ⚠️ **人数同步**:自动 UPDATE `order_main.Count` +1 -- ⚠️ **应用层数量检查**:实际人数 ≥ 声明人数 → `581115`,需要先调整人数声明再加人 - -#### 示例 - -**典型 - 请求**: - -```http -POST /v3/admin/order/60123456789012/traveler/add -Authorization: Bearer {admin_jwt} -Content-Type: application/json - -{ - "travelerType": "CHILD", - "name": "王小明", - "gender": "MALE", - "birthday": "2018-06-20", - "idType": "ID_CARD", - "idNo": "220103201806201234", - "phone": "13812342046", - "roomGroupNo": 1 -} -``` - -**典型 - 响应**: - -```json -{ - "code": 200, - "data": { - "id": "70123456789013", - "orderId": "60123456789012", - "travelerType": "CHILD", - "name": "王小明", - "gender": "MALE", - "birthday": "2018-06-20", - "idType": "ID_CARD", - "idNo": "220103201806201234", - "nationality": "中国", - "race": "汉族", - "phone": "13812342046", - "emergencyContact": null, - "emergencyPhone": null, - "roomGroupNo": 1, - "profileStatus": "COMPLETED", - "transportPlanIds": [] - }, - "msg": "success" -} -``` - -**异常(人数已满 581115) - 响应**: - -```json -{ "code": 581115, "data": null, "msg": "实际人数已达声明上限,请先调整人数再添加" } -``` - ---- - -### 3.4 §2.4 出行人软删 - -**路径**:`POST /v3/admin/order/{id}/traveler/{travelerId}/delete` -**使用场景**:F27 改人数场景(如取消同行 1 人) -**关联**:同步 UPDATE `order_main` 对应人数 -1 + 解除其在 `order_transport_plan_traveler` 桥接表中所有关联 -**约束**:**已签电子合同的订单禁止删人** - -#### 入参 - -| 字段 | 类型 | 必填 | 说明 | -|------|------|:----:|------| -| `id` | Long | ✅ | 订单 ID(path) | -| `travelerId` | Long | ✅ | 出行人 ID(path) | - -#### 出参(`Result`) - -返回 `true` 表示软删成功。 - -#### 错误码 - -| code | 含义 | -|------|------| -| `581020` | 订单不存在 | -| `581110` | 出行人不属于该订单 | -| `581106` | 已签电子合同,禁止删除出行人(DB 段位让位:581119 已被 `TRAVELER_ID_CARD_DUPLICATE` 占用,文档原 581119 让位至此) | -| `581107` | 出行人是订单最后 1 位成人,禁止删除(DB 段位让位:581120 已被 `TRANSPORT_PLAN_NOT_FOUND` 占用,文档原 581120 让位至此) | - -#### 业务边界 - -- ✅ **软删**:UPDATE `order_traveler.deleted=1`,不真删 -- ✅ **级联解除桥接**:UPDATE `order_transport_plan_traveler.deleted=1` -- ❌ **已签合同禁删**:合同强约束 → `581106` -- ❌ **最后成人禁删**:保留至少 1 位成人 → `581107` - -#### 示例 - -**典型 - 请求**: - -```http -POST /v3/admin/order/60123456789012/traveler/70123456789013/delete -Authorization: Bearer {admin_jwt} -``` - -**典型 - 响应**: - -```json -{ "code": 200, "data": true, "msg": "success" } -``` - -**异常(已签合同 581106) - 响应**: - -```json -{ "code": 581106, "data": null, "msg": "订单已签电子合同,禁止删除出行人" } -``` - ---- - -### 3.5 §2.6.1 大交通批次列表 - -**路径**:`GET /v3/admin/order/{id}/transport-plans` -**使用场景**:F21 行程安排 Tab "接送站"区块 -**业务模型**:一个订单可有 N 个批次(实现"一家分两批到达"),按 `direction` 分 ARRIVAL / DEPARTURE - -#### 入参 - -`id` (path, Long) — 订单 ID - -#### 出参(`Result>`) - -每条 16 字段 + travelers 嵌套: - -| 字段 | 类型 | 说明 | -|------|------|------| -| `id` | String | 批次 ID | -| `orderId` | String | 订单 ID | -| `direction` | String | 枚举见 §6.5(ARRIVAL / DEPARTURE) | -| `mode` | String | 枚举见 §6.6(TOGETHER / SEPARATE) | -| `transportType` | String | 枚举见 §6.7(FLIGHT / TRAIN / SELF_DRIVE) | -| `transportNo` | String? | 航班号 / 车次号;SELF_DRIVE 时为空 | -| `carrier` | String? | 航司 / 铁路公司 | -| `departStation` | String? | 出发站 | -| `arriveStation` | String? | 到达站 | -| `departTime` | LocalDateTime? | 出发时间(FLIGHT/TRAIN 必有;SELF_DRIVE 为空) | -| `arriveTime` | LocalDateTime? | 到达时间(同上) | -| `selfDrivePeriod` | String? | 枚举见 §6.8(仅 SELF_DRIVE) | -| `selfDriveEta` | LocalDateTime? | 自驾预计到达时间(仅 SELF_DRIVE 可选) | -| `pickupRequired` | Boolean? | 是否需要接送 | -| `pickupRemark` | String? | 接送备注 | -| `travelers` | List\<{id, name}\> | 关联出行人简要(桥接表 JOIN) | -| `remark` | String? | 备注 | - -#### 错误码 - -| code | 含义 | -|------|------| -| `581020` | 订单不存在 | -| `581021` | 无权访问该订单 | - -#### 示例 - -**典型 - 请求**: - -```http -GET /v3/admin/order/60123456789012/transport-plans -Authorization: Bearer {admin_jwt} -``` - -**典型 - 响应**: - -```json -{ - "code": 200, - "data": [ - { - "id": "80012345", - "orderId": "60123456789012", - "direction": "ARRIVAL", - "mode": "TOGETHER", - "transportType": "FLIGHT", - "transportNo": "CA1234", - "carrier": "中国国际航空", - "departStation": "北京首都T3", - "arriveStation": "长春龙嘉", - "departTime": "2026-06-01T08:30:00", - "arriveTime": "2026-06-01T10:15:00", - "selfDrivePeriod": null, - "selfDriveEta": null, - "pickupRequired": true, - "pickupRemark": "需在 T3 出口举牌接机", - "travelers": [ - {"id": "70123456789012", "name": "张三"}, - {"id": "70123456789013", "name": "王小明"} - ], - "remark": "需要接机举牌" - }, - { - "id": "80012346", - "orderId": "60123456789012", - "direction": "DEPARTURE", - "mode": "TOGETHER", - "transportType": "SELF_DRIVE", - "transportNo": null, - "carrier": null, - "departStation": null, - "arriveStation": null, - "departTime": null, - "arriveTime": null, - "selfDrivePeriod": "AFTERNOON", - "selfDriveEta": "2026-06-05T15:00:00", - "pickupRequired": false, - "pickupRemark": null, - "travelers": [ - {"id": "70123456789012", "name": "张三"} - ], - "remark": null - } - ], - "msg": "success" -} -``` - ---- - -### 3.6 §2.6.2 大交通批次新增 - -**路径**:`POST /v3/admin/order/{id}/transport-plans` -**使用场景**:F21 大交通登记弹窗 - 新增 -**桥接表维护**:同事务 INSERT `order_transport_plan_traveler`(每个 plan 必须关联至少 1 名出行人) - -#### 入参(`TransportPlanReqVO`,11 字段) - -| 字段 | 类型 | 必填 | 说明 | -|------|------|:----:|------| -| `direction` | String | ✅ | 枚举见 §6.5 | -| `transportType` | String | ✅ | 枚举见 §6.7 | -| `transportNo` | String | 条件 | 航班号 / 车次号;SELF_DRIVE 时为空 | -| `carrier` | String | ❌ | 航司 / 铁路公司 | -| `departStation` / `arriveStation` | String | ❌ | 出发 / 到达站 | -| `departTime` / `arriveTime` | LocalDateTime | 条件 | FLIGHT/TRAIN 必填;SELF_DRIVE 为空 | -| `selfDrivePeriod` | String | 条件 | 枚举见 §6.8,仅 SELF_DRIVE | -| `selfDriveEta` | LocalDateTime | ❌ | 仅 SELF_DRIVE 可选 | -| `travelerIds` | List\ | ✅ | 关联出行人 ID(至少 1 个) | -| `remark` | String | ❌ | 备注(≤500) | - -#### 出参(`Result`) - -字段同 §3.5 列表项。 - -#### 错误码 - -| code | 含义 | -|------|------| -| `581020` | 订单不存在 | -| `581140` | 字段组合非法(FLIGHT 缺航班号 / SELF_DRIVE 错带 transportNo 等) | -| `581141` | `travelerIds` 含订单外的出行人 | -| `581142` | 出发时间晚于到达时间 | -| `581143` | 同方向同一出行人已在另一 plan | - -#### 业务边界 - -- ✅ **字段组合校验**:FLIGHT/TRAIN 需 transportNo + 出发/到达时间;SELF_DRIVE 不传 transportNo,可传 selfDrivePeriod + selfDriveEta -- ⚠️ **桥接约束**:同方向同一出行人只能在 1 个 plan,不同方向各 1 个 - -#### 示例 - -**典型(航班 ARRIVAL) - 请求**: - -```http -POST /v3/admin/order/60123456789012/transport-plans -Authorization: Bearer {admin_jwt} -Content-Type: application/json - -{ - "direction": "ARRIVAL", - "transportType": "FLIGHT", - "transportNo": "CA1234", - "carrier": "中国国际航空", - "departStation": "北京首都T3", - "arriveStation": "长春龙嘉", - "departTime": "2026-06-01T08:30:00", - "arriveTime": "2026-06-01T10:15:00", - "travelerIds": [70123456789012, 70123456789013], - "remark": "需要接机举牌" -} -``` - -**典型 - 响应**: - -```json -{ - "code": 200, - "data": { - "id": "80012345", - "orderId": "60123456789012", - "direction": "ARRIVAL", - "mode": "TOGETHER", - "transportType": "FLIGHT", - "transportNo": "CA1234", - "carrier": "中国国际航空", - "departStation": "北京首都T3", - "arriveStation": "长春龙嘉", - "departTime": "2026-06-01T08:30:00", - "arriveTime": "2026-06-01T10:15:00", - "selfDrivePeriod": null, - "selfDriveEta": null, - "pickupRequired": null, - "pickupRemark": null, - "travelers": [ - {"id": "70123456789012", "name": "张三"}, - {"id": "70123456789013", "name": "王小明"} - ], - "remark": "需要接机举牌" - }, - "msg": "success" -} -``` - -**异常(自驾错带 transportNo 581140) - 响应**: - -```json -{ "code": 581140, "data": null, "msg": "SELF_DRIVE 类型不应传 transportNo" } -``` - ---- - -### 3.7 §2.6.3 大交通批次编辑 - -**路径**:`PUT /v3/admin/order/{id}/transport-plans/{planId}` -**使用场景**:F21 大交通登记弹窗 - 编辑(全量覆盖含 travelerIds) -**事务**:UPDATE plan + DELETE+INSERT 重建桥接表 - -#### 入参 - -| 字段 | 类型 | 必填 | 说明 | -|------|------|:----:|------| -| `id` | Long | ✅ | 订单 ID(path) | -| `planId` | Long | ✅ | 批次 ID(path) | -| Body | `TransportPlanReqVO` | ✅ | 同 §3.6 字段(全量覆盖语义) | - -#### 出参(`Result`) - -字段同 §3.5。 - -#### 错误码 - -| code | 含义 | -|------|------| -| `581140` ~ `581143` | 同 §3.6 字段组合校验 | -| `581144` | plan 不存在 / 不属于该订单 | - -#### 业务边界 - -- ⚠️ **全量覆盖语义**:所有 Req 字段都会替换原值,包括 `travelerIds` -- ⚠️ **桥接表重建**:旧 `order_transport_plan_traveler` 行 DELETE,按新 `travelerIds` INSERT - -#### 示例 - -**典型 - 请求**: - -```http -PUT /v3/admin/order/60123456789012/transport-plans/80012345 -Authorization: Bearer {admin_jwt} -Content-Type: application/json - -{ - "direction": "ARRIVAL", - "transportType": "FLIGHT", - "transportNo": "CA1235", - "carrier": "中国国际航空", - "departStation": "北京首都T3", - "arriveStation": "长春龙嘉", - "departTime": "2026-06-01T10:30:00", - "arriveTime": "2026-06-01T12:15:00", - "travelerIds": [70123456789012], - "remark": "改签后的航班" -} -``` - -**典型 - 响应**: - -```json -{ - "code": 200, - "data": { - "id": "80012345", - "direction": "ARRIVAL", - "transportType": "FLIGHT", - "transportNo": "CA1235", - "departTime": "2026-06-01T10:30:00", - "arriveTime": "2026-06-01T12:15:00", - "travelers": [{"id": "70123456789012", "name": "张三"}], - "remark": "改签后的航班" - }, - "msg": "success" -} -``` - ---- - -### 3.8 §2.6.4 大交通批次软删 - -**路径**:`DELETE /v3/admin/order/{id}/transport-plans/{planId}` -**使用场景**:F21 大交通登记弹窗 - 删除 -**事务**:UPDATE `order_transport_plan.deleted=1` + UPDATE 桥接表 deleted=1 - -#### 入参 - -| 字段 | 类型 | 必填 | 说明 | -|------|------|:----:|------| -| `id` | Long | ✅ | 订单 ID(path) | -| `planId` | Long | ✅ | 批次 ID(path) | - -#### 出参(`Result`) - -返回 `true` 表示软删成功。 - -#### 错误码 - -| code | 含义 | -|------|------| -| `581144` | plan 不存在 / 不属于该订单 | - -#### 示例 - -**典型 - 请求**: - -```http -DELETE /v3/admin/order/60123456789012/transport-plans/80012345 -Authorization: Bearer {admin_jwt} -``` - -**典型 - 响应**: - -```json -{ "code": 200, "data": true, "msg": "success" } -``` - ---- - -### 3.9 §2.8 出行人智能批量解析 ⏳ - -**路径**:`POST /v3/admin/order/{id}/traveler/smart-parse` -**使用场景**:F27 出行人补全 / 一键导入弹窗。定制师粘贴多行文本(姓名+证件号+手机号),后端解析为结构化出行人列表,校验后批量入库 -**状态**:⏳ **wx 待实现**(Issue [#2526](https://git.1814.love:8443/wx/HL/issues/2526))。本节字段先定,wx 实现完即可对接 - -#### 入参(`TravelerSmartParseReqVO`) - -| 字段 | 类型 | 必填 | 说明 | -|------|------|:----:|------| -| `id` | Long | ✅ | 订单 ID(path) | -| `rawText` | String | ✅ | 粘贴的多行原文(≤ 20000 字符) | -| `dryRun` | Boolean | ❌ | true=仅解析不入库(默认 false=解析+入库) | - -#### 出参(`Result`) - -| 字段 | 类型 | 说明 | -|------|------|------| -| `successCount` | Integer | 解析成功并入库的行数 | -| `failCount` | Integer | 解析失败的行数 | -| `successList` | List\ | 成功创建的出行人列表(结构同 §3.1);dryRun=true 时不含 id | -| `failures` | List\ | 失败明细:`{lineIndex, maskedSnippet, reason}` | - -#### 错误码 - -| code | 含义 | -|------|------| -| `581131` | 原文超长(> 20000 字符)(DB 段位让位:原文档 581120 已被 `TRANSPORT_PLAN_NOT_FOUND` 占用) | -| `581132` | 原文为空或全行无法解析(DB 段位让位:原文档 581121 改至此) | -| `100501` | 限流触发(10 次/分钟)—— 走 HL 全局 `CommonErrorCode.RATE_LIMITED`,不在 traveler 段位 | -| `581134` | 订单状态不允许批量导入(已结算 / 已取消)(DB 段位让位:原文档 581123 改至此) | - -#### 业务边界 + 审计安全 - -- ✅ **限流**:每 admin 10 次/分钟(`@RateLimiter(count=10, time=60)`) -- ✅ **PII 不落审计**:接口**不挂** `@OperationLog`(避免明文 idNo/phone 写入 audit_log) -- ✅ **错误行脱敏**:`failures[].maskedSnippet` 严格脱敏(idNo 前 6 后 4、phone 前 3 后 4) -- ⚠️ **dryRun=true**:纯解析不落库,前端可用作"试解析预览" -- ⚠️ **dryRun=false**:解析+入库一次完成,INSERT N 行 `order_traveler` + UPDATE `order_main.Count` 同事务 - -#### 示例 - -**典型 - 请求**: - -```http -POST /v3/admin/order/60123456789012/traveler/smart-parse -Authorization: Bearer {admin_jwt} -Content-Type: application/json - -{ - "rawText": "张三 350101199001011234 13800138000\n李四 13900139000 110101199201021235\n王五 110101****1234 138****8765", - "dryRun": false -} -``` - -**典型 - 响应**: - -```json -{ - "code": 200, - "data": { - "successCount": 2, - "failCount": 1, - "successList": [ - {"id": "70123456789014", "name": "张三", "travelerType": "ADULT", "profileStatus": "COMPLETED"}, - {"id": "70123456789015", "name": "李四", "travelerType": "ADULT", "profileStatus": "COMPLETED"} - ], - "failures": [ - {"lineIndex": 3, "maskedSnippet": "王五 110101****1234 138****8765", "reason": "身份证号校验失败"} - ] - }, - "msg": "success" -} -``` - -**异常(限流 100501) - 响应**: - -```json -{ "code": 100501, "data": null, "msg": "请求过于频繁,请稍后再试" } -``` - ---- - -### 3.10 §2.9 出行人信息校验 - -**路径**:`GET /v3/admin/order/{id}/traveler/validate` -**使用场景**:支付前 / 锁单前置校验(同 §1.8 confirm-checklist 的 `TRAVELER_COMPLETE` 项底层依赖) -**校验维度**:(1) 实际出行人数 = 订单声明人数;(2) 每个出行人字段齐全(姓名+身份证+手机+证件类型) - -#### 入参 - -`id` (path, Long) — 订单 ID - -#### 出参(`Result`) - -| 字段 | 类型 | 说明 | -|------|------|------| -| `passed` | Boolean | 是否全部通过 | -| `declaredCount` | Integer | 订单声明人数(含所有人群类型) | -| `actualCount` | Integer | 实际 `order_traveler` 行数(未软删) | -| `countMismatch` | Boolean | 人数是否不一致 | -| `incompleteList` | List\ | 字段不完整的出行人 | - -`IncompleteTravelerVO`: - -| 字段 | 类型 | 说明 | -|------|------|------| -| `travelerId` | String | 出行人 ID | -| `name` | String | 姓名(脱敏,如 `张*`) | -| `missingFields` | List\ | 缺失字段名列表(如 `["idNo", "phone"]`) | - -#### 错误码 - -| code | 含义 | -|------|------| -| `581124` | 订单不存在 | - -#### 业务边界 - -- ✅ **只读校验**:不入库、不改状态 -- ⚠️ **`incompleteList[].name` 脱敏**:响应里姓名仅留首字(如 `张*`),不暴露完整姓名 -- ⚠️ **必填判定**:缺 `name` / `idType` / `idNo` / `phone` 任一即进 `incompleteList` - -#### 示例 - -**典型(未通过) - 请求**: - -```http -GET /v3/admin/order/60123456789012/traveler/validate -Authorization: Bearer {admin_jwt} -``` - -**典型(未通过) - 响应**: - -```json -{ - "code": 200, - "data": { - "passed": false, - "declaredCount": 3, - "actualCount": 2, - "countMismatch": true, - "incompleteList": [ - {"travelerId": "70123456789013", "name": "张*", "missingFields": ["idNo", "phone"]} - ] - }, - "msg": "success" -} -``` - -**典型(通过) - 响应**: - -```json -{ - "code": 200, - "data": { - "passed": true, - "declaredCount": 3, - "actualCount": 3, - "countMismatch": false, - "incompleteList": [] - }, - "msg": "success" -} -``` - ---- - -## 6. 枚举 / 数据字典 - -> 跨接口共享枚举集中列出,按字段分组,标注「使用字段在哪里」。 - -### 6.1 travelerType(出行人类型) - -**使用字段**:§3.1 / §3.2 / §3.3 / §3.9 出入参 `travelerType` - -| 值 | 说明 | -|----|------| -| `ADULT` | 成人 | -| `CHILD` | 儿童(有床) | -| `YOUNG_CHILD` | 幼儿(无床/占座) | -| `BABY` | 婴儿(无座) | - -### 6.2 gender(性别) - -**使用字段**:§3.1 / §3.2 / §3.3 / §3.9 出入参 `gender` - -| 值 | 说明 | -|----|------| -| `MALE` | 男 | -| `FEMALE` | 女 | -| `UNKNOWN` | 未填 | - -### 6.3 idType(证件类型) - -**使用字段**:§3.1 / §3.2 / §3.3 / §3.9 出入参 `idType` - -| 值 | 说明 | -|----|------| -| `ID_CARD` | 居民身份证 | -| `PASSPORT` | 护照 | -| `BIRTH_CERT` | 出生证明 | - -### 6.4 profileStatus(资料完善状态) - -**使用字段**:§3.1 / §3.3 / §3.9 出参 `profileStatus` - -| 值 | 说明 | -|----|------| -| `PENDING` | 字段未齐全 | -| `COMPLETED` | 字段已齐全 | - -### 6.5 direction(大交通方向) - -**使用字段**:§3.5 / §3.6 / §3.7 出入参 `direction` - -| 值 | 说明 | -|----|------| -| `ARRIVAL` | 到达(去程) | -| `DEPARTURE` | 返程(离开) | - -### 6.6 mode(大交通模式) - -**使用字段**:§3.5 出参 `mode` - -| 值 | 说明 | -|----|------| -| `TOGETHER` | 一起到达 / 返程 | -| `SEPARATE` | 分批到达 / 返程(一家分两批场景) | - -### 6.7 transportType(交通工具类型) - -**使用字段**:§3.5 / §3.6 / §3.7 出入参 `transportType` - -| 值 | 说明 | -|----|------| -| `FLIGHT` | 航班 | -| `TRAIN` | 火车 | -| `SELF_DRIVE` | 自驾 | - -### 6.8 selfDrivePeriod(自驾时段) - -**使用字段**:§3.5 / §3.6 / §3.7 出入参 `selfDrivePeriod`(仅 SELF_DRIVE 类型) - -| 值 | 说明 | -|----|------| -| `MORNING` | 上午 | -| `AFTERNOON` | 下午 | -| `EVENING` | 晚上 | - -### 6.9 missingFields(缺失字段名) - -**使用字段**:§3.10 出参 `incompleteList[].missingFields[]` - -可能值(与 §3.1 字段名一致):`name` / `idType` / `idNo` / `phone` - ---- - -## 11. 影响评估 - -- **是否破坏向后兼容**:否(v3 全新二期,前端 v3 项目仓库首次消费) -- **前端是否必须同步上线**:是 -- **本次推送范围**:§2 模块管理后台 10 接口(含 §2.8 smart-parse 字段先定,wx 实现后立即可对接)。§2.7 internal feign 走后端 changelog 仓库,不在本表。 - ---- - -## 12. 注意事项 - -- **§2.8 smart-parse 待 wx 新建(Issue [#2526](https://git.1814.love:8443/wx/HL/issues/2526))**:前端可先按本文字段对接 UI,wx 实现完接口立即可调;接口字段已确定不会变 -- **敏感字段明文返回**:§2.1 / §2.3 / §2.8 / §2.9 admin 接口返回 `idNo` / `phone` / `emergencyPhone` 明文,前端拿到后**不要**写本地 log / 不要塞 URL query;§2.9 `incompleteList[].name` 已脱敏 -- **桥接表约束**:§3.6 / §3.7 大交通批次新增/编辑时同方向同一出行人只能在 1 个 plan(错则 `581143`) -- **删人合同强约束**:§3.4 已签电子合同后禁止删人 → `581106` -- **`/v3/admin/**` 公司隔离**:所有 admin 接口均带跨公司隔离校验,跨公司访问返 `581021`,前端无需自行过滤 - ---- - -## 13. 关联 - -- **API 设计文档**: `docs/order-v3/api/API-SPEC-V5.50.html` §2.1 ~ §2.9(v5.50 阶段已对齐 v3 代码现状) -- **SRS 业务规格**: `docs/order-v3/srs/order-cloud-v3-srs-v5.50.html` §1.0i 出行人模型 / §2 大交通 -- **数据库 Schema**: `docs/order-v3/database/DATABASE-SCHEMA-V5.50.html`(`order_traveler` / `order_transport_plan` / `order_transport_plan_traveler` / `order_decrypt_audit_log`) -- **§1 总 changelog**(订单核心模块): `changelogs-v2/2026-05/18_§1_订单核心模块-新增接口-管理后台.md`(详情主聚合 §1.3.1 引用本模块 §2.1 TravelerVO 字段口径) -- **§2.7 internal feign 单独走后端 changelog**: 待推 `hl-backend-changelog/.../18_§2.7_traveler-internal-feign-新增接口.md`(受众=合同 / 保险服务) -- **关联 Issue**:[#2517](https://git.1814.love:8443/wx/HL/issues/2517) ~ [#2527](https://git.1814.love:8443/wx/HL/issues/2527) 11 个(含 §2.7 [#2525](https://git.1814.love:8443/wx/HL/issues/2525) internal feign 单独走后端 changelog),全部 assign wx;§2.8 [#2526](https://git.1814.love:8443/wx/HL/issues/2526) 为 0→1 新建 -- **后端负责人**: @yaosutu / 实施 @wx diff --git a/changelogs-v2/2026-05/19_#2586_contract-insurance-fillin.md b/changelogs-v2/2026-05/19_#2586_contract-insurance-fillin.md deleted file mode 100644 index 21ab1a1..0000000 --- a/changelogs-v2/2026-05/19_#2586_contract-insurance-fillin.md +++ /dev/null @@ -1,209 +0,0 @@ -# 合同/保险模块 TODO 接通 — 从占位 → 完整可用 (工单 #2586) - -> **存放目录**: 二期(v3, `order-v3` 标签)→ `changelogs-v2/2026-05/` -> -> **服务**: hl-order-v3 (端口 8084 / 测试服 9443 网关 + `/v3/admin/...`) -> **PR**: #2590 (主体) + #2591 (CR 跟进) + #2603 (P2/P3 + Publisher 接入) -> **Issue**: #2586 -> **日期**: 2026-05-19 -> **影响范围**: 管理后台「合同」「保险」两大模块全部接口 + 「订单状态机 CONFIRM 转换」副作用 - ---- - -## ⚠️ 关键变化(前端必看 4 点) - -### 1. 合同 / 保险模块从「占位返空 / 抛异常」转为「完整可用」(行为变化,非破坏性) - -PR #2590 之前合同 / 保险服务的所有写接口都返 `UnsupportedOperationException` 占位,查询接口返空列表 + `log.warn TODO`。本次合并后**全部真实可用**: - -- `POST /v3/admin/contract/create-by-scheme` 合同按方案创建 — 真实创建并接入第三方合同平台(12301 / 腾讯电子签) -- `POST /v3/admin/insurance/purchase` 手动投保 — 真实写 `insurance_order` + 调宝游 API -- `POST /v3/admin/insurance/auto-purchase` / `auto-purchase-by-scheme` 自动投保 — 真实链路 -- `POST /v3/admin/contract/resend-sign-sms` 重发签署短信 — 真实做用户归属校验 -- `POST /v3/admin/contract/void/{id}` 作废 — 真实状态流转 -- 列表 / 详情 / scheme 列表 — 全部返真实数据 - -**前端可解除**任何针对这些接口的"待后端实现"占位提示,按真实响应处理。 - -### 2. `POST /v3/admin/insurance/purchase` 新增订单状态校验(业务规则收紧) - -只允许以下组合的订单投保: - -| 维度 | 允许值 | -|------|-------| -| `orderStatus` | `PENDING_DEPARTURE` / `PENDING_BALANCE` / `TRAVELLING` | -| `payStatus` | `DEPOSIT_PAID` / `FULLY_PAID` | - -任一不符 → 返业务码 `540022` `ORDER_NOT_CONFIRMED_FOR_INSURANCE` 文案 `"请先确认订单后再配置保险(当前订单状态不允许投保)"`。 - -**前端处理建议**: -- 投保按钮的可点击态可加前置判断(不必依赖后端报错才提示) -- 若直接拦不到,把 540022 错误码处理成 toast 弹该文案即可 - -### 3. `POST /v3/admin/order/{id}/transition` event=CONFIRM 自动触发合同 / 保险创建(异步) - -订单状态机 `CUSTOMIZING → PENDING_DEPARTURE` 的 CONFIRM 转换会**异步**触发: -- 自动创建合同(前提:`contract_scheme.status=ACTIVE` 且 `contract_template_code` 配置过) -- 自动投保(前提:`insurance_scheme.status=ACTIVE`) - -接口同步返回 `triggeredEvents: ["ASYNC_CONTRACT_GENERATE", "ASYNC_INSURANCE_ISSUE"]`,**真正写库发生在事务 commit 后异步线程**(`@TransactionalEventListener(AFTER_COMMIT)`)。 - -**前端表现**: -- CONFIRM 转换 200 返回后,不要立刻显示「合同已生成 / 保险已购买」(异步还没跑完) -- 建议 transition 200 后 toast 提示「订单已确认,合同/保险将在 1 分钟内自动生成」,然后等用户主动刷新合同列表 / 保险列表看到记录 -- 自动签约失败时合同/保险域有内部紧急待办 + 通知中心推送(通知中心走 NotificationDispatcher,渠道在 `notification_event_config` 配) - -### 4. 出行人变更触发合同 / 保险作废+重做(已签约订单) - -`TravelerService` 的 5 个写方法(`batchEdit` / `add` / `delete` / `addByInternal` / `updateByInternal`)末尾按状态白名单异步发布 `TravelerChangedEvent`: - -| 订单 orderStatus | 是否触发作废重做 | -|---|---| -| `PENDING_DEPARTURE` / `PENDING_BALANCE` / `TRAVELLING` | ✅ 触发:作废旧合同 + 重新签约;作废旧保单 + 重投 | -| `CUSTOMIZING` / `PENDING_PAY` / `PENDING_COMPLETE` 等未签约 | ❌ 不触发(避免事件风暴) | -| `REVIEWING` / `SETTLED` / `CANCELLED` | ❌ 不触发 | - -**前端表现**:已签约订单编辑出行人后,合同 / 保险记录会自动作废并重新生成(异步),用户应感知到合同 PDF / 保单号变化。建议在出行人编辑成功后给一个 toast:「已签约订单编辑出行人将触发合同/保险重新生成」。 - ---- - -## 一、背景 - -订单 v3 的 contract / insurance 域骨架在 yst 早期 PR 已从 v2 搬运,但接通订单核心域(`OrderInfoMapper` / `OrderTravelerMapper`)的位置全部以 `TODO(PR-order-core)` 占位,方法体抛 `UnsupportedOperationException` 或返 `Collections.emptyList()`。 - -PR #2552-2554 出行人三连完成后,`OrderInfoMapper` / `OrderTravelerMapper` 已在 v3 落位,本工单收尾 — 把 contract / insurance 完整对接、激活 publisher、补全单测、修复 CR 三轮深审找出的 3 P0 + 5 P1 + 10 P2/P3 + 3 P3-NEW。 - ---- - -## 二、变更接口清单 - -### 合同模块(admin) - -| # | 接口 | 方法 | 路径 | 变更类型 | -|---|------|------|------|---------| -| 1 | 合同方案列表(启用) | GET | `/v3/admin/contract/scheme/list` | 行为变化(返真实数据) | -| 2 | 合同列表 | GET | `/v3/admin/contract/list` | 行为变化 | -| 3 | 按方案创建合同 | POST | `/v3/admin/contract/create-by-scheme` | 行为变化(真实写库 + 第三方调用) | -| 4 | 重发签署短信 | POST | `/v3/admin/contract/resend-sign-sms` | 行为变化(接入用户归属校验) | -| 5 | 作废合同 | POST | `/v3/admin/contract/void/{contractId}` | 行为变化 | -| 6 | 合同方案 CRUD | POST | `/v3/admin/contract/scheme/*` | 新增 `defaultDestination` / `defaultDepartureCity` 字段 | - -### 合同模块(mp 内部) - -| # | 接口 | 方法 | 路径 | 变更类型 | -|---|------|------|------|---------| -| 7 | 用户合同列表 | GET | `/internal/mp/contract/list` | 行为变化(按 userId 反查 orderIds) | -| 8 | 用户合同详情 | GET | `/internal/mp/contract/detail/{contractId}` | 行为变化(接入归属校验) | - -### 保险模块(admin) - -| # | 接口 | 方法 | 路径 | 变更类型 | -|---|------|------|------|---------| -| 9 | 保险方案列表(启用) | GET | `/v3/admin/insurance/scheme/list` | 行为变化 | -| 10 | 保单列表 | GET | `/v3/admin/insurance/orders` | 行为变化 | -| 11 | 手动投保 | POST | `/v3/admin/insurance/purchase` | 行为变化 + **状态校验新增** | -| 12 | 自动投保 | POST | `/v3/admin/insurance/auto-purchase` | 行为变化 | -| 13 | 按方案自动投保 | POST | `/v3/admin/insurance/auto-purchase-by-scheme` | 行为变化 | -| 14 | 取消保险 | POST | `/v3/admin/insurance/cancel` | 行为变化 | -| 15 | 投保预览 | POST | `/v3/admin/insurance/preview-apply` | 行为变化 | - -### 订单状态机副作用 - -| # | 接口 | 方法 | 路径 | 变更类型 | -|---|------|------|------|---------| -| 16 | 订单状态流转 | POST | `/v3/admin/order/{id}/transition` | **CONFIRM 事件副作用扩展**:异步触发自动签约/投保 | -| 17 | 出行人 batchEdit | POST | `/v3/admin/order/{id}/traveler/batch-edit` | 已签约阶段触发作废重做 | -| 18 | 出行人 add | POST | `/v3/admin/order/{id}/traveler/add` | 同上 | -| 19 | 出行人 delete | POST | `/v3/admin/order/{id}/traveler/delete/{travelerId}` | 同上 | - ---- - -## 三、字段变更(合同方案) - -`ContractScheme` 实体新增 2 个字段(对应表 `contract_scheme`): - -| 字段名 | 类型 | 含义 | 业务规则 | -|--------|------|------|---------| -| `defaultDestination` | varchar(64) NULL | 方案默认目的地 | createByScheme 时取值优先级:scheme.defaultDestination → productName 关键字提取(呼伦贝尔/阿尔山/新疆/内蒙古/青海/西藏等) → 全局兜底「内蒙古呼伦贝尔」 | -| `defaultDepartureCity` | varchar(64) NULL | 方案默认出发地 | 同上,全局兜底「呼和浩特」 | - -**前端影响**:admin 合同方案管理表单加 2 个文本输入框(选填)。 - ---- - -## 四、错误码新增 - -| 业务码 | 文案 | 触发条件 | -|--------|------|---------| -| `540022` | 请先确认订单后再配置保险(当前订单状态不允许投保) | 调 `/v3/admin/insurance/purchase` 时订单状态 / 支付状态不符合白名单 | -| `510206` | 合同方案未配置模板 | 调 `/v3/admin/contract/create-by-scheme` 时 `scheme.contractTemplateCode = null` | - -其他既有错误码不变。 - ---- - -## 五、Publisher 异步链路 - -### `ChecklistConfirmedEvent` -- **发布点**:`OrderService.transition()` 守卫 `from=CUSTOMIZING && to=PENDING_DEPARTURE && event=CONFIRM` -- **携带**:`orderId / orderNo / operatorId / operatorType (ADMIN/SYSTEM)` -- **operatorId 来源**:`AdminContextUtil.getAdminId()`(请求上下文)→ 无则 null + SYSTEM -- **监听者**:`ContractEventListener` + `InsuranceEventListener` 都接 `@TransactionalEventListener(AFTER_COMMIT, fallbackExecution=true)` -- **下游行为**:listener 走 `contract.createByScheme` / `insurance.autoPurchase`,失败有紧急待办 + 通知中心降级通知 - -### `TravelerChangedEvent` -- **发布点**:`TravelerService` 5 个写方法末尾 -- **守卫**:仅在订单 `orderStatus ∈ {PENDING_DEPARTURE, PENDING_BALANCE, TRAVELLING}` 时发布 -- **携带**:`orderId / orderNo / changeType (ADD/MODIFY/REMOVE) / affectedTravelerIds` -- **下游行为**:listener 走 `contract.invalidateByOrderId + createByScheme`(作废重签)、`insurance.cancelByOrderId + autoPurchase`(退旧重投) - ---- - -## 六、数据库迁移 - -| 文件 | 内容 | -|------|------| -| `V20260519_004__create_order_todo.sql` | 新增 `order_todo` 表(订单内部待办,自动签约/投保失败时生成紧急待办) | -| `V20260519_005__contract_scheme_add_default_destination.sql` | `contract_scheme` 加 `default_destination` + `default_departure_city` 两列 | - ---- - -## 七、测试服真测结论 - -### 部署 -- 测试服 v3 已部署 dev-v3 最新 HEAD `af7dd70` 双实例 8086+8186 -- Flyway 应用 V20260519_004 + V20260519_005 成功 -- Nacos test namespace 注册健康,9443 网关路由通 - -### API 真测(test_admin token 通过 trusted device 通路) -| 接口 | 结果 | -|------|------| -| GET 合同 scheme list / 合同 list / 保险 scheme list / 保单 list | ✅ 200 真实数据 | -| POST insurance.purchase CUSTOMIZING+UNPAID | ✅ 抛 540022 | -| POST insurance.purchase PENDING_DEPARTURE+UNPAID | ✅ 抛 540022(**证明 pay_status 单独校验起作用**) | -| POST insurance.purchase PENDING_DEPARTURE+DEPOSIT_PAID | ✅ 状态校验过,进入 planId 校验阶段 | -| POST order.transition CONFIRM | ✅ 200,triggeredEvents 含 ASYNC_CONTRACT_GENERATE + ASYNC_INSURANCE_ISSUE,listener 真收到(业务数据 scheme 缺所以 fail-soft) | - -### 单测 -- `mvn -pl hl-order-service-v3 test`:**Tests run 1096 / Failures 0 / Errors 0**(基线 1069 → +27) - ---- - -## 八、已知限制(非缺陷) - -1. **测试服当前 active contract_scheme 都没填 `contract_template_code`**,所以 transition CONFIRM 异步自动签约会 short-circuit「无可用合同方案」并发紧急待办。需要在 admin 后台进 `/v3/admin/contract/scheme/*` 表单配置 `contract_template_code` 后才能完整测端到端。 -2. **测试服当前没有 active `insurance_scheme`**,同上。 -3. 自动签约时按 v3 当前 list 第一个 ACTIVE 方案挑选(暂无 mchId/productId 路由),后续多公司多产品场景需要在 `ContractScheme` 加 `mchId` / `productId` 字段后过滤。 - ---- - -## 九、关联 - -- 主 PR:#2590 (https://git.1814.love:8443/wx/HL/pulls/2590) -- CR 跟进:#2591 -- 最终零遗留:#2603 -- 工单:#2586 - ---- - -**前端 mmg**:请同步检查投保 / 合同管理 / 出行人编辑 / 订单确认 4 个页面的 UI 提示逻辑,重点是「投保按钮置灰条件」+「订单确认后异步合同/保险生成提示」+「已签约后编辑出行人的告知 toast」。如有疑问随时找。 diff --git a/changelogs-v2/2026-05/19_2045_tag-library模块私人标签库管理-新增接口-管理后台.md b/changelogs-v2/2026-05/19_2045_tag-library模块私人标签库管理-新增接口-管理后台.md deleted file mode 100644 index b4da421..0000000 --- a/changelogs-v2/2026-05/19_2045_tag-library模块私人标签库管理-新增接口-管理后台.md +++ /dev/null @@ -1,500 +0,0 @@ -# tag-library: 私人标签库管理 6 接口(v5.14 骨架) - -> **存放目录**: `changelogs-v2/2026-05/`(v3 二期) -> **服务**: hl-order-service-v3(端口 8086) -> **PR**: #2045(骨架合并)/ #2240(Gateway 路由修复) -> **Issue**: #2045(v5.14 §14 章节实现) -> **日期**: 2026-05-19 -> **影响范围**: 管理后台「我的标签库」管理页 + 创建订单时的标签下拉 - ---- - -## ⚠️ 关键变化(首次发布无) - -本次为首次发布;非纠错变更。 - -⚠️ **当前实现状态**:6 个接口已上线,**ServiceImpl 为 Mock 实现**(返回硬编码样例数据),真实 DB 业务在跟进中。**接口契约本次发布后不再变**,前端可按契约对接联调。 - ---- - -## 一、背景 - -v5.14 引入「私人标签库」概念:每个管理员账号有自己独立的标签预设库,可在订单创建/编辑页打标签时从下拉中选取(取代以前自由文本输入)。 - -**模型隔离**: -- userId 从 JWT 自动派生,前端**不传**操作人 -- 仅本人可读/写/排序/置顶/删除自己的库 -- 删除标签库预设**不**影响已挂订单上的历史 order_tag 实例(保留快照) - ---- - -## 二、变更接口清单 - -| # | 接口 | 方法 | 路径 | 变更类型 | -|---|------|------|------|----------| -| 1 | 查我的标签库 | GET | `/v3/admin/tag-library` | 新增 | -| 2 | 新增标签库预设 | POST | `/v3/admin/tag-library` | 新增 | -| 3 | 修改标签库预设(重命名/换色) | PUT | `/v3/admin/tag-library/{id}` | 新增 | -| 4 | 删除标签库预设(软删) | DELETE | `/v3/admin/tag-library/{id}` | 新增 | -| 5 | 批量排序标签库(拖拽) | PUT | `/v3/admin/tag-library/sort` | 新增 | -| 6 | 置顶/取消置顶(toggle) | PUT | `/v3/admin/tag-library/{id}/pin` | 新增 | - ---- - -## 三、接口详情 - -### 1. 查我的标签库 `GET /v3/admin/tag-library` - -**VO**: `TagLibraryListReqVO` → `Result>` - -#### 入参(Query) - -| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | -|------|------|------|------|------|------| -| keyword | Query | String | ❌ | - | 模糊搜索标签名(管理页搜索框) | -| pinnedOnly | Query | Boolean | ❌ | 默认 false | 只返置顶 | - -> userId 从 JWT 自动注入,前端**不要**在 Query 里传 userId。 - -#### 出参 `Result>` - -| 字段 | 类型 | 说明 | -|------|------|------| -| id | Long | 标签库行 ID(雪花,前端按字符串处理避免精度丢失) | -| tagName | String | 标签名 | -| tagColor | String | HEX 色值(如 `#5B8FF9`) | -| sortOrder | Integer | 排序值 | -| isPinned | Boolean | 是否置顶 | -| usedCount | Integer | 使用次数 | -| lastUsedAt | LocalDateTime | 最近使用时间(ISO 8601,可能为 null) | - -**列表排序**:`isPinned DESC, sortOrder ASC, lastUsedAt DESC`(后端固定,前端不要前端再排) - -#### 请求示例 - -``` -GET /v3/admin/tag-library?keyword=高&pinnedOnly=false -``` - -#### 响应示例 - -```json -{ - "code": 200, - "message": "成功", - "data": [ - { - "id": 2050000000000001001, - "tagName": "高净值客户", - "tagColor": "#FF6B6B", - "sortOrder": 1, - "isPinned": true, - "usedCount": 12, - "lastUsedAt": "2026-05-15T14:32:10" - }, - { - "id": 2050000000000001002, - "tagName": "高频复购", - "tagColor": "#5B8FF9", - "sortOrder": 2, - "isPinned": false, - "usedCount": 5, - "lastUsedAt": "2026-05-10T09:15:00" - } - ], - "success": true -} -``` - -#### 空数据响应(首次访问无库) - -```json -{ - "code": 200, - "message": "成功", - "data": [], - "success": true -} -``` - ---- - -### 2. 新增标签库预设 `POST /v3/admin/tag-library` - -**VO**: `TagLibraryCreateReqVO` → `Result` - -#### 入参(Body) - -| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | -|------|------|------|------|------|------| -| tagName | Body | String | ✅ | 非空,长度 ≤ 50 | 标签名 | -| tagColor | Body | String | ❌ | HEX 格式 | 默认 `#5B8FF9` | - -#### 出参 `Result` - -字段同接口 1 出参(返回新建行完整字段,`sortOrder` 追加到末尾,`isPinned=false`,`usedCount=0`,`lastUsedAt=null`)。 - -#### 请求示例 - -```json -{ - "tagName": "VIP", - "tagColor": "#FFD700" -} -``` - -#### 响应示例 - -```json -{ - "code": 200, - "message": "成功", - "data": { - "id": 2050000000000001005, - "tagName": "VIP", - "tagColor": "#FFD700", - "sortOrder": 6, - "isPinned": false, - "usedCount": 0, - "lastUsedAt": null - }, - "success": true -} -``` - -#### 错误响应(重名) - -```json -{ - "code": 581421, - "message": "标签名已存在", - "success": false, - "data": null -} -``` - ---- - -### 3. 修改标签库预设 `PUT /v3/admin/tag-library/{id}` - -**VO**: `TagLibraryUpdateReqVO` → `Result` - -#### 入参 - -| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | -|------|------|------|------|------|------| -| id | Path | Long | ✅ | - | 标签库行 ID | -| tagName | Body | String | ❌ | 长度 ≤ 50 | 不传则不改 | -| tagColor | Body | String | ❌ | HEX | 不传则不改 | - -> 两字段都不传 → 等同空操作(不报错)。 - -#### 出参 - -返回修改后的完整 `TagLibraryItemVO`(字段同接口 1)。 - -#### 请求示例 - -```json -{ - "tagName": "VIP-Gold", - "tagColor": "#FFA500" -} -``` - -#### 响应示例 - -```json -{ - "code": 200, - "message": "成功", - "data": { - "id": 2050000000000001005, - "tagName": "VIP-Gold", - "tagColor": "#FFA500", - "sortOrder": 6, - "isPinned": false, - "usedCount": 0, - "lastUsedAt": null - }, - "success": true -} -``` - -#### 错误响应(非本人标签) - -```json -{ - "code": 581423, - "message": "无权操作该标签", - "success": false, - "data": null -} -``` - ---- - -### 4. 删除标签库预设 `DELETE /v3/admin/tag-library/{id}` - -**VO**: - → `Result` - -#### 入参 - -| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | -|------|------|------|------|------|------| -| id | Path | Long | ✅ | - | 标签库行 ID | - -#### 出参 - -| 字段 | 类型 | 说明 | -|------|------|------| -| data | Boolean | true=删除成功 | - -#### 请求示例 - -``` -DELETE /v3/admin/tag-library/2050000000000001005 -``` - -#### 响应示例 - -```json -{ - "code": 200, - "message": "成功", - "data": true, - "success": true -} -``` - -#### 错误响应(id 不存在) - -```json -{ - "code": 581424, - "message": "标签不存在或已删除", - "success": false, - "data": null -} -``` - ---- - -### 5. 批量排序标签库 `PUT /v3/admin/tag-library/sort` - -**VO**: `TagLibrarySortReqVO` → `Result` - -#### 入参(Body) - -| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | -|------|------|------|------|------|------| -| items | Body | Array | ✅ | 非空 | 批量排序映射 | -| items[].id | - | Long | ✅ | - | 标签库行 ID | -| items[].sortOrder | - | Integer | ✅ | - | 新排序值 | - -> 仅会更新本人库的行;若 `items` 含非本人 id,**整批拒绝**(581425),不部分成功。 - -#### 出参 - -| 字段 | 类型 | 说明 | -|------|------|------| -| data | Boolean | true=全量成功 | - -#### 请求示例 - -```json -{ - "items": [ - { "id": 2050000000000001001, "sortOrder": 1 }, - { "id": 2050000000000001002, "sortOrder": 2 }, - { "id": 2050000000000001005, "sortOrder": 3 } - ] -} -``` - -#### 响应示例 - -```json -{ - "code": 200, - "message": "成功", - "data": true, - "success": true -} -``` - -#### 错误响应(混入他人 id) - -```json -{ - "code": 581425, - "message": "排序列表含非本人标签 ID", - "success": false, - "data": null -} -``` - ---- - -### 6. 置顶/取消置顶 `PUT /v3/admin/tag-library/{id}/pin` - -**VO**: `TagLibraryPinReqVO` → `Result` - -#### 入参 - -| 字段 | 位置 | 类型 | 必填 | 约束 | 说明 | -|------|------|------|------|------|------| -| id | Path | Long | ✅ | - | 标签库行 ID | -| pinned | Body | Boolean | ✅ | - | `true`=置顶 / `false`=取消置顶 | - -#### 出参 - -| 字段 | 类型 | 说明 | -|------|------|------| -| data | Boolean | true=操作成功 | - -#### 请求示例 - -```json -{ - "pinned": true -} -``` - -#### 响应示例 - -```json -{ - "code": 200, - "message": "成功", - "data": true, - "success": true -} -``` - -#### 错误响应(非本人) - -```json -{ - "code": 581423, - "message": "无权操作该标签", - "success": false, - "data": null -} -``` - ---- - -## 四、契约约束与正确调用方式 - -### userId 派生规则 - -| 场景 | payload | -|------|---------| -| ✅ 调用任一接口 | 仅传业务字段,不传 userId(后端从 JWT 取) | -| ❌ Body / Query 传 userId | 后端忽略(不报错但无效) | - -### 排序接口幂等性 - -| 场景 | 行为 | -|------|------| -| ✅ 整列重新提交全量 items | 全量覆盖排序 | -| ✅ 提交部分 items | 仅更新提交的行,其他行 sort_order 保持 | -| ❌ items 含他人 id | 581425 整批拒绝(不部分成功) | - -### tagColor 兜底 - -- POST 不传 `tagColor` → 写入 `#5B8FF9`(深蓝默认) -- PUT 不传 `tagColor` → 不改原值 - ---- - -## 五、数据库行为 - -| 前端动作 | 数据库影响 | -|----------|-----------| -| POST 新建 | `tag_library` 表插入一行,`user_id` 取 JWT,`sort_order = MAX(sort_order)+1`,`is_pinned=false`,`used_count=0` | -| PUT 修改 | 仅更新 `tag_name` / `tag_color`;不传字段不动 | -| DELETE | 软删(`deleted=1`),不物理删;不级联清理已挂订单的历史 `order_tag` | -| PUT sort | 批量 UPDATE `sort_order`,事务包裹(全成功或全回滚) | -| PUT pin | 仅更新 `is_pinned`,`updated_at` 同步刷新 | - -**软删与订单标签的关系**: - -| 时间线 | 状态 | -|--------|------| -| T0:管理员将"VIP"标签挂到订单 A | `order_tag` 表插入快照(tag_name="VIP", tag_color="#FFD700") | -| T1:管理员从标签库删除"VIP"预设 | `tag_library.deleted=1`;`order_tag` 表**不变** | -| T2:再次打开订单 A | 仍显示"VIP"标签(快照),但下拉里不再出现 | - ---- - -## 六、边界行为 - -- 未登录 → 401(网关拦截) -- 列表为空(首次访问/全部删完)→ `Result.success([])`,**不**返 404 / 不返 581420 -- DELETE/PUT 操作不存在的 id → 581424 -- DELETE/PUT 操作他人 id → 581423 -- 排序提交空 items 数组 → 400(`@NotEmpty`) -- 新增标签名同用户已存在 → 581421 -- 新增标签名超长 / 空 / 全空格 → 400 / 581422 - ---- - -## 七、不影响范围 - -- **仅影响**: 管理后台「我的标签库」管理页 + 订单页打标签下拉 -- **零影响**: - - C 端小程序(无 /mp 接口) - - 订单创建 / 编辑接口(订单上的 `order_tag` 写入是另外的接口链路,不在本批) - - 历史已挂订单的标签(快照不动) - - 其他管理员的标签库(用户隔离) - ---- - -## 八、测试环境已验证 - -⚠️ **当前实现为 Mock**:ServiceImpl 返回硬编码样例数据,未走 DB。前端可按本契约对接联调;联调通过后后端会接入真实 DB(**契约不再变**)。 - -``` -GET /v3/admin/tag-library → 200 + 5 条 Mock 样例 ✓ -POST /v3/admin/tag-library → 200 + 新增样例回显 ✓ -PUT /v3/admin/tag-library/{id} → 200 + 修改样例回显 ✓ -DELETE /v3/admin/tag-library/{id} → 200 + true ✓ -PUT /v3/admin/tag-library/sort → 200 + true ✓ -PUT /v3/admin/tag-library/{id}/pin → 200 + true ✓ -``` - -Swagger UI:`http://:8086/doc.html` → 找「[admin] 私人标签库管理(v5.14)」分组。 - ---- - -## 九、相关历史 PR - -| PR | Issue | 说明 | 是否仍有效 | -|----|-------|------|------------| -| #2045 | - | 首发:6 接口空骨架 + Mock ServiceImpl + 错误码段位 581420-581429 | ✅ 有效 | -| #2240 | - | 修复 Gateway 缺 `/v3/admin/tag-library/**` 路由(404 修复) | ✅ 有效 | - ---- - -## 十、错误码 - -| 错误码 | 含义 | 触发场景 | -|--------|------|---------| -| 400 | 参数校验失败 | tagName 空 / 超长 / items 空 | -| 401 | 未登录 | 无 JWT 或 JWT 过期 | -| 581420 | 当前用户暂无标签库 | 保留位(当前实现不抛此错,空库返 `[]`) | -| 581421 | 标签名已存在 | POST 时同用户已有同名标签 | -| 581422 | 标签名格式非法或长度超过 50 字符 | 含特殊字符 / 长度 > 50(兜底校验) | -| 581423 | 无权操作该标签 | PUT/DELETE/PIN 操作他人的 id | -| 581424 | 标签不存在或已删除 | id 不存在 / 已软删 | -| 581425 | 排序列表含非本人标签 ID | sort 接口 items 混入他人 id | - ---- - -## 十一、相关文档 - -- 关联 PR(骨架):[wx/HL#2045](https://git.1814.love:8443/wx/HL/pulls/2045) -- 关联 PR(路由修复):[wx/HL#2240](https://git.1814.love:8443/wx/HL/pulls/2240) -- 后续:真实 DB 业务实现 PR 合并后将追加一条 follow-up changelog(契约不变,仅去掉 Mock 标注) diff --git a/changelogs-v2/2026-05/19_2561_agency模块路径切v3-修改接口-两端.md b/changelogs-v2/2026-05/19_2561_agency模块路径切v3-修改接口-两端.md deleted file mode 100644 index d251f51..0000000 --- a/changelogs-v2/2026-05/19_2561_agency模块路径切v3-修改接口-两端.md +++ /dev/null @@ -1,137 +0,0 @@ -# 【修改接口·两端】Agency 模块路径切 v3 - -> **更新时间**: 2026-05-19 -> **端类型**: 管理后台 + 小程序 -> **关联**: HL Issue [#2561](https://git.1814.love:8443/wx/HL/issues/2561) / PR [#2562](https://git.1814.love:8443/wx/HL/pulls/2562) -> **背景**: Agency 域已迁移至 hl-order-service-v3,旧 v2 路径仍可用(雪藏期),但**前端必须切到新 /v3 路径以确保后续维护**。 - ---- - -## 0. 模块全貌 - -| 子模块 | 接口数 | 端 | -|---|---|---| -| §A admin 旅行社 CRUD | ~10 | 管理后台 | -| §B admin 支付配置 | ~5 | 管理后台 | -| §C admin 资质附件 | ~5 | 管理后台 | -| §D mp 公开视图 | ~3 | 小程序 | - ---- - -## 1. 接口背景 - -Agency(旅行社)域承载主体公司 + 支付商户号 + 资质附件信息。之前由 v2 老订单服务(`hl-order-service`)承载,PR #2556/#2558/#2562 完整迁到 v3(`hl-order-service-v3`)。 - -迁移采用 **Option A 雪藏方案**:v2 代码 / 表 / 旧路径 **全部保留**,但前端必须切到 v3 新路径,**新功能 / 维护只在 v3 进行**。 - ---- - -## 2. 变更清单(仅路径变更,参数 / 响应 / 错误码 / 业务逻辑 100% 不变) - -### §A admin 旅行社 CRUD - -| 旧 path | 新 path | 方法 | -|---|---|---| -| `/admin/travel-agency/page` | `/v3/admin/travel-agency/page` | GET | -| `/admin/travel-agency/{id}` | `/v3/admin/travel-agency/{id}` | GET / PUT / DELETE | -| `/admin/travel-agency` | `/v3/admin/travel-agency` | POST | -| `/admin/travel-agency/simple-list` | `/v3/admin/travel-agency/simple-list` | GET | -| `/admin/travel-agency/{id}/toggle-status` | `/v3/admin/travel-agency/{id}/toggle-status` | PUT | -| `/admin/travel-agency/{id}/visible` | `/v3/admin/travel-agency/{id}/visible` | PUT | -| ……(其他 admin 接口同规则,统一前缀替换) | ……同规则 | …… | - -### §B admin 支付配置 - -| 旧 path | 新 path | -|---|---| -| `/admin/travel-agency/{agencyId}/payment/**` | `/v3/admin/travel-agency/{agencyId}/payment/**` | - -### §C admin 资质附件 - -| 旧 path | 新 path | -|---|---| -| `/admin/travel-agency/{agencyId}/qualification/**` | `/v3/admin/travel-agency/{agencyId}/qualification/**` | - -### §D mp 公开视图(小程序) - -| 旧 path | 新 path | -|---|---| -| `/mp/agency/primary` | `/v3/mp/agency/primary` | -| `/mp/agency/**` | `/v3/mp/agency/**` | - ---- - -## 3. 切换规则 - -**统一替换**: -- admin: `/admin/travel-agency/` 前缀 → `/v3/admin/travel-agency/` -- mp: `/mp/agency/` 前缀 → `/v3/mp/agency/` - -其他**完全不变**:参数、响应字段、错误码、JWT 鉴权、业务逻辑、性能特征。 - ---- - -## 4. 入参 / 出参 - -无变化。所有接口的请求体 / 查询参数 / 响应 Result 包装 / 字段名 / 类型 / 可空性 / 枚举值 **完全保持原样**。详见 Knife4j(重启后 v3 接口在 `http://:8086/doc.html`)。 - ---- - -## 5. 错误码 - -无变化。仍是 `582xxx` 段位(Agency 错误码段),含义不变。 - ---- - -## 6. 修改前后对比(关键示例) - -### 旧调用 - -```http -GET /admin/travel-agency/page?pageNum=1&pageSize=10 -Authorization: Bearer {admin_jwt} -``` - -### 新调用 - -```http -GET /v3/admin/travel-agency/page?pageNum=1&pageSize=10 -Authorization: Bearer {admin_jwt} -``` - -响应完全一样。 - ---- - -## 7. 影响评估 / 回滚 - -### 影响 - -- 前端必须把所有 Agency 域接口 base URL 加 `/v3` 前缀 -- 短期内(雪藏期)旧 path 仍可用,但**不接受新写入**(数据在 v2 库冻结) -- 新功能(如新增 admin 字段)只在 v3 推 - -### 回滚 - -旧 v2 path 未删,前端可临时改回。Gateway 旧规则保留。但**建议尽快切完**,否则数据漂移风险。 - ---- - -## 8. 注意事项 - -1. **必须改的请求方**:admin 管理后台 + 小程序 mp/agency 调用方 -2. **不需要改**:内部 Feign 调用方(mp-service 已通过 PR-2 内部切换,前端无感) -3. **切换时机**:建议本周内完成,避免错过新功能升级窗口 -4. **测试方式**:本地 / 测试服并存期间,新旧 path 可同时调,对比响应一致 -5. **gateway 重启**:后端已 merge,gateway 重启后新路由生效(运维通知) - ---- - -## 9. 关联 / 联系人 - -- Issue: https://git.1814.love:8443/wx/HL/issues/2561 -- PR: https://git.1814.love:8443/wx/HL/pulls/2562 -- 前序 PRs: #2556(PR-1 骨架)/ #2558(PR-2 内部切换) -- 方案文档: `.claude/PRPs/2026-05-18-v2-to-v3-agency-migration-plan.md` -- 后端负责人: yst -- 切换问题反馈: 在 PR #2562 评论 diff --git a/changelogs-v2/2026-05/19_2598_v3行程day-node写操作真实化-修改接口-管理后台.md b/changelogs-v2/2026-05/19_2598_v3行程day-node写操作真实化-修改接口-管理后台.md deleted file mode 100644 index 6813ba5..0000000 --- a/changelogs-v2/2026-05/19_2598_v3行程day-node写操作真实化-修改接口-管理后台.md +++ /dev/null @@ -1,562 +0,0 @@ -# 【修改接口·管理后台】v3 行程 day/node 写操作真实化 - -> **更新时间**: 2026-05-19 -> **端类型**: 管理后台 -> **关联**: HL Issue [#2598](https://git.1814.love:8443/wx/HL/issues/2598) / PR [#2613](https://git.1814.love:8443/wx/HL/pulls/2613) -> **背景**: hl-order-service-v3 行程模块写接口从 Mock 替换为真实落库,7 个接口行为语义从假数据回显变为真实 DB 读写 + 审计日志。路径/方法/参数结构/响应结构全部不变。 - ---- - -## 1. 接口背景 - -行程编辑页(管理后台)包含天(Day)和节点(Node)两层叙事结构: - -- **天(Day)**:对应行程中的第 N 天,含标题、封面、描述、餐饮安排、集合解散地等叙事字段。 -- **节点(Node)**:每天下的具体活动节点,含节点类型(景点/餐厅/活动/服务/自定义)、时间、资源关联等。 - -之前 6 个写接口均为 Mock(返回硬编码 ID 或入参原样回显),不落库。本期(PR #2613)全部替换为真实 DB 操作,同时新增编辑历史分页接口(F7)。 - -**前端调用方式不变**——所有接口路径、方法、入参结构、出参结构与之前约定完全一致,变化的是后端行为从假数据变为真数据落库 + 审计。 - ---- - -## 2. 变更清单 - -| # | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|----------|------| -| F1 | POST | `/v3/admin/order/{orderId}/itinerary/days` | 行为变更 | Mock→真实:dayNumber/dayDate 后端派生,真实落库 + 写 edit_log | -| F2 | PUT | `/v3/admin/order/{orderId}/itinerary/days/{dayId}` | 行为变更 | Mock→真实:更新叙事字段,dayNumber/dayDate 不可改 | -| F3 | DELETE | `/v3/admin/order/{orderId}/itinerary/days/{dayId}` | 行为变更 | Mock→真实:级联软删 nodes + activity/custom_assignment | -| F4 | POST | `/v3/admin/order/{orderId}/itinerary/nodes` | 行为变更 | Mock→真实:ACTIVITY/CUSTOM 同事务 INSERT 实配,sortOrder 派生 | -| F5 | PUT | `/v3/admin/order/{orderId}/itinerary/nodes/{nodeId}` | 行为变更 | Mock→真实:仅叙事字段,实配不动 | -| F6 | DELETE | `/v3/admin/order/{orderId}/itinerary/nodes/{nodeId}` | 行为变更 | Mock→真实:软删节点,实配不动(下一期补) | -| F7 | GET | `/v3/admin/order/{orderId}/itinerary/edit-log/page` | 行为变更 | Mock→真实:6 字段筛选分页,真实查 order_itinerary_edit_log | - -**破坏兼容?** 无。入参字段、出参字段名/类型全部不变。 - ---- - -## 3. 接口详情 - -所有接口: -- **服务**: hl-order-service-v3(端口 8086,通过 Gateway :8080 路由) -- **认证**: JWT Bearer Token,Header `Authorization: Bearer {token}`,无效 token 返回 `code=401` -- **限流**: Gateway 全局限流,无接口级特殊限流 -- **幂等性**: 写接口非幂等(每次调用均落库 + 写 edit_log);建议前端防重提交(按钮 loading 态) - -### F1 新增天 -- **方法 + 路径**: `POST /v3/admin/order/{orderId}/itinerary/days` -- **描述**: 为指定订单新增一个行程天,dayNumber 由后端 MAX+1 派生 - -### F2 修改天 -- **方法 + 路径**: `PUT /v3/admin/order/{orderId}/itinerary/days/{dayId}` -- **描述**: 修改指定行程天的叙事字段,dayNumber/dayDate 不可改 - -### F3 删除天 -- **方法 + 路径**: `DELETE /v3/admin/order/{orderId}/itinerary/days/{dayId}` -- **描述**: 软删指定行程天,级联软删该天下所有节点及 activity/custom 实配 - -### F4 新增节点 -- **方法 + 路径**: `POST /v3/admin/order/{orderId}/itinerary/nodes` -- **描述**: 在指定天下新增节点,sortOrder 由后端 MAX+1 派生;ACTIVITY/CUSTOM 类型需带 assignmentPayload - -### F5 修改节点 -- **方法 + 路径**: `PUT /v3/admin/order/{orderId}/itinerary/nodes/{nodeId}` -- **描述**: 修改节点叙事字段,不修改实配数据(下一期) - -### F6 删除节点 -- **方法 + 路径**: `DELETE /v3/admin/order/{orderId}/itinerary/nodes/{nodeId}` -- **描述**: 软删指定节点,不级联删除实配(与 deleteDay 的级联行为不同) - -### F7 编辑历史分页 -- **方法 + 路径**: `GET /v3/admin/order/{orderId}/itinerary/edit-log/page` -- **描述**: 分页查询订单行程编辑历史,支持 6 字段筛选 - ---- - -## 4. 接口入参 - -### 4.1 路径参数(所有接口) - -| 参数 | 类型 | 必填 | 说明 | -|------|------|------|------| -| orderId | Long(String) | 是 | 订单 ID,雪花 ID 以字符串形式传递 | - -F2 / F3 额外: - -| 参数 | 类型 | 必填 | 说明 | -|------|------|------|------| -| dayId | Long(String) | 是 | 天 ID | - -F5 / F6 额外: - -| 参数 | 类型 | 必填 | 说明 | -|------|------|------|------| -| nodeId | Long(String) | 是 | 节点 ID | - -### 4.2 请求体字段 - -#### F1 新增天 / F2 修改天(请求体相同,均为 ItineraryDayUpsertReqVO) - -所有字段均为非必填: - -| 字段 | 类型 | 校验 | 说明 | -|------|------|------|------| -| dayTitle | String | 长度 ≤128 | 当天标题 | -| quoteText | String | 长度 ≤256 | 金句/小诗 | -| coverImageUrl | String | 长度 ≤512 | 封面图 OSS URL | -| description | String | 长度 ≤4096 | 当日描述(支持富文本) | -| breakfast | String | 枚举见第 6 节 | 早餐安排 | -| lunch | String | 枚举见第 6 节 | 午餐安排 | -| dinner | String | 枚举见第 6 节 | 晚餐安排 | -| diningRemark | String | 长度 ≤256 | 餐饮备注 | -| gatherPlace | Object | — | 集合地点(POI 对象,字段见下) | -| dismissalPlace | Object | — | 解散地点 | -| dailyMileage | Integer | 值 ≥0 | 当日里程(km) | -| dailyDuration | Integer | 值 ≥0 | 行驶时长(分钟) | -| mileageManualOverride | Boolean | — | 是否手动覆盖里程 | -| photoUrls | List\ | — | 图集 URL 列表 | -| editReason | String | 长度 ≤256 | 修改原因(写入 edit_log) | - -注意(F2 修改天): dayNumber 和 dayDate 后端管理,传了也不生效。 - -gatherPlace / dismissalPlace POI 对象结构(字段均可选): - -```json -{name:国家会展中心,address:上海市青浦区崧泽大道,longitude:121.2987,latitude:31.1598} -``` - -当前响应中 gatherPlace/dismissalPlace 以 JSON 字符串形式返回(非 Object),下一期统一处理。 - -#### F3 删除天 / F6 删除节点(请求体) - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| editReason | String | 否 | 删除原因(写入 edit_log) | - -#### F4 新增节点 / F5 修改节点(请求体 ItineraryNodeUpsertReqVO) - -| 字段 | 类型 | 必填 | 校验 | 说明 | -|------|------|------|------|------| -| nodeName | String | 是(F4/F5)| @NotBlank,长度 ≤128 | 节点名称 | -| dayId | Long(String) | 是(F4)| — | 所属天 ID,F5 修改时无需传 | -| nodeType | String | 是(F4) | 枚举见第 6 节 | 节点类型;F5 修改时不可改 | -| resourceType | String | 否 | 枚举见第 6 节 | 关联资源类型 | -| resourceId | Long(String) | 否 | — | 资源 ID;ACTIVITY 类型时后端校验 DB NOT NULL | -| startTime | String | 否 | HH:mm 格式 | 开始时间,如 "09:00" | -| timePeriod | String | 否 | — | 时段标签,如 "上午" | -| durationMinutes | Integer | 否 | 值 ≥0 | 持续时长(分钟) | -| description | String | 否 | 长度 ≤2000 | 节点描述 | -| images | List\ | 否 | — | 图集 URL 列表 | -| emojiIcon | String | 否 | 长度 ≤8 | Emoji 图标 | -| assignmentPayload | Object | nodeType=ACTIVITY/CUSTOM 时必填 | 见下 | 实配载荷(新增节点时使用) | -| editReason | String | 否 | 长度 ≤256 | 修改原因(写入 edit_log) | - -assignmentPayload 对象结构(NodeAssignmentPayload): - -| 字段 | 类型 | 必填 | 校验 | 说明 | -|------|------|------|------|------| -| unitPrice | BigDecimal | 是 | 值 ≥0 | 单价 | -| qty | Integer | 是 | 值 ≥1 | 数量 | -| costPrice | BigDecimal | 否 | — | 成本价 | -| supplierName | String | 否 | 长度 ≤128 | 供应商名称 | -| supplierContact | String | 否 | 长度 ≤64 | 供应商联系人 | -| supplierPhone | String | 否 | 长度 ≤32 | 供应商电话 | - -totalAmount = unitPrice x qty,后端自动计算,不接受前端传入。 - -#### F7 编辑历史分页(Query 参数) - -| 参数 | 类型 | 必填 | 说明 | -|------|------|------|------| -| pageNo | Integer | 是 | 页码,从 1 开始 | -| pageSize | Integer | 是 | 每页条数,建议 10-20 | -| editType | String | 否 | 枚举见第 6 节,单值筛选 | -| targetDay | Integer | 否 | 筛选指定天号(如 1、2、3) | -| operatorId | Long | 否 | 筛选指定操作人 ID | -| operatedFrom | String | 否 | 开始时间,**必须 ISO 格式** `2026-05-19T00:00:00` | -| operatedTo | String | 否 | 结束时间,**必须 ISO 格式** `2026-05-19T23:59:59` | - -注意:operatedFrom/operatedTo 必须使用 ISO 格式(含 T),空格格式(2026-05-19 00:00:00)会返回 400。 - ---- - -## 5. 出参字段 - -所有接口统一包装: - -```json -{"code":200,"msg":"success","data":{}} -``` - -### F1/F2/F3 响应体(ItineraryDayRespVO) - -| 字段 | 类型 | 说明 | -|------|------|------| -| id | String | 天 ID(Long 序列化为 String,防 JS 精度丢失) | -| orderId | String | 订单 ID | -| dayNumber | Integer | 第几天(后端派生,从 1 开始) | -| dayDate | String | 当日日期,格式 yyyy-MM-dd | -| dayTitle | String | 标题 | -| quoteText | String | 金句 | -| coverImageUrl | String | 封面图 URL | -| description | String | 描述 | -| breakfast | String | 早餐枚举值 | -| lunch | String | 午餐枚举值 | -| dinner | String | 晚餐枚举值 | -| diningRemark | String | 餐饮备注 | -| gatherPlace | String | 集合地点(当前为 JSON 字符串,非 Object) | -| dismissalPlace | String | 解散地点(同上) | -| dailyMileage | Integer | 当日里程 | -| dailyDuration | Integer | 行驶时长(分钟) | -| mileageManualOverride | Boolean | 是否手动覆盖里程 | -| photoUrls | List | 图集 | -| editLogId | String | 本次操作产生的 edit_log ID(Long→String) | -| createTime | String | 创建时间 | -| updateTime | String | 更新时间 | - -### F4/F5/F6 响应体(ItineraryNodeRespVO) - -| 字段 | 类型 | 说明 | -|------|------|------| -| id | String | 节点 ID(Long→String) | -| orderId | String | 订单 ID | -| dayId | String | 所属天 ID(Long→String) | -| nodeType | String | 节点类型枚举值 | -| sortOrder | Integer | 排序权重(后端派生,0-based max+1) | -| resourceType | String | 资源类型 | -| resourceId | String | 资源 ID(Long→String) | -| resourceName | String | 资源名称(Feign 反查,SERVICE/CUSTOM/无 resourceId 时为 null) | -| nodeName | String | 节点名称 | -| startTime | String | 开始时间(HH:mm) | -| timePeriod | String | 时段标签 | -| durationMinutes | Integer | 持续时长 | -| description | String | 描述 | -| images | List | 图集 | -| emojiIcon | String | Emoji | -| refType | String | 实配关联类型(枚举见第 6 节) | -| refId | String | 实配 ID(Long→String,无实配时 null) | -| assignment | Object | 实配数据(F4 ACTIVITY/CUSTOM 时有值,F5/F6 当前返回 null) | -| editLogId | String | 本次操作产生的 edit_log ID(Long→String) | -| createTime | String | 创建时间 | -| updateTime | String | 更新时间 | - -assignment 对象(仅 F4 ACTIVITY/CUSTOM 时非 null): - -| 字段 | 类型 | 说明 | -|------|------|------| -| id | String | 实配 ID | -| unitPrice | BigDecimal | 单价 | -| qty | Integer | 数量 | -| totalAmount | BigDecimal | 总额(后端派生) | -| costPrice | BigDecimal | 成本价 | -| supplierName | String | 供应商 | -| status | String | 实配状态,新增时为 PLANNED | - -### F7 响应体(分页) - -```json -{code:200,data:{records:[],total:9,page:1,pageSize:10}} -``` - -EditLogVO 字段: - -| 字段 | 类型 | 说明 | -|------|------|------| -| id | String | edit_log ID(Long→String) | -| orderId | String | 订单 ID | -| editType | String | 操作类型枚举值(见第 6 节) | -| targetDay | Integer | 操作涉及的天号 | -| beforeSnapshot | String | 操作前快照(JSON 字符串) | -| afterSnapshot | String | 操作后快照(JSON 字符串) | -| amountDelta | BigDecimal | 金额变化(叙事层固定为 0) | -| editReason | String | 操作原因 | -| scope | String | 固定为 ITINERARY | -| operatorId | String | 操作人 ID(Long→String) | -| operatorName | String | 操作人姓名 | -| operatedAt | String | 操作时间(ISO 格式) | -| adjustmentId | String | 关联调整单 ID(暂未支持,固定 null) | - ---- - -## 6. 枚举 / 数据字典 - -### 餐饮枚举(breakfast / lunch / dinner) - -| 值 | 含义 | -|----|------| -| HOTEL | 酒店/旅馆餐 | -| CAMP | 营地餐 | -| SPECIAL | 特色餐 | -| SELF | 自理 | - -### 节点类型(nodeType) - -| 值 | 含义 | -|----|------| -| SCENIC | 景点游览 | -| RESTAURANT | 用餐 | -| ACTIVITY | 活动体验 | -| SERVICE | 服务项 | -| CUSTOM | 自定义 | - -### 资源类型(resourceType) - -| 值 | 含义 | -|----|------| -| SCENIC_SPOT | 景点 | -| RESTAURANT | 餐厅 | -| ACTIVITY | 活动 | - -### 实配关联类型(refType) - -| 值 | 含义 | -|----|------| -| NONE | 无实配 | -| SCENIC_ASSIGNMENT | 关联景点实配 | -| MEAL_ASSIGNMENT | 关联餐饮实配 | -| ACTIVITY_ASSIGNMENT | 关联活动实配 | -| CUSTOM_ASSIGNMENT | 关联自定义实配 | -| STAFF_ASSIGNMENT | 关联员工实配 | - -### edit_log 操作类型(editType) - -| 值 | 含义 | -|----|------| -| ADD_DAY | 新增天 | -| EDIT_DAY | 修改天 | -| REMOVE_DAY | 删除天 | -| ADD_NODE | 新增节点(本期新增枚举) | -| EDIT_NODE | 修改节点(本期新增枚举) | -| REMOVE_NODE | 删除节点(本期新增枚举) | - ---- - -## 7. 错误码 - -| 错误码 | 含义 | 触发场景 | -|--------|------|----------| -| 583001 | ORDER_NOT_FOUND 订单不存在 | orderId 无对应记录 | -| 583050 | DAY_NOT_FOUND 行程天不存在或已删除 | dayId 不属于该订单,或已软删 | -| 583051 | NODE_NOT_FOUND 节点不存在或已删除 | nodeId 不属于该订单,或已软删 | -| 583052 | ASSIGNMENT_PAYLOAD_REQUIRED 实配载荷必填 | nodeType=ACTIVITY/CUSTOM 但未传 assignmentPayload | -| 583053 | INVALID_NODE_TYPE 节点类型非法 | nodeType 传了非枚举值 | -| 583022 | RESOURCE_NOT_FOUND 资源不存在 | resourceId 对应资源在 resource-service 查不到 | -| 401 | 未认证 / Token 无效 | 无 Authorization Header 或 Token 过期 | - ---- - -## 8. 示例 - -### 8.1 典型成功 — 新增一天 + 新增节点 - -**Step 1:新增天** - -```bash -curl -X POST "http://localhost:8080/v3/admin/order/844477867747184641/itinerary/days" \n -H "Authorization: Bearer {token}" \n -H "Content-Type: application/json" \n -d '{"dayTitle":"第一天·布达拉宫","description":"抵达拉萨,参观布达拉宫","breakfast":"HOTEL","lunch":"SPECIAL","dinner":"SELF","editReason":"初次添加行程天"}' -``` - -响应: - -```json -{ - "code": 200, - "msg": "success", - "data": { - "id": "844800000000001001", - "orderId": "844477867747184641", - "dayNumber": 1, - "dayDate": "2026-06-01", - "dayTitle": "第一天·布达拉宫", - "breakfast": "HOTEL", - "lunch": "SPECIAL", - "dinner": "SELF", - "gatherPlace": null, - "editLogId": "844900000000000001", - "createTime": "2026-05-19T15:30:00" - } -} -``` - -说明:第一次新增天,dayNumber=1;dayDate 根据订单出发日自动计算。 - -**Step 2:新增景点节点** - -```bash -curl -X POST "http://localhost:8080/v3/admin/order/844477867747184641/itinerary/nodes" \n -H "Authorization: Bearer {token}" \n -H "Content-Type: application/json" \n -d '{"dayId":"844800000000001001","nodeType":"SCENIC","nodeName":"布达拉宫","resourceType":"SCENIC_SPOT","resourceId":"700000000000001","startTime":"10:00","durationMinutes":180}' -``` - -响应: - -```json -{ - "code": 200, - "data": { - "id": "844800000000002001", - "dayId": "844800000000001001", - "nodeType": "SCENIC", - "sortOrder": 0, - "resourceName": "布达拉宫", - "nodeName": "布达拉宫", - "startTime": "10:00", - "durationMinutes": 180, - "refType": "NONE", - "refId": null, - "assignment": null, - "editLogId": "844900000000000002" - } -} -``` - -说明:该天第一个节点,sortOrder=0;resourceName 由后端 Feign 反查。 - -### 8.2 边界情况 — 新增 ACTIVITY 节点(带实配载荷) - -```bash -curl -X POST "http://localhost:8080/v3/admin/order/844477867747184641/itinerary/nodes" \n -H "Authorization: Bearer {token}" \n -H "Content-Type: application/json" \n -d '{"dayId":"844800000000001001","nodeType":"ACTIVITY","nodeName":"骑马体验","resourceType":"ACTIVITY","resourceId":"710000000000002","startTime":"14:00","durationMinutes":60,"assignmentPayload":{"unitPrice":200.00,"qty":4,"costPrice":150.00,"supplierName":"高原牧场体验馆","supplierContact":"王师傅","supplierPhone":"18800001234"}}' -``` - -响应(节点 + 活动实配同事务写入): - -```json -{ - "code": 200, - "data": { - "id": "844800000000002002", - "dayId": "844800000000001001", - "nodeType": "ACTIVITY", - "sortOrder": 1, - "resourceName": "高原骑马体验", - "nodeName": "骑马体验", - "refType": "ACTIVITY_ASSIGNMENT", - "refId": "860000000000000001", - "assignment": {"id":"860000000000000001","unitPrice":200.00,"qty":4,"totalAmount":800.00,"costPrice":150.00,"supplierName":"高原牧场体验馆","status":"PLANNED"}, - "editLogId": "844900000000000003" - } -} -``` - -边界说明:第 2 个节点,sortOrder=1;totalAmount=200x4=800,后端派生;resourceName 由 Feign 反查不依赖前端传入。 - -### 8.3 业务失败 — ACTIVITY 节点未传 assignmentPayload - -```bash -curl -X POST "http://localhost:8080/v3/admin/order/844477867747184641/itinerary/nodes" \n -H "Authorization: Bearer {token}" \n -H "Content-Type: application/json" \n -d '{"dayId":"844800000000001001","nodeType":"ACTIVITY","nodeName":"骑马体验"}' -``` - -响应: - -```json -{"code":583052,"msg":"nodeType=ACTIVITY/CUSTOM 必须传 assignmentPayload","data":null} -``` - ---- - -## 9. 业务边界 - -### 适用场景 - -- 管理后台行程编辑页的新增天/删除天/编辑天/新增节点/修改节点/删除节点操作 -- 编辑历史面板查看审计日志 - -### 不适用场景 - -- 整体行程保存(batchSave,POST /itinerary/save)——该接口仍为 Mock,下一期处理 -- 小程序端行程查看(MpItineraryService.getMpItinerary)——只读接口,不涉及本期写操作 -- staff/scenic/meal 类节点的实配写入——下一期 - -### 特殊边界 - -| 场景 | 行为 | -|------|------| -| dayNumber 派生 | 后端 MAX(day_number)+1,同订单第一次加天时 dayNumber=1;前端不传不接收 | -| dayDate 派生 | 订单出发日+(dayNumber-1) 天自动计算;F2 修改天不可改 dayNumber,因此 dayDate 也不变 | -| sortOrder 派生 | addNode 时 MAX(sort_order)+1,该天首个节点 sortOrder=0;前端不传 | -| resourceName 派生 | nodeType=SCENIC_SPOT/RESTAURANT/ACTIVITY 且有 resourceId 时 Feign 反查;nodeType=SERVICE/CUSTOM 或 resourceId=null 时跳过返回 null | -| deleteDay 级联范围 | 软删该天所有节点 + 节点关联的 activity_assignment / custom_assignment;scenic_assignment / meal_assignment 暂不级联(留 TODO) | -| deleteNode 不级联 | 单独删节点不删实配(与 deleteDay 的级联不同),下一期补 | -| F5 editNode 实配不动 | 修改节点叙事字段时不同步修改 activity/custom_assignment,响应 assignment=null | -| 并发 addDay 防护 | 两人同时 addDay 触发 uk_order_day 唯一索引冲突时,后端 catch DuplicateKeyException 重试一次,仍失败返回业务错误码(不出 500) | -| 跨订单防护 | dayId/nodeId 校验 order_id 是否匹配,他人订单数据传进来返回 DAY_NOT_FOUND / NODE_NOT_FOUND | -| 已删除天再删 | 返回 DAY_NOT_FOUND(583050),不重复软删 | - ---- - -## 10. 修改前后对比 - -### 字段级对比(入参/出参结构不变) - -| 维度 | 修改前(Mock) | 修改后(真实) | -|------|--------|--------| -| F1 addDay 返回 id | 硬编码 7700000000008 | 真实雪花 ID,String 类型 | -| F2 editDay 返回数据 | 原 dayId 原样回显 | 真实更新后 DB 记录,含 updateTime | -| F3 deleteDay 返回 | 伪 deleted: true | 返回删除前的 day 完整数据 + editLogId | -| F4 addNode 返回 id | 硬编码 7800000000088 | 真实雪花 ID,refType/refId 真实回填 | -| F5 editNode / F6 deleteNode | 入参原样回显 | 真实 DB 操作后记录 | -| F7 edit-log/page | 固定返回 3 条假 log | 真实查询 order_itinerary_edit_log | -| edit_log 是否存在 | 否(Mock 不写 DB) | 是,每次写操作同事务 1 行 | - -### 行为级对比 - -| 操作 | 修改前 | 修改后 | -|------|--------|--------| -| 新增天两次 | 两次都返回同一 Mock ID | dayNumber 正确派生为 1、2 | -| 页面刷新后数据是否保留 | 否(Mock 不落库) | 是(真实落库) | -| 删除天后节点是否消失 | 否 | 是(级联软删) | -| 编辑历史能否查到 | 否 | 是(每个写操作写 edit_log) | - ---- - -## 11. 影响评估 / 回滚 - -### 对前端的影响 - -- 接口路径/方法/入参结构/出参字段名完全不变,前端代码无需修改 -- 行为变化:之前 Mock 数据刷新会丢失,现在真实落库;如果前端有基于 Mock 行为的临时兼容代码(如前端本地缓存假 ID 后续补偿),需检查是否有 workaround 要清理 - -### 前端需要验证的点 - -1. id / dayId / nodeId / editLogId / refId / operatorId 等所有 Long ID 字段均已序列化为 String,验证 JS 端是否正确处理(不要 parseInt) -2. editNode(F5)响应 assignment=null,如需展示实配数据需另调 /itinerary/full 接口 -3. gatherPlace / dismissalPlace 当前响应为 JSON 字符串,需 JSON.parse() 后渲染(下一期后端统一改为 Object 返回) -4. F7 edit-log/page 日期筛选必须 ISO 格式:2026-05-19T00:00:00,空格格式会 400 - -### 破坏性兼容 - -无破坏性兼容。 - -### 回滚方案 - -如需回滚,通过 Gitea 创建 revert PR,将 dev-v3 回到 PR #2613 合入前的状态。回滚不影响已落库的 order_itinerary_day / order_itinerary_node / order_itinerary_edit_log 数据(软删数据保留,不清库)。 - ---- - -## 12. 注意事项 - -1. **adjustmentId 暂未支持**:EditLogVO.adjustmentId 字段保留但 DDL 无对应列,固定返回 null,下一期 adjustment 流程接入时补齐。 - -2. **gatherPlace / dismissalPlace 返回 JSON 字符串**:当前接口返回的是 JSON 字符串而非 Object,前端需 JSON.parse() 后再使用。下一期统一改为 Object 返回。 - -3. **batchSave 仍为 Mock**:POST /v3/admin/order/{orderId}/itinerary/save 整体保存接口本期未真实化,仍返回 Mock 数据。 - -4. **staff/scenic/meal 实配 CRUD 仍 Mock**:nodeType=SERVICE/CUSTOM 的节点写入已真实,但 staff、scenic、meal 类型相关实配的增删改仍 Mock,下一期补齐。 - -5. **F5 editNode 不同步实配**:修改节点叙事字段时不修改关联实配,响应 assignment=null。如需实配数据调 /v3/admin/order/{orderId}/itinerary/full。 - -6. **deleteNode 不级联实配**:单独删节点(F6)不删关联的 activity/custom_assignment,与 deleteDay(F3)的级联行为不同,下一期补齐。 - -7. **resource-service 可用性**:nodeType=SCENIC/RESTAURANT/ACTIVITY 且传了 resourceId 时,后端会 Feign 调 resource-service 反查资源名。若 resource-service 不可用,返回 RESOURCE_NOT_FOUND(583022),写操作事务回滚。可通过不传 resourceId 规避(resourceName 会为 null)。 - -8. **Long ID 全为 String**:所有 Long 类型 ID 均序列化为 String(防 JS 精度丢失),前端赋值时不要做 parseInt。 - ---- - -## 13. 关联 / 联系人 - -- **Issue**: [#2598 v3 行程 day/node 写操作真实化](https://git.1814.love:8443/wx/HL/issues/2598) -- **PR**: [#2613](https://git.1814.love:8443/wx/HL/pulls/2613) -- **Commits(dev-v3 rebase 后)**: - - [12adf586](https://git.1814.love:8443/wx/HL/commit/12adf5861530f5af429d85aa38db9f801fd1d192) feat: Task 1-15 全量完成 - - [38c93408](https://git.1814.love:8443/wx/HL/commit/38c93408c2ca80784cd31cc1e6ee92b724814c9a) fix: Phase 4 QA BUG+WARN 修复 - - [d96c6575](https://git.1814.love:8443/wx/HL/commit/d96c657589838301739a47ab816bec2bbab9b042) fix: Phase 5 reviewer 必修项修复 -- **后端负责人**: @yaosutu diff --git a/changelogs-v2/2026-05/19_feat_admin_order_list_consultant_name_filter.md b/changelogs-v2/2026-05/19_feat_admin_order_list_consultant_name_filter.md deleted file mode 100644 index 45af0a9..0000000 --- a/changelogs-v2/2026-05/19_feat_admin_order_list_consultant_name_filter.md +++ /dev/null @@ -1,121 +0,0 @@ -# API 变更通知 - -**更新时间**: 2026-05-19 03:00 -**PR**: #2569 feat(order-v3): admin 订单列表加 consultantName 模糊筛选 - -## ✨ 订单列表接口新增「定制师姓名」筛选参数 - -### 变了什么(前端视角) - -管理后台订单列表接口 `GET /v3/admin/order` 新增一个**可选查询参数** `consultantName`,支持按定制师姓名模糊筛选订单。 - -传入后,接口会对数据库 `consultant_name` 列做 `LIKE %xxx%` 匹配;不传(或传 `null`/空字符串)则不过滤,行为与之前完全一致。 - -**对照表**: - -| 参数 | 原来 | 现在 | -|------|------|------| -| `consultantName` | 不存在,传了被忽略 | 支持,做 LIKE 模糊匹配 | - -### 前端要改的地方 - -1. **订单列表顶部「定制师」筛选框**:将用户输入的定制师姓名作为 `consultantName` 参数拼到请求 query string 里,随其他已有筛选条件一起传给后端。 -2. **清空筛选框时**:将 `consultantName` 置为 `undefined`(不传该字段)或传空字符串均可,后端两种情况都不过滤。 - -### 涉及的接口 / 模块 - -| # | 接口 | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|------|----------|------| -| 1 | 订单列表分页 | GET | `/v3/admin/order` | ✨ 新增请求参数 | 加 `consultantName` 可选筛选字段 | - -### 接口详细定义 - -#### 订单列表分页 - -- **使用场景**:管理后台订单列表页,支持多条件组合筛选 -- **请求参数(完整)**: - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| page | Integer | 是 | 页码,从 1 开始 | -| pageSize | Integer | 是 | 每页条数,建议 10 / 20 | -| keyword | String | 否 | 关键词模糊匹配(团号 / 客户姓名 / 产品名 / 订单号任一) | -| status | String | 否 | 订单状态枚举,见枚举表 | -| createSource | String | 否 | 创建来源枚举 | -| departureDateFrom | String | 否 | 出发日期起(yyyy-MM-dd) | -| departureDateTo | String | 否 | 出发日期止(yyyy-MM-dd) | -| cancelled | Boolean | 否 | 是否含已取消(默认 false) | -| tagNames | List\ | 否 | 按标签名过滤(多选) | -| **consultantName** | **String** | **否** | **定制师姓名模糊匹配(LIKE %xxx%)。空/null 不过滤(本次新增)** | - -- **请求示例(带定制师筛选)**: -``` -GET /v3/admin/order?page=1&pageSize=20&consultantName=李定制 -Authorization: Bearer {token} -``` - -- **请求示例(组合筛选)**: -``` -GET /v3/admin/order?page=1&pageSize=20&status=CONFIRMED&consultantName=王 -Authorization: Bearer {token} -``` - -- **响应示例(完整)**: -```json -{ - "code": 200, - "msg": "success", - "data": { - "records": [ - { - "id": 1234567890, - "orderNo": "HL20260519001", - "status": "CONFIRMED", - "productName": "云南大理 7 日游", - "consultantName": "李定制", - "consultantId": 100001, - "customerName": "张三", - "departDate": "2026-06-01", - "headCount": 4, - "totalAmount": 12800.00, - "createTime": "2026-05-19T10:00:00" - } - ], - "total": 5, - "page": 1, - "pageSize": 20 - } -} -``` - -- **响应字段说明**(本次无变化,仅供参考): - -| 字段 | 类型 | 说明 | -|------|------|------| -| id | Long | 订单 ID | -| orderNo | String | 订单号 | -| status | String | 订单状态,见枚举表 | -| productName | String | 产品名称 | -| consultantName | String | 定制师姓名 | -| consultantId | Long | 定制师 ID | -| customerName | String | 客户姓名 | -| departDate | String | 出发日期(yyyy-MM-dd) | -| headCount | Integer | 出行人数 | -| totalAmount | BigDecimal | 订单总金额 | -| createTime | String | 创建时间(ISO 8601) | -| total | Long | 满足条件的总记录数 | -| page | Integer | 当前页码 | -| pageSize | Integer | 每页条数 | - -### 业务规则 / 校验规则 - -- `consultantName` 为空字符串或 null 时,SQL 不追加该条件,等价于不筛选 -- 匹配方式:`LIKE %{consultantName}%`(前后都带通配符),输入"李"可匹配"李定制"、"王李明"等 -- 筛选字段作用于订单表 `consultant_name` 列(存的是定制师的真实姓名,非企微名) -- 与其他筛选条件(keyword、status、departureDateFrom 等)是 AND 关系,可自由组合 - -### 向后兼容性说明 - -- 本次变更**完全向后兼容**:`consultantName` 为可选参数,不传则行为与改动前完全一致 -- 响应结构 / 字段无任何变化 -- 无需数据迁移,无需重启网关 diff --git a/changelogs-v2/2026-05/19_fix_admin_order_detail_travelers_no_longer_empty.md b/changelogs-v2/2026-05/19_fix_admin_order_detail_travelers_no_longer_empty.md deleted file mode 100644 index 9ca1db7..0000000 --- a/changelogs-v2/2026-05/19_fix_admin_order_detail_travelers_no_longer_empty.md +++ /dev/null @@ -1,167 +0,0 @@ -# API 变更通知 - -**更新时间**: 2026-05-19 00:00 -**PR**: #2571 fix(order-v3): 补通 overview.travelers 真实出行人数据(Issue #2460 遗留债) - -## ✨ 订单详情接口 overview.travelers 字段从占位空数组变为真实出行人列表 - -### 变了什么(前端视角) - -`GET /v3/admin/order/{id}` 的响应中,`data.overview.travelers` 字段此前**永远返回空数组 `[]`**(Issue #2460 PR-1 当时留了 TODO 占位)。 - -本次修复已将其**接通真实数据**,现在返回完整的出行人列表,字段口径与 `GET /v3/admin/order/{id}/traveler/list` 完全一致。 - -**对照表**: - -| 字段 | 原来 | 现在 | -|------|------|------| -| `data.overview.travelers` | 永远 `[]` | 真实出行人列表(按 traveler_id 升序) | - -### 前端要改的地方 - -这是**可选优化**,不是必须改: - -1. **进入订单详情页时**:可直接从 `overview.travelers` 读取出行人数据,省去再调一次 `/v3/admin/order/{id}/traveler/list`。 -2. **保持现有调用方式也完全没问题**:`/traveler/list` 接口字段口径不变,两个来源数据一致。 -3. **如果原先有 workaround**(比如检测到 `travelers` 为空就补一次 list 请求):确认接口已返回真实数据后可以清理掉这段逻辑。 - -### 涉及的接口 / 模块 - -| # | 接口 | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|------|----------|------| -| 1 | 订单详情 | GET | `/v3/admin/order/{id}` | 🔧 字段行为修复 | `overview.travelers` 从空数组变为真实数据 | - -### 接口详细定义 - -#### 订单详情 - -- **使用场景**:管理后台进入订单详情页时调用,返回订单概览 + 出行人列表等聚合信息 -- **路径参数**: - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| id | Long | 是 | 订单 ID | - -- **请求示例**: -``` -GET /v3/admin/order/1234567890 -Authorization: Bearer {token} -``` - -- **响应示例(完整 overview.travelers 部分)**: -```json -{ - "code": 200, - "msg": "success", - "data": { - "overview": { - "travelers": [ - { - "id": 987654321, - "orderId": 1234567890, - "travelerType": "ADULT", - "name": "张三", - "gender": "MALE", - "birthday": "1990-06-15", - "idType": "IDCARD", - "idNo": "110101199006151234", - "nationality": "中国", - "race": "汉族", - "phone": "13800138000", - "emergencyContact": "李四", - "emergencyPhone": "13900139000", - "roomGroupNo": 1, - "profileStatus": "COMPLETED", - "transportPlanIds": [1001, 1002] - }, - { - "id": 987654322, - "orderId": 1234567890, - "travelerType": "CHILD", - "name": "张小五", - "gender": "MALE", - "birthday": "2018-03-20", - "idType": "IDCARD", - "idNo": "110101201803201234", - "nationality": "中国", - "race": "汉族", - "phone": null, - "emergencyContact": "张三", - "emergencyPhone": "13800138000", - "roomGroupNo": 1, - "profileStatus": "COMPLETED", - "transportPlanIds": [] - } - ] - } - } -} -``` - -- **overview.travelers 数组元素字段说明**: - -| 字段 | 类型 | 说明 | 备注 | -|------|------|------|------| -| id | Long | 出行人 ID | 雪花 ID | -| orderId | Long | 所属订单 ID | | -| travelerType | String | 出行人类型 | 枚举,见下表 | -| name | String | 姓名 | | -| gender | String | 性别 | 枚举:MALE / FEMALE | -| birthday | String | 生日 | 格式 yyyy-MM-dd | -| idType | String | 证件类型 | 枚举,见下表 | -| idNo | String | 证件号 | **admin 端明文返回**(后台 DB 加密存储)| -| nationality | String | 国籍 | 默认"中国" | -| race | String | 民族 | 默认"汉族" | -| phone | String | 手机号 | **admin 端明文返回**;儿童可为 null | -| emergencyContact | String | 紧急联系人姓名 | 可为 null | -| emergencyPhone | String | 紧急联系人手机 | **admin 端明文返回**;可为 null | -| roomGroupNo | Integer | 同住分组号 | 相同数字表示同住一间 | -| profileStatus | String | 资料完善状态 | 枚举,见下表 | -| transportPlanIds | List\ | 关联的大交通批次 ID 列表 | 无关联时为空数组 `[]` | - -### 枚举 / 字典值 - -#### travelerType(出行人类型) - -| 值 | 中文 | 说明 | -|----|------|------| -| ADULT | 成人 | | -| YOUNG | 青年 / 学生 | | -| CHILD | 儿童 | | -| BABY | 婴儿 | | - -#### idType(证件类型) - -| 值 | 中文 | 说明 | -|----|------|------| -| IDCARD | 居民身份证 | 最常见 | -| PASSPORT | 护照 | | -| HKMO | 港澳居民来往内地通行证 | | -| TAIWAN | 台湾居民来往大陆通行证 | | -| OTHER | 其他 | | - -#### gender(性别) - -| 值 | 中文 | -|----|------| -| MALE | 男 | -| FEMALE | 女 | - -#### profileStatus(资料状态) - -| 值 | 中文 | 说明 | -|----|------|------| -| PENDING | 待完善 | 出行人资料未填完整 | -| COMPLETED | 已完善 | 出行人资料齐全 | - -### 业务规则 / 校验规则 - -- 排序:按出行人 ID(`traveler_id`)升序 -- 数据来源:与 `GET /v3/admin/order/{id}/traveler/list` **完全一致**,由同一个 `TravelerService.listTravelers` 方法产出,字段值不会有差异 -- **敏感字段**:`idNo`、`phone`、`emergencyPhone` 在 admin 端明文返回(业务需要,例如紧急情况联系),在小程序端(mp)和内部接口(internal)走脱敏,后台 DB 使用 AES 加密存储 - -### 向后兼容性说明 - -- 本次变更**完全向后兼容**:字段名 / 路径 / 类型结构均无变化,只是原来恒为 `[]` 的字段现在有了真实内容 -- 前端无需强制修改,保持调用 `/traveler/list` 的逻辑也能正常工作 -- 若前端原有 workaround(检测 `travelers` 为空时额外请求 list),现在可按需清理 diff --git a/changelogs-v2/2026-05/19_followup_transport-plan-rigor.md b/changelogs-v2/2026-05/19_followup_transport-plan-rigor.md deleted file mode 100644 index c03f24e..0000000 --- a/changelogs-v2/2026-05/19_followup_transport-plan-rigor.md +++ /dev/null @@ -1,236 +0,0 @@ -# 大交通批次 edit/delete 严格化 follow-up: 错误码 581121 → 581144 + edit 4 项业务校验补齐 - -> **存放目录**: 二期(v3,`order-v3` 标签)→ `changelogs-v2/2026-05/` -> -> **服务**: hl-order-v3 (端口 8084) -> **PR**: #2560 (commit `08deec4d1`) -> **Issue**: 无新增工单(审查 follow-up,语义对齐 #2523 / #2524 / #2526,原工单已 closed) -> **日期**: 2026-05-19 -> **影响范围**: 管理后台「行程安排 - 接送站」区块 - 大交通批次编辑/删除接口 - ---- - -## ⚠️ 关键变化(前端必同步两点) - -1. **#2524 delete 错误码变更(破坏性,小幅)**:大交通批次软删接口的「plan 不存在/跨单/已删」错误码 **`581121` → `581144`**。前端若对 `581121` 做了特殊 catch,需改为 `581144`,或合并到通用错误处理。错误消息文案同步改为「大交通批次不存在或不属于该订单」。 -2. **#2523 edit 严格化(行为收紧)**:之前 edit 接口只校验 `direction` / `transportType` 两个枚举,本次补齐 add 同款 4 项业务校验(581140 字段组合 / 581141 出行人归属 / 581142 时间顺序 / 581143 同方向同一出行人占用),且 edit 加 `@Idempotent(3s)`,3 秒内重复提交直接返 `100502 处理中`。前端 add 已有的错误处理代码可直接复用到 edit。 - -> 这是 **#2546(#2523) / #2547(#2524) / #2554(#2526)** 三个原 PR 合并后,/@arch + /@cr 审查发现的尾巴一次性收完,不开新工单。 - ---- - -## 一、背景 - -V5.48 §2.6 大交通模块四接口在 #2521/#2522/#2523/#2524 完成路径风格 + Method 迁移后,审查发现两处实质语义偏差和一处注释笔误: - -| 维度 | 原 PR 状态 | 本 follow-up 修正后 | -|------|-----------|---------------------| -| `editTransportPlan` 业务校验 | 仅枚举 direction/transportType,**不校验字段组合/出行人归属/时间顺序/同方向占用** | 全 4 项校验,完全对齐 add | -| `editTransportPlan` 防并发 | 仅 `@Lock4j(30s)`,**无幂等** | `@Lock4j(30s)` + `@Idempotent(3s)` | -| `deleteTransportPlan` 错误码 | `581121`(沿用 §2 baseline) | **`581144`**(对齐 §2.6.4 文档 + #2523 命名) | -| `TravelerErrorCode` 错误码区间注释 | "581131-581135" 整体看作启用 | "581131-581134 启用 + 581135 预留" | - -错误码 `581121` 是 §2 出行人模块的"归属校验"基线值,但 §2.6 大交通批次模块已在 add/edit 中使用 `581140-581144` 段位,delete 也应统一使用 `581144`,前端可用同一段位错误处理覆盖全部 §2.6 接口。 - ---- - -## 二、变更接口清单 - -| # | 接口 | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|------|----------|------| -| 1 | 大交通批次编辑 | POST | `/v3/admin/order/{id}/transport-plan/{planId}/edit` | 行为收紧 + 注解新增 | 补 4 项业务校验 + `@Idempotent(3s)` | -| 2 | 大交通批次软删 | POST | `/v3/admin/order/{id}/transport-plan/{planId}/delete` | 错误码变更(破坏性) | `581121` → `581144`,消息文案同步 | - ---- - -## 三、接口详情 - -### 1. 大交通批次编辑 `POST /v3/admin/order/{id}/transport-plan/{planId}/edit` - -入参 / 出参 / 路径 / Method **均与 PR #2546 一致**,仅以下行为变化: - -#### 新增/补齐校验(对齐 add `POST .../transport-plan/add`) - -校验顺序(从上到下,任一不通过立刻返错): - -| 步骤 | 校验项 | 错误码 | 说明 | -|------|--------|--------|------| -| 1 | plan 存在 + 归属订单 + 未软删 | `581144` | (本 follow-up 改造点,见接口 2)| -| 2 | 订单存在性 | `581100` | | -| 3 | **字段组合合法性** | `581140` | FLIGHT/TRAIN/COACH 缺 `transportNo`,SELF_DRIVE 错带 `transportNo`/站点 等 | -| 4 | **时间顺序** | `581142` | `departTime > arriveTime` 拒绝(SELF_DRIVE 用 `selfDriveEta` 单点时间不触发此校验)| -| 5 | **travelerIds 归属订单** | `581141` | 任一 ID 不在 `order.travelerIds` → 整体拒绝 | -| 6 | **同方向同一出行人已被占用**(排除自己)| `581143` | 同 `direction` + 同 `travelerId` 在其他 active plan 中存在 → 拒绝;**自己的旧关联不算冲突** | - -#### 新增注解 - -```java -@Idempotent(timeout = 3) // 新增:3 秒内重复 POST 同 path+Body 返首次结果 -@Lock4j(keys = "#id", expire = 30000) // 已有 -``` - -#### 错误响应示例 - -```json -// 字段组合非法(FLIGHT 缺 transportNo) -{ "code": 581140, "msg": "transportNo 必填(运输方式=FLIGHT)", "data": null } - -// travelerIds 含订单外的出行人 -{ "code": 581141, "msg": "出行人不属于该订单: travelerIds=[70123456789099]", "data": null } - -// 时间顺序错误 -{ "code": 581142, "msg": "departTime 不能晚于 arriveTime", "data": null } - -// 同方向同 traveler 占用(其他 plan) -{ "code": 581143, "msg": "出行人在同方向已有另一批次: direction=ARRIVAL, travelerId=70123456789012, conflictPlanId=80012999", "data": null } - -// 幂等命中(3 秒内重复 POST) -{ "code": 100502, "msg": "请求处理中,请稍后重试", "data": null } -``` - -> **edit 排除自身规则**:校验 `581143` 时,SQL `WHERE plan_id != #{currentPlanId}`,改自己不算冲突。该排除是 edit 接口独有,add 接口不存在 currentPlanId 概念。 - ---- - -### 2. 大交通批次软删 `POST /v3/admin/order/{id}/transport-plan/{planId}/delete` - -入参 / 出参 / 路径 / Method / 数据库行为 **均与 PR #2547 一致**,仅错误码变化: - -#### 错误响应变更 - -| 场景 | 变更前(PR #2547) | 变更后(PR #2560,**当前**) | -|------|------------------|---------------------------| -| plan 不存在 | `581121` "大交通批次不属于该订单" | **`581144` "大交通批次不存在或不属于该订单"** | -| plan 跨单(orderId 不匹配) | `581121` 同上 | **`581144`** 同上 | -| plan 已软删(deleted=1)再 delete | `581121` 同上 | **`581144`** 同上 | -| 订单不存在 | `581100` | `581100`(**不变**)| - -示例响应: - -```json -{ "code": 581144, "msg": "大交通批次不存在或不属于该订单: planId=80099999, orderId=60123456789012", "data": null } -``` - -> `581121` 在 §2.6 模块**不再返回**(仍保留在 §2 出行人模块的其他接口中)。 - ---- - -## 四、契约约束与正确调用方式 - -### edit 接口(前端 actionable) - -| 场景 | payload | 结果 | -|------|---------|------| -| ✅ 合法 edit | FLIGHT + transportNo + 站点 + travelerIds 都属本单 + 时间顺序对 | 200 | -| ✅ 改自己旧关联的 traveler | edit Body `travelerIds=[A,B]`,A 在原 plan 已有 → 不触发 581143 | 200 | -| ❌ 缺 transportNo(FLIGHT) | `{"transportType":"FLIGHT","transportNo":null}` | `581140` | -| ❌ 时间倒挂 | `departTime=11:00, arriveTime=09:00` | `581142` | -| ❌ traveler 跨单 | `travelerIds=[订单外的 ID]` | `581141` | -| ❌ 同方向 A 已在别 plan | direction=ARRIVAL + travelerA 在 plan #B 占用 | `581143` | -| ❌ 3 秒内双击 | 第二次同 path+Body POST | `100502` 处理中 | - -### delete 接口(前端 actionable) - -| 错误码 | 前端建议 | -|--------|---------| -| 旧 `581121` | **移除**或合并到通用错误处理 | -| 新 `581144` | 提示「该批次不存在或已被删除」,刷新列表 | - -### 前端代码迁移建议 - -```js -// 旧 -if (resp.code === 581121) showToast('批次不属于该订单'); - -// 新(推荐合并 581121 + 581144,兼容过渡期) -if (resp.code === 581144 || resp.code === 581121) showToast('批次不存在或已被删除'); -``` - ---- - -## 五、数据库行为 - -**无变化**。本 follow-up 仅修改 Service 层校验顺序 + Controller 注解 + 错误码常量值,DB schema / 表行为完全沿用 PR #2546 / #2547。 - ---- - -## 六、边界行为 - -### edit 接口 - -- 新校验全部在事务开始前完成,失败不写库 -- `@Idempotent(3s)` 缓存键 = path + 用户 ID + Body hash,3 秒内重复同 Body 直接拿首次结果 -- 同方向同 traveler 占用判定 SQL: `WHERE direction = ? AND traveler_id IN (?) AND plan_id != #{currentPlanId} AND deleted = 0` -- 已软删的 plan 不参与 `581143` 占用判定 - -### delete 接口 - -- `@Idempotent(3s)` + `@Lock4j(30s)` 沿用,不变 -- 错误码常量从 `TRANSPORT_PLAN_NOT_BELONG_TO_ORDER(581121)` 改为 `TRANSPORT_PLAN_NOT_FOUND_OR_NOT_BELONG(581144)` - -### 通用 - -- 未登录 → 401(网关拦截,不变) -- 历史 plan(v2 迁移数据)edit/delete 行为完全一致 - ---- - -## 七、不影响范围 - -- **仅影响**: 管理后台 F21 「接送站」编辑弹窗 + 删除按钮 -- **零影响**: - - C 端订单详情 / mp 抵达计划接口 - - §2.6.1 list 接口 / §2.6.2 add 接口(本 follow-up 不动) - - 出行人 CRUD(traveler 表本身不动) - - 订单状态机 - - `581121` 在 §2 出行人模块其他接口仍正常返回,语义未变 - - `581131-581134` 出行人模块错误码无功能变化,仅注释笔误修正 - ---- - -## 八、测试环境已验证 - -测试服 9443 网关 + 真 admin token round-trip **9/9 PASS**(/@qa 报告): - -``` -edit 接口严格化: - ✓ FLIGHT 缺 transportNo → 581140 - ✓ travelerIds 含订单外 ID → 581141 - ✓ departTime > arriveTime → 581142 - ✓ 同方向 traveler 在别 plan 占用 → 581143 - ✓ 同方向 traveler 在自己 plan(改自己)→ 200(排除自身生效) - ✓ 3 秒内重复 POST 同 Body → 100502 幂等命中 - -delete 接口错误码: - ✓ planId 不存在 → 581144(原 581121) - ✓ planId 跨单 → 581144(原 581121) - ✓ 重复 delete 已软删 plan → 581144(原 581121) -``` - -本地单测 109/109 全绿(5 单测 + 7 IT,注解反射断言验证 `@Idempotent.timeout=3` / `@Lock4j.keys="#id"`)。 - ---- - -## 九、相关历史 PR - -| PR | Issue | 说明 | 是否仍有效 | -|----|-------|------|------------| -| #2546 | #2523 | edit 接口 Method+路径迁移(原版只校验 2 枚举) | ✅ 仍有效,**本 follow-up 在其上补 4 校验 + 幂等** | -| #2547 | #2524 | delete 接口 Method+路径迁移(原版用 `581121`) | ✅ 仍有效,**本 follow-up 改错误码 → `581144`** | -| #2554 | #2526 | 出行人 smart-parse 新增接口(原版注释笔误)| ✅ 仍有效,**本 follow-up 仅修注释,无 API 变化** | -| **本 PR #2560** | (审查 follow-up,无新工单) | edit 严格化 + delete 错误码 + 注释笔误 | ✅ **最新** | - ---- - -## 十、相关文档 - -- 关联 PR: [wx/HL#2560](https://git.1814.love:8443/wx/HL/pulls/2560) -- 原 PR(本 follow-up 的修正基础): - - [wx/HL#2546](https://git.1814.love:8443/wx/HL/pulls/2546)(关联 [#2523](https://git.1814.love:8443/wx/HL/issues/2523)) - - [wx/HL#2547](https://git.1814.love:8443/wx/HL/pulls/2547)(关联 [#2524](https://git.1814.love:8443/wx/HL/issues/2524)) - - [wx/HL#2554](https://git.1814.love:8443/wx/HL/pulls/2554)(关联 [#2526](https://git.1814.love:8443/wx/HL/issues/2526)) -- API 文档: `docs/order-v3/api/API-SPEC-V5.48.html` §2.6.3(edit)/ §2.6.4(delete) -- 同月配套 changelog: - - `18_#2523_transport-plan-edit.md` - - `18_#2524_transport-plan-delete.md` - - `18_#2526_traveler-smart-parse.md` diff --git a/changelogs-v2/2026-05/21_2785_车型管理库-新增接口-管理后台.md b/changelogs-v2/2026-05/21_2785_车型管理库-新增接口-管理后台.md deleted file mode 100644 index 2b988b2..0000000 --- a/changelogs-v2/2026-05/21_2785_车型管理库-新增接口-管理后台.md +++ /dev/null @@ -1,676 +0,0 @@ -# 【新增接口·管理后台】车型管理库 9 接口(含新增的大类/型号分页 2 接口) (#2785) - -> **PR**: #2786 | **服务**: hl-fleet-service | **更新时间**: 2026-05-21 14:25 -> -> **存放目录**: `changelogs-v2/2026-05/`(前端 v3 项目仓库读取) -> **影响范围**: 管理后台「车管 / 车型管理库」页(左侧大类导航 + 右侧型号列表 + 全模块 CRUD) - ---- - -## ⚠️ 关键变化(30 秒速读) - -**本次实质变化是 2 个新增分页接口**(§3.2 大类分页 / §3.7 型号分页),原 7 个 CRUD/树接口契约零变化。一并把整模块 9 接口契约打包发给前端,方便对接「左侧大类导航 + 右侧型号列表」联动场景。 - -| # | 接口 | 状态 | 用途 | -|---|---|---|---| -| §3.1 | GET `/admin/fleet/vehicle-types` | 已存在·未变 | 一次拉全模块树(大类+型号) | -| **§3.2** | **GET `/admin/fleet/vehicle-types/page`** | **✨ 新增** | 大类分页+过滤(左侧导航专用) | -| §3.3 | POST `/admin/fleet/vehicle-types` | 已存在·未变 | 新增大类 | -| §3.4 | PUT `/admin/fleet/vehicle-types/{typeId}` | 已存在·未变 | 编辑大类 | -| §3.5 | DELETE `/admin/fleet/vehicle-types/{typeId}` | 已存在·未变 | 删除大类(软删) | -| §3.6 | POST `/admin/fleet/vehicle-types/{typeId}/models` | 已存在·未变 | 新增型号 | -| **§3.7** | **GET `/admin/fleet/vehicle-types/models/page`** | **✨ 新增** | 型号分页+过滤(vehicleTypeId 可选) | -| §3.8 | PUT `/admin/fleet/vehicle-types/models/{modelId}` | 已存在·未变 | 编辑型号 | -| §3.9 | DELETE `/admin/fleet/vehicle-types/models/{modelId}` | 已存在·未变 | 删除型号(软删) | - ---- - -## 1. 接口背景 - -车型管理库是车队基础字典:大类(如 SUV/MPV/BUS/Sedan)→ 型号(如 丰田汉兰达/本田奥德赛)。管理后台需要: - -1. **左侧大类导航 + 右侧型号列表**联动 → 大类分页 + 型号按 typeId 过滤的分页 -2. **跨大类按车型名搜索** → 型号分页 typeId 可选 + modelName 模糊 -3. 已有的 listTree 一次拉树仍保留(其他场景如派单弹窗筛选 / 价格日历分组继续用) - ---- - -## 2. 变更清单 - -| # | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|----------|------| -| 1 | GET | `/admin/fleet/vehicle-types` | 未变 | 列出大类+型号整树 | -| 2 | GET | `/admin/fleet/vehicle-types/page` | **新增** | 大类分页 | -| 3 | POST | `/admin/fleet/vehicle-types` | 未变 | 新增大类 | -| 4 | PUT | `/admin/fleet/vehicle-types/{typeId}` | 未变 | 编辑大类(typeKey 不可改) | -| 5 | DELETE | `/admin/fleet/vehicle-types/{typeId}` | 未变 | 删除大类(软删) | -| 6 | POST | `/admin/fleet/vehicle-types/{typeId}/models` | 未变 | 新增型号 | -| 7 | GET | `/admin/fleet/vehicle-types/models/page` | **新增** | 型号分页 | -| 8 | PUT | `/admin/fleet/vehicle-types/models/{modelId}` | 未变 | 编辑型号 | -| 9 | DELETE | `/admin/fleet/vehicle-types/models/{modelId}` | 未变 | 删除型号(软删) | - ---- - -## 3. 接口详情 - -### 3.1 列出大类 + 型号树 - -**GET** `/admin/fleet/vehicle-types` - -- **使用场景**:一次拉取整棵车型树(大类含 models 数组),用于派单弹窗、价格日历分组等需要全量树的场景 -- **认证**:管理后台 JWT -- **幂等**:是(只读) -- **入参**:无 - -**出参**:`Result>` - -按 `sort_order` 升序。每个大类含 `models` 数组(同大类内按 `sort_order` 升序)。无大类时返回空数组 `[]`。 - -**典型示例 请求**: -``` -GET /admin/fleet/vehicle-types -Authorization: Bearer -(无请求体) -``` - -**典型示例 响应**: -```json -{ - "code": 200, - "data": [ - { - "id": "1234567890123456789", - "typeKey": "suv", - "typeName": "SUV 越野", - "icon": "🚙", - "description": "适合山地越野、多人出行", - "sortOrder": 1, - "models": [ - { - "id": "9876543210987654321", - "vehicleTypeId": "1234567890123456789", - "modelName": "丰田汉兰达", - "seats": 7, - "basePrice": "800.00", - "alias": "汉兰达,HIGHLANDER", - "sortOrder": 1 - } - ] - } - ], - "msg": "成功" -} -``` - -**错误码**:仅 401 未登录 - ---- - -### 3.2 大类分页列表 ✨ 新增 - -**GET** `/admin/fleet/vehicle-types/page` - -- **使用场景**:管理后台「车型管理库」左侧大类导航的分页查询,支持名称模糊、key 精确过滤 -- **认证**:管理后台 JWT -- **幂等**:是(只读) - -**Query 入参**: - -| 字段 | 类型 | 必填 | 默认 | 校验 | 说明 | -|------|------|------|------|------|------| -| `page` | int | ❌ | 1 | `>= 1` | 页码 | -| `pageSize` | int | ❌ | 20 | `1-100` | 每页条数 | -| `typeName` | string | ❌ | — | — | 大类中文名模糊匹配 | -| `typeKey` | string | ❌ | — | — | 大类 key 精确匹配 | - -**出参**:`Result>` - -按 `sort_order` 升序。**不**含 `models` 数组(需要型号请调 §3.7)。 - -| 字段 | 类型 | 说明 | -|------|------|------| -| `records[].id` | string | 大类 ID(Long 序列化为 String 防精度丢失) | -| `records[].typeKey` | string | 大类 key(如 suv/mpv/bus/sedan) | -| `records[].typeName` | string | 大类中文名 | -| `records[].icon` | string | emoji 图标(可空) | -| `records[].description` | string | 描述(可空) | -| `records[].sortOrder` | int | 排序权重 | -| `total` | int | 总记录数 | -| `page` | int | 当前页码 | -| `pageSize` | int | 每页条数 | - -**典型示例 请求**: -``` -GET /admin/fleet/vehicle-types/page?page=1&pageSize=20&typeName=SUV -Authorization: Bearer -(无请求体) -``` - -**典型示例 响应**: -```json -{ - "code": 200, - "data": { - "records": [ - { - "id": "1234567890123456789", - "typeKey": "suv", - "typeName": "SUV 越野", - "icon": "🚙", - "description": "适合山地越野、多人出行", - "sortOrder": 1 - } - ], - "total": 1, - "page": 1, - "pageSize": 20 - }, - "msg": "成功" -} -``` - -**边界 请求**(无过滤拿全部,pageSize=100 极限): -``` -GET /admin/fleet/vehicle-types/page?page=1&pageSize=100 -``` - -**异常 请求**(pageSize=101 超限): -``` -GET /admin/fleet/vehicle-types/page?page=1&pageSize=101 -``` -响应: -```json -{ "code": 400, "msg": "每页条数最大为100", "data": null } -``` - -**错误码**:400 参数校验 / 401 未登录 - ---- - -### 3.3 新增大类 - -**POST** `/admin/fleet/vehicle-types` - -- **使用场景**:扩展车型大类(初始化已灌 4 条 suv/mpv/bus/sedan,后续如新增小型客车等) -- **认证**:管理后台 JWT -- **幂等**:否(重复调用会触发 600101 重复) - -**Body 入参**(`VehicleTypeSaveReqVO`): - -| 字段 | 类型 | 必填 | 校验 | 说明 | -|------|------|------|------|------| -| `typeKey` | string | ✅ | `@Size(max=16)` | 大类 key(全局唯一) | -| `typeName` | string | ✅ | `@Size(max=64)` | 大类中文名 | -| `icon` | string | ❌ | `@Size(max=8)` | emoji 图标(可为空) | -| `description` | string | ❌ | `@Size(max=256)` | 描述(可为空) | -| `sortOrder` | int | ✅ | — | 排序权重(升序) | - -**出参**:`Result`(同 §3.2 records 项字段) - -**典型示例 请求**: -``` -POST /admin/fleet/vehicle-types -Authorization: Bearer -Content-Type: application/json - -{ - "typeKey": "minibus", - "typeName": "小型客车", - "icon": "🚐", - "description": "10-19 座中巴", - "sortOrder": 5 -} -``` - -**典型示例 响应**: -```json -{ - "code": 200, - "data": { - "id": "1234567890123456789", - "typeKey": "minibus", - "typeName": "小型客车", - "icon": "🚐", - "description": "10-19 座中巴", - "sortOrder": 5 - }, - "msg": "成功" -} -``` - -**异常 请求**(typeKey 重复): -```json -{ "typeKey": "suv", "typeName": "重复 SUV", "sortOrder": 99 } -``` -响应: -```json -{ "code": 600101, "msg": "车型大类 key 已存在", "data": null } -``` - -**错误码**:400 参数校验 / **600101** typeKey 已存在 / 401 未登录 - ---- - -### 3.4 编辑大类 - -**PUT** `/admin/fleet/vehicle-types/{typeId}` - -- **使用场景**:修改大类的 typeName / icon / description / sortOrder。**typeKey 不可改**(后端忽略入参中的 typeKey 字段) -- **认证**:管理后台 JWT -- **幂等**:是(相同 body 重复调结果一致) - -**路径入参**: - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| `typeId` | Long | ✅ | 大类 ID | - -**Body 入参**:同 §3.3(typeKey 字段后端忽略;其他字段同新增) - -**出参**:`Result`(更新后的大类) - -**典型示例 请求**: -``` -PUT /admin/fleet/vehicle-types/1234567890123456789 -Authorization: Bearer -Content-Type: application/json - -{ - "typeKey": "suv", - "typeName": "SUV 越野 (改名)", - "icon": "🚙", - "description": "新描述", - "sortOrder": 2 -} -``` - -**典型示例 响应**: -```json -{ - "code": 200, - "data": { - "id": "1234567890123456789", - "typeKey": "suv", - "typeName": "SUV 越野 (改名)", - "icon": "🚙", - "description": "新描述", - "sortOrder": 2 - }, - "msg": "成功" -} -``` - -**异常 请求**(typeId 不存在): -```json -{ "code": 600102, "msg": "车型大类不存在", "data": null } -``` - -**错误码**:400 参数校验 / **600102** 大类不存在 / 401 未登录 - ---- - -### 3.5 删除大类(软删) - -**DELETE** `/admin/fleet/vehicle-types/{typeId}` - -- **使用场景**:下架某个大类。**大类下存在型号时禁止删除**(应用层校验) -- **认证**:管理后台 JWT -- **幂等**:是(重复删返同样结果) - -**路径入参**: - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| `typeId` | Long | ✅ | 大类 ID | - -**出参**:`Result`(成功时 `data: null`) - -**典型示例 请求**: -``` -DELETE /admin/fleet/vehicle-types/1234567890123456789 -Authorization: Bearer -(无请求体) -``` - -**典型示例 响应**: -```json -{ "code": 200, "data": null, "msg": "成功" } -``` - -**异常 请求**(大类下有型号): -```json -{ "code": 600104, "msg": "大类下存在型号,不能删除", "data": null } -``` - -**错误码**:**600102** 大类不存在 / **600104** 大类下存在型号 / 401 未登录 - ---- - -### 3.6 新增型号(挂在指定大类下) - -**POST** `/admin/fleet/vehicle-types/{typeId}/models` - -- **使用场景**:在某大类下新增型号(如 SUV 大类下加"路虎揽胜") -- **认证**:管理后台 JWT -- **幂等**:否(同名重复抛 600103) - -**路径入参**: - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| `typeId` | Long | ✅ | 所属大类 ID | - -**Body 入参**(`VehicleModelSaveReqVO`): - -| 字段 | 类型 | 必填 | 校验 | 说明 | -|------|------|------|------|------| -| `modelName` | string | ✅ | `@Size(max=64)` | 型号名(同大类内唯一) | -| `seats` | int | ✅ | `@Min(4) @Max(19)` | 座位数 4-19 | -| `basePrice` | BigDecimal | ✅ | `@DecimalMin("0")` | 基础日单价(¥,≥ 0) | -| `alias` | string | ❌ | `@Size(max=256)` | 别名(搜索匹配用) | -| `sortOrder` | int | ✅ | — | 排序权重 | - -**出参**:`Result` - -| 字段 | 类型 | 说明 | -|------|------|------| -| `id` | string | 型号 ID(Long 序列化为 String) | -| `vehicleTypeId` | string | 所属大类 ID | -| `modelName` | string | 型号名 | -| `seats` | int | 座位数 | -| `basePrice` | string | 基础日单价(BigDecimal 序列化) | -| `alias` | string | 别名 | -| `sortOrder` | int | 排序 | - -**典型示例 请求**: -``` -POST /admin/fleet/vehicle-types/1234567890123456789/models -Authorization: Bearer -Content-Type: application/json - -{ - "modelName": "丰田汉兰达", - "seats": 7, - "basePrice": "800.00", - "alias": "汉兰达,HIGHLANDER", - "sortOrder": 1 -} -``` - -**典型示例 响应**: -```json -{ - "code": 200, - "data": { - "id": "9876543210987654321", - "vehicleTypeId": "1234567890123456789", - "modelName": "丰田汉兰达", - "seats": 7, - "basePrice": "800.00", - "alias": "汉兰达,HIGHLANDER", - "sortOrder": 1 - }, - "msg": "成功" -} -``` - -**异常 请求**(座位数 20 超限): -```json -{ "modelName": "大巴车", "seats": 20, "basePrice": "1500.00", "sortOrder": 1 } -``` -响应: -```json -{ "code": 400, "msg": "座位数最大为 19", "data": null } -``` - -**错误码**:400 参数校验 / **600102** 大类不存在 / **600103** 型号名已存在 / 401 未登录 - ---- - -### 3.7 型号分页列表 ✨ 新增 - -**GET** `/admin/fleet/vehicle-types/models/page` - -- **使用场景**: - 1. 「左侧点击大类 → 右侧加载该大类型号」 → 传 `vehicleTypeId` - 2. 「跨大类按车型名/俗称搜索」 → 不传 `vehicleTypeId`,传 `modelName` 或 `alias` -- **认证**:管理后台 JWT -- **幂等**:是(只读) - -**Query 入参**: - -| 字段 | 类型 | 必填 | 默认 | 校验 | 说明 | -|------|------|------|------|------|------| -| `page` | int | ❌ | 1 | `>= 1` | 页码 | -| `pageSize` | int | ❌ | 20 | `1-100` | 每页条数 | -| `vehicleTypeId` | Long | ❌ | — | — | **可选**:传则按大类过滤,不传跨大类全量 | -| `modelName` | string | ❌ | — | — | 型号名模糊匹配 | -| `seats` | int | ❌ | — | — | 座位数精确匹配 | -| `alias` | string | ❌ | — | — | 别名模糊匹配(车型俗称) | - -**出参**:`Result>` - -按 `sort_order` 升序。**不**返大类名称(前端从左侧大类列表自取)。 - -records 项字段同 §3.6 出参字段表。 - -**典型示例 请求**(按大类查): -``` -GET /admin/fleet/vehicle-types/models/page?page=1&pageSize=20&vehicleTypeId=1234567890123456789 -Authorization: Bearer -(无请求体) -``` - -**典型示例 响应**: -```json -{ - "code": 200, - "data": { - "records": [ - { - "id": "9876543210987654321", - "vehicleTypeId": "1234567890123456789", - "modelName": "丰田汉兰达", - "seats": 7, - "basePrice": "800.00", - "alias": "汉兰达,HIGHLANDER", - "sortOrder": 1 - } - ], - "total": 1, - "page": 1, - "pageSize": 20 - }, - "msg": "成功" -} -``` - -**边界 请求**(跨大类按 modelName 搜"丰田"): -``` -GET /admin/fleet/vehicle-types/models/page?modelName=丰田 -``` - -**边界 请求**(按 seats=7 精确 + alias 模糊组合): -``` -GET /admin/fleet/vehicle-types/models/page?seats=7&alias=ODYSSEY -``` - -**异常 请求**(page=0 不合法): -``` -GET /admin/fleet/vehicle-types/models/page?page=0&pageSize=20 -``` -响应: -```json -{ "code": 400, "msg": "页码最小为1", "data": null } -``` - -**错误码**:400 参数校验 / 401 未登录 - ---- - -### 3.8 编辑型号 - -**PUT** `/admin/fleet/vehicle-types/models/{modelId}` - -- **使用场景**:修改型号的 modelName / seats / basePrice / alias / sortOrder -- **认证**:管理后台 JWT -- **幂等**:是 - -**路径入参**: - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| `modelId` | Long | ✅ | 型号 ID | - -**Body 入参**:同 §3.6(不含 typeId,型号所属大类不可改) - -**出参**:`Result` - -**典型示例 请求**: -``` -PUT /admin/fleet/vehicle-types/models/9876543210987654321 -Authorization: Bearer -Content-Type: application/json - -{ - "modelName": "丰田汉兰达 (2025 款)", - "seats": 7, - "basePrice": "900.00", - "alias": "汉兰达,HIGHLANDER", - "sortOrder": 1 -} -``` - -**异常 请求**(型号名同大类内已被占用): -```json -{ "code": 600103, "msg": "车型型号已存在", "data": null } -``` - -**错误码**:400 参数校验 / **600103** 型号名已存在 / **600106** 型号不存在 / 401 未登录 - ---- - -### 3.9 删除型号(软删) - -**DELETE** `/admin/fleet/vehicle-types/models/{modelId}` - -- **使用场景**:下架某个型号。**被车辆引用时禁止删除**(应用层校验) -- **认证**:管理后台 JWT -- **幂等**:是 - -**路径入参**: - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| `modelId` | Long | ✅ | 型号 ID | - -**出参**:`Result` - -**典型示例 请求**: -``` -DELETE /admin/fleet/vehicle-types/models/9876543210987654321 -Authorization: Bearer -(无请求体) -``` - -**典型示例 响应**: -```json -{ "code": 200, "data": null, "msg": "成功" } -``` - -**异常 请求**(型号被车辆引用): -```json -{ "code": 600105, "msg": "型号被车辆引用,不能删除", "data": null } -``` - -**错误码**:**600105** 型号被车辆引用 / **600106** 型号不存在 / 401 未登录 - ---- - -## 6. 枚举 / 数据字典 - -本模块**无静态枚举 / 字典**: - -- `typeKey` 是 `fleet_vehicle_type` 表的一个 `VARCHAR(16)` 字段(行级数据),不是后端枚举常量,**没有字典表**。系统初始化灌入了 4 条标准记录(详见 §9 业务边界),但 typeKey 可通过 §3.3 自由扩展 -- `seats` 是数值范围(4-19,`@Min` / `@Max` 校验),不是枚举 -- 其他字段(modelName / basePrice / alias 等)均为自由文本/数字 - ---- - -## 7. 错误码(全模块汇总) - -| code | 含义 | 触发条件 | 涉及接口 | -|------|------|----------|----------| -| 400 | 参数校验失败 | 字段缺失 / 长度 / 范围越界 | 所有写入接口 + 分页接口 | -| 401 | 未登录 | JWT 无效或缺失 | 全部 9 接口 | -| **600101** | 车型大类 key 已存在 | typeKey 全局唯一约束 | §3.3 新增大类 | -| **600102** | 车型大类不存在 | typeId 无效或已软删 | §3.4 §3.5 §3.6 | -| **600103** | 车型型号已存在 | 同大类内型号名唯一约束 | §3.6 §3.8 | -| **600104** | 大类下存在型号,不能删除 | 应用层校验 | §3.5 | -| **600105** | 型号被车辆引用,不能删除 | 应用层校验 | §3.9 | -| **600106** | 车型型号不存在 | modelId 无效或已软删 | §3.8 §3.9 | - -> 错误码段位 600101-600106 归属 hl-fleet-service,本次未新增段位。 - ---- - -## 9. 业务边界 - -- ✅ **大类 typeKey 编辑**:编辑大类时后端**忽略**入参的 typeKey 字段(不改),其他字段正常更新 -- ✅ **大类软删保护**:大类下有未删除型号时禁删(600104);先删型号或迁移型号到其他大类 -- ✅ **型号软删保护**:型号被任一车辆(fleet_vehicle)引用时禁删(600105) -- ✅ **同名约束**:typeKey **全局**唯一(违反抛 600101);modelName **同大类内**唯一(违反抛 600103) -- ✅ **分页默认值**:`page=1`、`pageSize=20`、`pageSize` 上限 100 -- ✅ **跨大类搜索**:§3.7 不传 `vehicleTypeId` + 任意过滤 = 跨大类搜索(不报错) -- ⚠️ **新增型号副作用**:§3.6 新增型号后会触发价格日历初始化(见 FLEET §9.4),前端无需感知 - -### typeKey 系统初始化数据(不是枚举,可被 §3.3 扩展) - -系统初始化时灌入了 4 条标准大类(来自 DB 初始化脚本): - -| typeKey | typeName | 用途参考 | -|---|---|---| -| `suv` | SUV 越野 | 高底盘 / 多人出行 | -| `mpv` | MPV 商务 | 7 座商务车 | -| `bus` | 中巴 | 10-19 座 | -| `sedan` | 轿车 | 5 座 | - -> ⚠️ 这是**表里的现有数据**,**不是枚举校验**。运营可随时通过 §3.3 新增 `minibus` / `coach` 等任意 typeKey(仅约束:全局不重复)。前端展示时**建议从 §3.1 或 §3.2 实时查**,不要硬编码上面 4 个值。 - ---- - -## 11. 影响评估 - -- **是否破坏向后兼容**:否(§3.1-§3.6/§3.8/§3.9 契约零变化,仅新增 §3.2 §3.7 两个分页接口) -- **前端是否必须同步上线**:否(不调用新接口的页面不受影响) -- **影响已有数据**:无(无 DDL,无数据迁移) - ---- - -## 12. 注意事项 - -- **分页参数名**:`page` / `pageSize`(**不是** pageNo),所有继承 PageParam 的入参都遵此约定 -- **主键 Long 序列化**:`id` / `vehicleTypeId` 等 Long 字段 JSON 返回为 String,前端**不要**当 Number 解析(精度会丢失)。表单提交时仍可用 Number/String 双向兼容 -- **整树 vs 分页的取舍**:低基数字典(< 20 大类 / < 200 型号)继续用 §3.1 整树拉一次缓存到内存;高基数或要服务端搜索时用 §3.2 / §3.7 -- **basePrice 序列化**:`BigDecimal` 序列化为 String(如 `"800.00"`),前端按字符串接收避免精度问题 - ---- - -## 13. 关联 / 联系人 - -### 13.1 链接 - -- **Issue**: [#2785](https://git.1814.love:8443/wx/HL/issues/2785) -- **PR**: [#2786](https://git.1814.love:8443/wx/HL/pulls/2786) -- **Merge commit**: [`90109cd58`](https://git.1814.love:8443/wx/HL/commit/90109cd58e33a8c4e7bc802a92cf8cb1d6921050) -- **API 文档**: `docs/order-v3/api/API-SPEC-FLEET-V1.5.html` §1(车型管理库 6 接口;实际代码 9 端点 = §1.4 编辑/删除合并算 1 节) -- **同期相关 PR**: - - [#2796](https://git.1814.love:8443/wx/HL/pulls/2796) 司机详情 relatedOrders mock - - [#2799](https://git.1814.love:8443/wx/HL/pulls/2799) 司机自助 H5 - - [#2800](https://git.1814.love:8443/wx/HL/pulls/2800) 司机待审核 - - [#2804](https://git.1814.love:8443/wx/HL/pulls/2804) fleet 文档 v1.5 同步 - -### 13.2 联系人 - -- **后端负责人**: @yst(腰苏图) -- **前端对接(管理后台)**: 待指派 diff --git a/changelogs-v2/2026-05/21_2791_司机档案-修改接口-管理后台.md b/changelogs-v2/2026-05/21_2791_司机档案-修改接口-管理后台.md deleted file mode 100644 index 63d9835..0000000 --- a/changelogs-v2/2026-05/21_2791_司机档案-修改接口-管理后台.md +++ /dev/null @@ -1,748 +0,0 @@ -# 【修改接口·管理后台】司机档案 6 接口(详情新增 relatedOrders mock 字段 + 全模块快照) - -> **PR**: #2796(详情加 relatedOrders mock 字段) | **服务**: hl-fleet-service | **更新时间**: 2026-05-21 -> -> **存放目录**: `changelogs-v2/2026-05/` -> **影响范围**: 管理后台「车管 / 司机档案」页(列表 + 详情 + 新增 + 编辑 + 软删 + Excel 批量导入) - ---- - -## ⚠️ 关键变化 - -| # | 接口 | 状态 | 说明 | -|---|---|---|---| -| §3.2 | GET `/admin/fleet/drivers/{driverId}` | **🔧 修改** | 响应**新增 `relatedOrders` 字段**(mock 占位,固定 3 条假数据) | -| 其余 5 接口 | — | 首推 | 契约自模块首次落地(PR #2724)以来未变化,本次首推完整 changelog | - -> **`relatedOrders` 字段是 mock**!固定返回 3 条假数据,所有司机返回相同内容。前端可基于字段做 UI 但**不要硬编码业务逻辑**(如"看到张总订单 = 司机已派单")。详见 §3.2 + §9 + §12。 - ---- - -## 1. 接口背景 - -司机档案是车队所有司机的主数据:基本信息 / 驾照 / 紧急联系人 / 保险 / 历史统计 / 标签 / 多类目附件(身份证/驾驶证/肖像/健康证/培训证/荣誉/从业资格/其他 8 类)。 - -PR #2796 在司机详情 §3.2 响应里加了 `relatedOrders` 字段,让前端可以提前对接「司机详情 → 关联订单列表」的 UI 区块。但由于派车模块(订单 ↔ 司机关联)尚未对接到 fleet 服务,**当前返回固定 3 条 mock 假数据**,待后续真实化(详见 #2791)。 - ---- - -## 2. 变更清单 - -| # | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|----------|------| -| 1 | GET | `/admin/fleet/drivers/page` | 首推 | 分页列表 | -| 2 | GET | `/admin/fleet/drivers/{driverId}` | **修改** | 详情,**新增 `relatedOrders` mock 字段** | -| 3 | POST | `/admin/fleet/drivers` | 首推 | 新增(含标签 + 附件批量提交) | -| 4 | PUT | `/admin/fleet/drivers/{driverId}` | 首推 | 编辑(attachments diff + tags 全量覆盖) | -| 5 | DELETE | `/admin/fleet/drivers/{driverId}` | 首推 | 软删 | -| 6 | POST | `/admin/fleet/drivers/import` | 首推 | Excel 批量导入(按身份证去重) | - ---- - -## 3. 接口详情 - -### 3.1 分页查询 - -**GET** `/admin/fleet/drivers/page` - -- **使用场景**:司机档案列表页,支持「2026 年赛季在册 / 续费待回复 / 往年档案 / 黑名单 / 全部」5 个 tab 切换(前端按 `season` 字段传值) -- **认证**:管理后台 JWT -- **幂等**:是 - -**Query 入参**: - -| 字段 | 类型 | 必填 | 默认 | 校验 | 说明 | -|---|---|---|---|---|---| -| `page` | int | ❌ | 1 | `>= 1` | 页码 | -| `pageSize` | int | ❌ | 20 | `1-100` | 每页条数 | -| `keyword` | string | ❌ | — | — | 姓名模糊匹配 | -| `driverStatus` | string | ❌ | — | `idle/busy/rest/pending` | 状态精确(见 §6.2) | -| `season` | string | ❌ | — | `active/pending/archived/blacklist` | 赛季精确(见 §6.3,对应前端 5 tab) | -| `tagName` | string | ❌ | — | — | 标签名精确(拥有该标签的司机) | -| `primaryVehiclePlate` | string | ❌ | — | — | 常驻车车牌精确匹配 | -| `insuranceType` | string | ❌ | — | `annual/perTrip/none` | 保险类型精确(见 §6.4) | - -**出参**:`Result>` (phone/idCard 脱敏;列表项含 tags,**不含**附件详情) - -| 字段 | 类型 | 说明 | -|---|---|---| -| `records[].id` | string | 司机 ID | -| `records[].name` | string | 姓名 | -| `records[].phone` | string | 手机号(脱敏,如 `138****1234`) | -| `records[].idCard` | string | 身份证号(脱敏,如 `150102******1234`) | -| `records[].gender` | string | 性别 | -| `records[].years` | int | 驾龄 | -| `records[].driverStatus` | string | 状态(见 §6.2) | -| `records[].season` | string | 赛季(见 §6.3) | -| `records[].primaryVehiclePlate` | string | 常驻车车牌 | -| `records[].insuranceType` | string | 保险类型(见 §6.4) | -| `records[].tags[]` | array | 标签列表 | -| `records[].createTime` | datetime | — | -| `total` / `page` / `pageSize` | int | 分页元数据 | - -**典型示例 请求**(5 tab 之一:在册): -``` -GET /admin/fleet/drivers/page?page=1&pageSize=20&season=active -Authorization: Bearer -(无请求体) -``` - -**典型示例 响应**: -```json -{ - "code": 200, - "data": { - "records": [ - { - "id": "1234567890123456789", - "name": "张三", - "phone": "138****1234", - "idCard": "150102******1234", - "gender": "男", - "years": 8, - "driverStatus": "idle", - "season": "active", - "primaryVehiclePlate": "蒙A-88888", - "insuranceType": "annual", - "tags": ["老司机", "蒙语流利"], - "createTime": "2025-05-21 14:00:00" - } - ], - "total": 1, - "page": 1, - "pageSize": 20 - }, - "msg": "成功" -} -``` - -**前端 tab → season 取值映射**: - -| 前端 tab | 后端参数 | -|---|---| -| 全部 | (不传 season) | -| 2026 年赛季在册 | `season=active` | -| 续费待回复 | `season=pending` | -| 往年档案 | `season=archived` | -| 黑名单 | `season=blacklist` | - -> "2026 年"是装饰文案(取自前端业务文案约定),后端 `season` 字段不带年份维度。 - -**错误码**:400 参数校验 / 401 未登录 - ---- - -### 3.2 详情 🔧 修改(新增 `relatedOrders` mock 字段) - -**GET** `/admin/fleet/drivers/{driverId}` - -- **使用场景**:详情页 / 编辑前预填 -- **认证**:管理后台 JWT -- **幂等**:是 - -**路径入参**: - -| 字段 | 类型 | 必填 | 说明 | -|---|---|---|---| -| `driverId` | Long | ✅ | 司机 ID | - -**出参**:`Result` - -主体字段(含 §3.1 全部字段)+ 以下扩展: - -| 字段 | 类型 | 说明 | -|---|---|---| -| `nation` | string | 民族 | -| `preferredTypeKey` | string | 常开车型大类 key | -| `preferredModel` | string | 常开车型名 | -| `vehicleSource` | string | 车源(own/company) | -| `activeYearsJson` | string | 历次在册年份 JSON 数组字符串(如 `"[2023,2024,2025]"`) | -| `license` | object | 驾照信息(见下) | -| `emergency` | object | 紧急联系人(见下) | -| `insurance` | object | 保险信息(见下) | -| `stats` | object | 历史统计(见下) | -| `tags[]` | array | 标签列表 | -| `attachments` | object | 附件按类目分组(key=category,value=该类目附件列表) | -| **`relatedOrders[]`** | **array** | **关联订单(mock 占位,固定 3 条,详见警示)** | -| `createTime` / `updateTime` | datetime | — | - -**`license`**(`DriverLicenseVO`,DB 字段平铺,API 嵌套返回): - -| 字段 | 类型 | 说明 | -|---|---|---| -| `no` | string | 驾照号 | -| `type` | string | 准驾车型(A1/A2/B1/B2 等) | -| `expire` | date | 有效期 | -| `issuedBy` | string | 发证机关 | - -**`emergency`**(`DriverEmergencyVO`): - -| 字段 | 类型 | 说明 | -|---|---|---| -| `name` | string | 紧急联系人姓名 | -| `phone` | string | 手机号 | -| `relation` | string | 关系(父亲 / 妻子 等) | - -**`insurance`**(`DriverInsuranceVO`): - -| 字段 | 类型 | 说明 | -|---|---|---| -| `type` | string | 保险类型(见 §6.4) | -| `company` | string | 保险公司(annual 必填) | -| `policyNo` | string | 年保单号(annual 必填) | -| `annualPremium` | string | 年保险费(BigDecimal 序列化) | -| `annualStart` | date | 年保险起始日 | -| `annualEnd` | date | 年保险结束日 | -| `perDayRate` | string | 行程保险日费率(perTrip 必填) | - -**`stats`**(`DriverStatsVO`,详情专用): - -| 字段 | 类型 | 说明 | -|---|---|---| -| `totalOrders` | int | 历史接单总数 | -| `avgRating` | string | 平均评分 0-5(BigDecimal 序列化) | -| `lastOrderAt` | date | 最近接单日期 | - -**`attachments`**:`Map>`,key=类目(见 §6.1),value=该类目下的附件列表(按 sortNo 升序): - -| 字段 | 类型 | 说明 | -|---|---|---| -| `id` | string | 附件 ID | -| `driverId` | string | 所属司机 ID | -| `category` | string | 类目(见 §6.1) | -| `sortNo` | int | 同类目排序(0-based) | -| `url` | string | OSS URL | -| `mimeType` | string | 例 `image/jpeg` | - -**`relatedOrders[]`**(**⚠️ mock 占位**): - -| 字段 | 类型 | 说明 | -|---|---|---| -| `orderId` | string | 订单 ID(前端跳转用) | -| `orderNo` | string | 订单号(如 `HL2026060100123`) | -| `groupNo` | string | 团号(如 `T2026-001`) | -| `customerName` | string | 客户姓名 | -| `tripStartDate` | date | 行程起始日 | -| `tripEndDate` | date | 行程结束日 | -| `destination` | string | 目的地概要 | -| `orderStatus` | string | 订单状态(`pending` / `in_progress` / `completed`) | -| `vehicleType` | string | 车型快照 | -| `licensePlate` | string | 车牌快照 | - -> **mock 真相**(来自代码 `DriverService.buildMockRelatedOrders()`): -> - 当前**固定返回 3 条假数据**(李先生 in_progress / 王女士 completed / 张总 pending) -> - 所有 driverId 返回的内容**完全相同** -> - 真实化时机:派车模块对接 fleet 服务后,由 DriverService 改为 Feign 调 order 服务按 staffId 反查(Issue #2791) - -**典型示例 响应**(节选): -```json -{ - "code": 200, - "data": { - "id": "1234567890123456789", - "name": "张三", - "phone": "138****1234", - "idCard": "150102******1234", - "gender": "男", - "nation": "蒙古族", - "years": 8, - "driverStatus": "idle", - "season": "active", - "activeYearsJson": "[2023,2024,2025]", - "primaryVehiclePlate": "蒙A-88888", - "preferredTypeKey": "suv", - "preferredModel": "丰田汉兰达", - "vehicleSource": "company", - "license": { - "no": "15010219800101XXXX", - "type": "B2", - "expire": "2030-01-01", - "issuedBy": "内蒙古公安厅交通管理局" - }, - "emergency": { - "name": "张三丰", - "phone": "13800000000", - "relation": "妻子" - }, - "insurance": { - "type": "annual", - "company": "中国人保财险", - "policyNo": "PICC-2024-XXX", - "annualPremium": "3000.00", - "annualStart": "2024-01-01", - "annualEnd": "2025-01-01", - "perDayRate": null - }, - "stats": { - "totalOrders": 128, - "avgRating": "4.85", - "lastOrderAt": "2025-05-18" - }, - "tags": ["老司机", "蒙语流利"], - "attachments": { - "id_card": [ - { "id": "...", "driverId": "...", "category": "id_card", "sortNo": 0, "url": "https://oss/.../front.jpg", "mimeType": "image/jpeg" }, - { "id": "...", "driverId": "...", "category": "id_card", "sortNo": 1, "url": "https://oss/.../back.jpg", "mimeType": "image/jpeg" } - ], - "driver_license": [...], - "portrait": [...] - }, - "relatedOrders": [ - { - "orderId": "900000000000000001", - "orderNo": "HL2026060100123", - "groupNo": "T2026-001", - "customerName": "李先生", - "tripStartDate": "2026-06-01", - "tripEndDate": "2026-06-05", - "destination": "呼伦贝尔草原 / 阿尔山 / 海拉尔", - "orderStatus": "in_progress", - "vehicleType": "丰田汉兰达", - "licensePlate": "蒙A-12345" - }, - { - "orderId": "900000000000000002", - "orderNo": "HL2026051800456", - "groupNo": "T2026-002", - "customerName": "王女士", - "tripStartDate": "2026-05-18", - "tripEndDate": "2026-05-22", - "destination": "额尔古纳 / 室韦 / 莫尔道嘎", - "orderStatus": "completed", - "vehicleType": "丰田考斯特", - "licensePlate": "蒙A-66666" - }, - { - "orderId": "900000000000000003", - "orderNo": "HL2026070200789", - "groupNo": "T2026-003", - "customerName": "张总", - "tripStartDate": "2026-07-02", - "tripEndDate": "2026-07-08", - "destination": "满洲里 / 套娃景区 / 国门", - "orderStatus": "pending", - "vehicleType": "奔驰威霆", - "licensePlate": "蒙A-88888" - } - ], - "createTime": "2025-05-21 14:00:00", - "updateTime": "2025-05-21 14:00:00" - }, - "msg": "成功" -} -``` - -**错误码**:**600205** 司机不存在 / 401 未登录 - ---- - -### 3.3 新增 - -**POST** `/admin/fleet/drivers` - -- **使用场景**:新增司机(含 tags 批量 + 附件批量提交,**同一事务**) -- **认证**:管理后台 JWT -- **幂等**:否(身份证 / 手机号重复抛 600200 / 600203) - -**Body 入参**(`DriverSaveReqVO`): - -| 字段 | 类型 | 必填 | 校验 | 说明 | -|---|---|---|---|---| -| `name` | string | ✅ | `@Size(max=32)` | 姓名 | -| `phone` | string | ✅ | `@Pattern(^\d{11}$)` | 手机号 11 位(**编辑时忽略**) | -| `idCard` | string | ✅ | `@Size(min=18,max=32)` | 身份证号(**编辑时忽略**) | -| `gender` | string | ❌ | `@Size(max=4)` | 性别(男 / 女) | -| `nation` | string | ❌ | `@Size(max=16)` | 民族 | -| `years` | int | ❌ | — | 驾龄(年) | -| `driverStatus` | string | ❌ | `@Pattern(idle\|busy\|rest\|pending)` | 状态 | -| `season` | string | ❌ | `@Pattern(active\|pending\|archived\|blacklist)` | 赛季 | -| `primaryVehiclePlate` | string | ❌ | `@Size(max=16)` | 常驻车车牌 | -| `preferredTypeKey` | string | ❌ | `@Size(max=16)` | 常开车型大类 key | -| `preferredModel` | string | ❌ | `@Size(max=64)` | 常开车型名 | -| `vehicleSource` | string | ❌ | `@Size(max=16)` | 车源(own / company) | -| `license` | object | ❌ | — | 驾照嵌套对象(同 §3.2) | -| `emergency` | object | ❌ | — | 紧急联系人嵌套对象(同 §3.2) | -| `insurance` | object | ❌ | — | 保险嵌套对象(同 §3.2) | -| `tags[]` | array | ❌ | `@Size(max=20)` | 标签列表(**全量覆盖**) | -| `attachments[]` | array | ❌ | — | 附件数组(见 §3.3 attachment 表) | - -**`attachments[]` 单项**(`DriverAttachmentReqVO`): - -| 字段 | 类型 | 必填 | 校验 | 说明 | -|---|---|---|---|---| -| `id` | Long | ❌ | — | 新增项不传 | -| `category` | string | ✅ | `@Size(max=32)` | 类目(见 §6.1) | -| `url` | string | ✅ | `@Size(max=512)` | OSS URL | -| `mimeType` | string | ✅ | `@Size(max=64)` | 例 `image/jpeg` | -| `sortNo` | int | ❌ | — | 不传时按入参顺序自动重写 0..N-1 | - -**出参**:`Result` - -| 字段 | 类型 | 说明 | -|---|---|---| -| `id` | string | 新增司机 ID | -| `attachmentIds[]` | array | 附件 ID 列表(按入参顺序) | - -**典型示例 请求**(节选): -``` -POST /admin/fleet/drivers -Authorization: Bearer -Content-Type: application/json - -{ - "name": "张三", - "phone": "13812341234", - "idCard": "150102198001011234", - "gender": "男", - "nation": "蒙古族", - "years": 8, - "driverStatus": "idle", - "season": "active", - "primaryVehiclePlate": "蒙A-88888", - "preferredTypeKey": "suv", - "preferredModel": "丰田汉兰达", - "vehicleSource": "company", - "license": { - "no": "15010219800101XXXX", - "type": "B2", - "expire": "2030-01-01", - "issuedBy": "内蒙古公安厅交通管理局" - }, - "emergency": { - "name": "张三丰", - "phone": "13800000000", - "relation": "妻子" - }, - "insurance": { - "type": "annual", - "company": "中国人保财险", - "policyNo": "PICC-2024-XXX", - "annualPremium": "3000.00", - "annualStart": "2024-01-01", - "annualEnd": "2025-01-01" - }, - "tags": ["老司机", "蒙语流利"], - "attachments": [ - { "category": "id_card", "url": "https://oss/.../id-front.jpg", "mimeType": "image/jpeg" }, - { "category": "id_card", "url": "https://oss/.../id-back.jpg", "mimeType": "image/jpeg" }, - { "category": "driver_license", "url": "https://oss/.../license.jpg", "mimeType": "image/jpeg" }, - { "category": "portrait", "url": "https://oss/.../portrait.jpg", "mimeType": "image/jpeg" } - ] -} -``` - -**异常 请求**(身份证重复): -```json -{ "code": 600200, "msg": "身份证已存在", "data": null } -``` - -**异常 请求**(驾照过期): -```json -{ "code": 600201, "msg": "驾照已过期", "data": null } -``` - -**错误码**:400 参数校验 / **600200** 身份证已存在 / **600201** 驾照已过期 / **600203** 手机号已存在 / **601002** 附件类目非法 / **601003** 类目张数达上限 / 401 未登录 - ---- - -### 3.4 编辑(attachments diff + tags 全量覆盖) - -**PUT** `/admin/fleet/drivers/{driverId}` - -- **使用场景**:编辑司机基本信息 + 标签全量覆盖 + 附件增删改一次性提交 -- **认证**:管理后台 JWT -- **幂等**:是 - -**路径入参**: - -| 字段 | 类型 | 必填 | 说明 | -|---|---|---|---| -| `driverId` | Long | ✅ | 司机 ID | - -**Body 入参**:同 §3.3(共用 `DriverSaveReqVO`),但: - -- **`idCard` / `phone` 后端忽略**(不可改) -- **`tags[]` 全量覆盖**:物理删除旧 tags + 批量 INSERT 新 tags(空数组 = 清空所有标签) -- **`attachments[]` diff 语义**:有 id 命中 → 保留;无 id → INSERT;DB 有但未传 → 软删 - -**附件 diff 语义**(与车辆档案 §3.4 一致): - -| 入参 attachments[] 项 | DB 中的对应行 | 行为 | -|---|---|---| -| 有 `id` + DB 命中 | 存在 | 保留(可更新 sortNo) | -| 无 `id`(新增项) | — | INSERT | -| — | 存在但本次未传 | 软删 | - -> **特别说明(前 3 类目"换证留历史"语义)**:`id_card` / `driver_license` / `portrait` 旧附件不在本次入参里 → 自动软删;新 url 无 id → INSERT。前端"换证"时不需要先调删除接口,直接组装新 attachments 数组即可。 - -**出参**:`Result` - -| 字段 | 类型 | 说明 | -|---|---|---| -| `kept` | int | 保留的附件数 | -| `inserted` | int | 新插入的附件数 | -| `softDeleted` | int | 软删的附件数 | -| `tagsReplaced` | int | 覆盖写入的标签数 | - -**典型示例 响应**: -```json -{ - "code": 200, - "data": { "kept": 3, "inserted": 1, "softDeleted": 2, "tagsReplaced": 3 }, - "msg": "成功" -} -``` - -**错误码**:400 参数校验 / **600201** 驾照已过期 / **600205** 司机不存在 / **601002** 类目非法 / **601003** 类目张数达上限 / 401 未登录 - ---- - -### 3.5 软删 - -**DELETE** `/admin/fleet/drivers/{driverId}` - -- **使用场景**:下架司机 -- **认证**:管理后台 JWT -- **幂等**:是 - -**路径入参**: - -| 字段 | 类型 | 必填 | 说明 | -|---|---|---|---| -| `driverId` | Long | ✅ | 司机 ID | - -**出参**:`Result` - -**典型示例 响应**: -```json -{ "code": 200, "data": null, "msg": "成功" } -``` - -**异常 请求**(**业务流水 PR 上线后才生效**): -```json -{ "code": 600204, "msg": "司机有未完成派单,不能删除", "data": null } -``` - -**错误码**:**600204** 有未完成派单(占位,业务流水 PR 上线后生效) / **600205** 司机不存在 / 401 未登录 - ---- - -### 3.6 Excel 批量导入 - -**POST** `/admin/fleet/drivers/import` - -- **使用场景**:运营批量录入司机 -- **认证**:管理后台 JWT -- **幂等**:是(按身份证去重,已存在则**更新**,不存在则**新增**) - -**入参**(multipart/form-data): - -| 字段 | 类型 | 必填 | 说明 | -|---|---|---|---| -| `file` | file | ✅ | Excel(`.xlsx` / `.xls`)或 CSV | - -**表头约定(第 1 行 15 列,顺序固定)**: - -``` -姓名 | 手机号 | 身份证号 | 性别 | 民族 | 驾龄(年) | -驾照号 | 准驾车型 | 驾照有效期(yyyy-MM-dd) | 发证机关 | -紧急联系人姓名 | 紧急联系人手机 | 与司机关系 | -保险类型(annual/perTrip/none) | 常驻车车牌 -``` - -**出参**:`Result`(**字段名与车辆导入不同**) - -| 字段 | 类型 | 说明 | -|---|---|---| -| `total` | int | 总行数(不含表头) | -| `insertedCount` | int | 新增成功数 | -| `renewedCount` | int | 更新成功数(按身份证去重,已存在则更新) | -| `errorCount` | int | 失败行数 | -| `errors[]` | array | 失败行详情 | - -**典型示例 响应**: -```json -{ - "code": 200, - "data": { - "total": 10, - "insertedCount": 6, - "renewedCount": 2, - "errorCount": 2, - "errors": [ - { "row": 3, "name": "张三", "msg": "驾照已过期" }, - { "row": 7, "name": "李四", "msg": "手机号格式错误" } - ] - }, - "msg": "成功" -} -``` - -> ⚠️ 与车辆导入的出参字段不同:车辆是 `success/failed/errorRows`,司机是 `insertedCount/renewedCount/errorCount/errors`。前端**不能**复用同一份解析逻辑。 - -**错误码**:400 文件解析失败 / 401 未登录 - ---- - -## 6. 枚举 / 数据字典 - -### 6.1 附件类目(`category`,`DriverAttachmentCategoryEnum`) - -**所属字段**:`DriverAttachmentReqVO.category` / `DriverAttachmentRespVO.category` | **类型**:`String` | **必填**:✅ - -**真枚举**(后端硬编码 8 类目,含同类目张数上限): - -| 值 | 中文 | 张数上限 | 备注 | -|---|---|---|---| -| `id_card` | 身份证 | 2 | "换证留历史"语义(支持正反 2 张或新旧 2 套) | -| `driver_license` | 驾驶证 | 2 | "换证留历史" | -| `portrait` | 肖像照 | 2 | "换证留历史" | -| `health_cert` | 健康证 | 2 | — | -| `training_cert` | 培训证书 | 5 | — | -| `award` | 荣誉奖励 | 5 | — | -| `qualification` | 从业资格证 | 3 | — | -| `other` | 其他附件 | 5 | — | - -> 超出上限触发 **601003** "该类目张数已达上限"。 - -### 6.2 司机状态(`driverStatus`,`DriverStatusEnum`) - -**所属字段**:`DriverSaveReqVO.driverStatus` / `DriverPageReqVO.driverStatus` / `DriverPageItemRespVO.driverStatus` / `DriverDetailRespVO.driverStatus` | **类型**:`String` | **必填**:❌ - -**`@Pattern` 强校验枚举**: - -| 值 | 中文 | 说明 | -|---|---|---| -| `idle` | 空闲 | 可接单 | -| `busy` | 在途 | 正在执行派单 | -| `rest` | 休假 | 暂不接单 | -| `pending` | 待激活 | 新入职 / 回归尚未完成入驻 | - -### 6.3 赛季(`season`,`SeasonEnum`) - -**所属字段**:同 driverStatus | **类型**:`String` | **必填**:❌ - -**`@Pattern` 强校验枚举**: - -| 值 | 中文 | 说明 | -|---|---|---| -| `active` | 在册 | 当前赛季正常在职 | -| `pending` | 待续签 | 赛季到期已发出续签邀请 | -| `archived` | 已归档 | 本赛季已退出 | -| `blacklist` | 黑名单 | 永久拉黑 | - -### 6.4 保险类型(`insuranceType`,`InsuranceTypeEnum`) - -**所属字段**:`DriverInsuranceVO.type` / `DriverPageReqVO.insuranceType` / `DriverPageItemRespVO.insuranceType` | **类型**:`String` | **必填**:❌ - -| 值 | 中文 | 必填字段 | -|---|---|---| -| `annual` | 年保险 | 需填 `company` / `policyNo` / `annualPremium` / `annualStart` / `annualEnd` | -| `perTrip` | 行程保险 | 需填 `perDayRate`(按行程计费) | -| `none` | 无保险 | — | - -### 6.5 订单状态(`orderStatus`,**mock 字段**) - -**所属字段**:`DriverDetailRespVO.relatedOrders[].orderStatus` | **类型**:`String` | **mock 占位** - -| 值 | 中文 | -|---|---| -| `pending` | 待出行 | -| `in_progress` | 进行中 | -| `completed` | 已完成 | - -> ⚠️ 这是 **mock 数据**里的取值,真实派车模块对接后值列表可能扩展(如 `canceled` / `refunded` 等)。前端**不要硬编码状态映射**,等真实化后由后端文档明确。 - ---- - -## 7. 错误码(全模块汇总) - -| code | 含义 | 触发条件 | 涉及接口 | -|---|---|---|---| -| 400 | 参数校验失败 | 字段缺失/长度/枚举/手机号格式/MIME 非法 | 所有写入接口 | -| 401 | 未登录 | JWT 无效或缺失 | 全部 6 接口 | -| **600200** | 身份证已存在 | `idCard` 全局唯一约束 | §3.3 | -| **600201** | 驾照已过期 | `license.expire < 今日`(新增 / 编辑主动校验) | §3.3 §3.4 | -| **600203** | 手机号已存在 | `phone` 全局唯一约束 | §3.3 | -| **600204** | 司机有未完成派单 | 业务流水 PR 上线后才触发(目前占位) | §3.5 | -| **600205** | 司机不存在 | `driverId` 无效或软删 | §3.2 §3.4 §3.5 | -| **601001** | 实体不存在 | 附件关联的主司机不存在 | §3.3 §3.4 | -| **601002** | 附件类目非法 | `category` 不在 §6.1 枚举内 | §3.3 §3.4 | -| **601003** | 该类目张数已达上限 | 超出 §6.1 张数上限 | §3.3 §3.4 | -| **601004** | 文件超出大小限制 | 应用层 + OSS HEAD 校验 | §3.3 §3.4 | -| **601005** | 文件类型非法 | MIME 不在白名单 | §3.3 §3.4 | - -> 错误码段位 600200-600205 归属司机档案(无与车辆 / 车型管理库冲突);601001-601005 归属附件管理子段(车辆 / 司机共用)。 -> -> **未列错误码 600202**(司机已黑名单):占位常量,业务流水 PR 上线后才会触发。 - ---- - -## 9. 业务边界 - -- ✅ **PII 脱敏**:`phone` / `idCard` 在 §3.1 列表项 + §3.2 详情**响应**中均脱敏返回(`138****1234` / `150102******1234`);DB 存明文。前端展示时**直接用响应值**即可 -- ✅ **编辑不可改 idCard / phone**:§3.4 入参中的 `idCard` / `phone` 后端**忽略**,要改身份证 / 手机号需联系后端管理员(业务上极少发生) -- ✅ **驾照过期校验**:§3.3 §3.4 主动校验 `license.expire < 今日`(不影响存量数据,仅写入时校验) -- ✅ **tags 全量覆盖语义**:§3.4 `tags=[]` = 清空所有标签;`tags=null` 也视为不修改(不传字段 = 不动),建议前端**显式传空数组**清空 -- ✅ **附件 diff 语义**:与车辆档案 §3.4 一致;id_card/driver_license/portrait 三类支持"换证留历史"(旧软删 + 新插入由 diff 天然完成) -- ✅ **唯一约束**:`idCard` / `phone` **全局**唯一 -- ⚠️ **relatedOrders mock 占位**:见 §3.2 / §12 - ---- - -## 10. 修改前后对比(仅 §3.2 详情) - -### 10.1 字段级对比 - -| 字段 | 改前 | 改后 | -|---|---|---| -| `DriverDetailRespVO` | 无 `relatedOrders` 字段 | 新增 `relatedOrders[]` 字段(mock 数据) | - -### 10.2 行为级对比 - -| 行为 | 改前 | 改后 | -|---|---|---| -| 调 §3.2 详情 | 响应里无关联订单信息 | 响应额外含 3 条 mock 订单 | - ---- - -## 11. 影响评估 - -- **是否破坏向后兼容**:否(仅新增字段,老前端忽略该字段照常工作) -- **前端是否必须同步上线**:否(前端可按节奏对接 relatedOrders UI 区块) -- **影响已有数据**:无(mock 数据来自代码,不入库) - ---- - -## 12. 注意事项 - -- **⚠️ `relatedOrders` 是 mock**: - - 固定 3 条假数据,**所有司机返回相同内容** - - 前端**不要硬编码**业务逻辑(如"看到张总订单 = 司机已派单 / 不能软删"等推断) - - 真实化时机:派车模块对接 fleet 服务后,由 `DriverService.buildMockRelatedOrders` 替换为 Feign 实现(Issue #2791) - - 真实化后字段名 / 字段类型与本 changelog 一致(已约定的契约),但**取值范围可能扩展**(如 orderStatus 增加 `canceled`) -- **分页参数名**:`page` / `pageSize`(**不是** pageNo) -- **Long 主键序列化**:`id` / `attachments[].id` / `relatedOrders[].orderId` 等 Long 字段 JSON 返回为 String,前端**不要**当 Number 解析 -- **车辆导入 vs 司机导入字段名不同**:见 §3.6 警示 -- **5 个 tab 实现**:见 §3.1 表格,纯通过 `season` 参数实现,无新接口 -- **错误码段位连续**:600200-600205 全在司机档案段,无避让 - ---- - -## 13. 关联 / 联系人 - -### 13.1 链接 - -- **Issue(relatedOrders mock)**: [#2791](https://git.1814.love:8443/wx/HL/issues/2791) -- **PR(relatedOrders mock)**: [#2796](https://git.1814.love:8443/wx/HL/pulls/2796) -- **Merge commit**: [`ec0380439`](https://git.1814.love:8443/wx/HL/commit/ec03804390c7bd39f1b4ec3ddc3bd86aeb8ef47c) -- **API 文档**: `docs/order-v3/api/API-SPEC-FLEET-V1.5.html` §3 司机档案 -- **DB 文档**: `docs/order-v3/database/DATABASE-SCHEMA-FLEET-V1.5.html` §2.4 + §2.7 -- **同期相关 changelog**: - - 车型管理库 9 接口([`21_2785_车型管理库-新增接口-管理后台.md`](./21_2785_车型管理库-新增接口-管理后台.md)) - - 车辆档案 6 接口([`21_车辆档案-修改接口-管理后台.md`](./21_车辆档案-修改接口-管理后台.md)) - -### 13.2 联系人 - -- **后端负责人**: @yst(腰苏图) -- **前端对接(管理后台)**: 待指派 diff --git a/changelogs-v2/2026-05/21_2812_司机详情attachments强类型化-修改接口-管理后台.md b/changelogs-v2/2026-05/21_2812_司机详情attachments强类型化-修改接口-管理后台.md deleted file mode 100644 index 1c8c2d3..0000000 --- a/changelogs-v2/2026-05/21_2812_司机详情attachments强类型化-修改接口-管理后台.md +++ /dev/null @@ -1,197 +0,0 @@ -# 【修改接口·管理后台】司机详情 attachments 弱类型 Map 改强类型 DriverAttachmentsVO (#2812) - -> **PR**: #2818 | **服务**: hl-fleet-service | **更新时间**: 2026-05-21 15:30 -> -> **存放目录**: `changelogs-v2/2026-05/` -> **关联前序**: [`21_2791_司机档案-修改接口-管理后台.md`](./21_2791_司机档案-修改接口-管理后台.md)(commit `761ca07`) - ---- - -## ⚠️ 关键变化(30 秒速读) - -**`GET /admin/fleet/drivers/{driverId}` 的响应字段 `attachments` 类型变了**: - -| 项 | 改前 | 改后 | -|---|---|---| -| 类型 | `Map`(动态 key) | `DriverAttachmentsVO`(8 个固定字段) | -| 前端用法 | `data.attachments['id_card']` 字符串访问 | `data.attachments.idCard` 字段访问 | -| TypeScript 类型 | 没有具体字段名 | 8 个具体字段(含类型提示) | - -**前序 changelog 废止内容**:[`21_2791_司机档案-修改接口-管理后台.md`](./21_2791_司机档案-修改接口-管理后台.md) **§3.2 详情接口** + **§9 业务边界** 中所有把 attachments 描述为 `Map>` 的部分**已废**,以本文档为准。 - -**前端必须改动**(不是兼容的):所有 `data.attachments[key]` 形式的访问要改成 `data.attachments.xxx` 字段访问。 - ---- - -## 1. 接口背景 - -`attachments` 当前用 `Map>` 返回违反 HL 项目规则 [禁止弱类型返回值]: -- Swagger / TypeScript 生成的类型是 `{ [key: string]: DriverAttachmentRespVO[] }`,**没有具体字段名** -- 前端 IDE 不能自动补全 -- 拼错 key 编译期不报错 -- 文档无法自包含描述每个类目出参 - -改为强类型 `DriverAttachmentsVO`,8 个 List 字段对应 8 个固定类目(与 `DriverAttachmentCategoryEnum` 严格对齐)。 - ---- - -## 2. 变更清单 - -| # | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|----------|------| -| 1 | GET | `/admin/fleet/drivers/{driverId}` | **修改** | 响应字段 `attachments` 类型变化(详见 §3.1) | - -仅 1 个端点受影响。其余 5 个司机档案接口(page / create / update / delete / import)**不受影响**。 - ---- - -## 3. 接口详情 - -### 3.1 司机详情 — `attachments` 字段类型变化 - -**GET** `/admin/fleet/drivers/{driverId}` - -#### 改后的 `attachments` 字段结构 - -字段:`DriverAttachmentsVO` 对象(**不再是 Map**)。 - -| 字段 | 类型 | 默认 | 张数上限(来自 DriverAttachmentCategoryEnum) | -|---|---|---|---| -| `idCard` | `DriverAttachmentRespVO[]` | `[]` | 2("换证留历史":支持正反 2 张或新旧 2 套) | -| `driverLicense` | `DriverAttachmentRespVO[]` | `[]` | 2(换证留历史) | -| `portrait` | `DriverAttachmentRespVO[]` | `[]` | 2(换证留历史) | -| `healthCert` | `DriverAttachmentRespVO[]` | `[]` | 2 | -| `trainingCert` | `DriverAttachmentRespVO[]` | `[]` | 5 | -| `award` | `DriverAttachmentRespVO[]` | `[]` | 5 | -| `qualification` | `DriverAttachmentRespVO[]` | `[]` | 3 | -| `other` | `DriverAttachmentRespVO[]` | `[]` | 5 | - -> **每个字段默认空数组**(不为 null),前端**无需判空**,直接 `.map()` 渲染即可。 - -`DriverAttachmentRespVO[]` 单条项字段(**不变**): - -| 字段 | 类型 | 说明 | -|---|---|---| -| `id` | string | 附件 ID(Long 序列化为 String) | -| `driverId` | string | 所属司机 ID | -| `category` | string | 类目 | -| `sortNo` | int | 同类目排序(0-based) | -| `url` | string | OSS URL | -| `mimeType` | string | 例 `image/jpeg` | - -#### 改后响应示例(节选) - -```json -{ - "code": 200, - "data": { - "id": "1234567890123456789", - "name": "张三", - "...其他字段保持不变...": "...", - "attachments": { - "idCard": [ - { "id": "...", "driverId": "...", "category": "id_card", "sortNo": 0, "url": "https://oss/.../id-front.jpg", "mimeType": "image/jpeg" }, - { "id": "...", "driverId": "...", "category": "id_card", "sortNo": 1, "url": "https://oss/.../id-back.jpg", "mimeType": "image/jpeg" } - ], - "driverLicense": [ - { "id": "...", "driverId": "...", "category": "driver_license", "sortNo": 0, "url": "https://oss/.../license.jpg", "mimeType": "image/jpeg" } - ], - "portrait": [], - "healthCert": [], - "trainingCert": [], - "award": [], - "qualification": [], - "other": [] - }, - "relatedOrders": [...] - }, - "msg": "成功" -} -``` - ---- - -## 6. 枚举 / 数据字典 - -无新增枚举。`category` 字段语义和取值与前序 changelog [`21_2791_司机档案-修改接口-管理后台.md`](./21_2791_司机档案-修改接口-管理后台.md) §6.1 一致(8 个值),唯一差异是 **API 响应不再以 category 字符串作为 key**,而是用 VO 字段名(驼峰)。 - -类目 ↔ VO 字段对应关系: - -| DB / category 字段值 | VO 字段(驼峰) | -|---|---| -| `id_card` | `idCard` | -| `driver_license` | `driverLicense` | -| `portrait` | `portrait` | -| `health_cert` | `healthCert` | -| `training_cert` | `trainingCert` | -| `award` | `award` | -| `qualification` | `qualification` | -| `other` | `other` | - -注意单条 `DriverAttachmentRespVO.category` 仍然是 `id_card` / `driver_license` 等下划线值(不变)。改的是**外层分组的 key 形式**。 - ---- - -## 7. 错误码 - -无变化。 - ---- - -## 10. 修改前后对比 - -### 10.1 字段级对比 - -| 字段 | 改前 | 改后 | -|---|---|---| -| `attachments` 类型 | `Map` | `DriverAttachmentsVO`(8 个固定 List 字段) | -| `attachments` key 形式 | DB 下划线值(`id_card` / `driver_license` / `portrait` / ...) | VO 驼峰字段(`idCard` / `driverLicense` / `portrait` / ...) | -| 类目缺失 | 该 key 不在 Map 里 | 该字段是空数组 `[]` | - -### 10.2 前端代码对照 - -```typescript -// 改前 -const idCardAttachments = data.attachments['id_card'] ?? []; -const licenseAttachments = data.attachments['driver_license'] ?? []; - -// 改后 -const idCardAttachments = data.attachments.idCard; // 不用判空 -const licenseAttachments = data.attachments.driverLicense; -``` - ---- - -## 11. 影响评估 - -- **是否破坏向后兼容**:⚠️ **是**(字段类型变了,前端必须改) -- **前端是否必须同步上线**:**是**(老前端按 Map 解析会拿到 undefined) -- **影响其他后端服务**:无(DriverDetailRespVO 仅 admin 接口返回,不走 Feign) -- **影响已有数据**:无(仅 API 序列化形式变化,DB 无变) - ---- - -## 12. 注意事项 - -- **前端 workaround 清理点**: - - 改前如果前端有 `const map = data.attachments; const idCard = map['id_card'] ?? [];` 之类 workaround,**改成 `data.attachments.idCard`** 即可 - - 改前如果前端硬编码遍历类目(如 `for (const key of ['id_card', 'driver_license'])`),**改成直接读 VO 字段** - - 改前如果前端有 `if (map['portrait'])` 判空逻辑,**直接删** —— 强类型 VO 字段必非 null(默认空数组) -- **前序 changelog 描述废止**:[`21_2791_司机档案-修改接口-管理后台.md`](./21_2791_司机档案-修改接口-管理后台.md) 已发出的 attachments Map 描述以本文档为准,前序 changelog **不会修改**(changelog 只追加不回写历史) - ---- - -## 13. 关联 / 联系人 - -### 13.1 链接 - -- **Issue**: [#2812](https://git.1814.love:8443/wx/HL/issues/2812) -- **PR**: [#2818](https://git.1814.love:8443/wx/HL/pulls/2818) -- **Merge commit**: [`8c340550`](https://git.1814.love:8443/wx/HL/commit/8c340550656bdee3ee2243b98d694b818474aeba) -- **前序 changelog(attachments Map 描述废)**: [`21_2791_司机档案-修改接口-管理后台.md`](./21_2791_司机档案-修改接口-管理后台.md) -- **规则**: HL `MEMORY.md` → `feedback_no-map-return-type.md` (禁止弱类型返回值) - -### 13.2 联系人 - -- **后端负责人**: @yst(腰苏图) -- **前端对接(管理后台)**: 待指派 diff --git a/changelogs-v2/2026-05/21_2821-2824_review-v3-followup_PR2833-2836-2840.md b/changelogs-v2/2026-05/21_2821-2824_review-v3-followup_PR2833-2836-2840.md deleted file mode 100644 index 8e91755..0000000 --- a/changelogs-v2/2026-05/21_2821-2824_review-v3-followup_PR2833-2836-2840.md +++ /dev/null @@ -1,186 +0,0 @@ -# order-v3 review 跟进:配房工作台 / 询房 URL 重排 + HOUSE swap 多项修复 + 出行人/大交通杂项 - -> **存放目录**: 二期(v3 `order-v3` 标签)→ `changelogs-v2/2026-05/` -> **服务**: hl-order-service-v3 (8086) + hl-user-service (8081) -> **PR**: #2833 / #2834 / #2835 / #2836 / #2840(hotfix) -> **Issue**: #2821 / #2822 / #2823 / #2824 -> **日期**: 2026-05-21 -> **影响范围**: 管理端 HOUSE 配房工作台 + HOUSE 询房 + HOUSE 换酒店 + 出行人/大交通若干字段 - ---- - -## ⚠️ 关键变化(前端必看) - -### 🔴 路径变更(配房工作台 + 询房,5+2=7 个接口) - -前端按 `API-SPEC-HOUSE-V1.1.html` 文档对接,**之前 4 个 PR (#2738-2754) 落地的代码路径与文档严重不一致,会全部 404**;本批 PR #2833 已**对齐文档**。前端按文档实现的请直接对接新路径;之前对接到旧路径的,请按下表改 URL: - -| 接口 | 旧路径(已废弃) | 新路径(以此为准) | -|------|----------------|-------------------| -| §2.1 配房候选源 | `GET /v3/admin/house/assignments/candidates?requirementId=X` | **`GET /v3/admin/order/hotel-requirements/{rid}/candidates`** (rid 走 PathVariable) | -| §2.2 提交配房 | `POST /v3/admin/house/assignments`(rid 在 body) | **`POST /v3/admin/order/hotel-requirements/{rid}/assignments`**(rid 走 PathVariable;body 不再传 requirementId) | -| §2.3 修改配房 | `PUT /v3/admin/house/assignments/{id}` | **`PUT /v3/admin/order/assignments/{id}`** | -| §2.4 删除配房 | `DELETE /v3/admin/house/assignments/{id}` | **`DELETE /v3/admin/order/assignments/{id}`** | -| §2.5 房间分配 | `POST /v3/admin/house/assignments/{id}/rooms`(POST 写入) | **`GET /v3/admin/order/orders/{orderId}/rooms`**(HTTP 方法 + 路径 + 入参形态全改 — GET 查询语义,按家庭分组返结果) | -| §3.3 询房历史 | `GET /v3/admin/order/inquiry/by-order` | **`GET /v3/admin/order/inquiry?orderId=X`** | -| §3.6 加急 | `POST /v3/admin/order/inquiry/{id}/urgent` | **`POST /v3/admin/order/inquiry/{id}/escalate`** | - -§2.5 GET 新 VO `OrderRoomsRespVO`: - -```json -{ - "orderId": "string", - "families": [ - { - "familyNo": "F1", - "travelers": [{ "travelerId": "string", "name": "张三", "phoneMasked": "138****5612" }], - "days": [{ "dayNumber": 1, "rooms": [{ "hotelName": "...", "roomTypeName": "..." }] }] - } - ] -} -``` - ---- - -## 一、背景 - -dev-v3 近 3 天(2026-05-18~21)合并 30+ PR / 786 文件 / +74,352 行(出行人 + 大交通 + HOUSE H01-H10 + FIX A-H + 通知中心 internal),全模块工作流 review 检出 10 P0 + 36 P1。本批 4 张 P0/P1 工单(#2821-2824)+ 1 张 hotfix(#2840 Flyway 修)对应 4 张 PR + 1 张 hotfix 全部测试服部署 + Flyway 落库 + admin token round-trip 验证通过。 - ---- - -## 二、变更接口清单 - -| # | 接口 | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|------|----------|------| -| 1 | 配房候选源 | GET | `/v3/admin/order/hotel-requirements/{rid}/candidates` | **路径迁移** | 旧 `/v3/admin/house/assignments/candidates` 废弃 | -| 2 | 提交配房 | POST | `/v3/admin/order/hotel-requirements/{rid}/assignments` | **路径迁移** | rid 改 PathVariable,body 删 requirementId | -| 3 | 修改配房 | PUT | `/v3/admin/order/assignments/{id}` | **路径迁移** | | -| 4 | 删除配房 | DELETE | `/v3/admin/order/assignments/{id}` | **路径迁移** | | -| 5 | 房间分配 | **GET**(原 POST) | `/v3/admin/order/orders/{orderId}/rooms` | **方法+路径全改+新 VO** | 改为查询语义,按家庭分组聚合 | -| 6 | 询房历史 | GET | `/v3/admin/order/inquiry?orderId=X` | **路径迁移** | `/by-order` 后缀去掉 | -| 7 | 询房加急 | POST | `/v3/admin/order/inquiry/{id}/escalate` | **路径迁移** | `/urgent` 改 `/escalate` | -| 8 | 换酒店提交 | POST | `/v3/admin/order/swap-hotel/commit` | **权限校验补全** | 越权返 `808402`(详 §三-1) | -| 9 | 大交通 VO 字段类型 | - | `TransportPlanVO.id / orderId / travelers[].id` | **响应字段类型 Long → String** | 防 JS 精度丢失 | -| 10 | 出行人 internal Feign | GET | `/v3/internal/traveler/list-by-order/{orderId}` | **返回字段补值** | `transportPlanIds` 不再永空,合同/保险拿到真大交通批次 | -| 11 | 出行人错误码 | - | 多接口 | **错误码段位修正** | 见 §三-3 | -| 12 | 大交通 batchReplace | POST | `/v3/admin/order/{id}/transport-plan/batch-replace` | **加幂等 + 分布式锁** | 防重复提交触发全量替换 | - ---- - -## 三、接口详情 - -### 1. 换酒店模块 (PR #2834) - -#### 权限校验补齐(原 TODO) - -之前 `POST /v3/admin/order/swap-hotel/commit` 没校验"当前用户是订单 assignee" — 任何房务 token 都能改别人的订单。**已修复,跨用户越权返 `808402`**。 - -```http -HTTP/1.1 200 OK -{ "code": 808402, "message": "当前用户必须为订单 assignee 才能操作", "success": false } -``` - -#### 状态机审计正确性 - -之前 `swap` 业务的状态机 fire 写死 `from=CLAIMING`,审计日志失真。现根据 `house_todo` 表 OPEN `SWAP_HOTEL`/`REFUND` 待办推导真实 from(`EXCEPTION` 或 `CLAIMING`)。**前端 UI 不直接感知,但订单操作日志看 from 字段会更准确**。 - -#### DRIVER 通知补发(原漏发,业务 BUG) - -API-SPEC-HOUSE §5.3 列了 4 个 receiver_type(`OLD_HOTEL / NEW_HOTEL / DRIVER / ORDER_CUSTOMER`),之前代码只发 3 个,**司机收不到换酒店通知**。本 PR 补 DRIVER。 - -⚠️ DRIVER 实际企微推送需 FLEET `vehicle_plan` 反查 Feign(留尾,后续工单接通),当前发送链路 = 事件落库 + dispatcher noop 占位(不抛错不阻塞)。 - -#### 新增错误码(API-SPEC-HOUSE §5.3 / §11.6 已同步) - -| 错误码 | 说明 | -|--------|------| -| `808404` | 旧酒店 ID 与新酒店 ID 相同 | -| `808405` | 仅 PROCESSING / EXCEPTION 状态可换酒店 | -| `808406` | 换酒店写库失败,请重试 | -| `808407` | 新酒店库存不足 | - ---- - -### 2. 大交通 — Long 字段类型变化 (PR #2836) - -`TransportPlanVO` 中以下三个字段以前响应是 JSON Number(可能精度丢失),现统一返字符串: - -| VO 字段 | 旧类型 | 新类型 | 示例 | -|---------|--------|--------|------| -| `TransportPlanVO.id` | number | **string** | `"80012345"` | -| `TransportPlanVO.orderId` | number | **string** | `"30099887"` | -| `TransportPlanVO.travelers[].id` | number | **string** | `"40055001"` | - -**前端检查**:`Number(id)` / `parseInt(id)` 这类用法需改;直接 `id` 字符串传回后端 / 当 key 用没影响。 - ---- - -### 3. 出行人错误码段位修正 (PR #2836) - -`docs/order-v3/api/API-SPEC-V5.54.html` 错误码表 5 处更新(以代码为准): - -| 章节 | 旧码 | 新码 | -|------|------|------| -| §2.1 列表 | `581100` | `581102` | -| §2.2 批量编辑 9 行错误码表 | 581100-581124 | **581101-581105 / 581110-581114 / 581111 / 581119** | -| §2.3 单个新增 | `581100` → `581102`;补 581115/581116/581118 | -| §2.4 删除 | `581119→581106 / 581120→581107 / 581100→581102` | -| §2.8 智能解析 | `581120-581123` | `581131-581134` | -| §2.9 校验 | `581124` | `581102` | - -前端如做了 i18n 映射,请按新码更新 — 否则会命中默认文案。 - ---- - -### 4. 出行人 internal Feign `transportPlanIds` 真实化 (PR #2836) - -`GET /v3/internal/traveler/list-by-order/{orderId}` 之前 `transportPlanIds` 字段硬编码空数组,合同/保险服务跨服务调用永远拿不到出行人绑定的大交通批次 ID。本 PR 修复,字段返真实值。**前端不直接调 internal,影响合同/保险出参的"出行人.transportPlanIds"字段**。 - ---- - -### 5. 大交通 batchReplace 并发保护 (PR #2836) - -`POST /v3/admin/order/{id}/transport-plan/batch-replace` 全量替换接口加 `@Idempotent`(3s)+ `@Lock4j`(30s)— 短时间重复提交会拒绝,前端无需改但可减少重复提交风险。 - ---- - -### 6. 通知中心 internal 套件规范(后端内部) (PR #2835) - -`/internal/notification/dispatch` / `/publish` 加幂等 + dispatch 返回类型从 void 改 `DispatchResult { success, channelsTriggered, errorMessage }`。**前端不调 internal,无影响**。 - ---- - -### 7. order_todo 唯一索引 (PR #2836 / hotfix #2840) - -DB 加 `(order_id, todo_type, sequence, deleted_marker)` 唯一索引,防并发触发重复紧急待办。前端无感。 - -> hotfix #2840:V20260521_004 generated column 用 `UNIX_TIMESTAMP` 触发 MySQL 8 `ERROR 3763 disallowed function`,已改 `COALESCE(deleted_at, '1970-01-01')`(deterministic)。 - ---- - -## 四、测试服验证状态 - -| 服务 | 部署 commit | uptime | Flyway | admin round-trip | -|------|------------|--------|--------|------------------| -| hl-user-service | dev-v3 含 #2834/#2835 | 已重启 | V20260521_007 success=1 17:49 | ✅ | -| hl-order-service-v3 | dev-v3 含 #2833/#2836/#2840 | 18:12 重启 | V20260521_004 success=1 18:12 | ✅ §3.3 / §3.6 / §2.5 / §2.1 全 200/合理 400 | - -唯一索引 `uk_todo_order_type_seq_active` 已在 `hl_order_service_v3.order_todo` 表生效。 - ---- - -## 五、留尾(后续 v3 工单) - -- **HOUSE-SWAP DRIVER 通知** wework 真值切换 → 需 FLEET `vehicle_plan` 反查 Feign 工单 -- **HOUSE-FIX-A 候选源数据真实化**(`loadProductPool`)→ 需 H04 完整接通 `ProductV2FeignClient` -- **`HouseInventoryCheckedEvent` 消费方**(`H09` MQ 桥接 PR) -- **TravelerErrorCode 段位整体迁移代码常量**(大版本可决议) -- **`operationLogMapper` 收敛** 到 `HotelOperationLogService`(待该 Service 出现) - ---- - -## 六、关联 - -- 工单: #2821 / #2822 / #2823 / #2824(全部 closed) -- PR: #2833 / #2834 / #2835 / #2836 / #2840(全部 merged into dev-v3) -- Review 来源: Claude /@cr 7 个 agent 并发对照 `docs/order-v3/` SRS+API+DB+Detail diff --git a/changelogs-v2/2026-05/21_tag-library真实化完成QA验证通过-修改接口-管理后台.md b/changelogs-v2/2026-05/21_tag-library真实化完成QA验证通过-修改接口-管理后台.md deleted file mode 100644 index 6cf2b45..0000000 --- a/changelogs-v2/2026-05/21_tag-library真实化完成QA验证通过-修改接口-管理后台.md +++ /dev/null @@ -1,101 +0,0 @@ -# tag-library: 私人标签库 6 接口真实化完成 + QA 验收通过 - -> **存放目录**: `changelogs-v2/2026-05/`(v3 二期) -> **服务**: hl-order-service-v3 -> **关联**: 19 号已发布骨架版([`19_2045_tag-library模块私人标签库管理-新增接口-管理后台.md`](./19_2045_tag-library模块私人标签库管理-新增接口-管理后台.md)) -> **真实化 PR**: #2606(DB 业务实现) -> **关联 PR**: #2777(不直接相关,仅同会话) -> **日期**: 2026-05-21 -> **影响范围**: 管理后台「我的标签库」管理页 + 创建订单时的标签下拉 - ---- - -## ⚠️ 关键变化 - -**接口契约 0 变化**。19 号骨架版发布时承诺的「契约本次发布后不再变」**已兑现** —— 字段名 / 类型 / 必填 / 路径 / 错误码全部与 19 号一致。 - -本次变化仅是**实现状态**: - -| 项 | 19 号骨架版 | 本次(2026-05-21) | -|---|---|---| -| ServiceImpl | **Mock 硬编码样例** | **真实 DB**(`tag_library` 表) | -| 数据持久化 | ❌ 不落库,每次返样例 | ✅ INSERT / UPDATE / SOFT DELETE 真实生效 | -| 错误码 581421/581423/581424/581425/581427 | 未触发(Mock 永远成功) | **全部按设计触发**(QA 已验证) | -| 多用户隔离 | 未生效(Mock 不区分 userId) | **生效**(user_id 隔离 + 越权拦截) | -| 排序持久化 | 仅返样例数据,不响应排序请求 | **真实持久化**(sort_order 列) | -| 软删后同名复用 | N/A | **支持**(唯一索引 `(user_id, tag_name, deleted_at)`) | - -**前端意义**:之前按 19 号骨架对接的代码**无需任何改动**,但**联调时机解锁** —— 现在可以真实创建 / 修改 / 删除 / 排序 / 置顶并看到数据持久化和正确的错误码反馈。 - ---- - -## 一、背景 - -19 号 6 接口骨架版上线时 ServiceImpl 是 Mock 实现,前端可按契约对接但无法真实联调(数据不落库、错误码不触发)。 -本次 PR #2606 完成 DB 真实化,今天通过 33 项 QA 用例全量验收。 - ---- - -## 二、变更清单 - -| # | 接口 | 方法 | 路径 | 本次变更 | -|---|------|------|------|----------| -| 1 | 查我的标签库 | GET | `/v3/admin/tag-library` | Mock → 真实 DB 查询,支持 keyword 模糊 / pinnedOnly 过滤 / 后端固定排序 | -| 2 | 新增标签库预设 | POST | `/v3/admin/tag-library` | Mock → 真实 INSERT,sortOrder=MAX+1 / 重名 581421 触发 / 默认色 `#5B8FF9` 生效 | -| 3 | 修改(重命名/换色) | PUT | `/v3/admin/tag-library/{id}` | Mock → 真实 UPDATE,越权 581423 / 改名重名 581421 / 排除自身校验生效 | -| 4 | 删除(软删) | DELETE | `/v3/admin/tag-library/{id}` | Mock → 真实软删(`deleted_at=NOW()`),越权 581424 / 软删后同名可复用 | -| 5 | 批量排序 | PUT | `/v3/admin/tag-library/sort` | Mock → 真实事务包裹 UPDATE,含他人 id 581425 整批回滚 / 重复 id 581427 | -| 6 | 置顶 toggle | PUT | `/v3/admin/tag-library/{id}/pin` | Mock → 真实 UPDATE,越权 581424 | - ---- - -## 三、接口契约 - -**未变更**,详见 [`19_2045_tag-library模块私人标签库管理-新增接口-管理后台.md`](./19_2045_tag-library模块私人标签库管理-新增接口-管理后台.md):入参 / 出参 / 枚举 / 字段约束 / 路径全部一致。 - ---- - -## 四、错误码契约(全部经 QA 验证) - -| Code | 触发场景 | 接口 | -|---|---|---| -| 581421 | 同用户已有同名标签 | POST 新增 / PUT 改名 | -| 581423 | 标签不存在 / 已软删 / 非本人 | PUT 更新 | -| 581424 | 标签不存在 / 已软删 / 非本人 | DELETE 删除 / PUT 置顶 | -| 581425 | 排序 items 含他人 id(**整批回滚,不部分成功**) | PUT 排序 | -| 581427 | 排序 items 含重复 id | PUT 排序 | -| 400 | 参数校验失败(tagName 空 / 超 50 字 / tagColor 格式非法 / pinned 缺失 / items 空数组) | 全部 | -| 401 | 未登录 | 全部 | - ---- - -## 五、QA 验收结果 - -- **覆盖**:6 接口 × 33 用例(创建 7 / 列表 5 / 更新 7 / 删除 4 / 排序 5 / 置顶 5) -- **通过率**:33 / 33 = **100%** -- **验证维度**: - - 字段校验(必填 / 长度 ≤50 / `#RRGGBB` 格式) - - 错误码契约(5 个业务错误码全部按设计触发) - - 多用户隔离(user_id=9999 脏数据无法被 user_id=1001 修改 / 删除 / 排序 / 置顶) - - 事务一致性(排序含他人 id 时,本人 id 也未被改) - - 软删行为(删后立即同名 create 成功) - - 排序规则(`is_pinned DESC, sort_order ASC, last_used_at DESC`) - - Long ID 序列化(响应中为字符串,无 JS 精度丢失) - ---- - -## 六、注意事项 - -1. **前端不需要做任何代码改动**。19 号骨架对接的请求 / 响应解析 / 错误码处理逻辑直接复用。 -2. **联调时机**:本次发布后可正式进入真实联调(之前 Mock 期不能验持久化和错误码)。 -3. **路径**:`/v3/admin/tag-library` 前缀,**带 `/v3`**,经 Gateway 转发到 hl-order-service-v3。 -4. **userId 自动派生**:前端不传操作人,后端从 JWT 注入。 - ---- - -## 七、关联 - -- 骨架版 changelog:`19_2045_tag-library模块私人标签库管理-新增接口-管理后台.md` -- 真实化 PR:https://git.1814.love:8443/wx/HL/pulls/2606 -- v5.14 §14 章节规范:详见 SRS v5.14 -- 负责人:yst diff --git a/changelogs-v2/2026-05/21_车辆档案-修改接口-管理后台.md b/changelogs-v2/2026-05/21_车辆档案-修改接口-管理后台.md deleted file mode 100644 index 6aa4a04..0000000 --- a/changelogs-v2/2026-05/21_车辆档案-修改接口-管理后台.md +++ /dev/null @@ -1,553 +0,0 @@ -# 【修改接口·管理后台】车辆档案 6 接口(全模块首次推送 changelog) - -> **PR**: 无(本次为首次推送,实质接口契约未变更,配合 §1 §3 模块 changelog 一并补齐 fleet 全档案契约) -> **服务**: hl-fleet-service | **更新时间**: 2026-05-21 -> -> **存放目录**: `changelogs-v2/2026-05/` -> **影响范围**: 管理后台「车管 / 车辆档案」页(列表 + 详情 + 新增 + 编辑 + 软删 + Excel 批量导入) - ---- - -## ⚠️ 关键说明 - -车辆档案模块 6 接口自 fleet 服务首次落地(PR #2724)以来契约**未变化**,本次仅作**首次完整 changelog 推送**,让前端 v3 项目仓库一次拿全 6 接口契约。 - -**与车型管理库(§1 changelog)配套**:车辆档案的 `vehicleModelId` 引用车型管理库的型号 ID,前端可在新增车辆页用 §1.5 / §1.7 拉型号下拉。 - ---- - -## 1. 接口背景 - -车辆档案是车队所有车辆的主数据:车牌 / 车型 / VIN / 行驶证 / 保险 / 年检 / 多类目附件(外观/内饰/保险/年检/营运证/其他 6 类)。 - -前端"车管 / 车辆档案"页面提供: -- 列表筛选(按车牌、车队、车型大类、状态、保险/年检到期日) -- 详情查看(含附件按类目分组) -- 新增 / 编辑(含附件 diff 语义批量提交) -- 软删(业务流水模块上线后会按"未完成派单"拒删) -- Excel 批量导入 - ---- - -## 2. 变更清单 - -| # | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|----------|------| -| 1 | GET | `/admin/fleet/vehicles/page` | 首推 | 分页列表(多条件过滤) | -| 2 | GET | `/admin/fleet/vehicles/{vehicleId}` | 首推 | 详情(含附件) | -| 3 | POST | `/admin/fleet/vehicles` | 首推 | 新增(含附件批量 INSERT) | -| 4 | PUT | `/admin/fleet/vehicles/{vehicleId}` | 首推 | 编辑(附件 diff 语义) | -| 5 | DELETE | `/admin/fleet/vehicles/{vehicleId}` | 首推 | 软删 | -| 6 | POST | `/admin/fleet/vehicles/import` | 首推 | Excel 批量导入 | - ---- - -## 3. 接口详情 - -### 3.1 分页查询 - -**GET** `/admin/fleet/vehicles/page` - -- **使用场景**:车管车辆档案列表页 -- **认证**:管理后台 JWT -- **幂等**:是(只读) - -**Query 入参**: - -| 字段 | 类型 | 必填 | 默认 | 校验 | 说明 | -|---|---|---|---|---|---| -| `page` | int | ❌ | 1 | `>= 1` | 页码 | -| `pageSize` | int | ❌ | 20 | `1-100` | 每页条数 | -| `keyword` | string | ❌ | — | — | 车牌模糊匹配 | -| `fleet` | string | ❌ | — | `own/coopA/coopB` | 车队精确过滤 | -| `typeKey` | string | ❌ | — | — | 车型大类 key 精确(如 suv) | -| `vehicleStatus` | string | ❌ | — | `idle/busy/maint` | 状态精确 | -| `insureDueBefore` | date | ❌ | — | yyyy-MM-dd | 保险到期日早于此日(含) | -| `inspectDueBefore` | date | ❌ | — | yyyy-MM-dd | 年检到期日早于此日(含) | - -**出参**:`Result>` (按 create_time DESC) - -| 字段 | 类型 | 说明 | -|---|---|---| -| `records[].id` | string | 车辆 ID(Long 序列化为 String) | -| `records[].plate` | string | 车牌 | -| `records[].vehicleModelId` | string | 型号 ID | -| `records[].vehicleTypeId` | string | 大类 ID | -| `records[].modelName` | string | 型号名(如丰田汉兰达) | -| `records[].seats` | int | 座位数 | -| `records[].fleet` | string | 车队(own/coopA/coopB) | -| `records[].vehicleStatus` | string | 状态(idle/busy/maint) | -| `records[].insurer` | string | 保险公司 | -| `records[].insureDue` | date | 保险到期日 | -| `records[].inspectDue` | date | 年检到期日 | -| `records[].createTime` | datetime | 创建时间 | -| `total` / `page` / `pageSize` | int | 分页元数据 | - -**典型示例 请求**: -``` -GET /admin/fleet/vehicles/page?page=1&pageSize=20&fleet=own&insureDueBefore=2025-12-31 -Authorization: Bearer -(无请求体) -``` - -**典型示例 响应**: -```json -{ - "code": 200, - "data": { - "records": [ - { - "id": "1234567890123456789", - "plate": "蒙A-88888", - "vehicleModelId": "1234567890123456001", - "vehicleTypeId": "1234567890123456002", - "modelName": "丰田汉兰达", - "seats": 7, - "fleet": "own", - "vehicleStatus": "idle", - "insurer": "中国人保财险", - "insureDue": "2025-12-31", - "inspectDue": "2025-12-31", - "createTime": "2025-05-21 14:00:00" - } - ], - "total": 1, - "page": 1, - "pageSize": 20 - }, - "msg": "成功" -} -``` - -**错误码**:400 参数校验 / 401 未登录 - ---- - -### 3.2 详情 - -**GET** `/admin/fleet/vehicles/{vehicleId}` - -- **使用场景**:详情页 / 编辑前预填 -- **认证**:管理后台 JWT -- **幂等**:是 - -**路径入参**: - -| 字段 | 类型 | 必填 | 说明 | -|---|---|---|---| -| `vehicleId` | Long | ✅ | 车辆 ID | - -**出参**:`Result` - -包含 §3.1 全部字段 + 以下扩展: - -| 字段 | 类型 | 说明 | -|---|---|---| -| `vin` | string | 车架号(VIN) | -| `regDate` | date | 注册日期 | -| `policyNo` | string | 保单号 | -| `regCertNo` | string | 行驶证号 | -| `regCertOwner` | string | 行驶证所有人 | -| `regCertUsage` | string | 使用性质 | -| `regCertFrontUrl` | string | 行驶证正面 OSS URL | -| `regCertBackUrl` | string | 行驶证副页 OSS URL | -| `attachments[]` | array | 附件列表(按 category + sortNo 升序) | -| `attachments[].id` | string | 附件 ID | -| `attachments[].category` | string | 类目(见 §6.1) | -| `attachments[].sortNo` | int | 同类目排序(0-based) | -| `attachments[].url` | string | OSS URL | -| `attachments[].mimeType` | string | 例 `image/jpeg` | -| `primaryDriverName` | string\|null | **目前恒为 null**(待业务流水 PR 注入司机姓名) | -| `updateTime` | datetime | — | - -**典型示例 响应**: -```json -{ - "code": 200, - "data": { - "id": "1234567890123456789", - "plate": "蒙A-88888", - "vehicleModelId": "1234567890123456001", - "vehicleTypeId": "1234567890123456002", - "modelName": "丰田汉兰达", - "seats": 7, - "fleet": "own", - "vehicleStatus": "idle", - "vin": "LSVNV2182E2100001", - "regDate": "2020-01-01", - "inspectDue": "2025-12-31", - "insurer": "中国人保财险", - "policyNo": "PICC-2024-XXX", - "insureDue": "2025-12-31", - "regCertNo": "12345678", - "regCertOwner": "呼籁旅游服务有限公司", - "regCertUsage": "营运租赁", - "regCertFrontUrl": "https://oss.example.com/fleet/cert-front.jpg", - "regCertBackUrl": "https://oss.example.com/fleet/cert-back.jpg", - "attachments": [ - { - "id": "1234567890123456900", - "vehicleId": "1234567890123456789", - "category": "exterior", - "sortNo": 0, - "url": "https://oss.example.com/fleet/ext-1.jpg", - "mimeType": "image/jpeg" - } - ], - "primaryDriverName": null, - "createTime": "2025-05-21 14:00:00", - "updateTime": "2025-05-21 14:00:00" - }, - "msg": "成功" -} -``` - -**错误码**:**600110** 车辆不存在 / 401 未登录 - ---- - -### 3.3 新增 - -**POST** `/admin/fleet/vehicles` - -- **使用场景**:新增车辆 + 附件批量提交(前端 STS 直传 OSS 后把 URL 数组放主表单一并提交) -- **认证**:管理后台 JWT -- **幂等**:否(重复抛 600100/600107) - -**Body 入参**(`VehicleSaveReqVO`): - -| 字段 | 类型 | 必填 | 校验 | 说明 | -|---|---|---|---|---| -| `plate` | string | ✅ | `@Size(max=16)` | 车牌(全局唯一) | -| `vehicleModelId` | Long | ✅ | — | 车型型号 ID(引用 §1 模块) | -| `fleet` | string | ✅ | `@Pattern(own\|coopA\|coopB)` | 车队 | -| `vehicleStatus` | string | ❌ | `@Pattern(idle\|busy\|maint)` | 状态,默认 idle | -| `vin` | string | ❌ | `@Size(max=32)` | 车架号(传则全局唯一) | -| `regDate` | date | ❌ | — | 注册日期 | -| `inspectDue` | date | ❌ | — | 年检到期日 | -| `insurer` | string | ❌ | `@Size(max=64)` | 保险公司 | -| `policyNo` | string | ❌ | `@Size(max=64)` | 保单号 | -| `insureDue` | date | ❌ | — | 保险到期日 | -| `regCertNo` | string | ❌ | `@Size(max=64)` | 行驶证号 | -| `regCertOwner` | string | ❌ | `@Size(max=128)` | 行驶证所有人 | -| `regCertUsage` | string | ❌ | `@Size(max=32)` | 使用性质 | -| `regCertFrontUrl` | string | ❌ | `@Size(max=512)` | 行驶证正面 OSS URL | -| `regCertBackUrl` | string | ❌ | `@Size(max=512)` | 行驶证副页 OSS URL | -| `attachments[]` | array | ❌ | — | 附件数组(见下) | - -**`attachments[]` 单项**(`VehicleAttachmentReqVO`): - -| 字段 | 类型 | 必填 | 校验 | 说明 | -|---|---|---|---|---| -| `id` | Long | ❌ | — | 附件 ID(新增项不传) | -| `category` | string | ✅ | `@Size(max=32)` | 类目(见 §6.1) | -| `url` | string | ✅ | `@Size(max=512)` | OSS URL | -| `mimeType` | string | ✅ | `@Size(max=64)` | 例 `image/jpeg` | -| `sortNo` | int | ❌ | — | 同类目排序(不传时按入参顺序自动重写 0..N-1) | - -**出参**:`Result` - -| 字段 | 类型 | 说明 | -|---|---|---| -| `id` | string | 新增车辆 ID | -| `attachmentIds[]` | array | 附件 ID 列表(按入参顺序) | - -**典型示例 请求**: -``` -POST /admin/fleet/vehicles -Authorization: Bearer -Content-Type: application/json - -{ - "plate": "蒙A-88888", - "vehicleModelId": "1234567890123456001", - "fleet": "own", - "vehicleStatus": "idle", - "vin": "LSVNV2182E2100001", - "regDate": "2020-01-01", - "inspectDue": "2025-12-31", - "insurer": "中国人保财险", - "policyNo": "PICC-2024-XXX", - "insureDue": "2025-12-31", - "regCertNo": "12345678", - "regCertOwner": "呼籁旅游服务有限公司", - "regCertUsage": "营运租赁", - "regCertFrontUrl": "https://oss.example.com/fleet/cert-front.jpg", - "regCertBackUrl": "https://oss.example.com/fleet/cert-back.jpg", - "attachments": [ - { "category": "exterior", "url": "https://oss.example.com/fleet/ext-1.jpg", "mimeType": "image/jpeg" }, - { "category": "exterior", "url": "https://oss.example.com/fleet/ext-2.jpg", "mimeType": "image/jpeg" }, - { "category": "insurance", "url": "https://oss.example.com/fleet/ins.jpg", "mimeType": "image/jpeg" } - ] -} -``` - -**典型示例 响应**: -```json -{ - "code": 200, - "data": { - "id": "1234567890123456789", - "attachmentIds": ["1234567890123456900", "1234567890123456901", "1234567890123456902"] - }, - "msg": "成功" -} -``` - -**异常 请求**(车牌重复): -```json -{ "code": 600100, "msg": "车牌已存在", "data": null } -``` - -**异常 请求**(附件类目张数超上限 `exterior` > 6): -```json -{ "code": 601003, "msg": "该类目张数已达上限", "data": null } -``` - -**错误码**:400 参数校验 / **600100** 车牌已存在 / **600107** VIN 已存在 / **600108** 车型不存在 / **601002** 附件类目非法 / **601003** 类目张数达上限 / 401 未登录 - ---- - -### 3.4 编辑(附件 diff 语义) - -**PUT** `/admin/fleet/vehicles/{vehicleId}` - -- **使用场景**:编辑车辆基本信息 + 附件增删改一次性提交 -- **认证**:管理后台 JWT -- **幂等**:是 - -**路径入参**: - -| 字段 | 类型 | 必填 | 说明 | -|---|---|---|---| -| `vehicleId` | Long | ✅ | 车辆 ID | - -**Body 入参**:同 §3.3(共用 `VehicleSaveReqVO`) - -**附件 diff 语义**: - -| 入参 attachments[] 项 | DB 中的对应行 | 行为 | -|---|---|---| -| 有 `id` + DB 命中 | 存在 | **保留**(可更新 sortNo) | -| 无 `id`(新增项) | — | **INSERT** | -| — | 存在但本次未传 | **软删** | - -**出参**:`Result` - -| 字段 | 类型 | 说明 | -|---|---|---| -| `kept` | int | 保留的附件数 | -| `inserted` | int | 新插入的附件数 | -| `softDeleted` | int | 软删的附件数 | - -**典型示例 响应**: -```json -{ - "code": 200, - "data": { "kept": 2, "inserted": 1, "softDeleted": 1 }, - "msg": "成功" -} -``` - -**错误码**:400 参数校验 / **600100** 车牌已存在 / **600107** VIN 已存在 / **600108** 车型不存在 / **600110** 车辆不存在 / **601002** 类目非法 / **601003** 类目张数达上限 / 401 未登录 - ---- - -### 3.5 软删 - -**DELETE** `/admin/fleet/vehicles/{vehicleId}` - -- **使用场景**:下架车辆 -- **认证**:管理后台 JWT -- **幂等**:是 - -**路径入参**: - -| 字段 | 类型 | 必填 | 说明 | -|---|---|---|---| -| `vehicleId` | Long | ✅ | 车辆 ID | - -**出参**:`Result`(`data: null`) - -**典型示例 响应**: -```json -{ "code": 200, "data": null, "msg": "成功" } -``` - -**异常 请求**(车辆有未完成派单 —— **业务流水 PR 落地后才生效**): -```json -{ "code": 600109, "msg": "车辆有未完成派单,不能删除", "data": null } -``` - -**错误码**:**600109** 有未完成派单(占位,业务流水 PR 上线后生效)/ **600110** 车辆不存在 / 401 未登录 - ---- - -### 3.6 Excel 批量导入 - -**POST** `/admin/fleet/vehicles/import` - -- **使用场景**:运营批量录入车辆 -- **认证**:管理后台 JWT -- **幂等**:否(重复行按车牌冲突拒绝单行) - -**入参**(multipart/form-data): - -| 字段 | 类型 | 必填 | 说明 | -|---|---|---|---| -| `file` | file | ✅ | Excel(`.xlsx` / `.xls`)或 CSV | - -**表头约定(第 1 行 12 列,顺序固定)**: - -``` -车牌 | 车型型号ID | 车队(own/coopA/coopB) | 车架号(VIN) | -注册日期(yyyy-MM-dd) | 年检到期日(yyyy-MM-dd) | -保险公司 | 保单号 | 保险到期日(yyyy-MM-dd) | -行驶证号 | 行驶证所有人 | 使用性质 -``` - -**出参**:`Result` - -| 字段 | 类型 | 说明 | -|---|---|---| -| `total` | int | 总行数(不含表头) | -| `success` | int | 成功导入数 | -| `failed` | int | 失败行数 | -| `errorRows[]` | array | 失败行详情 | -| `errorRows[].row` | int | Excel 行号(从 2 开始,1 为表头) | -| `errorRows[].plate` | string | 车牌(用于定位) | -| `errorRows[].msg` | string | 错误信息(如"车牌已存在") | - -**典型示例 响应**: -```json -{ - "code": 200, - "data": { - "total": 10, - "success": 8, - "failed": 2, - "errorRows": [ - { "row": 3, "plate": "蒙A-88888", "msg": "车牌已存在" }, - { "row": 7, "plate": "蒙A-99999", "msg": "车型型号 ID 不存在" } - ] - }, - "msg": "成功" -} -``` - -**错误码**:400 文件解析失败 / 401 未登录 - ---- - -## 6. 枚举 / 数据字典 - -### 6.1 附件类目(`category`,`VehicleAttachmentCategoryEnum`) - -**所属字段**:`VehicleAttachmentReqVO.category` / `VehicleAttachmentRespVO.category` | **类型**:`String` | **必填**:✅ - -**真枚举**(后端硬编码,含同类目张数上限): - -| 值 | 中文 | 张数上限 | -|---|---|---| -| `exterior` | 车辆外观 | 6 | -| `interior` | 车辆内饰 | 3 | -| `insurance` | 保险单据 | 2 | -| `inspection` | 年检单据 | 2 | -| `operation_license` | 营运证 | 2 | -| `other` | 其他附件 | 5 | - -> 超出上限触发 **601003** "该类目张数已达上限"。 - -### 6.2 车队(`fleet`) - -**所属字段**:`VehicleSaveReqVO.fleet` / `VehiclePageReqVO.fleet` / `VehiclePageItemRespVO.fleet` | **类型**:`String` | **必填**:✅(新增时) - -**`@Pattern` 强校验枚举**: - -| 值 | 含义 | -|---|---| -| `own` | 自营车辆 | -| `coopA` | 合作车队 A | -| `coopB` | 合作车队 B | - -### 6.3 车辆状态(`vehicleStatus`) - -**所属字段**:同 `fleet` | **类型**:`String` | **必填**:❌(默认 idle) - -**`@Pattern` 强校验枚举**: - -| 值 | 含义 | -|---|---| -| `idle` | 空闲 | -| `busy` | 在途 | -| `maint` | 维修中 | - ---- - -## 7. 错误码(全模块汇总) - -| code | 含义 | 触发条件 | 涉及接口 | -|---|---|---|---| -| 400 | 参数校验失败 | 字段缺失/长度/枚举值不合法/MIME 非法 | 所有写入接口 | -| 401 | 未登录 | JWT 无效或缺失 | 全部 6 接口 | -| **600100** | 车牌已存在 | `plate` 全局唯一约束 | §3.3 §3.4 | -| **600107** | VIN 已存在 | `vin` 全局唯一约束 | §3.3 §3.4 | -| **600108** | 车型不存在 | `vehicleModelId` 无效或软删 | §3.3 §3.4 | -| **600109** | 有未完成派单,不能删除 | 业务流水 PR 上线后才触发(目前占位) | §3.5 | -| **600110** | 车辆不存在 | `vehicleId` 无效或软删 | §3.2 §3.4 §3.5 | -| **601001** | 实体不存在 | 附件关联的主车辆不存在 | §3.3 §3.4 | -| **601002** | 附件类目非法 | `category` 不在枚举内 | §3.3 §3.4 | -| **601003** | 该类目张数已达上限 | 超出 §6.1 张数上限 | §3.3 §3.4 | -| **601004** | 文件超出大小限制 | 应用层 + OSS HEAD 校验 | §3.6(导入),§3.3/§3.4 主体不直接校验 | -| **601005** | 文件类型非法 | MIME 不在白名单 | §3.3 §3.4 | - -> 错误码段位 600100-600110 归属车辆档案;601001-601005 归属附件管理(车辆/司机共用)。 -> -> **注意:与文档 v1.4 的差异** —— 文档原计划 VIN 用 600101 / 车型不存在 600102 / 派单冲突 600103,但因这 3 个段位被车型管理库占用(见 §1 changelog),实际代码避让到 **600107/600108/600109**。本 changelog 反映**代码实际值**。 - ---- - -## 9. 业务边界 - -- ✅ **附件 diff 语义统一**:§3.3 新增时所有项无 id;§3.4 编辑时按 `id` 命中度决定保留/插入/软删 -- ✅ **sortNo 自动重写**:附件 `sortNo` 不传时按入参顺序自动写 0..N-1(同 category 内 0-based) -- ✅ **行驶证 OSS URL 留主表**:`regCertFrontUrl` / `regCertBackUrl` 是主表字段(不走附件表),与附件分离 -- ✅ **唯一约束**:`plate` / `vin` **全局**唯一(违反抛 600100 / 600107) -- ✅ **车队 / 状态强枚举**:`fleet` `vehicleStatus` 走 `@Pattern` 校验,违反返 400 -- ⚠️ **primaryDriverName 占位**:§3.2 详情返 `primaryDriverName: null`,待业务流水 PR 上线后注入司机姓名 -- ⚠️ **派单删除保护占位**:§3.5 错误码 600109 在业务流水 PR 上线后才会真触发 - ---- - -## 11. 影响评估 - -- **是否破坏向后兼容**:否(接口契约自首次落地以来未变更) -- **前端是否必须同步上线**:否(本次仅补发 changelog,无代码改动) -- **影响已有数据**:无 - ---- - -## 12. 注意事项 - -- **分页参数名**:`page` / `pageSize`(**不是** pageNo) -- **Long 主键序列化**:`id` / `vehicleModelId` / `vehicleTypeId` / `attachments[].id` 等 Long 字段 JSON 返回为 String,前端**不要**当 Number 解析 -- **错误码不连续**:600100 / 600107-600110(中间 600101-600106 是车型管理库的段位),见 §7 注解 -- **附件 URL 不可改**:§3.4 编辑时 `attachments[].url` 不可改(后端忽略),只能保留 / 新增 / 软删 -- **`primaryDriverName` 当前恒为 null**:业务流水 PR 上线前前端**不要**展示该字段或处理为"未指派" - ---- - -## 13. 关联 / 联系人 - -### 13.1 链接 - -- **API 文档**: `docs/order-v3/api/API-SPEC-FLEET-V1.5.html` §2 车辆档案 -- **DB 文档**: `docs/order-v3/database/DATABASE-SCHEMA-FLEET-V1.5.html` §2.3 / §2.6 -- **同期相关 changelog**: - - 车型管理库 9 接口([`21_2785_车型管理库-新增接口-管理后台.md`](./21_2785_车型管理库-新增接口-管理后台.md)) - - 司机档案 6 接口([`21_2791_司机档案-修改接口-管理后台.md`](./21_2791_司机档案-修改接口-管理后台.md)) - -### 13.2 联系人 - -- **后端负责人**: @yst(腰苏图) -- **前端对接(管理后台)**: 待指派 diff --git a/changelogs-v2/2026-05/22_2841-2844_review-r1-followup_PR2845-2848.md b/changelogs-v2/2026-05/22_2841-2844_review-r1-followup_PR2845-2848.md deleted file mode 100644 index a4003ca..0000000 --- a/changelogs-v2/2026-05/22_2841-2844_review-r1-followup_PR2845-2848.md +++ /dev/null @@ -1,119 +0,0 @@ -# Round 1 review 跟进:HOUSE 砍 1198 行 + 红线整改反向修复 + product-v2 简化 + 出行人/大交通清理 - -> **存放目录**: 二期(`order-v3` 标签)→ `changelogs-v2/2026-05/` -> **服务**: hl-user-service + hl-product-service-v2 + hl-resource-service + hl-mp-service + hl-gateway + hl-order-service-v3 -> **PR**: #2845 / #2846 / #2847 / #2848 -> **Issue**: #2841 / #2842 / #2843 / #2844 -> **日期**: 2026-05-22 -> **影响范围**: 多服务接口契约**无破坏性变更**,内部代码简化为主,但**操作日志 changes 详情格式从展开改为聚合** - ---- - -## ⚠️ 关键变化(前端需关注) - -### 1. 🔴 产品操作日志 `changes` 详情格式收敛(影响:运营后台展示) -PR #2847 把 `EntityFieldDiffUtil.diffCollectionDetailed`(86 行 8 参展开)简化回 `diffCollection` 聚合: - -**前**:每个节点 ADD/DELETE/MODIFY 单独一条 changes(改一天 5 节点 5 条),超 30 条裁断"其他 N 项变更未展开" -**后**:聚合为 `共 N → 共 M (新增 X / 删除 Y)` 单条 summary - -前端 `/admin/product/operation-log/search` 接口返回的 `changes` JSON 字段格式简化,**展示"动了哪个节点"如有需求需后端补 detail 端点或前端拿原 nodeList diff 渲染**。 - -### 2. 🟡 大交通 `TransportPlan.mode` 不再有 Converter 默认值 -PR #2848 删 `TransportPlanConverter.fromAdminReq` 中硬编码的 `mode="TOGETHER"`。前端如果之前 add/edit 不传 mode 依赖后端默认 TOGETHER 仍能工作(addTransportPlan Service 显式补);**batchReplace 后端显式 SEPARATE**,与文档 §2.6.2 一致。 - -### 3. 🟡 换酒店 DRIVER 通知暂时撤回(等 FLEET 接通再补) -PR #2848 撤回 `HOUSE_HOTEL_SWAPPED_DRIVER` event 发布 + Dispatcher 删 DRIVER case + V20260522_001 SQL 删 notification_event_config 行。**司机暂不再收到换酒店通知**,等 FLEET vehicle_plan 反查 Feign 工单接通后一次性补 publisher + V*.sql + dispatcher 三件套(独立工单)。 - ---- - -## 一、背景 - -dev-v3 5 天工作流 Round 1 review(2026-05-22),6 agent 并发对 05-16~05-21 wx 提交 50+ PR 复审,维度加 "**反过度设计 + 简洁可读**" 专项,产出 10 P0 + 30+ P1,打包 4 张工单 #2841-#2844 → 4 个 dev agent 并行修 → 4 张 PR squash 合 dev-v3 → 测试服全部署生效。 - -**总收益**:HOUSE 模块净 -1198 行,product-v2 净 -198 行,user/resource/mp 错误码段位收敛,4 处 Service 内 Wrapper 下沉 Mapper default。**零功能损失,代码可读性显著提升**。 - ---- - -## 二、关键改动汇总 - -### #2845 (Closes #2841) — 红线整改反向违规 + 错误码去重 + Object 字段 -- **PR #2439 红线 5 整改反向引入红线 1+4 修复**:LoginLogService / UserService / AdminUserService 4 处 Service 内构造 Wrapper 下沉到 Mapper default -- **CRYPTO/MD5 错误码 4 处去重**:全部复用 `SystemErrorCode.CRYPTO_ALGORITHM_UNAVAILABLE (900102)` -- **BusinessException 加 cause 重载**:JwtAuthFilter/VariFlight/Amap/WxCrypt 异常带 cause 透传堆栈 -- **PR #2467 DASHBOARD 4 错误码合并** → 复用 `CommonErrorCode.FEIGN_CALL_FAILED` -- **PR #2430 7 枚举错误码合并** → 复用 `CommonErrorCode.INVALID_PARAM` -- **MpTripDetailVO.suppliesList/contracts/insurances**:`Object` → `List>`;`dailyNodes` 加 `@Deprecated` -- **删纯透传 facade**:AdminUserService.countAll/listByAdminIds + UserService.countAll -- **决策**:不新增 ErrorCode 常量(用户铁规"不引入新错误码");User 未启用 @TableLogic 保留 `isNull(deletedAt)` - -### #2846 (Closes #2842) — HOUSE 砍死代码 -1198 行 -- 删 **3 个零订阅 Event POJO**:EnrollChangedEvent / OrderCancelledHouseEvent / RoomChangedEvent -- 删 **publishHotelSwapped MQ 链路**(零订阅 topic + HotelSwappedEvent POJO + TOPIC_HOTEL_SWAPPED + RocketMQTemplate 注入) -- 合并 **4 个薄 Service**:HouseStateChangeService → HouseStateMachineHelper / HouseInquiryTimeoutService → HouseInquiryService / HouseAssignmentInternalQueryService → HouseAssignmentService / HouseHotelSwapAdapter → HouseHotelSwapServiceImpl -- **HouseFeignErrorCode 整段并入 HouseInternalErrorCode**(段位重叠 + 语义重复) -- **HouseInquiryErrorCode 595xxx → 808xxx 段位** -- HouseE2EWalkthroughIT 8 个 @Test 改 `Assertions.fail("待 QA 工单 Hxx")` -- 删死状态机:CUSTOMER_CHANGE 5 from(main 零 fire)+ SWAP_HOTEL_COMMIT CLAIMING→CLAIMING 自循环 -- 删 HouseInventoryCheckedEvent + publish 调用(零消费方) -- swap 触发收紧:fireSwapStateChange 只在 OPEN SWAP_HOTEL/REFUND 待办存在时触发 - -### #2847 (Closes #2844) — product-v2 简化 + 餐饮 facade 缓存 -- **EntityFieldDiffUtil.diffCollectionDetailed 简化**(86 行 → 删,回 diffCollection 聚合) -- **ProductItineraryService.buildItineraryChanges 同步简化**(-63 行) -- **ProductSnapshotService.restoreSnapshot 加 @Lock4j(keys="#productId")** -- **FieldLabelDict 抽 dict(String...) helper**(-28 行) -- **product-v2 改动文件 javadoc HTML 标签清零**(铁规 15h) -- **ProductDetailAggregator.toOperationLogVO 删,改调 ProductOperationLogService.toRespVO**(消除双份实现) -- **ProductItineraryAggregateFacade meal_option 缓存**(7 天产品 Feign 21 次 → 0 次,类成员 volatile Map + @PostConstruct + @Scheduled 5min) - -### #2848 (Closes #2843) — HOUSE 收尾 + 出行人/大交通清理 -- **DRIVER 通知占位 noop 撤回**(publisher + dispatcher + V20260522_001 SQL DELETE config 三件套) -- HouseAssignmentService.maskPhone 改调 **复用现有 PiiMaskUtil**(KISS) -- **resolveSwapFromState 合并双查为单 IN 查询**(HouseTodoMapper.selectOpenByOrderAndTypes) -- **HouseAssignmentService.submit hotelName 接通 HouseHotelCacheService 真实拉**(空时落 null 不再写中文占位"待拉取酒店主数据") -- **HouseInquiryService.writeOpLog 签名加 operatorName 参数**,5 调用方显式传(MQ/@Async 场景拿到真实姓名) -- **TravelerConverter 删 2 个 0 调用 toInternalVOList 重载**(单参 + 双参) -- **TravelerErrorCode 删 4 个 0 调用错误码**(581117/581124/581126/581133)+ 581121 @Deprecated 指向 581144 -- **TransportPlanConverter.fromAdminReq 不硬编码 mode**(Service 显式传) -- ProductSnapshotService javadoc 措辞修正 - ---- - -## 三、变更接口清单(仅前端可感知) - -| # | 接口 | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|------|----------|------| -| 1 | 产品操作日志 search | GET | `/admin/product/operation-log/search` | **响应字段格式收敛** | `changes` 数组中 collection-diff 由"展开 N 条节点级"改为"1 条聚合 summary" | -| 2 | 大交通 add/edit | POST/PUT | `/v3/admin/order/{id}/transport-plan/*` | **不变** | mode 字段后端 Service 显式设默认值,前端可继续不传 | -| 3 | HOUSE 换酒店通知 | (后端事件) | - | **DRIVER 暂撤** | 司机收不到换酒店通知,等 FLEET Feign 接通后恢复 | - ---- - -## 四、测试服验证状态 - -| 服务 | 部署 commit | uptime | 验证 | -|------|------------|--------|------| -| hl-user-service | dev-v3 含 #2845/#2848 | 20:40 | ✅ V20260522_001 success=1 + DRIVER config 已删 | -| hl-product-service-v2 | dev-v3 含 #2845/#2847/#2848 | 20:41 | ✅ Spring 启动正常 | -| hl-resource-service | dev-v3 含 #2845 | 20:42 | ✅ | -| hl-mp-service | dev-v3 含 #2845 | 20:43 | ✅ | -| hl-gateway | dev-v3 含 #2845 | 20:44 | ✅ | -| hl-order-service-v3 | dev-v3 含 #2846/#2848 | 20:46(SSH restart 兜底) | ✅ HOUSE 接口活着(grab-pool/inquiry 返 200/400 合规) | - ---- - -## 五、留尾(独立工单后续) - -- **HOUSE-SWAP DRIVER 通知 wework 真值切换** → FLEET `vehicle_plan` 反查 Feign 接通后补 publisher + V*.sql + dispatcher 三件套 -- **HOUSE-FIX-A `loadProductPool` 真实化** → H04 接通 `ProductV2FeignClient.getOrderProductId` -- **#2515 MaterialCategory ↔ Permission 双 @Lazy 循环依赖** → 抽 `PermissionGate` 接口重构(大改动 backlog) -- **EquipmentTemplateService ↔ ProductLineService 双 @Lazy** → 抽 `ProductEquipmentBindingService`(backlog) - ---- - -## 六、关联 - -- 工单: #2841 / #2842 / #2843 / #2844(全部 closed) -- PR: #2845 / #2846 / #2847 / #2848(全部 merged into dev-v3) -- Review 来源: Claude /@cr Round 1 6 agent 并发 2026-05-22(维度:反过度设计 + 简洁可读) diff --git a/changelogs-v2/2026-05/22_2849_round2-followup_PR2850.md b/changelogs-v2/2026-05/22_2849_round2-followup_PR2850.md deleted file mode 100644 index 54f1eea..0000000 --- a/changelogs-v2/2026-05/22_2849_round2-followup_PR2850.md +++ /dev/null @@ -1,88 +0,0 @@ -# Round 2 review 收尾 7 项:Wrapper 漏修 + LockFailure 500 + JavaDoc 旧编号 + 孤儿枚举 + Publisher rename + 脱敏收敛 + Mapper default 单测 - -> **存放目录**: 二期 → `changelogs-v2/2026-05/` -> **服务**: hl-user-service + hl-common-core + hl-starter-protection + hl-order-service-v3 -> **PR**: #2850 -> **Issue**: #2849 -> **日期**: 2026-05-22 -> **影响范围**: 全部内部代码简化 / 无破坏性变更 — 但 **HouseEventPublisher → HouseNotificationPublisher rename + LockFailureException 全局新错误码** - ---- - -## ⚠️ 关键变化(前端可感知) - -### 1. 🟡 @Lock4j 抢锁失败错误码 100503 RESOURCE_LOCKED -之前 `@Lock4j(acquireTimeout=5s)` 抢锁失败抛 `LockFailureException` 上抛 GlobalExceptionHandler 兜底返 500,前端体验差。 - -**现**:全局 `LockFailureExceptionHandler` 拦截返: -```json -{ "code": 100503, "message": "资源被占用,请稍后重试", "success": false } -``` - -**生效范围**:全部 @Lock4j 注解(目前主要 ProductSnapshotService.restoreSnapshot,后续扩展)。前端如有错误码映射需识别 100503 显示"操作冲突,请稍后重试"提示。 - -### 2. 🟢 Bug 修复:漏修的 listCustomers Wrapper(后端内部) -`hl-user-service` listCustomers Service 内 Wrapper 残留下沉到 `UserMapper.selectCustomerPage` default。前端无感知。 - ---- - -## 一、变更接口清单 - -| # | 接口 | 变更类型 | 说明 | -|---|------|----------|------| -| 1 | 所有 @Lock4j 注解接口(目前 `/admin/product/snapshot/restore`) | **错误码新增** | 抢锁失败返 `100503 RESOURCE_LOCKED` 而非 500 | -| 2 | `/admin/customer/page` 等 | **内部重构** | listCustomers Wrapper 下沉到 Mapper default(前端响应不变) | - ---- - -## 二、关键改动(内部) - -1. **`hl-common-core.CommonErrorCode`** 新增 `RESOURCE_LOCKED(100503, "资源被占用,请稍后重试")` -2. **`hl-starter-protection.LockFailureExceptionHandler`** 新增全局 `@RestControllerAdvice` 拦截 `LockFailureException` 返 100503 -3. **`HouseEventEnum.CUSTOMER_CHANGE`** 孤儿常量删除(PR #2846 删了对应状态机规则,枚举常量是孤儿) -4. **`HouseEventPublisher` → `HouseNotificationPublisher`** rename(单职责后类名误导)— 9 处引用 + 3 IT @MockBean 同步 -5. **`ComplaintConverter`** 手工 substring 脱敏 → `PiiMaskUtil.maskPhone()`(删 13 行) -6. **PR #2846 8 处 JavaDoc 旧编号/类名更新**(808990→808900 / 808994→808901 / 808993→808941 / `RESOURCE_SERVICE_UNAVAILABLE`→`RESOURCE_UNAVAILABLE` / `INVENTORY_DEDUCT_FAILED`→`ROOM_STOCK_INSUFFICIENT`) -7. **5 个新 Mapper default 单测**:LoginLogMapperTest / UserMapperTest / AdminUserMapperTest(8 测试) - ---- - -## 三、测试服验证 - -| 服务 | 部署 commit | uptime | 验证 | -|------|------------|--------|------| -| hl-user-service | dev-v3 含 #2850 | 21:34 | ✅ Wrapper 下沉 + 新 Mapper default 单测全绿 | -| hl-order-service-v3 | dev-v3 含 #2850 | 21:36(SSH restart) | ✅ Publisher rename 后启动正常 | - ---- - -## 四、累计 Round 1 + Round 2 收益 - -| 维度 | 数值 | -|------|------| -| PR 数 | 5 张(#2845 / #2846 / #2847 / #2848 / #2850) | -| 工单数 | 5 张(#2841 / #2842 / #2843 / #2844 / #2849) | -| 净行数 | **-1359(R1) + +311(R2 含 5 新测试文件)= 净 -1048 行** | -| HOUSE 模块评分 | C+ → **A-** | -| 整体评分 | Round 1 A- → Round 2 后整体 **A** | -| 单测数 | 2579 + Round 1 各服务 全绿 | - ---- - -## 五、留尾(独立工单 backlog) - -- **product-v2 全模块 294 文件 HTML 标签清零**(P0 铁规 15h 全局)→ 大工程独立工单 -- **MpTripDetailVO Object → List 真实数据回归** → /@qa 工单 -- **AdminUserService 9 处跨聚合 Mapper(红线 5 二期)** → 独立工单 -- **HOUSE FLEET vehicle_plan Feign 接通后补 DRIVER 通知三件套** → 独立工单 -- **MaterialCategory ↔ Permission 双 @Lazy 抽 PermissionGate** → backlog -- **EquipmentTemplateService ↔ ProductLineService 双 @Lazy 抽 ProductEquipmentBindingService** → backlog - ---- - -## 六、关联 - -- 工单: #2849(closed) -- PR: #2850(merged) -- Round 2 review 来源: Claude /@cr 3 agent 并发(A/B/C)2026-05-22 -- **memory P0 铁规 7 升级**:agent 严禁 git stash(同周 3 次违规累计 4+ 次) diff --git a/changelogs-v2/2026-05/22_2851_round3-followup_PR2853.md b/changelogs-v2/2026-05/22_2851_round3-followup_PR2853.md deleted file mode 100644 index f6f8f47..0000000 --- a/changelogs-v2/2026-05/22_2851_round3-followup_PR2853.md +++ /dev/null @@ -1,96 +0,0 @@ -# Round 3 收尾 13 项:TokenService 灰度删 + swap 状态机假阳性修复 + PiiMaskUtil 三套合一 + youngChild 术语统一 + 杂项 - -> **服务**: hl-user-service + hl-product-service-v2 + hl-fleet-service + hl-order-service-v3 + hl-common-core + hl-starter-protection -> **PR**: #2853 -> **Issue**: #2851 -> **日期**: 2026-05-22 -> **影响**: 内部 / 注释 / 工具类合一 — **司机/出行人 PII 脱敏掩码格式微调,前端需注意** - ---- - -## ⚠️ 关键变化(前端需关注) - -### 1. 🟡 司机/出行人 PII 脱敏掩码格式微调(`fleet maskIdCard`) -**前**:`150102******1234`(6 位星固定长度) -**后**:`150***********1234`(SensitiveDataUtil 变长星) - -**影响**:司机 / 出行人列表 `idCardNoMasked` 字段长度从 18 字符变 17 字符(具体看身份证长度差),前端如果有断言式校验需放宽。**业务语义不变,仍是 PII 脱敏**。 - -### 2. 🟡 "幼儿数 / 幼童" → 统一改"小童"(术语) -跨 7 个 VO/Service:`OrderCreateReqVO` / `OrderMainVO` / `ProductFeignClient` / `GroupOrderStrategy` 等 `@ApiModelProperty` 和 javadoc 中"幼儿数"、"幼童"全统一为"小童"。**字段名 `youngChildCount` 不变**,只是中文标签统一。前端如展示了原"幼儿数"或"幼童"字样,改为"小童数"即可。 - -### 3. 🟢 @Lock4j 抢锁失败错误码扩展(后端) -之前 R2 加的 `LockFailureExceptionHandler` 只拦 `LockFailureException`,现在改拦父类 `LockException`,覆盖 lock4j Redis lua 异常 / 释放锁失败等所有 lock4j 异常,统一返 `100503 RESOURCE_LOCKED`。 - ---- - -## 一、必修 13 项(6 P0 + 7 P1) - -### P0 -1. **TokenService 灰度 fallback 删**(2026-05-22 到期):删 8 行旧 key 兼容 + 对应单测 -2. **HouseHotelSwapServiceImpl.isInExceptionState 假阳性修复**:`findOpenByOrderAndTypes` 仅查 `SWAP_HOTEL`,REFUND 剔除(REFUND OPEN 待办与 swap 无关,避免误 fire `EXCEPTION→CLAIMING`) -3. **RefundReconcileJob.java:67 Wrapper 下沉**:Job 内 `new LambdaQueryWrapperX` 改 `RefundRecordMapper.selectPendingForReconcile` default -4. **youngChildCount 中文名统一「小童」**(7 文件) -5. **PiiMaskUtil 三套合一 → SensitiveDataUtil**: - - 删 `hl-order-service-v3/.../shared/util/PiiMaskUtil.java` - - 删 `hl-fleet-service/.../shared/util/PiiMaskUtil.java` - - `SensitiveDataUtil` 新增 `maskRawLine` 方法收编 v3 正则 - - v3 + fleet 共 11 处调用方迁移 - - **v2 PiiMaskUtil 保留(legacy 模块,非本工单范围)** -6. **过时 TODO + 占位日志清理**:MaterialDashboardService TODO 删 / ProductDayHotelService + GroupTourBatchService log.warn("[TODO]") → log.debug - -### P1 -7. `LockFailureExceptionHandler` 拦父类 `LockException` -8. `HotelRequirementMapper.@Select` 删 → `HouseAssignmentService.countConfirmedByRequirement` 暴露 -9. `@Autowired` → 构造器注入(AgencyProperties + RefundReviewService) -10. `TravelerErrorCode.TRANSPORT_PLAN_NOT_BELONG_TO_ORDER (581121)` 0 调用 @Deprecated 删(9 行) -11. `HouseStateMachineConfig:154` 重复叙事精简 -12. `RouteMapCacheService:27` 主观词"性能优化" → "缓存减少对高德 API 重复请求" -13. `HouseAssignmentService` 两处 TODO 格式统一为 `#2729-followup` - ---- - -## 二、测试服验证 - -| 服务 | 部署 commit | uptime | 验证 | -|------|------------|--------|------| -| hl-user-service | dev-v3 含 #2853 | 22:30 | ✅ TokenService 灰度 fallback 已删 | -| hl-product-service-v2 | dev-v3 含 #2853 | 22:31 | ✅ | -| hl-fleet-service | dev-v3 含 #2853 | 22:32 | ✅ | -| hl-order-service-v3 | dev-v3 含 #2853 | 22:33(SSH restart) | ✅ | - -单测:5 模块全绿(common 463/463 / user 2433/2433 / product-v2 1300/1300 / fleet 178/178 / order-v3 1911/1928 — 17 失败全 baseline 预存)。 - ---- - -## 三、Round 1 + 2 + 3 累计成果 - -| 维度 | Round 1 | Round 2 | Round 3 | 累计 | -|------|---------|---------|---------|------| -| 工单 | #2841-#2844 | #2849 | #2851 | 6 张 | -| PR | #2845-#2848 | #2850 | #2853 | 6 张 | -| 净行数 | -1359 | +311 | -130 | **-1178** | -| HOUSE 评分 | C+ → A- | A- | A | C+ → **A** | -| 整体评分 | C+ → A- | A- → A | A → **A+** | A+ | - ---- - -## 四、留尾(独立工单 backlog,**本轮明确不做**) - -- **#2852 HTML 标签全模块清零 3010 处**(大工程独立) -- MpInternalRefundController 444 行 BFF Facade 抽离 -- 9 个 Service+Impl 单实现合并(refund/house/agency) -- 巨型 private 方法独立 Builder/Assembler -- 720000/798000 段位上移 CommonErrorCode -- Long ID @JsonSerialize Mixin 全局 -- AdminUserService 红线 5 二期(跨聚合 Mapper) -- 手工金额格式化抽 MoneyUtil -- v2 PiiMaskUtil legacy 清理 - ---- - -## 五、关联 - -- 工单: #2851(closed) -- PR: #2853(merged) -- Round 3 review 来源: Claude /@cr 4 agent 并发(A 注释严谨/B 逻辑准确/C 残留过度设计/D 跨模块一致性)2026-05-22 diff --git a/changelogs-v2/2026-05/22_2852-2857_review-r4-backlog_PR2858-2862.md b/changelogs-v2/2026-05/22_2852-2857_review-r4-backlog_PR2858-2862.md deleted file mode 100644 index d0e160a..0000000 --- a/changelogs-v2/2026-05/22_2852-2857_review-r4-backlog_PR2858-2862.md +++ /dev/null @@ -1,118 +0,0 @@ -# Backlog 五连发:HTML 标签清零 + BFF Facade + 红线 5 二期 + MoneyUtil + Service+Impl 合并 - -> **服务**: 全模块(hl-common-core / hl-user-service / hl-order-service-v2 / hl-order-service-v3 / hl-product-service-v2 / hl-fleet-service / hl-mp-service) -> **PR**: #2858 / #2859 / #2860 / #2861 / #2862 -> **Issue**: #2852 / #2854 / #2855 / #2856 / #2857 -> **日期**: 2026-05-22 -> **影响**: **0 个 URL 变更 / 0 个 VO 字段变更 / 0 个响应结构变更** — 全部纯重构,**前端无任何感知/无需改代码** - ---- - -## ⚠️ 关键变化(前端可感知) - -**无**。本次 5 PR 是 Round 3 留尾 backlog 集中清理,目标是代码质量 + 工程纪律,**前端零影响**: - -- URL 全保留(#2861 BFF Facade 拆分时 100% URL 一致) -- VO 字段全保留(#2858 红线 5 二期只动 Service 内部 Mapper 调用) -- 响应结构全保留 -- 字典/字段命名零变更 - ---- - -## 一、5 PR 改动概览 - -### PR #2858 红线 5 二期(`refactor(redline5)`) -**Closes #2855** — AdminUserService 跨聚合 Mapper 全迁移到 Service。 - -- 3 个跨聚合 Mapper 下沉:SysRoleMapper → SysRoleService / WechatUserMapper → WechatUserService(新建) / WechatDepartmentMapper → WechatDepartmentService(新建) -- 新增 Service 方法 5 个 + Mapper default 1 个 -- AdminUserService Mapper 注入数 3 → 1(只剩自家 AdminUserRoleMapper) -- 净 +149-103 + 4 个新文件 +344 行(2 新 Service + 2 新 Service 单测) -- 测试:2448 用例全绿 - -### PR #2859 MoneyUtil 抽取(`refactor(money-util)`) -**Closes #2856** — hl-common-core 新增 MoneyUtil + 全模块迁移。 - -- `MoneyUtil` 4 方法:formatYuan / toFen / toYuan / parseYuan(105 行 + 单测 135 行 15 例) -- 迁移 10 处(7 formatYuan + 3 toFen):TencentEsign × 2、Tourage × 2、ContractCreateService、NotificationEventHelper、InternalProductService(formatPriceLabel)、PaymentService.yuanToFen、RefundReconcileJob.yuanToFen、RefundChannelService.yuanToFen -- 保留 17 处(语义不匹配:经纬度 setScale / 百分比 .divide(100) / ROUND_DOWN 舍入 / setScale 截 BigDecimal 等) -- 净 +48-38 + 2 新文件 +240 行 -- 测试:order-v2 + product-v2 + order-v3 共 3193 + 1886 用例全绿 - -### PR #2860 Service+Impl 合并(`refactor(yagni)`) -**Closes #2857** — 8 个单实现 Service+Impl 合并(YAGNI 反过度设计)。 - -- 标准 interface + Impl 合并 3 个:TravelAgencyPaymentService / TravelAgencyQualificationService / HouseHotelSwapService -- 删除"命名兼容层"5 个:RefundAppealServiceImpl / RefundApplyServiceImpl / RefundOrchestrationServiceImpl / RefundReviewServiceImpl / RefundStatusLogServiceImpl(均为 extends RefundXxxService 的空子类,只为测试 new 用) -- 严格按 4 条件筛选(MockBean / Feign / Fallback 全排除) -- 净 -244 行(+1054 -1298) -- 测试:6 关键测试类 102 用例全绿 - -### PR #2861 BFF Facade 抽离(`refactor(refund-bff)`) -**Closes #2854** — MpInternalRefundController 444 → 107 行(76% 压缩) + 3 Facade。 - -- 新建 3 Facade(全部 @Service + @RequiredArgsConstructor): - - RefundQueryFacade(265 行,4 查询:preview / reasons / detail / progress + VO 转换) - - RefundApprovalFacade(125 行,2 客户决策:customerAction / directAppeal) - - RefundExecutionFacade(118 行,1 执行:createApplication) -- Controller 107 行(略超 100,7 端点参数声明无法再压) -- 26 新单测(Query 13 + Approval 7 + Execution 6) + Controller 测试重写 14 例 = 40 全绿 -- **URL 100% 一致**(8 Mapping:1 类级 + 7 端点)BFF 前端无感知 -- 净 +119-680 改 + 1255 新文件(3 Facade 508 + 3 Test 747)≈ 净 +694 行(主要单测翻倍) - -### PR #2862 HTML 标签清零(`refactor(html-cleanup)`) -**Closes #2852** — P0 铁规 15h(代码注释禁用 HTML 标签)5+ 月历史债清零。 - -- 全工程 Java 注释 HTML 标签 → markdown:`

` → 空行 / `` → `**` / `

  • ` → `- ` / `
    ` → 换行 等 -- 命中前 **8709 处** → 命中后 **57 处**(全部字符串字面量,如 AuthController/FileService 返回 HTML 模板,必须保留) -- **0 处在注释里**(grep -v 字符串验证) -- 改动 **1589 文件**,**+8764 -8764 完全对称**(纯字符替换,业务代码 0 改动,字节码不变) -- mvn compile 24 模块全绿(javadoc 严格检查通过) -- mvn test 7629 测试,17 失败全部 baseline 与本工单无关(ArchUnit / OrderDetailIntegrationTest H2 schema) - ---- - -## 二、累计成果(Round 1 + 2 + 3 + Backlog R4) - -| 维度 | R1 | R2 | R3 | **R4 Backlog** | 累计 | -|------|-----|-----|-----|---------------|------| -| 工单 | #2841-#2844 | #2849 | #2851 | **#2852/#2854/#2855/#2856/#2857** | **11 张** | -| PR | #2845-#2848 | #2850 | #2853 | **#2858-#2862** | **11 张** | -| 净行数 | -1359 | +311 | -130 | **+0(HTML 0)/+839(其他 4)** | ~净 **-340 行** | -| HOUSE 评分 | C+ → A- | A- | A | **A**(无 HOUSE 改动) | C+ → **A** | -| 整体评分 | A- | A | A+ | **A+**(纪律完结) | **A+** | - ---- - -## 三、测试服验证 - -| 服务 | 部署 commit | uptime | 验证 | -|------|------------|--------|------| -| hl-user-service | dev-v3 含 5 PR | 待部署 | 待验 | -| hl-product-service-v2 | dev-v3 含 5 PR | 待部署 | 待验 | -| hl-order-service-v2 | dev-v3 含 5 PR | 待部署 | 待验 | -| hl-order-service-v3 | dev-v3 含 5 PR | 待部署(SSH restart) | 待验 | -| hl-fleet-service | dev-v3 含 5 PR | 待部署 | 待验 | -| hl-mp-service | dev-v3 含 5 PR | 待部署 | 待验 | - -**Round 3 QA 全流程报告**:9 链路全 PASS / 0 BLOCKER / 0 WARN(dev-v3 b352b3036 测试,本批 5 PR 是纯重构,QA 结果同等可信) - ---- - -## 四、留尾 backlog(独立后续工单,**本轮明确不做**) - -- AdminUserService 红线 5 三期(剩余跨聚合 Mapper,如有) -- MpTripDetailVO Object → List 真实数据回归 → /@qa 工单 -- HOUSE FLEET vehicle_plan Feign 接通后补 DRIVER 通知三件套 -- MaterialCategory ↔ Permission 双 @Lazy 抽 PermissionGate -- EquipmentTemplateService ↔ ProductLineService 双 @Lazy 抽 ProductEquipmentBindingService -- 720000/798000 段位上移 CommonErrorCode -- Long ID @JsonSerialize Mixin 全局 - ---- - -## 五、关联 - -- 工单: #2852 / #2854 / #2855 / #2856 / #2857(全部 closed) -- PR: #2858 / #2859 / #2860 / #2861 / #2862(全部 squash merged) -- Round 4(backlog 集中清理)来源: 用户 5 月 22 日"继续任务"清单 diff --git a/changelogs-v2/2026-05/22_2863-2865_QA-D+QA-E-bugs_PR2864-2866.md b/changelogs-v2/2026-05/22_2863-2865_QA-D+QA-E-bugs_PR2864-2866.md deleted file mode 100644 index 1c9b12b..0000000 --- a/changelogs-v2/2026-05/22_2863-2865_QA-D+QA-E-bugs_PR2864-2866.md +++ /dev/null @@ -1,146 +0,0 @@ -# QA-D 文档驱动 + QA-E 字段反查发现 4 个 P0/P1 真实 bug 修复 - -> **服务**: hl-gateway + hl-order-service-v3 -> **PR**: #2864 / #2866 -> **Issue**: #2863 / #2865 -> **日期**: 2026-05-22 -> **影响**: **5 个原本经网关 404 的 v3 接口现在通了** + **list/detail 字段静默不一致 2 bug 修复** - ---- - -## ⚠️ 关键变化(前端必读) - -### 1. 🔴 订单列表 `tags` 字段类型变更(breaking change,**前端必须同步改 hl-ui**) - -**之前**:`tags` = `string[]` 如 `['VIP', '高净值']` -**之后**:`tags` = `Array<{name, type, color}>` 富对象数组(与 detail 端 `main.tags` 完全一致) - -**影响**:`/v3/admin/order` 列表 list[].tags 类型变更。**前端用 `tags.join(',')` 字符串操作会 NPE**,必须改为 `tags.map(t => t.name).join(',')`。 - -**示例**: -```js -// 之前 -order.tags // ['VIP', '高净值'] -order.tags[0] // 'VIP' - -// 之后 -order.tags // [{name: 'VIP', type: 'level', color: '#FF0000'}, ...] -order.tags[0].name // 'VIP' -order.tags[0].color // 用于显示标签底色 -``` - -### 2. 🟡 订单详情 `main.orderNo` + `main.teamNo` 字段新增 - -**之前**:`/v3/admin/order/{id}` detail.main 只有 `displayOrderNo`,无 `orderNo` 和 `teamNo` -**之后**:detail.main 同时返 `orderNo` + `teamNo` + `displayOrderNo` 三个字段 - -**影响**:前端可从详情页直接拿原始 `orderNo` 用于搜索/精确比对/退款关联/合同关联,不需要反解 `displayOrderNo`。 - -**何时出现差异**:成团后 `displayOrderNo = "{orderNo}-T{teamNo}"`,之前前端从详情页拿不到原始 orderNo;改后两个字段都有。 - -### 3. 🟢 5 个原本经网关 404 的 v3 接口现在通了 - -**之前**:这 5 个 admin/internal 接口经网关访问 100% 404(gateway 缺路由),前端从未能调过 -**之后**:网关补路由后,接口可正常调用(401 / 200 等正常响应) - -| 接口前缀 | Controller | -|----------|-----------| -| `/v3/admin/complaint/**` | AdminComplaintController | -| `/v3/admin/review/**` | AdminReviewController | -| `/v3/internal/review/**` | InternalReviewController | -| `/v3/internal/mp/review/**` | InternalMpReviewController | -| `/v3/internal/house/**` | HouseInternalAssignmentController | - -### 4. 🟡 `/admin/order/{id}/status-log` 改为 `/v3/admin/order/{id}/status-log` - -**之前**:`AdminOrderStatusLogController` `@RequestMapping("/admin/order")` 没 v3 前缀,被 v2 路由抢截 100% 404 -**之后**:改为 `/v3/admin/order`,与 v3 命名规范一致 - -**影响**:前端如果调过 `/admin/order/{id}/status-log` 会 404(原本也 404,没人调过),改后用 `/v3/admin/order/{id}/status-log`。 - ---- - -## 一、改动概览 - -### PR #2864 — 修 gateway 6 路由(Closes #2863) -- gateway `application.yml` line 205 `order-service-v3` 路由 Path 末尾追加 5 个 path -- `AdminOrderStatusLogController` `@RequestMapping("/admin/order")` → `/v3/admin/order` -- `AdminOrderStatusLogControllerTest` 3 处 mockMvc 路径同步改 `/v3` 前缀 -- 3 文件 +6 -6 lines -- 测试:GatewayRouteAuditTest 1/1 + AdminOrderStatusLogControllerTest 3/3 全绿 - -### PR #2866 — 修 2 个静默字段 bug(Closes #2865) -- BUG-1: `OrderMainVO` 补 `orderNo` + `teamNo` 字段,Converter 同步映射 -- BUG-2: list `tags` 类型 `List` → `List` 富对象(复用 detail 端 TagVO) -- `OrderInfoConverter.toTagVO` 提升 public static,list/detail 共用映射器 -- `OrderService.listOrders` 批量聚合 `Map>` 去 N+1 -- 6 文件 +179 -9 lines -- 新增 5 单测(OrderInfoConverterTest 3 + OrderServiceTest 2) -- 测试:113 直接相关 0 failures(89 service + 24 converter) - ---- - -## 二、QA 测试覆盖说明 - -本次 4 个 QA agent 并行覆盖 dev-v3 近 5 天 wx 提交全量: - -| Agent | 范围 | 结果 | -|-------|------|------| -| **QA-A** HOUSE 模块全量 | 46 测试点 | 42 PASS / 4 WARN(数据稀疏)/ 0 FAIL / 0 BLOCKER | -| **QA-B** 订单/traveler/agency/合同/tag-library | 53 项 | 51 PASS / 2 WARN(doc-vs-code 错误码)/ 0 BLOCKER | -| **QA-C** 通知/字典/mp/fleet | 40 URL | 全 PASS / 0 BLOCKER | -| **QA-D** 文档驱动业务流端到端 | 8 业务链 + 4 反例 + 6 规则 | 找出 **2 个 P0 BLOCKER**(gateway 路由 5 缺 + 1 冲突) | -| **QA-E** 字段语义反查(API cross-check + DB SELECT) | 10 对接口比对 | 找出 **2 个真实静默 bug**(tags shape / orderNo 丢失) | - ---- - -## 三、测试服验证 - -| 服务 | 部署 commit | uptime | 验证 | -|------|------------|--------|------| -| hl-gateway | dev-v3 含 #2864 | 部署完毕 | 6 路径 HTTP 200 通(无 404) | -| hl-order-service-v3 | dev-v3 含 #2864+#2866 | 部署完毕 | detail.main.orderNo + list[0].tags 富对象待 mmg 复测 | - ---- - -## 四、5 天 wx 提交累计成果(全部 PR 总览) - -| Round | 工单 | PR | 主题 | 净行数 | -|-------|------|-----|------|--------| -| R1 review | #2841-#2844 | #2845-#2848 | 反过度设计 + 简洁可读 | -1359 | -| R2 收尾 | #2849 | #2850 | 7 项可现做项 + Lock4j 100503 | +311 | -| R3 收尾 | #2851 | #2853 | TokenService 灰度 + PiiMaskUtil 三合一 + 小童 | -130 | -| R4 Backlog | #2852/#2854/#2855/#2856/#2857 | #2858-#2862 | HTML 清零 1589 文件 + BFF Facade + 红线 5 + MoneyUtil + Service+Impl | 净 -340 | -| **QA 真测发现** | **#2863/#2865** | **#2864/#2866** | **gateway 6 路由 + list/detail 2 静默 bug** | **+185 -15** | -| **合计** | **13 工单** | **13 PR** | | **净 -1348 行** | - -整体评分:**A+ 维持**(QA 真测 4+1 agent 全覆盖,5 个静默 bug 已修)。 - ---- - -## 五、hotfix #2881(回滚 PR #2864 引入的回归) - -QA 真测验证 PR #2864 时发现 `/v3/admin/order/{id}/status-log` 返 500 Ambiguous handler。PR #2864 误把 wx 故意写的 `AdminOrderStatusLogController @RequestMapping("/admin/order")`(被 v2 抢截 404,设计上的"隐藏入口",PRP § 9 R13)改成 `/v3/admin/order`,反而与 OrderController 早就存在的同 URL 端点撞冲突。 - -**hotfix PR #2881 (#2880)**: -- AdminOrderStatusLogController 路径回滚 `/v3/admin/order` → `/admin/order`(故意 404 设计) -- AdminOrderStatusLogControllerTest 3 处 mockMvc 同步回滚 -- javadoc 加大量警告注释 + 历史教训("严禁改 v3 前缀,会与 OrderController 撞 URL") - -**保留 PR #2864 其他改动**:gateway 5 路由追加(complaint/review/internal-review/internal-mp-review/internal-house)是真 bug 修复,保留。 - -**最终验证**(部署后): -- `/v3/admin/order/{id}/status-log` code=200,真返 `List` 1 条(occurredAt/operator/action/fromStatus/toStatus/amount 6 字段) -- `/admin/order/{id}/status-log` code=404 维持设计 - -## 六、关联 - -- 工单: #2863 / #2865 / #2880(全部 closed) -- PR: #2864 / #2866 / #2881(全部 squash merged) -- QA 报告: - - `.tmp/qa-house-report.txt`(QA-A 46 项) - - `.tmp/qa-ord-report.txt`(QA-B 53 项) - - `.tmp/qa-msg-report.txt`(QA-C 40 项) - - `.tmp/qa-doc-chain-report.txt`(QA-D 8 业务链) - - `.tmp/qa-cross-check-report.txt`(QA-E 10 字段对比 + DB 反查) -- memory 升级:P0 #16(新 admin Controller 必同步改 gateway 路由)第 5 次复发,强化 reminder diff --git a/changelogs-v2/2026-05/22_2867-2868_订单详情枚举统一+service-standard修复-修改接口-管理后台.md b/changelogs-v2/2026-05/22_2867-2868_订单详情枚举统一+service-standard修复-修改接口-管理后台.md deleted file mode 100644 index 66e7aa5..0000000 --- a/changelogs-v2/2026-05/22_2867-2868_订单详情枚举统一+service-standard修复-修改接口-管理后台.md +++ /dev/null @@ -1,298 +0,0 @@ -# [修改接口·管理后台] 订单详情枚举统一 + service-standard 修复 (#2867 #2868) - -> **PR**: #2869 #2874 | **服务**: hl-order-service-v3 | **更新时间**: 2026-05-22 - -## 1. 接口背景 - -本次修复合并两个 PR,均针对订单详情页管理后台接口的静默 bug: - -- **PR #2869(Issue #2868)枚举统一 + null 兑底**:contractStatus / insuranceStatus 两个字段历史上枚举値定义不完整(少了中间过渡态和 NONE 初始态),且在订单还未进入合同/保险流程时后端直接返回 null,前端字典无法匹配导致显示空白或"未知"。本次统一枚举値集并将 null 兑底为 "NONE"。 - -- **PR #2874(Issue #2867)service-standard Tab 修复**:hasServiceStandard 字段原来只判断快照记录是否存在(行存在即返回 true),未校验反序列化是否成功、itinerary 是否非空,导致前端收到 hasServiceStandard=true 后调 GET /service-standard 接口却收到 data=null 的矛盾。根因是快照 itinerary 字段类型 List 与源头 List 不匹配,反序列化失败被静默吞掉。 - -## 2. 变更清单 - -| # | 接口 | 方法 | 路径 | 变更类型 | 说明 | -|---|------|------|------|----------|------| -| 1 | 订单详情 | GET | `/v3/admin/order/{id}` | 修改接口 | contractStatus/insuranceStatus 枚举统一;hasServiceStandard 判定逻辑修复 | -| 2 | 合同&保险 Tab | GET | `/v3/admin/order/{id}/contract-insurance` | 修改接口 | contractStatus/insuranceStatus 枚举统一,null 兑底为 NONE | -| 3 | 服务标准 Tab | GET | `/v3/admin/order/{id}/service-standard` | 修改接口(行为修复) | 原来 data 永远 null;现在能正常返回完整数据 | - -## 3. 接口详情 - -### 3.1 GET /v3/admin/order/{id} —— 订单详情 - -- **使用场景**:管理后台订单详情页首次加载,获取订单主信息 -- **认证**:需要管理后台 JWT(Bearer token),role=ADMIN -- **幂等性**:是(只读) -- **限流**:无 - -**本次变更字段**: -- `data.main.contractStatus`:枚举値扩展(4→6 値),null → `"NONE"` -- `data.main.insuranceStatus`:枚举値扩展(4→5 値),null → `"NONE"` -- `data.main.hasServiceStandard`:判定逻辑修复(见 §9) - -### 3.2 GET /v3/admin/order/{id}/contract-insurance —— 合同&保险 Tab - -- **使用场景**:管理后台订单详情页切换到 "合同&保险" Tab 时调用 -- **认证**:需要管理后台 JWT(Bearer token),role=ADMIN -- **幂等性**:是(只读) -- **限流**:无 - -**本次变更字段**: -- `data.contract.contractStatus`:枚举値扩展(4→6 値),null → `"NONE"` -- `data.insurance.insuranceStatus`:枚举値扩展(4→5 値),null → `"NONE"` - -### 3.3 GET /v3/admin/order/{id}/service-standard —— 服务标准 Tab - -- **使用场景**:管理后台订单详情页切换到 "服务标准" Tab 时调用;应在 `hasServiceStandard=true` 时才调此接口 -- **认证**:需要管理后台 JWT(Bearer token),role=ADMIN -- **幂等性**:是(只读) -- **限流**:无 - -**本次变更**:行为修复。修复前 data 永远为 null;修复后在有效快照时返回完整结构。 - -## 4. 接口入参 - -### 4.1 路径参数 - -三个接口入参相同,无变化。 - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| `id` | Long(String) | 是 | 订单 ID(snowflake,JSON 传 String 防精度丢失) | - -### 4.2 请求体字段 - -三个接口均为 GET,无请求体。 - -## 5. 出参(响应) - -### 5.1 GET /v3/admin/order/{id} —— 变更字段 - -| 字段路径 | 类型 | 说明 | -|----------|------|------| -| `data.main.contractStatus` | String(枚举) | 合同状态,见 §6.1。**本次扩展枚举値 + null 兑底** | -| `data.main.insuranceStatus` | String(枚举) | 保险状态,见 §6.2。**本次扩展枚举値 + null 兑底** | -| `data.main.hasServiceStandard` | Boolean | 是否有服务标准快照。**本次修复判定逻辑** | - -### 5.2 GET /v3/admin/order/{id}/contract-insurance —— 变更字段 - -| 字段路径 | 类型 | 说明 | -|----------|------|------| -| `data.contract.contractStatus` | String(枚举) | 合同状态,见 §6.1。**本次扩展枚举値 + null 兑底** | -| `data.insurance.insuranceStatus` | String(枚举) | 保险状态,见 §6.2。**本次扩展枚举値 + null 兑底** | - -### 5.3 GET /v3/admin/order/{id}/service-standard —— ServiceStandardVO(完整) - -| 字段 | 类型 | 说明 | -|------|------|------| -| `data.itinerary` | List | 行程列表,元素格式:"Day{n} {title}",如 "Day1 抵达成都"。**修复前恒为 null,修复后正常返回** | -| `data.notice` | String | 出行须知。可为 null | -| `data.refundPolicy` | String | 退款政策说明。可为 null | - -当订单无服务标准快照时(`hasServiceStandard=false`),整个 `data` 为 null。 - -## 6. 枚举 / 数据字典 - -### 6.1 contractStatus(合同状态) - -**所属字段**:`data.main.contractStatus`(OrderMainVO)、`data.contract.contractStatus`(ContractInsuranceVO)| **类型**:`String` - -| 値 | 中文 | 说明 | -|----|------|------| -| `NONE` | 无合同 | 订单尚未进入签约流程(修复前此状态返回 null) | -| `GENERATING` | 生成中 | 合同正在后台生成 | -| `GENERATED` | 已生成 | 合同已生成,待客户签署 | -| `SIGNED` | 已签署 | 客户已完成签署 | -| `VOIDED` | 已作废 | 合同已作废 | -| `RESIGNING` | 重签中 | 合同正在重新发起签署 | - -**修复前仅有4 値**:PENDING / GENERATED / SIGNED / VOIDED(PENDING 已废弃,NONE / GENERATING / RESIGNING 为本次新增枚举値) - -### 6.2 insuranceStatus(保险状态) - -**所属字段**:`data.main.insuranceStatus`(OrderMainVO)、`data.insurance.insuranceStatus`(ContractInsuranceVO)| **类型**:`String` - -| 値 | 中文 | 说明 | -|----|------|------| -| `NONE` | 无保险 | 订单尚未进入投保流程(修复前此状态返回 null) | -| `ISSUING` | 投保中 | 保险正在后台出单 | -| `ISSUED` | 已出单 | 保险已成功出单 | -| `CANCELLED` | 已取消 | 保险已取消 | -| `FAILED` | 出单失败 | 保险出单失败 | - -**修复前仅有4 値**:PENDING / ACTIVE / FAILED / CANCELLED(旧値已废弃重命名,全部替换为上表5 値) - -## 7. 错误码 - -本次修复无新增错误码。 - -| code | 含义 | 触发场景 | -|------|------|----------| -| `200` | 成功 | 正常响应 | -| `1000400` | 参数异常 | 路径参数 `id` 格式错误 | -| `1000404` | 订单不存在 | 指定 id 的订单不存在或已删除 | -| `1000403` | 无权限 | 非管理员 token 访问 | - -## 8. 示例 - -### 8.1 典型成功 —— 新建订单 contractStatus 返 NONE(修复前返 null) - -**请求**: - -``` -GET /v3/admin/order/1921234567890123456 -Authorization: Bearer -``` - -**响应**: - -```json -{ - "code": 200, - "data": { - "main": { - "orderId": "1921234567890123456", - "orderNo": "ORD20260522001", - "contractStatus": "NONE", - "insuranceStatus": "NONE", - "hasServiceStandard": false - } - }, - "message": "ok", - "success": true -} -``` - -> 修复前:contractStatus: null,insuranceStatus: null,前端字典无法匹配显示空白。 - -### 8.2 边界情况 —— service-standard 接口有快照时返完整数据(修复前永远 null) - -**请求**: - -``` -GET /v3/admin/order/1921234567890123456/service-standard -Authorization: Bearer -``` - -**响应(修复后)**: - -```json -{ - "code": 200, - "data": { - "itinerary": [ - "Day1 抵达成都,入住民宿", - "Day2 前往峨眉山景区", - "Day3 返程" - ], - "notice": "请携带身份证原件,到达后联系导游", - "refundPolicy": "出发7天以上全额退款,7天内收取50%手续费" - }, - "message": "ok", - "success": true -} -``` - -**响应(修复前)**: - -```json -{ - "code": 200, - "data": null, - "message": "ok", - "success": true -} -``` - -### 8.3 业务失败 —— hasServiceStandard=false 时 service-standard 返 data=null(正常行为) - -**场景说明**:订单未绑定产品行程快照,调 service-standard 接口返 data=null 是正常行为。 - -**请求**: - -``` -GET /v3/admin/order/1921111111111111111/service-standard -Authorization: Bearer -``` - -**响应**: - -```json -{ - "code": 200, - "data": null, - "message": "ok", - "success": true -} -``` - -## 9. 业务边界 - -**hasServiceStandard 判定逻辑(修复后)**: - -同时满足以下三个条件,`hasServiceStandard` 才返回 `true`: -1. 订单关联的产品行程快照记录存在 -2. 快照 JSON 反序列化成功(无类型错误) -3. 快照中 `itinerary` 字段非空(至少有1天行程) - -任意一个条件不满足,`hasServiceStandard` 返回 `false`,此时调 `GET /service-standard` 将返回 `data=null`。 - -**contractStatus / insuranceStatus 兑底规则**: -- 订单刚创建、尚未发起签约/投保时,两个字段返回 "NONE"(修复前返回 null) -- 字段値随后端状态机流转更新,不需要前端轮询,刷新页面即可获取最新値 - -## 10. 修改前后对比 - -### 10.1 字段级对比 - -| 字段 | 修复前 | 修复后 | -|------|--------|--------| -| `contractStatus`(初始态) | null | "NONE" | -| `contractStatus`(枚举集合) | PENDING / GENERATED / SIGNED / VOIDED(4 値,含PENDING已废弃) | NONE / GENERATING / GENERATED / SIGNED / VOIDED / RESIGNING(6 値) | -| `insuranceStatus`(初始态) | null | "NONE" | -| `insuranceStatus`(枚举集合) | PENDING / ACTIVE / FAILED / CANCELLED(4 値,均已废弃重命名) | NONE / ISSUING / ISSUED / CANCELLED / FAILED(5 値) | -| `hasServiceStandard` | 只判断快照行存在,partial 快照也返 true | 快照存在 + 反序列化成功 + itinerary 非空,三条件全满足才返 true | -| GET /service-standard data | 永远为 null(反序列化失败被吐) | 有效快照时返回完整 {itinerary, notice, refundPolicy} | - -### 10.2 行为级对比 - -| 行为 | 修复前 | 修复后 | -|------|--------|--------| -| 新建订单合同/保险状态 | 返回 null,前端字典无法匹配 | 返回 "NONE",字典正常匹配显示"无合同"/"无保险" | -| hasServiceStandard=true 但 Tab 内容空 | 会出现(快照反序列化失败时) | 不再出现;hasServiceStandard=true 一定能拿到有效数据 | -| insuranceStatus 枚举 ACTIVE / PENDING | 后端可能返回这两个値 | 后端不再返回,统一替换为新枚举値集合 | - -## 11. 影响评估 / 回滚 - -### 11.1 影响评估 - -- **是否破坏向后兼容**:是(枚举値重命名)。旧字典如只有 PENDING / ACTIVE(保险)或 PENDING(合同)等旧値,遇到新値会显示 "未知"。 -- **前端是否必须同步上线**:建议同步更新枚举字典(§6.1 和 §6.2 完整値表)再上线;若前端能容忍旧値显示 "未知" 可先不同步。 - -### 11.2 回滚方案 - -- **回滚方式**:revert PR #2869 / PR #2874,重新打包部署 hl-order-service-v3 -- **回滚后影响**:contractStatus / insuranceStatus 恢复返回 null 和旧枚举値;service-standard Tab 恢复返回 null - -## 12. 注意事项 - -- **枚举字典必须更新**:旧前端字典仅有4 値/4 値(含已废弃的 PENDING / ACTIVE),遇到新枚举値(如 NONE / GENERATING / RESIGNING / ISSUING / ISSUED)会显示 "未知"。请按 §6.1 和 §6.2 完整値表更新本地枚举字典。 -- **旧枚举値已废弃**:contractStatus 的 PENDING、insuranceStatus 的 PENDING 和 ACTIVE 后端不再返回,前端字典保留无害但不会再出现。 -- **service-standard workaround 清理**:如果前端之前针对 hasServiceStandard=true 但 data=null 的矛盾做过兑底处理(如显示固定占位文案、屏蔽Tab),修复后可以移除该 workaround。 - -## 13. 关联 / 联系人 - -### 13.1 链接 - -- **Issue(枚举统一)**: [#2868](https://git.1814.love:8443/wx/HL/issues/2868) -- **Issue(service-standard 修复)**: [#2867](https://git.1814.love:8443/wx/HL/issues/2867) -- **PR(枚举统一)**: [#2869](https://git.1814.love:8443/wx/HL/pulls/2869) -- **PR(service-standard 修复)**: [#2874](https://git.1814.love:8443/wx/HL/pulls/2874) -- **Merge commit(枚举统一)**: [bb4c41969](https://git.1814.love:8443/wx/HL/commit/bb4c41969) -- **Merge commit(service-standard 修复)**: [442fdf089](https://git.1814.love:8443/wx/HL/commit/442fdf089) - -### 13.2 联系人 - -- **后端负责人**: @yst diff --git a/changelogs-v2/2026-05/22_2894-2896_R5-bugs_PR2900-2902.md b/changelogs-v2/2026-05/22_2894-2896_R5-bugs_PR2900-2902.md deleted file mode 100644 index f248889..0000000 --- a/changelogs-v2/2026-05/22_2894-2896_R5-bugs_PR2900-2902.md +++ /dev/null @@ -1,113 +0,0 @@ -# R5 真测发现 + 修复:PII 应急脱敏 + 配房 BLOCKER + 6 P1 - -> **服务**: hl-order-service-v3 -> **PR**: #2900 / #2901 / #2902 -> **Issue**: #2894 / #2895 / #2896 -> **日期**: 2026-05-22 -> **影响**: **🔴 前端 breaking change(traveler 字段改名)** + 配房链路恢复 + 订单详情补字段 + 金额格式统一 - ---- - -## ⚠️ 关键变化(前端 mmg 必读) - -### 1. 🔴 traveler VO 字段改名(breaking change,**前端必同步改 hl-ui**) - -| 旧字段 | 新字段 | 值格式 | -|--------|--------|--------| -| `idNo` | **`idCardMasked`** | `220***********1234`(17 字符变长星) | -| `phone` | **`phoneMasked`** | `138****2046`(11 字符固定星) | -| `emergencyPhone` | **`emergencyPhoneMasked`** | `139****5678` | - -**适用接口**: -- `GET /v3/admin/order/{id}/traveler/list` 列表 -- `GET /v3/admin/order/{id}` 详情 `overview.travelers` -- traveler 智能解析 dry-run 输出 - -**前端如有 `traveler.idNo` / `traveler.phone` 引用必须改为 `traveler.idCardMasked` / `traveler.phoneMasked`**。 - -### 2. 🟢 订单详情新增 transportPlans + itinerary 字段(BUG-3 修) - -`GET /v3/admin/order/{id}` 顶层 data 新增: -- `transportPlans: List`(大交通列表) -- `itinerary: OrderItineraryRespVO`(行程) - -**前端可直接用**(原本就缺,现在补上)。 - -### 3. 🟢 订单金额字段格式统一 2 位小数 - -之前 `totalAmount=3105.0`(1 位)/ `refundAmount=0.00`(2 位)不一致,**统一改为 2 位小数**: -- `OrderListItemVO` / `OrderMainVO`:5 字段(totalAmount/paidAmount/balanceAmount/depositAmount/singleRoomSurcharge)走 `OrderAmountUtil.to2()` -- Refund Converter 走 `MoneyUtil.formatYuan()` - -**前端如对 `3105.0` 字符串做精确匹配会出问题**,改用 `parseFloat` 或宽松匹配。 - -### 4. 🟢 5 个原本经网关 503/500 的 v3 接口现在通了 - -- `POST /v3/admin/order/hotel-requirements/{rid}/assignments`(原 JSON 500)→ **200** -- `GET /v3/admin/house/staff`(原 504)→ 3s 内返(Feign timeout 收紧 + fallback) -- `GET /v3/admin/contract/{id}`(原 500 BadSqlGrammarException)→ **200** - ---- - -## 一、3 PR 改动 - -### PR #2900 PII 应急脱敏(Closes #2894) -- traveler 3 字段改名(`*Masked` 后缀) + Converter 全 SensitiveDataUtil.maskXxx() 包装 -- TravelerSmartParseService.buildDryRunVO 同步脱敏 -- 6 新单测 + 红线 PII 不泄漏断言,128 traveler 测试 0 failure -- **后续独立工单**:DB TypeHandler 加密(order_traveler+fleet_driver 明文存储)+ audit_log 接入 - -### PR #2901 BLOCKER 修复(Closes #2895) -- BLOCKER-1 配房 500:删 `@JsonDeserialize(using = LongDeserializer)` 错误用法 → 用原生 Long -- BLOCKER-2 house/staff 504:houseStaffFeignClient 单独 connectTimeout=2s + readTimeout=3s,触发现有 fallback 返空 -- 5 新单测 29/29 全绿 -- **经验入 memory**:雪花 Long 字段禁 @JsonDeserialize(LongDeserializer) - -### PR #2902 6 P1(Closes #2896) -- P1-1 contract_status_log 缺 4 BaseDO 列 → V20260522_001.sql 补 -- P1-2 OrderDetailVO 补 transportPlans + itinerary + Service 聚合 -- P1-3 OrderAmountUtil.to2 统一 2 位小数 + RefundConverter 走 MoneyUtil -- P1-4 inquiry_message.dayNumber → V20260522_002.sql + DO + Service 真实写入 -- P1-5 INVENTORY_CHECK op_log operator_name → AdminContextUtil.getRealName 兜底 -- P1-6 HouseGrabServiceImpl 双写 house_claim_history(opType/fromUserId/toUserId/reason) -- 180 直接相关测试 0 failure - ---- - -## 二、QA R5 真测全量发现(5 agent 累计 22 bug) - -| Agent | 方法 | 发现 | -|-------|------|------| -| **R5-F HOUSE 深度** | 5 业务链端到端 + 11 DB 反查 + 2 真并发 | 2 BLOCKER + 3 P1(已修)| -| **R5-G 订单生命周期** | 5 业务链 + 12 DB 反查 + RateLimiter 实测 | 1 P0 + 3 P1 + 3 P2/P3(P0/P1 已修)| -| **R5-H 通知字典** | 6 业务链 + 7 DB 反查 | 全 PASS,环境性 504 已处理 | -| **R5-I fleet+tag+大交通** | 6 业务链 + 8 DB 反查 + 17 错误码命中 | 1 P0 + 1 mock(P0 应急已修)| - ---- - -## 三、测试服验证 - -| 服务 | commit | 状态 | -|------|--------|------| -| hl-gateway | dev-v3 含 #2900-2902 | 已部署 | -| hl-order-service-v3 | dev-v3 含 #2900-2902 + Flyway V20260522_001/002 | 已部署(双实例 8086+8186) | - ---- - -## 四、留尾(独立工单 backlog) - -- DB TypeHandler 加密迁移(order_traveler + fleet_driver phone/id_card 明文存储) -- audit_log 接入 admin path decrypt -- HouseModuleBoundaryTest ArchUnit 违规独立 PR 治理 -- TagLibraryIntegrationTest ApplicationContext 问题独立排查 -- user-service `/internal/user/admin/house-staff` 真实实装(H07 占位) -- `house_claim_history` 表 @Deprecated 标记,前端历史轨迹切 T9 op_log 后下线本期双写 - ---- - -## 五、关联 - -- 工单:#2894 / #2895 / #2896(全部 closed) -- PR:#2900 / #2901 / #2902(全部 squash merged) -- QA 报告:`.tmp/qa-r5{f,g,h,i}-*-report.txt`(共 4 份) -- memory 升级:`feedback_snowflake-long-no-jackson-deserializer.md`(雪花 Long 禁 @JsonDeserialize(LongDeserializer)) diff --git a/changelogs-v2/2026-05/23_2935_R6-bugs_PR2937.md b/changelogs-v2/2026-05/23_2935_R6-bugs_PR2937.md deleted file mode 100644 index 24cd07f..0000000 --- a/changelogs-v2/2026-05/23_2935_R6-bugs_PR2937.md +++ /dev/null @@ -1,65 +0,0 @@ -# R6 真测发现 + 修复:insurance 翻页 + refund review PARTIAL 静默错位 - -> **服务**: hl-order-service-v3 -> **PR**: #2937 -> **Issue**: #2935 -> **日期**: 2026-05-23 -> **影响**: 1 P0 + 1 P1 + 1 P2(其中 P2 是更深的静默业务错位 bug) - ---- - -## ⚠️ 关键变化(前端 mmg) - -### 1. 🔴 退款审批 PARTIAL **必传 approvedAmount**(behavior change) - -**之前**:`POST /v3/admin/refund/review {decision: "PARTIAL"}` 不传 `approvedAmount` → Service fallback 到 `calculatedAmount/paidAmount`,**PARTIAL 被静默当 APPROVED 全额处理**(语义错位 bug) -**之后**:必返 `code=530403 REFUND_REVIEW_PARTIAL_AMOUNT_REQUIRED "PARTIAL 审批必须传 approvedAmount"` - -**前端如果有 PARTIAL 审批漏传 approvedAmount 的场景必须补传**,否则会被 530403 拒绝。 - -### 2. 🟢 `/v3/admin/insurance/products` 翻页边界返 400 - -**之前**:`page=0` → 500 IndexOutOfBoundsException / `pageSize=10000` 不拒 -**之后**:`page=0` → 400 / `pageSize > 100` → 400(与其他 7/8 list 接口一致) - ---- - -## 改动 - -### P0+P1 R6L: AdminInsuranceController.listProducts 翻页校验缺失 -- 新建 `InsuranceProductListReqVO` 继承 `PageParam`(`page @Min(1)` + `pageSize @Min(1) @Max(100)`,含 `isOverseas` 字段) -- Controller 改 `@Valid InsuranceProductListReqVO req`,@PageParam 注解直接拦截非法 -- 与其余 7 接口风格一致 - -### P2 R6M: AdminRefundController.review PARTIAL 静默错位修复 -- **R6-M 报告误判为 NPE**,实际是更隐蔽的语义错位 bug: - - Service 层映射后枚举 APPROVE/REJECT 丢失 PARTIAL 信息 - - approvedAmount=null 时 fallback 到 calculatedAmount/paidAmount - - 实际行为:PARTIAL 被静默当 APPROVED 全额退款 — **业务静默 bug** -- 修:Controller 持有原 decision 枚举,前置校验 `decision=PARTIAL && approvedAmount=null` → 抛 `BusinessException(530403)` -- 错误码 530403 `REFUND_REVIEW_PARTIAL_AMOUNT_REQUIRED` 在 `OrderRefundErrorCode:127` 已存在(设计预留实现遗漏),复用 - -## 验证 - -- 50 直接相关测试 0 failure -- 3 新单测: - - `listProducts_pageNum_zero_returns400` - - `listProducts_pageSize_over100_returns400` - - `review_PARTIAL_without_approvedAmount_throws530403`(断言 `refundReviewService.review` `never()` 被调,Service 完全没接到错误数据) - -## R6 累计测试发现(4 agent) - -| Agent | 维度 | 结果 | -|-------|------|------| -| R6-J | 状态机异常 | 22 反例全走业务码 0 BUG + 3 UX 文案改进 | -| R6-K | 并发竞态 | 5 @Lock4j + 4 @Idempotent + 1 死锁实测 0 BUG(R5-G RateLimiter 5 阈值误判 → 实际 10)| -| R6-L | 翻页边界 | 8 接口 × 18 维度 = 144 点 84.7% 通过,1 P0 + 1 P1 | -| R6-M | ErrorCode | 22 类 ~265 总数 50+ 真触发 段位合规 100%,1 P2 | - -5 文件 +87 -8 + 1 新 VO。 - -## 关联 - -- 工单 #2935(closed) -- PR #2937(squash merged) -- R6 报告 `.tmp/qa-r6{j,k,l,m}-*-report.txt`(共 4 份) diff --git a/changelogs-v2/2026-05/23_2940_R7-error-response_PR2948.md b/changelogs-v2/2026-05/23_2940_R7-error-response_PR2948.md deleted file mode 100644 index d22f1e5..0000000 --- a/changelogs-v2/2026-05/23_2940_R7-error-response_PR2948.md +++ /dev/null @@ -1,121 +0,0 @@ -# R7 真测发现 + 修复:网关错误响应规范化(5 项 CRITICAL+HIGH) - -> **服务**: hl-gateway + hl-user-service + hl-common-core + hl-common-web(全模块共依赖) -> **PR**: #2948 -> **Issue**: #2940 -> **日期**: 2026-05-23 -> **影响**: **🔴 错误响应格式变更 + Result 新增 traceId 字段 + X-Trace-Id 响应头** - ---- - -## ⚠️ 关键变化(前端 mmg 必读) - -### 1. 🔴 不存在路径返 Result JSON,**不再返 HTML 静态页** - -**之前**:`https://web.test.1814.love:9443/nonexistent-foo` → 网关 fallback 漏到前端 vue 静态页(返完整 HTML),API 调用方 JSON.parse 爆 SyntaxError -**之后**:返 `{code: 404, message: "接口不存在: GET /nonexistent-foo", success: false, data: null, traceId: "xxx"}` - -**前端如果有 try/catch 期望 HTML 响应的代码必须改为 JSON 处理**。 - -### 2. 🟢 Result 类新增 `traceId` 字段(向后兼容) - -所有响应(成功 + 错误)的 `data` 字段同级新增 `traceId`: -```json -{ - "code": 200, - "message": "成功", - "data": {...}, - "success": true, - "traceId": "a1b2c3d4e5f6g7h8" // 新增,16 字符短 UUID -} -``` - -- 旧客户端不识别 traceId 字段不影响(忽略未知字段) -- 新客户端可记录 traceId 用于线上排查问题(给后端报错时附 traceId 加速定位) - -### 3. 🟢 错误响应必含 `X-Trace-Id` 响应头 - -``` -HTTP/1.1 200 OK -X-Trace-Id: a1b2c3d4e5f6g7h8 -Content-Type: application/json -``` - -前端可统一读取(axios interceptor 等)。 - -### 4. 🟡 鉴权错误响应规范化 - -**之前**:`Authorization` 缺失 → 网关返手拼 JSON `{code:401, message:"Missing or invalid Authorization header"}` 缺 `success` 字段 + 英文 -**之后**:返 4 字段全 + 中文 message: -```json -{ - "code": 401, - "message": "缺少有效的 Authorization 头", - "success": false, - "data": null, - "traceId": "..." -} -``` - -5 处中文化: -- "Missing or invalid Authorization header" → "缺少有效的 Authorization 头" -- "Invalid token" → "Token 无效" -- "Token expired or revoked" → "Token 已过期或被撤销" -- "Unknown token type" → "Token 类型未知" -- "请使用小程序端接口" 保留 - ---- - -## 改动概览 - -### 1) CRITICAL R7Q-B6 网关 catch-all -- 新建 `GlobalErrorWebExceptionHandler @Order(-2)` 优先于 Spring Boot 默认 `-1` -- NotFoundException → code=404 + 中文"接口不存在" -- 上游异常 → code=500/对应 status + 中文 - -### 2) HIGH R7Q-B1 JwtAuthFilter -- 注入 ObjectMapper + 抽 `writeErrorResponse(exchange, code, message)` 统一写出 -- 5 处 forbidden/unauthorized 改 `Result.error(code, message)`(自带 success=false) -- 5 处英文 message 中文化 - -### 3) HIGH R7Q-B5 TokenInterceptor -- 注入 ObjectMapper + `writeError(request, response, code, message)` 统一 -- 5 处 `response.getWriter().write("{...}")` 改 `objectMapper.writeValueAsString(Result.error(...))` - -### 4) HIGH R7Q-B2 NoHandlerFoundException 确认已生效 -- `hl-common-log/GlobalExceptionHandler.java:255` 已注册 -- `hl-common-web/HlMvcDefaultsEnvironmentPostProcessor` 已注 `spring.mvc.throw-exception-if-no-handler-found=true` + `spring.web.resources.add-mappings=false` - -### 5) HIGH R7Q-B9 X-Trace-Id 全链路 -- `Result.java` 新增 `traceId` 字段 -- `TraceIdFilter`(gateway,@Order(-200))无请求头时生成 16 字符短 UUID + 注入下游请求头 + 响应头 -- `TraceIdResponseFilter`(hl-common-web)后端服务读请求头 → MDC + 响应头,filter 结束清 MDC 防线程池串数据 -- JwtAuthFilter / TokenInterceptor / GlobalErrorWebExceptionHandler 错误响应同步注入 X-Trace-Id - ---- - -## R7 完整测试覆盖(4 agent) - -| Agent | 维度 | 发现 | -|-------|------|------| -| R7-N Swagger 三角 | 71 Controller / 360 端点 / 311 VO / 3095 字段 | 1 P0(#2880 设计不修)+ 4 P1 + 4 P2,47% 缺 @ApiOperation(留 backlog)| -| R7-O Long 精度 | 333 VO 文件 / 440 Long 字段 / 18+ 真测接口 | **0 BUG**(全局 NumberSerializer 完备)| -| R7-P 序列化 | 30+ 接口 4 维度 | 6 bug 全 v2 老代码(留 backlog)| -| R7-Q 错误响应 | 57 错误场景 | **1 CRITICAL + 4 HIGH + 3 MEDIUM + 1 LOW**(本工单修 5 项)| - -## 测试 - -20 新单测,5 模块 mvn test 全绿(common-core 484 + common-web 18 + common-log 68 + gateway 11 + user 2486)。 - -13 文件 +876 -32 lines。 - -## 留尾(独立 backlog,本工单不做) -- R7N 47% 端点缺 @ApiOperation(168/360) -- R7-P 6 v2 老代码 status/Boolean Integer 化 -- R7-Q MEDIUM 3 项:@Valid 缺字段名 / 415 兜底 500 / enum deserialize 吞异常 -- R7-Q LOW:6 条 ErrorCode 纯英文(ContractErrorCode 3 + SettlementErrorCode 3) - -## 关联 -- 工单 #2940(closed after PR merged) -- PR #2948(squash merged) -- R7 4 报告:`.tmp/qa-r7{n,o,p,q}-*-report.txt` diff --git a/changelogs-v2/2026-05/26_2988_v3精选评价source-sourceLabel对齐_PR3054.md b/changelogs-v2/2026-05/26_2988_v3精选评价source-sourceLabel对齐_PR3054.md deleted file mode 100644 index 838f16a..0000000 --- a/changelogs-v2/2026-05/26_2988_v3精选评价source-sourceLabel对齐_PR3054.md +++ /dev/null @@ -1,49 +0,0 @@ -# 二期 v3 精选评价补 source / sourceLabel(对齐一期 #2988) - -> **服务**: hl-order-service-v3 + hl-product-service-v2 -> **PR**: #3054(配套 dev→dev-v3 同步 #3050) -> **Issue**: #2988(一期同步到二期 v3) -> **日期**: 2026-05-26 -> **影响**: 🟢 二期 v3 环境精选评价新增填充评价来源字段(契约字段一期 #2988 已加,本次仅二期环境行为对齐,**向后兼容**) - ---- - -## ⚠️ 关键变化(前端 mmg 必读) - -### 二期 v3 环境:产品详情精选评价现返回「评价来源」 - -产品详情接口响应里 `reviewSummary.topReview` 节点下,现正确返回两个来源字段: - -```json -{ - "reviewSummary": { - "avgScore": 4.8, - "totalCount": 120, - "topReview": { - "reviewId": 123, - "nickname": "张三", - "content": "...", - "score": 5, - "source": "MINIPROGRAM", // 评价来源枚举 - "sourceLabel": "小程序" // 来源中文(字典 review_source) - } - } -} -``` - -- `source`:评价来源枚举 —— `MINIPROGRAM`=小程序 / `YOUZAN`=有赞(字典 `review_source`) -- `sourceLabel`:来源中文名,来自字典 `review_source` 的 `dict_label`(运维改字典即时生效,无需重启) - -### 行为说明 - -- **之前**:二期 v3 环境下这两字段恒为 `null`(v3 评价表无 source 列、链路未填充) -- **之后**:正常返回小程序/有赞来源 - -字段本身一期 #2988 早已加入并上线(一期环境已可用)。**前端若已按一期 #2988 接入了 source/sourceLabel,二期环境无需任何改动**,本次只是把二期 v3 的填充行为对齐到一期。 - ---- - -## 📌 备注 - -- 本次改动已合并 dev-v3(PR #3054),但**截至发稿尚未部署到测试服验证**(应需求方要求提前同步)。前端在二期测试环境实际联调前,请先确认 hl-order-service-v3 / hl-product-service-v2 已部署该版本。 -- 后端实现:v3 评价表补 `source` 列(独立库 hl_order_service_v3,V20260526_001)+ `sourceLabel` 复用字典动态获取,与一期口径一致。 diff --git a/changelogs-v2/2026-05/27_3090_HOUSE文档代码对齐-加急错误码+staff结构+分页_PR3096.md b/changelogs-v2/2026-05/27_3090_HOUSE文档代码对齐-加急错误码+staff结构+分页_PR3096.md deleted file mode 100644 index addf127..0000000 --- a/changelogs-v2/2026-05/27_3090_HOUSE文档代码对齐-加急错误码+staff结构+分页_PR3096.md +++ /dev/null @@ -1,44 +0,0 @@ -# 二期 v3 HOUSE 文档-代码对齐:加急错误码迁移 + staff 响应结构 + 分页一致性 - -> **服务**: hl-order-service-v3 -> **PR**: #3096 -> **Issue**: #3090 -> **日期**: 2026-05-27 -> **影响**: 🟡 加急(escalate)错误码值变更(前端错误码映射需同步) + 转单候选员工接口响应结构变更 + 分页行为修复(向后兼容) - ---- - -## ⚠️ 关键变化(前端 mmg 必读) - -### 1. 询房加急(escalate)4 个错误码迁移:`808280-808283` → `808815-808818` - -`POST /v3/admin/order/inquiry/{inquiryId}/escalate`(§3.6 加急/催办)相关的 4 个业务错误码,按 API 文档 §11.8 规定从 **808280-808283 段迁移到 808815-808818 段**。 - -- **message 中文文案不变**(动态返回)。 -- 前端**若按数字 code 做错误提示映射**:请把这 4 个码从 `8082xx` 更新为 `8088xx`。 -- 前端**若直接展示 `message` 字段**:无需任何改动。 - -### 2. 转单候选员工 staff 响应结构:裸数组 → `{list,total}` - -`GET /v3/admin/house/staff` 出参从裸数组改为带分页包装,对齐文档 §6.6: - -```jsonc -// 之前 -"data": [ {...}, {...} ] -// 之后 -"data": { "list": [ {...} ], "total": 12 } -``` - -前端请改读 `data.list` / `data.total`。 -(注:该接口数据源依赖 user-service H07 工单,当前返回空列表 `{list:[],total:0}`,**结构已就位**,待 H07 上线后有数据。) - -### 3. 「我的接单」分页一致性修复(行为修复,无需前端改动) - -`GET /v3/admin/order/grab-pool/my-claims/hotel` 带筛选条件(keyword / 出行日 等)时,`total` 与 `list` 现在保持一致。原实现是 SQL 分页后再内存过滤,导致带筛选时 total 偏大、跨页漏数据,现已下沉到 SQL。前端分页页数/条数将更准确。 - ---- - -## 📌 备注 - -- 已部署测试服(dev-v3)并经真 admin token API 验证:staff 返 `{list,total}` 结构正确、加急接口路径连通(返 HOUSE 错误码)。 -- 加急错误码 808815-818 的具体触发场景由后端单测覆盖,需真实询房数据触发;前端按上述 code 段更新映射即可。 diff --git a/changelogs-v2/2026-05/27_3101-3105_FLEET-H5网关路由+PII加密+契约补齐_PR3102-3104-3106.md b/changelogs-v2/2026-05/27_3101-3105_FLEET-H5网关路由+PII加密+契约补齐_PR3102-3104-3106.md deleted file mode 100644 index e789b5b..0000000 --- a/changelogs-v2/2026-05/27_3101-3105_FLEET-H5网关路由+PII加密+契约补齐_PR3102-3104-3106.md +++ /dev/null @@ -1,69 +0,0 @@ -# 二期 v3 FLEET 车务:H5 入职接口可达 + 司机 PII 加密 + 车辆/司机契约补齐 - -> **服务**: hl-fleet-service + hl-gateway -> **PR**: #3102 / #3104 / #3106 -> **Issue**: #3101 / #3103 / #3105 -> **日期**: 2026-05-27 -> **影响**: 🟡 H5 司机自助入职接口现可通过网关访问 + 车辆/司机列表新增字段 + 批量导入响应结构变更 + submit 入参字段名澄清(司机 PII 加密对前端透明) - ---- - -## ⚠️ 关键变化(前端 mmg 必读) - -### 1. 【重要】H5 司机自助入职接口现可通过网关访问(原 404) - -之前网关缺 `/app/h5/**` 路由,下列 4 个 H5 端点过网关一律 404,现已补齐可正常调用: - -- `GET /app/h5/driver-onboard/init` -- `POST /app/h5/driver-onboard/ocr/{step}`(multipart 上传) -- `POST /app/h5/driver-onboard/submit/new` -- `POST /app/h5/driver-onboard/submit/renew` - -鉴权:H5 端走**自带 onboard token**(query/form 参数,由后端 H5OnboardService 自校验),**不需要 admin JWT**。坏 token 返 `data.tokenValid=false`(不报错)。 - -### 2. 车辆列表新增字段 - -`GET /admin/fleet/vehicles/page` 的 `records[]` 现包含: -- `typeKey` / `typeName`:车型大类(LEFT JOIN 车型库带出) -- `regDate`:注册日期 - -### 3. 司机列表新增字段 - -`GET /admin/fleet/drivers/page` 的 `records[]` 现包含: -- `licenseType` / `licenseExpire`:驾照类型 / 到期日 -- `totalOrders` / `avgRating` / `lastOrderAt`:接单数 / 评分 / 最近接单(业务流水模块上线前为默认 `0`/`0.00`/`null`) - -### 4. 批量导入响应结构变更 + 去重行为 - -**车辆导入** `POST /admin/fleet/vehicles/import` 出参: -```jsonc -// 之前: { total, success, failed, errorRows[] } -// 之后: -{ "totalRows": 10, "insertedCount": 7, "updatedCount": 2, "errorCount": 1, - "errors": [ { "row": 5, "plate": "蒙A12345", "msg": "..." } ] } -``` -**司机导入** `POST /admin/fleet/drivers/import` 出参: -```jsonc -{ "totalRows": 10, "insertedCount": 7, "renewedCount": 2, "errorCount": 1, - "errors": [ { "row": 5, "name": "张三", "msg": "..." } ] } -``` -**去重行为**:车牌(车辆)/身份证(司机)**已存在的行现执行 UPDATE**(原为报错计入失败),不存在则 INSERT。 - -### 5. H5 新司机提交入参字段名澄清(文档笔误修正) - -`POST /app/h5/driver-onboard/submit/new` 入参用: -- `idCard`(**不是** `idCardNo`) -- `preferredCategory`(**不是** `preferredTypeKey`) - -代码一直是这两个名,是文档示例写错;文档已更正。前端按 `idCard` / `preferredCategory` 传参。 - -### 6. 司机敏感字段加密(后端透明,前端无需改动) - -身份证 / 手机 / 驾照号 / 紧急联系电话改为**加密存储**。接口响应仍按原样**脱敏返回**(如 `idCard: "110***********2468"`),与之前一致,**前端无感知**。 - ---- - -## 📌 备注 - -- **已部署测试服(dev-v3)并经真 admin token + 真实数据 API 验证全绿**:车辆列表 typeName/typeKey/regDate 正确填充(真实 MySQL JOIN)、身份证密文存储 + 加密后按身份证去重命中 + 读路径脱敏正常、司机列表 5 个新字段齐全、`/app/h5` 路由连通。 -- 司机 PII 仅接通加密通道;测试库 #3104 前的存量明文司机均为软删数据,不影响。 diff --git a/changelogs-v2/2026-05/27_3115_HOUSE配房写主链真机修复-提交改价定稿_PR3117.md b/changelogs-v2/2026-05/27_3115_HOUSE配房写主链真机修复-提交改价定稿_PR3117.md deleted file mode 100644 index 19894c1..0000000 --- a/changelogs-v2/2026-05/27_3115_HOUSE配房写主链真机修复-提交改价定稿_PR3117.md +++ /dev/null @@ -1,37 +0,0 @@ -# 二期 v3 HOUSE 房务:配房写主链真机阻断修复(提交 / 改价 / 最终确认) - -> **服务**: hl-order-service-v3 -> **PR**: #3117 -> **Issue**: #3115 -> **日期**: 2026-05-27 -> **影响**: 🟡 配房三个核心写接口(提交配房 / 改单条配房 / 最终确认)此前真机一律失败,现已修复并测试服真机验证通过。**接口路径与出入参字段无任何变化**,前端无需改代码,可正常联调配房写流程。 - ---- - -## 背景 - -真机 API 测试(真 admin token 经网关 + 真实订单数据)发现配房「提交 → 改价 → 最终确认」三个写接口此前 100% 失败(单测 mock 能过、真机全挂),现修复。 - -## 受影响接口(仅"从报错变为可用",契约不变) - -### 1. `POST /v3/admin/order/hotel-requirements/{requirementId}/assignments`(§2.2 提交配房) -- 之前:当所选酒店在 resource 无协议价时,返回 `400 字段【proto_price】未填写`,配房无法落库。 -- 现在:正常 200 落库。协议价/结算方式/付款模式/酒店名在主数据缺失(H04 接通前)时存 NULL,待回填,**不影响提交**。 -- 出参结构不变:`{ successCount, failCount, items:[{dayNumber, familyIndex, assignmentId, arrange}] }`。 - -### 2. `PUT /v3/admin/order/assignments/{id}`(§2.3 改单条配房) -- 之前:返回 `500`(服务器内部错误,乐观锁拦截器缺失)。 -- 现在:正常 200,`sellPrice` 改后 `totalCost` 自动重算、`version` 自增。 - -### 3. `POST /admin/house/assignments/requirements/{requirementId}/finalize`(§2.7 最终确认) -- 之前:闸口校验通过后仍返回 `400 字段【operator_name】未填写`,需求卡在 PROCESSING 无法定稿。 -- 现在:正常 200,需求推进到 `DONE`,返回 `{ newStatus:"DONE", finalizedAt }`。 - -## 真机验证(测试服双实例已部署) - -完整链路 claim → 提交配房(3 晚) → 改价 → 询房发起/回填 → 最终确认 → 删配房 全部 200 通过;need/requirement 正确流转到 DONE。 - -## 不在本次范围(仍为占位,依赖后续工单,前端先按空处理) - -- §2.1 候选源、§2.0 订单详情聚合 order 子对象、§6.1 酒店列表、§6.6 staff 列表:依赖 H04(product-v2/OrderService Feign) / resource 主数据 / H07(user-service),暂为空/占位。 -- §2.5 房间分配「写」入口(家庭维度 assignRooms)当前无对外端点,§2.5 GET 的逐日 `assignments` 暂为空(另行评估是否补端点)。 diff --git a/changelogs-v2/2026-05/28_3142_新建订单选主题接口-下单选品接通真实接口_PR3155.md b/changelogs-v2/2026-05/28_3142_新建订单选主题接口-下单选品接通真实接口_PR3155.md deleted file mode 100644 index 926a650..0000000 --- a/changelogs-v2/2026-05/28_3142_新建订单选主题接口-下单选品接通真实接口_PR3155.md +++ /dev/null @@ -1,97 +0,0 @@ -# 二期 v3:新建订单向导「选主题/选产品」接通真实接口(替换 mockProducts.js) - -> **服务**: hl-product-service-v2(+ hl-order-service-v3 内部统计) -> **PR**: #3155 -> **Issue**: #3142 -> **日期**: 2026-05-28 -> **影响**: 🟡 新建订单页 `order-v2/new` 第 1 步「选主题」可改用真接口;第 2 步「选产品」用已有接口;地区筛选删除 - ---- - -## ⚠️ 关键变化(前端 mmg 必读) - -`order-v2/new` 第 1、2 步当前用 `src/views/order-v2/new/_shared/mockProducts.js` 写死假数据。现可替换为真实接口。 - -### 1. 第 1 步「选主题」— 新增接口 - -``` -GET /admin/product/line/order-picker -``` -- 无 query 参数,**不分页**,按排序号升序返回 -- 仅返回「**启用(ACTIVE) + 在售(该产品线下挂≥1个已上架产品)**」的主题 -- **数据权限**:和产品管理一致——超管看全部、核心(CORE)/小蒙马(GROUP)主题全员可见、私人定制(CUSTOM)仅创建人本人可见。**地区(region)筛选不需要,产品线无此字段,请删掉那排 chips。** - -返回结构: -```jsonc -{ - "code": 200, - "data": [ - { - "lineId": 2056937785918369794, // 主题ID(雪花,前端按字符串透传) - "name": "测试核心产品", // 主题名 - "description": "...", // 描述(原 mock 的 desc/tagline 都用它) - "coverImageUrl": "https://...", // 真实封面图(替代 mock 的 emoji cover + coverColor) - "productType": "CORE", // CORE=核心 / GROUP=小蒙马 - "skuCount": 6, // 该主题下已上架产品的档位总数(原 mock 的 skuCount) - "fromPrice": 3105.00, // 起价/人(已上架产品最低成人起价;未设价为 null,请显示 ¥-- 或灰) - "hot": true // 热门标识 = 该主题近90天下单量较多(前30%且>0) - } - ] -} -``` - -字段映射建议(mock → 真接口): -- `id` → `lineId`(字符串透传,勿 Number()) -- `cover`/`coverColor`(emoji 装饰)→ 改用 `coverImageUrl` 真实图;如仍要色块可前端按 lineId 取色 -- `region`/`regionKey` → **删除**(无后端字段,地区 chips 去掉) -- `tagline` → 并入 `description` 或省略 -- `skuCount` / `fromPrice` / `hot` → 同名直取 -- 顶部统计「在售主题数」= 列表长度;「SKU总数」= Σ`skuCount`;「最低人均」= min(`fromPrice`) - -### 2. 第 2 步「选产品」— 新增专用接口(PR #3164 / #3159,已测试服验证) - -> 注:原先说复用 `/admin/product/item/list`,但 SKU 卡还要「热销」「发团日期」两个字段,通用列表没有;为不拖慢产品管理列表,**改为新建专用选产品 picker**(与选主题对称)。**前端 Step2 改调下面这个**,不要用 `/item/list`。 - -``` -GET /admin/product/item/order-picker?lineId={lineId}&page=1&pageSize=20&keyword= -``` -- `lineId` 必填(选定主题的 `lineId`);只返该产品线**已上架**产品+档位;返回 `PageResult`(`data.records[]` + `data.total`) -- 数据权限同选主题(@DataScope:超管全部 / CORE·GROUP 全员 / CUSTOM 仅本人) -- 下单提交的 `productId + tierSeq` 从这里取(雪花 `productId` 按字符串透传,勿 Number()) - -返回 `records[]` 实测字段(与 Step2 SKU 卡片元素映射): -```jsonc -{ - "productId": 2043595351268519937, // 产品ID(字符串透传) - "name": "6天5晚旷野版", // 卡片大标题 - "subtitle": "装甲车穿越·帐篷营地…", // 副标题 - "tags": ["亲子","露营"], // 标签行 - "tripDays": 6, "tripNights": 5, // "6天5晚" - "coverImageUrl": "https://...", - "startPrice": 10.00, // 产品级最低起价(可能 null → 显示 ¥--) - "tierPrices": [ // 档位数组(档次过滤 chips = 去重 tierName) - {"tierSeq":1, "tierName":"舒适", "tierDescription":"…", "startPrice":10.00}, - {"tierSeq":2, "tierName":"豪华", "tierDescription":"…", "startPrice":null} - ], - "hot": true, // 【新】热销徽标 = 该产品近90天下单量较多(本主题内前30%且>0) - "nextSaleDate": "2026-07-01" // 【新】发团日期 = 价格日历/班期里最近的未来可售日(无可售为 null) -} -``` - -**SKU 卡渲染**:mock 里每张卡=一个产品的一个档位;真实是一个产品(`productId`)含多档位(`tierPrices[]`)。 -建议按「产品 × 档位」平铺成卡(每个 `tierPrices[i]` 一张卡),卡上: -- 档位标签 ← `tierPrices[i].tierName`("尊享档/挑战档") -- 价格 ← `tierPrices[i].startPrice`(**null 显示 ¥-- / 灰**,别显示 0) -- 「热销」徽标 ← 产品级 `hot`(同一产品的各档位卡都显示) -- 「发团日期」← `nextSaleDate`(最近可售日;null 则不显示该行) -- 提交带 `productId` + `tierPrices[i].tierSeq` - -### 3. 提交(不变) -`POST /v3/admin/order`,入参 `productId` + `tierSeq` 等,已就绪。 - ---- - -## 验证 -测试服 `web.test.1814.love:9443` 真 admin token 实测: -- 选主题 `line/order-picker`:返 9 个在售主题(库内 ACTIVE 29 → 在售 9 精确吻合),字段齐全,主题级 hot 跨服务统计生效 -- 选产品 `item/order-picker`:HTTP 200,字段齐全;产品级 `hot`(热门线下 4 产品命中 1 个 hot=true)、`nextSaleDate`(价格日历最近可售日,如 2026-07-01)均生效 diff --git a/changelogs-v2/2026-05/28_3147_产品服务标准模块-模板总则+每日提醒+订单Tab_PR3157.md b/changelogs-v2/2026-05/28_3147_产品服务标准模块-模板总则+每日提醒+订单Tab_PR3157.md deleted file mode 100644 index c44d270..0000000 --- a/changelogs-v2/2026-05/28_3147_产品服务标准模块-模板总则+每日提醒+订单Tab_PR3157.md +++ /dev/null @@ -1,142 +0,0 @@ -# 二期 v3:产品「服务标准」模块 — 模板总则(分组+条目) + 每日特别提醒 + 订单 Tab 富展示 - -> **服务**: hl-product-service-v2 + hl-order-service-v3 -> **PR**: #3157(+ hotfix #3163) -> **Issue**: #3147 -> **日期**: 2026-05-28 -> **影响**: 🟢 新增能力,全部向后兼容(旧订单 Tab 自动降级,不报错) -> **状态**: ✅ 测试服 9443 全链路实测通过(模板 CRUD → 产品绑定 → 创单冻结 → 订单 Tab) - ---- - -## 背景 - -「出团服务说明书」需要比原来 `notice.title + 一段富文本` 更丰富的结构:**多分组**(一、出团注意事项…)+ **编号条目**(标题/说明/联系人)+ **每日特别提醒**。本期在产品侧**新建**「服务标准」模块,创单冻结进订单快照,订单/小程序/PDF 读快照展示。 - -前端需做:① 模板编辑器(分组/条目增删)② 产品 Step5 绑定下拉 ③ 行程 Step2 每日「特别提醒」录入 ④ 订单/小程序服务标准 Tab 富展示 ⑤ 行程单/签单 PDF。 - ---- - -## 一、产品侧:服务标准模板管理(新增 admin 接口) - -路径前缀 `/admin/product/service-standard-template`(已被现有 `/admin/product/**` 网关路由覆盖)。 - -### 1. 分页 -``` -GET /admin/product/service-standard-template/page?pageNo=1&pageSize=10&name=&status= -``` -返回 `PageResult`(`data.records[]` + `data.total`),按 sortOrder/id 升序。 - -### 2. 详情 -``` -GET /admin/product/service-standard-template/{id} -``` - -### 3. 保存(id 空=新增 / 非空=修改) -``` -POST /admin/product/service-standard-template -``` -请求体: -```jsonc -{ - "id": null, // 修改时传(字符串透传雪花ID) - "name": "草原出团服务说明书", // 必填 - "intro": "出团前请仔细阅读…", // 顶部提示语(截图绿色提示条) - "applicableScope": "全部跟团客户", // 适用对象 - "sections": [ // 必填:分组+条目 - { - "title": "一、出行服务", // 分组标题(必填) - "items": [ - { "title": "接送站服务", "content": "提供机场/车站免费接送", "contact": "客服 400-xxx" } - ] - } - ], - "isDefault": false, - "sortOrder": 0, - "status": "ENABLED" // 留空默认 ENABLED;ENABLED=启用/DISABLED=停用 -} -``` -返回 `data` = 模板ID(**字符串透传,勿 Number()**)。 - -### 4. 删除(软删,已绑定产品不受影响) -``` -DELETE /admin/product/service-standard-template/{id} -``` - -### 5. 下拉(Step5 绑定用,仅启用项,不分页) -``` -GET /admin/product/service-standard-template/enabled -``` -返回 `data: [ { "id": "...", "name": "草原出团服务说明书" } ]`(只 id+name)。 - ---- - -## 二、产品 Step5 补充信息:绑定模板(纯引用) - -`PUT /admin/product/item/{id}/supplement` 请求体**新增**字段: -```jsonc -{ "serviceStandardTemplateId": 2059839696602615809 } // 字符串透传;解绑传 null -``` -保存后产品详情回显该 ID;用上面的 `/enabled` 下拉选。 - -> **私人定制例外**:私人定制(CUSTOM)产品「完成设计」时会把当时模板内容**冻结快照**进产品,之后改模板不影响该产品;核心/小蒙马为纯引用(改模板后续新订单实时跟随)。前端无需特殊处理,知悉即可。 - ---- - -## 三、产品 Step2 行程:每日「特别提醒」 - -`PUT /admin/product/item/{id}/itinerary` 的每个 `DayItem` **新增**字段: -```jsonc -{ - "dayNumber": 1, - "serviceTips": [ // 本日特别提醒(可空) - { "title": "本日特别提醒", "content": "今日海拔较高,备好抗高反药" } - ] -} -``` -保存后行程回显该天的 `serviceTips`。 - ---- - -## 四、订单详情「服务标准」Tab 响应升级 - -``` -GET /v3/admin/order/{id}/service-standard -``` -(小程序端经 hl-mp BFF 聚合,结构一致) - -`data` **新增** `serviceStandard` + `dayTips` 两块;保留原 `itinerary`、`refundPolicy`;原 `notice` 字段**废弃**(恒 null,请改用 `serviceStandard`): -```jsonc -{ - "itinerary": ["Day1 …","Day2 …"], // 保留:行程天纲 - "notice": null, // 废弃,勿再用 - "refundPolicy": { /* 原结构保留 */ }, - "serviceStandard": { // 新:服务标准总则 - "intro": "出团前请仔细阅读…", - "applicableScope": "全部跟团客户", - "sections": [ - { "title": "一、出行服务", - "items": [ { "title": "接送站服务", "content": "…", "contact": "客服 400-xxx" } ] } - ] - }, - "dayTips": [ // 新:每日特别提醒(按天) - { "dayNumber": 1, "dayTitle": "Day1 抵达-接机", - "tips": [ { "title": "本日特别提醒", "content": "今日海拔较高…" } ] } - ] -} -``` - -### 向后兼容(重要) -- **本次升级前已下单的旧订单**:`serviceStandard` 返回 `null`、`dayTips` 返回 `[]`(快照里没有新结构,已实测降级不报错)。前端渲染需判空:`serviceStandard` 为 null 时不画总则区,`dayTips` 为空时不画每日提醒。 -- 升级后、且产品已绑模板/配每日提醒的**新订单**才有完整数据(已实测)。 - ---- - -## 字段约定 -- 所有雪花 ID(模板 id、serviceStandardTemplateId)**按字符串透传,勿 Number()**。 -- `sections` / `serviceTips` / `tips` 为空时分别返回 `[]` 或字段缺省,渲染需判空。 - ---- - -## 验证 -测试服 9443 已用真 admin token 全链路实测:模板 CRUD/下拉 → 产品绑定 → 行程每日提醒 → 创单冻结快照 → 订单 Tab 返回结构化 serviceStandard + dayTips(中文非 null)→ 旧订单降级不报错。 diff --git a/changelogs-v2/2026-05/28_HOUSE完备性_日历4状态+抢单productType+待办生产者全齐_PR3180-3200-3202.md b/changelogs-v2/2026-05/28_HOUSE完备性_日历4状态+抢单productType+待办生产者全齐_PR3180-3200-3202.md deleted file mode 100644 index 3269781..0000000 --- a/changelogs-v2/2026-05/28_HOUSE完备性_日历4状态+抢单productType+待办生产者全齐_PR3180-3200-3202.md +++ /dev/null @@ -1,64 +0,0 @@ -# 二期 v3 房务管家:日历 4 状态点 + 抢单池 productType + 待办生产者全齐(含取消→退订) - -> **服务**: hl-order-service-v3 -> **PR**: #3180、#3200、#3202(hotfix) -> **Issue**: #3179、#3188 -> **日期**: 2026-05-28 -> **影响**: 🟡 房务管家「日历视图 / 抢单池 / 待办 Tab」数据更完整;接口路径与字段结构**不变**,仅字段从恒空/恒 0 变为真实值、待办 Tab 新增几类会真正产生的待办 - ---- - -## 总览(前端 mmg 必读) - -继上一批房务接口真实化后,本批补齐房务管家剩余的完备性缺口。**接口路径、字段结构均不变**,前端可据此把对应 UI 由"空态/恒 0"切到真实渲染。 - ---- - -## 1. 日历视图 4 状态点真实化(§2.6)— PR #3180 - -`GET /admin/house/calendar?month=YYYY-MM&scope=mine|all` - -此前每天 / 汇总只有"进行中(inProgress)"有真实计数,"待配房(pending) / 询房中(inquiry) / 异常(exception)"恒为 0。现已全部按真实状态聚合: - -- **待配房 pending**:未被房务抢单的需求(按订单出发日落格) -- **询房中 inquiry**:有 PENDING 询房的订单 -- **异常 exception**:有 OPEN 异常类待办(换酒店 / 退订 / 询房超时等)的订单 -- **进行中 inProgress**:已配房且不在以上桶 - -`summary.{inProgress,pending,inquiry,exception}` 与每天 `statusDots[]`(含 label/count/color)均返真实值。优先级:异常 > 询房中 > 待配房 > 进行中。 - -## 2. 抢单池 productType 接通(§1.1)— PR #3180 - -`GET /v3/admin/order/grab-pool/hotel-requirements` - -- 列表项 `productType`(CORE/GROUP/CUSTOM)、`productNo` 此前恒 null,现经产品服务真实返回(如 `productType=CORE`、`productNo=C260520001`)。 -- `productType` 作为**查询筛选项现已生效**(按产品类型过滤抢单池)。 -- 上游产品服务查不到 / 降级时该字段如实 null,不报错。 - -## 3. 待办 Tab 生产者全齐(§4.1 / §3.4)— PR #3180 + #3200 - -`GET /v3/admin/order/todos` —— 此前部分待办类型只有"消费/RESOLVE"没有"生产者",对应 Tab 永远空。现补齐,7 类待办均会真正产生: - -| 待办类型 | 何时产生(新增/原有) | -|---|---| -| `SWAP_HOTEL` 换酒店 | **新增**:酒店回填**拒单**时自动产(#3180);换酒店完成后自动 RESOLVE | -| `INVENTORY_CHECK_OVERDUE` 核房超期 | **新增**:每日巡检 Job 扫到酒店快照过期自动产(#3180);核房后自动 RESOLVE | -| `REFUND` 退订 | **新增**:订单**确认后取消**(房务已配房锁酒店)时自动产,归属原接单房务(#3200);详见下 | -| `INQUIRY_TIMEOUT` 询房超时 / `INQUIRY_ESCALATED` 询房加急 / `RETURN_TO_HK` 退回房务 | 原有,不变 | - -> 注:`UNDELIVERED` 为历史遗留类型(其"询房 4h 无回复"语义已由 `INQUIRY_TIMEOUT` 承接),不再单独产生。 - -## 4. 订单取消 → 退订待办 + 待办清理(§1.3 / §4)— PR #3200(hotfix #3202) - -订单取消后房务侧的联动此前未生效(监听链路缺陷),现已接通: - -- 订单取消时,该订单房务侧"配房前置工作"类 OPEN 待办(换酒店/询房超时/核房超期等)**自动 RESOLVE**(取消后这些已无意义)。 -- 若取消时**房务已配房锁酒店**,自动产一条 `REFUND` 待办,归属原接单房务(无归属则广播),提示其处理酒店退订/释放。`reason` 取订单取消原因。 -- 业务规则确认:小蒙马(GROUP)库存在**下单时**扣减、其他产品无库存 —— 配房环节不涉及库存扣减/恢复。 - ---- - -## 验证 -以上全部已合并 dev-v3 + 测试服双实例部署,并经真机验证:日历 4 状态点真实计数、抢单池 productType 真实返回、酒店拒单产换酒店待办、订单取消产退订待办(取消订单 → SWAP_HOTEL 待办 RESOLVED + REFUND 待办 OPEN 归属原房务)。无接口路径/字段结构变更。 - -如需任一接口完整响应样例或字段疑问,回我即可。 diff --git a/changelogs-v2/2026-05/28_HOUSE批量_房务管家配房酒店员工城市真实化+房间分配写端点_PR3152-3154-3176-3178.md b/changelogs-v2/2026-05/28_HOUSE批量_房务管家配房酒店员工城市真实化+房间分配写端点_PR3152-3154-3176-3178.md deleted file mode 100644 index 343f09e..0000000 --- a/changelogs-v2/2026-05/28_HOUSE批量_房务管家配房酒店员工城市真实化+房间分配写端点_PR3152-3154-3176-3178.md +++ /dev/null @@ -1,87 +0,0 @@ -# 二期 v3 房务管家:配房/酒店/员工/城市等接口接通真实数据 + 新增房间分配写端点 - -> **服务**: hl-order-service-v3(+ resource / user-service 内部接口) -> **PR**: #3152、#3153、#3154、#3176、#3178 -> **Issue**: #3148、#3149、#3150、#3156、#3172、#3177 -> **日期**: 2026-05-28 -> **影响**: 🟡 房务管家(HOUSE)一批此前返空/null/桩的接口已接通真实数据;新增"房间分配写"端点;均已测试服双实例部署 + 真机验证 - ---- - -## ⚠️ 总览(前端 mmg 必读) - -房务管家相关接口此前多处因依赖未落地而返「空列表 / null 字段 / 占位」。现已跨 order-v3 / resource / user-service 三服务接通真实逻辑并真机验证。**接口路径、字段结构均不变**,只是**字段从空/占位变为真实值**,前端可据此把对应 UI 由"空状态"切到真实渲染。逐项如下。 - ---- - -## 1. 新增:房间分配写端点(§2.5)— PR #3152 - -此前只有 `GET .../rooms`(按家庭分组查),**没有写入端点**,导致逐日 `assignments` 恒空。现补: - -``` -POST /v3/admin/order/assignments/{assignmentId}/rooms -``` -- 幂等 + 分布式锁保护(重复提交安全) -- 请求体: -```jsonc -{ - "rooms": [ - { - "roomGroupNo": "F1", // 家庭/房间组号 - "travelerCount": 2, // 该房入住人数 - "travelerNames": "张三,李四", // 入住人姓名(逗号分隔) - "bedType": "double", // 床型 - "remark": "可选备注" - } - ] -} -``` -- 返回 `{ successCount, items:[{id, roomGroupNo, bedType, travelerCount}] }` -- 写入后 `GET /v3/admin/order/orders/{orderId}/rooms` 的逐日 `assignments` 即非空(含床型/人数明细) - ---- - -## 2. 酒店列表 / 详情接通真实数据(§6.1 / §6.2)— PR #3153 - -`GET /v3/admin/house/hotels`(列表)与 `GET /v3/admin/house/hotels/{hotelId}`(详情 4 Tab)此前走 Fallback 返空,现接 resource 真实主数据: - -- **§6.1 列表**:返真实酒店(测试库 39 家),字段 `city/cityName/level/settleType/paymentMode/protoPrice/roomTypes/status` 等齐全 - - `settleType` 字典 `hotel_settle_type`:`cash` 现付 / `sign` 签单 / `company` 公司付款 - - `paymentMode` 字典 `hotel_payment_mode`:`prepay` 预付款 / `cash` 现结 / `monthly` 月结 -- **§6.2 详情**:`basic`(基础信息)/ `roomTypes`(房型,含 `protoPrice` + `facilities` 设施数组)/ `priceCalendar30d`(未来 30 天价格日历)/ `recentCheckLog`(核房记录)四 Tab 均返真实数据 - -> 注:测试库酒店主数据已回填(结算/付款/协议价/房型价格),便于联调;正式环境以 resource 实际维护的数据为准。 - ---- - -## 3. 转单候选员工接通(§6.6)— PR #3154 + #3178 - -`GET /v3/admin/house/staff` 此前 user-service 无对应接口返空,现接通: - -- user-service 新增房务员工接口,按**房务角色**筛选:`house_keeper`(房务) / `house_lead`(房务组长) -- 返回 `{ list:[{ userId, name, avatar, online, superAdmin, activeCount }], total }` -- **`activeCount`(在跟订单数)口径**(#3178 修正):为该员工**当前仍持有的活跃配房需求数**(精确口径),不再是历史 CLAIM 次数近似 —— 转单选人时的负载/上限判断更准确 - ---- - -## 4. 行程城市接通(§1.5 / §2.0)— PR #3176 - -此前 `cities` / `days[].city` 恒为 null。现按各天酒店反查城市接通: - -- **§1.5 我的接单** `GET /v3/admin/order/grab-pool/my-claims/hotel`:列表项 `cities` 返该单**行程去重城市数组**(如 `["呼伦贝尔市","兴安盟"]`) -- **§2.0 订单详情** `GET /admin/house/orders/{orderId}`:`requirement.current.days[].city` 及行程日历 `itinerary[].cityCode/cityName` 返**中文城市名** -- 数据缺失(酒店未维护城市 / 查询降级)时该字段如实 null,不报错 - ---- - -## 5. 转单接收人姓名真实化(§1.3)— PR #3178 - -转单后归属人姓名(`claimer_name`,体现在我的接单 / 详情归属人)此前为占位 `user-{id}`,现解析为**真实员工姓名**(经房务员工接口反查;查不到时退回 `user-{id}` 兜底,不影响转单成功)。 - ---- - -## 验证 - -以上全部已合并 dev-v3 + 测试服双实例滚动部署,并经真机(真 admin token,过网关 9443/本地 8080)验证:房间分配写→查 assignments 非空、酒店列表/详情字段齐全、员工列表真实、cities/city 中文城市、转单后 claimer_name 为真名。无接口路径/字段结构变更,前端按上述把对应 UI 从空态切真实渲染即可。 - -如需任一接口的完整响应样例,或字段有疑问,回我即可。 diff --git a/changelogs-v2/2026-05/29_服务标准_模板改表结构6字段+点位实时取资源_PR3254-3255-3256.md b/changelogs-v2/2026-05/29_服务标准_模板改表结构6字段+点位实时取资源_PR3254-3255-3256.md deleted file mode 100644 index 95a3df2..0000000 --- a/changelogs-v2/2026-05/29_服务标准_模板改表结构6字段+点位实时取资源_PR3254-3255-3256.md +++ /dev/null @@ -1,70 +0,0 @@ -# 二期 v3 服务标准重构:模板条目改表结构补 6 字段 + 行程点位服务标准实时取资源 - -> **服务**: hl-product-service-v2 / hl-resource-service / hl-order-service-v3 -> **PR**: #3254(模板改表结构)、#3255(点位取资源)、#3256(迁移 hotfix) -> **Issue**: #3253、#3250 -> **日期**: 2026-05-29 -> **影响**: 🟡 服务标准这一页分两块都有字段变化,前端需按 6 字段渲染模板条目 + 在行程点位渲染新的 `serviceStandard` - ---- - -## 总览(前端 mmg 必读) - -服务标准(出团服务说明书)这页分**两块**,本次都动了字段: - -1. **模板块**(模板标题/提示语/分组[出团注意事项·退费说明·温馨提示]+条目)——条目字段补全为 6 字段。 -2. **行程点位块**(每个酒店/景点/活动/服务点位下那段服务标准)——改为**实时从资源取**。 - -两块**正交**:模板块=出团总则类,点位块=资源自带。已测试服部署 + 验证。 - ---- - -## 1. 服务标准模板条目:3 字段 → 6 字段(#3254) - -接口路径不变:`/admin/product/service-standard-template`(create/update/detail/page),**响应形状仍是 `sections[].items[]`**。仅条目字段变化: - -| 字段 | 说明 | 备注 | -|---|---|---| -| `title` | 主文案 | 必填 | -| `content` | 正文 | 可空 | -| `remark` | 备注/灰色二级说明 | 新增 | -| `color` | 文案颜色 `#RRGGBB` | 新增 | -| `contactName` | 联系人(如「房务·舒馨」) | 新增 | -| `phone` | 手机号(如 15391131404) | 新增 | - -- **旧 `contact` 字段移除**(拆成 `contactName` + `phone`)。 -- `color` 校验:必须 `#RRGGBB` 格式;**无值传 `null` 或空串 `""` 均可**(PR #3257 起空串也放行,仍拒 `red` 等非法值)。 -- 后端存储由 JSON 列改为关系表(对前端无感,API 形状不变)。 -- ✅ 模板详情/列表 RespVO 已返 **`statusLabel`**(`ENABLED→启用` / `DISABLED→停用`,PR #3257 起),前端可直接渲染中文,无需自行映射(与装备建议对齐)。 - -> **补充更新(PR #3257)**:上面两条「⚠️ 无 statusLabel」「空串会 400」的遗留已修复——`statusLabel` 现已返回;`color` 空串现已放行。 - -## 2. 订单详情「服务标准」Tab 同步 6 字段(#3254) - -`GET /v3/admin/order/{orderId}/detail/service-standard` 的 `serviceStandard.sections[].items[]` 同步上述 6 字段(快照仍冻结,只是字段变多)。 - -## 3. 行程点位服务标准:实时从资源取(#3255) - -`GET /v3/admin/order/{orderId}/itinerary/full` → `days[].nodes[]` **新增 `serviceStandard` 字段**: - -- 值**实时按 `resourceId` 从资源(酒店/景点/活动/服务)拉取**,**不冻快照**——运营改了资源的服务标准,**老订单详情同步更新**。 -- 资源查不到 / 调用降级时该字段 `null`,不报错。 -- 前端在每个点位下渲染这段 `serviceStandard`(区别于点位的电话/联系人)。 - -## 4. 资源新增「服务标准」字段(#3255) - -酒店/景点/活动/服务 4 类资源新增 `serviceStandard` 字段(admin 编辑表单需加该输入框,最长 10000): - -- 酒店:`GET/PUT /admin/hotel/item/{id}` 已含 `serviceStandard` -- 景点/活动/服务 admin create/update/detail 同步含该字段 - ---- - -## 验证(测试服 dev-v3 已部署 + 实测) - -- 模板 6 字段 admin E2E:创建(含 color/remark/contactName/phone)→ 详情回显,6 字段逐项 round-trip 通过;非法 color「red」被 400 拦截;多分组(2 组)正确。 -- 资源 `serviceStandard`:hotel 详情接口已含该字段(DB 列 + 内部批量详情已接通)。 -- 点位 `NodeVO.serviceStandard`:字段已上线,实时拉取 + 资源缺失降级 null 逻辑已单测覆盖。 -- 三服务(resource/product-v2/order-v3)测试服双实例已部署。 - -如需任一接口完整响应样例,回我即可。 diff --git a/changelogs-v2/2026-05/30_3272_资源退费说明CRUD模块_PR3273.md b/changelogs-v2/2026-05/30_3272_资源退费说明CRUD模块_PR3273.md deleted file mode 100644 index 9a4040f..0000000 --- a/changelogs-v2/2026-05/30_3272_资源退费说明CRUD模块_PR3273.md +++ /dev/null @@ -1,296 +0,0 @@ -# 二期 v3:资源退费说明 CRUD 模块(给司机行程单展示用) - -> **服务**: hl-resource-service -> **PR**: #3273 -> **Issue**: #3272 -> **日期**: 2026-05-30 -> **影响**: 🟢 新增能力。给运营在景区/活动详情下"维护退费说明"提供 CRUD 接口;最终用于行程单 PDF 渲染 + 核单 Step 5 录入对账。本期**仅交付资源服务端**,后续 PR 接入产品快照 + PDF + 核单。 - ---- - -## 总览(前端 mmg 必读) - -每个景区(SCENIC)和活动(ACTIVITY)资源都可以挂一份"退费说明",包含资源级备注 + 多条退费明细(标题/金额/单位/备注/生效期)。 - -**界面**:景区 / 活动列表行加一个按钮 → 弹窗里调本期 3 个接口做 CRUD。 - -**接口前缀**:`/admin/refund-note`(**无 `/v3/` 前缀**,因 resource-service 沿用一期路径风格;消费方仍是二期 v3 管理后台)。 - -**本期不做**:行程单 PDF 渲染、产品 ProductDetailVO 注入 refundNote、订单 OrderProductSnapshotContent 反序列化、核单 Step 5 录入对接。这些留后续 PR。 - ---- - -## 接口清单(3 个) - -### 1. 查询单资源的退费说明 - -``` -GET /admin/refund-note?resourceType=SCENIC&resourceId=12345 -``` - -**入参**(query) - -| 字段 | 类型 | 必填 | 枚举 | 说明 | -|---|---|---|---|---| -| `resourceType` | string | ✅ | `SCENIC` / `ACTIVITY` | 资源类型 | -| `resourceId` | long | ✅ | - | 资源 ID(字符串透传雪花)| - -**返回** - -```jsonc -{ - "code": 200, - "data": { // 未配置时直接返 null,前端按 null 隐藏弹窗内容 - "noteId": "20596378108368322580", // 雪花 ID 字符串透传 - "resourceType": "SCENIC", - "resourceId": "12345", - "intro": "苔藓为赠送项目,不退费", - "items": [ - { - "title": "成人未参加", - "amount": 44.00, - "unitLabel": "/人", // 展示文案,给人看 - "settleScope": "PER_PERSON", // 结算粒度枚举,给规则引擎用 - "remark": "", - "effectiveFrom": null, // yyyy-MM-dd - "effectiveTo": null - }, - ... - ], - "createTime": "2026-05-30 10:15:00", - "updateTime": "2026-05-30 10:15:00" - } -} -``` - -**枚举** - -- `settleScope`: - - `PER_PERSON` 按人结算(默认) - - `PER_TEAM` 按团结算(如寻龙诀 100/团 整团一次性) - - `PER_VEHICLE` 按车辆结算(如卡丁车 2 人/辆,按辆数乘单价) - -**注意**:`unitLabel`("/人" / "/团" / "/辆")和 `settleScope` **职责不同**: -- 卡丁车场景:`unitLabel="/人"`(给客户看是 120/人)+ `settleScope=PER_VEHICLE`(引擎按车辆数乘单价) -- 两个字段独立维护,前端展示用 `unitLabel`,未来规则引擎用 `settleScope`。 - ---- - -### ⚡ 更新(2026-06-01 PR #3291):settleScope 字典化 + 出参补 settleScopeLabel 中文 - -后端**已落字典 + 接口出参直接返中文**,前端**不用自己维护英文→中文映射**。两种用法二选一: - -#### 用法 A:直接用出参的 `settleScopeLabel`(展示场景推荐) - -`GET /admin/refund-note` 返回的 `items[]` 每条**新增 `settleScopeLabel` 字段**: - -```jsonc -"items": [ - { - "title": "成人未参加", - "settleScope": "PER_PERSON", - "settleScopeLabel": "按人", // 🆕 后端字典拼装,直接展示 - ... - } -] -``` - -**列表 / 详情 UI 直接 `{{ item.settleScopeLabel }}` 渲染**即可,无需自己映射。 - -#### 用法 B:调字典接口拉下拉框选项(编辑场景推荐) - -管理后台编辑退费规则时,需要下拉框让运营选"按人/按团/按车"。调统一字典接口: - -```http -GET /internal/dict/data?dictType=order_refund_settle_scope -Authorization: Bearer - -→ Result>: -[ - { "dictValue": "PER_PERSON", "dictLabel": "按人", "sortOrder": 10 }, - { "dictValue": "PER_TEAM", "dictLabel": "按团", "sortOrder": 20 }, - { "dictValue": "PER_VEHICLE", "dictLabel": "按车", "sortOrder": 30 } -] -``` - -- 下拉框 `option.label = dictLabel`,`option.value = dictValue` -- 提交时 `req.items[].settleScope = dictValue`(提交 `settleScopeLabel` 后端会忽略,label 由后端拼) -- 建议前端**全局缓存字典 5-10 分钟**避免高频请求;如果有统一字典组件直接复用 - -#### 容错(前端可忽略) - -- 字典服务异常 / 字典数据缺失 → `settleScopeLabel = null`,前端展示 fallback 用 `settleScope` 英文原值即可 -- 字典文案后续改了(如"按人" → "按人头")→ **运维改 sys_dict_data + 清 Redis 缓存即生效**,后端无需重启,前端无需发版 - -#### 字典元信息 - -| 项 | 值 | -|---|---| -| `dict_type` | `order_refund_settle_scope` | -| `dict_name` | 退费明细结算粒度 | -| 字典数据 | PER_PERSON→按人 / PER_TEAM→按团 / PER_VEHICLE→按车 | -| 字典存储 | `hl_user_service.sys_dict_data` | -| 缓存 key | `cache:dict:data:order_refund_settle_scope` | - -### 2. 保存(upsert 整块) - -``` -PUT /admin/refund-note -``` - -**入参**(body) - -```jsonc -{ - "resourceType": "SCENIC", - "resourceId": 12345, - "intro": "苔藓为赠送项目,不退费", - "items": [ - { - "title": "成人未参加", // 必填 - "amount": 44.00, // 必填,>= 0(赠送项填 0) - "unitLabel": "/人", // 默认 "/人",可省略 - "settleScope": "PER_PERSON", // 默认 "PER_PERSON",可省略 - "remark": "", - "effectiveFrom": null, - "effectiveTo": null - } - ] -} -``` - -**约束** - -- `resourceType`:必须是 `SCENIC` / `ACTIVITY` -- `resourceId`:**必须在 scenic_spot / activity 表存在且未软删**,否则返 390805 "关联资源不存在" -- `items`:至少 1 条,最多 50 条 -- `items[].amount`:>= 0(赠送项目填 0) -- `items[].settleScope`:必须是上述 3 枚举之一(null 时默认 PER_PERSON) -- `items[].effectiveFrom` <= `items[].effectiveTo`(同时存在时) - -**返回** - -```jsonc -{ "code": 200, "data": "20596378108368322580" } // 落库后的 noteId(字符串透传) -``` - -**语义**:upsert——按 (resourceType, resourceId) 找现有记录,有则**整块覆盖**(不做 item 级 diff),无则 insert。 - -### 3. 软删整份 - -``` -DELETE /admin/refund-note?resourceType=SCENIC&resourceId=12345 -``` - -**入参**:同 GET。 -**返回**:`{ "code": 200, "data": true }`(不存在或已软删返 false,不报错)。 - -软删用主键自身写 deleted_at,UNIQUE KEY 永不撞键,支持同资源无限次"删→重建"。 - ---- - -## 错误码(段位 39080x) - -| code | 错误信息 | -|---|---| -| 390801 | 退费明细金额必须 ≥ 0 | -| 390802 | 退费明细生效起日不能晚于止日 | -| 390803 | 退费明细结算粒度非法: {0} | -| 390804 | 退费说明资源类型非法: {0} | -| 390805 | 关联资源不存在: type={0}, id={1} | - -非业务错误(参数校验失败)走通用 400。 - ---- - -## 业务边界 - -- **资源类型**:一期仅 `SCENIC` + `ACTIVITY`,其他资源(餐饮/酒店/物资等)有各自退订/退款政策,不复用本结构。 -- **一份生效**:同资源同时刻只有一份生效的退费说明(DB 唯一键 `(resource_type, resource_id, deleted_at)` 保证)。 -- **关联校验**:保存时校验 resourceId 在主资源表存在,防孤儿数据。 -- **资源软删后**:本退费说明仍存在但孤儿(查不到对应资源),不主动清理;运营侧需手动删除。 - ---- - -## 数据示例(典型) - -### 白桦林(4 条规则) - -```jsonc -{ - "resourceType": "SCENIC", "resourceId": 12345, - "intro": "苔藓为赠送项目, 不退费", - "items": [ - {"title": "儿童/学生/无证件未参加", "amount": 15, "unitLabel": "/人", "settleScope": "PER_PERSON"}, - {"title": "免票座电瓶车", "amount": 30, "unitLabel": "/人", "settleScope": "PER_PERSON"}, - {"title": "白桦林未参加", "amount": 44, "unitLabel": "/人", "settleScope": "PER_PERSON"}, - {"title": "桦树皮画未参加", "amount": 50, "unitLabel": "/人", "settleScope": "PER_PERSON", "remark": "仅儿童"} - ] -} -``` - -### 寻龙诀(按团结算) - -```jsonc -{ - "resourceType": "ACTIVITY", "resourceId": 99999, - "items": [ - {"title": "寻龙诀未参加", "amount": 100, "unitLabel": "/团", "settleScope": "PER_TEAM"} - ] -} -``` - -### 卡丁车(按车结算,文案 /人) - -```jsonc -{ - "resourceType": "ACTIVITY", "resourceId": 88888, - "items": [ - {"title": "卡丁车未骑", "amount": 120, "unitLabel": "/人", "settleScope": "PER_VEHICLE", - "remark": "2 人/辆共享单价"} - ] -} -``` - -### 套娃(时间窗口) - -```jsonc -{ - "resourceType": "SCENIC", "resourceId": 77777, - "items": [ - {"title": "老人只看大马戏", "amount": 65, "settleScope": "PER_PERSON"}, - {"title": "6/25 后没去或免票", "amount": 165, "settleScope": "PER_PERSON", - "effectiveFrom": "2026-06-25", "effectiveTo": null} - ] -} -``` - ---- - -## 影响评估 - -- **后端**:仅 hl-resource-service 新增 1 张表 `resource_refund_note` + 3 个 admin 接口,对其他业务零影响。 -- **DB**:Flyway `V20260529_002__create_resource_refund_note.sql` 自动建表,重启服务后生效。 -- **前端**:新增弹窗 UI(建议在景区 / 活动详情页加按钮 → 弹窗 CRUD),完全独立的新页面,老页面不影响。 - ---- - -## 注意事项 - -1. 雪花 ID 透传为字符串(`noteId` / `resourceId`),前端**不要 `Number()`**。 -2. 资源软删后的退费说明不会自动清理,运营侧需先删退费说明再删资源(否则成孤儿数据)。 -3. 同资源不可有 2 份生效退费说明(DB 唯一键约束)。 -4. 删除是软删,可同资源重建;不支持物理删除。 - ---- - -## 关联 - -- **Issue**: [#3272](https://git.1814.love:8443/wx/HL/issues/3272) -- **PR**: [#3273](https://git.1814.love:8443/wx/HL/pulls/3273) - feat(resource): 新增资源退费说明 CRUD 模块 -- **Commit**: [ffae5ab90](https://git.1814.love:8443/wx/HL/commit/ffae5ab90) -- **后续 PR**(不在本期): - - 产品服务 `ProductDetailVO.NodeItem.refundNote` 注入(参考 #3147 serviceStandard 模式) - - 订单 `OrderProductSnapshotContent` 加 refundNote 反序列化(10 行) - - 行程单 PDF 渲染退费表(订单 v3 + PDF 服务) - - 核单 Step 5 录入半结构化对接(可选) diff --git a/changelogs-v2/2026-05/30_3283_订单状态字段补中文名_PR3284.md b/changelogs-v2/2026-05/30_3283_订单状态字段补中文名_PR3284.md deleted file mode 100644 index e853eff..0000000 --- a/changelogs-v2/2026-05/30_3283_订单状态字段补中文名_PR3284.md +++ /dev/null @@ -1,149 +0,0 @@ -# 二期 v3:订单 orderStatus / flowStatus 字段补 label 中文映射 - -> **服务**: hl-order-service-v3 -> **PR**: #3284 -> **Issue**: #3283 -> **日期**: 2026-05-30 -> **影响**: 🟢 **非破坏性**新增字段。前端从前自行映射 `AWAITING_PROFILE → "待补全信息"` 等,现在后端直接给。老字段 `orderStatus` / `flowStatus`(英文枚举)保留不动,新增 `orderStatusName` / `flowStatusName` 中文 label 同时返回。 - ---- - -## 总览(前端 mmg 必读) - -订单列表 / 详情 / 创建响应里的 `orderStatus` 和 `flowStatus` 字段历史上**只返英文枚举**(`CUSTOMIZING` / `AWAITING_PROFILE` 等),前端要查表自行翻译。本期后端直接拼好中文 label 返回,前端**直接用 `xxxStatusName` 字段展示**即可。 - -旧字段保留,前端老逻辑零改动。 - ---- - -## 接口清单(3 个响应增字段) - -### 1. 订单列表 - -``` -GET /v3/admin/order -``` - -**响应** `data.records[].xxx` 新增 2 字段: - -```jsonc -{ - "orderStatus": "CUSTOMIZING", - "orderStatusName": "定制中", // 🆕 中文名 - "flowStatus": "AWAITING_PROFILE", - "flowStatusName": "待补全信息" // 🆕 中文名 -} -``` - -### 2. 订单详情 - -``` -GET /v3/admin/order/{id}/detail -``` - -**响应** `data.main` 同样新增 2 字段: - -```jsonc -"main": { - "orderStatus": "TRAVELLING", - "orderStatusName": "出行中", // 🆕 - "flowStatus": "TRAVELLING", - "flowStatusName": "出行中" // 🆕 -} -``` - -### 3. 创建订单响应 - -``` -POST /v3/admin/order -``` - -**响应** `data` 新增 1 字段(`orderStatusName` 早期已有,本期补 `flowStatusName`): - -```jsonc -{ - "orderStatus": "PENDING_PAY", - "orderStatusName": "待支付", - "flowStatus": "AWAITING_PAY", - "flowStatusName": "待支付" // 🆕 -} -``` - ---- - -## 状态枚举完整对照表 - -### `orderStatus`(粗状态 6 个) - -| 枚举值 | 中文名 | -|---|---| -| `PENDING_PAY` | 待支付 | -| `CUSTOMIZING` | 定制中 | -| `PENDING_DEPARTURE` | 待出行 | -| `TRAVELLING` | 出行中 | -| `COMPLETED` | 已完成 | -| `CANCELLED` | 已取消 | - -### `flowStatus`(细状态 16 个) - -| 枚举值 | 中文名 | -|---|---| -| `AWAITING_PAY` | 待支付 | -| `AWAITING_PROFILE` | 待补全信息 | -| `AWAITING_HOTEL_SUBMIT` | 待提交房型 | -| `AWAITING_HOTEL_CLAIM` | 待抢房 | -| `HOTEL_IN_PROGRESS` | 房控处理中 | -| `HOTEL_NEED_ADJUST` | 房控需调整 | -| `AWAITING_VEHICLE_SUBMIT` | 待提交用车 | -| `VEHICLE_IN_PROGRESS` | 车控处理中 | -| `VEHICLE_NEED_ADJUST` | 车控需调整 | -| `PENDING_CONFIRM` | 待确认 | -| `PENDING_DEPARTURE` | 待出行 | -| `TRAVELLING` | 出行中 | -| `PENDING_REVIEW` | 待核单 | -| `REVIEWING` | 核单中 | -| `SETTLED` | 已结算 | -| `COMPLETED` | 已完成 | -| `CANCELLED` | 已取消 | - -> ⚠️ **注意**:本 PR 后紧跟的 PR #3286 改了其中 2 个 label —— `待提交房型 → 待提交配房需求`、`待提交用车 → 待配车需求`。**实际部署后看到的是 PR #3286 的新文案**,前端如果按这俩老文案做字符串硬比较需要更新(详见 PR #3286 changelog)。 - ---- - -## 容错(前端可忽略) - -- 后端拿到 null 或未知枚举(历史脏数据)会回退:返回原值而不是抛 500,前端不会看到"待x"等乱码。 -- 即便后端返回原英文枚举值(如未知 `XXXXX`),前端展示也能落 fallback。 - ---- - -## 业务边界 - -- 老字段 `orderStatus` / `flowStatus` 保留英文枚举(**契约不变**) -- 仅新增 `orderStatusName` / `flowStatusName` 中文 -- 前端**老逻辑零改动**也能跑(旧字段还在) -- 改成展示 `xxxStatusName` 后,前端不需要自己维护英文 → 中文映射表 - ---- - -## 影响评估 - -- **后端**:仅 hl-order-service-v3 改了 5 个文件(3 VO + Converter + OrderService),无 DB 改动,重启服务后生效。 -- **前端**:可选改造——把硬编码映射表删掉,直接用 `xxxStatusName`。改不改都不影响功能。 -- **mp 端**:本 PR 暂未改 `OrderLookupMpService`(仍是 mock 假数据),真业务化时一起补。 - ---- - -## 注意事项 - -1. 如果你的前端代码有硬编码的英文→中文映射表(如 `{ AWAITING_PROFILE: "待补全信息" }`),建议删掉,改用 `flowStatusName` 字段,避免后端枚举改了文案前端跟不上。 -2. 文案的"权威源"是后端枚举(`OrderStatus` / `OrderFlowStatus`),运营如果要求改文案直接改后端,前端无感跟随。 - ---- - -## 关联 - -- **Issue**: [#3283](https://git.1814.love:8443/wx/HL/issues/3283) -- **PR**: [#3284](https://git.1814.love:8443/wx/HL/pulls/3284) - fix(order-v3): orderStatus/flowStatus 补 label 中文映射 -- **Commit**: [cb85f0f76](https://git.1814.love:8443/wx/HL/commit/cb85f0f76) -- **接续 PR**: [#3286](https://git.1814.love:8443/wx/HL/pulls/3286) - feat(order-v3): 8 步步骤条字段 + 修 2 文案(紧接本 PR,建议一起看) diff --git a/changelogs-v2/2026-05/30_3285_订单接口加8步步骤条字段_PR3286.md b/changelogs-v2/2026-05/30_3285_订单接口加8步步骤条字段_PR3286.md deleted file mode 100644 index 596797e..0000000 --- a/changelogs-v2/2026-05/30_3285_订单接口加8步步骤条字段_PR3286.md +++ /dev/null @@ -1,204 +0,0 @@ -# 二期 v3:订单接口加 flowStep / flowStepTotal / flowDisplayText 步骤条字段 + 修 2 个文案 - -> **服务**: hl-order-service-v3 -> **PR**: #3286 -> **Issue**: #3285 -> **日期**: 2026-05-30 -> **影响**: 🟡 **非破坏性**新增字段 + **文案修订**。前端从前自己拼 `"1/8 · 待补全信息"`,现在后端直接给 `flowStep` / `flowStepTotal` / `flowDisplayText` 三字段,前端拿着就显示。同时修了 2 个枚举 label 文案。 - ---- - -## 总览(前端 mmg 必读) - -接续 PR #3284(status label 中文),本期把"订单步骤条"所需数据全部下沉到后端: - -```jsonc -{ - "flowStep": 1, // 🆕 当前步序号 0=待支付前, 1-8=进行中, null=终态/未知 - "flowStepTotal": 8, // 🆕 总步数固定 8 - "flowDisplayText": "待补全信息" // 🆕 中文文案,只中文不带"X/8 · ",前端按需自拼 -} -``` - -前端从前的 `currentStep / totalSteps + 自己映射中文` 逻辑全部可删,直接用本期 3 字段。 - -**同时**:修了 2 个 `OrderFlowStatus` 枚举 label 文案(影响 `flowStatusName` 字段返回): - -| 枚举值 | 旧文案 | 新文案 | -|---|---|---| -| `AWAITING_HOTEL_SUBMIT` | 待提交房型 | **待提交配房需求** | -| `AWAITING_VEHICLE_SUBMIT` | 待提交用车 | **待配车需求** | - ---- - -## 接口清单(3 个响应增字段) - -### 1. 订单列表 - -``` -GET /v3/admin/order -``` - -**响应** `data.records[].xxx` 在 PR #3284 基础上再加 3 字段: - -```jsonc -{ - "orderStatus": "CUSTOMIZING", - "orderStatusName": "定制中", - "flowStatus": "AWAITING_PROFILE", - "flowStatusName": "待补全信息", - "flowStep": 1, // 🆕 - "flowStepTotal": 8, // 🆕 - "flowDisplayText": "待补全信息" // 🆕 -} -``` - -### 2. 订单详情 - -``` -GET /v3/admin/order/{id}/detail -``` - -**响应** `data.main` 同样加 3 字段(位置和列表相同)。 - -### 3. 创建订单响应 - -``` -POST /v3/admin/order -``` - -**响应** 加 3 字段;创单初态固定: - -```jsonc -{ - "flowStep": 0, - "flowStepTotal": 8, - "flowDisplayText": "待支付" -} -``` - ---- - -## 8 步映射表(16 → 8) - -**优先级**:`orderStatus` 终态 > `flowStatus` 步骤映射 - -| 触发条件 | `flowStep` | `flowDisplayText` | -|---|---|---| -| `orderStatus = CANCELLED` | `null` | "已取消" | -| `orderStatus = COMPLETED` | `null` | "已完成" | -| `flowStatus = AWAITING_PAY` | `0` | "待支付" | -| `flowStatus = AWAITING_PROFILE` | `1` | "待补全信息" | -| `flowStatus = AWAITING_HOTEL_SUBMIT` | `2` | **"待提交配房需求"** | -| `flowStatus = AWAITING_HOTEL_CLAIM` | `2` | "待抢房" | -| `flowStatus = HOTEL_IN_PROGRESS` | `2` | "房控处理中" | -| `flowStatus = HOTEL_NEED_ADJUST` | `2` | "房控需调整" | -| `flowStatus = AWAITING_VEHICLE_SUBMIT` | `3` | **"待配车需求"** | -| `flowStatus = VEHICLE_IN_PROGRESS` | `3` | "车控处理中" | -| `flowStatus = VEHICLE_NEED_ADJUST` | `3` | "车控需调整" | -| `flowStatus = PENDING_CONFIRM` | `4` | "待确认" | -| `flowStatus = PENDING_DEPARTURE` | `5` | "待出行" | -| `flowStatus = TRAVELLING` | `6` | "出行中" | -| `flowStatus = PENDING_REVIEW` | `7` | "待核单" | -| `flowStatus = REVIEWING` | `8` | "核单中" | -| `flowStatus = SETTLED` | `8` | "已结算" | - -**说明**: - -- 配房 4 个并行子态(`AWAITING_HOTEL_SUBMIT` / `_CLAIM` / `HOTEL_IN_PROGRESS` / `_NEED_ADJUST`)都归到 step 2 -- 配车 3 个并行子态都归到 step 3 -- `REVIEWING` 和 `SETTLED` 都归到 step 8(结算后整体收尾) -- `CANCELLED` / `COMPLETED` 是终态,不在 8 步串行里,`flowStep` 返 null -- 未知 / 历史脏数据:`flowStep=null`, `flowDisplayText=` 原英文值(fallback 不抛错) - ---- - -## 前端如何用(推荐) - -### 推荐方式 1:只显示 `flowDisplayText`(最简单) - -```html -
    {{ order.flowDisplayText }}
    - -``` - -### 推荐方式 2:进度条 + 中文(拼分子分母) - -```html -
    - {{ order.flowStep }}/{{ order.flowStepTotal }} · {{ order.flowDisplayText }} -
    -
    - {{ order.flowDisplayText }} -
    - -``` - -### 推荐方式 3:步骤条 UI(按 flowStep 高亮) - -如果有 8 段步骤条 UI 组件,按 `flowStep` 高亮当前段: - -```jsonc -const stepNames = ["待支付", "补全信息", "配房需求", "配车需求", - "确认", "出行准备", "出行", "核单"]; -// 用 flowStep 高亮 stepNames[flowStep - 1] -``` - ---- - -## 文案变更详情(重点关注) - -| 字段 | 旧值 | 新值 | -|---|---|---| -| `flowStatusName`(PR #3284 字段)| "待提交房型" | "待提交配房需求" | -| `flowStatusName` | "待提交用车" | "待配车需求" | -| `flowDisplayText`(本 PR 字段)| - | 同上 | - -**前端需要确认的事**: - -1. 如果有按 **"待提交房型"** / **"待提交用车"** 老文案做字符串硬比较(如 `if (status === "待提交房型")`),需要改成新文案或改用枚举值比较。 -2. 如果只是 **展示**(不做逻辑判断),无需改动——文案直接显示新值即可。 - -我们后端搜了一遍**未发现**前端这个老文案的硬比较,但前端代码后端看不到,**请前端 mmg 自己 grep 确认**。 - ---- - -## 容错(前端可忽略) - -- `flowStatus` 是历史脏数据(枚举里没有)→ `flowStep = null`, `flowDisplayText = 原始值` -- `orderStatus = null` → `flowStep = null`, `flowDisplayText = "未知"` -- 前端按 `flowStep === null` 判断终态/未知,按 `flowDisplayText` 兜底展示,绝不会拿到空字符串。 - ---- - -## 业务边界 - -- 老字段 `flowStatus` / `flowStatusName` 保留(契约不变) -- 仅新增 3 字段 + 修订 2 个枚举 label 文案 -- 8 步是**前端展示概念**,后端的 `OrderFlowStatus` 仍是 16 个细状态(DB 落地不变) -- 步骤条只是**展示视角**的简化,业务逻辑仍按 16 个 `flowStatus` 跑 - ---- - -## 影响评估 - -- **后端**:hl-order-service-v3 改了 7 个文件(枚举 + Converter + 3 VO + Service + 测试),无 DB 改动,重启服务后生效。 -- **前端**:可选改造——把"1/8"拼接逻辑改用后端 3 字段。改不改都不影响功能(老逻辑还能跑)。 -- **mp 端**:本 PR 暂未改 mp(mock service),真业务化时一并补。 - ---- - -## 注意事项 - -1. **文案修订是契约变更**:如果前端按老文案做字符串硬比较,必须改。展示用的话无影响。 -2. **flowStep 可能为 null**:终态(已取消/已完成/历史脏数据)时为 null,前端按 null 处理"不显示分子"或"显示终态文案"。 -3. **创单后立即调列表**:会看到 `flowStep=0` + `flowDisplayText="待支付"`,符合"还没开始走流程"语义。 - ---- - -## 关联 - -- **Issue**: [#3285](https://git.1814.love:8443/wx/HL/issues/3285) -- **PR**: [#3286](https://git.1814.love:8443/wx/HL/pulls/3286) - feat(order-v3): 订单接口加 8 步步骤条字段 + 修 2 个文案 -- **Commit**: [fd533fdaa](https://git.1814.love:8443/wx/HL/commit/fd533fdaa) -- **前置 PR**: [#3284](https://git.1814.love:8443/wx/HL/pulls/3284) - status label 中文(建议一起看) diff --git a/changelogs-v2/2026-05/30_3294_服务标准条目6字段进快照修复_PR3295.md b/changelogs-v2/2026-05/30_3294_服务标准条目6字段进快照修复_PR3295.md deleted file mode 100644 index 59377ab..0000000 --- a/changelogs-v2/2026-05/30_3294_服务标准条目6字段进快照修复_PR3295.md +++ /dev/null @@ -1,81 +0,0 @@ -# 二期 v3:修复服务标准条目 remark/color/contactName/phone 四字段下单时丢失(恒为 null) - -> **服务**: hl-order-service-v3 -> **PR**: #3295 -> **Issue**: #3294 -> **日期**: 2026-06-01 -> **影响**: 🟢 **缺陷修复**,无契约变更。订单详情「服务标准」Tab 的条目,此前 `remark` / `color` / `contactName` / `phone` 四字段因后端缺陷恒为 `null`,本次修复后**新建订单**会正确返回这四个字段的真实值。响应结构不变,前端无需改代码,原本就该读这四字段的渲染逻辑现在能拿到数据。 - ---- - -## 总览(前端 mmg 必读) - -接续 PR #3254/#3255/#3256(服务标准模板改 6 字段),那一期把产品侧服务标准升级到 6 字段条目,但**下单写订单快照的中间环节漏跟进**: - -订单详情服务标准来自下单时冻结的产品快照(`order_product_snapshot`)。该快照由订单服务接收产品 Feign 数据后整体序列化,但订单侧接收用的 VO 还停留在旧 3 字段(`title` / `content` / `contact`),导致产品发来的 `remark` / `color` / `contactName` / `phone` 在反序列化时被静默丢弃,冻进快照只剩 `title` + `content`。 - -**结果**:所有订单详情服务标准 Tab 的条目这 4 个字段恒为 `null`。本次补齐订单侧 VO 字段,使整条服务标准 6 字段完整进快照。 - ---- - -## 受影响接口(响应行为修正,无字段增减) - -``` -GET /v3/admin/order/{id}/service-standard -``` - -**响应** `data.serviceStandard.sections[].items[]` 条目,6 字段修复前后对比: - -```jsonc -// 修复前(4 字段恒 null) -{ - "title": "专业司机", - "content": "持有A1驾照,8年以上驾龄", - "remark": null, // ❌ 恒 null - "color": null, // ❌ 恒 null - "contactName": null, // ❌ 恒 null - "phone": null // ❌ 恒 null -} - -// 修复后(新建订单) -{ - "title": "专业司机", - "content": "持有A1驾照,8年以上驾龄", - "remark": "仅限指定时段", // ✅ - "color": "#FF6600", // ✅ - "contactName": "李师傅", // ✅ - "phone": "13800000000" // ✅ -} -``` - -字段名、类型、嵌套层级**完全不变**,仅是原本恒 null 的值现在有了真实数据。 - ---- - -## 重要边界:只对「新建订单」生效 - -- 快照是**下单时间点的冻结值**,修复部署前已生成的历史订单快照仍只有 `title` + `content`,这 4 字段对老订单仍为 `null`(不回填,符合快照语义)。 -- 修复部署后**新建**的订单,服务标准 6 字段完整。 -- 前端渲染需对这 4 字段做 `null` 容错(老订单仍可能为 null),有值即展示。 - ---- - -## 测试服验证(已通过) - -部署 dev-v3 后端到端实测:建含 6 字段服务标准模板的产品订单 → `GET .../service-standard` 与 DB 快照 `snapshot_content` 双查,6 字段(含 remark/color/contactName/phone)全部正确返回。 - ---- - -## 影响评估 - -- **后端**:hl-order-service-v3 改 1 个传输 VO(`ProductDetailVO.ServiceStandard.Item` 补 4 字段、删废弃 `contact`)+ 1 个端到端回归测试。无 DB 改动,重启生效。 -- **前端**:无需改代码,原服务标准 Tab 条目渲染逻辑现在能拿到 4 个新字段值。 -- **mp 端**:本次未涉及。 - ---- - -## 关联 - -- **Issue**: [#3294](https://git.1814.love:8443/wx/HL/issues/3294) -- **PR**: [#3295](https://git.1814.love:8443/wx/HL/pulls/3295) - fix(order-v3): 补齐服务标准条目 6 字段,使下单快照完整冻结 -- **前置**: PR #3254/#3255/#3256(服务标准模板改 6 字段) diff --git a/changelogs-v2/2026-05/30_3307_退费说明接入产品订单快照+网关路由修复_PR3308-3312.md b/changelogs-v2/2026-05/30_3307_退费说明接入产品订单快照+网关路由修复_PR3308-3312.md deleted file mode 100644 index 51b6f8c..0000000 --- a/changelogs-v2/2026-05/30_3307_退费说明接入产品订单快照+网关路由修复_PR3308-3312.md +++ /dev/null @@ -1,85 +0,0 @@ -# 二期 v3:退费说明接入产品详情/订单快照 + 修复 /admin/refund-note 网关路由 404 - -> **服务**: hl-resource-service / hl-product-service-v2 / hl-order-service-v3 / hl-gateway -> **PR**: #3308(接入)+ #3312(hotfix) -> **Issue**: #3307 / #3311 -> **日期**: 2026-06-01 -> **影响**: 🟢 新增能力 + 🔴 **修复 #3272 退费说明 admin CRUD 经网关 404 完全不可用**。前端现可正常调 `/admin/refund-note` 维护退费说明;退费说明已接入产品行程节点聚合并在下单时冻进订单快照。 - ---- - -## 一、前端必读:`/admin/refund-note` 现在可达了(之前 404) - -#3272 交付了「资源退费说明 CRUD」(景区/活动维护退费明细),但**漏配网关路由**,导致 `/admin/refund-note` 经网关一直返: - -```json -{"code":404,"message":"接口不存在: /admin/refund-note"} -``` - -本次已补网关路由。**前端原本对着 #3272 文档写的退费说明 CRUD 弹窗,现在能真正调通了**。三个接口(与 #3272 文档一致,无变化): - -``` -GET /admin/refund-note?resourceType=SCENIC&resourceId=12345 查 -PUT /admin/refund-note upsert 整块 -DELETE /admin/refund-note?resourceType=SCENIC&resourceId=12345 软删 -``` - -测试服已实测三个方法经网关全通(200)。仅 `SCENIC` / `ACTIVITY` 两类资源支持。 - ---- - -## 二、退费说明接入产品行程节点 + 订单快照(后端能力) - -行程节点绑定 SCENIC/ACTIVITY 资源时,产品详情聚合会回填该资源的退费说明;**下单时随产品详情整体冻进 `order_product_snapshot`**,锁定退费条款(资源后改不影响老订单)。 - -冻结结构(订单产品快照 `itinerary[].nodes[].refundNote`): - -```jsonc -{ - "refundNote": { - "intro": "苔藓为赠送项目, 不退费", - "items": [ - { - "title": "成人未参加", - "amount": 44.00, - "unitLabel": "/人", - "settleScope": "PER_PERSON", - "settleScopeLabel": "按人", // 字典中文,冻结即定格 - "remark": "凭票退", - "effectiveFrom": null, - "effectiveTo": null - } - ] - } -} -``` - -仅 SCENIC/ACTIVITY 节点、且资源配过退费说明时才有值,其余节点 / 未配置为 `null`。 - ---- - -## 三、暂未做(前端注意) - -**订单详情「行程安排 Tab」暂不展示退费说明**。原因:订单 `order_itinerary_node` 表当前下单时不物化(仅后台手动编辑写入),退费说明冻在 `order_product_snapshot` JSON 里。要在行程 Tab 逐节点展示,需后续补「快照→节点叠加」或「下单物化行程」,**不在本期**。本期只保证:①退费说明 admin CRUD 可用 ②退费说明已正确冻进订单快照(数据已锁定,前端展示链路待后续 PR)。 - ---- - -## 四、踩坑修复(hotfix #3312) - -测试服建单实测发现退费说明进快照恒 null,直查资源接口暴露 **500 ClassCastException**:`JacksonTypeHandler` 反序列化 JSON 列 `List` 时泛型擦除,运行期元素是 `LinkedHashMap`,用 `List` 流式处理时 lambda 入口被插 CHECKCAST 在转换前就崩。已改 `List` + `BeanUtil` 兼容(#3272 Converter 同源潜伏 bug 一并修),并补 `LinkedHashMap` 模拟单测锁回归。对前端无感,仅说明为何要 hotfix。 - ---- - -## 五、影响评估 - -- **后端**:资源(DTO+批量查+ClassCast 修)、产品(节点回填)、订单(快照 VO)、网关(路由);hl-common ResourceDetailDTO 加 refundNote 字段(非破坏) -- **前端**:可立即接入 `/admin/refund-note` CRUD(之前 404 不可用);订单详情退费说明展示等后续 PR -- **存量订单**:仅新建订单冻结退费说明(快照语义),老订单不回填 - ---- - -## 关联 - -- **Issue**: [#3307](https://git.1814.love:8443/wx/HL/issues/3307) / [#3311](https://git.1814.love:8443/wx/HL/issues/3311) -- **PR**: [#3308](https://git.1814.love:8443/wx/HL/pulls/3308)(接入)/ [#3312](https://git.1814.love:8443/wx/HL/pulls/3312)(hotfix + 网关路由) -- **前置**: [#3273](https://git.1814.love:8443/wx/HL/pulls/3273)(#3272 退费说明 CRUD 模块) diff --git a/changelogs-v2/2026-06/01_3313_景区是否收费-修改接口-管理后台.md b/changelogs-v2/2026-06/01_3313_景区是否收费-修改接口-管理后台.md deleted file mode 100644 index aaa1599..0000000 --- a/changelogs-v2/2026-06/01_3313_景区是否收费-修改接口-管理后台.md +++ /dev/null @@ -1,280 +0,0 @@ -# 景区管理新增「是否收费」字段 - -- **端类型**:管理后台 -- **变更类型**:修改接口 -- **日期**:2026-06-01 -- **Issue**:[#3313](https://git.1814.love:8443/wx/HL/issues/3313) -- **PR**:[#3314](https://git.1814.love:8443/wx/HL/pulls/3314) -- **Commit**:[62bd9be](https://git.1814.love:8443/wx/HL/commit/62bd9be8b9ac67bbb2493d0dcb6f2be41172684b) -- **后端负责人**:腰苏图(yst@1814.love) - ---- - -## ① 接口背景 - -景区资源新增「是否收费」属性,用于在管理后台创建/编辑景区时标记该景区是否需要游客付费(如收取门票费)。该字段同步透出到列表和详情接口,便于运营人员在列表页一眼识别收费/免费景区。字典来源 `sys_yes_no`,后端已配置,前端无需额外配置。 - ---- - -## ② 变更清单 - -| 接口 | 方法 | 路径 | 变更内容 | -|------|------|------|----------| -| 创建景区 | POST | `/admin/scenic/spot` | 入参新增 `isCharged`(Integer,默认 0) | -| 编辑景区 | PUT | `/admin/scenic/spot/{scenicId}` | 入参新增 `isCharged`(Integer,可选) | -| 景区详情 | GET | `/admin/scenic/spot/{scenicId}` | 出参新增 `isCharged` + `isChargedLabel` | -| 景区列表 | GET | `/admin/scenic/spots` | 出参新增 `isCharged` + `isChargedLabel` | - -所有变更均为**向后兼容新增字段**,不涉及字段改名或删除。 - ---- - -## ③ 接口详情 - -| 项目 | 说明 | -|------|------| -| **认证方式** | 管理后台 JWT Token,请求头 `Authorization: Bearer {token}` | -| **幂等性** | POST 创建非幂等;PUT 更新幂等(相同 scenicId 可重复调用) | -| **限流** | 无单独限流配置,走网关全局限流 | -| **权限** | 管理员角色,普通前端用户无访问权限 | - ---- - -## ④ 接口入参 - -### 4.1 路径参数 / Query 参数 - -**PUT `/admin/scenic/spot/{scenicId}`** - -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| scenicId | Long | 是 | 景区 ID(路径参数) | - -**GET `/admin/scenic/spots`**(列表,原有参数不变,无新增查询参数) - -### 4.2 请求体字段(新增字段,含于已有请求体中) - -**POST `/admin/scenic/spot`**(`ScenicSpotCreateReqVO`,新增字段) - -| 字段名 | 类型 | 必填 | 校验规则 | 默认值 | 说明 | -|--------|------|------|----------|--------|------| -| isCharged | Integer | 否 | Min=0, Max=1 | 0 | 是否收费,1=是 0=否 | - -**PUT `/admin/scenic/spot/{scenicId}`**(`ScenicSpotUpdateReqVO`,新增字段) - -| 字段名 | 类型 | 必填 | 校验规则 | 默认值 | 说明 | -|--------|------|------|----------|--------|------| -| isCharged | Integer | 否 | Min=0, Max=1 | null(不传则不修改) | 是否收费,1=是 0=否 | - ---- - -## ⑤ 出参字段 - -### GET `/admin/scenic/spot/{scenicId}` 详情(`ScenicSpotVO`,新增字段) - -| 字段名 | 类型 | 说明 | 可能为 null | -|--------|------|------|-------------| -| isCharged | Integer | 是否收费,1=是 0=否 | 否(DB 默认 0) | -| isChargedLabel | String | 是否收费中文文本,取自字典 sys_yes_no("是"/"否") | 是(字典缺失时为 null) | - -### GET `/admin/scenic/spots` 列表(`ScenicSpotListVO`,新增字段) - -| 字段名 | 类型 | 说明 | 可能为 null | -|--------|------|------|-------------| -| isCharged | Integer | 是否收费,1=是 0=否 | 否(DB 默认 0) | -| isChargedLabel | String | 是否收费中文文本,取自字典 sys_yes_no("是"/"否") | 是(字典缺失时为 null) | - ---- - -## ⑥ 枚举 / 数据字典 - -### sys_yes_no 字典(后端已配置,前端无需维护) - -| 字典值(isCharged) | 中文标签(isChargedLabel) | 说明 | -|--------------------|-----------------------------|------| -| 1 | 是 | 该景区收费 | -| 0 | 否 | 该景区免费 | - -> `isChargedLabel` 由后端查字典自动翻译,前端可直接展示。若字典配置缺失(不正常情况),该字段返回 null。 - ---- - -## ⑦ 错误码 - -| 错误码 | HTTP 状态 | 场景 | -|--------|-----------|------| -| 400 | 400 | `isCharged` 传入非 0/1 的值(如 2、-1),Bean Validation 失败 | -| 401 | 401 | 未登录或 Token 失效 | -| 403 | 403 | 无管理员权限 | -| 404 | 404 | 景区 ID 不存在或已删除 | - ---- - -## ⑧ 示例 - -### 8.1 典型成功 — 创建收费景区 - -**请求** -``` -POST /admin/scenic/spot -Authorization: Bearer {admin_token} -Content-Type: application/json - -{ - "name": "呼伦贝尔大草原景区", - "province": "内蒙古自治区", - "city": "呼伦贝尔市", - "cityName": "呼伦贝尔", - "longitude": 119.758, - "latitude": 49.215, - "isCharged": 1 -} -``` - -**响应** -```json -{ - "code": 200, - "msg": "成功", - "data": { - "scenicId": "1900123456789000001", - "name": "呼伦贝尔大草原景区", - "isCharged": 1, - "isChargedLabel": "是", - "status": 0 - } -} -``` - -### 8.2 边界情况 — 不传 isCharged(使用默认值 0) - -**请求** -``` -POST /admin/scenic/spot -Authorization: Bearer {admin_token} -Content-Type: application/json - -{ - "name": "某免费公园", - "province": "内蒙古自治区", - "city": "呼伦贝尔市", - "cityName": "呼伦贝尔", - "longitude": 119.700, - "latitude": 49.200 -} -``` - -**响应**(isCharged 默认为 0) -```json -{ - "code": 200, - "msg": "成功", - "data": { - "scenicId": "1900123456789000002", - "name": "某免费公园", - "isCharged": 0, - "isChargedLabel": "否", - "status": 0 - } -} -``` - -### 8.3 业务失败 — isCharged 传入越界值 - -**请求** -``` -POST /admin/scenic/spot -Authorization: Bearer {admin_token} -Content-Type: application/json - -{ - "name": "测试景区", - "isCharged": 2 -} -``` - -**响应**(400 参数校验失败) -```json -{ - "code": 400, - "msg": "是否收费取值范围为0或1", - "data": null -} -``` - ---- - -## ⑨ 业务边界 - -**适用场景**: -- 创建新景区时,可设置是否收费标记(不传默认不收费) -- 编辑已有景区时,可随时修改是否收费状态(传 null 或不传则保持原值不变) -- 列表和详情页均可展示该字段,用于运营人员快速判断景区性质 - -**不适用场景**: -- 该字段仅用于标记属性,不影响产品定价逻辑(定价由费用项管理) -- 不用于权限控制,仅作展示属性 - -**特殊边界**: -- 历史存量景区(PR #3314 上线前创建的)`isCharged` 默认为 0(否),`isChargedLabel` 返回 "否" -- PUT 编辑时若不传 `isCharged` 字段,该字段值保持不变(不会被清零) -- `isChargedLabel` 为 null 时属于字典配置异常,前端可用 `isCharged` 值自行映射(1→"是",0→"否")兜底 - ---- - -## ⑩ 修改前后对比 - -### 字段级对比 - -**入参(POST 创建 / PUT 编辑)** - -| 字段名 | 变更前 | 变更后 | -|--------|--------|--------| -| isCharged | 不存在 | ✨ 新增,Integer,可选,默认 0(Create),可 null(Update) | - -**出参(详情 + 列表)** - -| 字段名 | 变更前 | 变更后 | -|--------|--------|--------| -| isCharged | 不存在 | ✨ 新增,Integer,1=是/0=否 | -| isChargedLabel | 不存在 | ✨ 新增,String,字典翻译文本,可能为 null | - -### 行为级对比 - -| 行为 | 变更前 | 变更后 | -|------|--------|--------| -| 创建景区 | 无收费标记 | 可设置 isCharged,默认 0 | -| 列表展示 | 无收费信息 | 新增 isCharged + isChargedLabel | -| 详情展示 | 无收费信息 | 新增 isCharged + isChargedLabel | - ---- - -## ⑪ 影响评估 / 回滚 - -**破坏兼容性**:无,新增字段均为可选,现有调用代码无需修改即可正常运行。 - -**前端同步上线**: -- 创建/编辑表单:可选接入 `isCharged` 开关/选择器,不接入则默认 0 -- 列表/详情页:可选展示 `isChargedLabel`,不展示也不影响功能 - -**回滚方案**: -- 若需回滚,执行 `ALTER TABLE scenic_spot DROP COLUMN is_charged;` 并回退服务部署 -- 前端零改动时回滚对前端无感 - ---- - -## ⑫ 注意事项 - -1. `isChargedLabel` 依赖字典 `sys_yes_no` 配置,后端已配置好,前端**不需要**维护字典表 -2. 列表接口返回 `isChargedLabel` 纯粹为展示便利,前端也可用 `isCharged` 值自行映射(1→"是",0→"否") -3. PUT 编辑时 `isCharged` 不传(null)表示不修改,区别于传 `0`(明确设置为否) -4. 历史数据库存量记录 `is_charged` 列已通过 DDL 添加默认值 0,无历史数据问题 - ---- - -## ⑬ 关联 / 联系人 - -- **Issue**:[https://git.1814.love:8443/wx/HL/issues/3313](https://git.1814.love:8443/wx/HL/issues/3313) -- **PR**:[https://git.1814.love:8443/wx/HL/pulls/3314](https://git.1814.love:8443/wx/HL/pulls/3314) -- **Commit**:[https://git.1814.love:8443/wx/HL/commit/62bd9be8b9ac67bbb2493d0dcb6f2be41172684b](https://git.1814.love:8443/wx/HL/commit/62bd9be8b9ac67bbb2493d0dcb6f2be41172684b) -- **后端负责人**:腰苏图(企微 / yst@1814.love) diff --git a/changelogs-v2/2026-06/01_3317_餐厅是否收费-修改接口-管理后台.md b/changelogs-v2/2026-06/01_3317_餐厅是否收费-修改接口-管理后台.md deleted file mode 100644 index 699bd54..0000000 --- a/changelogs-v2/2026-06/01_3317_餐厅是否收费-修改接口-管理后台.md +++ /dev/null @@ -1,291 +0,0 @@ -# 餐厅管理新增「是否收费」字段 - -- **端类型**:管理后台 -- **变更类型**:修改接口 -- **日期**:2026-06-01 -- **Issue**:[#3317](https://git.1814.love:8443/wx/HL/issues/3317) -- **PR**:[#3318](https://git.1814.love:8443/wx/HL/pulls/3318) -- **Commit**:[3ad5860](https://git.1814.love:8443/wx/HL/commit/3ad5860883819058a58ec384de0c5aac7c918804) -- **后端负责人**:腰苏图(yst@1814.love) - ---- - -## ① 接口背景 - -餐厅资源新增「是否收费」属性,用于在管理后台创建/编辑餐厅时标记该餐厅是否需要游客付费。该字段同步透出到列表和详情接口,便于运营人员在列表页一眼识别收费/免费餐厅。字典来源 `sys_yes_no`,后端已配置,前端无需额外配置。 - ---- - -## ② 变更清单 - -| 接口 | 方法 | 路径 | 变更内容 | -|------|------|------|----------| -| 创建餐厅 | POST | `/admin/restaurant/item` | 入参新增 `isCharged`(Integer,默认 0) | -| 更新餐厅 | PUT | `/admin/restaurant/item/{restaurantId}` | 入参新增 `isCharged`(Integer,可选) | -| 餐厅详情 | GET | `/admin/restaurant/item/{restaurantId}` | 出参新增 `isCharged` + `isChargedLabel` | -| 餐厅列表 | GET | `/admin/restaurant/items` | 出参新增 `isCharged` + `isChargedLabel` | - -所有变更均为**向后兼容新增字段**,不涉及字段改名或删除。 - ---- - -## ③ 接口详情 - -| 项目 | 说明 | -|------|------| -| **认证方式** | 管理后台 JWT Token,请求头 `Authorization: Bearer {token}` | -| **幂等性** | POST 创建非幂等;PUT 更新幂等(相同 restaurantId 可重复调用) | -| **限流** | 无单独限流配置,走网关全局限流 | -| **权限** | 管理员角色,普通前端用户无访问权限 | - ---- - -## ④ 接口入参 - -### 4.1 路径参数 / Query 参数 - -**PUT `/admin/restaurant/item/{restaurantId}`** - -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| restaurantId | Long | 是 | 餐厅 ID(路径参数) | - -**GET `/admin/restaurant/items`**(列表,原有参数不变,无新增查询参数) - -### 4.2 请求体字段(新增字段,含于已有请求体中) - -**POST `/admin/restaurant/item`**(`RestaurantCreateRequest`,新增字段) - -| 字段名 | 类型 | 必填 | 校验规则 | 默认值 | 说明 | -|--------|------|------|----------|--------|------| -| isCharged | Integer | 否 | Min=0, Max=1 | 0 | 是否收费,1=是 0=否 | - -**PUT `/admin/restaurant/item/{restaurantId}`**(`RestaurantUpdateRequest`,新增字段) - -| 字段名 | 类型 | 必填 | 校验规则 | 默认值 | 说明 | -|--------|------|------|----------|--------|------| -| isCharged | Integer | 否 | Min=0, Max=1 | null(不传则不修改) | 是否收费,1=是 0=否 | - ---- - -## ⑤ 出参字段 - -### GET `/admin/restaurant/item/{restaurantId}` 详情(`RestaurantVO`,新增字段) - -| 字段名 | 类型 | 说明 | 可能为 null | -|--------|------|------|-------------| -| isCharged | Integer | 是否收费,1=是 0=否 | 否(DB 默认 0) | -| isChargedLabel | String | 是否收费中文文本,取自字典 sys_yes_no("是"/"否") | 是(字典缺失时为 null) | - -### GET `/admin/restaurant/items` 列表(`RestaurantListVO`,新增字段) - -| 字段名 | 类型 | 说明 | 可能为 null | -|--------|------|------|-------------| -| isCharged | Integer | 是否收费,1=是 0=否 | 否(DB 默认 0) | -| isChargedLabel | String | 是否收费中文文本,取自字典 sys_yes_no("是"/"否") | 是(字典缺失时为 null) | - ---- - -## ⑥ 枚举 / 数据字典 - -### sys_yes_no 字典(后端已配置,前端无需维护) - -| 字典值(isCharged) | 中文标签(isChargedLabel) | 说明 | -|--------------------|-----------------------------|------| -| 1 | 是 | 该餐厅收费 | -| 0 | 否 | 该餐厅免费 | - -> `isChargedLabel` 由后端查字典自动翻译,前端可直接展示。若字典配置缺失(不正常情况),该字段返回 null,前端建议展示"-"或不显示。 - ---- - -## ⑦ 错误码 - -| 错误码 | HTTP 状态 | 场景 | -|--------|-----------|------| -| 400 | 400 | `isCharged` 传入非 0/1 的值(如 2、-1),Bean Validation 失败 | -| 401 | 401 | 未登录或 Token 失效 | -| 403 | 403 | 无管理员权限 | -| 404 | 404 | 餐厅 ID 不存在或已删除 | - ---- - -## ⑧ 示例 - -### 8.1 典型成功 — 创建收费餐厅 - -**请求** -``` -POST /admin/restaurant/item -Authorization: Bearer {admin_token} -Content-Type: application/json - -{ - "name": "云端藏餐", - "categoryCode": "TIBETAN", - "province": "西藏自治区", - "city": "拉萨市", - "cityName": "拉萨", - "longitude": 91.132, - "latitude": 29.660, - "isCharged": 1 -} -``` - -**响应** -```json -{ - "code": 200, - "msg": "成功", - "data": { - "restaurantId": "1927000000000001", - "name": "云端藏餐", - "isCharged": 1, - "isChargedLabel": "是", - "status": 0, - ... - } -} -``` - -### 8.2 边界情况 — 不传 isCharged(使用默认值 0) - -**请求** -``` -POST /admin/restaurant/item -Authorization: Bearer {admin_token} -Content-Type: application/json - -{ - "name": "免费体验餐厅", - "categoryCode": "CHINESE", - "province": "西藏自治区", - "city": "拉萨市", - "cityName": "拉萨", - "longitude": 91.100, - "latitude": 29.650 - // isCharged 字段不传 -} -``` - -**响应**(isCharged 默认为 0) -```json -{ - "code": 200, - "msg": "成功", - "data": { - "restaurantId": "1927000000000002", - "name": "免费体验餐厅", - "isCharged": 0, - "isChargedLabel": "否", - "status": 0, - ... - } -} -``` - -### 8.3 业务失败 — isCharged 传入越界值 - -**请求** -``` -POST /admin/restaurant/item -Authorization: Bearer {admin_token} -Content-Type: application/json - -{ - "name": "测试餐厅", - "categoryCode": "CHINESE", - "province": "西藏自治区", - "city": "拉萨市", - "cityName": "拉萨", - "longitude": 91.100, - "latitude": 29.650, - "isCharged": 2 -} -``` - -**响应**(400 参数校验失败) -```json -{ - "code": 400, - "msg": "是否收费取值范围为0或1", - "data": null -} -``` - ---- - -## ⑨ 业务边界 - -**适用场景**: -- 创建新餐厅时,可设置是否收费标记(不传默认不收费) -- 编辑已有餐厅时,可随时修改是否收费状态(传 null 或不传则保持原值不变) -- 列表和详情页均可展示该字段,用于运营人员快速判断餐厅性质 - -**不适用场景**: -- 该字段仅用于标记属性,不影响产品定价逻辑(定价由费用项管理) -- 不用于权限控制,仅作展示属性 - -**特殊边界**: -- 历史存量餐厅(PR #3318 上线前创建的)`isCharged` 默认为 0(否),`isChargedLabel` 返回 "否" -- PUT 更新时若不传 `isCharged` 字段,该字段值保持不变(不会被清零) -- `isChargedLabel` 为 null 时属于字典配置异常,业务上可展示 "-" 兜底 - ---- - -## ⑩ 修改前后对比 - -### 字段级对比 - -**入参(POST 创建 / PUT 更新)** - -| 字段名 | 变更前 | 变更后 | -|--------|--------|--------| -| isCharged | 不存在 | ✨ 新增,Integer,可选,默认 0(Create),可 null(Update) | - -**出参(详情 + 列表)** - -| 字段名 | 变更前 | 变更后 | -|--------|--------|--------| -| isCharged | 不存在 | ✨ 新增,Integer,1=是/0=否 | -| isChargedLabel | 不存在 | ✨ 新增,String,字典翻译文本,可能为 null | - -### 行为级对比 - -| 行为 | 变更前 | 变更后 | -|------|--------|--------| -| 创建餐厅 | 无收费标记 | 可设置 isCharged,默认 0 | -| 列表展示 | 无收费信息 | 新增 isCharged + isChargedLabel | -| 详情展示 | 无收费信息 | 新增 isCharged + isChargedLabel | - ---- - -## ⑪ 影响评估 / 回滚 - -**破坏兼容性**:无,新增字段均为可选,现有调用代码无需修改即可正常运行。 - -**前端同步上线**: -- 创建/编辑表单:可选接入 `isCharged` 开关/选择器,不接入则默认 0 -- 列表/详情页:可选展示 `isChargedLabel`,不展示也不影响功能 - -**回滚方案**: -- 若需回滚,执行 `ALTER TABLE restaurant DROP COLUMN is_charged;` 并回退服务部署 -- 前端零改动时回滚对前端无感 - ---- - -## ⑫ 注意事项 - -1. `isChargedLabel` 依赖字典 `sys_yes_no` 配置,后端已配置好,前端**不需要**维护字典表 -2. 列表接口返回 `isChargedLabel` 纯粹为展示便利,前端也可用 `isCharged` 值自行映射(1→"是",0→"否") -3. PUT 更新时 `isCharged` 不传(null)表示不修改,区别于传 `0`(明确设置为否) -4. 历史数据库存量记录 `is_charged` 列已通过 DDL 添加默认值 0,无历史数据问题 - ---- - -## ⑬ 关联 / 联系人 - -- **Issue**:[https://git.1814.love:8443/wx/HL/issues/3317](https://git.1814.love:8443/wx/HL/issues/3317) -- **PR**:[https://git.1814.love:8443/wx/HL/pulls/3318](https://git.1814.love:8443/wx/HL/pulls/3318) -- **Commit**:[https://git.1814.love:8443/wx/HL/commit/3ad5860883819058a58ec384de0c5aac7c918804](https://git.1814.love:8443/wx/HL/commit/3ad5860883819058a58ec384de0c5aac7c918804) -- **后端负责人**:腰苏图(企微 / yst@1814.love) diff --git a/changelogs-v2/2026-06/01_3325_酒店是否收费-修改接口-管理后台.md b/changelogs-v2/2026-06/01_3325_酒店是否收费-修改接口-管理后台.md deleted file mode 100644 index 8f490bd..0000000 --- a/changelogs-v2/2026-06/01_3325_酒店是否收费-修改接口-管理后台.md +++ /dev/null @@ -1,282 +0,0 @@ -# 酒店管理新增「是否收费」字段 - -- **端类型**:管理后台 -- **变更类型**:修改接口 -- **日期**:2026-06-01 -- **Issue**:[#3325](https://git.1814.love:8443/wx/HL/issues/3325) -- **PR**:[#3326](https://git.1814.love:8443/wx/HL/pulls/3326) -- **Commit**:[58afda7](https://git.1814.love:8443/wx/HL/commit/58afda7f72031b8055dd65805815176f88dfe08c) -- **后端负责人**:腰苏图(yst@1814.love) - ---- - -## ① 接口背景 - -酒店资源新增「是否收费」属性,用于在管理后台创建/编辑酒店时标记该酒店是否需要游客付费。该字段同步透出到列表和详情接口,便于运营人员在列表页一眼识别收费/免费酒店。字典来源 `sys_yes_no`,后端已配置,前端无需额外配置。 - ---- - -## ② 变更清单 - -| 接口 | 方法 | 路径 | 变更内容 | -|------|------|------|----------| -| 创建酒店 | POST | `/admin/hotel/item` | 入参新增 `isCharged`(Integer,默认 0) | -| 更新酒店 | PUT | `/admin/hotel/item/{hotelId}` | 入参新增 `isCharged`(Integer,可选) | -| 酒店详情 | GET | `/admin/hotel/item/{hotelId}` | 出参新增 `isCharged` + `isChargedLabel` | -| 酒店列表 | GET | `/admin/hotel/items` | 出参新增 `isCharged` + `isChargedLabel` | - -所有变更均为**向后兼容新增字段**,不涉及字段改名或删除。 - ---- - -## ③ 接口详情 - -| 项目 | 说明 | -|------|------| -| **认证方式** | 管理后台 JWT Token,请求头 `Authorization: Bearer {token}` | -| **幂等性** | POST 创建非幂等;PUT 更新幂等(相同 hotelId 可重复调用) | -| **限流** | 无单独限流配置,走网关全局限流 | -| **权限** | 管理员角色,普通前端用户无访问权限 | - ---- - -## ④ 接口入参 - -### 4.1 路径参数 / Query 参数 - -**PUT `/admin/hotel/item/{hotelId}`** - -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| hotelId | Long | 是 | 酒店 ID(路径参数) | - -**GET `/admin/hotel/items`**(列表,原有参数不变,无新增查询参数) - -### 4.2 请求体字段(新增字段,含于已有请求体中) - -**POST `/admin/hotel/item`**(`HotelCreateRequest`,新增字段) - -| 字段名 | 类型 | 必填 | 校验规则 | 默认值 | 说明 | -|--------|------|------|----------|--------|------| -| isCharged | Integer | 否 | Min=0, Max=1 | 0 | 是否收费,1=是 0=否 | - -**PUT `/admin/hotel/item/{hotelId}`**(`HotelUpdateRequest`,新增字段) - -| 字段名 | 类型 | 必填 | 校验规则 | 默认值 | 说明 | -|--------|------|------|----------|--------|------| -| isCharged | Integer | 否 | Min=0, Max=1 | null(不传则不修改) | 是否收费,1=是 0=否 | - ---- - -## ⑤ 出参字段 - -### GET `/admin/hotel/item/{hotelId}` 详情(`HotelVO`,新增字段) - -| 字段名 | 类型 | 说明 | 可能为 null | -|--------|------|------|-------------| -| isCharged | Integer | 是否收费,1=是 0=否 | 否(DB 默认 0) | -| isChargedLabel | String | 是否收费中文文本,取自字典 sys_yes_no("是"/"否") | 是(字典缺失时为 null) | - -### GET `/admin/hotel/items` 列表(`HotelListVO`,新增字段) - -| 字段名 | 类型 | 说明 | 可能为 null | -|--------|------|------|-------------| -| isCharged | Integer | 是否收费,1=是 0=否 | 否(DB 默认 0) | -| isChargedLabel | String | 是否收费中文文本,取自字典 sys_yes_no("是"/"否") | 是(字典缺失时为 null) | - ---- - -## ⑥ 枚举 / 数据字典 - -### sys_yes_no 字典(后端已配置,前端无需维护) - -| 字典值(isCharged) | 中文标签(isChargedLabel) | 说明 | -|--------------------|-----------------------------|------| -| 1 | 是 | 该酒店收费 | -| 0 | 否 | 该酒店免费 | - -> `isChargedLabel` 由后端查字典自动翻译,前端可直接展示。若字典配置缺失(不正常情况),该字段返回 null。 - ---- - -## ⑦ 错误码 - -| 错误码 | HTTP 状态 | 场景 | -|--------|-----------|------| -| 400 | 400 | `isCharged` 传入非 0/1 的值(如 2、-1),Bean Validation 失败 | -| 401 | 401 | 未登录或 Token 失效 | -| 403 | 403 | 无管理员权限 | -| 404 | 404 | 酒店 ID 不存在或已删除 | - ---- - -## ⑧ 示例 - -### 8.1 典型成功 — 创建收费酒店 - -**请求** -``` -POST /admin/hotel/item -Authorization: Bearer {admin_token} -Content-Type: application/json - -{ - "name": "丽江悦榕庄", - "hotelType": "HOTEL", - "address": "束河古镇悦榕路1号", - "longitude": 100.2134, - "latitude": 26.8721, - "isCharged": 1 -} -``` - -**响应** -```json -{ - "code": 200, - "msg": "成功", - "data": { - "hotelId": "1928000000000001", - "name": "丽江悦榕庄", - "isCharged": 1, - "isChargedLabel": "是", - "status": 0 - } -} -``` - -### 8.2 边界情况 — 不传 isCharged(使用默认值 0) - -**请求** -``` -POST /admin/hotel/item -Authorization: Bearer {admin_token} -Content-Type: application/json - -{ - "name": "团队免费住宿点", - "hotelType": "HOSTEL", - "address": "丽江古城区某路1号", - "longitude": 100.2200, - "latitude": 26.8800 -} -``` - -**响应**(isCharged 默认为 0) -```json -{ - "code": 200, - "msg": "成功", - "data": { - "hotelId": "1928000000000002", - "name": "团队免费住宿点", - "isCharged": 0, - "isChargedLabel": "否", - "status": 0 - } -} -``` - -### 8.3 业务失败 — isCharged 传入越界值 - -**请求** -``` -POST /admin/hotel/item -Authorization: Bearer {admin_token} -Content-Type: application/json - -{ - "name": "测试酒店", - "hotelType": "HOTEL", - "address": "测试地址", - "longitude": 100.0, - "latitude": 26.0, - "isCharged": 2 -} -``` - -**响应**(400 参数校验失败) -```json -{ - "code": 400, - "msg": "是否收费取值范围为0或1", - "data": null -} -``` - ---- - -## ⑨ 业务边界 - -**适用场景**: -- 创建新酒店时,可设置是否收费标记(不传默认不收费) -- 编辑已有酒店时,可随时修改是否收费状态(传 null 或不传则保持原值不变) -- 列表和详情页均可展示该字段,用于运营人员快速判断酒店性质 - -**不适用场景**: -- 该字段仅用于标记属性,不影响产品定价逻辑(定价由费用项管理) -- 不用于权限控制,仅作展示属性 - -**特殊边界**: -- 历史存量酒店(PR #3326 上线前创建的)`isCharged` 默认为 0(否),`isChargedLabel` 返回 "否" -- PUT 更新时若不传 `isCharged` 字段,该字段值保持不变(不会被清零) -- `isChargedLabel` 为 null 时属于字典配置异常,非正常情况 - ---- - -## ⑩ 修改前后对比 - -### 字段级对比 - -**入参(POST 创建 / PUT 更新)** - -| 字段名 | 变更前 | 变更后 | -|--------|--------|--------| -| isCharged | 不存在 | ✨ 新增,Integer,可选,默认 0(Create),可 null(Update) | - -**出参(详情 + 列表)** - -| 字段名 | 变更前 | 变更后 | -|--------|--------|--------| -| isCharged | 不存在 | ✨ 新增,Integer,1=是/0=否 | -| isChargedLabel | 不存在 | ✨ 新增,String,字典翻译文本,可能为 null | - -### 行为级对比 - -| 行为 | 变更前 | 变更后 | -|------|--------|--------| -| 创建酒店 | 无收费标记 | 可设置 isCharged,默认 0 | -| 列表展示 | 无收费信息 | 新增 isCharged + isChargedLabel | -| 详情展示 | 无收费信息 | 新增 isCharged + isChargedLabel | - ---- - -## ⑪ 影响评估 / 回滚 - -**破坏兼容性**:无,新增字段均为可选,现有调用代码无需修改即可正常运行。 - -**前端同步上线**: -- 创建/编辑表单:可选接入 `isCharged` 开关/选择器,不接入则默认 0 -- 列表/详情页:可选展示 `isChargedLabel`,不展示也不影响功能 - -**回滚方案**: -- 若需回滚,执行 `ALTER TABLE hotel DROP COLUMN is_charged;` 并回退服务部署 -- 前端零改动时回滚对前端无感 - ---- - -## ⑫ 注意事项 - -1. `isChargedLabel` 依赖字典 `sys_yes_no` 配置,后端已配置好,前端**不需要**维护字典表 -2. 列表接口返回 `isChargedLabel` 纯粹为展示便利,前端也可用 `isCharged` 值自行映射(1→"是",0→"否") -3. PUT 更新时 `isCharged` 不传(null)表示不修改,区别于传 `0`(明确设置为否) -4. 历史数据库存量记录 `is_charged` 列已通过 DDL 添加默认值 0,无历史数据问题 - ---- - -## ⑬ 关联 / 联系人 - -- **Issue**:[https://git.1814.love:8443/wx/HL/issues/3325](https://git.1814.love:8443/wx/HL/issues/3325) -- **PR**:[https://git.1814.love:8443/wx/HL/pulls/3326](https://git.1814.love:8443/wx/HL/pulls/3326) -- **Commit**:[https://git.1814.love:8443/wx/HL/commit/58afda7f72031b8055dd65805815176f88dfe08c](https://git.1814.love:8443/wx/HL/commit/58afda7f72031b8055dd65805815176f88dfe08c) -- **后端负责人**:腰苏图(企微 / yst@1814.love) diff --git a/changelogs-v2/2026-06/01_3331_活动物资是否收费-修改接口-管理后台.md b/changelogs-v2/2026-06/01_3331_活动物资是否收费-修改接口-管理后台.md deleted file mode 100644 index 81499d5..0000000 --- a/changelogs-v2/2026-06/01_3331_活动物资是否收费-修改接口-管理后台.md +++ /dev/null @@ -1,321 +0,0 @@ -# 游玩项目(活动)+ 备品(物资)新增「是否收费」字段 - -- **端类型**:管理后台 -- **变更类型**:修改接口 -- **日期**:2026-06-01 -- **Issue**:[#3331](https://git.1814.love:8443/wx/HL/issues/3331) -- **PR**:[#3334](https://git.1814.love:8443/wx/HL/pulls/3334) -- **Commit**:[5da05a3](https://git.1814.love:8443/wx/HL/commit/5da05a324813cf8109d35c521c5e7bb9719627be) -- **后端负责人**:腰苏图(yst@1814.love) - ---- - -## ① 接口背景 - -游玩项目(活动)和备品(物资)两个资源域同步新增「是否收费」属性,用于在管理后台创建/编辑时标记该资源是否需要游客付费。该字段同步透出到各自的列表和详情接口,便于运营人员在列表页快速识别收费/免费资源。字典来源 `sys_yes_no`,后端已配置,前端无需额外配置。 - ---- - -## ② 变更清单 - -### 游玩项目(ActivityController `/admin/activity`) - -| 接口 | 方法 | 路径 | 变更内容 | -|------|------|------|----------| -| 创建游玩项目 | POST | `/admin/activity/item` | 入参新增 `isCharged`(Integer,默认 0) | -| 更新游玩项目 | PUT | `/admin/activity/item/{activityId}` | 入参新增 `isCharged`(Integer,可选) | -| 游玩项目详情 | GET | `/admin/activity/item/{activityId}` | 出参新增 `isCharged` + `isChargedLabel` | -| 游玩项目列表 | GET | `/admin/activity/items` | 出参新增 `isCharged` + `isChargedLabel` | - -### 备品(SuppliesController `/admin/supplies`) - -| 接口 | 方法 | 路径 | 变更内容 | -|------|------|------|----------| -| 创建备品 | POST | `/admin/supplies/item` | 入参新增 `isCharged`(Integer,默认 0) | -| 更新备品 | PUT | `/admin/supplies/item/{suppliesId}` | 入参新增 `isCharged`(Integer,可选) | -| 备品详情 | GET | `/admin/supplies/item/{suppliesId}` | 出参新增 `isCharged` + `isChargedLabel` | -| 备品列表 | GET | `/admin/supplies/items` | 出参新增 `isCharged` + `isChargedLabel` | - -所有变更均为**向后兼容新增字段**,不涉及字段改名或删除。 - ---- - -## ③ 接口详情 - -| 项目 | 说明 | -|------|------| -| **认证方式** | 管理后台 JWT Token,请求头 `Authorization: Bearer {token}` | -| **幂等性** | POST 创建非幂等;PUT 更新幂等(相同 activityId / suppliesId 可重复调用) | -| **限流** | 无单独限流配置,走网关全局限流 | -| **权限** | 管理员角色,普通前端用户无访问权限 | - ---- - -## ④ 接口入参 - -### 4.1 路径参数 / Query 参数 - -**PUT `/admin/activity/item/{activityId}`** - -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| activityId | Long | 是 | 游玩项目 ID(路径参数) | - -**PUT `/admin/supplies/item/{suppliesId}`** - -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| suppliesId | Long | 是 | 备品 ID(路径参数) | - -**GET `/admin/activity/items`** 和 **GET `/admin/supplies/items`**(列表,原有 Query 参数不变,无新增查询参数) - -### 4.2 请求体字段(新增字段) - -**POST `/admin/activity/item`**(`ActivityCreateRequest`,新增字段) - -| 字段名 | 类型 | 必填 | 校验规则 | 默认值 | 说明 | -|--------|------|------|----------|--------|------| -| isCharged | Integer | 否 | Min=0, Max=1 | 0 | 是否收费,1=是 0=否 | - -**PUT `/admin/activity/item/{activityId}`**(`ActivityUpdateRequest`,新增字段) - -| 字段名 | 类型 | 必填 | 校验规则 | 默认值 | 说明 | -|--------|------|------|----------|--------|------| -| isCharged | Integer | 否 | Min=0, Max=1 | null(不传则不修改) | 是否收费,1=是 0=否 | - -**POST `/admin/supplies/item`**(`SuppliesCreateRequest`,新增字段) - -| 字段名 | 类型 | 必填 | 校验规则 | 默认值 | 说明 | -|--------|------|------|----------|--------|------| -| isCharged | Integer | 否 | Min=0, Max=1 | 0 | 是否收费,1=是 0=否 | - -**PUT `/admin/supplies/item/{suppliesId}`**(`SuppliesUpdateRequest`,新增字段) - -| 字段名 | 类型 | 必填 | 校验规则 | 默认值 | 说明 | -|--------|------|------|----------|--------|------| -| isCharged | Integer | 否 | Min=0, Max=1 | null(不传则不修改) | 是否收费,1=是 0=否 | - ---- - -## ⑤ 出参字段 - -### GET `/admin/activity/item/{activityId}` 详情(`ActivityVO`,新增字段) - -| 字段名 | 类型 | 说明 | 可能为 null | -|--------|------|------|-------------| -| isCharged | Integer | 是否收费,1=是 0=否 | 否(DB 默认 0) | -| isChargedLabel | String | 是否收费中文文本,取自字典 sys_yes_no("是"/"否") | 是(字典缺失时为 null) | - -### GET `/admin/activity/items` 列表(`ActivityListVO`,新增字段) - -| 字段名 | 类型 | 说明 | 可能为 null | -|--------|------|------|-------------| -| isCharged | Integer | 是否收费,1=是 0=否 | 否(DB 默认 0) | -| isChargedLabel | String | 是否收费中文文本,取自字典 sys_yes_no("是"/"否") | 是(字典缺失时为 null) | - -### GET `/admin/supplies/item/{suppliesId}` 详情(`SuppliesVO`,新增字段) - -| 字段名 | 类型 | 说明 | 可能为 null | -|--------|------|------|-------------| -| isCharged | Integer | 是否收费,1=是 0=否 | 否(DB 默认 0) | -| isChargedLabel | String | 是否收费中文文本,取自字典 sys_yes_no("是"/"否") | 是(字典缺失时为 null) | - -### GET `/admin/supplies/items` 列表(`SuppliesListVO`,新增字段) - -| 字段名 | 类型 | 说明 | 可能为 null | -|--------|------|------|-------------| -| isCharged | Integer | 是否收费,1=是 0=否 | 否(DB 默认 0) | -| isChargedLabel | String | 是否收费中文文本,取自字典 sys_yes_no("是"/"否") | 是(字典缺失时为 null) | - ---- - -## ⑥ 枚举 / 数据字典 - -### sys_yes_no 字典(后端已配置,前端无需维护) - -| 字典值(isCharged) | 中文标签(isChargedLabel) | 说明 | -|--------------------|-----------------------------|------| -| 1 | 是 | 该资源收费 | -| 0 | 否 | 该资源免费 | - -> `isChargedLabel` 由后端查字典自动翻译,前端可直接展示。若字典配置缺失(不正常情况),该字段返回 null。 - ---- - -## ⑦ 错误码 - -| 错误码 | HTTP 状态 | 场景 | -|--------|-----------|------| -| 400 | 400 | `isCharged` 传入非 0/1 的值(如 2、-1),Bean Validation 失败,msg="是否收费取值范围为0或1" | -| 401 | 401 | 未登录或 Token 失效 | -| 403 | 403 | 无管理员权限 | -| 404 | 404 | 资源 ID 不存在或已删除 | - ---- - -## ⑧ 示例 - -### 8.1 典型成功 — 创建收费游玩项目 - -**请求** -``` -POST /admin/activity/item -Authorization: Bearer {admin_token} -Content-Type: application/json - -{ - "name": "高原骑马体验", - "categoryCode": "OUTDOOR", - "isCharged": 1 -} -``` - -**响应** -```json -{ - "code": 200, - "msg": "成功", - "data": { - "activityId": "1929000000000001", - "name": "高原骑马体验", - "categoryCode": "OUTDOOR", - "isCharged": 1, - "isChargedLabel": "是", - "status": 0 - } -} -``` - -### 8.2 边界情况 — 创建备品时不传 isCharged(默认 0) - -**请求** -``` -POST /admin/supplies/item -Authorization: Bearer {admin_token} -Content-Type: application/json - -{ - "name": "登山杖", - "categoryCode": "OUTDOOR_GEAR", - "billingType": "PER_ITEM", - "basePrice": 25.00 -} -``` - -**响应**(isCharged 默认为 0) -```json -{ - "code": 200, - "msg": "成功", - "data": { - "suppliesId": "1929000000000002", - "name": "登山杖", - "billingType": "PER_ITEM", - "isCharged": 0, - "isChargedLabel": "否", - "status": 0 - } -} -``` - -### 8.3 业务失败 — isCharged 传入越界值 - -**请求** -``` -PUT /admin/activity/item/1929000000000001 -Authorization: Bearer {admin_token} -Content-Type: application/json - -{ - "name": "高原骑马体验", - "isCharged": 2 -} -``` - -**响应**(400 参数校验失败) -```json -{ - "code": 400, - "msg": "是否收费取值范围为0或1", - "data": null -} -``` - ---- - -## ⑨ 业务边界 - -**适用场景**: -- 创建/编辑游玩项目或备品时,可设置是否收费标记(不传默认不收费) -- 列表和详情页均展示该字段,供运营人员快速识别资源收费属性 - -**不适用场景**: -- 该字段仅用于标记属性,不影响产品定价逻辑(定价由费用项管理) -- 不用于权限控制,仅作展示属性 - -**特殊边界**: -- 历史存量游玩项目和备品(PR #3334 上线前创建的)`isCharged` 默认为 0,`isChargedLabel` 返回 "否" -- PUT 更新时若不传 `isCharged` 字段(null),该字段值保持不变(不会被清零),区别于传 `0`(明确设置为否) -- `isChargedLabel` 为 null 时属于字典配置异常,非正常情况 - ---- - -## ⑩ 修改前后对比 - -### 字段级对比 - -**入参(POST 创建 / PUT 更新)—— 游玩项目和备品相同** - -| 字段名 | 变更前 | 变更后 | -|--------|--------|--------| -| isCharged | 不存在 | ✨ 新增,Integer,可选,默认 0(Create),null 不修改(Update) | - -**出参(详情 + 列表)—— 游玩项目和备品相同** - -| 字段名 | 变更前 | 变更后 | -|--------|--------|--------| -| isCharged | 不存在 | ✨ 新增,Integer,1=是/0=否 | -| isChargedLabel | 不存在 | ✨ 新增,String,字典翻译文本,可能为 null | - -### 行为级对比 - -| 行为 | 变更前 | 变更后 | -|------|--------|--------| -| 创建游玩项目 / 备品 | 无收费标记 | 可设置 isCharged,默认 0 | -| 列表展示 | 无收费信息 | 新增 isCharged + isChargedLabel | -| 详情展示 | 无收费信息 | 新增 isCharged + isChargedLabel | - ---- - -## ⑪ 影响评估 / 回滚 - -**破坏兼容性**:无,新增字段均为可选,现有调用代码无需修改即可正常运行。 - -**前端同步上线**: -- 创建/编辑表单:可选接入 `isCharged` 开关/选择器,不接入则默认提交 0(不收费) -- 列表/详情页:可选展示 `isChargedLabel`,不展示也不影响功能 - -**回滚方案**: -- 若需回滚,分别执行以下 DDL 并回退服务部署: - - `ALTER TABLE activity DROP COLUMN is_charged;` - - `ALTER TABLE supplies_item DROP COLUMN is_charged;` -- 前端零改动时回滚对前端无感 - ---- - -## ⑫ 注意事项 - -1. `isChargedLabel` 依赖字典 `sys_yes_no` 配置,后端已配置好,前端**不需要**维护字典表 -2. 列表接口返回 `isChargedLabel` 纯粹为展示便利,前端也可用 `isCharged` 值自行映射(1→"是",0→"否") -3. PUT 更新时 `isCharged` 不传(null)表示不修改,区别于传 `0`(明确设置为否) -4. 游玩项目和备品两个域的字段命名、类型、字典完全一致,调用逻辑相同 -5. 历史数据库存量记录 `is_charged` 列已通过 DDL 添加默认值 0,无历史数据问题 - ---- - -## ⑬ 关联 / 联系人 - -- **Issue**:[https://git.1814.love:8443/wx/HL/issues/3331](https://git.1814.love:8443/wx/HL/issues/3331) -- **PR**:[https://git.1814.love:8443/wx/HL/pulls/3334](https://git.1814.love:8443/wx/HL/pulls/3334) -- **Commit**:[https://git.1814.love:8443/wx/HL/commit/5da05a324813cf8109d35c521c5e7bb9719627be](https://git.1814.love:8443/wx/HL/commit/5da05a324813cf8109d35c521c5e7bb9719627be) -- **后端负责人**:腰苏图(企微 / yst@1814.love) diff --git a/changelogs-v2/2026-06/02_3354_订单服务标准-退费说明修复.md b/changelogs-v2/2026-06/02_3354_订单服务标准-退费说明修复.md deleted file mode 100644 index 78c60bb..0000000 --- a/changelogs-v2/2026-06/02_3354_订单服务标准-退费说明修复.md +++ /dev/null @@ -1,58 +0,0 @@ -# 订单详情「服务标准」Tab 退费说明(refundNotes)修复——现可正确返回数据 - -- **端类型**:管理后台 -- **变更类型**:缺陷修复(接口结构不变,仅恢复数据流) -- **日期**:2026-06-02 -- **Issue**:[#3354](https://git.1814.love:8443/wx/HL/issues/3354) -- **PR**:[#3355](https://git.1814.love:8443/wx/HL/pulls/3355) -- **Commit**:[db61c2d](https://git.1814.love:8443/wx/HL/commit/db61c2da1193be0e0954dacdfd8f154e3ba5d912) -- **后端负责人**:wx - ---- - -## ① 背景 - -订单详情「服务标准」Tab 接口(`GET /v3/admin/order/{id}/service-standard`,#3340 已上线的聚合结构)中,`refundNotes`(退费说明)字段此前一直返回空数组,即使绑定资源已配置退费说明。 - -根因是**资源退费说明根本存不进库**:资源服务自定义的字段自动填充处理器只填一期命名字段(createdAt/updatedAt),漏填二期命名字段(createTime),导致退费说明保存接口报错(create_time 不能为空),全表 0 条存活记录 → 下单冻快照时节点 `refundNote` 恒 null → 服务标准 Tab 退费说明永远为空。 - -本次修复后端自动填充处理器,退费说明可正常保存并随订单快照冻结。 - ---- - -## ② 变更清单 - -**接口结构无任何变化**(`refundNotes` 字段在 #3340 已定义)。修复后行为: - -| 接口 | 方法 | 路径 | 变更内容 | -|------|------|------|----------| -| 订单服务标准 | GET | `/v3/admin/order/{id}/service-standard` | `refundNotes` 现对「绑定了退费说明的 SCENIC/ACTIVITY 行程节点」正确返回数据(修复前恒为空) | - -`refundNotes[]` 结构(不变,复述): - -``` -refundNotes: [ - { - sourceName, // 来源点位名称,如「呼和诺尔草原旅游区」 - intro, // 退费说明备注 - items: [ - { title, amount, unitLabel, settleScope, settleScopeLabel, remark, effectiveFrom, effectiveTo } - ] - } -] -``` - -测试服实测(订单 2061673442020651009):`refundNotes` = 呼和诺尔草原旅游区 → [成人未参加 ¥44 /人(按人), 整团未到 ¥100 /团(按团)],`settleScopeLabel` 字典中文已正确解析。 - ---- - -## ③ 前端动作 - -**无需改动**。#3340 前端已对接 `refundNotes` 结构,仅需知悉:之前看到的退费说明为空是后端缺陷,现已修复,对已配置退费说明的资源会正常返回。 - ---- - -## ④ 备注 - -- 同一 Tab 的「出团注意事项」(`notices`)能否有数据,取决于**产品是否配置了「服务标准模板」**(产品域 Step5 补充信息配置项)。当前测试库暂无产品配置该模板,故 `notices` 仍为空;这属于数据配置,非接口缺陷,与本次修复无关。 -- 「行程」(`itinerary`)一直正常。 diff --git a/changelogs-v2/2026-06/02_3363_订单服务标准接口返回成品数据+notices加title-修改接口-管理后台.md b/changelogs-v2/2026-06/02_3363_订单服务标准接口返回成品数据+notices加title-修改接口-管理后台.md deleted file mode 100644 index e060d5d..0000000 --- a/changelogs-v2/2026-06/02_3363_订单服务标准接口返回成品数据+notices加title-修改接口-管理后台.md +++ /dev/null @@ -1,182 +0,0 @@ -# 二期 v3:订单详情「服务标准」Tab 接口返回真实成品数据 + notices 新增 title 字段 - -> **服务**: hl-order-service-v3(产品侧 hl-product-service-v2 配合改造,前端无感) -> **端**: 管理后台 -> **接口**: `GET /v3/admin/order/{id}/service-standard`(订单详情 - 服务标准 Tab) -> **类型**: ✏️ 修改接口(出参 `notices[]` 新增 `title` 字段 + 接口由恒空改为返回真实成品) -> **日期**: 2026-06-02 -> **关联**: Issue #3363 / PR #3364(前序 #3340 建接口、#3353 改只读快照) - ---- - -## 一句话结论 - -1. 该接口此前对**所有订单恒返 `data: null`**(产品侧没生产服务标准成品)。本次产品侧补上生产端,**新下单的订单**会返回完整服务标准成品(标题 / 简介 / 服务承诺 / 行程 / 退费说明)。 -2. 出参 `notices[]`(服务承诺条目)**每条新增 `title` 字段**。 - -> ⚠️ 仅对**部署之后新创建**的订单生效。部署前的老订单仍返 `null`(其快照未冻入成品)。开发阶段老订单可忽略。 - ---- - -## 出参结构(完整,自包含) - -`data` 类型 `ServiceStandardVO`,`data` 为 `null` 表示该订单无服务标准成品。 - -| 字段 | 类型 | 说明 | 可空 | -|---|---|---|---| -| `title` | string | 标题,固定为 `"出团服务标准·" + 产品名`;产品名为空时退化为 `"出团服务标准"` | 否 | -| `subtitle` | string | 副标题 | **本期恒 null** | -| `intro` | string | 服务标准简介 | 是(产品未配服务标准模板时为 null) | -| `notices` | NoticeItem[] | 服务承诺条目(扁平,无分组) | 是(无源时为空数组 `[]`) | -| `itinerary` | DayVO[] | 行程逐天列表 | 是(无行程时空数组) | -| `refundNotes` | RefundNoteGroup[] | 退费说明分组(按行程节点聚合) | 是(无退费说明时空数组) | - -### NoticeItem(服务承诺条目) - -| 字段 | 类型 | 说明 | 可空 | -|---|---|---|---| -| `title` | string | **本次新增**。条目主文案标题(如「专业司机」) | 是 | -| `content` | string | 正文(如「持有 A1 驾照,8 年以上驾龄」) | 是 | -| `remark` | string | 备注 / 灰色二级说明 | 是 | -| `color` | string | 文案颜色 `#RRGGBB` | 是 | -| `contactName` | string | 联系人 | 是 | -| `phone` | string | 手机号 | 是 | - -### DayVO(行程天) - -| 字段 | 类型 | 说明 | 可空 | -|---|---|---|---| -| `dayNumber` | integer | 天序号(从 1 起) | 否 | -| `dayTitle` | string | 天标题(如「第一天-接机」) | 是 | -| `remark` | string | 当天备注 | **本期恒 null** | -| `itineraryNode` | ItineraryNode[] | 当天点位列表 | 是 | - -### ItineraryNode(行程点位) - -| 字段 | 类型 | 说明 | 可空 | -|---|---|---|---| -| `nodeName` | string | 点位名称(如「呼和诺尔草原旅游区」「早餐」) | 否 | -| `description` | string | 点位描述 | 是 | -| `contactName` | string | 联系人 | **本期恒 null** | -| `phone` | string | 手机号 | **本期恒 null** | - -### RefundNoteGroup(退费说明分组) - -| 字段 | 类型 | 说明 | 可空 | -|---|---|---|---| -| `sourceName` | string | 来源点位名称(取行程节点名) | 否 | -| `intro` | string | 退费说明备注(如「苔藓为赠送项目,不退费」) | 是 | -| `items` | RefundItem[] | 退费明细列表 | 是 | - -### RefundItem(退费明细条目) - -| 字段 | 类型 | 说明 | 可空 | -|---|---|---|---| -| `title` | string | 展示标题(如「成人未参加」) | 是 | -| `amount` | number | 退费金额(赠送项目为 0) | 是 | -| `unitLabel` | string | 展示文案:`/人` `/团` `/辆` | 是 | -| `settleScope` | string | 结算粒度枚举(见下) | 是 | -| `settleScopeLabel` | string | 结算粒度中文(冻结即定格) | 是 | -| `remark` | string | 备注 | 是 | -| `effectiveFrom` | string(date) | 规则生效起日,`null` = 无限制 | 是 | -| `effectiveTo` | string(date) | 规则生效止日,`null` = 无限制 | 是 | - ---- - -## 枚举 / 数据字典 - -### settleScope(结算粒度) - -| 枚举值 | settleScopeLabel(中文) | 配套 unitLabel | -|---|---|---| -| `PER_PERSON` | 按人 | /人 | -| `PER_TEAM` | 按团 | /团 | -| `PER_VEHICLE` | 按车 | /辆 | - -> `settleScopeLabel` 在下单时随快照冻结,定格当时字典中文,资源后改不影响老订单。 - ---- - -## 请求示例 - -``` -GET /v3/admin/order/2061762043987247105/service-standard -Authorization: Bearer {adminToken} -``` - -## 响应示例(真实,测试服 dev-v3 实测) - -```json -{ - "code": 200, - "message": "成功", - "success": true, - "data": { - "title": "出团服务标准·测试核心产品-单档-固定订金", - "subtitle": null, - "intro": "全程贴心服务保障", - "notices": [ - { - "title": "专业司机", - "content": "持有A1驾照,8年以上驾龄", - "remark": "仅限指定时段", - "color": "#FF6600", - "contactName": "李师傅", - "phone": "13800000000" - } - ], - "itinerary": [ - { - "dayNumber": 1, - "dayTitle": "第一天-接机", - "remark": null, - "itineraryNode": [ - { "nodeName": "海拉尔接机", "description": null, "contactName": null, "phone": null }, - { "nodeName": "早餐", "description": "含(酒店)", "contactName": null, "phone": null } - ] - } - ], - "refundNotes": [ - { - "sourceName": "呼和诺尔草原旅游区", - "intro": "苔藓为赠送项目,不退费", - "items": [ - { - "title": "成人未参加", "amount": 44.0, "unitLabel": "/人", - "settleScope": "PER_PERSON", "settleScopeLabel": "按人", - "remark": "凭票退", "effectiveFrom": null, "effectiveTo": null - }, - { - "title": "整团未到", "amount": 100.0, "unitLabel": "/团", - "settleScope": "PER_TEAM", "settleScopeLabel": "按团", - "remark": null, "effectiveFrom": null, "effectiveTo": null - } - ] - } - ] - } -} -``` - -## 响应示例(老订单 / 无成品) - -```json -{ "code": 200, "message": "成功", "success": true, "data": null } -``` - ---- - -## 业务边界 / 注意事项 - -- `data: null` 是合法返回,表示该订单无服务标准成品(部署前老订单 / 产品未配服务标准)。 -- `intro`、`notices` 来源于产品「服务标准模板」:产品未绑模板时,`intro` 为 `null`、`notices` 为 `[]`,但 `title` / `itinerary` / `refundNotes`(有各自数据源时)仍正常返回。 -- `subtitle`、`DayVO.remark`、`ItineraryNode.contactName/phone` 本期固定为 `null`(预留字段)。 -- 成品在下单时随产品快照整体冻结,资源 / 产品后续修改不影响已下单订单。 - ---- - -## 关联 - -- Issue: https://git.1814.love:8443/wx/HL/issues/3363 -- PR: https://git.1814.love:8443/wx/HL/pulls/3364 -- 前序: #3340(建接口)/ #3353(改只读快照) diff --git a/changelogs-v2/2026-06/03_3365-3368_订单进度模型重构-修改接口-管理后台.md b/changelogs-v2/2026-06/03_3365-3368_订单进度模型重构-修改接口-管理后台.md deleted file mode 100644 index c431c72..0000000 --- a/changelogs-v2/2026-06/03_3365-3368_订单进度模型重构-修改接口-管理后台.md +++ /dev/null @@ -1,155 +0,0 @@ -# 二期 v3:订单进度模型重构 —— 派生线性 6 步 + 嵌套 progressStepper - -> **服务**: hl-order-service-v3 | **端**: 管理后台 -> **接口**: `GET /v3/admin/order`(列表)、`GET /v3/admin/order/{id}`(详情)、`POST /v3/admin/order`(创建) -> **Issue**: #3365 / #3368 | **PR**: #3366(扁平)+ #3369(嵌套) -> **日期**: 2026-06-03 -> **影响**: ⚠️ **破坏性**——删字段 + 改结构。订单进度展示统一为「派生线性 6 步 + 嵌套 progressStepper」。 - ---- - -## 一、背景 - -订单进度此前两套打架:列表用 8 步 `flowStep`,详情用 10 节点 `progressStepper`,同一订单两页进度刻度对不上。本次统一为**派生双层模型**(底层一份数据派生两视图),并修正了核单/结算判定 bug。 - ---- - -## 二、变更清单 - -| 变更 | 说明 | -|---|---| -| ❌ 删 `flowItems` | 列表不再返回 | -| ❌ 删 `progress`("X/8") | 列表不再返回 | -| 🔄 `flowStep` 语义改 | 8 步指针 → **线性 6 步**当前步序号 | -| 🔄 `flowStepTotal` | 8 → **6** | -| 🆕 `flowStepCode` | 当前步英文枚举(列表+详情) | -| 🆕 `flowStepStatus` | 当前步状态(列表+详情) | -| 🆕 `currentSubFlows`(列表) | 当前步=资源准备时的 4 子流程数组 | -| 🔄 `progressStepper`(详情) | 扁平 9 节点 → **嵌套 6 主节点**,加 `code`/`isCurrent`/`subFlows`,删 `parallel` | - -> `orderStatus`/`orderStatusName`/`flowStatus`/`flowStatusName` **不变**。 - ---- - -## 三、出参字段(进度部分) - -### 列表 `GET /v3/admin/order`(`data.records[]`,当前步散字段) - -| 字段 | 类型 | 说明 | -|---|---|---| -| `flowStep` | Integer | 当前第几步(1-6;待支付=0;已取消=null) | -| `flowStepTotal` | Integer | 总步数,固定 **6** | -| `flowStepCode` | String | 当前步英文枚举(见枚举表) | -| `flowDisplayText` | String | 当前步中文名 | -| `flowStepStatus` | String | 当前步状态:`DONE`/`PROCESSING`/`WAITING` | -| `currentSubFlows` | Array\ | **仅当前步=资源准备时非空**,否则 `null` | - -### 详情 `GET /v3/admin/order/{id}`(`data.main`) - -列表那 6 个散字段**全有**,外加完整 `progressStepper`: - -| 字段 | 类型 | 说明 | -|---|---|---| -| `progressStepper` | Array\ | 完整 6 主节点(嵌套) | - -**Node 结构**:`step`(Integer) / `code`(String) / `name`(String) / `status`(String) / `isCurrent`(Boolean) / `subFlows`(Array\,仅资源准备非空) -**SubFlow 结构**:`code`(String) / `name`(String) / `status`(String) / `label`(String) - ---- - -## 四、枚举 / 数据字典 - -### 主步 `code`(6 步) - -| code | name | 完成判定 | -|---|---|---| -| `PROFILE` | 补全信息 | 已支付 | -| `RESOURCE` | 资源准备 | 配房完成(降级,见业务边界) | -| `CONFIRM` | 确认 | 订单已确认 | -| `DEPART` | 出行 | 已出行 | -| `REVIEW` | 核单 | 已核单 | -| `SETTLE` | 结算 | 已结算 | - -### 子流程 `code`(资源准备下,4 条) - -| code | name | -|---|---| -| `HOTEL` | 配房 | -| `VEHICLE` | 配车 | -| `GUIDE` | 领队 | -| `PHOTOGRAPHER` | 摄影 | - -### `status`(主步 + 子流程通用) - -| status | 含义 | -|---|---| -| `DONE` | 已完成 | -| `PROCESSING` | 处理中 | -| `WAITING` | 待开始 | - -### `flowStep` 序号 - -`0`=待支付(步骤条未开始)|`1-6`=对应主步|`null`=已取消(前端不画进度条) - ---- - -## 五、示例 - -### 列表(定制中、配房完成、配车进行中) - -```jsonc -{ - "orderStatus": "CUSTOMIZING", "orderStatusName": "定制中", - "flowStep": 2, "flowStepTotal": 6, - "flowStepCode": "RESOURCE", "flowDisplayText": "资源准备", "flowStepStatus": "PROCESSING", - "currentSubFlows": [ - {"code":"HOTEL","name":"配房","status":"DONE","label":"已完成"}, - {"code":"VEHICLE","name":"配车","status":"PROCESSING","label":"处理中"}, - {"code":"GUIDE","name":"领队","status":"WAITING","label":"待开始"}, - {"code":"PHOTOGRAPHER","name":"摄影","status":"WAITING","label":"待开始"} - ] -} -``` - -### 详情 progressStepper(同一订单) - -```jsonc -"progressStepper": [ - {"step":1,"code":"PROFILE","name":"补全信息","status":"DONE","isCurrent":false,"subFlows":null}, - {"step":2,"code":"RESOURCE","name":"资源准备","status":"PROCESSING","isCurrent":true,"subFlows":[ - {"code":"HOTEL","name":"配房","status":"DONE","label":"已完成"}, - {"code":"VEHICLE","name":"配车","status":"PROCESSING","label":"处理中"}, - {"code":"GUIDE","name":"领队","status":"WAITING","label":"待开始"}, - {"code":"PHOTOGRAPHER","name":"摄影","status":"WAITING","label":"待开始"} - ]}, - {"step":3,"code":"CONFIRM","name":"确认","status":"WAITING","isCurrent":false,"subFlows":null}, - {"step":4,"code":"DEPART","name":"出行","status":"WAITING","isCurrent":false,"subFlows":null}, - {"step":5,"code":"REVIEW","name":"核单","status":"WAITING","isCurrent":false,"subFlows":null}, - {"step":6,"code":"SETTLE","name":"结算","status":"WAITING","isCurrent":false,"subFlows":null} -] -``` - -### 已取消订单 - -```jsonc -{ "flowStep": null, "flowStepCode": null, "flowDisplayText": "已取消", - "flowStepStatus": null, "currentSubFlows": null } -// 详情 progressStepper 返回空数组 [] -``` - ---- - -## 六、业务边界 / 前端注意 - -1. **当前步两个口子都能拿**:列表用 `flowStep`;详情用 `isCurrent==true` 的节点(和 `flowStep` 指向同一步)。 -2. **⚠️ 降级现状**:资源准备步现**只判配房**——配车/领队/摄影的子状态回写链路尚未接通,所以 `VEHICLE` 子流程恒 `PROCESSING`、`GUIDE`/`PHOTOGRAPHER` 恒 `WAITING`,暂不会变 `DONE`。资源准备只要配房 `DONE` 即整步完成。回写接通后会纳入 4 线全 DONE。 -3. **⚠️ 进度展示请用 `flowStep`/`flowDisplayText`,不要用 `flowStatusName`**——`flowStatus` 在"定制中"阶段恒为 `AWAITING_PROFILE`(待补全信息)不流转,用它展示进度会一直显示"待补全信息",不准。 -4. `currentSubFlows`/`subFlows` 只在资源准备步有值,其余步为 `null`,前端渲染需判空。 - ---- - -## 七、关联 - -- **Issue**: [#3365](https://git.1814.love:8443/wx/HL/issues/3365)、[#3368](https://git.1814.love:8443/wx/HL/issues/3368) -- **PR**: [#3366](https://git.1814.love:8443/wx/HL/pulls/3366)(派生 6 步 + 修 reviewStatus bug)、[#3369](https://git.1814.love:8443/wx/HL/pulls/3369)(嵌套 progressStepper) -- **设计文档**: ORDER-STATE-MACHINE V1.1 §2.2、API-SPEC v5.56 diff --git a/changelogs-v2/2026-06/03_3389_资源默认收费+收费否禁价格日历+退费说明接入-管理后台.md b/changelogs-v2/2026-06/03_3389_资源默认收费+收费否禁价格日历+退费说明接入-管理后台.md deleted file mode 100644 index 7bb7d02..0000000 --- a/changelogs-v2/2026-06/03_3389_资源默认收费+收费否禁价格日历+退费说明接入-管理后台.md +++ /dev/null @@ -1,124 +0,0 @@ -# 【需求·管理后台】资源默认收费 + 收费=否禁价格日历 + 退费说明接入(景区 / 活动 / 酒店) - -> PR: #3392 #3395(工单 #3389) 服务: hl-resource-service | 更新时间: 2026-06-03 -> 存放目录: changelogs-v2/2026-06/ 影响范围: 管理后台「资源管理 / 景区·游玩项目·酒店」编辑页 -> 状态: 已合并 dev-v3 + 测试服部署双实例 + API 实测通过 - -## ⚠️ 关键说明 - -来自景区编辑页的 3 点反馈,后端已处理(部分是前端没接已实现的接口): - -1. **默认收费**:景区 / 游玩项目 / 酒店新建时「是否收费」默认改为 **收费(1)**。前端开关初始态请置为「收费」开。 -2. **收费=否 → 没有价格日历**:前端在「是否收费=否」时**隐藏价格日历区**;后端已加兜底——给收费=否的景区 / 活动设价会被拒(错误码 **390901**)。 -3. **价格日历不做合并接口**:基本信息与价格日历仍是两个接口,前端保存时**分两次调**(先存基本信息,再批量设价)。 -4. **退费说明**:后端早已实现(`/admin/refund-note`,覆盖景区+活动),**前端编辑页缺这块 UI**,本文补齐接口契约请接入。 - -服务资源 ServiceItem 的「是否收费」是 `isPaid`+真实定价语义(另有定价校验),**不在本次默认收费范围**,保持现状。 - -## 1. 默认收费(景区 / 活动 / 酒店) - -新建资源不传 `isCharged` 时,后端默认 **1=收费**;前端显式传 `0` 仍尊重为「否」。 - -| 资源 | 字段 | 新建接口 | 默认值 | -|------|------|---------|--------| -| 景区 Scenic | `isCharged` | POST `/admin/scenic/spot` | 1=收费 | -| 游玩项目 Activity | `isCharged` | POST `/admin/activity/item` | 1=收费 | -| 酒店 Hotel | `isCharged` | POST `/admin/hotel/item` | 1=收费 | - -前端动作:新建表单「是否收费」开关初始置「收费(开)」。编辑回显仍读后端返回的 `isCharged`。 - -## 2. 收费=否 → 无价格日历 - -### 2.1 前端 -「是否收费=否」时**隐藏价格日历区**(不展示、不允许设价)。 - -### 2.2 后端兜底(防脏数据) -对收费=否(`isCharged=0`)的景区 / 活动调批量设价接口,后端直接拒绝: - -```bash -# 收费=否的景区设价 → 被拦截 -curl -X PUT -H "Authorization: Bearer " -H "Content-Type: application/json" \ - -d '{"startDate":"2026-07-01","endDate":"2026-07-03","costPrice":100,"status":1}' \ - "https://api.test.1814.love:9443/admin/scenic/spot/{scenicId}/prices" -``` - -响应(测试服实测): - -```json -{ "code": 390901, "message": "资源未设为收费,不可设置价格日历" } -``` - -- 仅拦**批量设价** `PUT /spot/{id}/prices`;查询、改可售状态、清除价格不受影响。 -- 酒店价格日历是 room-type 级,本期不做后端兜底,前端按 2.1 隐藏即可。 - -## 3. 价格日历保存方式(分两次调,不合并接口) - -经确认**不新增合并接口**。前端编辑保存时分两次调用现有接口: - -1. 先存基本信息:`PUT /admin/scenic/spot/{scenicId}` -2. 再批量设价:`PUT /admin/scenic/spot/{scenicId}/prices`(仅在收费=是时调) - -## 4. 退费说明接入(景区 / 活动) - -> ⚠️ **本节已废弃(2026-06-03 更新)**:退费说明**已改为融合进资源编辑接口**(不再走独立 `/admin/refund-note`),并扩展支持**服务 SERVICE**。前端请按新 changelog `03_3406_退费说明融合进资源编辑接口-景区活动服务-管理后台.md` 接入,**勿按下方独立接口接**。下方内容仅作历史留存。 - -后端模块早已上线(PR #3273 等),前端编辑页缺 UI,请接入。仅覆盖 **SCENIC / ACTIVITY** 两类。 - -### 4.1 接口表 - -| 操作 | 方法 / 路径 | 参数 | -|------|------------|------| -| 查询 | GET `/admin/refund-note` | query: `resourceType`(SCENIC/ACTIVITY) + `resourceId`。未配置返 `data:null`(不报错) | -| 保存(upsert) | PUT `/admin/refund-note` | body: RefundNoteSaveReqVO(按 resourceType+resourceId upsert 整块) | -| 删除(软删) | DELETE `/admin/refund-note` | query: `resourceType` + `resourceId`(幂等,未配置也返 code:200 data:false) | - -### 4.2 保存请求体(RefundNoteSaveReqVO) - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| resourceType | String | 是 | SCENIC / ACTIVITY | -| resourceId | Long | 是 | 关联资源 ID | -| intro | String | 否 | 资源级备注(≤255 字),如「苔藓为赠送项目,不退费」 | -| items | List | 是 | 退费明细,至少 1 条、最多 50 条 | - -items[] 每项(RefundNoteItemVO): - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| title | String | 是 | 展示标题,如「成人未参加」 | -| amount | BigDecimal | 是 | 退费金额(赠送项目填 0) | -| unitLabel | String | 否 | 展示文案 /人 /团 /辆 | -| settleScope | String | 否 | 结算粒度 PER_PERSON / PER_TEAM / PER_VEHICLE | -| settleScopeLabel | String | — | 结算粒度中文名(出参后端拼,入参可省) | -| remark | String | 否 | 备注,如「仅限儿童」 | -| effectiveFrom | LocalDate | 否 | 规则生效起日(null=无限制) | -| effectiveTo | LocalDate | 否 | 规则生效止日(null=无限制) | - -### 4.3 示例 - -```bash -# 查询景区退费说明 -curl -H "Authorization: Bearer " \ - "https://api.test.1814.love:9443/admin/refund-note?resourceType=SCENIC&resourceId=3001000000000000019" - -# 保存 -curl -X PUT -H "Authorization: Bearer " -H "Content-Type: application/json" \ - -d '{ - "resourceType": "SCENIC", - "resourceId": 3001000000000000019, - "intro": "苔藓为赠送项目,不退费", - "items": [ - {"title":"成人未参加","amount":44.00,"unitLabel":"/人","settleScope":"PER_PERSON","remark":"仅限成人"} - ] - }' \ - "https://api.test.1814.love:9443/admin/refund-note" -``` - -查询响应(RefundNoteRespVO):`noteId / resourceType / resourceId / intro / items[] / createTime / updateTime`,`noteId` 字符串透传防精度丢失,`settleScopeLabel` 后端回填中文。 - -## 5. 前端动作清单 - -1. 景区 / 活动 / 酒店新建表单「是否收费」开关默认置「收费」。 -2. 「是否收费=否」时隐藏价格日历区(编辑页 + 新建页)。 -3. 保存仍分两次调(基本信息 + 价格日历),价格日历仅收费=是时调。 -4. 景区 / 活动编辑页接入「退费说明」模块(GET/PUT/DELETE `/admin/refund-note`)。 diff --git a/changelogs-v2/2026-06/03_3390_图标库模块-新增接口-管理后台+小程序.md b/changelogs-v2/2026-06/03_3390_图标库模块-新增接口-管理后台+小程序.md deleted file mode 100644 index da42bbf..0000000 --- a/changelogs-v2/2026-06/03_3390_图标库模块-新增接口-管理后台+小程序.md +++ /dev/null @@ -1,559 +0,0 @@ -# 【新增接口·管理后台 + 小程序】图标库模块 11 接口(全模块首次推送 changelog) - -> **PR**: #3396(模块主体)+ #3398 / #3399(mp 端点公开化)+ #3401(上线后审计加固) -> **服务**: hl-user-service | **更新时间**: 2026-06-03 -> -> **存放目录**: `changelogs-v2/2026-06/` -> **影响范围**: 管理后台「图标库」管理页(分类 + 图标 CRUD + SVG 上传解析);小程序 / 前端 图标渲染(公开只读查询) - ---- - -## ⚠️ 关键说明 - -图标库是后台统一维护的一套 SVG 图标,结构类似数据字典:一级「图标分类」(`icon_category`) + 二级「图标项」(`icon_item`),图标项归属某分类编码 `categoryCode`。 - -**SVG 直接存库(不走 OSS)**:图标内容是 SVG 字符串,直存数据库 `svg_content`(MEDIUMTEXT,单图标后端限 256KB)。前端拿到 `svgContent` 直接渲染。 - -**新增图标分两步**:先调 §3.5 `POST /admin/icon/parse-svg` 上传 `.svg` 文件,后端读成字符串并做安全校验后**只返回字符串、不落库**;前端拿到 `svgContent` 再连同 `color` / `size` 等填进保存表单调 §3.6 `POST /admin/icon/item` 保存。 - -**mp 查询公开无需 token**:§3.10 / §3.11 是 UI 参考数据(同字典),无需登录即可访问,只返回 `status=ACTIVE` 的分类与图标,且分类被禁用时其图标也不再返回。 - -**SVG 安全校验**:上传 / 保存的 SVG 经服务端 XXE-safe 解析校验,拒绝含 ` -``` - ---- - -## 关联字典 - -| 字典类型 | 说明 | 用途 | -|---------|------|------| -| room_category | 房型分类:STANDARD-标准间, DELUXE-豪华间, SUITE-套房, FAMILY-家庭房 | 房型列表展示 | -| bed_type | 床型:KING-大床, TWIN-双床, TATAMI-榻榻米 | 房型列表展示 | -| window_type | 窗户:WITH_WINDOW-有窗, NO_WINDOW-无窗, SKYLIGHT-天窗 | 房型列表展示 | - ---- - -## 删掉的字段 - -当前弹窗中的"房间数量"字段应该**删除**——后端按家庭分配,每个家庭一间房,不需要单独设置数量。如果一个家庭需要2间房,就添加2行同样的家庭。 - ---- - -🤖 Generated with [Claude Code](https://claude.com/claude-code) diff --git a/changelogs/2026-03/2026-03-20_0908_97d461c_feat.md b/changelogs/2026-03/2026-03-20_0908_97d461c_feat.md deleted file mode 100644 index 66f2be7..0000000 --- a/changelogs/2026-03/2026-03-20_0908_97d461c_feat.md +++ /dev/null @@ -1,137 +0,0 @@ -# 接口变更记录 — 2026-03-20 09:08 - -> **提交** `97d461c` · **作者** wx · **时间** 2026-03-20 09:08:43 +0800 -> -> feat: 法大大合同平台 + 订单超时通知 + 第二期需求文档 + 软著材料 - -## 变更总览 - -- **合同服务** - - ContractCallback (+1) -- **小程序聚合服务** - - MpOrder (+1) -- **订单服务** - - InternalMpOrder (+1) - ---- - -## 合同服务 - -### ContractCallback - -> 📖 **接口文档**: [http://192.168.100.236:8095/doc.html](http://192.168.100.236:8095/doc.html) → 标签 **「【回调接口】合同回调」** - -### 🆕 `POST` /contract/callback/fadada — 法大大合同状态回调 - -> 接收法大大电子合同平台的签署状态回调。签署完成/撤销/拒签时法大大推送事件到此接口 - -**响应** `ResponseEntity` - ---- - -## 小程序聚合服务 - -### MpOrder - -> 📖 **接口文档**: [http://192.168.100.236:8086/doc.html](http://192.168.100.236:8086/doc.html) → 标签 **「C端 - 订单接口」** - -### 🆕 `POST` /mp/order/{orderId}/urge — 催单 - -> 提醒定制师尽快处理订单内部流程,通过企业微信发送消息。每个订单2小时内只能催一次 - -**参数** - - - `{orderId}` (`Long`) — 路径参数:订单ID - -**响应** `Result` - ---- - -## 订单服务 - -### InternalMpOrder - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 标签 **「【内部接口】小程序订单(Feign调用)」** - -### 🆕 `POST` /internal/mp/order/{orderId}/urge — 催单 - -> 用户催单,通过企微消息提醒定制师尽快处理订单内部流程。 - -**参数** - - - `{orderId}` (`Long`) — 路径参数 - - `userId` (`Long`) — 查询参数 - -**响应** `Result` - ---- - -## 📦 其他数据对象变更 - -> 以下变更未直接关联到本次接口变更,但可能影响现有接口的请求/响应 - -### 用户服务 - -#### ✏️ TravelerRequest - - - ✏️ `birthday`: 说明 "出生日期(必填,后端根据此字段自动判断人员类型)" → "出生日期(后端根据此字段自动判断人员类型,未传则默认ADULT)" - -### 订单服务 - -#### ✏️ CreateOrderRequest - - - ✏️ `birthday`: 说明 "出生日期(必填,后端根据此字段自动判断人员类型)" → "出生日期(后端根据此字段自动判断人员类型,未传则默认ADULT)" - -
    -📁 全部变更文件 (点击展开) - -``` -M CLAUDE.md -M docs/CLAUDE_WORKFLOW/README.md -A "docs/architecture/\346\210\277\347\256\241\346\234\215\345\212\241\346\236\266\346\236\204\350\256\276\350\256\241.md" -A "docs/architecture/\347\254\254\344\272\214\346\234\237\346\236\266\346\236\204\346\200\273\350\247\210.md" -A "docs/architecture/\350\275\246\351\230\237\346\234\215\345\212\241\346\236\266\346\236\204\350\256\276\350\256\241.md" -A docs/mindmap-v1.27-extracted.md -A "docs/requirements/\345\217\270\346\234\272\347\253\257\345\274\202\345\270\270\345\244\204\347\220\206\344\270\216\346\213\222\345\215\225\351\234\200\346\261\202\350\247\204\346\240\274.md" -A "docs/requirements/\345\217\270\346\234\272\347\253\257\346\240\270\345\277\203\346\265\201\347\250\213\351\234\200\346\261\202\350\247\204\346\240\274.md" -A "docs/requirements/\345\217\270\346\234\272\347\256\241\347\220\206\344\270\216\346\216\210\346\235\203\347\237\251\351\230\265\351\234\200\346\261\202\350\247\204\346\240\274.md" -A "docs/requirements/\346\210\277\347\256\241\345\220\216\345\217\260v1.27\344\274\230\345\214\226\351\234\200\346\261\202\350\247\204\346\240\274.md" -A "docs/requirements/\346\210\277\347\256\241\346\234\215\345\212\241\351\234\200\346\261\202\350\247\204\346\240\274.md" -A "docs/requirements/\346\216\222\347\217\255\344\270\216\346\224\266\345\205\245\351\234\200\346\261\202\350\247\204\346\240\274.md" -A "docs/requirements/\346\264\276\345\215\225\350\260\203\345\272\246\346\250\241\345\235\227\351\234\200\346\261\202\350\247\204\346\240\274.md" -A "docs/requirements/\346\266\210\346\201\257\345\256\232\344\275\215\344\270\216\345\272\224\346\200\245\351\234\200\346\261\202\350\247\204\346\240\274.md" -A "docs/requirements/\347\254\254\344\272\214\346\234\237\347\273\237\344\270\200\346\225\260\346\215\256\345\255\227\345\205\270.md" -A "docs/requirements/\350\257\204\345\210\206\344\270\216\345\237\271\350\256\255\351\234\200\346\261\202\350\247\204\346\240\274.md" -A "docs/requirements/\350\260\203\345\272\246\345\244\247\347\233\230\351\234\200\346\261\202\350\247\204\346\240\274.md" -A "docs/requirements/\350\267\257\345\206\265\351\242\204\350\255\246\347\263\273\347\273\237\351\234\200\346\261\202\350\247\204\346\240\274.md" -A "docs/requirements/\350\275\246\350\276\206\347\256\241\347\220\206\345\215\207\347\272\247\351\234\200\346\261\202\350\247\204\346\240\274.md" -A "docs/requirements/\350\275\246\351\230\237\347\274\226\347\273\204\344\270\216\345\215\217\345\220\214\350\260\203\345\272\246\351\234\200\346\261\202\350\247\204\346\240\274.md" -A "docs/zzq/01-\347\224\263\350\257\267\346\235\220\346\226\231\346\270\205\345\215\225.md" -A "docs/zzq/02-\350\272\253\344\273\275\350\257\201\346\230\216/\350\257\267\345\234\250\346\255\244\346\224\276\345\205\245\350\272\253\344\273\275\350\257\201\346\230\216\346\235\220\346\226\231.txt" -A "docs/zzq/03-\346\272\220\344\273\243\347\240\201.txt" -A "docs/zzq/04-\350\275\257\344\273\266\350\257\264\346\230\216\344\271\246.md" -A docs/zzq/generate_source_code.py -M hl-common/src/main/java/com/hulalv/common/exception/GlobalExceptionHandler.java -M hl-contract-service/src/main/java/com/hulalv/contract/config/ContractPlatformProperties.java -M hl-contract-service/src/main/java/com/hulalv/contract/controller/ContractCallbackController.java -A hl-contract-service/src/main/java/com/hulalv/contract/platform/fadada/FadadaApiClient.java -M hl-contract-service/src/main/java/com/hulalv/contract/platform/fadada/FadadaContractPlatform.java -A hl-contract-service/src/main/java/com/hulalv/contract/platform/fadada/FadadaSignatureUtil.java -M hl-contract-service/src/main/java/com/hulalv/contract/service/ContractCallbackService.java -M hl-contract-service/src/main/java/com/hulalv/contract/service/ContractService.java -A hl-contract-service/src/test/java/com/hulalv/contract/platform/fadada/FadadaApiClientTest.java -M hl-contract-service/src/test/java/com/hulalv/contract/platform/fadada/FadadaContractPlatformTest.java -A hl-contract-service/src/test/java/com/hulalv/contract/platform/fadada/FadadaSignatureUtilTest.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpOrderController.java -M hl-mp-service/src/main/java/com/hulalv/mp/feign/MpOrderFeignClient.java -M hl-mp-service/src/main/java/com/hulalv/mp/feign/MpOrderFeignFallbackFactory.java -M hl-order-service/src/main/java/com/hulalv/order/controller/InternalMpOrderController.java -M hl-order-service/src/main/java/com/hulalv/order/dto/CreateOrderRequest.java -M hl-order-service/src/main/java/com/hulalv/order/service/NotificationEventHelper.java -M hl-order-service/src/main/java/com/hulalv/order/service/OrderService.java -M hl-order-service/src/main/java/com/hulalv/order/service/OrderTodoService.java -M hl-user-service/src/main/java/com/hulalv/user/dto/TravelerRequest.java -M nacos-config/hl-contract-service-dev.yml -A scripts/gen_copyright_pdf.py -``` -
    \ No newline at end of file diff --git a/changelogs/2026-03/2026-03-20_1127_508b792_feat.md b/changelogs/2026-03/2026-03-20_1127_508b792_feat.md deleted file mode 100644 index bc319e1..0000000 --- a/changelogs/2026-03/2026-03-20_1127_508b792_feat.md +++ /dev/null @@ -1,111 +0,0 @@ -# 接口变更记录 — 2026-03-20 11:27 - -> **提交** `508b792` · **作者** wx · **时间** 2026-03-20 11:27:32 +0800 -> -> feat: 小程序酒店详情返回房型列表 + 新增房型详情接口 - -## 变更总览 - -- **小程序聚合服务** - - MpHotel (+1) -- **资源服务** - - InternalMpHotel (+1) - ---- - -## 小程序聚合服务 - -### MpHotel - -> 📖 **接口文档**: [http://192.168.100.236:8086/doc.html](http://192.168.100.236:8086/doc.html) → 标签 **「C端 - 酒店接口」** - -### 🆕 `GET` /mp/hotel/room-type/{roomTypeId} — 房型详情 - -> 获取房型完整信息,包含封面、轮播图、视频等素材URL,以及床型、面积、设施等详细信息。 - -**参数** - - - `{roomTypeId}` (`Long`) — 路径参数:房型ID - -**响应** `Result>` - ---- - -## 资源服务 - -### InternalMpHotel - -> 📖 **接口文档**: [http://192.168.100.236:8082/doc.html](http://192.168.100.236:8082/doc.html) → 标签 **「【内部接口】小程序酒店(Feign调用)」** - -### 🆕 `GET` /internal/mp/hotel/room-type/{roomTypeId} — C端房型详情 - -> 【仅限内部Feign调用】供mp-service获取房型完整详情,包含封面、轮播图、视频等素材URL。 - -**关联字典**: -- room_category:房型分类 -- bed_type:床型 -- window_type:窗户类型 -- bathroom_type:卫浴类型 -- room_facility:房间设施 - -**参数** - - - `{roomTypeId}` (`Long`) — 路径参数:房型ID - -**响应** `Result` - -| 字段 | 类型 | 说明 | -| --- | --- | --- | -| `roomTypeId` | `String` | 房型ID | -| `hotelId` | `String` | 所属酒店ID | -| `name` | `String` | 房型名称 | -| `roomCategory` | `String` | 房型分类 | -| `roomArea` | `BigDecimal` | 房间面积(平方米) | -| `bedType` | `String` | 床型 | -| `bedCount` | `Integer` | 床位数量 | -| `bedSize` | `String` | 床尺寸 | -| `maxOccupancy` | `Integer` | 最多入住人数 | -| `floorInfo` | `String` | 楼层信息 | -| `windowType` | `String` | 窗型 | -| `bathroomType` | `String` | 卫浴类型 | -| `roomFacilities` | `String` | 房间设施(JSON) | -| `basePrice` | `BigDecimal` | 基础成本价(元) | -| `totalRooms` | `Integer` | 总房间数 | -| `description` | `String` | 房型描述 | -| `coverMaterialId` | `String` | 封面素材ID | -| `coverUrl` | `String` | 封面图URL | -| `bannerMaterialIds` | `List` | 横幅素材ID列表 | -| `bannerUrls` | `List` | 横幅图URL列表 | -| `videoMaterialId` | `String` | 视频素材ID | -| `videoUrl` | `String` | 视频URL | -| `sortOrder` | `Integer` | 排序权重 | -| `status` | `Integer` | 状态:0=禁用 1=启用 | -| `approvalNo` | `String` | 审批单号 | -| `pendingStatus` | `Integer` | 待审批目标状态 | -| `createdAt` | `LocalDateTime` | 创建时间 | -| `updatedAt` | `LocalDateTime` | 更新时间 | - ---- - -## 📦 其他数据对象变更 - -> 以下变更未直接关联到本次接口变更,但可能影响现有接口的请求/响应 - -### 资源服务 - -#### ✏️ HotelVO - - - 🆕 `roomTypes` (`List`) — 房型列表(C端详情返回,仅包含已启用房型) - -
    -📁 全部变更文件 (点击展开) - -``` -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpHotelController.java -M hl-mp-service/src/main/java/com/hulalv/mp/feign/MpResourceFeignClient.java -M hl-mp-service/src/main/java/com/hulalv/mp/feign/MpResourceFeignFallbackFactory.java -M hl-resource-service/src/main/java/com/hulalv/resource/hotel/controller/InternalMpHotelController.java -M hl-resource-service/src/main/java/com/hulalv/resource/hotel/vo/HotelVO.java -M nacos-config/hl-contract-service-dev.yml -``` -
    \ No newline at end of file diff --git a/changelogs/2026-03/2026-03-20_1641_f59d78d_refactor_pri.md b/changelogs/2026-03/2026-03-20_1641_f59d78d_refactor_pri.md deleted file mode 100644 index 67d6eae..0000000 --- a/changelogs/2026-03/2026-03-20_1641_f59d78d_refactor_pri.md +++ /dev/null @@ -1,50 +0,0 @@ -# 接口变更记录 — 2026-03-20 16:41 - -> **提交** `f59d78d` · **作者** wx · **时间** 2026-03-20 16:41:03 +0800 -> -> refactor: 移除定价模式(pricingMode)字段,价格统一在价格日历中设置 - -## 变更总览 - - ---- - -## 📦 其他数据对象变更 - -> 以下变更未直接关联到本次接口变更,但可能影响现有接口的请求/响应 - -### 产品服务 - -#### ✏️ PricingRequest - - - ❌ ~~`pricingMode`~~ (`String`) — 定价模式:AUTO=根据行程资源价格自动计算 MANUAL=手动在价格日历设置每日价格 CUSTOM=定制产品整单定价 - - ✏️ `profitMode`: 说明 "利润模式(AUTO模式下生效):FIXED=在成本基础上加固定金额 PERCENT=在成本基础上按百分比加价" → "利润模式:FIXED=在成本基础上加固定金额 PERCENT=在成本基础上按百分比加价" - - ✏️ `customTotalPrice`: 说明 "定制产品总价(CUSTOM定价模式下使用,代表整单总价)" → "定制产品总价(CUSTOM/ROUTE产品使用,代表整单总价)" - -#### ✏️ ProductPricingVO - - - ❌ ~~`pricingMode`~~ (`String`) — 定价模式:AUTO=自动计算 MANUAL=手动定价 CUSTOM=定制定价 - - ✏️ `customTotalPrice`: 说明 "定制产品总价(CUSTOM模式下使用)" → "定制产品总价(CUSTOM/ROUTE产品使用)" - -### 小程序聚合服务 - -#### ✏️ MpCustomProductDetailVO - - - ❌ ~~`pricingMode`~~ (`String`) — 定价模式:AUTO=自动计算 MANUAL=手动定价 CUSTOM=定制定价 - -
    -📁 全部变更文件 (点击展开) - -``` -M hl-mp-service/src/main/java/com/hulalv/mp/vo/MpCustomProductDetailVO.java -M hl-product-service/src/main/java/com/hulalv/product/constant/ProductConstants.java -M hl-product-service/src/main/java/com/hulalv/product/controller/PricingController.java -M hl-product-service/src/main/java/com/hulalv/product/dto/PricingRequest.java -M hl-product-service/src/main/java/com/hulalv/product/entity/ProductPricing.java -M hl-product-service/src/main/java/com/hulalv/product/service/ProductPricingService.java -M hl-product-service/src/main/java/com/hulalv/product/service/ProductService.java -M hl-product-service/src/main/java/com/hulalv/product/vo/ProductPricingVO.java -M hl-product-service/src/test/java/com/hulalv/product/service/ProductPricingServiceTest.java -A sql/remove_pricing_mode.sql -``` -
    \ No newline at end of file diff --git a/changelogs/2026-03/2026-03-20_1645_297ce93_feat.md b/changelogs/2026-03/2026-03-20_1645_297ce93_feat.md deleted file mode 100644 index 5564e55..0000000 --- a/changelogs/2026-03/2026-03-20_1645_297ce93_feat.md +++ /dev/null @@ -1,379 +0,0 @@ -# 接口变更记录 — 2026-03-20 16:45 - -> **提交** `297ce93` · **作者** wx · **时间** 2026-03-20 16:45:40 +0800 -> -> feat: 订单自动保险+合同 + 产品合同/保险字段 + 房间升级预览 + 订单价差服务 - -## 变更总览 - -- **产品服务** - - InternalProduct (+1) -- **保险服务** - - InternalInsurance (+1) -- **合同服务** - - InternalContract (+2) -- **订单服务** - - AdminOrder (+1, 改1) - - InternalPaymentOrder (+1) -- **资源服务** - - InternalResourcePrice (+1) - ---- - -## 产品服务 - -### InternalProduct - -> 📖 **接口文档**: [http://192.168.100.236:8085/doc.html](http://192.168.100.236:8085/doc.html) → 标签 **「【内部接口】产品(Feign调用)」** - -### 🆕 `GET` /internal/product/{productId}/automation-config - -**参数** - - - `{productId}` (`Long`) — 路径参数 - -**响应** `Result` - -| 字段 | 类型 | 说明 | -| --- | --- | --- | -| `insuranceSchemeId` | `Long` | | -| `contractPlatform` | `String` | | -| `contractTemplateCode` | `String` | | -| `contractMode` | `String` | | -| `signatoryMode` | `Integer` | | -| `agencyCode` | `String` | | -| `disputeResolution` | `Integer` | | -| `supplementaryClause` | `String` | | -| `transactorName` | `String` | | -| `transactorPhone` | `String` | | -| `productName` | `String` | | -| `destinationCity` | `String` | | -| `departureCity` | `String` | | -| `tripDays` | `Integer` | | -| `tripNights` | `Integer` | | - ---- - -## 保险服务 - -### InternalInsurance - -> 📖 **接口文档**: [http://192.168.100.236:8098/doc.html](http://192.168.100.236:8098/doc.html) → 标签 **「【内部接口】保险(Feign调用)」** - -### 🆕 `POST` /internal/insurance/auto-purchase — 按方案自动投保(内部调用) - -> 内部服务间调用。根据保险方案自动为订单所有出行人投保: - -**响应** `Result` - -| 字段 | 类型 | 说明 | -| --- | --- | --- | -| `success` | `boolean` | 是否全部成功 | -| `purchasedCount` | `int` | 成功投保段数 | -| `failedCount` | `int` | 失败段数 | -| `failureReason` | `String` | 失败原因(部分失败或全部失败时返回第一个错误) | - ---- - -## 合同服务 - -### InternalContract - -> 📖 **接口文档**: [http://192.168.100.236:8095/doc.html](http://192.168.100.236:8095/doc.html) → 标签 **「【内部接口】合同(Feign调用)」** - -### 🆕 `POST` /internal/contract/create — 创建合同(内部调用) - -> 内部服务调用创建合同,adminId固定为0表示系统自动创建。返回contractId和status - -**请求体** `CreateContractRequest` - -| 字段 | 类型 | 说明 | -| --- | --- | --- | -| `orderId` | `Long` | 订单ID | -| `contractType` | `String` | 合同类型: TOUR-旅游合同(默认), INSURANCE-保险单 | -| `platform` | `String` | 合同平台(字典:contract_platform): 12301-全国旅游监管平台, FADADA-法大大, ESIGN-e签宝, TENCENT_ESS-腾讯电子签。不传则根据模板自动确定 | -| `templateCode` | `String` | 模板编码 | -| `agencyCode` | `String` | 旅行社编号(可选,默认使用配置值) | -| `transactorName` | `String` | 经办人姓名 | -| `transactorPhone` | `String` | 经办人电话 | -| `destination` | `String` | 目的地 | -| `routeName` | `String` | 线路名称 | -| `days` | `Integer` | 行程天数 | -| `nights` | `Integer` | 住宿晚数 | -| `departureDate` | `LocalDate` | 出发日期 | -| `returnDate` | `LocalDate` | 返回日期 | -| `departureCity` | `String` | 出发城市 | -| `groupId` | `String` | 团号 | -| `signatoryName` | `String` | 签署人姓名 | -| `signatoryPhone` | `String` | 签署人电话 | -| `signatoryIdNumber` | `String` | 签署人证件号码 | -| `signingPlace` | `String` | 签约地点 | -| `adultCost` | `BigDecimal` | 成人费用 | -| `childCost` | `BigDecimal` | 儿童费用 | -| `totalAmount` | `BigDecimal` | 合同总金额 | -| `contactName` | `String` | 联系人姓名 | -| `contactPhone` | `String` | 联系人电话 | -| `supplementaryClause` | `String` | 补充约定内容 | -| `vehicleModel` | `String` | 车型名称(产品快照) | -| `travelers` | `List` | 出行人列表 | -| `name` | `String` | 姓名 | -| `gender` | `String` | 性别: male/female | -| `age` | `Integer` | 年龄 | -| `idCardNo` | `String` | 证件号码 | -| `phone` | `String` | 手机号 | -| `health` | `String` | 健康信息 | - -**响应** `Result>` - -### 🆕 `POST` /internal/contract/report — 报备合同(内部调用) - -> 内部服务调用报备合同(同步模式),adminId固定为0表示系统自动创建。返回contractId和status - -**请求体** `ReportContractRequest` - -| 字段 | 类型 | 说明 | -| --- | --- | --- | -| `orderId` | `Long` | 订单ID | -| `contractType` | `String` | 合同类型: TOUR-旅游合同(默认), INSURANCE-保险单 | -| `platform` | `String` | 合同平台(字典:contract_platform): 12301-全国旅游监管平台, FADADA-法大大, ESIGN-e签宝, TENCENT_ESS-腾讯电子签 | -| `templateCode` | `String` | 模板编码 | -| `agencyCode` | `String` | 旅行社编号 | -| `transactorName` | `String` | 经办人姓名 | -| `transactorPhone` | `String` | 经办人电话 | -| `destination` | `String` | 目的地 | -| `routeName` | `String` | 线路名称 | -| `days` | `Integer` | 行程天数 | -| `nights` | `Integer` | 住宿晚数 | -| `departureDate` | `LocalDate` | 出发日期 | -| `returnDate` | `LocalDate` | 返回日期 | -| `departureCity` | `String` | 出发城市 | -| `groupId` | `String` | 团号 | -| `signatoryName` | `String` | 签署人姓名 | -| `signatoryPhone` | `String` | 签署人电话 | -| `signatoryIdNumber` | `String` | 签署人证件号码 | -| `signingPlace` | `String` | 签约地点 | -| `adultCost` | `BigDecimal` | 成人费用 | -| `childCost` | `BigDecimal` | 儿童费用 | -| `totalAmount` | `BigDecimal` | 合同总金额 | -| `contactName` | `String` | 联系人姓名 | -| `contactPhone` | `String` | 联系人电话 | -| `supplementaryClause` | `String` | 补充约定内容 | - -**响应** `Result>` - ---- - -## 订单服务 - -### AdminOrder - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 分组 **「3.1 订单管理」** → 标签 **「管理端订单接口」** - -### 🆕 `POST` /admin/order/{orderId}/hotel-assignment/preview — 配房升级差价预览 - -> 预览配房时的房型升级差价(不创建记录)。 - -**参数** - - - `{orderId}` (`Long`) — 路径参数:订单ID - -**响应** `Result` - -| 字段 | 类型 | 说明 | -| --- | --- | --- | -| `details` | `List` | 各天差价明细 | -| `totalDiff` | `BigDecimal` | 差价合计(正数=需补款,负数=可退款) | -| `direction` | `String` | 差价方向:UPGRADE=升级加价, DOWNGRADE=降级减价, SAME=价格不变, MIXED=部分升级部分降级 | -| `description` | `String` | 描述 | -| `familyIndex` | `Integer` | 家庭序号 | -| `date` | `String` | 日期 | -| `defaultRoomTypeId` | `Long` | 产品默认房型ID | -| `defaultRoomTypeName` | `String` | 产品默认房型名称 | -| `assignedRoomTypeId` | `Long` | 实际分配房型ID | -| `assignedRoomTypeName` | `String` | 实际分配房型名称 | -| `defaultPrice` | `BigDecimal` | 默认房型当天单价 | -| `assignedPrice` | `BigDecimal` | 实际房型当天单价 | -| `dayDiff` | `BigDecimal` | 当天差价 | -| `direction` | `String` | 差价方向 | -| `remark` | `String` | 备注 | - -### ✏️ `GET` /admin/order/{orderId}/available-hotels — 配房可选酒店列表 - -- 参数: orderId(Long) → orderId(Long), dayIndex(Integer) - -### InternalPaymentOrder - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 标签 **「【内部接口】订单-支付/合同/保险(Feign调用)」** - -### 🆕 `GET` /internal/order/{orderId}/travelers — 获取订单出行人列表(供保险服务调用) - -> 内部服务间调用。返回订单下所有出行人的基本信息(姓名、证件号、性别、生日、手机号), - -**参数** - - - `{orderId}` (`Long`) — 路径参数:旅行订单ID - -**响应** `Result>>` - ---- - -## 资源服务 - -### InternalResourcePrice - -> 📖 **接口文档**: [http://192.168.100.236:8082/doc.html](http://192.168.100.236:8082/doc.html) → 标签 **「【内部接口】资源价格(Feign调用)」** - -### 🆕 `GET` /internal/resource/prices/standard-room-type/{hotelId} - -**参数** - - - `{hotelId}` (`Long`) — 路径参数 - -**响应** `Result` - ---- - -## 📦 其他数据对象变更 - -> 以下变更未直接关联到本次接口变更,但可能影响现有接口的请求/响应 - -### 产品服务 - -#### ✏️ ProductCreateRequest - - - 🆕 `insuranceSchemeId` (`Long`) — 保险方案ID - - 🆕 `contractPlatform` (`String`) — 合同平台(12301/FADADA) - - 🆕 `contractTemplateCode` (`String`) — 合同模板编码 - - 🆕 `contractMode` (`String`) — 签约模式(STANDARD/SYNC) - - 🆕 `signatoryMode` (`Integer`) — 签署模式(1=短信/2=现场/3=线下) - - 🆕 `agencyCode` (`String`) — 旅行社编码 - - 🆕 `disputeResolution` (`Integer`) — 争议解决方式(1=仲裁/2=诉讼) - - 🆕 `supplementaryClause` (`String`) — 补充条款 - - 🆕 `transactorName` (`String`) — 经办人姓名 - - 🆕 `transactorPhone` (`String`) — 经办人电话 - -#### ✏️ ProductListVO - - - 🆕 `insuranceSchemeId` (`String`) — 保险方案ID - - 🆕 `contractPlatform` (`String`) — 合同平台(12301/FADADA) - - 🆕 `contractTemplateCode` (`String`) — 合同模板编码 - - 🆕 `contractMode` (`String`) — 签约模式(STANDARD/SYNC) - - 🆕 `signatoryMode` (`Integer`) — 签署模式(1=短信/2=现场/3=线下) - - 🆕 `agencyCode` (`String`) — 旅行社编码 - - 🆕 `disputeResolution` (`Integer`) — 争议解决方式(1=仲裁/2=诉讼) - - 🆕 `supplementaryClause` (`String`) — 补充条款 - - 🆕 `transactorName` (`String`) — 经办人姓名 - - 🆕 `transactorPhone` (`String`) — 经办人电话 - -#### ✏️ ProductSaveRequest - - - 🆕 `insuranceSchemeId` (`Long`) — 保险方案ID - - 🆕 `contractPlatform` (`String`) — 合同平台(12301/FADADA) - - 🆕 `contractTemplateCode` (`String`) — 合同模板编码 - - 🆕 `contractMode` (`String`) — 签约模式(STANDARD/SYNC) - - 🆕 `signatoryMode` (`Integer`) — 签署模式(1=短信/2=现场/3=线下) - - 🆕 `agencyCode` (`String`) — 旅行社编码 - - 🆕 `disputeResolution` (`Integer`) — 争议解决方式(1=仲裁/2=诉讼) - - 🆕 `supplementaryClause` (`String`) — 补充条款 - - 🆕 `transactorName` (`String`) — 经办人姓名 - - 🆕 `transactorPhone` (`String`) — 经办人电话 - -#### ✏️ ProductUpdateRequest - - - 🆕 `insuranceSchemeId` (`Long`) — 保险方案ID - - 🆕 `contractPlatform` (`String`) — 合同平台(12301/FADADA) - - 🆕 `contractTemplateCode` (`String`) — 合同模板编码 - - 🆕 `contractMode` (`String`) — 签约模式(STANDARD/SYNC) - - 🆕 `signatoryMode` (`Integer`) — 签署模式(1=短信/2=现场/3=线下) - - 🆕 `agencyCode` (`String`) — 旅行社编码 - - 🆕 `disputeResolution` (`Integer`) — 争议解决方式(1=仲裁/2=诉讼) - - 🆕 `supplementaryClause` (`String`) — 补充条款 - - 🆕 `transactorName` (`String`) — 经办人姓名 - - 🆕 `transactorPhone` (`String`) — 经办人电话 - -#### ✏️ ProductVO - - - 🆕 `insuranceSchemeId` (`String`) — 保险方案ID - - 🆕 `contractPlatform` (`String`) — 合同平台(12301/FADADA) - - 🆕 `contractTemplateCode` (`String`) — 合同模板编码 - - 🆕 `contractMode` (`String`) — 签约模式(STANDARD/SYNC) - - 🆕 `signatoryMode` (`Integer`) — 签署模式(1=短信/2=现场/3=线下) - - 🆕 `agencyCode` (`String`) — 旅行社编码 - - 🆕 `disputeResolution` (`Integer`) — 争议解决方式(1=仲裁/2=诉讼) - - 🆕 `supplementaryClause` (`String`) — 补充条款 - - 🆕 `transactorName` (`String`) — 经办人姓名 - - 🆕 `transactorPhone` (`String`) — 经办人电话 - -### 保险服务 - -#### 🆕 AutoPurchaseRequest - -| 字段 | 类型 | 说明 | -| --- | --- | --- | -| `orderId` | `Long` | 旅行订单ID | -| `schemeId` | `Long` | 保险方案ID | - -### 订单服务 - -#### ✏️ HotelAssignmentRequest - - - 🆕 `hotelId` (`Long`) — 酒店ID - - 🆕 `roomTypeId` (`Long`) — 房型ID - - 🆕 `date` (`String`) — 日期(yyyy-MM-dd),单天 - - 🆕 `remark` (`String`) — 当天备注 - - 🆕 `upgradePrice` (`BigDecimal`) — 手动覆盖升级差价(null=使用系统计算值,仅当房型与产品默认不同时有效) - - ❌ ~~`checkInDate`~~ (`String`) — 入住日期(yyyy-MM-dd) - - ❌ ~~`checkOutDate`~~ (`String`) — 退房日期(yyyy-MM-dd) - - ✏️ `assignments`: 说明 "酒店分配列表" → "酒店分配列表(按天粒度,每天每个家庭一条记录)" - - ✏️ `roomType`: 说明 "房型" → "房型名称" - -
    -📁 全部变更文件 (点击展开) - -``` -M docs/CLAUDE_WORKFLOW/README.md -A docs/requirements/order-auto-insurance-contract.md -M hl-contract-service/src/main/java/com/hulalv/contract/controller/InternalContractController.java -M hl-insurance-service/src/main/java/com/hulalv/insurance/controller/InternalInsuranceController.java -A hl-insurance-service/src/main/java/com/hulalv/insurance/dto/AutoPurchaseRequest.java -M hl-insurance-service/src/main/java/com/hulalv/insurance/feign/OrderInsuranceFeignClient.java -M hl-insurance-service/src/main/java/com/hulalv/insurance/service/InsuranceOrderService.java -A hl-insurance-service/src/main/java/com/hulalv/insurance/vo/AutoPurchaseResultVO.java -M hl-mp-service/src/main/java/com/hulalv/mp/config/WebMvcConfig.java -M hl-order-service/src/main/java/com/hulalv/order/constant/OrderConstants.java -M hl-order-service/src/main/java/com/hulalv/order/controller/AdminOrderController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/InternalPaymentOrderController.java -M hl-order-service/src/main/java/com/hulalv/order/dto/HotelAssignmentRequest.java -M hl-order-service/src/main/java/com/hulalv/order/feign/ContractFeignClient.java -M hl-order-service/src/main/java/com/hulalv/order/feign/ContractFeignFallbackFactory.java -M hl-order-service/src/main/java/com/hulalv/order/feign/InsuranceFeignClient.java -M hl-order-service/src/main/java/com/hulalv/order/feign/InsuranceFeignFallbackFactory.java -M hl-order-service/src/main/java/com/hulalv/order/feign/ProductFeignClient.java -M hl-order-service/src/main/java/com/hulalv/order/feign/ProductFeignFallbackFactory.java -M hl-order-service/src/main/java/com/hulalv/order/feign/ResourcePriceFeignClient.java -M hl-order-service/src/main/java/com/hulalv/order/feign/ResourcePriceFeignFallbackFactory.java -M hl-order-service/src/main/java/com/hulalv/order/service/NotificationEventHelper.java -A hl-order-service/src/main/java/com/hulalv/order/service/OrderAutoProcessingService.java -M hl-order-service/src/main/java/com/hulalv/order/service/OrderItineraryEditService.java -M hl-order-service/src/main/java/com/hulalv/order/service/OrderPriceDiffService.java -M hl-order-service/src/main/java/com/hulalv/order/service/OrderService.java -M hl-order-service/src/main/java/com/hulalv/order/service/OrderTodoService.java -A hl-order-service/src/main/java/com/hulalv/order/vo/RoomUpgradePreviewVO.java -M hl-order-service/src/test/java/com/hulalv/order/constant/OrderConstantsTest.java -M hl-order-service/src/test/java/com/hulalv/order/service/OrderPriceDiffServiceTest.java -M hl-order-service/src/test/java/com/hulalv/order/service/OrderServiceTest.java -M hl-order-service/src/test/java/com/hulalv/order/service/OrderTodoServiceTest.java -M hl-order-service/src/test/java/com/hulalv/order/service/RefundPolicyServiceTest.java -A hl-product-service/src/main/java/com/hulalv/product/config/MapOrNullDeserializer.java -M hl-product-service/src/main/java/com/hulalv/product/controller/InternalProductController.java -M hl-product-service/src/main/java/com/hulalv/product/dto/ProductCreateRequest.java -M hl-product-service/src/main/java/com/hulalv/product/dto/ProductSaveRequest.java -M hl-product-service/src/main/java/com/hulalv/product/dto/ProductUpdateRequest.java -M hl-product-service/src/main/java/com/hulalv/product/entity/Product.java -A hl-product-service/src/main/java/com/hulalv/product/vo/ProductAutomationConfigVO.java -M hl-product-service/src/main/java/com/hulalv/product/vo/ProductListVO.java -M hl-product-service/src/main/java/com/hulalv/product/vo/ProductVO.java -M hl-resource-service/src/main/java/com/hulalv/resource/controller/InternalResourcePriceController.java -A sql/product_automation_fields.sql -``` -
    \ No newline at end of file diff --git a/changelogs/2026-03/2026-03-20_2357_fa78a82_feat_orderId.md b/changelogs/2026-03/2026-03-20_2357_fa78a82_feat_orderId.md deleted file mode 100644 index e8dc349..0000000 --- a/changelogs/2026-03/2026-03-20_2357_fa78a82_feat_orderId.md +++ /dev/null @@ -1,27 +0,0 @@ -# 接口变更记录 — 2026-03-20 23:57 - -> **提交** `fa78a82` · **作者** wx · **时间** 2026-03-20 23:57:54 +0800 -> -> feat: 投保接口支持orderId自动填充出行人和日期 + 修复节点类型计数 - -## 📦 其他数据对象变更 - -> 以下变更未直接关联到本次接口变更,但可能影响现有接口的请求/响应 - -### 保险服务 - -#### ✏️ PurchaseInsuranceRequest - - - ✏️ `startDate`: 说明 "保障开始日期" → "保障开始日期(传orderId时自动从订单获取)" - - ✏️ `endDate`: 说明 "保障结束日期" → "保障结束日期(传orderId时自动从订单获取)" - - ✏️ `insuredPersons`: 说明 "被保人列表(至少1人)" → "被保人列表(传orderId时自动从订单出行人获取)" - -
    -📁 全部变更文件 (点击展开) - -``` -M hl-insurance-service/src/main/java/com/hulalv/insurance/dto/PurchaseInsuranceRequest.java -M hl-insurance-service/src/main/java/com/hulalv/insurance/service/InsuranceOrderService.java -M hl-product-service/src/test/java/com/hulalv/product/constant/ProductConstantsTest.java -``` -
    \ No newline at end of file diff --git a/changelogs/2026-03/2026-03-20_accommodation_save_guide.md b/changelogs/2026-03/2026-03-20_accommodation_save_guide.md deleted file mode 100644 index c26d128..0000000 --- a/changelogs/2026-03/2026-03-20_accommodation_save_guide.md +++ /dev/null @@ -1,262 +0,0 @@ -# 住宿安排保存:前端实现指南(BUG修复) - -**日期**: 2026-03-20 -**类型**: 前端BUG修复指南 -**影响模块**: 产品管理 → 住宿安排 - ---- - -## 问题描述 - -住宿安排页面: -1. **一个家庭保存多个房型保存不上**(如:家庭1 → 大床房 + 普通标间) -2. **第二个家庭的房型也保存不上** - -**原因**:后端的住宿数据模型是 **每条记录 = 一个酒店 + 一个房型**,前端需要为每个房型单独调用接口保存。 - ---- - -## 后端数据模型 - -`product_day_hotel` 表结构(每条记录 = 一个房型分配): - -| 字段 | 说明 | -|------|------| -| id | 记录ID | -| productId | 产品ID | -| dayNumber | 第几天 | -| hotelId | 酒店ID | -| hotelName | 酒店名称 | -| roomTypeId | **房型ID**(每条记录一个房型) | -| roomTypeName | 房型名称 | -| roomCount | 房间数量 | -| familyIds | 所属家庭ID数组 JSON | - -**关键**:同一天、同一家庭、同一酒店可以有多条记录(不同房型),每个房型是独立的一条记录。 - -### 数据示例 - -家庭1 住香格里拉(大床房1间 + 标间1间)= **2条记录**: - -``` -记录1: hotelId=香格里拉, roomTypeId=大床房, roomCount=1, familyIds=["家庭1"] -记录2: hotelId=香格里拉, roomTypeId=标间, roomCount=1, familyIds=["家庭1"] -``` - -家庭2 住海棠酒店(标间1间)= **1条记录**: - -``` -记录3: hotelId=海棠酒店, roomTypeId=标间, roomCount=1, familyIds=["家庭2"] -``` - ---- - -## 后端接口清单 - -### 1. 添加住宿(每个房型调一次) - -``` -POST /admin/product/item/{productId}/day/{dayNumber}/hotel -``` - -请求体: -```json -{ - "hotelId": "2023714929877450753", - "hotelName": "呼伦贝尔香格里拉大酒店", - "roomTypeId": "3002000000000000013", - "roomTypeName": "大床房", - "roomCount": 1, - "familyIds": ["2034467435683393537"] -} -``` - -### 2. 更新住宿 - -``` -PUT /admin/product/hotel/{id} -``` - -### 3. 删除住宿 - -``` -DELETE /admin/product/hotel/{id} -``` - -### 4. 查询某天的住宿列表 - -``` -GET /admin/product/item/{productId}/day/{dayNumber}/hotels -``` - -响应: -```json -{ - "code": 200, - "data": [ - { - "id": "2034468900841975809", - "dayNumber": 1, - "hotelId": "2023714929877450753", - "hotelName": "呼伦贝尔香格里拉大酒店", - "roomTypeId": "3002000000000000013", - "roomTypeName": "大床房", - "roomCount": 1, - "familyIds": ["2034467435683393537"], - "familyRoomConfig": null - }, - { - "id": "2034817340914429954", - "dayNumber": 1, - "hotelId": "2023714929877450753", - "hotelName": "呼伦贝尔香格里拉大酒店", - "roomTypeId": "3002000000000000014", - "roomTypeName": "普通标间", - "roomCount": 1, - "familyIds": ["2034467435683393537"], - "familyRoomConfig": null - } - ] -} -``` - ---- - -## 前端实现方案 - -### 页面数据结构 - -前端页面按「家庭 → 酒店 → 房型列表」组织,但后端是扁平的(每个房型一条记录)。需要做转换: - -```js -// 前端UI数据结构(按家庭分组) -const uiData = { - familyId: '2034467435683393537', - hotelId: '2023714929877450753', - hotelName: '呼伦贝尔香格里拉大酒店', - roomTypes: [ - { roomTypeId: '3002000000000000013', roomTypeName: '大床房', roomCount: 1 }, - { roomTypeId: '3002000000000000014', roomTypeName: '普通标间', roomCount: 1 } - ] -} - -// 需要转换为后端的扁平结构(每个房型一条记录) -const apiRequests = uiData.roomTypes.map(rt => ({ - hotelId: uiData.hotelId, - hotelName: uiData.hotelName, - roomTypeId: rt.roomTypeId, - roomTypeName: rt.roomTypeName, - roomCount: rt.roomCount, - familyIds: [uiData.familyId] -})) -``` - -### 保存逻辑(推荐:增量模式) - -```js -async function saveAccommodation(productId, dayNumber, familyId, hotelId, hotelName, roomTypes) { - // 1. 查询当前该天已有的住宿记录 - const { data: existing } = await request.get( - `/admin/product/item/${productId}/day/${dayNumber}/hotels` - ) - - // 2. 筛选出属于当前家庭的已有记录 - const familyExisting = existing.filter(h => - h.familyIds && h.familyIds.includes(familyId) - ) - - // 3. 对比:哪些要删、哪些要更新、哪些要新增 - const existingMap = new Map(familyExisting.map(h => [h.roomTypeId, h])) - - for (const rt of roomTypes) { - const old = existingMap.get(rt.roomTypeId) - if (old) { - // 已存在 → 更新 - await request.put(`/admin/product/hotel/${old.id}`, { - hotelId, hotelName, - roomTypeId: rt.roomTypeId, - roomTypeName: rt.roomTypeName, - roomCount: rt.roomCount, - familyIds: [familyId] - }) - existingMap.delete(rt.roomTypeId) - } else { - // 不存在 → 新增 - await request.post( - `/admin/product/item/${productId}/day/${dayNumber}/hotel`, - { - hotelId, hotelName, - roomTypeId: rt.roomTypeId, - roomTypeName: rt.roomTypeName, - roomCount: rt.roomCount, - familyIds: [familyId] - } - ) - } - } - - // 4. 剩余的旧记录 → 删除(用户已移除的房型) - for (const [, old] of existingMap) { - await request.delete(`/admin/product/hotel/${old.id}`) - } -} -``` - -### 加载回显逻辑 - -```js -async function loadAccommodation(productId, dayNumber, families) { - // 1. 查询该天所有住宿记录(扁平) - const { data: hotels } = await request.get( - `/admin/product/item/${productId}/day/${dayNumber}/hotels` - ) - - // 2. 按家庭ID分组 - const familyHotelMap = {} - for (const family of families) { - familyHotelMap[family.familyId] = [] - } - - for (const hotel of hotels) { - const fids = hotel.familyIds || [] - for (const fid of fids) { - if (!familyHotelMap[fid]) familyHotelMap[fid] = [] - familyHotelMap[fid].push(hotel) - } - } - - // 3. 按家庭+酒店分组,合并同酒店的多个房型 - for (const [familyId, hotelRecords] of Object.entries(familyHotelMap)) { - const hotelGrouped = {} - for (const h of hotelRecords) { - if (!hotelGrouped[h.hotelId]) { - hotelGrouped[h.hotelId] = { - hotelId: h.hotelId, - hotelName: h.hotelName, - roomTypes: [] - } - } - hotelGrouped[h.hotelId].roomTypes.push({ - id: h.id, // 后端记录ID,更新/删除时需要 - roomTypeId: h.roomTypeId, - roomTypeName: h.roomTypeName, - roomCount: h.roomCount - }) - } - // hotelGrouped 就是该家庭的UI展示数据 - } -} -``` - ---- - -## 总结 - -| 操作 | 接口 | 说明 | -|------|------|------| -| 添加房型 | `POST .../day/{dayNumber}/hotel` | **每个房型调一次**,同一酒店不同房型 = 多次调用 | -| 更新房型 | `PUT .../hotel/{id}` | 按记录ID更新 | -| 删除房型 | `DELETE .../hotel/{id}` | 用户移除某个房型时调用 | -| 查询回显 | `GET .../day/{dayNumber}/hotels` | 返回扁平列表,前端按 familyIds + hotelId 分组展示 | - -**核心要点**:后端是扁平的(每个房型一条记录),前端需要做 UI分组结构 ↔ 扁平记录 的转换。 diff --git a/changelogs/2026-03/2026-03-20_available_hotels_dayindex.md b/changelogs/2026-03/2026-03-20_available_hotels_dayindex.md deleted file mode 100644 index fdb2e72..0000000 --- a/changelogs/2026-03/2026-03-20_available_hotels_dayindex.md +++ /dev/null @@ -1,90 +0,0 @@ -# 配房可选酒店接口增加 dayIndex 参数 - -**日期**: 2026-03-20 -**类型**: 接口变更(不兼容) -**影响模块**: 订单管理 → 配房 - ---- - -## 变更说明 - -`GET /admin/order/{orderId}/available-hotels` 接口新增**必填参数** `dayIndex`,因为每天行程的酒店可能不同,配房需要按天查询可选酒店。 - -### 变更前 - -``` -GET /admin/order/{orderId}/available-hotels -``` -返回所有天的快照酒店,不区分行程天。 - -### 变更后 - -``` -GET /admin/order/{orderId}/available-hotels?dayIndex=2 -``` -只返回指定行程天的快照酒店标注。 - ---- - -## 接口定义 - -### `GET /admin/order/{orderId}/available-hotels` - -#### 请求参数 - -| 参数 | 类型 | 必填 | 说明 | -|------|------|------|------| -| orderId | Long | 是 | 订单ID(路径参数) | -| dayIndex | Integer | **是** | 行程第几天(从1开始,Query参数) | - -#### 响应格式 - -```json -{ - "code": 200, - "data": [ - { - "hotelId": "2033911514863382529", - "hotelName": "恩和瓦西里民宿", - "inSnapshot": true - }, - { - "hotelId": "2033911514863382530", - "hotelName": "额尔古纳大酒店", - "inSnapshot": false - } - ] -} -``` - -#### 响应字段说明 - -| 字段 | 类型 | 说明 | -|------|------|------| -| hotelId | String | 酒店ID | -| hotelName | String | 酒店名称 | -| inSnapshot | Boolean | 是否在该天产品快照中(true=该天行程已安排的酒店,应优先选择) | - -- `inSnapshot=true` 的酒店排在前面 -- 同时返回所有启用酒店供选择 - ---- - -## 前端改动要点 - -配房弹窗中选择酒店时,调用此接口需传当前正在配的那一天的 `dayIndex`: - -```js -// 示例:配第2天的房间 -const res = await request.get(`/admin/order/${orderId}/available-hotels`, { - params: { dayIndex: 2 } -}) -``` - -**注意**:`dayIndex` 从 **1** 开始,对应行程的第1天、第2天... - ---- - -## 同步修复:产品保存报错 - -`refundPolicyIds` 字段兼容前端传空数组 `[]` 的情况(之前只接受对象 `{}`,传 `[]` 会返回400)。现在传 `[]` 等价于 `null`,不影响保存。 diff --git a/changelogs/2026-03/2026-03-20_comprehensive_frontend_guide.md b/changelogs/2026-03/2026-03-20_comprehensive_frontend_guide.md deleted file mode 100644 index 2010116..0000000 --- a/changelogs/2026-03/2026-03-20_comprehensive_frontend_guide.md +++ /dev/null @@ -1,624 +0,0 @@ -# 综合前端对接指南 — 产品自动化配置 + 保险 + 合同 + 配房 + 配车 - -> **日期**: 2026-03-20 -> **后端状态**: ✅ 已完成,可直接对接 -> **涉及服务**: hl-product-service、hl-order-service、hl-insurance-service、hl-contract-service、hl-resource-service - ---- - -## 一、整体变更说明 - -### 核心改动 - -1. **产品新增10个保险+合同配置字段**(创建时必填):产品绑定保险方案和合同配置 -2. **订单支付后自动投保+自动签约**:出行人补全后系统自动完成,无需管理员手动操作 -3. **去掉「确认订单」步骤**:原6步待办缩减为5步,`CONFIRM_ORDER` 已删除 -4. **`PROCESSING` 流程状态已删除**:`PENDING_INFO` 直接跳到 `PENDING_INSURANCE` -5. **配房改为按天粒度**:每天每个家庭一条记录,新增房型升级差价自动计算 -6. **配房升级差价预览**:提交配房前可预览差价明细 - -### 新的订单内部流程 - -``` -支付成功 → 创建5个待办 → 出行人补全 → 系统自动确认订单 - → 自动投保(按产品绑定的保险方案) ← INSURANCE待办自动完成 - → 自动签约(按产品绑定的合同配置) ← CONTRACT待办等签署回调完成 - → 手动配房 (ARRANGE_ROOM) - → 手动配车 (ARRANGE_VEHICLE) - → 手动确认清单 (CONFIRM_CHECKLIST) -``` - -**容错**:自动投保/签约失败时,待办保持 PENDING,管理员可手动处理。 - ---- - -## 二、破坏性变更(前端必须适配) - -### 1. 待办类型变更 - -| 原 todoType | 原序号 | 新 todoType | 新序号 | 说明 | -|-------------|--------|-------------|--------|------| -| CONFIRM_ORDER | 1 | **已删除** | - | 不再需要手动确认 | -| INSURANCE | 2 | INSURANCE | 1 | 可被系统自动完成 | -| CONTRACT | 3 | CONTRACT | 2 | 可被系统自动完成 | -| ARRANGE_ROOM | 4 | ARRANGE_ROOM | 3 | 手动 | -| ARRANGE_VEHICLE | 5 | ARRANGE_VEHICLE | 4 | 手动 | -| CONFIRM_CHECKLIST | 6 | CONFIRM_CHECKLIST | 5 | 手动 | - -**前端注意**: -- 不要 hardcode `CONFIRM_ORDER` 的判断 -- 待办序号已变化(INSURANCE 从 2 变为 1) -- INSURANCE/CONTRACT 待办可能被系统自动完成,展示时注意区分 - -### 2. processStatus 变更 - -| 原流程 | 新流程 | -|--------|--------| -| PENDING_INFO → **PROCESSING** → PENDING_INSURANCE → ... | PENDING_INFO → PENDING_INSURANCE → ... | - -`PROCESSING` 状态已删除,相关状态标签/过滤条件需要去掉。 - -**有效的 processStatus 值**: -`PENDING_INFO` / `PENDING_INSURANCE` / `PENDING_CONTRACT` / `PENDING_ROOM` / `PENDING_VEHICLE` / `PENDING_FINANCE` / `READY` / `INTERNAL_CONFIRMED` - -### 3. 配房接口破坏性变更 - -从「按日期区间」改为「按天粒度」,详见下方配房章节。 - ---- - -## 三、产品服务 — 新增保险与合同配置 - -### 页面布局建议 - -在产品编辑页基本信息之后增加「保险与合同配置」区域: - -``` -┌─────────────────────────────────────────┐ -│ 保险与合同配置 │ -├─────────────────────────────────────────┤ -│ 保险方案:[下拉选择] ← GET /admin/insurance/scheme/list │ -│ │ -│ 合同平台:[12301 ▼] / [法大大 ▼] │ -│ 合同模板:[下拉选择] ← GET /admin/contract/templates │ -│ 签约模式:[电子签约 ▼] / [线下报备 ▼] │ -│ 签署模式:[短信 ▼] / [现场 ▼] / [线下 ▼] │ -│ 旅行社: [下拉选择] ← GET /admin/insurance/entities │ -│ 争议解决:[仲裁 ▼] / [诉讼 ▼] │ -│ 经办人姓名:[________] │ -│ 经办人电话:[________] │ -│ 补充条款:[________________] (可选) │ -└─────────────────────────────────────────┘ -``` - -### 接口 1:创建产品(新增必填字段) - -``` -POST /admin/product -``` - -**新增请求字段**(所有字段必填,`supplementaryClause` 除外): - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| insuranceSchemeId | Long | 是 | 保险方案ID,从 `GET /admin/insurance/scheme/list` 获取 | -| contractPlatform | String | 是 | 合同平台:`12301`(全国旅游监管平台)/ `FADADA`(法大大) | -| contractTemplateCode | String | 是 | 合同模板编码,从 `GET /admin/contract/templates` 获取 | -| contractMode | String | 是 | 签约模式:`STANDARD`(电子签约)/ `SYNC`(线下报备) | -| signatoryMode | Integer | 是 | 签署模式:`1`=短信签署 / `2`=现场签署 / `3`=线下签署 | -| agencyCode | String | 是 | 旅行社编码,从 `GET /admin/insurance/entities` 获取 | -| disputeResolution | Integer | 是 | 争议解决方式:`1`=仲裁 / `2`=诉讼 | -| supplementaryClause | String | 否 | 合同补充条款 | -| transactorName | String | 是 | 经办人姓名 | -| transactorPhone | String | 是 | 经办人电话 | - -### 接口 2:编辑产品(新增可选字段) - -``` -PUT /admin/product/{productId} -``` - -同上 10 个字段,**全部可选**(不传则不更新)。 - -### 接口 3:统一保存产品(新增字段) - -``` -POST /admin/product/save -``` - -同上 10 个字段,创建时必填,更新时可选。 - -### 接口 4:产品详情响应(新增返回字段) - -``` -GET /admin/product/{productId} -``` - -**响应新增字段**(ProductVO 和 ProductListVO 均返回): - -| 字段 | 类型 | 说明 | -|------|------|------| -| insuranceSchemeId | String | 保险方案ID | -| contractPlatform | String | 合同平台:`12301` / `FADADA` | -| contractTemplateCode | String | 合同模板编码 | -| contractMode | String | 签约模式:`STANDARD` / `SYNC` | -| signatoryMode | Integer | 签署模式:1/2/3 | -| agencyCode | String | 旅行社编码 | -| disputeResolution | Integer | 争议解决方式:1/2 | -| supplementaryClause | String | 补充条款 | -| transactorName | String | 经办人姓名 | -| transactorPhone | String | 经办人电话 | - -### 下拉数据源接口 - -#### 保险方案列表(产品编辑页下拉) - -``` -GET /admin/insurance/scheme/list -``` - -**使用场景**:产品编辑页「保险方案」下拉选择。 - -**响应示例**: -```json -{ - "code": 200, - "data": [ - { - "id": "1901234567890", - "name": "国内5天标准保障", - "description": "覆盖5天国内行程的基础保障方案", - "isOverseas": false, - "status": "ACTIVE", - "segments": [ - { - "segmentIndex": 1, - "insuranceProductId": "100", - "planId": "200", - "startDayOffset": 0, - "endDayOffset": 4 - } - ] - } - ] -} -``` - -#### 合同模板列表(产品编辑页下拉) - -``` -GET /admin/contract/templates -``` - -**使用场景**:产品编辑页「合同模板」下拉选择。 - -**响应示例**: -```json -{ - "code": 200, - "data": [ - { - "templateCode": "TOURAGE_STANDARD", - "templateName": "国内旅游标准合同", - "platform": "12301", - "mode": "STANDARD" - } - ] -} -``` - -#### 合同平台列表(产品编辑页下拉) - -``` -GET /admin/contract/platforms -``` - -**使用场景**:产品编辑页「合同平台」下拉选择。 - -#### 旅行社列表(产品编辑页下拉) - -``` -GET /admin/insurance/entities -``` - -**使用场景**:产品编辑页「旅行社」下拉选择(agencyCode 使用此列表中的 code 值)。 - -**响应示例**: -```json -{ - "code": 200, - "data": [ - { - "code": "HLNMG", - "companyName": "内蒙古呼籁国际旅行社有限公司" - } - ] -} -``` - ---- - -## 四、保险服务 — 手动配置保险 - -订单保险在正常流程中会自动完成(支付后系统自动投保),但管理员也可以手动操作。手动配保险有两种方式: - -### 页面布局建议 - -``` -┌─────────────────────────────────────────┐ -│ 保险配置 │ -├─────────────────────────────────────────┤ -│ ● 选择保险方案(推荐) │ -│ [方案下拉] → 预览 → 确认投保 │ -│ │ -│ ○ 按天手动配置 │ -│ 保险产品:[下拉] │ -│ 保险计划:[下拉] │ -│ 开始日期:[____] 结束日期:[____] │ -│ [试算保费] [确认投保] │ -└─────────────────────────────────────────┘ -``` - -### 方式一:选择保险方案投保(推荐) - -#### 步骤1:选择方案 → 预览 - -``` -POST /admin/insurance/scheme/preview-apply -``` - -**使用场景**:管理员选择保险方案后,预览投保效果(各段日期、保费明细)。 - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| schemeId | Long | 是 | 保险方案ID(从方案列表获取) | -| orderId | Long | 是 | 订单ID(自动获取出行日期和人数) | - -**响应**:返回各段的日期范围、计划信息、单人保费、总保费、日期间隙警告。 - -#### 步骤2:确认后逐段投保 - -确认后前端按预览结果中的各段信息,逐段调用 purchase 接口(参考方式二)。 - -### 方式二:按天手动投保 - -#### 接口 1:查询保险产品列表 - -``` -GET /admin/insurance/products?isOverseas=false -``` - -**使用场景**:按天手动投保时,选择保险产品。 - -| 参数 | 类型 | 必填 | 说明 | -|------|------|------|------| -| isOverseas | Boolean | 否 | 是否境外保险,默认 false | -| page | Integer | 否 | 页码 | -| pageSize | Integer | 否 | 每页条数 | - -#### 接口 2:查询保险计划列表 - -``` -GET /admin/insurance/products/{productId}/plans -``` - -**使用场景**:选择保险产品后,查看该产品下的保险计划及费率。 - -#### 接口 3:保费试算 - -``` -POST /admin/insurance/trial-price -``` - -**使用场景**:选择计划和日期后,试算保费(不下单)。 - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| planId | Long | 是 | 保险计划ID | -| startDate | String | 是 | 保障开始日期 yyyy-MM-dd | -| endDate | String | 是 | 保障结束日期 yyyy-MM-dd | -| insuredCount | Integer | 是 | 被保人数 | - -#### 接口 4:确认投保 - -``` -POST /admin/insurance/purchase -``` - -**使用场景**:确认投保,创建保险订单。 - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| orderId | Long | 否 | 关联的旅行订单ID | -| planId | Long | 是 | 保险计划ID | -| startDate | String | 是 | 保障开始日期 yyyy-MM-dd | -| endDate | String | 是 | 保障结束日期 yyyy-MM-dd | -| insuredPersons | Array | 是 | 被保人列表(至少1人) | -| insuredPersons[].name | String | 是 | 姓名 | -| insuredPersons[].idCardType | String | 否 | 证件类型:`ID_CARD`/`PASSPORT`/`OTHER`,默认 ID_CARD | -| insuredPersons[].idCardNo | String | 是 | 证件号 | -| insuredPersons[].birthday | String | 是 | 出生日期 yyyy-MM-dd | -| insuredPersons[].gender | String | 是 | 性别:`MALE`/`FEMALE` | -| entityCode | String | 否 | 投保公司编码,默认使用系统默认主体 | - -**响应**:`List`,每条包含保险单号、状态、被保人信息等。 - -### 保险查询与管理接口 - -| # | 接口 | 方法 | 路径 | 说明 | -|---|------|------|------|------| -| 1 | 按订单查保险 | GET | `/admin/insurance/orders/by-order/{orderId}` | 查询订单关联的保险单列表 | -| 2 | 保险保障详情 | GET | `/admin/insurance/coverage/{orderId}` | 查询订单保险保障(含被保人详情) | -| 3 | 保险订单详情 | GET | `/admin/insurance/orders/{id}` | 单条保险订单详情 | -| 4 | 退保 | POST | `/admin/insurance/cancel/{id}` | 退保(管理员手动退保) | -| 5 | 下载保单 | GET | `/admin/insurance/policy/{id}/download` | 下载保单PDF(Base64) | -| 6 | 分享保单 | POST | `/admin/insurance/share-policy` | 分享保单给用户 | -| 7 | 账户余额 | GET | `/admin/insurance/balance` | 查询保游网账户余额 | -| 8 | 在线充值 | POST | `/admin/insurance/recharge` | 保游网在线充值 | - ---- - -## 五、合同服务 — 手动配置合同 - -订单合同在正常流程中会自动完成(支付后系统自动发起签约),但管理员也可以手动操作。 - -### 接口 1:创建合同(电子签约模式 STANDARD) - -``` -POST /admin/contract/create -``` - -**使用场景**:手动创建合同,发送签署短信给游客。合同签署完成后 CONTRACT 待办自动完成。 - -**请求体**:CreateContractRequest(字段较多,参见 Knife4j 文档) - -### 接口 2:报备合同(线下报备模式 SYNC) - -``` -POST /admin/contract/report -``` - -**使用场景**:线下签约后报备合同,报备成功 CONTRACT 待办自动完成。 - -### 合同查询与管理接口 - -| # | 接口 | 方法 | 路径 | 说明 | -|---|------|------|------|------| -| 1 | 合同列表 | GET | `/admin/contract/list` | 分页查询,支持按订单/状态/旅行社筛选 | -| 2 | 合同详情 | GET | `/admin/contract/{id}` | 单条合同详情 | -| 3 | 按订单查合同 | GET | `/admin/contract/by-order/{orderId}` | 查询订单关联的所有合同(含已作废) | -| 4 | 订单有效合同 | GET | `/admin/contract/active-by-order/{orderId}` | 获取订单最新有效合同 | -| 5 | 刷新合同状态 | GET | `/admin/contract/{id}/status` | 从平台同步最新签署状态 | -| 6 | 作废合同 | POST | `/admin/contract/{id}/invalidate` | 作废合同(可重新签约) | -| 7 | 重发签署短信 | POST | `/admin/contract/{id}/resend-sms` | 重发签署短信(STANDARD模式) | -| 8 | 上传已签署PDF | POST | `/admin/contract/{id}/upload-pdf` | 上传线下签署的PDF(SYNC模式) | -| 9 | 合同模板列表 | GET | `/admin/contract/templates` | 可用合同模板(下拉选择) | -| 10 | 合同平台列表 | GET | `/admin/contract/platforms` | 可用合同平台 | -| 11 | 旅行社列表 | GET | `/admin/contract/agencies` | 可用旅行社 | - -### 合同状态字典(contract_status) - -| 值 | 中文 | 说明 | -|----|------|------| -| CREATED | 已创建 | 合同已创建,待发起签署 | -| SIGNING | 签署中 | 已发送签署短信,等待签署 | -| SIGNED | 已签署 | 合同已签署完成 | -| UPLOADED | 已上传 | 已上传签署PDF(SYNC模式) | -| REPORTED | 已报备 | 已向平台报备(SYNC模式) | -| INVALID | 已作废 | 合同已作废 | - ---- - -## 六、配房 — 按天粒度 + 房型升级差价 - -### 破坏性变更 - -配房接口从「按家庭+日期区间」改为「按天按家庭」粒度。**`checkInDate` 和 `checkOutDate` 字段已删除**,改用 `date` 单天日期。 - -### 接口 1:配房升级差价预览(新增) - -``` -POST /admin/order/{orderId}/hotel-assignment/preview -``` - -**使用场景**:选择酒店和房型后,提交前预览房型升级差价。前端根据返回的差价信息展示给用户确认。 - -**请求体**:同分配酒店信息接口 - -**响应**:`RoomUpgradePreviewVO` - -| 字段 | 类型 | 说明 | -|------|------|------| -| details | Array | 各天差价明细(仅有差价的天) | -| details[].familyIndex | Integer | 家庭序号 | -| details[].date | String | 日期 | -| details[].defaultRoomTypeId | Long | 产品默认房型ID | -| details[].defaultRoomTypeName | String | 产品默认房型名称 | -| details[].assignedRoomTypeId | Long | 实际分配房型ID | -| details[].assignedRoomTypeName | String | 实际分配房型名称 | -| details[].defaultPrice | BigDecimal | 默认房型当天单价 | -| details[].assignedPrice | BigDecimal | 实际房型当天单价 | -| details[].dayDiff | BigDecimal | 当天差价(正=补款,负=退款) | -| details[].direction | String | `UPGRADE` / `DOWNGRADE` / `SAME` | -| details[].remark | String | 备注 | -| totalDiff | BigDecimal | 差价合计 | -| direction | String | `UPGRADE` / `DOWNGRADE` / `SAME` / `MIXED` | -| description | String | 差价描述(如「共 2 天有差价,合计 +400.00」) | - -**响应示例**: -```json -{ - "code": 200, - "data": { - "details": [ - { - "familyIndex": 1, - "date": "2026-04-01", - "defaultRoomTypeId": 2002, - "defaultRoomTypeName": "标间", - "assignedRoomTypeId": 2001, - "assignedRoomTypeName": "豪华大床房", - "defaultPrice": 300.00, - "assignedPrice": 500.00, - "dayDiff": 200.00, - "direction": "UPGRADE", - "remark": "需要加床" - } - ], - "totalDiff": 200.00, - "direction": "UPGRADE", - "description": "共 1 天有差价,合计 +200.00" - } -} -``` - -### 接口 2:分配酒店信息(破坏性变更) - -``` -PUT /admin/order/{orderId}/hotel-assignment -``` - -**使用场景**:为订单按天按家庭分配具体酒店房间。每天每个家庭一条记录。 - -**请求体**: - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| assignments | Array | 是 | 酒店分配列表(按天按家庭,每天每个家庭一条) | -| assignments[].familyIndex | Integer | 是 | 家庭序号 | -| assignments[].hotelId | Long | 是 | 酒店ID | -| assignments[].hotelName | String | 是 | 酒店名称 | -| assignments[].roomTypeId | Long | 是 | 房型ID | -| assignments[].roomType | String | 是 | 房型名称 | -| assignments[].date | String | 是 | 单天日期 `yyyy-MM-dd`(**替代原 checkInDate/checkOutDate**) | -| assignments[].remark | String | 否 | 当天备注(新增) | -| assignments[].upgradePrice | BigDecimal | 否 | 手动覆盖升级差价(null=使用系统计算值) | - -**删除的字段**:`checkInDate`、`checkOutDate` - -**房型升级逻辑(自动触发)**: -- 分配的 roomTypeId 与产品默认房型不同 → 自动计算差价 -- CORE产品(快照中 roomTypeId 为 null)→ 默认基准为该酒店的标间(STANDARD) -- 差价 = 新房型日价格 - 默认房型日价格(来自价格日历) -- `upgradePrice` 可手动覆盖系统计算的差价 -- **定制师操作**:差价自动确认,直接调整订单总售价 -- **其他角色操作**:差价设为「待确认」临时加到尾款,通知定制师确认 - -**请求示例**: -```json -{ - "assignments": [ - { - "familyIndex": 1, - "hotelId": 1001, - "hotelName": "呼伦贝尔大酒店", - "roomTypeId": 2001, - "roomType": "豪华大床房", - "date": "2026-04-01", - "remark": "需要加床" - }, - { - "familyIndex": 1, - "hotelId": 1001, - "hotelName": "呼伦贝尔大酒店", - "roomTypeId": 2001, - "roomType": "豪华大床房", - "date": "2026-04-02", - "remark": "" - }, - { - "familyIndex": 2, - "hotelId": 1001, - "hotelName": "呼伦贝尔大酒店", - "roomTypeId": 2002, - "roomType": "标间", - "date": "2026-04-01", - "remark": "" - } - ] -} -``` - -**响应**:`Result` - -### 接口 3:查询可用酒店列表 - -``` -GET /admin/order/{orderId}/available-hotels?dayIndex=1 -``` - -**使用场景**:配房时根据行程天数查询可选酒店(产品快照中的酒店优先排序)。 - -| 参数 | 类型 | 必填 | 说明 | -|------|------|------|------| -| dayIndex | Integer | 是 | 行程第几天(1开始) | - -### 推荐交互流程 - -``` -选择酒店+房型 → 填写每天备注 → 点击「预览差价」 - → 调用 POST preview 接口 - → 展示差价明细(可修改 upgradePrice) - → 点击「确认配房」→ 调用 PUT hotel-assignment -``` - ---- - -## 七、配车 - -### 接口:分配车辆信息 - -``` -PUT /admin/order/{orderId}/vehicle-assignment -``` - -**使用场景**:为订单分配具体车辆和司机信息。 - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| vehicleModel | String | 是 | 车型(如「别克GL8」) | -| vehicleBrand | String | 是 | 品牌(如「别克」) | -| plateNumber | String | 否 | 车牌号 | -| driverName | String | 否 | 司机姓名 | -| driverPhone | String | 否 | 司机电话 | - -**响应**:`Result` - ---- - -## 八、尾款调整汇总(字段增强) - -``` -GET /admin/order/{orderId}/itinerary/balance-summary -``` - -**使用场景**:订单详情页展示尾款调整明细,包含行程编辑和房型升级产生的差价。 - -**响应新增字段**: - -| 字段 | 类型 | 说明 | -|------|------|------| -| confirmedAdjustment | BigDecimal | 已确认的调整金额(已计入总售价) | -| pendingAdjustment | BigDecimal | 待确认的调整金额(临时,待定制师确认) | -| totalAdjustment | BigDecimal | 合计(已确认 + 待确认) | -| details[].confirmStatus | String | `CONFIRMED`(已确认)或 `PENDING_CONFIRM`(待确认) | - -**页面展示**: -- 展示「已确认调整」和「待确认调整(临时)」两个金额 -- 待确认项标记为临时状态,提示「待定制师确认」 - ---- - -## 九、枚举/字典值汇总 - -| 字段 | 可选值 | 说明 | -|------|--------|------| -| contractPlatform | `12301` / `FADADA` | 合同平台 | -| contractMode | `STANDARD` / `SYNC` | 签约模式:电子签约 / 线下报备 | -| signatoryMode | `1` / `2` / `3` | 签署模式:1=短信 / 2=现场 / 3=线下 | -| disputeResolution | `1` / `2` | 争议解决:1=仲裁 / 2=诉讼 | -| todoType | `INSURANCE` / `CONTRACT` / `ARRANGE_ROOM` / `ARRANGE_VEHICLE` / `CONFIRM_CHECKLIST` | 待办类型(CONFIRM_ORDER 已删除) | -| processStatus | `PENDING_INFO` / `PENDING_INSURANCE` / `PENDING_CONTRACT` / `PENDING_ROOM` / `PENDING_VEHICLE` / `PENDING_FINANCE` / `READY` / `INTERNAL_CONFIRMED` | 内部流程状态(PROCESSING 已删除) | -| contract_status | `CREATED` / `SIGNING` / `SIGNED` / `UPLOADED` / `REPORTED` / `INVALID` | 合同状态 | -| upgradeDirection | `UPGRADE` / `DOWNGRADE` / `SAME` / `MIXED` | 房型升级方向 | -| confirmStatus | `CONFIRMED` / `PENDING_CONFIRM` | 尾款调整确认状态 | diff --git a/changelogs/2026-03/2026-03-20_contract_scheme.md b/changelogs/2026-03/2026-03-20_contract_scheme.md deleted file mode 100644 index 0ec9066..0000000 --- a/changelogs/2026-03/2026-03-20_contract_scheme.md +++ /dev/null @@ -1,181 +0,0 @@ -# 合同方案 + 产品合同配置改版 + 支付前出行人校验 - -## 功能说明 - -### 1. 合同方案管理(新增) -合同配置改为"合同方案"模式(与保险方案一致),产品只需选择一个合同方案ID。 - -### 2. 产品合同配置改版(破坏性变更) -产品上原来的 9 个合同字段(contractPlatform, contractTemplateCode, contractMode, signatoryMode, agencyCode, disputeResolution, supplementaryClause, transactorName, transactorPhone)已全部删除,替换为单个 `contractSchemeId` 字段。 - -### 3. 支付前出行人校验规则变更 -- **预约产品**(isBooking=true):定金支付不要求出行人,全款/尾款要求出行人齐全 -- **非预约产品**(isBooking=false):所有支付类型都要求出行人齐全 - -### 4. HTTP 200 统一化 -所有接口只要请求能到达服务器,HTTP状态码一律返回200,业务错误在响应体Result中返回。 - ---- - -## 合同方案接口清单 - -### 查询启用的合同方案列表(下拉选择用) -- **GET** `/admin/contract/scheme/list` -- **响应**:`Result>` - -### 查询全部合同方案列表(管理页面用) -- **GET** `/admin/contract/scheme/list-all` -- **响应**:`Result>` - -### 获取合同方案详情 -- **GET** `/admin/contract/scheme/{schemeId}` -- **响应**:`Result` - -### 创建合同方案 -- **POST** `/admin/contract/scheme` -- **请求体**:`ContractSchemeRequest` -- **响应**:`Result` - -### 更新合同方案 -- **PUT** `/admin/contract/scheme/{schemeId}` -- **请求体**:`ContractSchemeRequest` -- **响应**:`Result` - -### 切换方案启用/停用状态 -- **PUT** `/admin/contract/scheme/{schemeId}/toggle-status` -- **响应**:`Result` - -### 删除合同方案 -- **DELETE** `/admin/contract/scheme/{schemeId}` -- **响应**:`Result` - ---- - -## ContractSchemeRequest 参数 - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| name | String | 是 | 方案名称,如"标准国内电子签约方案" | -| description | String | 否 | 方案描述 | -| contractPlatform | String | 是 | 合同平台:`12301`(全国旅游监管平台)/ `FADADA`(法大大) | -| contractTemplateCode | String | 是 | 合同模板编码,如 `TOURAGE_STANDARD` | -| contractMode | String | 是 | 签约模式:`STANDARD`(电子签约)/ `SYNC`(线下报备) | -| signatoryMode | Integer | 是 | 签署模式:`1`=短信签署 `2`=现场签署 `3`=线下签署 | -| agencyCode | String | 是 | 旅行社编码 | -| disputeResolution | Integer | 是 | 争议解决方式:`1`=仲裁 `2`=诉讼 | -| supplementaryClause | String | 否 | 补充条款 | -| transactorName | String | 是 | 经办人姓名 | -| transactorPhone | String | 是 | 经办人电话 | -| sortOrder | Integer | 否 | 排序(越小越靠前) | - -## ContractSchemeVO 响应 - -| 字段 | 类型 | 说明 | -|------|------|------| -| schemeId | String | 方案ID | -| name | String | 方案名称 | -| description | String | 方案描述 | -| contractPlatform | String | 合同平台:12301/FADADA | -| contractTemplateCode | String | 合同模板编码 | -| contractMode | String | 签约模式:STANDARD/SYNC | -| signatoryMode | Integer | 签署模式:1=短信 2=现场 3=线下 | -| agencyCode | String | 旅行社编码 | -| disputeResolution | Integer | 争议解决方式:1=仲裁 2=诉讼 | -| supplementaryClause | String | 补充条款 | -| transactorName | String | 经办人姓名 | -| transactorPhone | String | 经办人电话 | -| sortOrder | Integer | 排序 | -| status | String | 状态:ACTIVE/INACTIVE | -| createTime | DateTime | 创建时间 | - ---- - -## 产品接口变更(破坏性变更) - -### 产品创建/更新/保存接口 - -**删除的字段**(以下字段不再使用): -- ~~contractPlatform~~ -- ~~contractTemplateCode~~ -- ~~contractMode~~ -- ~~signatoryMode~~ -- ~~agencyCode~~ -- ~~disputeResolution~~ -- ~~supplementaryClause~~ -- ~~transactorName~~ -- ~~transactorPhone~~ - -**新增的字段**: - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| contractSchemeId | Long | 是(创建时) | 合同方案ID,从 `/admin/contract/scheme/list` 获取 | - -### 产品详情接口 - -**响应变更**: -- 删除 9 个合同字段 -- 新增 `contractSchemeId`(String类型) - ---- - -## 页面布局建议 - -### 合同方案管理页面 -路径建议:系统管理 → 合同方案管理(类似保险方案管理) -- 列表页:方案名称、合同平台、签约模式、旅行社、状态、操作(编辑/启停/删除) -- 新建/编辑弹窗:ContractSchemeRequest 的所有字段 - -### 产品编辑页面 — 合同配置区域改版 - -**原来**(9个表单项): -``` -合同平台 * [12301] [法大大] -合同模板 * [下拉选择] -签约模式 * [电子签约] [线下报备] -签署模式 * [短信签署] [现场签署] [线下签署] -旅行社 * [下拉选择] -争议解决方式 * [仲裁] [诉讼] -补充条款 [文本框] -经办人姓名 * [文本框] -经办人电话 * [文本框] -``` - -**现在**(1个下拉选择): -``` -合同方案 * [请选择合同方案 ▼] -``` -下拉数据来源:`GET /admin/contract/scheme/list`(返回启用的方案列表) - ---- - -## 调用示例 - -### 创建合同方案 -```json -POST /admin/contract/scheme -{ - "name": "标准国内电子签约方案", - "contractPlatform": "12301", - "contractTemplateCode": "TOURAGE_STANDARD", - "contractMode": "STANDARD", - "signatoryMode": 1, - "agencyCode": "L-NMG-100001", - "disputeResolution": 1, - "transactorName": "张三", - "transactorPhone": "13800138000", - "sortOrder": 0 -} -``` - -### 产品创建(使用合同方案ID) -```json -POST /admin/product -{ - "name": "冰雪3.0南线", - "productType": "CORE", - "insuranceSchemeId": 123456789, - "contractSchemeId": 987654321, - ... -} -``` diff --git a/changelogs/2026-03/2026-03-20_contract_scheme_updates.md b/changelogs/2026-03/2026-03-20_contract_scheme_updates.md deleted file mode 100644 index b4f1bed..0000000 --- a/changelogs/2026-03/2026-03-20_contract_scheme_updates.md +++ /dev/null @@ -1,170 +0,0 @@ -# 接口变更记录 — 2026-03-20(合同方案 + 模板筛选) - -> **类型** feature + fix - ---- - -## 一、合同方案管理菜单已添加 - -"合同管理"下新增"合同方案"子菜单,排在合同列表前面。 - ---- - -## 二、合同模板接口支持按平台筛选 - -### `GET` /admin/contract/templates - -新增可选参数 `platform`,前端根据合同方案表单中选择的"合同平台"传值,实现模板联动筛选。 - -| 参数 | 类型 | 必填 | 说明 | -|------|------|------|------| -| `platform` | String | 否 | 合同平台:`12301`=全国旅游监管平台,`FADADA`=法大大。不传则返回全部 | - -**前端调整**: -- 合同方案新增/编辑表单中,选择"合同平台"后,调用 `/admin/contract/templates?platform=12301` 或 `?platform=FADADA` 刷新合同模板下拉列表 -- 切换平台时需清空已选的合同模板 - ---- - -## 三、合同方案 — 旅行社改为非必填 - -### 变更说明 - -`ContractSchemeRequest` 中 `agencyCode`(旅行社编码)从**必填**改为**可选**。 - -**业务逻辑**:不填旅行社时,创建合同时会根据订单支付的商户号自动匹配对应公司的旅行社。 - -### `POST` /admin/contract/scheme — 创建合同方案 -### `PUT` /admin/contract/scheme/{schemeId} — 更新合同方案 - -| 字段 | 变更 | 说明 | -|------|------|------| -| `agencyCode` | 必填 → **可选** | 不填则根据订单支付商户号自动匹配旅行社 | - -**前端调整**: -- "旅行社"字段去掉必填星号 `*` -- 可以保留下拉选择,但允许不选 -- 表单提交时不再校验旅行社必填 - ---- - -## 四、合同方案管理接口一览 - -以下接口用于"合同管理 → 合同方案"页面: - -### `GET` /admin/contract/scheme/list-all — 全部方案列表(管理页面) - -**响应**:`Result>` - -| 字段 | 类型 | 说明 | -|------|------|------| -| `schemeId` | String | 方案ID | -| `name` | String | 方案名称 | -| `description` | String | 方案描述 | -| `contractPlatform` | String | 合同平台:`12301`/`FADADA` | -| `contractTemplateCode` | String | 合同模板编码 | -| `contractMode` | String | 签约模式:`STANDARD`=电子签约,`SYNC`=线下报备 | -| `signatoryMode` | Integer | 签署模式:1=短信签署,2=现场签署,3=线下签署 | -| `agencyCode` | String | 旅行社编码(可能为空) | -| `disputeResolution` | Integer | 争议解决方式:1=仲裁,2=诉讼 | -| `supplementaryClause` | String | 补充条款 | -| `transactorName` | String | 经办人姓名 | -| `transactorPhone` | String | 经办人电话 | -| `sortOrder` | Integer | 排序 | -| `status` | String | 状态:`ACTIVE`/`INACTIVE` | - -### `GET` /admin/contract/scheme/list — 启用方案列表(产品配置下拉) - -只返回 `status=ACTIVE` 的方案,用于产品编辑页"合同方案"下拉选择。 - -### `POST` /admin/contract/scheme — 创建方案 - -**请求参数**: - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| `name` | String | 是 | 方案名称 | -| `description` | String | 否 | 方案描述 | -| `contractPlatform` | String | 是 | 合同平台:`12301`/`FADADA` | -| `contractTemplateCode` | String | 是 | 合同模板编码(从模板列表接口获取) | -| `contractMode` | String | 是 | 签约模式:`STANDARD`/`SYNC` | -| `signatoryMode` | Integer | 是 | 签署模式:1/2/3 | -| `agencyCode` | String | **否** | 旅行社编码(不填则自动匹配) | -| `disputeResolution` | Integer | 是 | 争议解决方式:1=仲裁,2=诉讼 | -| `supplementaryClause` | String | 否 | 补充条款 | -| `transactorName` | String | 是 | 经办人姓名 | -| `transactorPhone` | String | 是 | 经办人电话 | -| `sortOrder` | Integer | 否 | 排序(默认0) | - -### `PUT` /admin/contract/scheme/{schemeId} — 更新方案 - -请求参数同创建。 - -### `PUT` /admin/contract/scheme/{schemeId}/toggle-status — 切换启用/停用 - -### `DELETE` /admin/contract/scheme/{schemeId} — 删除方案 - ---- - -## 五、合同方案响应新增回显字段 + 字段别名 - -### 变更说明 - -合同方案响应(`ContractSchemeVO`)新增以下字段,解决**编辑回显**和**字段命名统一**问题: - -| 新增字段 | 类型 | 说明 | -|----------|------|------| -| `templateCode` | String | 合同模板编码(与 `contractTemplateCode` **相同值**,方便前端统一使用 `templateCode` 绑定下拉) | -| `contractTemplateName` | String | 合同模板名称(回显用,如"国内旅游合同-标准版") | -| `agencyName` | String | 旅行社名称(回显用,如"内蒙古呼籁国际旅行社有限公司") | - -### 保存时字段兼容 - -保存(创建/更新)时,**`contractTemplateCode` 和 `templateCode` 都接受**。前端可以统一用 `templateCode` 作为合同模板下拉的 `value` 字段。 - -```json -// 以下两种写法等价: -{ "contractTemplateCode": "A00001", ... } -{ "templateCode": "A00001", ... } -``` - -### 前端使用方式 - -1. **模板下拉绑定**:用 `templateCode` 作为下拉的 `v-model` 绑定值 -2. **编辑回显**:方案详情返回的 `templateCode` 可直接匹配模板列表的 `templateCode` -3. **模板名称显示**:列表页可直接用 `contractTemplateName` 显示模板名称,无需额外查询 -4. **旅行社名称显示**:列表页可用 `agencyName` 显示旅行社名称 - -### 完整响应示例 - -```json -{ - "schemeId": "123456789", - "name": "标准国内电子签约方案", - "contractPlatform": "12301", - "contractTemplateCode": "A00001", - "templateCode": "A00001", - "contractTemplateName": "国内旅游合同-标准版", - "contractMode": "STANDARD", - "signatoryMode": 1, - "agencyCode": "agency_hlgj", - "agencyName": "内蒙古呼籁国际旅行社有限公司", - "disputeResolution": 1, - "transactorName": "张三", - "transactorPhone": "13800138000", - "sortOrder": 0, - "status": "ACTIVE" -} -``` - ---- - -## 前端重点调整总结 - -| 页面 | 调整项 | -|------|--------| -| 合同方案新增/编辑表单 | "旅行社"去掉必填星号,允许不选 | -| 合同方案新增/编辑表单 | "合同模板"下拉根据选择的"合同平台"联动筛选,调用 `/admin/contract/templates?platform=xxx` | -| 合同方案新增/编辑表单 | 切换合同平台时清空已选的合同模板 | -| 合同方案新增/编辑表单 | 模板下拉 `v-model` 绑定 `templateCode`(保存和回显统一使用此字段) | -| 合同方案列表页 | 可用 `contractTemplateName` 和 `agencyName` 直接显示名称 | diff --git a/changelogs/2026-03/2026-03-20_gateway_room_type_fix.md b/changelogs/2026-03/2026-03-20_gateway_room_type_fix.md deleted file mode 100644 index 2644ce8..0000000 --- a/changelogs/2026-03/2026-03-20_gateway_room_type_fix.md +++ /dev/null @@ -1,28 +0,0 @@ -# 接口变更记录 — 2026-03-20 - -> **提交** `9e002e6` · **类型** bugfix -> -> fix: Gateway白名单补充房型详情接口路径 - -## 问题说明 - -小程序房型详情接口 `GET /mp/hotel/room-type/{roomTypeId}` 返回 **404**。 - -**原因**:Gateway 的 `JwtAuthFilter` 白名单遗漏了 `/mp/hotel/room-type/*` 路径,导致请求被 JWT 认证拦截。 - -## 修复内容 - -- Gateway `JwtAuthFilter` 白名单新增 `/mp/hotel/room-type/*` - -## 前端影响 - -- **无需任何修改**,接口路径、参数、响应格式不变 -- 修复部署后 `GET /mp/hotel/room-type/{roomTypeId}` 即可正常调用(无需登录token) - -## 关联接口 - -| 方法 | 路径 | 说明 | 是否需要登录 | -|------|------|------|-------------| -| GET | `/mp/hotel/room-type/{roomTypeId}` | 房型详情 | **否**(公开接口) | - -> 接口详细字段定义见 `2026-03-20_1127_508b792_feat.md` diff --git a/changelogs/2026-03/2026-03-20_hotel_assignment_upgrade.md b/changelogs/2026-03/2026-03-20_hotel_assignment_upgrade.md deleted file mode 100644 index 30cc60c..0000000 --- a/changelogs/2026-03/2026-03-20_hotel_assignment_upgrade.md +++ /dev/null @@ -1,176 +0,0 @@ -# 配房接口升级 — 按天粒度 + 房型升级差价自动计算 - -> 日期:2026-03-20 | 涉及服务:hl-order-service、hl-resource-service - -## 功能说明 - -配房接口从「按家庭+日期区间」改为「按天按家庭」粒度,每天可填备注。同时新增**房型升级差价自动计算**:如果配房时选的房型与产品默认不同(CORE产品默认标间),系统自动算出差价,临时加到尾款中,等定制师确认后正式生效。 - ---- - -## 接口变更清单 - -### 1. 分配酒店信息(**破坏性变更**) - -``` -PUT /admin/order/{orderId}/hotel-assignment -``` - -**请求体变更**:assignments 数组结构改为按天粒度 - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| assignments | Array | 是 | 酒店分配列表(按天按家庭,每天每个家庭一条) | -| assignments[].familyIndex | Integer | 是 | 家庭序号 | -| assignments[].hotelId | Long | **是(新增)** | 酒店ID | -| assignments[].hotelName | String | 是 | 酒店名称 | -| assignments[].roomTypeId | Long | **是(新增)** | 房型ID | -| assignments[].roomType | String | 是 | 房型名称 | -| assignments[].date | String | **是(新增,替代 checkInDate/checkOutDate)** | 单天日期,格式 `yyyy-MM-dd` | -| assignments[].remark | String | 否(新增) | 当天备注 | -| assignments[].upgradePrice | BigDecimal | 否(新增) | 手动覆盖升级差价(null=使用系统计算值) | - -**删除的字段**:`checkInDate`、`checkOutDate` - -**示例请求**: -```json -{ - "assignments": [ - { - "familyIndex": 1, - "hotelId": 1001, - "hotelName": "呼伦贝尔大酒店", - "roomTypeId": 2001, - "roomType": "豪华大床房", - "date": "2026-04-01", - "remark": "需要加床" - }, - { - "familyIndex": 1, - "hotelId": 1001, - "hotelName": "呼伦贝尔大酒店", - "roomTypeId": 2001, - "roomType": "豪华大床房", - "date": "2026-04-02", - "remark": "" - }, - { - "familyIndex": 2, - "hotelId": 1001, - "hotelName": "呼伦贝尔大酒店", - "roomTypeId": 2002, - "roomType": "标间", - "date": "2026-04-01", - "remark": "" - } - ] -} -``` - -**房型升级逻辑(自动触发)**: -- 如果分配的 roomTypeId 与产品快照中该天默认房型不同 → 自动计算差价 -- CORE产品(快照中 roomTypeId 为 null)→ 默认基准为该酒店的标间(STANDARD) -- 差价 = 新房型日价格 - 默认房型日价格(来自价格日历) -- `upgradePrice` 可手动覆盖系统计算的差价 -- **定制师操作**:差价自动确认,直接调整订单总售价 -- **其他角色操作**:差价设为「待确认」临时加到尾款,通知定制师确认 - -**响应**:无变化,`Result` - ---- - -### 2. 配房升级差价预览(**新增接口**) - -``` -POST /admin/order/{orderId}/hotel-assignment/preview -``` - -**说明**:预览配房的房型升级差价(不创建任何记录),前端可在用户提交配房前展示差价信息。 - -**请求体**:同分配酒店信息接口 - -**响应**:`Result` - -| 字段 | 类型 | 说明 | -|------|------|------| -| details | Array | 各天差价明细(仅有差价的天) | -| details[].familyIndex | Integer | 家庭序号 | -| details[].date | String | 日期 | -| details[].defaultRoomTypeId | Long | 产品默认房型ID | -| details[].defaultRoomTypeName | String | 产品默认房型名称 | -| details[].assignedRoomTypeId | Long | 实际分配房型ID | -| details[].assignedRoomTypeName | String | 实际分配房型名称 | -| details[].defaultPrice | BigDecimal | 默认房型当天单价 | -| details[].assignedPrice | BigDecimal | 实际房型当天单价 | -| details[].dayDiff | BigDecimal | 当天差价(正=补款,负=退款) | -| details[].direction | String | UPGRADE / DOWNGRADE / SAME | -| details[].remark | String | 备注 | -| totalDiff | BigDecimal | 差价合计 | -| direction | String | UPGRADE / DOWNGRADE / SAME / MIXED | -| description | String | 差价描述 | - -**示例响应**: -```json -{ - "code": 200, - "data": { - "details": [ - { - "familyIndex": 1, - "date": "2026-04-01", - "defaultRoomTypeId": 2002, - "defaultRoomTypeName": "标间", - "assignedRoomTypeId": 2001, - "assignedRoomTypeName": "豪华大床房", - "defaultPrice": 300.00, - "assignedPrice": 500.00, - "dayDiff": 200.00, - "direction": "UPGRADE", - "remark": "需要加床" - } - ], - "totalDiff": 200.00, - "direction": "UPGRADE", - "description": "共 1 天有差价,合计 +200.00" - } -} -``` - ---- - -### 3. 尾款调整汇总(**字段增强**) - -``` -GET /admin/order/{orderId}/itinerary/balance-summary -``` - -**响应新增字段**: - -| 字段 | 类型 | 说明 | -|------|------|------| -| confirmedAdjustment | BigDecimal | **新增** — 已确认的调整金额(已计入总售价) | -| pendingAdjustment | BigDecimal | **新增** — 待确认的调整金额(临时,待定制师确认) | -| totalAdjustment | BigDecimal | 合计(已确认 + 待确认) | -| details[].confirmStatus | String | **新增** — `CONFIRMED` 或 `PENDING_CONFIRM` | - ---- - -## 页面影响 - -### 配房页面 -1. **数据结构改造**:从日期区间改为按天列表,每天一条记录 -2. **新增字段**:每天增加备注输入框(remark) -3. **房型选择联动**:选择房型后,调用 preview 接口展示差价 -4. **差价展示**:如果有差价,在提交前展示差价明细和合计,支持手动修改 upgradePrice -5. **提交**:PUT hotel-assignment 时传入完整按天列表 - -### 订单详情页 — 尾款区域 -1. 展示「已确认调整」和「待确认调整(临时)」两个金额 -2. 待确认项标记为临时状态,提示「待定制师确认」 - -### 推荐交互流程 -``` -选择酒店+房型 → 填写每天备注 → 点击「预览差价」 - → 展示差价明细(可修改 upgradePrice) - → 点击「确认配房」→ 调用 PUT hotel-assignment -``` diff --git a/changelogs/2026-03/2026-03-20_mp_traveler_edit_cascade.md b/changelogs/2026-03/2026-03-20_mp_traveler_edit_cascade.md deleted file mode 100644 index ff507a7..0000000 --- a/changelogs/2026-03/2026-03-20_mp_traveler_edit_cascade.md +++ /dev/null @@ -1,51 +0,0 @@ -# 接口变更记录 — 2026-03-20(小程序出行人修改级联处理) - -> **类型** feature - ---- - -## 功能说明 - -小程序端用户可以在**行程开始前**随时修改出行人信息。修改后系统自动执行以下流程: - -1. **退保** — 作废已购买的保险单 -2. **作废合同** — 作废已签署/已创建的合同 -3. **重置待办** — INSURANCE、CONTRACT 待办回到待处理 -4. **流程状态回退** — processStatus 回退到 `PENDING_INSURANCE` -5. **自动重新投保+签约** — 如果订单已付款,系统自动用新出行人信息重新投保和签约 - -## 使用的接口(无变更) - -### `PUT` /mp/order/{orderId}/edit — 小程序编辑订单 - -请求参数不变: - -| 字段 | 类型 | 说明 | -|------|------|------| -| `departureDate` | String(日期) | 出发日期(可选) | -| `travelers` | Array | 出行人列表(可选,传则全量替换) | - -出行人对象: - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| `name` | String | 是 | 姓名 | -| `idCardType` | String | 是 | 证件类型:`ID_CARD`/`PASSPORT`/`OTHER` | -| `idCardNo` | String | 是 | 证件号 | -| `phone` | String | 否 | 手机号 | -| `gender` | Integer | 否 | 性别:1=男,2=女 | -| `birthday` | String(日期) | 否 | 出生日期 | -| `travelerType` | String | 否 | 类型:`ADULT`/`CHILD`/`BABY` | -| `nationality` | String | 否 | 国籍(默认中国) | -| `emergencyContact` | String | 否 | 紧急联系人 | -| `emergencyPhone` | String | 否 | 紧急联系人电话 | - -## 前端注意事项 - -| 项目 | 说明 | -|------|------| -| **可编辑状态** | 待支付、已付定金、已全额支付、已确认、待付尾款、待出行 | -| **不可编辑状态** | 旅行中、已完成、已取消、退款中、已退款 | -| **修改后的提示** | 修改出行人后,如果订单已付款,告知用户"系统正在重新处理保险和合同" | -| **全量替换** | 传 `travelers` 时是全量替换,请传所有出行人(不是增量修改) | -| **自动重新处理** | 后端自动退保→重新投保、作废合同→重新签约,前端无需额外调用 | diff --git a/changelogs/2026-03/2026-03-20_notification_template_fix.md b/changelogs/2026-03/2026-03-20_notification_template_fix.md deleted file mode 100644 index 8dd9d06..0000000 --- a/changelogs/2026-03/2026-03-20_notification_template_fix.md +++ /dev/null @@ -1,83 +0,0 @@ -# 通知模板修正 + 订单详情字段补全 - -> **类型**: fix -> **日期**: 2026-03-20 -> **涉及服务**: hl-order-service、hl-mp-service -> **后端状态**: ✅ 已完成并部署 - ---- - -## 一、小程序订单详情接口新增字段 - -### GET `/mp/order/{orderId}` 订单详情 - -响应新增以下字段: - -| 字段 | 类型 | 说明 | -|------|------|------| -| surchargeAmount | BigDecimal | 费用增加总额(如升级房型补差价) | -| surcharges | List | 费用增加项列表(同优惠项 discounts 结构对称) | -| displayStatus | String | 展示状态(前端主要使用此字段展示订单状态) | -| displayStatusLabel | String | 展示状态中文标签 | -| transportSegments | List | 交通段列表(大交通信息) | -| sharerOpenid | String | 分享者openid | - -### displayStatus 枚举值 - -| 值 | 标签 | 说明 | -|----|------|------| -| PENDING_PAY | 待支付 | 订单创建未支付 | -| DEPOSIT_PAID | 已付定金 | 定金已支付 | -| PAID | 已支付 | 全款已支付 | -| CONFIRMED | 已确认 | 订单已确认 | -| PENDING_BALANCE | 待付尾款 | 等待用户支付尾款 | -| PENDING_DEPARTURE | 待出发 | 内部流程完成,等待出发 | -| TRAVELLING | 出行中 | 行程进行中 | -| COMPLETED | 已完成 | 行程结束 | -| CANCELLED | 已取消 | 订单已取消 | -| REFUNDING | 退款中 | 退款处理中 | -| REFUNDED | 已退款 | 退款完成 | - -### surcharges 列表项结构 - -| 字段 | 类型 | 说明 | -|------|------|------| -| surchargeId | String | 费用增加项ID | -| orderId | String | 订单ID | -| surchargeName | String | 费用增加项名称(如"升级房型补差价") | -| surchargeAmount | BigDecimal | 金额 | -| createTime | DateTime | 创建时间 | - -### 前端使用建议 - -- **订单状态展示**:优先使用 `displayStatus` + `displayStatusLabel`,而非 `status` -- **金额汇总区域**:新增"费用增加"行 - ``` - 总价: ¥3000.00 - 优惠: -¥100.00 - 增加: +¥200.00 ← 新增(surchargeAmount > 0 时显示) - 定金: ¥1000.00 - 尾款: ¥2100.00 - ``` -- **费用增加项列表**:在优惠项列表下方展示 surcharges 列表 - ---- - -## 二、通知消息内容修正 - -所有通知模板(站内信/短信/订阅消息/公众号)内容已优化,**前端无需改动**,后端自动生效。 - -以下是修正的内容汇总(仅供参考,前端不需要处理模板内容): - -| 事件 | 修正前问题 | 修正后 | -|------|-----------|--------| -| 定金支付成功 | 缺出发日期 | 补充出发日期 + 尾款提示 | -| 全款支付成功 | 缺出发日期 | 补充出发日期 | -| 订单已取消 | 变量名不匹配,reason显示为空 | 修正变量名,正确显示取消原因 | -| 退款已申请 | 缺退款金额 | 补充退款金额 | -| 退款被驳回 | 变量名不匹配,原因显示为空 | 修正变量名,正确显示驳回原因 | -| 行程已修改 | 变量名不匹配 | 修正变量名 | -| 房型/车型已变更 | 变量名不匹配 | 修正变量名 | -| 修改已确认 | 模板内容为空 | 补全模板 | -| 级联失效通知 | 变量名不匹配 | 修正变量名 | -| 所有金额 | 缺 ¥ 符号 | 统一加 ¥ 前缀 | diff --git a/changelogs/2026-03/2026-03-20_order_auto_insurance_contract.md b/changelogs/2026-03/2026-03-20_order_auto_insurance_contract.md deleted file mode 100644 index d4d3ad1..0000000 --- a/changelogs/2026-03/2026-03-20_order_auto_insurance_contract.md +++ /dev/null @@ -1,247 +0,0 @@ -# 订单自动化:产品绑定保险方案+合同配置,支付后自动投保+签约 - -> 日期:2026-03-20 | 涉及服务:hl-product-service、hl-order-service、hl-insurance-service、hl-contract-service - -## 功能说明 - -### 核心变更 - -1. **产品新增保险+合同配置字段(必填)**:创建/编辑产品时必须绑定保险方案和合同配置 -2. **订单支付后自动投保+签约**:出行人补全后系统自动完成保险和合同,无需管理员手动操作 -3. **去掉"待确认订单"步骤**:原6步待办缩减为5步,CONFIRM_ORDER 不再存在 -4. **保险手动配置支持按天配置或直接选方案**:管理员可手动按天投保(purchase 接口),也可直接选方案自动投保 - -### 新的订单内部流程 - -``` -支付成功 → 创建5个待办 → 出行人补全 → 系统自动确认订单 - → 自动投保(按产品绑定的保险方案) ← INSURANCE待办自动完成 - → 自动签约(按产品绑定的合同配置) ← CONTRACT待办等签署回调完成 - → 手动配房 (ARRANGE_ROOM) - → 手动配车 (ARRANGE_VEHICLE) - → 手动确认清单 (CONFIRM_CHECKLIST) -``` - -**容错**:自动投保/签约失败时,待办保持 PENDING,管理员可手动处理。管理员也可手动退保/作废合同后重新操作。 - ---- - -## 接口变更清单 - -### 一、产品服务 - -#### 1. 创建产品(新增必填字段) - -``` -POST /admin/product -``` - -**新增请求字段**(所有字段必填,supplementaryClause 除外): - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| insuranceSchemeId | Long | 是 | 保险方案ID,从保险方案列表获取 | -| contractPlatform | String | 是 | 合同平台:`12301`(全国旅游监管平台)/ `FADADA`(法大大) | -| contractTemplateCode | String | 是 | 合同模板编码,从合同模板列表获取 | -| contractMode | String | 是 | 签约模式:`STANDARD`(电子签约)/ `SYNC`(线下报备) | -| signatoryMode | Integer | 是 | 签署模式:`1`=短信 / `2`=现场 / `3`=线下 | -| agencyCode | String | 是 | 旅行社编码,从保险投保主体列表获取 | -| disputeResolution | Integer | 是 | 争议解决方式:`1`=仲裁 / `2`=诉讼 | -| supplementaryClause | String | 否 | 合同补充条款 | -| transactorName | String | 是 | 经办人姓名 | -| transactorPhone | String | 是 | 经办人电话 | - -#### 2. 编辑产品(新增可选字段) - -``` -PUT /admin/product/{productId} -``` - -同上 10 个字段,全部可选(不传则不更新)。 - -#### 3. 统一保存产品(新增字段) - -``` -POST /admin/product/save -``` - -同上 10 个字段,创建时必填,更新时可选。 - ---- - -### 二、保险服务 - -#### 已有接口(手动配置保险) - -**方式一:按天手动投保**(purchase 接口,按具体的计划+日期段投保) - -``` -POST /admin/insurance/purchase -``` - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| orderId | Long | 否 | 关联的旅行订单ID | -| planId | Long | 是 | 保险计划ID(从产品计划列表获取) | -| startDate | String | 是 | 保障开始日期 yyyy-MM-dd | -| endDate | String | 是 | 保障结束日期 yyyy-MM-dd | -| insuredPersons | Array | 是 | 被保人列表(至少1人) | -| insuredPersons[].name | String | 是 | 姓名 | -| insuredPersons[].idCardType | String | 否 | 证件类型:`ID_CARD`/`PASSPORT`/`OTHER`,默认ID_CARD | -| insuredPersons[].idCardNo | String | 是 | 证件号 | -| insuredPersons[].birthday | String | 是 | 出生日期 yyyy-MM-dd | -| insuredPersons[].gender | String | 是 | 性别:`MALE`/`FEMALE` | -| entityCode | String | 否 | 投保公司编码,默认使用系统默认主体 | - -**方式二:选择保险方案投保**(preview → 确认 → 自动按段投保) - -步骤1:预览方案 - -``` -POST /admin/insurance/scheme/preview-apply -``` - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| schemeId | Long | 是 | 保险方案ID | -| orderId | Long | 是 | 订单ID(自动获取出行日期和人数) | - -返回各段的日期范围、计划信息、单人保费、总保费、日期间隙警告。 - -步骤2:确认后逐段调用 purchase 接口(参考方式一) - -**保险方案列表**(产品编辑页下拉使用): - -``` -GET /admin/insurance/scheme/list -``` - -返回所有启用的保险方案列表(schemeId + name + description + isOverseas + 段列表)。 - -**保险产品/计划列表**(按天手动投保时使用): - -``` -GET /admin/insurance/products?isOverseas=false -GET /admin/insurance/products/{productId}/plans -``` - -**保费试算**: - -``` -POST /admin/insurance/trial-price -``` - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| planId | Long | 是 | 保险计划ID | -| startDate | String | 是 | yyyy-MM-dd | -| endDate | String | 是 | yyyy-MM-dd | -| insuredCount | Integer | 是 | 被保人数 | - ---- - -### 三、合同服务 - -**合同模板列表**(产品编辑页下拉使用): - -``` -GET /admin/contract/templates -``` - -返回可用的合同模板列表(templateCode + templateName + platform + mode)。 - -**投保主体/旅行社列表**(产品编辑页下拉使用): - -``` -GET /admin/insurance/entities -``` - -返回投保公司主体列表(code + companyName)。agencyCode 使用此列表中的 code 值。 - ---- - -### 四、订单服务 - -#### 待办定义变更(**破坏性变更**) - -| 原 todoType | 原序号 | 新 todoType | 新序号 | 说明 | -|-------------|--------|-------------|--------|------| -| CONFIRM_ORDER | 1 | **已删除** | - | 不再需要手动确认 | -| INSURANCE | 2 | INSURANCE | 1 | 自动完成(系统投保成功后) | -| CONTRACT | 3 | CONTRACT | 2 | 自动完成(合同签署回调后) | -| ARRANGE_ROOM | 4 | ARRANGE_ROOM | 3 | 手动 | -| ARRANGE_VEHICLE | 5 | ARRANGE_VEHICLE | 4 | 手动 | -| CONFIRM_CHECKLIST | 6 | CONFIRM_CHECKLIST | 5 | 手动 | - -#### processStatus 变更 - -| 原流程 | 新流程 | -|--------|--------| -| PENDING_INFO → **PROCESSING** → PENDING_INSURANCE → ... | PENDING_INFO → PENDING_INSURANCE → ... | - -`PROCESSING` 状态已删除,`PENDING_INFO` 直接跳到 `PENDING_INSURANCE`。 - -#### 前端需要注意 - -1. **待办列表不再有 CONFIRM_ORDER 类型**:前端不要 hardcode "CONFIRM_ORDER" 的判断 -2. **工作台待办序号变化**:INSURANCE 现在是 seq=1(原来是2),以此类推 -3. **processStatus 没有 PROCESSING 了**:相关状态标签/过滤条件需要去掉 -4. **INSURANCE/CONTRACT 待办可能被系统自动完成**:前端展示时注意区分系统完成和手动完成 - ---- - -## 页面布局建议 - -### 产品编辑页 — 新增"保险与合同配置"区域 - -建议放在产品基本信息之后,行程安排之前: - -``` -┌─────────────────────────────────────────┐ -│ 保险与合同配置 │ -├─────────────────────────────────────────┤ -│ 保险方案:[下拉选择] ← GET /admin/insurance/scheme/list │ -│ │ -│ 合同平台:[12301 ▼] / [法大大 ▼] │ -│ 合同模板:[下拉选择] ← GET /admin/contract/templates │ -│ 签约模式:[电子签约 ▼] / [线下报备 ▼] │ -│ 签署模式:[短信 ▼] / [现场 ▼] / [线下 ▼] │ -│ 旅行社: [下拉选择] ← GET /admin/insurance/entities │ -│ 争议解决:[仲裁 ▼] / [诉讼 ▼] │ -│ 经办人姓名:[________] │ -│ 经办人电话:[________] │ -│ 补充条款:[________________] (可选) │ -└─────────────────────────────────────────┘ -``` - -### 订单详情页 — 保险手动操作 - -管理员手动配保险时有两种方式: - -``` -┌─────────────────────────────────────────┐ -│ 保险配置 │ -├─────────────────────────────────────────┤ -│ ● 选择保险方案(推荐) │ -│ [方案下拉] → 预览 → 确认投保 │ -│ │ -│ ○ 按天手动配置 │ -│ 保险产品:[下拉] │ -│ 保险计划:[下拉] │ -│ 开始日期:[____] 结束日期:[____] │ -│ [试算保费] [确认投保] │ -└─────────────────────────────────────────┘ -``` - ---- - -## 枚举/字典值 - -| 字段 | 可选值 | 说明 | -|------|--------|------| -| contractPlatform | `12301` / `FADADA` | 合同平台 | -| contractMode | `STANDARD` / `SYNC` | 签约模式 | -| signatoryMode | `1` / `2` / `3` | 1=短信签署, 2=现场签署, 3=线下签署 | -| disputeResolution | `1` / `2` | 1=仲裁, 2=诉讼 | -| todoType | `INSURANCE` / `CONTRACT` / `ARRANGE_ROOM` / `ARRANGE_VEHICLE` / `CONFIRM_CHECKLIST` | 待办类型(CONFIRM_ORDER 已删除) | -| processStatus | `PENDING_INFO` / `PENDING_INSURANCE` / `PENDING_CONTRACT` / `PENDING_ROOM` / `PENDING_VEHICLE` / `PENDING_FINANCE` / `READY` / `INTERNAL_CONFIRMED` | 内部流程状态(PROCESSING 已删除) | diff --git a/changelogs/2026-03/2026-03-20_order_surcharge.md b/changelogs/2026-03/2026-03-20_order_surcharge.md deleted file mode 100644 index 9df00da..0000000 --- a/changelogs/2026-03/2026-03-20_order_surcharge.md +++ /dev/null @@ -1,145 +0,0 @@ -# 订单费用增加项(surcharge) - -## 功能说明 - -新增"费用增加项"功能,与现有"优惠项"(discount)对称: -- **优惠项**:减少尾款(-¥) -- **费用增加项**:增加尾款(+¥),如升级房型补差价、加座费等 - -### 权限限制 -- **优惠项**:任意管理员可操作 -- **费用增加项**:仅该订单的**定制师本人**或**超级管理员(SUPER_ADMIN)**可操作 - -### 金额计算变更(破坏性变更) -- **尾款** = 总价 - 定金 - 优惠总额 + **费用增加总额** -- **全款** = 总价 - 优惠总额 + **费用增加总额** - ---- - -## 接口清单 - -### 添加费用增加项 -- **POST** `/admin/order/{orderId}/surcharge` -- **权限**:定制师本人 或 SUPER_ADMIN -- **请求体**:`SurchargeRequest` -- **响应**:`Result` - -### 修改费用增加项 -- **PUT** `/admin/order/{orderId}/surcharge/{surchargeId}` -- **权限**:定制师本人 或 SUPER_ADMIN -- **请求体**:`SurchargeRequest` -- **响应**:`Result` - -### 删除费用增加项 -- **DELETE** `/admin/order/{orderId}/surcharge/{surchargeId}` -- **权限**:定制师本人 或 SUPER_ADMIN -- **响应**:`Result` - ---- - -## SurchargeRequest 参数 - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| surchargeName | String | 是 | 费用增加项名称,如"升级房型补差价" | -| surchargeAmount | BigDecimal | 是 | 费用增加金额,必须大于0 | - -## OrderSurcharge 响应 - -| 字段 | 类型 | 说明 | -|------|------|------| -| surchargeId | String | 费用增加项ID | -| orderId | String | 订单ID | -| surchargeName | String | 费用增加项名称 | -| surchargeAmount | BigDecimal | 费用增加金额 | -| createTime | DateTime | 创建时间 | - ---- - -## 订单详情/列表接口变更 - -### OrderDetailVO 新增字段 - -| 字段 | 类型 | 说明 | -|------|------|------| -| surchargeAmount | BigDecimal | 费用增加总额(缓存汇总值) | -| surcharges | List\ | 费用增加项列表 | - -### OrderListVO 新增字段 - -| 字段 | 类型 | 说明 | -|------|------|------| -| surchargeAmount | BigDecimal | 费用增加总额 | - -### balanceAmount 计算变更 - -原来:`balanceAmount = totalPrice - depositAmount - discountAmount` -现在:`balanceAmount = totalPrice - depositAmount - discountAmount + surchargeAmount` - ---- - -## 页面布局建议 - -### 订单详情页 — 费用区域 - -在现有"优惠项"区域下方新增"费用增加项"区域: - -``` -优惠项 - ├ 会员折扣 -¥100.00 [编辑] [删除] ← 任意管理员可操作 - └ [+ 添加优惠项] - -费用增加项 - ├ 升级房型补差价 +¥200.00 [编辑] [删除] ← 仅定制师/超管可操作 - └ [+ 添加费用增加项] ← 仅定制师/超管可见 - -金额汇总 - 总价: ¥3000.00 - 优惠: -¥100.00 - 增加: +¥200.00 - 定金: ¥1000.00 - 尾款: ¥2100.00 (3000 - 1000 - 100 + 200) -``` - -### 权限判断 - -前端需要根据当前登录用户判断是否显示"添加/编辑/删除"费用增加项的按钮: -- 当前用户 `roleKey === 'SUPER_ADMIN'` → 显示 -- 当前用户 `adminId === order.customizerId` → 显示 -- 其他情况 → 隐藏按钮 - ---- - -## 调用示例 - -### 添加费用增加项 -```json -POST /admin/order/1234567890/surcharge -{ - "surchargeName": "升级房型补差价", - "surchargeAmount": 200.00 -} -``` - -### 修改费用增加项 -```json -PUT /admin/order/1234567890/surcharge/9876543210 -{ - "surchargeName": "升级豪华房型补差价", - "surchargeAmount": 300.00 -} -``` - -### 删除费用增加项 -``` -DELETE /admin/order/1234567890/surcharge/9876543210 -``` - -### 错误响应示例(权限不足) -```json -{ - "code": 500, - "message": "仅超级管理员或该订单的定制师可操作费用增加项", - "data": null -} -``` diff --git a/changelogs/2026-03/2026-03-20_pricing_cleanup.md b/changelogs/2026-03/2026-03-20_pricing_cleanup.md deleted file mode 100644 index 94e96dc..0000000 --- a/changelogs/2026-03/2026-03-20_pricing_cleanup.md +++ /dev/null @@ -1,165 +0,0 @@ -# 接口变更记录 — 2026-03-20(定价字段精简 + 保险校验) - -> **类型** refactor + feature -> -> 定价配置精简(移除6个冗余字段)+ 保险方案天数校验 + 保险费自动回填 - ---- - -## 一、定价配置字段精简 - -### 1. 移除 `maxGroupSize`(最多成团人数) - -**原因**:业务上只需要"成团人数"一个概念,不需要区分最少/最多。 - -**前端需要调整**: -- 定价规则页面:移除"最多成团"输入框,只保留"成团人数"(字段 `minGroupSize`) -- `minGroupSize` 语义变为"成团人数",不再是"最少成团" - -| 字段 | 变更 | 说明 | -|------|------|------| -| ~~`maxGroupSize`~~ | **已移除** | 请求和响应都不再有此字段 | -| `minGroupSize` | **含义变更** | 现在代表"成团人数"(原为"最少成团人数") | - -### 2. 移除4个未使用的价格体系字段 - -**原因**:这4个字段从未参与任何价格计算逻辑,只是存储和展示,属于冗余数据。 - -| 移除的字段 | 原含义 | 说明 | -|-----------|--------|------| -| ~~`singleRoomDiff`~~ | 单房差 | **已移除** | -| ~~`adultExtraBed`~~ | 成人加床 | **已移除** | -| ~~`childNoBed`~~ | 儿童不占床 | **已移除** | -| ~~`companionPrice`~~ | 陪同价 | **已移除** | - -**保留的价格字段**(实际参与计算): - -| 字段 | 含义 | 说明 | -|------|------|------| -| `childWithBed` | 儿童占床价 | 保留,参与儿童价计算 | -| `childDiscountPercent` | 儿童折扣百分比 | 保留,参与儿童价计算 | -| `babyPrice` | 婴儿价 | 保留,参与婴儿价计算 | -| `insuranceFee` | 保险费 | 保留,参与成本计算 | -| `mealBudget` | 餐费预算 | 保留 | -| `extraCostPerPerson` | 每人额外成本 | 保留 | - -### 受影响的接口 - -#### `POST` /admin/product/item/{productId}/pricing — 保存定价规则 - -**请求参数变更**: - -| 字段 | 变更 | -|------|------| -| ~~`maxGroupSize`~~ | **已移除** | -| ~~`singleRoomDiff`~~ | **已移除** | -| ~~`adultExtraBed`~~ | **已移除** | -| ~~`childNoBed`~~ | **已移除** | -| ~~`companionPrice`~~ | **已移除** | - -#### `GET` /admin/product/item/{productId}/pricing — 获取定价规则 - -**响应变更**:同上5个字段从响应中移除。 - -#### 小程序端 — 定制产品详情 - -`MpCustomProductDetailVO.PricingItem` 同步移除以上5个字段。 - ---- - -## 二、保险方案天数校验 - -### 功能说明 - -产品选择保险方案时,系统会校验保险方案的**适用行程天数**是否与产品**行程天数**一致。不一致时拒绝保存。 - -### 保险方案列表新增字段 - -#### `GET` /admin/insurance/scheme — 保险方案列表 - -响应新增字段: - -| 字段 | 类型 | 说明 | -|------|------|------| -| `totalDays` | Integer | 适用行程天数(根据保障段自动计算) | - -### 产品保存时校验逻辑 - -- 创建/编辑产品时,如果设置了 `insuranceSchemeId`,系统自动调用保险服务校验 -- 如果保险方案的 `totalDays` 与产品行程天数不匹配,返回错误提示:`保险方案「{方案名}」适用{N}天行程,但本产品行程为{M}天,请选择匹配的方案` - ---- - -## 三、保险费自动回填 - -### 功能说明 - -产品选择保险方案后,系统自动计算每人保险费并回填到定价配置的 `insuranceFee` 字段。 - -### 新增接口:保险费预览 - -#### `GET` /admin/product/item/{productId}/pricing/insurance-fee-preview - -**用途**:前端选择保险方案时实时预览保险费,不保存。 - -**请求参数**: - -| 参数 | 类型 | 必填 | 说明 | -|------|------|------|------| -| `schemeId` | Long | 是 | 保险方案ID | - -**响应**:`Result` - -```json -{ - "code": 200, - "data": { - "schemeId": "1234567890", - "schemeName": "测试3日方案", - "totalDays": 3, - "tripDays": 3, - "perPersonPremium": 45.00 - } -} -``` - -| 字段 | 类型 | 说明 | -|------|------|------| -| `schemeId` | String | 保险方案ID | -| `schemeName` | String | 方案名称 | -| `totalDays` | Integer | 方案适用天数 | -| `tripDays` | Integer | 产品行程天数 | -| `perPersonPremium` | BigDecimal | 每人保险费(元) | - -**错误场景**: -- 产品不存在 → 404 -- 保险服务不可用 → 500("保险服务暂不可用") -- 天数不匹配 → 400(提示不匹配原因) - -### 自动回填逻辑 - -产品保存(创建/编辑)时: -1. 如果设置了 `insuranceSchemeId`,自动调用保险服务获取每人保险费 -2. 校验天数匹配(不匹配则报错) -3. 自动将 `perPersonPremium` 写入 `ProductPricing.insuranceFee` -4. 前端定价页面的"保险费"字段会自动更新为计算值(仍可手动修改) - ---- - -## 数据库变更 - -```sql --- 1. 移除 maxGroupSize -ALTER TABLE product_pricing DROP COLUMN max_group_size; - --- 2. 保险方案新增 totalDays -ALTER TABLE insurance_scheme ADD COLUMN total_days INT DEFAULT NULL COMMENT '适用行程天数'; - --- 3. 移除4个未使用的定价字段 -ALTER TABLE product_pricing DROP COLUMN single_room_diff; -ALTER TABLE product_pricing DROP COLUMN adult_extra_bed; -ALTER TABLE product_pricing DROP COLUMN child_no_bed; -ALTER TABLE product_pricing DROP COLUMN companion_price; -``` - -已在本地和测试环境执行完毕。 diff --git a/changelogs/2026-03/2026-03-20_remove_pricing_mode.md b/changelogs/2026-03/2026-03-20_remove_pricing_mode.md deleted file mode 100644 index afe52aa..0000000 --- a/changelogs/2026-03/2026-03-20_remove_pricing_mode.md +++ /dev/null @@ -1,57 +0,0 @@ -# 接口变更记录 — 2026-03-20 - -> **提交** `f59d78d` · **类型** refactor -> -> refactor: 移除定价模式(pricingMode)字段,价格统一在价格日历中设置 - -## 变更说明 - -**定价规则接口**中移除了 `pricingMode` 字段(原值 AUTO/MANUAL/CUSTOM)。 - -**原因**:`pricingMode` 是冗余字段,业务逻辑实际由价格日历中的 `costAutoCalc`(逐日控制自动/手动计算)和产品类型 `productType` 控制,`pricingMode` 从未参与任何业务判断。 - -## 前端需要调整 - -### 定价规则页面(产品编辑 → 定价规则) - -| 操作 | 说明 | -|------|------| -| **移除** "定价模式" 选择器 | 原来的 AUTO/手动定价/自定义 三选一控件,**直接删除** | -| **保留** 利润模式 | FIXED(固定金额)/ PERCENT(百分比加价),不变 | -| **保留** 其他所有字段 | 成团人数、价格体系(单房差、儿童价等)、支付方式,不变 | - -### 接口变更 - -#### `POST` /admin/product/item/{productId}/pricing — 保存定价规则 - -**请求参数变更**: - -| 字段 | 变更 | 说明 | -|------|------|------| -| ~~`pricingMode`~~ | **已移除** | 不再需要传此字段 | -| `profitMode` | 不变 | FIXED/PERCENT | -| 其他字段 | 不变 | — | - -#### `GET` /admin/product/item/{productId}/pricing — 获取定价规则 - -**响应变更**: - -| 字段 | 变更 | 说明 | -|------|------|------| -| ~~`pricingMode`~~ | **已移除** | 响应中不再返回此字段 | - -### 价格设置方式(无变化) - -价格统一在**价格日历**中设置,支持两种方式: -1. **自动测算**:点击"测算预览"或"自动计算成本"按钮,系统根据行程资源价格+利润参数自动算出成本和售价 -2. **手动填写**:直接在日历中手动输入每日的成人售价/成本价、儿童售价/成本价 - -每个日期的 `costAutoCalc` 标志控制该日期是自动还是手动,与原来的逻辑完全一致。 - -## 数据库变更 - -```sql -ALTER TABLE product_pricing DROP COLUMN pricing_mode; -``` - -已在本地和测试环境执行完毕。 diff --git a/changelogs/2026-03/2026-03-20_todo_display_fix.md b/changelogs/2026-03/2026-03-20_todo_display_fix.md deleted file mode 100644 index 8819820..0000000 --- a/changelogs/2026-03/2026-03-20_todo_display_fix.md +++ /dev/null @@ -1,46 +0,0 @@ -# 待办事项显示修正:使用 todoLabel 而非 todoType - -> **类型**: fix -> **日期**: 2026-03-20 -> **涉及页面**: 管理端 - 订单详情页 - 待办事项区域 - ---- - -## 问题 - -待办事项区域显示了英文编码(如 `INSURANCE`、`CONTRACT`、`ARRANGE_ROOM`),应该显示中文标签。 - -## 原因 - -前端使用了 `todoType` 字段(英文编码)来展示,应该使用 `todoLabel` 字段(中文标签)。 - -## 修正方式 - -订单详情接口 `todos` 数组中每个待办对象包含以下字段: - -| 字段 | 类型 | 用途 | 示例 | -|------|------|------|------| -| todoType | String | 编码(用于逻辑判断,**不要用于显示**) | `INSURANCE` | -| todoLabel | String | 中文标签(**用于页面展示**) | `待配置保险` | -| status | String | 状态编码 | `PENDING` / `COMPLETED` | -| sequence | Integer | 排序序号 | 1, 2, 3, 4, 5 | - -### todoType → todoLabel 对照表 - -| todoType | todoLabel | -|----------|-----------| -| INSURANCE | 待配置保险 | -| CONTRACT | 待签订合同 | -| ARRANGE_ROOM | 待安排住宿 | -| ARRANGE_VEHICLE | 待安排车辆 | -| CONFIRM_CHECKLIST | 待确认清单 | -| PROCESS_REFUND | 紧急:需退款处理 | - -### 前端改动 - -将待办事项显示的字段从 `todo.todoType` 改为 `todo.todoLabel`: - -```diff -- {{ todo.todoType }} -+ {{ todo.todoLabel }} -``` diff --git a/changelogs/2026-03/2026-03-21_0909_573e671_fix.md b/changelogs/2026-03/2026-03-21_0909_573e671_fix.md deleted file mode 100644 index dcf810e..0000000 --- a/changelogs/2026-03/2026-03-21_0909_573e671_fix.md +++ /dev/null @@ -1,93 +0,0 @@ -# 接口变更记录 — 2026-03-21 09:09 - -> **提交** `573e671` · **作者** wx · **时间** 2026-03-21 09:09:39 +0800 -> -> fix: 新增管理端获取订单出行人接口 GET /admin/order/{orderId}/travelers - -## 变更总览 - -- **订单服务** - - AdminOrder (+4) - ---- - -## 订单服务 - -### AdminOrder - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 分组 **「3.1 订单管理」** → 标签 **「管理端订单接口」** - -### 🆕 `GET` /admin/order/{orderId}/travelers — 获取订单出行人列表 - -> 返回指定订单的所有出行人信息,用于保险投保时自动填充被保人。 - -**参数** - - - `{orderId}` (`Long`) — 路径参数:订单ID - -**响应** `Result>` - -| 字段 | 类型 | 说明 | -| --- | --- | --- | -| `orderTravelerId` | `Long` | 出行人记录ID | -| `orderId` | `Long` | 订单ID | -| `name` | `String` | 出行人姓名 | -| `idCardType` | `String` | 证件类型(字典:id_card_type) | -| `idCardNo` | `String` | 证件号码(加密存储) | -| `phone` | `String` | 手机号码(加密存储) | -| `gender` | `Integer` | 性别(字典:gender) | -| `birthday` | `LocalDate` | 出生日期 | -| `travelerType` | `String` | 出行人类型(字典:traveler_type) | -| `nationality` | `String` | 国籍 | -| `emergencyContact` | `String` | 紧急联系人姓名 | -| `emergencyPhone` | `String` | 紧急联系人电话(加密存储) | -| `email` | `String` | 邮箱地址 | -| `deletedAt` | `LocalDateTime` | 删除时间(软删除) | -| `createTime` | `LocalDateTime` | 创建时间 | -| `updateTime` | `LocalDateTime` | 更新时间 | - -### 🆕 `POST` /admin/order/{orderId}/surcharge — 添加费用增加项 - -> 为订单添加费用增加项(如升级房型补差价、加座费等)。 - -**参数** - - - `{orderId}` (`Long`) — 路径参数:订单ID - -**请求体** `SurchargeRequest` - -**响应** `Result` - -### 🆕 `PUT` /admin/order/{orderId}/surcharge/{surchargeId} — 修改费用增加项 - -> 修改已添加的费用增加项名称或金额,修改后自动重算订单尾款金额。 - -**参数** - - - `{orderId}` (`Long`) — 路径参数:订单ID - - `{surchargeId}` (`Long`) — 路径参数:费用增加项ID - -**请求体** `SurchargeRequest` - -**响应** `Result` - -### 🆕 `DELETE` /admin/order/{orderId}/surcharge/{surchargeId} — 删除费用增加项 - -> 删除已添加的费用增加项,删除后自动重算订单尾款金额。 - -**参数** - - - `{orderId}` (`Long`) — 路径参数:订单ID - - `{surchargeId}` (`Long`) — 路径参数:费用增加项ID - -**响应** `Result` - ---- - -
    -📁 全部变更文件 (点击展开) - -``` -M hl-order-service/src/main/java/com/hulalv/order/controller/AdminOrderController.java -``` -
    \ No newline at end of file diff --git a/changelogs/2026-03/2026-03-21_0919_957312d_fix.md b/changelogs/2026-03/2026-03-21_0919_957312d_fix.md deleted file mode 100644 index cf46063..0000000 --- a/changelogs/2026-03/2026-03-21_0919_957312d_fix.md +++ /dev/null @@ -1,32 +0,0 @@ -# 接口变更记录 — 2026-03-21 09:19 - -> **提交** `957312d` · **作者** wx · **时间** 2026-03-21 09:19:54 +0800 -> -> fix: 产品订单逻辑优化(多角色审查) - -## 变更总览 - - ---- - -## 📦 其他数据对象变更 - -> 以下变更未直接关联到本次接口变更,但可能影响现有接口的请求/响应 - -### 小程序聚合服务 - -#### ✏️ MpProductQuoteVO - - - 🆕 `stock` (`Integer`) — 该日期剩余库存(null表示不限) - - 🆕 `available` (`Boolean`) — 该日期是否可订(库存>0或不限库存) - -
    -📁 全部变更文件 (点击展开) - -``` -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpProductController.java -M hl-mp-service/src/main/java/com/hulalv/mp/vo/MpProductQuoteVO.java -M hl-order-service/src/main/java/com/hulalv/order/service/OrderService.java -M hl-order-service/src/test/java/com/hulalv/order/service/OrderServiceTest.java -``` -
    \ No newline at end of file diff --git a/changelogs/2026-03/2026-03-21_1705_72433fa_fix.md b/changelogs/2026-03/2026-03-21_1705_72433fa_fix.md deleted file mode 100644 index a759220..0000000 --- a/changelogs/2026-03/2026-03-21_1705_72433fa_fix.md +++ /dev/null @@ -1,45 +0,0 @@ -# 接口变更记录 — 2026-03-21 17:05 - -> **提交** `72433fa` · **作者** wx · **时间** 2026-03-21 17:05:19 +0800 -> -> fix: 自动投保部分失败时回滚已成功段,防止半覆盖 - -## 变更总览 - -- **订单服务** - - 🆕 InternalAutoProcess (+2 接口) - ---- - -## 订单服务 - -### 🆕 新增: InternalAutoProcess - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 标签 **「【内部接口】自动化处理(运维用)」** - -### 📌 `POST` /internal/order/{orderId}/auto-process — 触发自动化处理(确认+投保+签约) - -**参数** - - - `{orderId}` (`Long`) — 路径参数 - -**响应** `Result` - -### 📌 `POST` /internal/order/{orderId}/auto-reprocess — 触发重新投保签约(跳过确认) - -**参数** - - - `{orderId}` (`Long`) — 路径参数 - -**响应** `Result` - ---- - -
    -📁 全部变更文件 (点击展开) - -``` -M hl-insurance-service/src/main/java/com/hulalv/insurance/service/InsuranceOrderService.java -A hl-order-service/src/main/java/com/hulalv/order/controller/InternalAutoProcessController.java -``` -
    \ No newline at end of file diff --git a/changelogs/2026-03/2026-03-21_code_quality_fixes.md b/changelogs/2026-03/2026-03-21_code_quality_fixes.md deleted file mode 100644 index abadf4f..0000000 --- a/changelogs/2026-03/2026-03-21_code_quality_fixes.md +++ /dev/null @@ -1,54 +0,0 @@ -# 代码质量修复(多模块) - -**日期**: 2026-03-21 -**服务**: hl-order-service, hl-user-service, hl-payment-service, hl-file-service, hl-contract-service, hl-mp-service, hl-product-service, hl-insurance-service -**类型**: Bug修复 + 性能优化 - ---- - -## 变更说明 - -本次修复了多模块的代码级 bug,均为后端内部逻辑优化,**不影响现有接口的请求/响应格式**。 - -### 修复清单 - -| 模块 | 修复内容 | -|------|---------| -| hl-order-service | BigDecimal.equals→compareTo 修复价格比较精度问题 | -| hl-order-service | GROUP下单报价 NPE 防护(quoteInfo.get() 空值处理) | -| hl-order-service | 订单号升级:毫秒精度+6位随机数,防碰撞 | -| hl-order-service | 自动投保/签约方案ID类型安全转换 | -| hl-order-service | GROUP下单出发日期已过校验 | -| hl-user-service | AdminAuthService 6处 NPE 防护(会话数据提取) | -| hl-payment-service | 日期查询参数格式校验(400替代500) | -| hl-file-service | 文件统计空值防护 | -| hl-contract-service | userId 类型安全转换 | -| hl-mp-service | 产品列表 GROUP 团期获取从串行改为并行(性能优化) | -| hl-product-service | 车辆绑定异常信息不泄露技术细节 | -| hl-insurance-service | 投保公司主体错误提示不泄露用户输入 | - -### 前端无需改动 - -以上修复均为后端内部逻辑,现有接口行为不变。 - ---- - -## 第二批修复(并发安全+幂等性+深层防护) - -| 模块 | 修复内容 | -|------|---------| -| hl-product-service | PriceCalendarService: new Thread() → CompletableFuture.runAsync() | -| hl-order-service | OrderExpiryJob: 分布式锁 TTL 4min → 5min(不短于任务间隔) | -| hl-order-service | OrderExpiryConsumer: 新增 Redis 幂等性检查 | -| hl-order-service | BatchDisbandConsumer: batchId 安全类型转换 | -| hl-order-service | GROUP下单 batchInfo 字段 null 防护 | -| hl-order-service | refundPolicyId 4处安全转换 | -| hl-order-service | contactPhone.substring 越界防护 | -| hl-order-service | Map.of() NPE 防护(STATUS_LABELS 查询前 null 检查) | -| hl-insurance-service | InsuranceOrderService STATUS_LABELS null 防护 | -| hl-contract-service | ContractService STATUS_LABELS null 防护 | -| 全项目 | ((Number) map.get()).xxxValue() → instanceof 检查(15处) | - -### 测试统计 - -15 模块 3598 测试全绿,0 回归。 diff --git a/changelogs/2026-03/2026-03-21_insurance_purchase_auto_fill.md b/changelogs/2026-03/2026-03-21_insurance_purchase_auto_fill.md deleted file mode 100644 index 5aa3a2f..0000000 --- a/changelogs/2026-03/2026-03-21_insurance_purchase_auto_fill.md +++ /dev/null @@ -1,97 +0,0 @@ -# 投保接口支持自动填充(orderId) - -**日期**: 2026-03-21 -**服务**: hl-insurance-service -**类型**: 功能增强 - ---- - -## 功能说明 - -`POST /admin/insurance/purchase` 投保接口现在支持传 `orderId` 自动从订单获取出行人和行程日期,无需手动填写 `startDate`、`endDate`、`insuredPersons`。 - -**之前**:必须手动传 planId + startDate + endDate + insuredPersons(完整被保人列表) -**现在**:只需传 planId + orderId,其余自动从订单获取 - ---- - -## 接口清单 - -| 方法 | 路径 | 说明 | 变更 | -|------|------|------|------| -| POST | /admin/insurance/purchase | 投保下单 | `startDate`/`endDate`/`insuredPersons` 变为可选 | - ---- - -## 详细定义 - -### POST /admin/insurance/purchase - -#### 请求参数 - -| 字段 | 类型 | 必填 | 说明 | -|------|------|------|------| -| orderId | Long | 否 | 关联旅行订单ID。**传了则自动从订单获取出行人和日期** | -| planId | Long | **是** | 保险计划ID | -| startDate | LocalDate | 否 | 保障开始日期。传orderId时自动取订单出发日期 | -| endDate | LocalDate | 否 | 保障结束日期。传orderId时自动按出发日期+行程天数计算 | -| insuredPersons | List | 否 | 被保人列表。传orderId时自动从订单出行人获取 | -| entityCode | String | 否 | 投保公司主体编码,不填用默认主体 | -| remark | String | 否 | 备注 | - -#### 两种调用方式 - -**方式一:通过订单自动填充(推荐)** -```json -{ - "orderId": "2034961514288623617", - "planId": "2026279738275856390" -} -``` -系统自动从订单获取: -- 出行人 → 被保人 -- 出发日期 → 保障开始日期 -- 出发日期 + 行程天数 - 1 → 保障结束日期 - -**方式二:手动传全部参数(仍然支持)** -```json -{ - "planId": "2026279738275856390", - "startDate": "2026-05-01", - "endDate": "2026-05-05", - "insuredPersons": [ - { - "name": "张三", - "idCardType": "ID_CARD", - "idCardNo": "110101199001011234", - "birthday": "1990-01-01", - "gender": "MALE", - "phone": "13800138000" - } - ] -} -``` - -#### 错误提示 - -| 场景 | 错误信息 | -|------|----------| -| 订单无出行人 | "无法获取订单出行人信息,请确认订单已添加出行人" | -| 出行人缺少姓名或证件号 | "订单无有效出行人(缺少姓名或证件号)" | -| 订单未设置出发日期 | "订单未设置出发日期,无法自动确定保障开始日期" | -| 订单未设置行程天数 | "订单未设置行程天数,无法自动确定保障结束日期" | - ---- - -## 前端使用场景 - -### 保险管理页 - 手动投保 -1. 选择订单 → 获得 orderId -2. 选择保险计划 → 获得 planId -3. 调用 `POST /admin/insurance/purchase`,只传 `{ orderId, planId }` -4. 无需再填写出行人信息和日期 - -### 注意事项 -- 订单必须已确认(CONFIRMED/PENDING_BALANCE/PENDING_DEPARTURE/TRAVELLING) -- 订单必须有出行人且出行人信息完整(姓名+证件号) -- 订单必须有出发日期和行程天数 diff --git a/changelogs/2026-03/2026-03-21_orderNo_fix.md b/changelogs/2026-03/2026-03-21_orderNo_fix.md deleted file mode 100644 index 1eb7b08..0000000 --- a/changelogs/2026-03/2026-03-21_orderNo_fix.md +++ /dev/null @@ -1,24 +0,0 @@ -# 订单号格式回退20位 - -**日期**: 2026-03-21 -**服务**: hl-order-service -**类型**: Bug修复 - ---- - -## 问题 - -订单号之前从20位改为25位(毫秒精度),导致微信支付接口报错"商户订单号错误"。原因是微信支付 `out_trade_no` 限制最长32位,订单号25位加上支付类型后缀 `-DEPOSIT-V99` 最长达37位,超限。 - -## 修复 - -订单号回退为20位:`HL` + 秒级时间戳(14位) + 4位随机数。 - -| | 修复前 | 修复后 | -|---|--------|--------| -| 示例 | HL2026032114580490720445 (25位) | HL202603211458041234 (20位) | -| out_trade_no 最长 | 25+12=37位 (超限) | 20+12=32位 (刚好) | - -## 前端影响 - -订单号展示区域确保支持20位即可(与之前一致)。 diff --git a/changelogs/2026-03/2026-03-21_order_logic_optimization.md b/changelogs/2026-03/2026-03-21_order_logic_optimization.md deleted file mode 100644 index e888868..0000000 --- a/changelogs/2026-03/2026-03-21_order_logic_optimization.md +++ /dev/null @@ -1,46 +0,0 @@ -# 产品订单逻辑优化 - -**日期**: 2026-03-21 -**服务**: hl-order-service, hl-mp-service -**类型**: 逻辑优化 - ---- - -## 变更说明 - -### 1. 报价接口返回库存信息 - -`POST /mp/product/{productId}/quote` 报价结果新增两个字段: - -| 新增字段 | 类型 | 说明 | -|---------|------|------| -| stock | Integer | 该日期剩余库存(null表示不限库存) | -| available | Boolean | 该日期是否可订(库存>=总人数或无库存限制) | - -**前端使用建议**: -- `available=false` 时禁用"立即下单"按钮,显示"该日期已售罄" -- `stock` 较少时显示"仅剩 N 位"提示 - -### 2. 早鸟优惠后支付金额自动同步 - -之前:早鸟优惠更新了 `finalPrice`,但 `fullPayment.amount` 和 `depositPayment` 仍按原价 - -现在:早鸟优惠后自动重算: -- `fullPayment.amount` = 优惠后价格 -- `depositPayment.depositAmount` = 优惠后价格 × 定金比例 -- `depositPayment.balanceAmount` = 优惠后价格 - 定金 - -### 3. 订单号格式升级 - -| | 旧格式 | 新格式 | -|---|--------|--------| -| 示例 | HL202603211234561234 | HL2026032112345612312345 | -| 长度 | 20位 | 25位 | -| 时间精度 | 秒级(14位) | 毫秒级(17位) | -| 随机位数 | 4位 | 6位 | - -**前端影响**:订单号展示区域需确保支持 25 位长度。 - -### 4. GROUP团期出发日期校验 - -新增:团期出发日期已过时,禁止用户报名,返回错误"该团期出发日期已过,无法报名"。 diff --git a/changelogs/2026-03/2026-03-21_order_travelers_api.md b/changelogs/2026-03/2026-03-21_order_travelers_api.md deleted file mode 100644 index 6261074..0000000 --- a/changelogs/2026-03/2026-03-21_order_travelers_api.md +++ /dev/null @@ -1,97 +0,0 @@ -# 新增:获取订单出行人接口 - -**日期**: 2026-03-21 -**服务**: hl-order-service -**类型**: 新增接口 - ---- - -## 功能说明 - -新增管理端独立获取订单出行人接口,用于保险投保页面自动填充被保人信息。 - ---- - -## 接口清单 - -| 方法 | 路径 | 说明 | -|------|------|------| -| GET | /admin/order/{orderId}/travelers | 获取指定订单的出行人列表 | - ---- - -## 详细定义 - -### GET /admin/order/{orderId}/travelers - -#### 请求参数 - -| 参数 | 位置 | 类型 | 必填 | 说明 | -|------|------|------|------|------| -| orderId | path | Long | 是 | 订单ID | - -#### 响应示例 - -```json -{ - "code": 200, - "message": "成功", - "data": [ - { - "orderTravelerId": "2034962583668371457", - "orderId": "2034961514288623617", - "name": "张三", - "idCardType": "ID_CARD", - "idCardNo": "152125199101022016", - "phone": "13800138000", - "gender": 1, - "birthday": "1991-01-02", - "travelerType": "ADULT", - "nationality": "中国", - "emergencyContact": "李四", - "emergencyPhone": "13800138001", - "email": null, - "createTime": "2026-03-20 19:57:42" - } - ] -} -``` - -#### 响应字段说明 - -| 字段 | 类型 | 说明 | -|------|------|------| -| orderTravelerId | String | 出行人ID | -| orderId | String | 订单ID | -| name | String | 姓名 | -| idCardType | String | 证件类型(字典:id_card_type)ID_CARD/PASSPORT/OTHER | -| idCardNo | String | 证件号码 | -| phone | String | 手机号(可能为null) | -| gender | Integer | 性别(字典:gender)1=男 0=女 | -| birthday | String | 出生日期 yyyy-MM-dd | -| travelerType | String | 出行人类型(字典:traveler_type)ADULT/CHILD/BABY | -| nationality | String | 国籍 | -| emergencyContact | String | 紧急联系人 | -| emergencyPhone | String | 紧急联系电话 | - ---- - -## 使用场景 - -### 保险投保页面 - 自动填充被保人 - -1. 用户输入关联订单ID -2. 调用 `GET /admin/order/{orderId}/travelers` 获取出行人列表 -3. 将出行人信息映射为被保人(姓名、证件号、性别、生日) -4. 自动填充到被保人列表,无需手动添加 - -### 字段映射(出行人 → 被保人) - -| 出行人字段 | 被保人字段 | -|-----------|-----------| -| name | name | -| idCardType | idCardType | -| idCardNo | idCardNo | -| gender(1=男→MALE, 0=女→FEMALE) | gender | -| birthday | birthday | -| phone | phone | diff --git a/changelogs/2026-03/2026-03-21_product_order_improvement.md b/changelogs/2026-03/2026-03-21_product_order_improvement.md deleted file mode 100644 index ca8aed1..0000000 --- a/changelogs/2026-03/2026-03-21_product_order_improvement.md +++ /dev/null @@ -1,56 +0,0 @@ -# 产品与订单模块改进 - -**日期**: 2026-03-21 -**服务**: hl-product-service, hl-order-service -**类型**: 功能增强 - ---- - -## 功能说明 - -### 1. 团期报名截止自动关闭 - -团期(GROUP 产品)超过报名截止日期后,系统每小时自动扫描,将 ENROLLING/CONFIRMED 状态的过期团期自动关闭为 CLOSED。 - -**前端影响**:无需改动。过期团期不再显示"可报名"状态,`batchStatus` 会变为 `CLOSED`。 - ---- - -### 2. 尾款到期自动取消 - -定金模式(DEPOSIT)订单,如果距出发日期不足 3 天仍未付尾款,系统每天凌晨自动取消订单。 - -**前端影响**:无需改动。订单状态会变为 `CANCELLED`,`cancelReason` 为"尾款未在出发前3天付清,系统自动取消"。建议在待付尾款页面增加倒计时提示。 - ---- - -### 3. 出发日期变更自动重新计价 - -管理员修改订单出发日期后,系统自动基于新日期的价格日历重新计算售价。 - -**前端影响**: -- 订单详情页的 `totalPrice` 可能因日期变更而更新 -- 时间线(timeline)中会记录价格变动详情,如:"售价已更新: 5980.00 → 6280.00(+300.00)" -- 如果价格偏差超过 50%,不会自动更新,时间线记录"价格偏差超过50%,未自动更新,请手动核查" - ---- - -## 接口变更 - -**本次无接口变更**。以上功能均为后端定时任务和内部逻辑增强,不影响现有接口的请求/响应格式。 - -已有接口行为变化: - -| 接口 | 变化说明 | -|------|---------| -| GET /admin/product/item/{productId}/batch/list | 过期团期 batchStatus 会自动变为 CLOSED | -| GET /mp/order/{orderId} | 尾款逾期订单 status 会自动变为 CANCELLED | -| PUT /admin/order/{orderId}/edit | 修改出发日期后 totalPrice 可能自动更新 | - ---- - -## 注意事项 - -- 尾款截止默认 3 天(出发前 3 天),后续可配置 -- 价格自动更新有 50% 偏差保护,超出不会自动改价 -- 团期关闭后不可恢复报名,需重新创建团期 diff --git a/changelogs/2026-03/2026-03-22_2115_e6589b1_security_API.md b/changelogs/2026-03/2026-03-22_2115_e6589b1_security_API.md deleted file mode 100644 index d062125..0000000 --- a/changelogs/2026-03/2026-03-22_2115_e6589b1_security_API.md +++ /dev/null @@ -1,745 +0,0 @@ -# 接口变更记录 — 2026-03-22 21:15 - -> **提交** `e6589b1` · **作者** wx · **时间** 2026-03-22 21:15:06 +0800 -> -> security: 全项目API安全校验加固(16个微服务,258个文件) - -## 变更总览 - -- **产品服务** - - Pricing (+1) -- **保险服务** - - AdminInsurance (+1) - - InternalInsurance (+1) -- **合同服务** - - AdminContract (改1) - - InternalContract (+1) -- **文件服务** - - MpFile (+1, 改1) -- **订单服务** - - AdminAlbum (+1) - - AdminEarlyBird (+1, 改1) - - AdminInvoice (+1) - - AdminOrderConfig (+1) - - AdminOrder (+1, 改1) - - AdminOrderItinerary (+1) - - AdminOrderTodo (+1) - - AdminRefund (+1, 改1) - - AdminRefundPolicy (+1) - - AdminWorkOrder (+1, 改1) - - InternalAlbum (+1) - - InternalAutoProcess (+1) - - InternalDashboard (+1) - - InternalDesignerOrder (+1, 改1) - - InternalEarlyBird (+1) - - InternalInvoice (+1) - - InternalMpOrder (+1) - - InternalMpTrip (+1) - - InternalOrderStats (+1) - - InternalOrderTraveler (+1) - - InternalPaymentOrder (+1) - - MpOrder (+1) - - MpWeather (+1) - ---- - -## 产品服务 - -### Pricing - -> 📖 **接口文档**: [http://192.168.100.236:8085/doc.html](http://192.168.100.236:8085/doc.html) → 标签 **「定价与费用管理」** - -### 🆕 `GET` /admin/product/item/{productId}/insurance-fee-preview — 预览保险方案费用 - -> 根据产品行程天数和选定的保险方案,计算人均保险费。 - -**参数** - - - `{productId}` (`Long`) — 路径参数:产品ID - - `schemeId` (`Long`) — 查询参数:保险方案ID - -**响应** `Result>` - ---- - -## 保险服务 - -### AdminInsurance - -> 📖 **接口文档**: [http://192.168.100.236:8098/doc.html](http://192.168.100.236:8098/doc.html) → 标签 **「保险管理」** - -### 🆕 `POST` /admin/insurance/purchase-by-scheme — 按方案自动投保(schemeId+orderId) - -> 根据保险方案自动为订单所有出行人投保。系统自动从订单获取出行人信息和行程日期,按方案各段配置逐段投保。 - -**请求体** `AutoPurchaseRequest` - -| 字段 | 类型 | 说明 | -| --- | --- | --- | -| `orderId` | `Long` | 旅行订单ID | -| `schemeId` | `Long` | 保险方案ID | - -**响应** `Result` - -| 字段 | 类型 | 说明 | -| --- | --- | --- | -| `success` | `boolean` | 是否全部成功 | -| `purchasedCount` | `int` | 成功投保段数 | -| `failedCount` | `int` | 失败段数 | -| `failureReason` | `String` | 失败原因(部分失败或全部失败时返回第一个错误) | - -### InternalInsurance - -> 📖 **接口文档**: [http://192.168.100.236:8098/doc.html](http://192.168.100.236:8098/doc.html) → 标签 **「【内部接口】保险(Feign调用)」** - -### 🆕 `GET` /internal/insurance/scheme/{schemeId}/premium — 获取保险方案信息(内部调用) - -> 内部服务间调用。返回方案的适用天数和人均保费,用于产品保存时校验天数匹配并自动填充保险费。 - -**参数** - - - `{schemeId}` (`Long`) — 路径参数:方案ID - - `tripDays` (`int`) — 查询参数:行程天数 - -**响应** `Result>` - ---- - -## 合同服务 - -### AdminContract - -> 📖 **接口文档**: [http://192.168.100.236:8095/doc.html](http://192.168.100.236:8095/doc.html) → 标签 **「合同管理」** - -### ✏️ `GET` /admin/contract/templates — 合同模板列表 - -- 参数: 无 → platform(String) - -### InternalContract - -> 📖 **接口文档**: [http://192.168.100.236:8095/doc.html](http://192.168.100.236:8095/doc.html) → 标签 **「【内部接口】合同(Feign调用)」** - -### 🆕 `GET` /internal/contract/scheme/{schemeId}/config — 获取合同方案配置(内部调用) - -> 供 order-service 自动签约时获取方案的完整合同配置 - -**参数** - - - `{schemeId}` (`Long`) — 路径参数 - -**响应** `Result>` - ---- - -## 文件服务 - -### MpFile - -> 📖 **接口文档**: [http://192.168.100.236:8091/doc.html](http://192.168.100.236:8091/doc.html) → 标签 **「C端文件上传」** - -### 🆕 `GET` /mp/file/mp/file - -### ✏️ `GET` /mp/file/preview-by-url — 文件在线预览 - -- 参数: url(String) → 无 - ---- - -## 订单服务 - -### AdminAlbum - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 分组 **「3.1 订单管理」** → 标签 **「管理端相册接口」** - -### 🆕 `GET` /admin/order/admin/order - -### AdminEarlyBird - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 分组 **「3.1 订单管理」** → 标签 **「早鸟优惠计划管理」** - -### 🆕 `GET` /admin/order/early-bird/admin/order/early-bird - -### ✏️ `GET` /admin/order/early-bird/list — 早鸟优惠计划列表 - -- 参数: page(int), pageSize(int) → page(int) - -### AdminInvoice - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 分组 **「3.3 发票管理」** → 标签 **「发票管理」** - -### 🆕 `GET` /admin/invoice/admin/invoice - -### AdminOrderConfig - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 分组 **「3.1 订单管理」** → 标签 **「订单配置接口」** - -### 🆕 `GET` /admin/order/config/admin/order/config - -### AdminOrder - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 分组 **「3.1 订单管理」** → 标签 **「管理端订单接口」** - -### 🆕 `GET` /admin/order/admin/order - -### ✏️ `GET` /admin/order/{orderId}/available-hotels — 配房可选酒店列表 - -- 参数: orderId(Long), dayIndex(Integer) → orderId(Long) - -### AdminOrderItinerary - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 分组 **「3.1 订单管理」** → 标签 **「管理端订单行程编辑」** - -### 🆕 `GET` /admin/order/{orderId}/itinerary/admin/order/{orderId}/itinerary - -### AdminOrderTodo - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 分组 **「3.1 订单管理」** → 标签 **「订单待办接口」** - -### 🆕 `GET` /admin/order/admin/order - -### AdminRefund - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 分组 **「3.1 订单管理」** → 标签 **「退款管理」** - -### 🆕 `GET` /admin/order/refund/admin/order/refund - -### ✏️ `GET` /admin/order/refund/list — 退款申请列表 - -- 参数: status(String), page(int), pageSize(int) → status(String), page(int) - -### AdminRefundPolicy - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 分组 **「3.1 订单管理」** → 标签 **「退款政策管理」** - -### 🆕 `GET` /admin/order/refund-policy/admin/order/refund-policy - -### AdminWorkOrder - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 分组 **「3.1 订单管理」** → 标签 **「工单管理」** - -### 🆕 `GET` /admin/order/work-order/admin/order/work-order - -### ✏️ `GET` /admin/order/work-order/list — 工单列表 - -- 参数: status(String), type(String), priority(String), orderNo(String), assigneeAdminId(Long), page(int), pageSize(int) → status(String), type(String), priority(String), orderNo(String), assigneeAdminId(Long), page(int) - -### InternalAlbum - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 标签 **「【内部接口】小程序相册(Feign调用)」** - -### 🆕 `GET` /internal/mp/album/internal/mp/album - -### InternalAutoProcess - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 标签 **「【内部接口】自动化处理(运维用)」** - -### 🆕 `GET` /internal/order/internal/order - -### InternalDashboard - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 标签 **「【内部接口】工作台统计(Feign调用)」** - -### 🆕 `GET` /internal/order/dashboard/internal/order/dashboard - -### InternalDesignerOrder - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 标签 **「【内部接口】定制师订单(Feign调用)」** - -### 🆕 `GET` /internal/order/internal/order - -### ✏️ `GET` /internal/order/designer-list — 定制师订单列表 - - -**响应变更** `OrderListVO`: - - - 🆕 `surchargeAmount` (`BigDecimal`) — 费用增加总额 -- 参数: customizerId(Long), page(int), pageSize(int), status(String), keyword(String) → customizerId(Long), page(int), status(String), keyword(String) - -### InternalEarlyBird - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 标签 **「【内部接口】早鸟优惠(Feign调用)」** - -### 🆕 `GET` /internal/mp/early-bird/internal/mp/early-bird - -### InternalInvoice - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 标签 **「【内部接口】小程序发票(Feign调用)」** - -### 🆕 `GET` /internal/mp/invoice/internal/mp/invoice - -### InternalMpOrder - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 标签 **「【内部接口】小程序订单(Feign调用)」** - -### 🆕 `GET` /internal/mp/order/internal/mp/order - -### InternalMpTrip - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 标签 **「【内部接口】小程序行程(Feign调用)」** - -### 🆕 `GET` /internal/mp/trip/internal/mp/trip - -### InternalOrderStats - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 标签 **「内部-订单统计」** - -### 🆕 `GET` /internal/mp/order/internal/mp/order - -### InternalOrderTraveler - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 标签 **「【内部接口】订单出行人(Feign调用)」** - -### 🆕 `GET` /internal/order/traveler/internal/order/traveler - -### InternalPaymentOrder - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 标签 **「【内部接口】订单-支付/合同/保险(Feign调用)」** - -### 🆕 `GET` /internal/order/internal/order - -### MpOrder - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 标签 **「C端订单接口」** - -### 🆕 `GET` /mp/order/mp/order - -### MpWeather - -> 📖 **接口文档**: [http://192.168.100.236:8084/doc.html](http://192.168.100.236:8084/doc.html) → 标签 **「内部天气接口(Feign)」** - -### 🆕 `GET` /internal/mp/weather/internal/mp/weather - ---- - -## 📦 其他数据对象变更 - -> 以下变更未直接关联到本次接口变更,但可能影响现有接口的请求/响应 - -### 产品服务 - -#### ✏️ PricingRequest - - - ❌ ~~`adultExtraBed`~~ (`BigDecimal`) — 成人加床费 - - ❌ ~~`childNoBed`~~ (`BigDecimal`) — 儿童不占床价(暂未使用,预留字段) - - ❌ ~~`singleRoomDiff`~~ (`BigDecimal`) — 单房差 - - ❌ ~~`companionPrice`~~ (`BigDecimal`) — 陪同人员价格 - - ❌ ~~`maxGroupSize`~~ (`Integer`) — 最大成团人数(CORE/GROUP产品用) - - ✏️ `minGroupSize`: 说明 "最小成团人数(CORE/GROUP产品用,影响均摊成本计算)" → "成团人数(影响均摊成本计算)" - -#### ✏️ ProductAutomationConfigVO - - - 🆕 `contractSchemeId` (`Long`) - - ❌ ~~`contractPlatform`~~ (`String`) - - ❌ ~~`contractTemplateCode`~~ (`String`) - - ❌ ~~`contractMode`~~ (`String`) - - ❌ ~~`signatoryMode`~~ (`Integer`) - - ❌ ~~`agencyCode`~~ (`String`) - - ❌ ~~`disputeResolution`~~ (`Integer`) - - ❌ ~~`supplementaryClause`~~ (`String`) - - ❌ ~~`transactorName`~~ (`String`) - - ❌ ~~`transactorPhone`~~ (`String`) - -#### ✏️ ProductCreateRequest - - - 🆕 `contractSchemeId` (`Long`) — 合同方案ID - - ❌ ~~`refundPolicyId`~~ (`String`) — 退款政策ID(已废弃,用refundPolicyIds替代) - - ❌ ~~`contractPlatform`~~ (`String`) — 合同平台(12301/FADADA) - - ❌ ~~`contractTemplateCode`~~ (`String`) — 合同模板编码 - - ❌ ~~`contractMode`~~ (`String`) — 签约模式(STANDARD/SYNC) - - ❌ ~~`signatoryMode`~~ (`Integer`) — 签署模式(1=短信/2=现场/3=线下) - - ❌ ~~`agencyCode`~~ (`String`) — 旅行社编码 - - ❌ ~~`disputeResolution`~~ (`Integer`) — 争议解决方式(1=仲裁/2=诉讼) - - ❌ ~~`supplementaryClause`~~ (`String`) — 补充条款 - - ❌ ~~`transactorName`~~ (`String`) — 经办人姓名 - - ❌ ~~`transactorPhone`~~ (`String`) — 经办人电话 - -#### ✏️ ProductListVO - - - 🆕 `contractSchemeId` (`String`) — 合同方案ID - - ❌ ~~`contractPlatform`~~ (`String`) — 合同平台(12301/FADADA) - - ❌ ~~`contractTemplateCode`~~ (`String`) — 合同模板编码 - - ❌ ~~`contractMode`~~ (`String`) — 签约模式(STANDARD/SYNC) - - ❌ ~~`signatoryMode`~~ (`Integer`) — 签署模式(1=短信/2=现场/3=线下) - - ❌ ~~`agencyCode`~~ (`String`) — 旅行社编码 - - ❌ ~~`disputeResolution`~~ (`Integer`) — 争议解决方式(1=仲裁/2=诉讼) - - ❌ ~~`supplementaryClause`~~ (`String`) — 补充条款 - - ❌ ~~`transactorName`~~ (`String`) — 经办人姓名 - - ❌ ~~`transactorPhone`~~ (`String`) — 经办人电话 - -#### ✏️ ProductPricingVO - - - ❌ ~~`adultExtraBed`~~ (`BigDecimal`) — 成人加床费 - - ❌ ~~`childNoBed`~~ (`BigDecimal`) — 儿童不占床价 - - ❌ ~~`singleRoomDiff`~~ (`BigDecimal`) — 单房差 - - ❌ ~~`companionPrice`~~ (`BigDecimal`) — 陪同人员价格 - - ❌ ~~`maxGroupSize`~~ (`Integer`) — 最大成团人数 - - ✏️ `minGroupSize`: 说明 "最小成团人数" → "成团人数" - -#### ✏️ ProductSaveRequest - - - 🆕 `contractSchemeId` (`Long`) — 合同方案ID - - ❌ ~~`refundPolicyId`~~ (`String`) — 退款政策ID(已废弃,用refundPolicyIds替代) - - ❌ ~~`contractPlatform`~~ (`String`) — 合同平台(12301/FADADA) - - ❌ ~~`contractTemplateCode`~~ (`String`) — 合同模板编码 - - ❌ ~~`contractMode`~~ (`String`) — 签约模式(STANDARD/SYNC) - - ❌ ~~`signatoryMode`~~ (`Integer`) — 签署模式(1=短信/2=现场/3=线下) - - ❌ ~~`agencyCode`~~ (`String`) — 旅行社编码 - - ❌ ~~`disputeResolution`~~ (`Integer`) — 争议解决方式(1=仲裁/2=诉讼) - - ❌ ~~`supplementaryClause`~~ (`String`) — 补充条款 - - ❌ ~~`transactorName`~~ (`String`) — 经办人姓名 - - ❌ ~~`transactorPhone`~~ (`String`) — 经办人电话 - -#### ✏️ ProductUpdateRequest - - - 🆕 `contractSchemeId` (`Long`) — 合同方案ID - - ❌ ~~`refundPolicyId`~~ (`String`) — 退款政策ID(已废弃,用refundPolicyIds替代) - - ❌ ~~`contractPlatform`~~ (`String`) — 合同平台(12301/FADADA) - - ❌ ~~`contractTemplateCode`~~ (`String`) — 合同模板编码 - - ❌ ~~`contractMode`~~ (`String`) — 签约模式(STANDARD/SYNC) - - ❌ ~~`signatoryMode`~~ (`Integer`) — 签署模式(1=短信/2=现场/3=线下) - - ❌ ~~`agencyCode`~~ (`String`) — 旅行社编码 - - ❌ ~~`disputeResolution`~~ (`Integer`) — 争议解决方式(1=仲裁/2=诉讼) - - ❌ ~~`supplementaryClause`~~ (`String`) — 补充条款 - - ❌ ~~`transactorName`~~ (`String`) — 经办人姓名 - - ❌ ~~`transactorPhone`~~ (`String`) — 经办人电话 - -#### ✏️ ProductVO - - - 🆕 `contractSchemeId` (`String`) — 合同方案ID - - ❌ ~~`refundPolicyId`~~ (`String`) — 退款政策ID(已废弃,用refundPolicyIds替代) - - ❌ ~~`refundPolicyName`~~ (`String`) — 退款政策名称(已废弃) - - ❌ ~~`contractPlatform`~~ (`String`) — 合同平台(12301/FADADA) - - ❌ ~~`contractTemplateCode`~~ (`String`) — 合同模板编码 - - ❌ ~~`contractMode`~~ (`String`) — 签约模式(STANDARD/SYNC) - - ❌ ~~`signatoryMode`~~ (`Integer`) — 签署模式(1=短信/2=现场/3=线下) - - ❌ ~~`agencyCode`~~ (`String`) — 旅行社编码 - - ❌ ~~`disputeResolution`~~ (`Integer`) — 争议解决方式(1=仲裁/2=诉讼) - - ❌ ~~`supplementaryClause`~~ (`String`) — 补充条款 - - ❌ ~~`transactorName`~~ (`String`) — 经办人姓名 - - ❌ ~~`transactorPhone`~~ (`String`) — 经办人电话 - -### 保险服务 - -#### ✏️ InsuranceSchemeVO - - - 🆕 `totalDays` (`Integer`) — 适用行程天数 - -### 公共模块 - -#### ✏️ OrderPayInfoDTO - - - 🆕 `surchargeAmount` (`BigDecimal`) — 费用增加总额 - -### 合同服务 - -#### ✏️ ContractCallbackPayload - - - 🆕 `timestamp` (`Long`) — 时间戳(Unix秒) - -### 小程序聚合服务 - -#### ✏️ MpCustomProductDetailVO - - - ❌ ~~`adultExtraBed`~~ (`BigDecimal`) — 成人加床费 - - ❌ ~~`childNoBed`~~ (`BigDecimal`) — 儿童不占床价 - - ❌ ~~`singleRoomDiff`~~ (`BigDecimal`) — 单房差 - - ❌ ~~`companionPrice`~~ (`BigDecimal`) — 陪同人员价格 - - ❌ ~~`maxGroupSize`~~ (`Integer`) — 最大成团人数 - - ✏️ `minGroupSize`: 说明 "最小成团人数" → "成团人数" - -#### ✏️ MpOrderDetailVO - - - 🆕 `surchargeAmount` (`BigDecimal`) — 费用增加总额 - - 🆕 `surcharges` (`List>`) — 费用增加项列表 - - 🆕 `displayStatus` (`String`) — 展示状态(前端主要使用此字段展示) - - 🆕 `displayStatusLabel` (`String`) — 展示状态标签 - - 🆕 `transportSegments` (`List>`) — 交通段列表 - - 🆕 `sharerOpenid` (`String`) — 分享者openid - -### 订单服务 - -#### ✏️ OrderDetailVO - - - 🆕 `surchargeAmount` (`BigDecimal`) — 费用增加总额 - - 🆕 `surcharges` (`List`) — 费用增加项列表 - -#### ✏️ RefundPolicyRequest - - - ❌ ~~`refundType`~~ (`String`) — 退款类型(字典:refund_type)DEPOSIT(定金)/BALANCE(尾款)/FULL(全款) - - ❌ ~~`isDefault`~~ (`Boolean`) — 是否为默认政策(产品未绑定退款政策时使用默认政策) - -#### ✏️ RefundPolicyVO - - - ❌ ~~`refundType`~~ (`String`) — 退款类型(字典:refund_type)DEPOSIT(定金)/BALANCE(尾款)/FULL(全款) - - ❌ ~~`isDefault`~~ (`Boolean`) — 是否为默认政策 - -### 评价服务 - -#### ✏️ CreateReviewRequest - - - ✏️ `content`: 说明 "评价内容(10-500字)" → "评价内容(10-5000字)" - -
    -📁 全部变更文件 (点击展开) - -``` -M hl-common/src/main/java/com/hulalv/common/dto/OrderPayInfoDTO.java -M hl-common/src/main/java/com/hulalv/common/dto/PaymentRefundRequest.java -M hl-common/src/main/java/com/hulalv/common/exception/GlobalExceptionHandler.java -M hl-contract-service/src/main/java/com/hulalv/contract/constant/ContractConstants.java -M hl-contract-service/src/main/java/com/hulalv/contract/controller/AdminContractController.java -M hl-contract-service/src/main/java/com/hulalv/contract/controller/ContractCallbackController.java -M hl-contract-service/src/main/java/com/hulalv/contract/controller/InternalContractController.java -M hl-contract-service/src/main/java/com/hulalv/contract/dto/ContractCallbackPayload.java -M hl-contract-service/src/main/java/com/hulalv/contract/dto/CreateContractRequest.java -M hl-contract-service/src/main/java/com/hulalv/contract/dto/ReportContractRequest.java -M hl-contract-service/src/main/java/com/hulalv/contract/service/ContractCallbackService.java -M hl-contract-service/src/test/java/com/hulalv/contract/service/ContractCallbackServiceTest.java -M hl-contract-service/src/test/java/com/hulalv/contract/service/ContractServiceTest.java -M hl-file-service/src/main/java/com/hulalv/file/controller/MpFileController.java -M hl-file-service/src/main/java/com/hulalv/file/service/FileService.java -M hl-gateway/src/main/java/com/hulalv/gateway/filter/JwtAuthFilter.java -M hl-gateway/src/main/java/com/hulalv/gateway/filter/RateLimitFilter.java -M hl-guide-service/src/main/java/com/hulalv/guide/dto/ArticleCreateRequest.java -M hl-guide-service/src/main/java/com/hulalv/guide/dto/ArticleUpdateRequest.java -M hl-insurance-service/src/main/java/com/hulalv/insurance/controller/AdminInsuranceController.java -M hl-insurance-service/src/main/java/com/hulalv/insurance/controller/InternalInsuranceController.java -M hl-insurance-service/src/main/java/com/hulalv/insurance/dto/PurchaseInsuranceRequest.java -M hl-insurance-service/src/main/java/com/hulalv/insurance/dto/RechargeRequest.java -M hl-insurance-service/src/main/java/com/hulalv/insurance/dto/TrialPriceRequest.java -M hl-insurance-service/src/main/java/com/hulalv/insurance/entity/InsuranceScheme.java -M hl-insurance-service/src/main/java/com/hulalv/insurance/service/InsuranceOrderService.java -M hl-insurance-service/src/main/java/com/hulalv/insurance/service/InsuranceSchemeService.java -M hl-insurance-service/src/main/java/com/hulalv/insurance/vo/InsuranceSchemeVO.java -M hl-material-service/src/main/java/com/hulalv/material/dto/MaterialUploadConfirmRequest.java -M hl-material-service/src/main/java/com/hulalv/material/service/MaterialService.java -M hl-material-service/src/main/java/com/hulalv/material/service/MaterialTagService.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpActivityController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpCommonController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpContractController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpCustomizeController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpDesignerController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpExploreController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpFavoriteController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpFootprintController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpHotelController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpInvoiceController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpMessageController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpOrderController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpPaymentController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpProductController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpRefundController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpRestaurantController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpReviewController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpScenicController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpTravelerController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpUserController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpWikiController.java -M hl-mp-service/src/main/java/com/hulalv/mp/controller/MpWishController.java -M hl-mp-service/src/main/java/com/hulalv/mp/dto/MpCheckinRequest.java -M hl-mp-service/src/main/java/com/hulalv/mp/dto/MpFeedbackRequest.java -M hl-mp-service/src/main/java/com/hulalv/mp/dto/MpFootprintAddRequest.java -M hl-mp-service/src/main/java/com/hulalv/mp/dto/MpInvoiceApplyRequest.java -M hl-mp-service/src/main/java/com/hulalv/mp/dto/MpLoginBySmsRequest.java -M hl-mp-service/src/main/java/com/hulalv/mp/dto/MpPaymentPrepayRequest.java -M hl-mp-service/src/main/java/com/hulalv/mp/dto/MpProductQuoteRequest.java -M hl-mp-service/src/main/java/com/hulalv/mp/dto/MpRefundAppealRequest.java -M hl-mp-service/src/main/java/com/hulalv/mp/dto/MpRefundApplyRequest.java -M hl-mp-service/src/main/java/com/hulalv/mp/dto/MpReviewCreateRequest.java -M hl-mp-service/src/main/java/com/hulalv/mp/dto/MpSmsSendRequest.java -M hl-mp-service/src/main/java/com/hulalv/mp/dto/MpTravelerRequest.java -M hl-mp-service/src/main/java/com/hulalv/mp/dto/MpUpdateOrderRequest.java -M hl-mp-service/src/main/java/com/hulalv/mp/dto/MpUserProfileUpdateRequest.java -M hl-mp-service/src/main/java/com/hulalv/mp/dto/MpWechatLoginRequest.java -M hl-mp-service/src/main/java/com/hulalv/mp/dto/MpWishCreateRequest.java -M hl-mp-service/src/main/java/com/hulalv/mp/vo/MpCustomProductDetailVO.java -M hl-mp-service/src/main/java/com/hulalv/mp/vo/MpOrderDetailVO.java -M hl-order-service/src/main/java/com/hulalv/order/constant/OrderConstants.java -M hl-order-service/src/main/java/com/hulalv/order/controller/AdminAlbumController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/AdminEarlyBirdController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/AdminInvoiceController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/AdminOrderConfigController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/AdminOrderController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/AdminOrderItineraryController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/AdminOrderTodoController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/AdminRefundController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/AdminRefundPolicyController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/AdminWorkOrderController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/InternalAlbumController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/InternalAutoProcessController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/InternalDashboardController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/InternalDesignerOrderController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/InternalEarlyBirdController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/InternalInvoiceController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/InternalMpOrderController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/InternalMpTripController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/InternalOrderStatsController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/InternalOrderTravelerController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/InternalPaymentOrderController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/InternalRefundController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/MpOrderController.java -M hl-order-service/src/main/java/com/hulalv/order/controller/MpWeatherController.java -M hl-order-service/src/main/java/com/hulalv/order/dto/AdminCancelRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/AdminOrderQueryRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/AdminRefundReviewRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/AdminUpdateOrderRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/AlbumFileAddRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/CreateOrderRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/CreateWorkOrderRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/ExecuteAppealRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/InvoiceApplyRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/ItineraryAddNodeRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/ItinerarySkipRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/ItineraryUndoRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/ProcessWorkOrderRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/RecordBalanceRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/RefundAppealRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/RefundApplyRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/RefundPolicyRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/RequestUnlockRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/RoomTypeChangeRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/TransportSegmentRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/UpdateDepositRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/UpdateOrderStatusRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/VehicleAssignmentRequest.java -M hl-order-service/src/main/java/com/hulalv/order/dto/VehicleTypeChangeRequest.java -M hl-order-service/src/main/java/com/hulalv/order/entity/OrderInfo.java -M hl-order-service/src/main/java/com/hulalv/order/entity/OrderTimeline.java -M hl-order-service/src/main/java/com/hulalv/order/entity/RefundPolicy.java -M hl-order-service/src/main/java/com/hulalv/order/feign/ContractFeignClient.java -M hl-order-service/src/main/java/com/hulalv/order/feign/ContractFeignFallbackFactory.java -M hl-order-service/src/main/java/com/hulalv/order/service/NotificationEventHelper.java -M hl-order-service/src/main/java/com/hulalv/order/service/OrderCacheService.java -M hl-order-service/src/main/java/com/hulalv/order/service/OrderService.java -M hl-order-service/src/main/java/com/hulalv/order/service/OrderTimelineService.java -M hl-order-service/src/main/java/com/hulalv/order/service/OrderTravelerService.java -M hl-order-service/src/main/java/com/hulalv/order/service/RefundApplicationService.java -M hl-order-service/src/main/java/com/hulalv/order/service/RefundApprovalPollingService.java -M hl-order-service/src/main/java/com/hulalv/order/service/RefundPolicyService.java -M hl-order-service/src/main/java/com/hulalv/order/vo/OrderDetailVO.java -M hl-order-service/src/main/java/com/hulalv/order/vo/OrderListVO.java -M hl-order-service/src/main/java/com/hulalv/order/vo/RefundPolicyVO.java -M hl-order-service/src/test/java/com/hulalv/order/service/OrderServiceTest.java -M hl-order-service/src/test/java/com/hulalv/order/service/RefundApplicationServiceTest.java -M hl-order-service/src/test/java/com/hulalv/order/service/RefundPolicyServiceTest.java -M hl-payment-service/src/main/java/com/hulalv/payment/controller/AdminPaymentController.java -M hl-payment-service/src/main/java/com/hulalv/payment/dto/RefundRequest.java -M hl-payment-service/src/main/java/com/hulalv/payment/service/PaymentService.java -M hl-payment-service/src/main/java/com/hulalv/payment/service/RefundService.java -M hl-payment-service/src/test/java/com/hulalv/payment/service/PaymentServiceTest.java -M hl-payment-service/src/test/java/com/hulalv/payment/service/RefundServiceTest.java -M hl-product-service/src/main/java/com/hulalv/product/controller/PricingController.java -M hl-product-service/src/main/java/com/hulalv/product/dto/BookingTermsRequest.java -M hl-product-service/src/main/java/com/hulalv/product/dto/CustomFeeRequest.java -M hl-product-service/src/main/java/com/hulalv/product/dto/FormulaStepRequest.java -M hl-product-service/src/main/java/com/hulalv/product/dto/FormulaTestRequest.java -M hl-product-service/src/main/java/com/hulalv/product/dto/NodeCreateRequest.java -M hl-product-service/src/main/java/com/hulalv/product/dto/NodeUpdateRequest.java -M hl-product-service/src/main/java/com/hulalv/product/dto/PriceCalendarRequest.java -M hl-product-service/src/main/java/com/hulalv/product/dto/PricingRequest.java -M hl-product-service/src/main/java/com/hulalv/product/dto/ProductCreateRequest.java -M hl-product-service/src/main/java/com/hulalv/product/dto/ProductSaveRequest.java -M hl-product-service/src/main/java/com/hulalv/product/dto/ProductStatusRequest.java -M hl-product-service/src/main/java/com/hulalv/product/dto/ProductUpdateRequest.java -M hl-product-service/src/main/java/com/hulalv/product/dto/WarmTipsRequest.java -M hl-product-service/src/main/java/com/hulalv/product/engine/FormulaEngineConfig.java -M hl-product-service/src/main/java/com/hulalv/product/entity/Product.java -M hl-product-service/src/main/java/com/hulalv/product/entity/ProductPricing.java -M hl-product-service/src/main/java/com/hulalv/product/service/FormulaStepService.java -M hl-product-service/src/main/java/com/hulalv/product/service/GroupTourBatchService.java -M hl-product-service/src/main/java/com/hulalv/product/service/ProductService.java -M hl-product-service/src/main/java/com/hulalv/product/service/ProductStatusService.java -M hl-product-service/src/main/java/com/hulalv/product/vo/ProductAutomationConfigVO.java -M hl-product-service/src/main/java/com/hulalv/product/vo/ProductListVO.java -M hl-product-service/src/main/java/com/hulalv/product/vo/ProductPricingVO.java -M hl-product-service/src/main/java/com/hulalv/product/vo/ProductVO.java -M hl-product-service/src/test/java/com/hulalv/product/service/CostCalculationServiceTest.java -M hl-product-service/src/test/java/com/hulalv/product/service/FormulaStepServiceTest.java -M hl-product-service/src/test/java/com/hulalv/product/service/GroupTourBatchServiceTest.java -M hl-product-service/src/test/java/com/hulalv/product/service/MpProductServiceTest.java -M hl-product-service/src/test/java/com/hulalv/product/service/ProductPricingServiceTest.java -M hl-product-service/src/test/java/com/hulalv/product/service/ProductServiceTest.java -M hl-product-service/src/test/java/com/hulalv/product/service/ProductStatusServiceTest.java -M hl-resource-service/src/main/java/com/hulalv/resource/activity/controller/ActivityController.java -M hl-resource-service/src/main/java/com/hulalv/resource/activity/dto/ActivityCreateRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/activity/dto/ActivityQueryRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/activity/dto/ActivityUpdateRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/activity/dto/PriceCalendarSetRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/cost/dto/CostItemCreateRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/cost/dto/CostItemQueryRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/cost/dto/CostItemUpdateRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/hotel/controller/HotelController.java -M hl-resource-service/src/main/java/com/hulalv/resource/hotel/dto/HotelCreateRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/hotel/dto/HotelQueryRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/hotel/dto/HotelUpdateRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/hotel/dto/PriceCalendarSetRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/hotel/dto/RoomTypeCreateRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/hotel/dto/RoomTypeUpdateRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/restaurant/controller/RestaurantController.java -M hl-resource-service/src/main/java/com/hulalv/resource/restaurant/dto/RestaurantCreateRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/restaurant/dto/RestaurantQueryRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/restaurant/dto/RestaurantUpdateRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/scenic/controller/ScenicSpotController.java -M hl-resource-service/src/main/java/com/hulalv/resource/scenic/dto/PriceCalendarSetRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/scenic/dto/ScenicSpotCreateRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/scenic/dto/ScenicSpotQueryRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/scenic/dto/ScenicSpotUpdateRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/service/controller/ServiceItemController.java -M hl-resource-service/src/main/java/com/hulalv/resource/service/dto/PriceCalendarSetRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/service/dto/ServiceCreateRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/service/dto/ServiceQueryRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/service/dto/ServiceUpdateRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/staff/controller/StaffController.java -M hl-resource-service/src/main/java/com/hulalv/resource/staff/dto/PriceCalendarSetRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/staff/dto/StaffBatchDeleteRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/staff/dto/StaffCreateRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/staff/dto/StaffQueryRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/staff/dto/StaffUpdateRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/supplies/controller/SuppliesController.java -M hl-resource-service/src/main/java/com/hulalv/resource/supplies/dto/SuppliesCreateRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/supplies/dto/SuppliesQueryRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/supplies/dto/SuppliesUpdateRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/vehicle/controller/VehicleModelController.java -M hl-resource-service/src/main/java/com/hulalv/resource/vehicle/dto/PriceCalendarSetRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/vehicle/dto/VehicleBatchDeleteRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/vehicle/dto/VehicleCreateRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/vehicle/dto/VehicleQueryRequest.java -M hl-resource-service/src/main/java/com/hulalv/resource/vehicle/dto/VehicleUpdateRequest.java -M hl-review-service/src/main/java/com/hulalv/review/dto/CreateReviewRequest.java -M hl-review-service/src/main/java/com/hulalv/review/dto/RejectRequest.java -M hl-task-service/src/main/java/com/hulalv/task/dto/CreateBoardRequest.java -M hl-task-service/src/main/java/com/hulalv/task/dto/CreateCommentRequest.java -M hl-task-service/src/main/java/com/hulalv/task/dto/CreateTaskRequest.java -M hl-task-service/src/main/java/com/hulalv/task/dto/UpdateTaskRequest.java -M hl-user-service/src/main/java/com/hulalv/user/controller/AuthController.java -M hl-user-service/src/main/java/com/hulalv/user/controller/SysJobController.java -M hl-user-service/src/main/java/com/hulalv/user/dto/AdminLoginRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/AgreementRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/BannerRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/ContactRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/CreateAdminRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/CreateDictDataRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/CreateDictTypeRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/CreateJobRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/CreateMenuRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/CreateRoleRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/ExploreCategoryResourceRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/FaqItemRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/LoginRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/TopicRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/TravelerRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/TwoFaVerifyRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/UpdateAdminRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/UpdateDictDataRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/UpdateDictTypeRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/UpdateJobRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/UpdateMenuRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/UpdateProfileRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/UpdateRoleRequest.java -M hl-user-service/src/main/java/com/hulalv/user/dto/WechatBindRequest.java -M hl-user-service/src/main/java/com/hulalv/user/interceptor/TokenInterceptor.java -M hl-user-service/src/main/java/com/hulalv/user/service/SysJobService.java -M hl-user-service/src/main/java/com/hulalv/user/service/UserMessageService.java -M hl-user-service/src/test/java/com/hulalv/user/service/SysJobServiceTest.java -``` -
    \ No newline at end of file diff --git a/changelogs/2026-03/2026-03-22_api_security_hardening.md b/changelogs/2026-03/2026-03-22_api_security_hardening.md deleted file mode 100644 index 5b83de7..0000000 --- a/changelogs/2026-03/2026-03-22_api_security_hardening.md +++ /dev/null @@ -1,87 +0,0 @@ -# API 安全校验加固 - -**日期**: 2026-03-22 -**影响范围**: 全部 16 个微服务 -**类型**: 安全加固(纯后端,不影响正常业务流程) - ---- - -## 对前端的影响 - -### 核心结论:正常使用不受影响 - -本次改动只增加了输入校验,**不改变任何接口路径、参数名、响应格式**。只要前端传入的数据在合理范围内(正常业务操作都是),完全不受影响。 - -### 可能触发 400 错误的场景(之前不会报错,现在会) - -以下情况会返回 `400 Bad Request`,附带具体的校验错误信息: - -#### 1. 字符串超长 -所有 DTO 的字符串字段现在有长度限制: -- 名称类字段:最长 50-100 字符 -- 描述/备注:最长 500-2000 字符 -- 富文本内容:最长 10000-100000 字符 -- URL 字段:最长 500-1000 字符 - -**前端建议**:如果有 `