状态:**计划已定,待执行**(2026-06-26 暂存,用户优先处理别的问题)
关联需求:券码核验记录增加对外分页接口 + web 端撤销核销迁移到管理端
discount_member.goodsorder_id(核销时自动建的 goodsorder 订单编码)douyin_product.product_name;「抖音券名称」= discount_member.name(本地套餐名)/web/douyin/cancel 删除,纯迁移到管理端member.name(会员姓名);手机号脱敏规则 138****1234(前3后4,<7位原样)discount_member.status=1 作废)+ 记 discount_logcancel_status 0未撤销/1已撤销)筛选douyin_verify_log**(operateType=CANCEL),沿用小程序核销审计链路| 条件 | 字段 |
|---|---|
| 抖音券码 | verify_record.origin_code(eq,券码唯一) |
| 验券状态 | verify_record.verify_status(eq,0成功 1失败) |
| 撤销状态 | verify_record.cancel_status(eq,0未撤销 1已撤销) |
DouyinVerifyRecordPageVO)| 列表字段 | 来源 | 关联 |
|---|---|---|
| 订单编号 | discount_member.goodsorder_id |
LEFT JOIN discount_member ON discount_member_id |
| 会员openid | member.openid |
LEFT JOIN member ON discount_member.member_id |
| 会员手机号(脱敏) | member.phone → 138****1234 |
同上 join,service 遍历脱敏 |
| 团购商品名称 | douyin_product.product_name |
LEFT JOIN douyin_product ON verify.product_id = product.product_id(非主键) |
| 抖音券名称 | discount_member.name |
discount_member join |
| 抖音券类型(类目) | douyin_product.category |
douyin_product join |
| 验券时间 | verify_record.verify_time |
主表 |
| 兑换人 | member.name |
核销操作人=购买会员本人,复用 member join 取姓名 |
| 状态 | verify_status+cancel_status 综合文案 statusName(已兑换/已撤销/核销失败)+ 原值 |
主表 |
兑换人:
verify_user_id与discount_member.member_id同为核销会员 id(核销时 operator 即套餐归属人),复用同一次 member join 取姓名。
脱敏规则:138****1234(前3后4,中间4位*),<7 位原样返回。
主表 douyin_verify_record(别名 t)
- LEFT JOIN discount_member dm ON t.discount_member_id = dm.id
- LEFT JOIN member m ON dm.member_id = m.id
- LEFT JOIN douyin_product p ON t.product_id = p.product_id(**非主键字段**,MPJ leftJoin 支持任意字段)
selectAs:dm.goodsorder_id→orderCode、m.openid→memberOpenid、m.phone→memberPhone(脱敏)、p.product_name→productName、dm.name→couponName、p.category→category、m.name→exchangerName;selectAll(DouyinVerifyRecord)带 id/verify_time/verify_status/cancel_status/origin_code 等。
services/src/main/java/com/doumee/dao/business/vo/DouyinVerifyRecordPageVO.java — 分页返回 VO(含 originCode/verifyStatus 查询入参 + 渲染字段 + statusName)platform/src/main/java/com/doumee/api/business/DouyinVerifyController.java — @RequestMapping("/business/douyinVerify")POST /page → findManagePage,@RequiresPermissions("business:douyinVerify:query")POST /cancel → cancel,@RequiresPermissions("business:douyinVerify:cancel"),@PreventRepeatservices/src/main/java/com/doumee/dao/business/DouyinVerifyRecordMapper.java — BaseMapper → MPJJoinMapper(沿用 DouyinProductMapper 模式,支持 selectJoinPage)services/src/main/java/com/doumee/service/business/DouyinVerifyService.java — 新增 findManagePage(PageWrap<DouyinVerifyRecordPageVO>) -> PageData<DouyinVerifyRecordPageVO>(**不动**现有 findPage,web /web/douyin/page 仍用)services/src/main/java/com/doumee/service/business/impl/DouyinVerifyServiceImpl.javafindManagePage:MPJ 三表 leftJoin + selectAs 映射 + 手机号脱敏 + statusName 文案rec.discountMemberId 把 discount_member.status 置 1 + 记 discount_log(参照 backGoodsorder 退卡写法)@Transactional(抖音撤销/作废套餐/记录更新原子);撤销日志由 controller 落 douyin_verify_logweb/src/main/java/com/doumee/api/web/DouyinApi.java — 删 cancel 方法 + 仅其用的 OPERATE_CANCEL 常量 + fillByRecord 的 cancel 分支 / CANCEL_DONE;清理 DouyinCancelParam importservices/src/main/java/com/doumee/core/douyin/dto/DouyinCancelParam.java — 注释由「web 端小程序」改为「管理端」db/Shiro.sql — 幂等登记 business:douyinVerify:query、business:douyinVerify:cancel + 授权 role 1findPage(web 端 /web/douyin/page 保留)、verify/prepare 链路、商品同步/绑定、openDiscountForVerify。discount_member.status=1)+ 记 discount_log + 更新 verify_record(cancel_status/time/user)。douyin_verify_log(operateType=CANCEL,沿用 web 端那套);cancel service 加 @Transactional,抖音撤销/作废套餐/记录更新原子。mvn -pl platform -am clean compile -o(services + web + platform 全量)db/Shiro.sql(幂等)/doc.html:POST /business/douyinVerify/page(券码/状态筛选 + 各字段回填 + 手机号脱敏)、POST /business/douyinVerify/cancel(超时也能撤销)Member.phone(model line 96)、Member.openid(line 66);discount_member.code(票号)、goodsorder_id;member.id 关联 discount_member.member_idBaseController.getLoginUser().getId()(Shiro LoginUserInfo)DouyinVerifyRecordMapper 现为 BaseMapper(待改 MPJJoinMapper)DouyinCancelParam{id};cancel 1 小时窗口在 DouyinVerifyServiceImpl line 374-378douyin_product.product_id 为业务唯一键(upsertProduct 按 product_id selectOne 无 limit,视为唯一),LEFT JOIN 不会膨胀DiscountMemberServiceImpl 是 MPJ leftJoin + selectAs + 子查询标量的黄金先例GoodsorderServiceImpl.backGoodsorder(line 1020-1042):按 rec.discountMemberId 查 discount_member,仅 status=0 才作废(update set status=1 where id)+ 记 DiscountLog(type=1, editInfo="撤销核销作废", creator=operator, discountMemberId, goodsorderId=dm.goodsorderId);已作废跳过(幂等)