feat: 重构勘察业务为明细模式并新增定时任务人性化配置
- 重构勘察业务:移除SOP相关表,新增勘察明细表支持建筑/楼层/房间/照片管理 - 新增定时任务人性化频率配置,支持分钟/小时/天/周/月/自定义六种模式 - 新增频率预览接口,支持配置转换为cron表达式与执行时间预览 - 更新系统品牌名称为鑫潼智电,修改全局标题与登录页文案
This commit is contained in:
1 parent
f72644c24f
commit
22d27a940d
29 files changed
+1908
-576
No files matched your search
+24
-44
@@ -748,56 +748,36 @@ CREATE INDEX idx_survey_plan_start ON survey_order (plan_start);
|
||||
CREATE TRIGGER trg_survey_order_updated_at BEFORE UPDATE ON survey_order
|
||||
FOR EACH ROW EXECUTE FUNCTION trigger_set_updated_at();
|
||||
|
||||
-- 21.1 勘察 SOP 模板检查项表
|
||||
DROP TABLE IF EXISTS survey_sop_item CASCADE;
|
||||
CREATE TABLE survey_sop_item (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
template_code VARCHAR(64) NOT NULL DEFAULT 'standard_dist',
|
||||
sort_order INTEGER NOT NULL DEFAULT 0,
|
||||
item_name VARCHAR(128) NOT NULL,
|
||||
item_desc VARCHAR(255),
|
||||
receipt_type VARCHAR(16) NOT NULL DEFAULT 'photo',
|
||||
receipt_require VARCHAR(64),
|
||||
required BOOLEAN NOT NULL DEFAULT TRUE,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
COMMENT ON TABLE survey_sop_item IS '勘察 SOP 模板检查项表';
|
||||
COMMENT ON COLUMN survey_sop_item.id IS '自增主键';
|
||||
COMMENT ON COLUMN survey_sop_item.template_code IS 'SOP模板编码:standard_dist标准配电改造模板';
|
||||
COMMENT ON COLUMN survey_sop_item.sort_order IS '检查项序号';
|
||||
COMMENT ON COLUMN survey_sop_item.item_name IS '检查项名称';
|
||||
COMMENT ON COLUMN survey_sop_item.item_desc IS '检查项说明';
|
||||
COMMENT ON COLUMN survey_sop_item.receipt_type IS '回执形式:photo现场照片 form清单表单 meter测仪截图';
|
||||
COMMENT ON COLUMN survey_sop_item.receipt_require IS '回执指标要求,如「照片 ≥ 2 张」';
|
||||
COMMENT ON COLUMN survey_sop_item.required IS '是否必填';
|
||||
COMMENT ON COLUMN survey_sop_item.created_at IS '创建时间';
|
||||
CREATE UNIQUE INDEX uk_sop_template_order ON survey_sop_item (template_code, sort_order);
|
||||
|
||||
-- 21.2 勘察 SOP 工单回执表
|
||||
DROP TABLE IF EXISTS survey_sop_result CASCADE;
|
||||
CREATE TABLE survey_sop_result (
|
||||
-- 21.1 勘察工单明细表(建筑/楼层/房间 + 现场照片)
|
||||
DROP TABLE IF EXISTS survey_detail CASCADE;
|
||||
CREATE TABLE survey_detail (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
survey_order_id BIGINT NOT NULL REFERENCES survey_order(id) ON DELETE CASCADE,
|
||||
sop_item_id BIGINT NOT NULL REFERENCES survey_sop_item(id),
|
||||
checked BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
receipt_value VARCHAR(1024),
|
||||
building_id BIGINT,
|
||||
building_name VARCHAR(128),
|
||||
floor_no VARCHAR(16),
|
||||
room_id BIGINT,
|
||||
room_name VARCHAR(128),
|
||||
photos TEXT,
|
||||
remark VARCHAR(255),
|
||||
checked_at TIMESTAMPTZ,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
COMMENT ON TABLE survey_sop_result IS '勘察 SOP 工单回执表';
|
||||
COMMENT ON COLUMN survey_sop_result.id IS '自增主键';
|
||||
COMMENT ON COLUMN survey_sop_result.survey_order_id IS '勘察工单ID(→ survey_order)';
|
||||
COMMENT ON COLUMN survey_sop_result.sop_item_id IS 'SOP检查项ID(→ survey_sop_item)';
|
||||
COMMENT ON COLUMN survey_sop_result.checked IS '是否已完成回执';
|
||||
COMMENT ON COLUMN survey_sop_result.receipt_value IS '回执内容(照片对象key数组/表单值/截图key)';
|
||||
COMMENT ON COLUMN survey_sop_result.remark IS '回执备注';
|
||||
COMMENT ON COLUMN survey_sop_result.checked_at IS '回执时间';
|
||||
COMMENT ON COLUMN survey_sop_result.created_at IS '创建时间';
|
||||
COMMENT ON COLUMN survey_sop_result.updated_at IS '更新时间';
|
||||
CREATE UNIQUE INDEX uk_sop_result_order_item ON survey_sop_result (survey_order_id, sop_item_id);
|
||||
CREATE INDEX idx_sop_result_order ON survey_sop_result (survey_order_id);
|
||||
COMMENT ON TABLE survey_detail IS '勘察工单明细表(建筑/楼层/房间 + 现场照片)';
|
||||
COMMENT ON COLUMN survey_detail.id IS '自增主键';
|
||||
COMMENT ON COLUMN survey_detail.survey_order_id IS '勘察工单ID(→ survey_order)';
|
||||
COMMENT ON COLUMN survey_detail.building_id IS '建筑ID(→ customer_building)';
|
||||
COMMENT ON COLUMN survey_detail.building_name IS '建筑名称(冗余,客户拓扑变更后仍可读)';
|
||||
COMMENT ON COLUMN survey_detail.floor_no IS '所在楼层:正数为地上、负数为地下,如 1 / -1';
|
||||
COMMENT ON COLUMN survey_detail.room_id IS '房间ID(→ customer_room,可空)';
|
||||
COMMENT ON COLUMN survey_detail.room_name IS '房间名称(冗余,可空)';
|
||||
COMMENT ON COLUMN survey_detail.photos IS '现场照片对象key(JSON数组字符串)';
|
||||
COMMENT ON COLUMN survey_detail.remark IS '备注';
|
||||
COMMENT ON COLUMN survey_detail.created_at IS '创建时间';
|
||||
COMMENT ON COLUMN survey_detail.updated_at IS '更新时间';
|
||||
CREATE INDEX idx_survey_detail_order ON survey_detail (survey_order_id);
|
||||
CREATE TRIGGER trg_survey_detail_updated_at BEFORE UPDATE ON survey_detail
|
||||
FOR EACH ROW EXECUTE FUNCTION trigger_set_updated_at();
|
||||
|
||||
-- 22. 安装派单表
|
||||
DROP TABLE IF EXISTS install_order CASCADE;
|
||||
|
||||
@@ -333,10 +333,10 @@ SELECT setval('sys_menu_id_seq', 60, true);
|
||||
-- ------------------------------------------------------------
|
||||
-- 9. 定时任务种子(sys_job,按 job_key 幂等)
|
||||
-- ------------------------------------------------------------
|
||||
INSERT INTO sys_job (job_key, job_name, cron_expression, params, retry_times, retry_interval, status, remark) VALUES
|
||||
('demo_heartbeat', '示例心跳', '*/5 * * * *', '{"message":"heartbeat"}'::jsonb, 0, 60, 1,
|
||||
INSERT INTO sys_job (job_key, job_name, cron_expression, freq_type, freq_config, params, retry_times, retry_interval, status, remark) VALUES
|
||||
('demo_heartbeat', '示例心跳', '*/5 * * * *', 'minute', '{"interval":5}'::jsonb, '{"message":"heartbeat"}'::jsonb, 0, 60, 1,
|
||||
'示例心跳任务:用于验证调度链路,默认每 5 分钟写入一条 info 日志'),
|
||||
('log_clean', '日志清理', '0 3 * * *', '{"keepDays":90}'::jsonb, 2, 60, 1,
|
||||
('log_clean', '日志清理', '0 3 * * *', 'day', '{"times":["03:00"]}'::jsonb, '{"keepDays":90}'::jsonb, 2, 60, 1,
|
||||
'日志清理任务:每日 03:00 清理早于 keepDays 天的操作日志与任务日志,默认保留 90 天')
|
||||
ON CONFLICT (job_key) DO NOTHING;
|
||||
|
||||
@@ -370,8 +370,8 @@ SELECT setval('sys_menu_id_seq', 57, true);
|
||||
-- ------------------------------------------------------------
|
||||
-- 10. 通知规则扫描任务种子(sys_job,按 job_key 幂等)
|
||||
-- ------------------------------------------------------------
|
||||
INSERT INTO sys_job (job_key, job_name, cron_expression, params, retry_times, retry_interval, status, remark) VALUES
|
||||
('notice_scan', '通知规则扫描', '0 0 8 * * *', '{}'::jsonb, 1, 300, 1,
|
||||
INSERT INTO sys_job (job_key, job_name, cron_expression, freq_type, freq_config, params, retry_times, retry_interval, status, remark) VALUES
|
||||
('notice_scan', '通知规则扫描', '0 8 * * *', 'day', '{"times":["08:00"]}'::jsonb, '{}'::jsonb, 1, 300, 1,
|
||||
'遍历启用的扫描式通知规则,按模板与接收对象生成站内通知(幂等,默认每日 08:00)')
|
||||
ON CONFLICT (job_key) DO NOTHING;
|
||||
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
-- 定时任务人性化频率配置
|
||||
-- 背景:定时任务配置目前只有裸 cron 输入框,不直观。本次为 sys_job 增加
|
||||
-- freq_type / freq_config 结构化字段,cron_expression 仍作为调度唯一真值,
|
||||
-- freq_type / freq_config 仅用于配置界面回填与展示(不参与调度判断)。
|
||||
-- 幂等:列用 ADD COLUMN IF NOT EXISTS;存量回填按 job_key 且仅在该行仍是默认值时更新。
|
||||
BEGIN;
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 1) sys_job 新增频率配置字段
|
||||
-- ------------------------------------------------------------
|
||||
ALTER TABLE sys_job
|
||||
ADD COLUMN IF NOT EXISTS freq_type VARCHAR(16) NOT NULL DEFAULT 'custom', -- 频率类型: minute/hour/day/week/month/custom
|
||||
ADD COLUMN IF NOT EXISTS freq_config JSONB NOT NULL DEFAULT '{}'::jsonb; -- 频率配置(人性化配置表单回填用)
|
||||
|
||||
COMMENT ON COLUMN sys_job.freq_type IS '频率类型: minute每N分钟 hour每N小时 day每天 week每周 month每月 custom自定义';
|
||||
COMMENT ON COLUMN sys_job.freq_config IS '频率配置(JSONB,仅用于配置界面回填与展示,不参与调度判断)';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 2) 存量任务回填
|
||||
-- 仅在仍是默认值(custom + 空配置)时更新,避免覆盖运维已在页面上的修改;
|
||||
-- 未命中的行保持 custom,配置界面会以「自定义」展示原 cron 表达式。
|
||||
-- ------------------------------------------------------------
|
||||
UPDATE sys_job
|
||||
SET freq_type = 'minute', freq_config = '{"interval":5}'::jsonb
|
||||
WHERE job_key = 'demo_heartbeat' AND freq_type = 'custom' AND freq_config = '{}'::jsonb
|
||||
AND cron_expression = '*/5 * * * *';
|
||||
|
||||
UPDATE sys_job
|
||||
SET freq_type = 'day', freq_config = '{"times":["03:00"]}'::jsonb
|
||||
WHERE job_key = 'log_clean' AND freq_type = 'custom' AND freq_config = '{}'::jsonb
|
||||
AND cron_expression IN ('0 3 * * *', '0 0 3 * * *');
|
||||
|
||||
UPDATE sys_job
|
||||
SET freq_type = 'day', freq_config = '{"times":["08:00"]}'::jsonb
|
||||
WHERE job_key = 'notice_scan' AND freq_type = 'custom' AND freq_config = '{}'::jsonb
|
||||
AND cron_expression IN ('0 8 * * *', '0 0 8 * * *');
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 3) cron 段数归一:notice_scan 原为 6 段带秒表达式,秒=0 时与 5 段等价,
|
||||
-- 统一为 5 段便于配置界面回填(行为不变,仍为每天 08:00)
|
||||
-- ------------------------------------------------------------
|
||||
UPDATE sys_job
|
||||
SET cron_expression = '0 8 * * *'
|
||||
WHERE job_key = 'notice_scan' AND cron_expression = '0 0 8 * * *';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 4) 兜底:自定义类型的 freq_config 同步为当前表达式,保证配置界面可回填
|
||||
-- (应用侧每次保存都会同时写入两者,此处仅覆盖历史数据)
|
||||
-- ------------------------------------------------------------
|
||||
UPDATE sys_job
|
||||
SET freq_config = jsonb_build_object('expression', cron_expression)
|
||||
WHERE freq_type = 'custom';
|
||||
|
||||
COMMIT;
|
||||
@@ -0,0 +1,44 @@
|
||||
-- 勘察改造:移除 SOP(勘察技术要点与回执标准),新增「勘察明细」survey_detail
|
||||
-- 语义:勘察明细按「客户空间拓扑」登记,一条明细 = 建筑 + 楼层 + 房间(可空) + 现场照片 + 备注。
|
||||
-- 幂等:CREATE TABLE IF NOT EXISTS / DROP TABLE IF EXISTS / 触发器先 DROP 后建,可重复执行。
|
||||
BEGIN;
|
||||
|
||||
-- 1. 新增勘察明细表
|
||||
CREATE TABLE IF NOT EXISTS survey_detail (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
survey_order_id BIGINT NOT NULL REFERENCES survey_order(id) ON DELETE CASCADE,
|
||||
building_id BIGINT,
|
||||
building_name VARCHAR(128),
|
||||
floor_no VARCHAR(16),
|
||||
room_id BIGINT,
|
||||
room_name VARCHAR(128),
|
||||
photos TEXT,
|
||||
remark VARCHAR(255),
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
COMMENT ON TABLE survey_detail IS '勘察工单明细表(建筑/楼层/房间 + 现场照片)';
|
||||
COMMENT ON COLUMN survey_detail.id IS '自增主键';
|
||||
COMMENT ON COLUMN survey_detail.survey_order_id IS '勘察工单ID(→ survey_order)';
|
||||
COMMENT ON COLUMN survey_detail.building_id IS '建筑ID(→ customer_building)';
|
||||
COMMENT ON COLUMN survey_detail.building_name IS '建筑名称(冗余,客户拓扑变更后仍可读)';
|
||||
COMMENT ON COLUMN survey_detail.floor_no IS '所在楼层:正数为地上、负数为地下,如 1 / -1';
|
||||
COMMENT ON COLUMN survey_detail.room_id IS '房间ID(→ customer_room,可空)';
|
||||
COMMENT ON COLUMN survey_detail.room_name IS '房间名称(冗余,可空)';
|
||||
COMMENT ON COLUMN survey_detail.photos IS '现场照片对象key(JSON数组字符串)';
|
||||
COMMENT ON COLUMN survey_detail.remark IS '备注';
|
||||
COMMENT ON COLUMN survey_detail.created_at IS '创建时间';
|
||||
COMMENT ON COLUMN survey_detail.updated_at IS '更新时间';
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_survey_detail_order ON survey_detail (survey_order_id);
|
||||
|
||||
DROP TRIGGER IF EXISTS trg_survey_detail_updated_at ON survey_detail;
|
||||
CREATE TRIGGER trg_survey_detail_updated_at BEFORE UPDATE ON survey_detail
|
||||
FOR EACH ROW EXECUTE FUNCTION trigger_set_updated_at();
|
||||
|
||||
-- 2. 移除 SOP 两张表(回执表先删,避免外键依赖)
|
||||
DROP TABLE IF EXISTS survey_sop_result CASCADE;
|
||||
DROP TABLE IF EXISTS survey_sop_item CASCADE;
|
||||
|
||||
COMMIT;
|
||||
Reference in new issue
Block a user