Commit Graph

40 Commits

Author SHA1 Message Date
weicw-dshsa eff7ba2340 feat(跑店填报): 新增跑店填报表与接口
自主填报拆分为「驻店填报 / 跑店填报」两种类型,跑店填报的填报内容是
「巡店列表(多门店,每条含门店/定位/打卡照片)+ 活动小结」,与
yxe_self_report 的单门店结构不兼容:yxe_self_report 既没有多门店字段,
也没有区分驻店/跑店类型的字段。为不污染既有 928 条历史数据与既有
审核/导出逻辑,本次新建独立表 yxe_visit_report。

- entity/param/mapper(+xml)/service(+impl)/controller 全套
- 接口:page、audit/page、GET、userList、GET /{id}、POST、PUT、
  PUT /resubmit、DELETE /{id}、DELETE /batch、PUT /batch、POST /export
- 审核通过复用自主填报逻辑:scene=6 写余额,备注「跑店填报审核通过获得收入」
- 提交人须 auth_status=2;resubmit 仅本人 + 仅已驳回记录
- store_count 由 store_list JSON 长度重算,不信任前端传值
- 列表接口(page / audit/page)裁剪 store_list 与 image:
  一次巡店最多 9 图 × N 店,整列 JSON 可达数百 KB,列表只用 store_count,
  明细展开时再按 id 拉详情;userList(填报记录页要渲染门店列表)与导出不裁剪
- 导出表头含门店清单/连锁清单等从 store_list 展开的列

配套:
- yxe_visit_report.sql(建表,幂等,含执行前后核对 SELECT)
- yxe-mp  packageUser/self-report/select、visit
- yxe-admin yxeVisitReport API 与跑店详情
2026-10-11 22:50:04 +08:00
weicw-dshsa 4914fb0088 refactor(visit): 拜访类型「门店」改为「地点」
仅调整字段注释与 SQL 文件中的列注释,无逻辑变更。
SQL 尚未在任何环境执行,直接修正注释即可,无需额外 ALTER。
「门店经理」保留不变。
2026-10-11 20:51:57 +08:00
weicw-dshsa 6fb298b71b feat(visit): 访问列表新增拜访类型、拜访日期、自填拜访人姓名
配合小程序 pages/visit/index 按「客户拜访」新原型重构为多卡片表单:
- visitType  拜访对象类型(门店/门店经理/其他)
- visitDate  拜访日期
- submitterName 拜访人自填姓名(进页面自动带出账号 realName,仍可改,
  因此可能与 sys_user.real_name 不一致,需独立留痕)

导出表头同步追加三列。其中新增列命名为「自填拜访人姓名」,因为导出中
已有同名字段「提交人姓名」(账号姓名),避免两列表头混淆。

数据库变更见 yxe_visit_list_add_visit_form_fields_2026-10-11.sql(幂等)。
2026-10-11 20:47:22 +08:00
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