feat: 新增现场勘察派单全流程业务能力

1.  新增共享电工管理模块:包含实体、DTO、控制器、服务以及前后端API
2.  重构勘察工单实体与查询逻辑,完善工单全状态流程与字段
3.  新增勘察SOP模板与工单回执业务体系
4.  更新数据库字典与初始化脚本,补充业务数据
5.  新增勘察派单增删改查、指派、复核、催办等全流程接口
6.  修复用户服务角色关联SQL生成问题
7.  新增勘察派单前后端完整交互链路
This commit is contained in:
andyesfly committed 2026-09-15 08:50:55 +08:00
1 parent 1c83e09fa1
commit 6b00f61550
21 files changed
+4739 -388

No files matched your search

+148 -29
View File
@@ -3,7 +3,7 @@
-- 基于《鑫潼智电系统需求分析报告 V1.0》+ 数据库设计文档
-- 数据库: PostgreSQL 15+
-- 字符集: UTF8
-- 表数量: 37 张(含 1 张按月分区表)
-- 表数量: 39 张(含 1 张按月分区表)
--
-- 用法:
-- 1. 先安装 pg_cron 扩展并配置 postgresql.conf(见文件末尾说明)
@@ -620,34 +620,143 @@ CREATE INDEX idx_lr_room ON line_room (room_id);
CREATE INDEX idx_lr_customer ON line_room (customer_id);
-- ============================================================
-- 六、派单域(4 张表)
-- 六、派单域(6 张表)
-- ============================================================
-- 21. 勘察派单表
DROP TABLE IF EXISTS survey_order CASCADE;
CREATE TABLE survey_order (
id BIGSERIAL PRIMARY KEY,
survey_no VARCHAR(64) NOT NULL UNIQUE,
customer_id BIGINT NOT NULL REFERENCES customer(id),
surveyor VARCHAR(64),
worker_id BIGINT,
survey_time TIMESTAMPTZ,
remark TEXT,
status SMALLINT NOT NULL DEFAULT 0,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
id BIGSERIAL PRIMARY KEY,
survey_no VARCHAR(64) NOT NULL UNIQUE,
customer_id BIGINT NOT NULL REFERENCES customer(id),
surveyor VARCHAR(64),
worker_id BIGINT,
survey_time TIMESTAMPTZ,
priority SMALLINT DEFAULT 3,
task_title VARCHAR(128),
site_location VARCHAR(255),
source VARCHAR(32) DEFAULT 'ledger',
loop_spec VARCHAR(128),
loop_count INTEGER,
progress_done INTEGER DEFAULT 0,
progress_total INTEGER,
drawing_count INTEGER DEFAULT 0,
salesman_id BIGINT,
tech_contact VARCHAR(128),
plan_start TIMESTAMPTZ,
plan_end TIMESTAMPTZ,
expect_minutes INTEGER,
expect_arrival_at TIMESTAMPTZ,
sla_level VARCHAR(32),
urge_count INTEGER DEFAULT 0,
last_urged_at TIMESTAMPTZ,
is_draft SMALLINT NOT NULL DEFAULT 0,
estimated_fee NUMERIC(10,2),
actual_fee NUMERIC(10,2),
photos VARCHAR(1024),
review_remark TEXT,
reviewed_at TIMESTAMPTZ,
cancel_reason VARCHAR(255),
remark TEXT,
status SMALLINT NOT NULL DEFAULT 0,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
COMMENT ON TABLE survey_order IS '客户勘察派单信息表';
COMMENT ON COLUMN survey_order.id IS '自增主键';
COMMENT ON COLUMN survey_order.survey_no IS '勘察单号(唯一)';
COMMENT ON COLUMN survey_order.customer_id IS '客户 ID(→ customer)';
COMMENT ON COLUMN survey_order.surveyor IS '勘察人(共享电工)';
COMMENT ON COLUMN survey_order.worker_id IS '共享电工 ID';
COMMENT ON COLUMN survey_order.survey_time IS '勘察时间';
COMMENT ON COLUMN survey_order.remark IS '备注';
COMMENT ON COLUMN survey_order.status IS '状态:0已派发 1已接单 2已完成';
COMMENT ON COLUMN survey_order.created_at IS '创建时间';
CREATE INDEX idx_survey_customer ON survey_order (customer_id);
CREATE INDEX idx_survey_worker ON survey_order (worker_id);
COMMENT ON COLUMN survey_order.id IS '自增主键';
COMMENT ON COLUMN survey_order.survey_no IS '勘察单号(唯一)';
COMMENT ON COLUMN survey_order.customer_id IS '客户 ID(→ customer)';
COMMENT ON COLUMN survey_order.surveyor IS '勘察人(共享电工)';
COMMENT ON COLUMN survey_order.worker_id IS '共享电工 ID';
COMMENT ON COLUMN survey_order.survey_time IS '勘察时间';
COMMENT ON COLUMN survey_order.priority IS '优先级:1特急P1 2加急P2 3常规P3';
COMMENT ON COLUMN survey_order.task_title IS '勘察任务标题';
COMMENT ON COLUMN survey_order.site_location IS '具体勘察物理区域';
COMMENT ON COLUMN survey_order.source IS '工单来源:ledger台账派工 visit拜访转勘察 customer客户发起';
COMMENT ON COLUMN survey_order.loop_spec IS '主进线规约与断路器容量';
COMMENT ON COLUMN survey_order.loop_count IS '预估分支测绘回路数';
COMMENT ON COLUMN survey_order.progress_done IS '已完成测绘回路数';
COMMENT ON COLUMN survey_order.progress_total IS '应测绘回路总数';
COMMENT ON COLUMN survey_order.drawing_count IS '待技术复核图纸数';
COMMENT ON COLUMN survey_order.salesman_id IS '责任业务员ID(→ sys_user)';
COMMENT ON COLUMN survey_order.tech_contact IS '现场技术联系人';
COMMENT ON COLUMN survey_order.plan_start IS '计划到场窗口开始';
COMMENT ON COLUMN survey_order.plan_end IS '计划到场窗口结束';
COMMENT ON COLUMN survey_order.expect_minutes IS '要求接单后到场时限(分钟)';
COMMENT ON COLUMN survey_order.expect_arrival_at IS '期望到场时限(指派时按 expect_minutes 推算)';
COMMENT ON COLUMN survey_order.sla_level IS '履约质保要求';
COMMENT ON COLUMN survey_order.urge_count IS '催办次数';
COMMENT ON COLUMN survey_order.last_urged_at IS '最近催办时间';
COMMENT ON COLUMN survey_order.is_draft IS '是否草稿:0正式工单 1草稿';
COMMENT ON COLUMN survey_order.estimated_fee IS '预估劳务费(基础出场费+回路补贴)';
COMMENT ON COLUMN survey_order.actual_fee IS '实际结算劳务费';
COMMENT ON COLUMN survey_order.photos IS '现场取证照片对象key(JSON数组字符串)';
COMMENT ON COLUMN survey_order.review_remark IS '技术复核意见';
COMMENT ON COLUMN survey_order.reviewed_at IS '技术复核时间';
COMMENT ON COLUMN survey_order.cancel_reason IS '取消原因';
COMMENT ON COLUMN survey_order.remark IS '备注';
COMMENT ON COLUMN survey_order.status IS '状态:0待指派 1现场勘察中 2待技术复核 3已归档 4预留 5已取消';
COMMENT ON COLUMN survey_order.created_at IS '创建时间';
COMMENT ON COLUMN survey_order.updated_at IS '更新时间';
CREATE INDEX idx_survey_customer ON survey_order (customer_id);
CREATE INDEX idx_survey_worker ON survey_order (worker_id);
CREATE INDEX idx_survey_status ON survey_order (status);
CREATE INDEX idx_survey_priority ON survey_order (priority);
CREATE INDEX idx_survey_salesman ON survey_order (salesman_id);
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 (
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),
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);
-- 22. 安装派单表
DROP TABLE IF EXISTS install_order CASCADE;
@@ -1033,18 +1142,28 @@ CREATE TABLE worker (
worker_name VARCHAR(64) NOT NULL,
phone VARCHAR(20) NOT NULL,
id_card VARCHAR(18),
worker_title VARCHAR(32),
rating NUMERIC(3,2) DEFAULT 5.00,
cert_info VARCHAR(128),
cert_verified BOOLEAN DEFAULT TRUE,
completed_count INTEGER DEFAULT 0,
status SMALLINT NOT NULL DEFAULT 1,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
COMMENT ON TABLE worker IS '共享电工信息表';
COMMENT ON COLUMN worker.id IS '自增主键';
COMMENT ON COLUMN worker.worker_name IS '电工姓名';
COMMENT ON COLUMN worker.phone IS '手机号';
COMMENT ON COLUMN worker.id_card IS '身份证号';
COMMENT ON COLUMN worker.status IS '状态:1在岗 0离职';
COMMENT ON COLUMN worker.created_at IS '创建时间';
COMMENT ON COLUMN worker.updated_at IS '更新时间';
COMMENT ON COLUMN worker.id IS '自增主键';
COMMENT ON COLUMN worker.worker_name IS '电工姓名';
COMMENT ON COLUMN worker.phone IS '手机号';
COMMENT ON COLUMN worker.id_card IS '身份证号';
COMMENT ON COLUMN worker.worker_title IS '职衔:电工/资深班组长/特种高压电工';
COMMENT ON COLUMN worker.rating IS '服务评分(0-5)';
COMMENT ON COLUMN worker.cert_info IS '持证资质';
COMMENT ON COLUMN worker.cert_verified IS '资质是否已核验';
COMMENT ON COLUMN worker.completed_count IS '历史累计勘察场次';
COMMENT ON COLUMN worker.status IS '状态:1在岗 0离职';
COMMENT ON COLUMN worker.created_at IS '创建时间';
COMMENT ON COLUMN worker.updated_at IS '更新时间';
CREATE INDEX idx_worker_phone ON worker (phone);
CREATE TRIGGER trg_worker_updated_at BEFORE UPDATE ON worker
FOR EACH ROW EXECUTE FUNCTION trigger_set_updated_at();