# 宠物模块整改上线记录(2026-09-07) 九条整改分三期做完,全部发到两台服务器。这份记录留给以后排查用:改了什么、 线上跑的是哪个版本、哪些事情还卡在外部条件上。 ## 线上版本 | | im.bchongw.com(47.106.181.28) | xim.bchongw.com(8.219.70.152) | | --- | --- | --- | | 后端二进制 | `add78d4fa08e1b4c00c5a13531ce6669d4431be7ff70b5c81f3188c64a539479` | 同左 | | 发布路径 | `/www/server/xingyu-im/bt/xingyu-api` | `releases/pet-feed-20260907-112223` ← `current` | | 管理端 | `/www/wwwroot/xingyu-admin/releases/20260907-112424` | `/www/wwwroot/xim-admin/releases/20260907-112410` | | 迁移 | 037 – 041 全部已应用 | 同左 | 提交:`ebf7189`(一期)、`a889cb4`(三期)。二期是纯客户端改动,服务端没有发版。 ## 三期分别改了什么 ### 一期:把发布这条链路跑通 - **定位**:`createPetAddress` 不再强制坐标。拿不到定位也能存地址,标成「未核验定位」, 这条地址的打卡照常做,只是不比对距离。客户端给了三条退路:直接取 → 去系统设置开权限 → 地图选点。根因是 `manifest.json` 里 `distribute.sdkConfigs` 是空的 `{}`,App 端没有地图 SDK。 - **推荐价**:新增 `GET /api/v1/pet/feed-price`,按物种基准价 × 城市系数 + 时长加价算建议单价, 规则在 `pet.feed_price_suggest_json` 里,改一次不用发版。用户改过就以他填的为准。 - **先付后发**:发布页底部常驻合计,主按钮是「支付并发布」,走 `创建 → 下单 → 支付`。 没付成的任务留在「我的任务」可继续支付,超过 `pet.feed_unpaid_close_hours`(24 小时) 由后台 worker 关闭。 - **选宠物**:换成带头像的卡片选择器,缺免疫记录或照片当场标黄。 ### 二期:界面与地址 - `components/PetSheet.vue` 底部抽屉替掉报名接单、发起申诉两处 `uni.showModal({editable:true})`。 - 任务详情默认只展开今天与未完成的上门,其余折叠;打卡胶囊只有接单的喂养者可点。 - `src/static/regions.json`(34 省 / 344 市 / 3273 区县,121KB,来自公开数据集 province-city-china,MIT) 加 `components/RegionPicker.vue` 三级联动,用在发布代喂、送养、配种、喂养者四处; 只有详细地址仍然手填。城市编码跟着提交,宠物页三个频道都能按城市筛。 ### 三期:退款、后台增改删、悬赏 - **退款**:`pet_feed_refunds` 每笔一行,可分多次退到退完;`refunded_cent` 在任务与订单上同步累加。 渠道接通时按金额原路退回并带独立幂等键 `feed:<任务>:<时间戳>`;沙箱支付、手工托管、 没有渠道流水号的一律登记为「线下已退」。已结算的任务必须显式勾选「平台承担」才能退, 喂养者余额不会被倒扣。 - **后台增改删**:宠物可代建 / 编辑 / 软删(有进行中任务的删不掉,删除时相关送养配种一并下架 并通知本人);送养与配种可改文案城市、可下架、可软删;代喂任务可改备注、可取消 (托管中的钱必须先退)。所有写操作进审计日志。 - **悬赏**:`pet_feed_tasks.tip_cent`。悬赏跟着任务一起托管,结算时全额给喂养者, 平台服务费只算基础报酬。上限 `pet.feed_tip_max_cent`(默认 200 元)。 ## 新增的配置项 | 配置键 | 默认值 | 作用 | | --- | --- | --- | | `pet.feed_price_suggest_json` | 见迁移 040 | 推荐单价规则:物种基准价、城市系数、时长加价 | | `pet.feed_unpaid_close_hours` | 24 | 创建后多少小时未支付自动关闭 | | `pet.feed_checkin_min_gap_seconds` | 120 | 到达与喂食打卡的最小间隔,防摆拍 | | `pet.address_purge_days` | 7 | 任务结束多少天后抹掉地址明文 | | `pet.feed_tip_max_cent` | 20000 | 单个任务的悬赏上限 | 管理端「宠物模块 → 宠物设置」里可以直接改,改完立即生效。 ## 上线后的核对(两台都跑过) - 迁移 039 / 040 / 041 均已应用,新列 `pet_feed_tasks.tip_cent`、`pet_feed_tasks.refunded_cent`、 `orders.refunded_cent`、`pet_addresses.emergency_cipher`、`pet_addresses.vet_hospital` 都在。 - 地址城市码为空的记录 0 条;按 `cityCode=440300` 筛选命中全部招募中任务。 - 余额与流水对不上的账户 0 个。 - 超过 24 小时未支付的任务 0 个。 - 自动确认在真实数据上跑过:示例数据里那个「待确认」任务超期后被后台自动结算给喂养者, 账本与余额仍然一致。 ## 还卡在外部条件上的 1. **地图 key(高德或腾讯)**:`manifest.json` 的 `sdkConfigs.maps` 需要 iOS / Android 两个 appkey。 没有它,地图选点会提示不可用,另外两条定位路径正常。 2. **支付渠道密钥**:两台仍是 `payment.mode=sandbox`,渠道密钥全空。所以「支付并发布」在灰度期 要靠客服在管理端手工标记已托管,退款走「线下已退」登记。密钥到位后自动接上真实通道,代码不用改。 3. **手机端重新打包**:一期二期的界面改动都在客户端,要在 HBuilderX 里重新编译发版。 4. **保险自动投保**:方案里写了,但要先谈承保方,代码只留了 `insurance_no` 字段。 5. **配种撮合**:功能已经跑通,但 `pet.mating_enabled` 仍然关着,等规则与资质完备再开。