weicw-dshsa
453e4f6db8
fix(微信登录): 修复重复注册产生同手机号多账号,导致审核误报「手机号已存在」
...
- loginByMpWxPhone 在手机号/openid 缺失时不再落库建匿名账号(旧逻辑先建无手机号账号再回填,授权失败或并发双击会堆出多个账号)
- 登录改为先按 openid 认账号、再按手机号兜底,并补齐缺失的 shop_user_oauth 绑定,避免老账号被当成新用户再建号
- getByOauthId 按 id 升序取最早一条,避免历史重复授权记录抛 TooManyResultsException
- 附生产数据修复脚本 fix_duplicate_user_phone_17307866134_2026-10-20.sql(软删同手机号空壳账号 972)
2026-10-20 12:24:59 +08:00
weicw-dshsa
ffc5ee80c7
fix(area): 区县重名时按名字查不再抛 TooManyResults,并支持按 adcode 精确查
...
根因:AreaServiceImpl.areaInfoByName 只按 name 精确匹配后调用 getOne(wrapper),
其默认 throwEx=true 走 MyBatis selectOne,重名区县(白云区=广州/贵阳、
朝阳区=北京/长春…)命中多条即抛 TooManyResultsException,被全局异常处理器
包成 {"code":1,"message":"操作失败"}。小程序客户拜访页定位链路依赖该接口,
表现为「有时能定位、有时不能」。
改动:
- areaInfoByName(两个重载):改用 findOneByName,以 selectList + Java 侧按 id
取最小替代 getOne —— 多条命中不再抛异常,且结果稳定(不随数据库返回顺序
漂移);查无结果返回 null,修掉原实现对 null 调 getLevelId() 的 NPE
- 新增 areaInfoById:按行政区划编码(adcode = sys_area.id)精确查询,
天然唯一,用于彻底绕开区县重名
- AreaController:POST /api/common/area/area-info-by-name 支持传 id 精确命中,
只传 name 时行为不变;查无结果返回 data=null 而非失败码
(该接口在 SecurityConfig 中为 permitAll,不得加 @PreAuthorize)
- 抽出 fillCity 与 LEVEL_COUNTY 常量,消除层级魔数
- 新增单测 11 个:AreaInfoByNameDuplicateTest(7) 覆盖重名不抛异常/结果稳定/
按 id 取最小/唯一名仍补 city/查无返 null/adcode 精确命中;
AreaControllerDispatchTest(4) 锁定 id 派发与 name 兼容
验证:单测 11/11;全量 22/22 BUILD SUCCESS。转红验证:临时还原为 getOne 后
4 个测试转红,证明测试非假绿。真实库集成验证(临时测试,已删除,仅 SELECT):
重名区县全部不再抛异常;adcode 520113→贵阳白云区(520100)、440111→广州白云区
(440100) 精确区分。纯代码修复,无 DDL/DML,故未新增 SQL 文件。
2026-10-16 21:23:58 +08:00
weicw-dshsa
e01acf486d
feat(审核): 新增待审计数统计接口,支撑个人中心药审核徽标
...
背景:个人中心「药审核」入口需要展示待审核任务数(红色徽标)。
该口径涉及 4 张表、5 个审核来源,且状态码语义各不相同,不能一概而论:
- yxe_user_task.status 待审核是 1(0 待执行 / 1 已完成待审核 / 2 已完成 / 3 已拒绝)
- yxe_self_report / yxe_visit_report / yxe_share 待审核都是 0
- 同一张 yxe_user_task 还要按分类拆开:药动销 = cate_id IN (1,3),
跑店/巡店 = cate_id = 4(与审核页 cateIdList=1,3 / cateId=4 对齐)
故新增 /api/yxe/yxe-audit/pending-count,一次返回 5 类明细 + total,
口径与审核页各类型「待审核」列表的总数完全一致,保证入口徽标与
点进去的列表条数对得上。
权限:非审核员(can_auth != 1)与未登录一律返回 0,不下发全站待审量。
验证(本地库 yaoxiaoer,审核员账号实测):
分类 接口 审核页列表
药动销 110 110
跑店/巡店 2 2
驻店填报 787 787
跑店填报 0 0
药分享 36 36
合计 935 -
匿名请求与 can_auth=0 账号请求均返回 total=0,确认拦截生效。
2026-10-12 16:11:45 +08:00
weicw-dshsa
afa28827b6
fix(药分享): 商品清单去重改用代表行,修复 ONLY_FULL_GROUP_BY 报错
...
现象:小程序“药分享”页 onShow 抛
TypeError: Cannot read properties of undefined (reading 'list')
根因在本接口:/yxe/yxe-share-detail/page?groupByProduct=true 返回
code=1 且不带 data,前端取 data.list 直接抛异常,中断整个 onShow。
原因:原 SQL 为 `SELECT a.* FROM yxe_share_detail a WHERE ... GROUP BY a.goods_name`。
MySQL 开启 ONLY_FULL_GROUP_BY 时,SELECT 列表中 a.* 的非分组列既不在
GROUP BY 内也不函数依赖于分组列,直接报
Expression #1 of SELECT list is not in GROUP BY clause and contains
nonaggregated column '...a.id' which is not functionally dependent on
columns in GROUP BY clause
生产库恰好关闭了该 sql_mode 才长期未暴露,本地库(MySQL 9.7)已开启。
改法:取每个 goods_name 在**筛选结果集内**的最小 id 作为代表行,
语义与原 WHERE 之后 GROUP BY 一致。内层子查询重复同一套筛选条件,
否则按 province/city 过筛后该代表行可能不在结果集中,对应商品会整个消失。
未用窗口函数,不依赖 MySQL 8.0。
验证(本地库):
- groupByProduct=true code=0,5 个去重商品(修复前 code=1)
- groupByProduct + city count=3,内外层条件一致生效
- groupByProduct + goodsName count=2
- 不带 groupByProduct count=12,原有行为不变
2026-10-12 14:49:30 +08:00
weicw-dshsa
1c431c6899
chore(db): 合并数据库变更为单一全量脚本 schema_all_2026-10-11.sql
...
原 yxe-java/ 根目录散落 12 个 SQL 文件,同一张表的建表与加列分散在多处,
后续只改一处容易漏。合并为单文件,各变更的「用途/背景/影响/性质/配套代码」
头注与执行前后核对 SELECT 全部保留,末尾附执行记录。
涵盖:yxe_self_report(+activity_time/reject_reason)、yxe_visit_report、
yxe_visit_list(+visit_type/visit_date/submitter_name)、yxe_user_task.income、
sys_user.user_group、yxe_chronic_disease_product、transport_maintenance_*,
以及两项历史数据修正(chain_id 占位符、yxe_task.reward NULL)。
一并修复:原脚本在全新库按序执行会报错
yxe_self_report.sql 已内联 activity_time/reject_reason,而
yxe_self_report_add_* 两个裸 ALTER 又去 ADD 同名列
→ ERROR 1060 Duplicate column name
现全部加列改为 information_schema 判断后再 ADD,整文件可重复执行。
另为第 6/7 节补 SET @db(原先依赖第 2 节的变量,逐语句执行时会丢)。
验证(在独立临时库 yxe_schema_verify,未触碰 yaoxiaoer):
- 整文件连续执行两遍,均 exit=0,无 error / Duplicate,7 处正确跳过
- 产出结构与 yaoxiaoer 逐表 SHOW CREATE TABLE 比对,9 张表全部一致
- 另建库复现原缺陷,确认裸 ALTER 报 ERROR 1060
注:yxe_task.reward 的 NULL 修正(第 10 节)在本地库尚未执行,
id=663 仍为 NULL;接口已因读侧兜底不再报错,如需数据一致请执行该节。
2026-10-11 22:58:04 +08:00
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