- 设备树明细模式:customer_equipment 新增 parent_id 自引用与树形查询(getTree/tree 接口),勘察明细按设备节点挂接(survey_detail 新增 equip_id,saveDetails 全量替换),新增迁移 20261024_survey_equipment_tree.sql 并同步 db_init;客户拜访页发起勘察改为两步向导路由(CustomerVisitSurveyCreate),form.vue 重构为两步向导 - 勘察明细页(detail.vue):三栏布局(设备树/拓扑图/属性与勘察登记);设备拓扑图修复显示不完整(tree roam 拖拽缩放+全展开+弹窗增高);新增/编辑设备表单「所在位置」改为「所属建筑」下拉并增加「所在楼层」;选择建筑后按建筑地上/地下层数动态生成楼层下拉(负N层在前,切换建筑清空楼层) - 设备管理台账页:设备新增弹窗同步「所属建筑/所在楼层」动态下拉 - 台账页:进度跟踪主按钮改为跳转勘察明细页(DispatchSurveyDetail)而非编辑页;「审核测绘成果」按钮与复核弹窗标题改名「技术复核」 - 勘察完成流转:新增 PUT /api/survey-orders/:id/complete(现场勘察中→待技术复核,可见性校验+审计日志),勘察明细页新增「勘察完成」按钮(先保存明细再流转状态,成功后跳回台账页) - 验证:server tsc 与 client vue-tsc 编译通过;浏览器端到端验证通过(技术复核按钮/弹窗标题、勘察完成按钮仅勘察中显示、进度跟踪跳转数字id)
58 lines
2.1 KiB
TypeScript
58 lines
2.1 KiB
TypeScript
import { Column, Model, Table, DataType, CreatedAt, UpdatedAt, ForeignKey, BelongsTo } from "sequelize-typescript";
|
||
import SurveyOrder from "./survey_order.entity";
|
||
import CustomerEquipment from "./customer_equipment.entity";
|
||
|
||
@Table({
|
||
tableName: "survey_detail",
|
||
comment: "勘察工单明细表(关联客户设备 + 现场照片)",
|
||
timestamps: true,
|
||
createdAt: "created_at",
|
||
updatedAt: "updated_at",
|
||
indexes: [
|
||
{ name: "idx_survey_detail_order", fields: ["survey_order_id"] },
|
||
{ name: "idx_survey_detail_equip", fields: ["equip_id"] }
|
||
]
|
||
})
|
||
export default class SurveyDetail extends Model {
|
||
@Column({ type: DataType.BIGINT, autoIncrement: true, primaryKey: true })
|
||
id!: number;
|
||
|
||
@ForeignKey(() => SurveyOrder)
|
||
@Column({ type: DataType.BIGINT, allowNull: false, field: "survey_order_id", comment: "勘察工单ID(→ survey_order)" })
|
||
surveyOrderId!: number;
|
||
|
||
@ForeignKey(() => CustomerEquipment)
|
||
@Column({ type: DataType.BIGINT, field: "equip_id", comment: "客户设备ID(→ customer_equipment,勘察明细挂接到设备节点)" })
|
||
equipId!: number;
|
||
|
||
@Column({ type: DataType.BIGINT, field: "building_id", comment: "建筑ID(→ customer_building,兼容历史数据)" })
|
||
buildingId!: number;
|
||
|
||
@Column({ type: DataType.STRING(128), field: "building_name", comment: "建筑名称(冗余,客户拓扑变更后仍可读)" })
|
||
buildingName!: string;
|
||
|
||
@Column({ type: DataType.STRING(16), field: "floor_no", comment: "所在楼层:正数为地上、负数为地下,如 1 / -1" })
|
||
floorNo!: string;
|
||
|
||
@Column({ type: DataType.BIGINT, field: "room_id", comment: "房间ID(→ customer_room,可空)" })
|
||
roomId!: number;
|
||
|
||
@Column({ type: DataType.STRING(128), field: "room_name", comment: "房间名称(冗余,可空)" })
|
||
roomName!: string;
|
||
|
||
@Column({ type: DataType.TEXT, field: "photos", comment: "现场照片对象key(JSON数组字符串)" })
|
||
photos!: string;
|
||
|
||
@Column({ type: DataType.STRING(255), comment: "备注" })
|
||
remark!: string;
|
||
|
||
@BelongsTo(() => SurveyOrder, { foreignKey: "surveyOrderId", as: "surveyOrder" })
|
||
surveyOrder!: SurveyOrder;
|
||
|
||
@CreatedAt
|
||
created_at!: Date;
|
||
|
||
@UpdatedAt
|
||
updated_at!: Date;
|
||
}
|