weicw-dshsa
|
2ae3710a82
|
fix: 修复任务奖金为 NULL 导致业绩统计接口空指针
小程序 pages/performance/index 请求的 /yxe-user-task/userRank 与
/yxe-task/data 同时返回 {"code":1,"error":"java.lang.NullPointerException"},
页面完成进度与人员排行榜全部空白。
根因:yxe_task.reward 允许为 NULL,历史数据中存在 NULL 记录(本机库
id=663)。两个接口在累加奖金时写作 BigDecimal.ZERO.add(task.getReward()),
BigDecimal.add(null) 直接抛 NPE。userRank 不传 name 时会遍历全部用户,
任何一人名下有该脏任务,整个排行榜即整体失败。
改动分读、写两侧:
读侧(不再因脏数据报错):
- YxeTaskController#data、#userRank 对 reward 做 null 兜底(nullToZero)
- 顺带把 userTask.getStatus().equals(2) / getLoginUser().getCanAuth().equals(1)
改为 Integer.valueOf(x).equals(...),避免字段为 NULL 时拆箱再抛 NPE
(sys_user.can_auth 列本身可空,属同类隐患)
- userRank 过滤 task_id 为 NULL 的用户任务,并去重后批量查任务
写侧(不再产生新的 NULL):
- save / saveBatch 在新增时把缺失的 reward 兜底为 0
- update / updateBatch **刻意不补**,并在代码注释中写明原因:
二者走 MyBatis-Plus 默认 NOT_NULL 部分更新语义,字段为 null 表示
“本次不修改该字段”。管理端普通任务的 reward 由产品奖励自动汇总,
产品行可能为空导致该字段整个缺失;若在此兜底为 0,一次普通编辑
就会把任务原有奖金静默清零,直接影响用户实得收益。
该风险已有专门护栏测试 updateMustNotDefaultRewardToZero 覆盖
(注入错误修法后该测试转红:expected:<null> but was:<0>)。
回归测试 TaskRewardNullSafetyTest 共 8 例,覆盖读侧两接口的 NULL 容忍、
task_id 为 NULL 不阻断排行榜、以及新增侧补默认值、更新侧必须保持 null。
已验证:回退主修后 3 例转红(save/saveBatch/data),update 护栏保持绿色。
业务影响评估(补 0 安全):
- 库中已有 67 条 reward=0 的任务,其中 6 条已完整走通接单→提交→审核→
income 落库 0.00,说明“奖金为 0”本就是系统接受的正常语义
- 审核结算处 income = reward == null ? ZERO : reward,服务端本就把 NULL 当 0,
补 0 不改变任何用户实得金额
- 小程序端 12 个源文件逐一排查,无任何依赖 reward 为 null 的分支判断
SQL: fix_task_reward_null_npe_2026-10-11.sql(幂等,本次未执行)
|
2026-10-11 20:20:03 +08:00 |
|
weicw-dshsa
|
9ff52cfe02
|
feat(自主填报): 新增驳回后重新提交接口
背景:填报记录被驳回后用户无法修改重提,只能重新走一遍新增流程。
不复用通用 PUT /yxe/yxe-self-report,原因是该接口无归属校验(任何登录
用户可改他人记录),且请求体带 status=1 会触发审核通过分支给用户加余额,
用户端直接复用等于暴露打款开关。因此单独新增 PUT /resubmit:
- 校验登录 + 已认证、记录归属当前用户、当前状态必须为已驳回
- status 与 rejectReason 由服务端写死(置 0、清空),忽略请求体传值
- reward 按新销量重算,与新增提交保持一致(最终金额仍由审核端确认)
- 不修改 activityTime:前端表单未采集该字段,避免被置空
|
2026-10-11 17:05:05 +08:00 |
|
weicw-dshsa
|
28f3ea58fb
|
docs: 修正状态字段注释与真实码值不符的问题(纯注释)
以下状态注释与代码实际写入值不一致,就地修正,无逻辑变更:
- DealerWithdraw / DealerWithdrawParam
10/20/30/40 → 0/1/2/3
(真实写入值见 WxPayController:226,273,276 与 DealerWithdrawController:109,129)
- YxeTask / YxeTaskParam
0上架,1下架 → 0待接单,1执行中,2已完成
- YxeUserTask / YxeUserTaskParam
0待审核,1通过,2驳回 → 0待执行,1已完成待审核,2已完成,3已拒绝
(依据 YxeUserTaskController.getStatusText():462-478)
- YxeShare / YxeShareParam
0正常,1冻结 → 0待审核,1通过,2拒绝
- YxeVisitList / YxeVisitListParam
0上架,1下架 → 0待审核,1通过,2拒绝
注:DealerWithdrawController.getApplyStatusText():242-257 的代码仍按 10/20/30/40
返回文案,与真实码值不符,属逻辑改动,未包含在本次提交内。
|
2026-10-11 16:37:16 +08:00 |
|
weicw-dshsa
|
92baf41073
|
fix: 消除 GROUP BY 非分组列报错并修复连锁标识脏数据
MySQL ONLY_FULL_GROUP_BY 下,MyBatis-Plus 的 list(wrapper) 默认 SELECT
实体全部字段,配合 groupBy 后非分组列既不在 GROUP BY 中也不函数依赖分组键,
导致 SQLSyntaxErrorException。即便放宽模式,这些字段也只是组内随机一行的值。
根因是借用 SQL GROUP BY 实现"按某列去重",共 7 处,统一改为一次查询 +
内存分组,返回值结构与原实现一致:
- MerchantServiceImpl.groupByChain(本次线上报错点)
- YxeProductServiceImpl.listByGroup / listByChain / listByCate(2 个重载)
- YxeTaskProductServiceImpl.productGroupByTask
- YxeShareServiceImpl.listByMerchant(2 个重载)
分组父节点用独立副本(BeanUtils.copyProperties)而非复用子列表实例,
否则 parent.setChildren(children) 会造成对象自引用,JSON 序列化报
"Direct self-reference leading to cycle"。
附带消除 N+1:groupByChain 原为 1+12 次查询、重复拉取 8105 行。
同时 groupByChain 返回稳定 chainId(连锁名,与字典 sys_dict_data.dict_id=175
的 dict_data_code 一致),从源头消除前端回退到 `chain_${index}` 位置型占位符,
避免其经审核端写入 yxe_self_report.chain_id 后按连锁等值筛选永久漏查。
SQL: fix_self_report_chain_id_placeholder_2026-10-11.sql(本地已执行 5 行)
|
2026-10-11 16:34:21 +08:00 |
|
weicw-dshsa
|
8e1d552eed
|
chore: 移除误提交的日志与 .DS_Store,补充 .gitignore 规则
|
2026-10-10 21:44:02 +08:00 |
|
b2894lxlx
|
74bc08d958
|
261010
|
2026-10-10 21:34:36 +08:00 |
|
b2894lxlx
|
7119dc76a9
|
250826
|
2025-08-26 21:29:55 +08:00 |
|
b2894lxlx
|
1a35b30c7e
|
250522
|
2025-05-22 10:28:37 +08:00 |
|
b2894lxlx
|
bfbde8a0f5
|
250522
|
2025-05-22 10:27:57 +08:00 |
|
b2894lxlx
|
9139457203
|
240401
|
2024-04-01 22:11:01 +08:00 |
|
gxwebsoft
|
1a47ed7630
|
新增配件管理模块
|
2024-02-27 20:45:12 +08:00 |
|
gxwebsoft
|
349ef16c20
|
新增配件管理模块
|
2024-02-27 20:29:16 +08:00 |
|
gxwebsoft
|
89bcd98570
|
完成保养记录和厂内维修模块
|
2024-02-25 19:33:40 +08:00 |
|
gxwebsoft
|
3c22a60a1c
|
完成安全维保管理模块
|
2024-02-25 15:23:54 +08:00 |
|
gxwebsoft
|
d72849ad50
|
新增采购入库功能
|
2024-02-05 21:48:07 +08:00 |
|
gxwebsoft
|
20f190410c
|
新增标准节、优化设备统计
|
2024-02-05 15:54:54 +08:00 |
|
gxwebsoft
|
426d0a685a
|
合并代码
|
2024-02-03 16:42:16 +08:00 |
|
b2894lxlx
|
bfefa9a787
|
调整
|
2024-01-31 14:55:59 +08:00 |
|
b2894lxlx
|
2fd8b3d341
|
调整
|
2024-01-31 14:54:49 +08:00 |
|
b2894lxlx
|
71e28fd448
|
新增收款;
新增项目结算书
|
2023-06-18 11:02:37 +08:00 |
|
b2894lxlx
|
d61e7b163d
|
新增转租管理;
结构调整
|
2023-06-17 12:39:19 +08:00 |
|
b2894lxlx
|
ff87369bab
|
新增历史结算;
新增租单管理
|
2023-06-13 01:44:45 +08:00 |
|
b2894lxlx
|
65f21b7d0a
|
新增历史结算;
新增租单管理
|
2023-06-13 01:44:40 +08:00 |
|
b2894lxlx
|
8307a16689
|
完善合同管理;
新增结算管理
|
2023-06-12 01:32:34 +08:00 |
|
b2894lxlx
|
385bfb96b8
|
新增客户管理;
新增合同管理
|
2023-06-10 01:29:06 +08:00 |
|
gxwebsoft
|
484999cd07
|
合并代码
|
2023-06-09 12:30:28 +08:00 |
|
gxwebsoft
|
61db0f4b5a
|
Merge remote-tracking branch 'origin/master'
|
2023-06-08 19:30:30 +08:00 |
|
gxwebsoft
|
6e3bd8f55f
|
新增项目管理
|
2023-06-08 19:30:24 +08:00 |
|
weicw
|
83d918a467
|
删除无用字段
|
2023-06-08 12:38:25 +08:00 |
|
weicw
|
6b9d4c4ef8
|
关键字模糊搜索
|
2023-06-06 12:45:36 +08:00 |
|
weicw
|
f1b1ab0642
|
产权公司
|
2023-06-06 10:26:38 +08:00 |
|
weicw
|
a53406898f
|
防坠器
|
2023-06-05 22:57:09 +08:00 |
|
gxwebsoft
|
47e758e22f
|
修复设备分类和设备型号问题
|
2023-06-05 17:06:07 +08:00 |
|
gxwebsoft
|
d2a82a97e6
|
初始化
|
2023-06-04 11:18:05 +08:00 |
|
gxwebsoft
|
536f8079b0
|
初始化
|
2023-06-04 00:35:22 +08:00 |
|
gxwebsoft
|
428e4996f9
|
初始化
|
2023-06-04 00:28:12 +08:00 |
|
南宁网宿科技
|
912944faea
|
Initial commit
|
2023-06-03 23:56:49 +08:00 |
|