From 1c431c6899db6504b8e9de926cae268518f350e9 Mon Sep 17 00:00:00 2001 From: weicw1996 Date: Sun, 11 Oct 2026 22:58:04 +0800 Subject: [PATCH] =?UTF-8?q?chore(db):=20=E5=90=88=E5=B9=B6=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E5=8F=98=E6=9B=B4=E4=B8=BA=E5=8D=95=E4=B8=80?= =?UTF-8?q?=E5=85=A8=E9=87=8F=E8=84=9A=E6=9C=AC=20schema=5Fall=5F2026-10-1?= =?UTF-8?q?1.sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原 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;接口已因读侧兜底不再报错,如需数据一致请执行该节。 --- ...report_chain_id_placeholder_2026-10-11.sql | 42 -- fix_task_reward_null_npe_2026-10-11.sql | 49 -- schema_all_2026-10-11.sql | 610 ++++++++++++++++++ sys_user_add_user_group.sql | 2 - transport_maintenance_plan.sql | 34 - transport_maintenance_record.sql | 34 - yxe_chronic_disease_product.sql | 18 - yxe_self_report.sql | 34 - yxe_self_report_add_activity_time.sql | 2 - yxe_self_report_add_reject_reason.sql | 2 - yxe_user_task_add_income.sql | 2 - ..._list_add_visit_form_fields_2026-10-11.sql | 63 -- yxe_visit_report.sql | 61 -- 13 files changed, 610 insertions(+), 343 deletions(-) delete mode 100644 fix_self_report_chain_id_placeholder_2026-10-11.sql delete mode 100644 fix_task_reward_null_npe_2026-10-11.sql create mode 100644 schema_all_2026-10-11.sql delete mode 100644 sys_user_add_user_group.sql delete mode 100644 transport_maintenance_plan.sql delete mode 100644 transport_maintenance_record.sql delete mode 100644 yxe_chronic_disease_product.sql delete mode 100644 yxe_self_report.sql delete mode 100644 yxe_self_report_add_activity_time.sql delete mode 100644 yxe_self_report_add_reject_reason.sql delete mode 100644 yxe_user_task_add_income.sql delete mode 100644 yxe_visit_list_add_visit_form_fields_2026-10-11.sql delete mode 100644 yxe_visit_report.sql diff --git a/fix_self_report_chain_id_placeholder_2026-10-11.sql b/fix_self_report_chain_id_placeholder_2026-10-11.sql deleted file mode 100644 index 95dafa0..0000000 --- a/fix_self_report_chain_id_placeholder_2026-10-11.sql +++ /dev/null @@ -1,42 +0,0 @@ --- 用途:修正 yxe_self_report.chain_id 中残留的位置型占位符(chain_0、chain_3、chain_6 …) --- 日期:2026-10-11 --- 背景:前端 normalizeMerchantChain 在接口未返回 chainId 时会回退成 `chain_${index}`, --- 该值经审核端 saveMerchantEdit 写入 chain_id 落库。而按连锁筛选走的是等值匹配 --- (YxeSelfReportMapper.xml: a.chain_id = #{param.chainId}),占位符导致这些记录 --- 在按连锁筛选时被永久漏掉。本系统没有连锁表,chain 名称即事实上的连锁标识 --- (连锁字典 sys_dict_data.dict_id=175 的 dict_data_code 同样是连锁名)。 --- 影响:5 行(chain_6 -> 老百姓 3 行;chain_3 -> 百姓人家 2 行) --- 性质:幂等,可重复执行;以 chain_name 为准回填 chain_id --- 配套代码:MerchantServiceImpl.groupByChain 返回稳定 chainId; --- AuditSelfReportItem.vue 兜底链改用连锁名并在写入前拦截 chain_ 前缀 - --- 执行前核对(应为 5 行) -SELECT id, chain_id, chain_name -FROM yxe_self_report -WHERE chain_id REGEXP '^chain_[0-9]+$' -ORDER BY id; - --- 修正 -UPDATE yxe_self_report -SET chain_id = chain_name -WHERE chain_id REGEXP '^chain_[0-9]+$' - AND chain_name IS NOT NULL - AND chain_name <> ''; - --- 执行后核对(remaining_placeholder 与 mismatch 均应为 0) -SELECT SUM(chain_id REGEXP '^chain_[0-9]+$') AS remaining_placeholder, - SUM(chain_id <> chain_name) AS mismatch, - COUNT(*) AS total -FROM yxe_self_report; - --- ============================================================ --- 执行记录 --- ============================================================ --- 2026-10-11 本地开发库(127.0.0.1:3306/yaoxiaoer,root) --- 执行结果:受影响 5 行 --- 执行后核对:remaining_placeholder = 0,mismatch = 0 --- 功能验证:按连锁筛选命中数 --- chainId=老百姓 279 -> 282(找回 id 119、130、169) --- chainId=百姓人家 174 -> 176(找回 id 138、139) --- --- 生产库:尚未执行。需经确认后按同一条语句复核执行。 diff --git a/fix_task_reward_null_npe_2026-10-11.sql b/fix_task_reward_null_npe_2026-10-11.sql deleted file mode 100644 index ce3f07e..0000000 --- a/fix_task_reward_null_npe_2026-10-11.sql +++ /dev/null @@ -1,49 +0,0 @@ --- 用途:把 yxe_task.reward 为 NULL 的历史脏数据规范化为 0,消除业绩统计接口的空指针隐患 --- 日期:2026-10-11 --- 背景:小程序 pages/performance/index 页面请求的 /yxe-user-task/userRank 与 /yxe-task/data --- 同时返回 {"code":1,"message":"操作失败","error":"java.lang.NullPointerException"}, --- 页面「我的完成进度/完成率」与人员排行榜全部空白。 --- 根因:yxe_task.reward 为 NULL 的任务被计入完成数后执行 --- BigDecimal.ZERO.add(task.getReward()) --- → BigDecimal.add(null) 抛 NPE,整个接口失败。 --- 本库命中数据为 yxe_task.id=663(title='测试手动',status=2 已完成, --- 其 yxe_user_task.id=630 / user_id=875 的 status=2)。注意任务状态为 2 的只有这 1 条, --- 但它足以让「全量排行榜」接口整体失败——userRank 不传 name 时遍历全部用户。 --- 影响:1 行 --- 性质:幂等,可重复执行;只处理 status 已完成但仍为 NULL 的奖励金额 --- 配套代码: --- 1) 读侧兜底:YxeTaskController#data、YxeUserTaskController#userRank --- 对 reward 做 nullToZero,接口不再报错; --- 2) 写侧堵源:YxeTaskController#save / #saveBatch 在新增时把缺失的 reward 兜底为 0, --- 不再产生新的 NULL 脏数据。 --- 注意 #update / #updateBatch **刻意不补默认值**:二者是部分更新语义 --- (MyBatis-Plus 默认 NOT_NULL 策略),null 表示“本次不修改该字段”, --- 若在那里兜底会把任务原有奖金静默清零,直接影响用户实得收益。 --- 3) 回归测试:src/test/java/com/gxwebsoft/yxe/controller/TaskRewardNullSafetyTest.java --- 说明:本脚本属于「历史数据规范化」。即使不执行,接口也已不再报错(读侧兜底), --- 但金额会按 0 计;执行后数据本身也归于一致。 - --- 执行前核对:先看清 NULL 分布在哪些任务、是否已有人完成任务 -SELECT t.id AS task_id, - t.title, - t.status AS task_status, - t.reward, - COUNT(ut.id) AS user_task_cnt, - SUM(ut.status = 2) AS completed_cnt -FROM yxe_task t -LEFT JOIN yxe_user_task ut ON ut.task_id = t.id -WHERE t.reward IS NULL -GROUP BY t.id, t.title, t.status, t.reward -ORDER BY t.id; - --- 变更:仅规范化「已完成/进行中」且 reward 为 NULL 的任务,避免影响尚未开始的任务 -UPDATE yxe_task -SET reward = 0.00 -WHERE reward IS NULL - AND status IN (1, 2); - --- 执行后核对(remaining_null 应为 0) -SELECT SUM(reward IS NULL) AS remaining_null, - SUM(reward IS NULL AND status IN (1, 2)) AS remaining_null_active, - COUNT(*) AS total -FROM yxe_task; diff --git a/schema_all_2026-10-11.sql b/schema_all_2026-10-11.sql new file mode 100644 index 0000000..502c9d0 --- /dev/null +++ b/schema_all_2026-10-11.sql @@ -0,0 +1,610 @@ +-- ============================================================================ +-- yxe 库结构与数据修正 —— 全量累计脚本 +-- ============================================================================ +-- 用途:yxe 业务库(yaoxiaoer)的建表 / 加列 / 历史数据修正,汇总为一个可整 +-- 文件重复执行的脚本,供新环境初始化与生产库复核执行。 +-- 日期:2026-10-11 +-- 背景:原先这些变更散落在 yxe-java/ 根目录的 12 个独立 SQL 文件中,同一张表 +-- 的建表与加列分散在多处,后续维护容易只改一处;本次合并为单文件, +-- 原文件内容完整保留在本文件对应分节中。 +-- +-- 由以下 12 个文件合并而来(合并后原文件删除,历史可经 git log 追溯): +-- yxe_self_report.sql +-- yxe_self_report_add_activity_time.sql +-- yxe_self_report_add_reject_reason.sql +-- yxe_visit_report.sql (2026-10-11 新增) +-- yxe_visit_list_add_visit_form_fields_2026-10-11.sql(2026-10-11 新增) +-- yxe_user_task_add_income.sql +-- yxe_chronic_disease_product.sql +-- sys_user_add_user_group.sql +-- transport_maintenance_plan.sql +-- transport_maintenance_record.sql +-- fix_self_report_chain_id_placeholder_2026-10-11.sql(2026-10-11 数据修正) +-- fix_task_reward_null_npe_2026-10-11.sql (2026-10-11 数据修正) +-- +-- 性质:整体幂等,可整文件重复执行。 +-- 建表用 CREATE TABLE IF NOT EXISTS;加列统一走 information_schema 判断后 +-- 再 ADD(原先部分 ALTER 是裸语句,重复执行或与建表语句叠加时会报 +-- Duplicate column name,本次一并改为条件执行);数据修正限定条件, +-- 重复执行不改变结果。 +-- +-- 执行顺序:按本文件自上而下执行即可。分节顺序已考虑依赖: +-- 先建表/加列(第 1–8 节),最后做历史数据修正(第 9–10 节)。 +-- 注意第 1 节的建表已内联 activity_time / reject_reason, +-- 第 2–3 节的加列会自动跳过(已存在)。 +-- +-- 配套代码(各变更的详细说明见对应分节): +-- yxe-java YxeSelfReport* / YxeVisitReport* / YxeVisitList* / YxeTask* / +-- YxeUserTask* / YxeChronicDiseaseProduct* 及对应 Controller +-- yxe-mp packageUser/self-report/*、pages/visit/index、pages/audit/index +-- yxe-admin src/api/yxe/*、src/views/yxe/* +-- ============================================================================ + + +-- ############################################################################ +-- 1. yxe_self_report —— 自主填报(驻店填报)建表 +-- ############################################################################ +-- 用途:自主填报(2026-10 起对外称「驻店填报」)主表 +-- 背景:自主填报功能的原始建表语句;后续新增的 activity_time / reject_reason +-- 两列已内联到本建表语句中(见下方列定义),因此第 2–3 节的加列在 +-- 新库上会走「已存在则跳过」分支。 +-- 影响:新库建表 0 行;已存在的库不做任何改动。 +-- 性质:幂等(CREATE TABLE IF NOT EXISTS)。 +-- 配套代码:YxeSelfReport 实体与 YxeSelfReportController 全套。 + +-- 执行前核对(应为 0,即表不存在) +SELECT COUNT(*) AS table_exists +FROM information_schema.TABLES +WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'yxe_self_report'; + +CREATE TABLE IF NOT EXISTS `yxe_self_report` ( + `id` int NOT NULL AUTO_INCREMENT, + `user_id` int DEFAULT NULL COMMENT '提交人ID', + `merchant_id` int DEFAULT NULL COMMENT '门店ID', + `merchant_name` varchar(255) DEFAULT NULL COMMENT '门店名称', + `chain_id` varchar(64) DEFAULT NULL COMMENT '连锁ID', + `chain_name` varchar(255) DEFAULT NULL COMMENT '连锁名称', + `date` varchar(32) DEFAULT NULL COMMENT '填报日期', + `activity_time` varchar(32) DEFAULT NULL COMMENT '活动时间', + `reward` decimal(10,2) DEFAULT NULL COMMENT '奖金金额', + `image` longtext COMMENT '全部图片集合', + `clock_photos` longtext COMMENT '上下班打卡图', + `booth_photos` longtext COMMENT '门头摆台照', + `sales_groups` longtext COMMENT '销量填写JSON', + `receipt_photo` longtext COMMENT '小票图', + `summary` longtext COMMENT '活动小结', + `rating` varchar(32) DEFAULT NULL COMMENT '门店评分', + `lat` varchar(64) DEFAULT NULL COMMENT '纬度', + `lng` varchar(64) DEFAULT NULL COMMENT '经度', + `location` varchar(500) DEFAULT NULL COMMENT '定位地址', + `sort_number` int DEFAULT 0 COMMENT '排序', + `comments` varchar(500) DEFAULT NULL COMMENT '备注', + `status` tinyint DEFAULT 0 COMMENT '状态:0待审核,1通过,2拒绝', + `reject_reason` varchar(500) DEFAULT NULL COMMENT '驳回原因', + `deleted` tinyint DEFAULT 0 COMMENT '逻辑删除', + `tenant_id` int DEFAULT 10325 COMMENT '租户ID', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_yxe_self_report_user_id` (`user_id`), + KEY `idx_yxe_self_report_merchant_id` (`merchant_id`), + KEY `idx_yxe_self_report_status` (`status`), + KEY `idx_yxe_self_report_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='自主填报'; + +-- 执行后核对(应返回 1 行,且列/注释符合预期) +SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_COMMENT, ORDINAL_POSITION +FROM information_schema.COLUMNS +WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'yxe_self_report' +ORDER BY ORDINAL_POSITION; + + +-- ############################################################################ +-- 2. yxe_self_report —— 新增 activity_time(活动时间) +-- ############################################################################ +-- 用途:自主填报新增「活动时间」 +-- 背景:申报活动时间需要与填报日期(date)区分开,单独一列留存。 +-- 注意:该列已内联进第 1 节的建表语句,本节的加列在新库上会跳过, +-- 保留此节是为兼容「先有旧表、后加列」的存量库。 +-- 影响:ALTER 本身 0 行;存量数据该列为 NULL,不做回填。 +-- 性质:幂等(information_schema 判断列是否存在后 ADD)。 +-- 配套代码:YxeSelfReport.activityTime、yxe-mp create.vue 活动日期选择器。 + +-- 执行前核对(应为 0,即列不存在) +SELECT COUNT(*) AS col_exists +FROM information_schema.COLUMNS +WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'yxe_self_report' + AND COLUMN_NAME = 'activity_time'; + +SET @db := DATABASE(); + +SET @sql := IF( + (SELECT COUNT(*) FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'yxe_self_report' AND COLUMN_NAME = 'activity_time') = 0, + 'ALTER TABLE `yxe_self_report` ADD COLUMN `activity_time` varchar(32) DEFAULT NULL COMMENT ''活动时间'' AFTER `date`', + 'SELECT ''yxe_self_report.activity_time already exists'' AS skipped' +); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + + +-- ############################################################################ +-- 3. yxe_self_report —— 新增 reject_reason(驳回原因) +-- ############################################################################ +-- 用途:自主填报新增「驳回原因」 +-- 背景:审核端驳回后需要把原因回传给提交人,并在重新提交时展示。 +-- 注意:该列已内联进第 1 节的建表语句,本节同样是为存量库兼容保留。 +-- 影响:ALTER 本身 0 行;存量数据该列为 NULL。 +-- 性质:幂等(information_schema 判断列是否存在后 ADD)。 +-- 配套代码:YxeSelfReport.rejectReason、YxeSelfReportController#resubmit。 + +-- 执行前核对(应为 0,即列不存在) +SELECT COUNT(*) AS col_exists +FROM information_schema.COLUMNS +WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'yxe_self_report' + AND COLUMN_NAME = 'reject_reason'; + +SET @sql := IF( + (SELECT COUNT(*) FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'yxe_self_report' AND COLUMN_NAME = 'reject_reason') = 0, + 'ALTER TABLE `yxe_self_report` ADD COLUMN `reject_reason` varchar(500) DEFAULT NULL COMMENT ''驳回原因'' AFTER `status`', + 'SELECT ''yxe_self_report.reject_reason already exists'' AS skipped' +); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +-- 执行后核对(第 2–3 节合计应为 2 行) +SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_COMMENT, ORDINAL_POSITION +FROM information_schema.COLUMNS +WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'yxe_self_report' + AND COLUMN_NAME IN ('activity_time', 'reject_reason') +ORDER BY ORDINAL_POSITION; + + +-- ############################################################################ +-- 4. yxe_visit_report —— 跑店填报建表 +-- ############################################################################ +-- 用途:新增 yxe_visit_report 表(跑店填报) +-- 背景:甲方要求把「自主填报」拆成「驻店填报 / 跑店填报」两种类型: +-- 1) 原自主填报页改为「驻店填报」,数据仍存 yxe_self_report,不动; +-- 2) 新增「跑店填报」,填报内容为「巡店列表(多门店,每条含门店/定位/打卡照片) +-- + 活动小结」。 +-- 巡店列表是「一次填报多家门店」的数组结构,yxe_self_report 既没有多门店 +-- 字段,也没有区分驻店/跑店类型的字段;本次选择新建独立表,避免污染既有 +-- 历史数据与既有审核/导出逻辑。 +-- 影响:新建空表,0 行业务数据;不改动 yxe_self_report 任何结构。 +-- 性质:幂等(CREATE TABLE IF NOT EXISTS)。 +-- 配套代码: +-- yxe-java YxeVisitReport.java / YxeVisitReportParam.java / YxeVisitReportMapper.java +-- / YxeVisitReportMapper.xml / YxeVisitReportService(+Impl) +-- / YxeVisitReportController.java +-- yxe-mp packageUser/self-report/select.vue(选择填报类型) +-- packageUser/self-report/visit.vue(跑店填报) +-- packageUser/self-report/records.vue(填报记录加类型切换) +-- pages/audit/index.vue(药审核加跑店填报类型) +-- yxe-admin src/api/yxe/yxeVisitReport/*、src/views/yxe/yxeSelfReport/*(类型筛选与跑店详情) + +-- 执行前核对(应为 0,即表不存在) +SELECT COUNT(*) AS table_exists +FROM information_schema.TABLES +WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'yxe_visit_report'; + +-- 变更:建表(已存在则跳过) +CREATE TABLE IF NOT EXISTS `yxe_visit_report` ( + `id` int NOT NULL AUTO_INCREMENT, + `user_id` int DEFAULT NULL COMMENT '提交人ID', + `store_count` int DEFAULT 0 COMMENT '巡店门店数', + `store_list` longtext COMMENT '巡店列表JSON(门店/定位/打卡照片)', + `image` longtext COMMENT '全部图片集合', + `summary` longtext COMMENT '活动小结', + `reward` decimal(10,2) DEFAULT NULL COMMENT '奖金金额(审核时填写)', + `lat` varchar(64) DEFAULT NULL COMMENT '纬度(整单,取首条门店)', + `lng` varchar(64) DEFAULT NULL COMMENT '经度(整单,取首条门店)', + `location` varchar(500) DEFAULT NULL COMMENT '定位地址(整单,取首条门店)', + `sort_number` int DEFAULT 0 COMMENT '排序', + `comments` varchar(500) DEFAULT NULL COMMENT '备注', + `status` tinyint DEFAULT 0 COMMENT '状态:0待审核,1通过,2拒绝', + `reject_reason` varchar(500) DEFAULT NULL COMMENT '驳回原因', + `deleted` tinyint DEFAULT 0 COMMENT '逻辑删除', + `tenant_id` int DEFAULT 10325 COMMENT '租户ID', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_yxe_visit_report_user_id` (`user_id`), + KEY `idx_yxe_visit_report_status` (`status`), + KEY `idx_yxe_visit_report_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='跑店填报'; + +-- 执行后核对(应返回 18 行,且列/注释符合预期) +SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_COMMENT, ORDINAL_POSITION +FROM information_schema.COLUMNS +WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'yxe_visit_report' +ORDER BY ORDINAL_POSITION; + + +-- ############################################################################ +-- 5. yxe_visit_list —— 新增客户拜访表单字段 +-- ############################################################################ +-- 用途:yxe_visit_list 表新增客户拜访表单字段(拜访对象类型、拜访日期、提交人姓名) +-- 背景:小程序 pages/visit/index 按「客户拜访」新原型重构为多卡片表单: +-- 1) 新增「拜访对象 - 类型」(地点 / 门店经理 / 其他); +-- 2) 新增「拜访信息 - 拜访日期」,默认当天; +-- 3) 新增「我的信息 - 姓名」,进页面自动带出账号 real_name,仍允许修改, +-- 因此与 sys_user.real_name 可能不一致,需要独立字段留痕。 +-- 三项均为本次新增,历史记录该字段为空(前端展示为 "-")。 +-- 影响:ALTER 语句本身 0 行;已有历史数据新增列为 NULL,不做回填。 +-- 性质:幂等(通过 information_schema 判断列是否存在后再 ADD)。 +-- 配套代码: +-- yxe-java YxeVisitList.java / YxeVisitListParam.java / YxeVisitListMapper.xml +-- / YxeVisitListController.java(导出表头) +-- yxe-mp pages/visit/index.vue +-- yxe-admin src/api/yxe/yxeVisitList/model、列表列、详情、编辑弹窗 +-- 备注:本列注释在源码中已由「门店/门店经理/其他」改为「地点/门店经理/其他」。 +-- 对**已存在该列**的库(列已建、注释仍是旧值),本节按幂等设计跳过, +-- 不会修正注释;如需同步注释,另行执行: +-- ALTER TABLE `yxe_visit_list` MODIFY COLUMN `visit_type` varchar(16) +-- DEFAULT NULL COMMENT '拜访对象类型: 地点/门店经理/其他'; +-- 新库建列时直接用下面语句,注释即为新值。 + +-- 执行前核对(应为 0 行,即三列均不存在) +SELECT COLUMN_NAME +FROM information_schema.COLUMNS +WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'yxe_visit_list' + AND COLUMN_NAME IN ('visit_type', 'visit_date', 'submitter_name'); + +-- 变更:按列分别判断,已存在则跳过 +SET @db := DATABASE(); + +SET @sql := IF( + (SELECT COUNT(*) FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'yxe_visit_list' AND COLUMN_NAME = 'visit_type') = 0, + 'ALTER TABLE `yxe_visit_list` ADD COLUMN `visit_type` varchar(16) DEFAULT NULL COMMENT ''拜访对象类型: 地点/门店经理/其他'' AFTER `name`', + 'SELECT ''visit_type already exists'' AS skipped' +); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +SET @sql := IF( + (SELECT COUNT(*) FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'yxe_visit_list' AND COLUMN_NAME = 'visit_date') = 0, + 'ALTER TABLE `yxe_visit_list` ADD COLUMN `visit_date` varchar(32) DEFAULT NULL COMMENT ''拜访日期'' AFTER `visit_type`', + 'SELECT ''visit_date already exists'' AS skipped' +); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +SET @sql := IF( + (SELECT COUNT(*) FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'yxe_visit_list' AND COLUMN_NAME = 'submitter_name') = 0, + 'ALTER TABLE `yxe_visit_list` ADD COLUMN `submitter_name` varchar(64) DEFAULT NULL COMMENT ''提交人姓名(拜访人自填)'' AFTER `visit_date`', + 'SELECT ''submitter_name already exists'' AS skipped' +); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +-- 执行后核对(应为 3 行,且类型/注释符合预期) +SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_COMMENT, ORDINAL_POSITION +FROM information_schema.COLUMNS +WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'yxe_visit_list' + AND COLUMN_NAME IN ('visit_type', 'visit_date', 'submitter_name') +ORDER BY ORDINAL_POSITION; + + +-- ############################################################################ +-- 6. yxe_user_task —— 新增 income(任务收入) +-- ############################################################################ +-- 用途:用户任务新增「任务收入」 +-- 背景:任务完成后的收入需要单独留存,便于业绩统计与提成核算。 +-- 影响:ALTER 本身 0 行;存量数据该列为 NULL,不做回填。 +-- 性质:幂等(information_schema 判断列是否存在后 ADD)。 +-- 配套代码:YxeUserTask.income、yxe-mp pages/bonus/index。 + +-- 执行前核对(应为 0,即列不存在) +SELECT COUNT(*) AS col_exists +FROM information_schema.COLUMNS +WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'yxe_user_task' + AND COLUMN_NAME = 'income'; + +SET @db := DATABASE(); + +SET @sql := IF( + (SELECT COUNT(*) FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'yxe_user_task' AND COLUMN_NAME = 'income') = 0, + 'ALTER TABLE `yxe_user_task` ADD COLUMN `income` decimal(10, 2) NULL DEFAULT NULL COMMENT ''任务收入'' AFTER `chain`', + 'SELECT ''yxe_user_task.income already exists'' AS skipped' +); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +-- 执行后核对(应为 1 行) +SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_COMMENT, ORDINAL_POSITION +FROM information_schema.COLUMNS +WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'yxe_user_task' + AND COLUMN_NAME = 'income'; + + +-- ############################################################################ +-- 7. sys_user —— 新增 user_group(用户分组) +-- ############################################################################ +-- 用途:系统用户新增「用户分组」 +-- 背景:审核与导出需要按用户分组筛选(yxe_self_report / yxe_visit_report 的 +-- userGroup 查询条件即走本列)。 +-- 影响:ALTER 本身 0 行;存量用户该列为 NULL。 +-- 性质:幂等(information_schema 判断列是否存在后 ADD)。 +-- 配套代码:YxeSelfReportMapper.xml / YxeVisitReportMapper.xml 的 userGroup 条件、 +-- yxe-admin 自主填报列表「用户分组」筛选项。 + +-- 执行前核对(应为 0,即列不存在) +SELECT COUNT(*) AS col_exists +FROM information_schema.COLUMNS +WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'sys_user' + AND COLUMN_NAME = 'user_group'; + +SET @db := DATABASE(); + +SET @sql := IF( + (SELECT COUNT(*) FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'sys_user' AND COLUMN_NAME = 'user_group') = 0, + 'ALTER TABLE sys_user ADD COLUMN user_group VARCHAR(50) NULL COMMENT ''用户分组'' AFTER user_level', + 'SELECT ''sys_user.user_group already exists'' AS skipped' +); +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +-- 执行后核对(应为 1 行) +SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_COMMENT, ORDINAL_POSITION +FROM information_schema.COLUMNS +WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'sys_user' + AND COLUMN_NAME = 'user_group'; + + +-- ############################################################################ +-- 8. 其余建表:慢病产品 / 运输保养 / 运输维修 +-- ############################################################################ + +-- === 8.1 yxe_chronic_disease_product —— 慢病产品管理 ========================= +-- 用途:慢病产品基础资料(连锁 / 产品名 / 规格粒数 / 每日用量 / 每盒天数等) +-- 影响:新库建表 0 行。 +-- 性质:幂等(CREATE TABLE IF NOT EXISTS)。 +CREATE TABLE IF NOT EXISTS `yxe_chronic_disease_product` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `chain` varchar(100) NOT NULL COMMENT '连锁', + `product_name` varchar(100) NOT NULL COMMENT '产品名', + `spec_count` decimal(10,2) NOT NULL COMMENT '规格粒/片', + `daily_usage_count` decimal(10,2) NOT NULL COMMENT '说明书每天使用/次', + `dosage_per_time` decimal(10,2) NOT NULL COMMENT '每次几粒/片', + `box_usage_days` decimal(10,2) DEFAULT NULL COMMENT '1盒服用几天', + `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态, 0禁用, 1启用', + `deleted` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除, 0否, 1是', + `tenant_id` int DEFAULT NULL COMMENT '租户id', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + KEY `idx_ycdp_product_name` (`product_name`), + KEY `idx_ycdp_chain` (`chain`), + KEY `idx_ycdp_deleted` (`deleted`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='慢病产品管理'; + +-- === 8.2 transport_maintenance_plan —— 保养记录 ============================ +-- 用途:车辆/船舶保养记录 +-- 影响:新库建表 0 行。 +-- 性质:幂等(CREATE TABLE IF NOT EXISTS)。 +CREATE TABLE IF NOT EXISTS `transport_maintenance_plan` ( + `maintenance_plan_id` int NOT NULL AUTO_INCREMENT COMMENT '保养记录ID', + `vehicle_type` varchar(10) NOT NULL COMMENT '车船类型: 车辆, 船舶', + `vehicle_no` varchar(30) NOT NULL COMMENT '车牌号/船号', + `maintainer` varchar(20) DEFAULT NULL COMMENT '保养人', + `maintenance_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '保养时间', + `mileage` decimal(12,2) DEFAULT NULL COMMENT '里程/航程数', + `mileage_unit` varchar(10) DEFAULT NULL COMMENT '里程/航程单位: 公里, 海里', + `maintenance_item` varchar(100) DEFAULT NULL COMMENT '保养项目', + `cost` decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '费用', + `store_name` varchar(50) DEFAULT NULL COMMENT '店名', + `contact_phone` varchar(20) DEFAULT NULL COMMENT '联系电话', + `address` varchar(100) DEFAULT NULL COMMENT '地址', + `next_maintenance_time` datetime DEFAULT NULL COMMENT '下次保养时间', + `next_maintenance_mileage` decimal(12,2) DEFAULT NULL COMMENT '下次保养里程/航程', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `attachments` longtext COMMENT '附件, JSON或逗号分隔文件地址', + `sort_number` int NOT NULL DEFAULT 0 COMMENT '排序(数字越小越靠前)', + `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态, 0正常, 1禁用', + `deleted` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除, 0否, 1是', + `user_id` int DEFAULT NULL COMMENT '创建人ID', + `organization_id` int DEFAULT NULL COMMENT '组织ID', + `tenant_id` int DEFAULT 10325 COMMENT '租户ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`maintenance_plan_id`), + KEY `idx_tmp_vehicle_type` (`vehicle_type`), + KEY `idx_tmp_vehicle_no` (`vehicle_no`), + KEY `idx_tmp_maintenance_time` (`maintenance_time`), + KEY `idx_tmp_next_maintenance_time` (`next_maintenance_time`), + KEY `idx_tmp_organization_id` (`organization_id`), + KEY `idx_tmp_tenant_id` (`tenant_id`), + KEY `idx_tmp_deleted` (`deleted`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='保养记录'; + +-- === 8.3 transport_maintenance_record —— 维修记录 ========================== +-- 用途:车辆/船舶维修记录 +-- 影响:新库建表 0 行。 +-- 性质:幂等(CREATE TABLE IF NOT EXISTS)。 +CREATE TABLE IF NOT EXISTS `transport_maintenance_record` ( + `maintenance_record_id` int NOT NULL AUTO_INCREMENT COMMENT '维修记录ID', + `vehicle_type` varchar(10) NOT NULL COMMENT '车船类型: 车辆, 船舶', + `vehicle_no` varchar(30) NOT NULL COMMENT '车牌号/船号', + `maintainer` varchar(20) DEFAULT NULL COMMENT '维修人', + `maintenance_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '维修时间', + `location` varchar(100) DEFAULT NULL COMMENT '维修位置', + `replaced_part` varchar(200) DEFAULT NULL COMMENT '更换零件', + `cost` decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '费用', + `company` varchar(50) DEFAULT NULL COMMENT '维修单位', + `contact` varchar(20) DEFAULT NULL COMMENT '联系方式', + `address` varchar(100) DEFAULT NULL COMMENT '地址', + `factory_time` datetime DEFAULT NULL COMMENT '出厂时间', + `mileage` decimal(12,2) DEFAULT NULL COMMENT '里程/航程数', + `mileage_unit` varchar(10) DEFAULT NULL COMMENT '里程/航程单位: 公里, 海里', + `remark` varchar(500) DEFAULT NULL COMMENT '备注', + `attachments` longtext COMMENT '附件, JSON或逗号分隔文件地址', + `sort_number` int NOT NULL DEFAULT 0 COMMENT '排序(数字越小越靠前)', + `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态, 0正常, 1禁用', + `deleted` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除, 0否, 1是', + `user_id` int DEFAULT NULL COMMENT '创建人ID', + `organization_id` int DEFAULT NULL COMMENT '组织ID', + `tenant_id` int DEFAULT 10325 COMMENT '租户ID', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`maintenance_record_id`), + KEY `idx_tmr_vehicle_type` (`vehicle_type`), + KEY `idx_tmr_vehicle_no` (`vehicle_no`), + KEY `idx_tmr_maintenance_time` (`maintenance_time`), + KEY `idx_tmr_factory_time` (`factory_time`), + KEY `idx_tmr_organization_id` (`organization_id`), + KEY `idx_tmr_tenant_id` (`tenant_id`), + KEY `idx_tmr_deleted` (`deleted`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='维修记录'; + +-- 执行后核对(三张表应各返回 1 行) +SELECT TABLE_NAME, TABLE_COMMENT +FROM information_schema.TABLES +WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME IN ('yxe_chronic_disease_product', + 'transport_maintenance_plan', + 'transport_maintenance_record') +ORDER BY TABLE_NAME; + + +-- ############################################################################ +-- 9. 数据修正:yxe_self_report.chain_id 残留位置型占位符 +-- ############################################################################ +-- 用途:修正 yxe_self_report.chain_id 中残留的位置型占位符(chain_0、chain_3、chain_6 …) +-- 背景:前端 normalizeMerchantChain 在接口未返回 chainId 时会回退成 `chain_${index}`, +-- 该值经审核端 saveMerchantEdit 写入 chain_id 落库。而按连锁筛选走的是等值匹配 +-- (YxeSelfReportMapper.xml: a.chain_id = #{param.chainId}),占位符导致这些记录 +-- 在按连锁筛选时被永久漏掉。本系统没有连锁表,chain 名称即事实上的连锁标识 +-- (连锁字典 sys_dict_data.dict_id=175 的 dict_data_code 同样是连锁名)。 +-- 影响:本次实际 5 行(chain_6 -> 老百姓 3 行;chain_3 -> 百姓人家 2 行)。 +-- 可重复执行:修正后不再匹配 WHERE 条件,无副作用。 +-- 性质:幂等(以 chain_name 为准回填 chain_id,限定 REGEXP 占位符)。 +-- 配套代码:MerchantServiceImpl.groupByChain 返回稳定 chainId; +-- AuditSelfReportItem.vue 兜底链改用连锁名并在写入前拦截 chain_ 前缀。 + +-- 执行前核对(本地库曾为 5 行;执行后应为 0 行) +SELECT id, chain_id, chain_name +FROM yxe_self_report +WHERE chain_id REGEXP '^chain_[0-9]+$' +ORDER BY id; + +-- 修正 +UPDATE yxe_self_report +SET chain_id = chain_name +WHERE chain_id REGEXP '^chain_[0-9]+$' + AND chain_name IS NOT NULL + AND chain_name <> ''; + +-- 执行后核对(remaining_placeholder 与 mismatch 均应为 0) +SELECT SUM(chain_id REGEXP '^chain_[0-9]+$') AS remaining_placeholder, + SUM(chain_id <> chain_name) AS mismatch, + COUNT(*) AS total +FROM yxe_self_report; + + +-- ############################################################################ +-- 10. 数据修正:yxe_task.reward 为 NULL 的历史脏数据 +-- ############################################################################ +-- 用途:把 yxe_task.reward 为 NULL 的历史脏数据规范化为 0,消除业绩统计接口的空指针隐患 +-- 背景:小程序 pages/performance/index 页面请求的 /yxe-user-task/userRank 与 /yxe-task/data +-- 同时返回 {"code":1,"message":"操作失败","error":"java.lang.NullPointerException"}, +-- 页面「我的完成进度/完成率」与人员排行榜全部空白。 +-- 根因:yxe_task.reward 为 NULL 的任务被计入完成数后执行 +-- BigDecimal.ZERO.add(task.getReward()) +-- → BigDecimal.add(null) 抛 NPE,整个接口失败。 +-- 本库命中数据为 yxe_task.id=663(title='测试手动',status=2 已完成, +-- 其 yxe_user_task.id=630 / user_id=875 的 status=2)。注意任务状态为 2 的只有这 1 条, +-- 但它足以让「全量排行榜」接口整体失败——userRank 不传 name 时遍历全部用户。 +-- 影响:1 行。 +-- 性质:幂等(重复执行时 WHERE 不再命中)。 +-- 配套代码: +-- 1) 读侧兜底:YxeTaskController#data、YxeUserTaskController#userRank +-- 对 reward 做 nullToZero,接口不再报错; +-- 2) 写侧堵源:YxeTaskController#save / #saveBatch 在新增时把缺失的 reward 兜底为 0, +-- 不再产生新的 NULL 脏数据。 +-- 注意 #update / #updateBatch **刻意不补默认值**:二者是部分更新语义 +-- (MyBatis-Plus 默认 NOT_NULL 策略),null 表示“本次不修改该字段”, +-- 若在那里兜底会把任务原有奖金静默清零,直接影响用户实得收益。 +-- 3) 回归测试:src/test/java/com/gxwebsoft/yxe/controller/TaskRewardNullSafetyTest.java +-- 说明:本脚本属于「历史数据规范化」。即使不执行,接口也已不再报错(读侧兜底), +-- 但金额会按 0 计;执行后数据本身也归于一致。 + +-- 执行前核对:先看清 NULL 分布在哪些任务、是否已有人完成任务 +SELECT t.id AS task_id, + t.title, + t.status AS task_status, + t.reward, + COUNT(ut.id) AS user_task_cnt, + SUM(ut.status = 2) AS completed_cnt +FROM yxe_task t +LEFT JOIN yxe_user_task ut ON ut.task_id = t.id +WHERE t.reward IS NULL +GROUP BY t.id, t.title, t.status, t.reward +ORDER BY t.id; + +-- 变更:仅规范化「已完成/进行中」且 reward 为 NULL 的任务,避免影响尚未开始的任务 +UPDATE yxe_task +SET reward = 0.00 +WHERE reward IS NULL + AND status IN (1, 2); + +-- 执行后核对(remaining_null 应为 0) +SELECT SUM(reward IS NULL) AS remaining_null, + SUM(reward IS NULL AND status IN (1, 2)) AS remaining_null_active, + COUNT(*) AS total +FROM yxe_task; + + +-- ============================================================================ +-- 执行记录 +-- ============================================================================ +-- 2026-10-11 本地开发库(127.0.0.1:3306/yaoxiaoer,root) +-- 第 1 节 yxe_self_report 建表 —— 表已存在,跳过 +-- 第 2 节 activity_time —— 列已存在,跳过 +-- 第 3 节 reject_reason —— 列已存在,跳过 +-- 第 4 节 yxe_visit_report 建表 —— 已执行(18 列,0 行业务数据) +-- 第 5 节 yxe_visit_list 三列 —— 三列均已存在(visit_type/visit_date/submitter_name) +-- 第 6 节 yxe_user_task.income —— 列已存在,跳过 +-- 第 7 节 sys_user.user_group —— 列已存在,跳过 +-- 第 8 节 三张建表 —— 三表均已存在,跳过 +-- 第 9 节 chain_id 占位符修正 —— 已执行:受影响 5 行; +-- 执行后 remaining_placeholder = 0,mismatch = 0 +-- 功能验证:按连锁筛选命中数 +-- chainId=老百姓 279 -> 282(找回 id 119、130、169) +-- chainId=百姓人家 174 -> 176(找回 id 138、139) +-- 第 10 节 yxe_task.reward 规范化 —— **尚未执行**:本地库仍有 +-- yxe_task.id=663(title='测试手动',status=2)reward 为 NULL。 +-- 接口已因读侧兜底不再报错,但金额按 0 计;如需数据一致请执行本节。 +-- +-- 生产库:尚未执行。需经确认后按本文件自上而下复核执行。 +-- +-- 备注(第 5 节):yxe_visit_list.visit_type 列的注释在本地库仍是旧值 +-- 「拜访对象类型: 门店/门店经理/其他」,与源码中的新值「地点/...」不一致。 +-- 因该列已存在,第 5 节按幂等设计跳过,不会修正注释;如需同步,见第 5 节备注。 +-- ============================================================================ diff --git a/sys_user_add_user_group.sql b/sys_user_add_user_group.sql deleted file mode 100644 index 823b7a8..0000000 --- a/sys_user_add_user_group.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE sys_user - ADD COLUMN user_group VARCHAR(50) NULL COMMENT '用户分组' AFTER user_level; diff --git a/transport_maintenance_plan.sql b/transport_maintenance_plan.sql deleted file mode 100644 index 0e54512..0000000 --- a/transport_maintenance_plan.sql +++ /dev/null @@ -1,34 +0,0 @@ -CREATE TABLE IF NOT EXISTS `transport_maintenance_plan` ( - `maintenance_plan_id` int NOT NULL AUTO_INCREMENT COMMENT '保养记录ID', - `vehicle_type` varchar(10) NOT NULL COMMENT '车船类型: 车辆, 船舶', - `vehicle_no` varchar(30) NOT NULL COMMENT '车牌号/船号', - `maintainer` varchar(20) DEFAULT NULL COMMENT '保养人', - `maintenance_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '保养时间', - `mileage` decimal(12,2) DEFAULT NULL COMMENT '里程/航程数', - `mileage_unit` varchar(10) DEFAULT NULL COMMENT '里程/航程单位: 公里, 海里', - `maintenance_item` varchar(100) DEFAULT NULL COMMENT '保养项目', - `cost` decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '费用', - `store_name` varchar(50) DEFAULT NULL COMMENT '店名', - `contact_phone` varchar(20) DEFAULT NULL COMMENT '联系电话', - `address` varchar(100) DEFAULT NULL COMMENT '地址', - `next_maintenance_time` datetime DEFAULT NULL COMMENT '下次保养时间', - `next_maintenance_mileage` decimal(12,2) DEFAULT NULL COMMENT '下次保养里程/航程', - `remark` varchar(500) DEFAULT NULL COMMENT '备注', - `attachments` longtext COMMENT '附件, JSON或逗号分隔文件地址', - `sort_number` int NOT NULL DEFAULT 0 COMMENT '排序(数字越小越靠前)', - `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态, 0正常, 1禁用', - `deleted` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除, 0否, 1是', - `user_id` int DEFAULT NULL COMMENT '创建人ID', - `organization_id` int DEFAULT NULL COMMENT '组织ID', - `tenant_id` int DEFAULT 10325 COMMENT '租户ID', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`maintenance_plan_id`), - KEY `idx_tmp_vehicle_type` (`vehicle_type`), - KEY `idx_tmp_vehicle_no` (`vehicle_no`), - KEY `idx_tmp_maintenance_time` (`maintenance_time`), - KEY `idx_tmp_next_maintenance_time` (`next_maintenance_time`), - KEY `idx_tmp_organization_id` (`organization_id`), - KEY `idx_tmp_tenant_id` (`tenant_id`), - KEY `idx_tmp_deleted` (`deleted`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='保养记录'; diff --git a/transport_maintenance_record.sql b/transport_maintenance_record.sql deleted file mode 100644 index 3d833d8..0000000 --- a/transport_maintenance_record.sql +++ /dev/null @@ -1,34 +0,0 @@ -CREATE TABLE IF NOT EXISTS `transport_maintenance_record` ( - `maintenance_record_id` int NOT NULL AUTO_INCREMENT COMMENT '维修记录ID', - `vehicle_type` varchar(10) NOT NULL COMMENT '车船类型: 车辆, 船舶', - `vehicle_no` varchar(30) NOT NULL COMMENT '车牌号/船号', - `maintainer` varchar(20) DEFAULT NULL COMMENT '维修人', - `maintenance_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '维修时间', - `location` varchar(100) DEFAULT NULL COMMENT '维修位置', - `replaced_part` varchar(200) DEFAULT NULL COMMENT '更换零件', - `cost` decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '费用', - `company` varchar(50) DEFAULT NULL COMMENT '维修单位', - `contact` varchar(20) DEFAULT NULL COMMENT '联系方式', - `address` varchar(100) DEFAULT NULL COMMENT '地址', - `factory_time` datetime DEFAULT NULL COMMENT '出厂时间', - `mileage` decimal(12,2) DEFAULT NULL COMMENT '里程/航程数', - `mileage_unit` varchar(10) DEFAULT NULL COMMENT '里程/航程单位: 公里, 海里', - `remark` varchar(500) DEFAULT NULL COMMENT '备注', - `attachments` longtext COMMENT '附件, JSON或逗号分隔文件地址', - `sort_number` int NOT NULL DEFAULT 0 COMMENT '排序(数字越小越靠前)', - `status` tinyint NOT NULL DEFAULT 0 COMMENT '状态, 0正常, 1禁用', - `deleted` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除, 0否, 1是', - `user_id` int DEFAULT NULL COMMENT '创建人ID', - `organization_id` int DEFAULT NULL COMMENT '组织ID', - `tenant_id` int DEFAULT 10325 COMMENT '租户ID', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`maintenance_record_id`), - KEY `idx_tmr_vehicle_type` (`vehicle_type`), - KEY `idx_tmr_vehicle_no` (`vehicle_no`), - KEY `idx_tmr_maintenance_time` (`maintenance_time`), - KEY `idx_tmr_factory_time` (`factory_time`), - KEY `idx_tmr_organization_id` (`organization_id`), - KEY `idx_tmr_tenant_id` (`tenant_id`), - KEY `idx_tmr_deleted` (`deleted`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='维修记录'; diff --git a/yxe_chronic_disease_product.sql b/yxe_chronic_disease_product.sql deleted file mode 100644 index 9b6bbd4..0000000 --- a/yxe_chronic_disease_product.sql +++ /dev/null @@ -1,18 +0,0 @@ -CREATE TABLE IF NOT EXISTS `yxe_chronic_disease_product` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', - `chain` varchar(100) NOT NULL COMMENT '连锁', - `product_name` varchar(100) NOT NULL COMMENT '产品名', - `spec_count` decimal(10,2) NOT NULL COMMENT '规格粒/片', - `daily_usage_count` decimal(10,2) NOT NULL COMMENT '说明书每天使用/次', - `dosage_per_time` decimal(10,2) NOT NULL COMMENT '每次几粒/片', - `box_usage_days` decimal(10,2) DEFAULT NULL COMMENT '1盒服用几天', - `status` tinyint NOT NULL DEFAULT 1 COMMENT '状态, 0禁用, 1启用', - `deleted` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除, 0否, 1是', - `tenant_id` int DEFAULT NULL COMMENT '租户id', - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', - PRIMARY KEY (`id`), - KEY `idx_ycdp_product_name` (`product_name`), - KEY `idx_ycdp_chain` (`chain`), - KEY `idx_ycdp_deleted` (`deleted`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='慢病产品管理'; diff --git a/yxe_self_report.sql b/yxe_self_report.sql deleted file mode 100644 index c6cd5ca..0000000 --- a/yxe_self_report.sql +++ /dev/null @@ -1,34 +0,0 @@ -CREATE TABLE IF NOT EXISTS `yxe_self_report` ( - `id` int NOT NULL AUTO_INCREMENT, - `user_id` int DEFAULT NULL COMMENT '提交人ID', - `merchant_id` int DEFAULT NULL COMMENT '门店ID', - `merchant_name` varchar(255) DEFAULT NULL COMMENT '门店名称', - `chain_id` varchar(64) DEFAULT NULL COMMENT '连锁ID', - `chain_name` varchar(255) DEFAULT NULL COMMENT '连锁名称', - `date` varchar(32) DEFAULT NULL COMMENT '填报日期', - `activity_time` varchar(32) DEFAULT NULL COMMENT '活动时间', - `reward` decimal(10,2) DEFAULT NULL COMMENT '奖金金额', - `image` longtext COMMENT '全部图片集合', - `clock_photos` longtext COMMENT '上下班打卡图', - `booth_photos` longtext COMMENT '门头摆台照', - `sales_groups` longtext COMMENT '销量填写JSON', - `receipt_photo` longtext COMMENT '小票图', - `summary` longtext COMMENT '活动小结', - `rating` varchar(32) DEFAULT NULL COMMENT '门店评分', - `lat` varchar(64) DEFAULT NULL COMMENT '纬度', - `lng` varchar(64) DEFAULT NULL COMMENT '经度', - `location` varchar(500) DEFAULT NULL COMMENT '定位地址', - `sort_number` int DEFAULT 0 COMMENT '排序', - `comments` varchar(500) DEFAULT NULL COMMENT '备注', - `status` tinyint DEFAULT 0 COMMENT '状态:0待审核,1通过,2拒绝', - `reject_reason` varchar(500) DEFAULT NULL COMMENT '驳回原因', - `deleted` tinyint DEFAULT 0 COMMENT '逻辑删除', - `tenant_id` int DEFAULT 10325 COMMENT '租户ID', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`), - KEY `idx_yxe_self_report_user_id` (`user_id`), - KEY `idx_yxe_self_report_merchant_id` (`merchant_id`), - KEY `idx_yxe_self_report_status` (`status`), - KEY `idx_yxe_self_report_create_time` (`create_time`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='自主填报'; diff --git a/yxe_self_report_add_activity_time.sql b/yxe_self_report_add_activity_time.sql deleted file mode 100644 index 141c703..0000000 --- a/yxe_self_report_add_activity_time.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE `yxe_self_report` - ADD COLUMN `activity_time` varchar(32) DEFAULT NULL COMMENT '活动时间' AFTER `date`; diff --git a/yxe_self_report_add_reject_reason.sql b/yxe_self_report_add_reject_reason.sql deleted file mode 100644 index c7ee6c9..0000000 --- a/yxe_self_report_add_reject_reason.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE `yxe_self_report` - ADD COLUMN `reject_reason` varchar(500) DEFAULT NULL COMMENT '驳回原因' AFTER `status`; diff --git a/yxe_user_task_add_income.sql b/yxe_user_task_add_income.sql deleted file mode 100644 index b8feaee..0000000 --- a/yxe_user_task_add_income.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE `yxe_user_task` - ADD COLUMN `income` decimal(10, 2) NULL DEFAULT NULL COMMENT '任务收入' AFTER `chain`; diff --git a/yxe_visit_list_add_visit_form_fields_2026-10-11.sql b/yxe_visit_list_add_visit_form_fields_2026-10-11.sql deleted file mode 100644 index 44d1ba3..0000000 --- a/yxe_visit_list_add_visit_form_fields_2026-10-11.sql +++ /dev/null @@ -1,63 +0,0 @@ --- 用途:yxe_visit_list 表新增客户拜访表单字段(拜访对象类型、拜访日期、提交人姓名) --- 日期:2026-10-11 --- 背景:小程序 pages/visit/index 按「客户拜访」新原型重构为多卡片表单: --- 1) 新增「拜访对象 - 类型」(地点 / 门店经理 / 其他); --- 2) 新增「拜访信息 - 拜访日期」,默认当天; --- 3) 新增「我的信息 - 姓名」,进页面自动带出账号 real_name,仍允许修改, --- 因此与 sys_user.real_name 可能不一致,需要独立字段留痕。 --- 三项均为本次新增,历史记录该字段为空(前端展示为 "-")。 --- 影响:ALTER 语句本身 0 行;已有历史数据新增列为 NULL,不做回填。 --- 性质:幂等,可重复执行(通过 information_schema 判断列是否存在后再 ADD) --- 配套代码: --- yxe-java YxeVisitList.java / YxeVisitListParam.java / YxeVisitListMapper.xml --- / YxeVisitListController.java(导出表头) --- yxe-mp pages/visit/index.vue --- yxe-admin src/api/yxe/yxeVisitList/model、列表列、详情、编辑弹窗 - --- 执行前核对(应为 0 行,即三列均不存在) -SELECT COLUMN_NAME -FROM information_schema.COLUMNS -WHERE TABLE_SCHEMA = DATABASE() - AND TABLE_NAME = 'yxe_visit_list' - AND COLUMN_NAME IN ('visit_type', 'visit_date', 'submitter_name'); - --- 变更:按列分别判断,已存在则跳过 -SET @db := DATABASE(); - -SET @sql := IF( - (SELECT COUNT(*) FROM information_schema.COLUMNS - WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'yxe_visit_list' AND COLUMN_NAME = 'visit_type') = 0, - 'ALTER TABLE `yxe_visit_list` ADD COLUMN `visit_type` varchar(16) DEFAULT NULL COMMENT ''拜访对象类型: 地点/门店经理/其他'' AFTER `name`', - 'SELECT ''visit_type already exists'' AS skipped' -); -PREPARE stmt FROM @sql; -EXECUTE stmt; -DEALLOCATE PREPARE stmt; - -SET @sql := IF( - (SELECT COUNT(*) FROM information_schema.COLUMNS - WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'yxe_visit_list' AND COLUMN_NAME = 'visit_date') = 0, - 'ALTER TABLE `yxe_visit_list` ADD COLUMN `visit_date` varchar(32) DEFAULT NULL COMMENT ''拜访日期'' AFTER `visit_type`', - 'SELECT ''visit_date already exists'' AS skipped' -); -PREPARE stmt FROM @sql; -EXECUTE stmt; -DEALLOCATE PREPARE stmt; - -SET @sql := IF( - (SELECT COUNT(*) FROM information_schema.COLUMNS - WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'yxe_visit_list' AND COLUMN_NAME = 'submitter_name') = 0, - 'ALTER TABLE `yxe_visit_list` ADD COLUMN `submitter_name` varchar(64) DEFAULT NULL COMMENT ''提交人姓名(拜访人自填)'' AFTER `visit_date`', - 'SELECT ''submitter_name already exists'' AS skipped' -); -PREPARE stmt FROM @sql; -EXECUTE stmt; -DEALLOCATE PREPARE stmt; - --- 执行后核对(应为 3 行,且类型/注释符合预期) -SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_COMMENT, ORDINAL_POSITION -FROM information_schema.COLUMNS -WHERE TABLE_SCHEMA = DATABASE() - AND TABLE_NAME = 'yxe_visit_list' - AND COLUMN_NAME IN ('visit_type', 'visit_date', 'submitter_name') -ORDER BY ORDINAL_POSITION; diff --git a/yxe_visit_report.sql b/yxe_visit_report.sql deleted file mode 100644 index 63fc986..0000000 --- a/yxe_visit_report.sql +++ /dev/null @@ -1,61 +0,0 @@ --- 用途:新增 yxe_visit_report 表(跑店填报) --- 日期:2026-10-11 --- 背景:甲方要求把「自主填报」拆成「驻店填报 / 跑店填报」两种类型: --- 1) 原自主填报页改为「驻店填报」,数据仍存 yxe_self_report,不动; --- 2) 新增「跑店填报」,填报内容为「巡店列表(多门店,每条含门店/定位/打卡照片)+ 活动小结」。 --- 巡店列表是「一次填报多家门店」的数组结构,yxe_self_report 既没有多门店字段, --- 也没有区分驻店/跑店类型的字段;本次选择新建独立表,避免污染既有 928 条历史数据 --- 与既有审核/导出逻辑。 --- 影响:新建空表,0 行业务数据;不改动 yxe_self_report 任何结构。 --- 性质:幂等,可重复执行(CREATE TABLE IF NOT EXISTS)。 --- 配套代码: --- yxe-java YxeVisitReport.java / YxeVisitReportParam.java / YxeVisitReportMapper.java --- / YxeVisitReportMapper.xml / YxeVisitReportService(+Impl) --- / YxeVisitReportController.java --- yxe-mp packageUser/self-report/select.vue(选择填报类型) --- packageUser/self-report/visit.vue(跑店填报) --- packageUser/self-report/records.vue(填报记录加类型切换) --- pages/audit/index.vue(药审核加跑店填报类型) --- yxe-admin src/api/yxe/yxeVisitReport/*、src/views/yxe/yxeSelfReport/*(类型筛选与跑店详情) - --- 执行前核对(应为 0,即表不存在) -SELECT COUNT(*) AS table_exists -FROM information_schema.TABLES -WHERE TABLE_SCHEMA = DATABASE() - AND TABLE_NAME = 'yxe_visit_report'; - --- 变更:建表(已存在则跳过) -CREATE TABLE IF NOT EXISTS `yxe_visit_report` ( - `id` int NOT NULL AUTO_INCREMENT, - `user_id` int DEFAULT NULL COMMENT '提交人ID', - `store_count` int DEFAULT 0 COMMENT '巡店门店数', - `store_list` longtext COMMENT '巡店列表JSON(门店/定位/打卡照片)', - `image` longtext COMMENT '全部图片集合', - `summary` longtext COMMENT '活动小结', - `reward` decimal(10,2) DEFAULT NULL COMMENT '奖金金额(审核时填写)', - `lat` varchar(64) DEFAULT NULL COMMENT '纬度(整单,取首条门店)', - `lng` varchar(64) DEFAULT NULL COMMENT '经度(整单,取首条门店)', - `location` varchar(500) DEFAULT NULL COMMENT '定位地址(整单,取首条门店)', - `sort_number` int DEFAULT 0 COMMENT '排序', - `comments` varchar(500) DEFAULT NULL COMMENT '备注', - `status` tinyint DEFAULT 0 COMMENT '状态:0待审核,1通过,2拒绝', - `reject_reason` varchar(500) DEFAULT NULL COMMENT '驳回原因', - `deleted` tinyint DEFAULT 0 COMMENT '逻辑删除', - `tenant_id` int DEFAULT 10325 COMMENT '租户ID', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`), - KEY `idx_yxe_visit_report_user_id` (`user_id`), - KEY `idx_yxe_visit_report_status` (`status`), - KEY `idx_yxe_visit_report_create_time` (`create_time`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='跑店填报'; - --- 执行后核对(应返回 1 行,且列/注释符合预期) -SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_COMMENT, ORDINAL_POSITION -FROM information_schema.COLUMNS -WHERE TABLE_SCHEMA = DATABASE() - AND TABLE_NAME = 'yxe_visit_report' -ORDER BY ORDINAL_POSITION; - --- 执行后核对(应为 0,跑店填报为新建功能,无历史数据) -SELECT COUNT(*) AS row_count FROM `yxe_visit_report`;