feat: 新增电工APP订单相关功能及数据库扩展
为四类订单表(报修/安装/维保/勘察)新增人工费、材料费、距离、预计时长字段,新增订单池、我的订单、订单详情、接单、完成订单、收益汇总接口,新增数据库迁移脚本和演示数据,支撑电工APP订单管理闭环
This commit is contained in:
1 parent
7b6fe46d10
commit
91aa3c06f0
8 files changed
+764
-3
No files matched your search
@@ -0,0 +1,69 @@
|
||||
-- 电工 APP(VoltLink)订单池 / 订单 / 收益功能扩展
|
||||
-- 背景:电工 APP 需要统一的「订单池 - 我的订单 - 收益」闭环。四类派单表
|
||||
-- (repair_request / install_order / maintenance_order / survey_order)此前缺少
|
||||
-- 报价(人工费/材料费)、距离、预计时长等展示字段,前端无法计算预估收益与列表展示。
|
||||
-- 本期为四张表补齐这些展示/计价字段(勘察复用已有 estimated_fee / actual_fee,不新增费用列),
|
||||
-- 并补充「按电工 + 状态」的联合查询索引,支撑订单池与收益统计。
|
||||
-- 幂等:新增列一律带 DEFAULT + IF NOT EXISTS;索引用 IF NOT EXISTS;重复执行安全。
|
||||
-- 注意:repair_request / install_order / maintenance_order 无 updated_at 列,收益时间以 created_at 兜底,
|
||||
-- 无需为此新增 updated_at(避免改动既有审计语义)。
|
||||
BEGIN;
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 1) repair_request 表扩展:报价与展示字段
|
||||
-- ------------------------------------------------------------
|
||||
ALTER TABLE repair_request ADD COLUMN IF NOT EXISTS labor_fee NUMERIC(10,2) NOT NULL DEFAULT 0; -- 人工费(预估价,电工收益 = 人工费 + 材料费)
|
||||
ALTER TABLE repair_request ADD COLUMN IF NOT EXISTS material_fee NUMERIC(10,2) NOT NULL DEFAULT 0; -- 材料费(预估价)
|
||||
ALTER TABLE repair_request ADD COLUMN IF NOT EXISTS distance NUMERIC(6,2) NOT NULL DEFAULT 0; -- 距电工距离(km)
|
||||
ALTER TABLE repair_request ADD COLUMN IF NOT EXISTS estimated_duration VARCHAR(64); -- 预计时长文本,如 "1.5 - 2 小时"
|
||||
|
||||
COMMENT ON COLUMN repair_request.labor_fee IS '人工费(预估价,电工收益 = 人工费 + 材料费)';
|
||||
COMMENT ON COLUMN repair_request.material_fee IS '材料费(预估价)';
|
||||
COMMENT ON COLUMN repair_request.distance IS '距电工距离(km)';
|
||||
COMMENT ON COLUMN repair_request.estimated_duration IS '预计时长文本,如 "1.5 - 2 小时"';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 2) install_order 表扩展:报价与展示字段
|
||||
-- ------------------------------------------------------------
|
||||
ALTER TABLE install_order ADD COLUMN IF NOT EXISTS labor_fee NUMERIC(10,2) NOT NULL DEFAULT 0; -- 人工费(预估价)
|
||||
ALTER TABLE install_order ADD COLUMN IF NOT EXISTS material_fee NUMERIC(10,2) NOT NULL DEFAULT 0; -- 材料费(预估价)
|
||||
ALTER TABLE install_order ADD COLUMN IF NOT EXISTS distance NUMERIC(6,2) NOT NULL DEFAULT 0; -- 距电工距离(km)
|
||||
ALTER TABLE install_order ADD COLUMN IF NOT EXISTS estimated_duration VARCHAR(64); -- 预计时长文本
|
||||
|
||||
COMMENT ON COLUMN install_order.labor_fee IS '人工费(预估价,电工收益 = 人工费 + 材料费)';
|
||||
COMMENT ON COLUMN install_order.material_fee IS '材料费(预估价)';
|
||||
COMMENT ON COLUMN install_order.distance IS '距电工距离(km)';
|
||||
COMMENT ON COLUMN install_order.estimated_duration IS '预计时长文本,如 "1.5 - 2 小时"';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 3) maintenance_order 表扩展:报价与展示字段
|
||||
-- ------------------------------------------------------------
|
||||
ALTER TABLE maintenance_order ADD COLUMN IF NOT EXISTS labor_fee NUMERIC(10,2) NOT NULL DEFAULT 0; -- 人工费(预估价)
|
||||
ALTER TABLE maintenance_order ADD COLUMN IF NOT EXISTS material_fee NUMERIC(10,2) NOT NULL DEFAULT 0; -- 材料费(预估价)
|
||||
ALTER TABLE maintenance_order ADD COLUMN IF NOT EXISTS distance NUMERIC(6,2) NOT NULL DEFAULT 0; -- 距电工距离(km)
|
||||
ALTER TABLE maintenance_order ADD COLUMN IF NOT EXISTS estimated_duration VARCHAR(64); -- 预计时长文本
|
||||
|
||||
COMMENT ON COLUMN maintenance_order.labor_fee IS '人工费(预估价,电工收益 = 人工费 + 材料费)';
|
||||
COMMENT ON COLUMN maintenance_order.material_fee IS '材料费(预估价)';
|
||||
COMMENT ON COLUMN maintenance_order.distance IS '距电工距离(km)';
|
||||
COMMENT ON COLUMN maintenance_order.estimated_duration IS '预计时长文本,如 "1.5 - 2 小时"';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 4) survey_order 表扩展:距离与预计时长(金额复用 estimated_fee / actual_fee)
|
||||
-- ------------------------------------------------------------
|
||||
ALTER TABLE survey_order ADD COLUMN IF NOT EXISTS distance NUMERIC(6,2) NOT NULL DEFAULT 0; -- 距电工距离(km)
|
||||
ALTER TABLE survey_order ADD COLUMN IF NOT EXISTS estimated_duration VARCHAR(64); -- 预计时长文本
|
||||
|
||||
COMMENT ON COLUMN survey_order.distance IS '距电工距离(km)';
|
||||
COMMENT ON COLUMN survey_order.estimated_duration IS '预计时长文本,如 "1.5 - 2 小时"';
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 5) 查询索引:订单池按「未接单 + 状态」过滤,我的订单/收益按「电工 + 状态」过滤
|
||||
-- 既有单列索引(worker_id / status)在多条件查询下选择性不足,补充联合索引。
|
||||
-- ------------------------------------------------------------
|
||||
CREATE INDEX IF NOT EXISTS idx_repair_disp_worker_status ON repair_dispatch (worker_id, status);
|
||||
CREATE INDEX IF NOT EXISTS idx_install_worker_status ON install_order (worker_id, status);
|
||||
CREATE INDEX IF NOT EXISTS idx_maint_worker_status ON maintenance_order (worker_id, status);
|
||||
CREATE INDEX IF NOT EXISTS idx_survey_worker_status ON survey_order (worker_id, status);
|
||||
|
||||
COMMIT;
|
||||
@@ -0,0 +1,117 @@
|
||||
-- ============================================================
|
||||
-- 电工 APP(VoltLink)订单池演示数据
|
||||
--
|
||||
-- 依赖:
|
||||
-- 1) db_init.sql 基础表结构
|
||||
-- 2) 20261003_worker_app_orders.sql 报价/距离/时长等展示字段
|
||||
--
|
||||
-- 用法:
|
||||
-- psql -U postgres -d xintong -f database/seed_worker_app_orders.sql
|
||||
--
|
||||
-- 特性:
|
||||
-- - 独立事务(BEGIN/COMMIT)
|
||||
-- - 幂等可重复执行:全部使用「固定业务单号 + ON CONFLICT DO NOTHING」
|
||||
-- - 不写死主键,id 均由序列自增
|
||||
-- - 生成「未被任何电工接单」的订单池数据:报修 3 / 安装 2 / 维保 2 / 勘察 2
|
||||
-- ============================================================
|
||||
BEGIN;
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 1. 演示客户(customer_no 唯一,作为全部演示订单的归属客户)
|
||||
-- ------------------------------------------------------------
|
||||
INSERT INTO customer (customer_no, customer_name, province, city, district, address, contact_person, contact_phone, customer_level, status)
|
||||
VALUES ('KH-DEMO-0001', '示例智电科技园', '江苏省', '南京市', '江宁区', '江宁区智汇路 88 号', '张工', '13800000000', '企业', 3)
|
||||
ON CONFLICT (customer_no) DO NOTHING;
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 2. 演示方案(install_order.plan_id 为必填外键,需保证存在可引用的 project_plan)
|
||||
-- 优先保证存在一条固定的演示方案;install_order 插入时再兜底取「任意已存在的方案」
|
||||
-- ------------------------------------------------------------
|
||||
INSERT INTO project_plan (plan_no, customer_id, registrar, register_time, plan_desc, status)
|
||||
SELECT 'FA-DEMO-0001', c.id, '演示业务员', CURRENT_DATE, '电工 APP 订单池演示方案(自动生成)', 1
|
||||
FROM customer c
|
||||
WHERE c.customer_no = 'KH-DEMO-0001'
|
||||
ON CONFLICT (plan_no) DO NOTHING;
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 3. 报修单(status=0 待处理,进入订单池)—— 3 条,金额各不相同
|
||||
-- ------------------------------------------------------------
|
||||
INSERT INTO repair_request
|
||||
(repair_no, customer_id, requester, requester_phone, request_time, location, repair_content, photos, status, labor_fee, material_fee, distance, estimated_duration)
|
||||
SELECT 'BX-DEMO-0001', c.id, '张工', '13800000001', NOW() - INTERVAL '2 hour', 'A 栋 3 层配电间',
|
||||
'配电箱空开频繁跳闸,怀疑线路过载,请尽快上门排查处理', '[]'::jsonb, 0, 150.00, 80.00, 5.20, '1 - 1.5 小时'
|
||||
FROM customer c WHERE c.customer_no = 'KH-DEMO-0001'
|
||||
ON CONFLICT (repair_no) DO NOTHING;
|
||||
|
||||
INSERT INTO repair_request
|
||||
(repair_no, customer_id, requester, requester_phone, request_time, location, repair_content, photos, status, labor_fee, material_fee, distance, estimated_duration)
|
||||
SELECT 'BX-DEMO-0002', c.id, '李主管', '13800000002', NOW() - INTERVAL '5 hour', 'B 栋 1 层强电井',
|
||||
'楼层照明回路部分失电,需检测并更换损坏断路器', '[]'::jsonb, 0, 260.00, 120.00, 12.40, '2 - 3 小时'
|
||||
FROM customer c WHERE c.customer_no = 'KH-DEMO-0001'
|
||||
ON CONFLICT (repair_no) DO NOTHING;
|
||||
|
||||
INSERT INTO repair_request
|
||||
(repair_no, customer_id, requester, requester_phone, request_time, location, repair_content, photos, status, labor_fee, material_fee, distance, estimated_duration)
|
||||
SELECT 'BX-DEMO-0003', c.id, '王工', '13800000003', NOW() - INTERVAL '30 minute', 'C 栋 2 层办公室',
|
||||
'插座无电,需排查线路并更换面板', '[]'::jsonb, 0, 90.00, 35.00, 3.10, '1 小时以内'
|
||||
FROM customer c WHERE c.customer_no = 'KH-DEMO-0001'
|
||||
ON CONFLICT (repair_no) DO NOTHING;
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 4. 安装派单(worker_id 为空,status=0 已派发,进入订单池)—— 2 条
|
||||
-- plan_id 优先取已存在的任意方案,其次回退到演示方案
|
||||
-- ------------------------------------------------------------
|
||||
INSERT INTO install_order
|
||||
(install_no, customer_id, installer, worker_id, dispatch_date, start_date, end_date, plan_id, remark, status, labor_fee, material_fee, distance, estimated_duration)
|
||||
SELECT 'AZ-DEMO-0001', c.id, NULL, NULL, CURRENT_DATE, CURRENT_DATE, CURRENT_DATE + 3,
|
||||
COALESCE((SELECT id FROM project_plan ORDER BY id LIMIT 1), (SELECT id FROM project_plan WHERE plan_no = 'FA-DEMO-0001')),
|
||||
'智能电表安装 12 台,含桥架布线', 0, 480.00, 260.00, 12.50, '4 - 6 小时'
|
||||
FROM customer c WHERE c.customer_no = 'KH-DEMO-0001'
|
||||
ON CONFLICT (install_no) DO NOTHING;
|
||||
|
||||
INSERT INTO install_order
|
||||
(install_no, customer_id, installer, worker_id, dispatch_date, start_date, end_date, plan_id, remark, status, labor_fee, material_fee, distance, estimated_duration)
|
||||
SELECT 'AZ-DEMO-0002', c.id, NULL, NULL, CURRENT_DATE + 1, CURRENT_DATE + 1, CURRENT_DATE + 2,
|
||||
COALESCE((SELECT id FROM project_plan ORDER BY id LIMIT 1), (SELECT id FROM project_plan WHERE plan_no = 'FA-DEMO-0001')),
|
||||
'智能网关与采集器安装调试 3 套', 0, 320.00, 180.00, 6.80, '3 - 4 小时'
|
||||
FROM customer c WHERE c.customer_no = 'KH-DEMO-0001'
|
||||
ON CONFLICT (install_no) DO NOTHING;
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 5. 维保派单(worker_id 为空,status=0 已派发,进入订单池)—— 2 条
|
||||
-- ------------------------------------------------------------
|
||||
INSERT INTO maintenance_order
|
||||
(maintenance_no, customer_id, maintainer, worker_id, maintenance_date, remark, status, labor_fee, material_fee, distance, estimated_duration)
|
||||
SELECT 'WB-DEMO-0001', c.id, NULL, NULL, CURRENT_DATE + 2,
|
||||
'季度维保:配电柜除尘、紧固、绝缘检测', 0, 200.00, 60.00, 8.30, '2 - 3 小时'
|
||||
FROM customer c WHERE c.customer_no = 'KH-DEMO-0001'
|
||||
ON CONFLICT (maintenance_no) DO NOTHING;
|
||||
|
||||
INSERT INTO maintenance_order
|
||||
(maintenance_no, customer_id, maintainer, worker_id, maintenance_date, remark, status, labor_fee, material_fee, distance, estimated_duration)
|
||||
SELECT 'WB-DEMO-0002', c.id, NULL, NULL, CURRENT_DATE + 5,
|
||||
'年度维保:变压器巡检与接地电阻测试', 0, 180.00, 40.00, 15.60, '2 小时'
|
||||
FROM customer c WHERE c.customer_no = 'KH-DEMO-0001'
|
||||
ON CONFLICT (maintenance_no) DO NOTHING;
|
||||
|
||||
-- ------------------------------------------------------------
|
||||
-- 6. 勘察派单(worker_id 为空,status=0 待指派,is_draft=0,进入订单池)—— 2 条
|
||||
-- 金额复用 estimated_fee / actual_fee,不新增费用列
|
||||
-- ------------------------------------------------------------
|
||||
INSERT INTO survey_order
|
||||
(survey_no, customer_id, surveyor, worker_id, survey_time, priority, task_title, site_location, source, tech_contact,
|
||||
plan_start, plan_end, is_draft, estimated_fee, actual_fee, photos, remark, status, distance, estimated_duration)
|
||||
SELECT 'KC-DEMO-0001', c.id, NULL, NULL, NOW(), 3, '新增大功率充电桩勘察', 'C 栋地下车库', 'ledger', '13800000002',
|
||||
NOW() + INTERVAL '1 day', NOW() + INTERVAL '1 day 2 hour', 0, 260.00, NULL, '[]', '需评估配电容量与布线路径', 0, 8.30, '2 - 3 小时'
|
||||
FROM customer c WHERE c.customer_no = 'KH-DEMO-0001'
|
||||
ON CONFLICT (survey_no) DO NOTHING;
|
||||
|
||||
INSERT INTO survey_order
|
||||
(survey_no, customer_id, surveyor, worker_id, survey_time, priority, task_title, site_location, source, tech_contact,
|
||||
plan_start, plan_end, is_draft, estimated_fee, actual_fee, photos, remark, status, distance, estimated_duration)
|
||||
SELECT 'KC-DEMO-0002', c.id, NULL, NULL, NOW(), 3, '配电房扩容勘察', 'A 栋 1 层配电房', 'ledger', '13800000003',
|
||||
NOW() + INTERVAL '2 day', NOW() + INTERVAL '2 day 2 hour', 0, 180.00, NULL, '[]', '需确认扩容后回路数与母线规格', 0, 4.60, '1.5 - 2 小时'
|
||||
FROM customer c WHERE c.customer_no = 'KH-DEMO-0001'
|
||||
ON CONFLICT (survey_no) DO NOTHING;
|
||||
|
||||
COMMIT;
|
||||
Reference in new issue
Block a user