feat(topology): 建筑支持地下楼层数,房间所在楼层下拉自动按地上+地下生成 - 建筑表新增floordown_count,建筑表单拆分地上/地下楼层数;房间所在楼层改下拉,按地上(1层/2层)与地下(负1层/负2层)自动生成、负楼层在前,选项采用数字格式

This commit is contained in:
wk committed 2026-10-08 16:49:56 +08:00
1 parent d12fa91ec2
commit 77891bf4f2
5 files changed
+52 -11

No files matched your search

+3
View File
@@ -7,6 +7,7 @@ export interface CustomerBuildingInfo {
basicInfo?: string;
purpose?: string;
floorCount?: number;
floorDownCount?: number;
createdAt: string;
}
@@ -30,6 +31,7 @@ export interface CustomerBuildingCreateParams {
basicInfo?: string;
purpose?: string;
floorCount?: number;
floorDownCount?: number;
}
export interface CustomerBuildingUpdateParams {
@@ -38,6 +40,7 @@ export interface CustomerBuildingUpdateParams {
basicInfo?: string;
purpose?: string;
floorCount?: number;
floorDownCount?: number;
}
export const customerBuildingApi = {
+38 -10
View File
@@ -145,8 +145,11 @@
<a-form-item label="建筑用途" name="purpose">
<a-input v-model:value="formData.purpose" placeholder="请输入建筑用途" maxlength="128" />
</a-form-item>
<a-form-item label="楼层数" name="floorCount">
<a-input-number v-model:value="formData.floorCount" :min="0" style="width: 100%" placeholder="请输入楼层数" />
<a-form-item label="地上楼层数" name="floorCount">
<a-input-number v-model:value="formData.floorCount" :min="0" style="width: 100%" placeholder="请输入地上楼层数" />
</a-form-item>
<a-form-item label="地下楼层数" name="floorDownCount">
<a-input-number v-model:value="formData.floorDownCount" :min="0" style="width: 100%" placeholder="请输入地下楼层数" />
</a-form-item>
<a-form-item label="基本信息" name="basicInfo">
<a-textarea v-model:value="formData.basicInfo" :rows="3" placeholder="请输入建筑基本信息" maxlength="2000" />
@@ -176,7 +179,12 @@
<a-input v-model:value="formData.roomName" placeholder="请输入房间名称" maxlength="128" />
</a-form-item>
<a-form-item label="所在楼层" name="floorNo">
<a-input v-model:value="formData.floorNo" placeholder="请输入所在楼层" maxlength="16" />
<a-select
v-model:value="formData.floorNo"
:options="floorOptions"
placeholder="请选择所在楼层"
:not-found-content="floorOptions.length ? null : '请先选择所属建筑'"
/>
</a-form-item>
<a-form-item label="房间用途" name="roomPurpose">
<a-input v-model:value="formData.roomPurpose" placeholder="请输入房间用途" maxlength="128" />
@@ -237,6 +245,7 @@ const formData = reactive({
buildingName: '',
purpose: '',
floorCount: undefined as number | undefined,
floorDownCount: undefined as number | undefined,
basicInfo: '',
roomCode: '',
roomName: '',
@@ -263,6 +272,21 @@ const buildingOptions = computed<{ label: string; value: number }[]>(() => {
const departmentOptions = ref<{ label: string; value: number }[]>([]);
const departmentLoading = ref(false);
const floorOptions = computed<{ label: string; value: string }[]>(() => {
const root = treeData.value[0];
const building = root?.children?.find((n) => n.type === 'building' && n.data.id === formData.buildingId);
const up = building?.data?.floorCount ?? 0;
const down = building?.data?.floorDownCount ?? 0;
const opts: { label: string; value: string }[] = [];
for (let i = down; i >= 1; i--) {
opts.push({ label: `负${i}层`, value: String(-i) });
}
for (let i = 1; i <= up; i++) {
opts.push({ label: `${i}层`, value: String(i) });
}
return opts;
});
const formRules = computed(() => {
if (modalType.value === 'building') {
return {
@@ -293,7 +317,8 @@ function descFor(data: TreeNode): string {
if (data.type === 'building') {
const b: CustomerBuildingInfo = data.data;
if (b.purpose) parts.push(b.purpose);
if (b.floorCount != null) parts.push(`共${b.floorCount}层`);
if (b.floorCount != null) parts.push(`地上${b.floorCount}层`);
if (b.floorDownCount != null && b.floorDownCount > 0) parts.push(`地下${b.floorDownCount}层`);
if (b.basicInfo) parts.push(b.basicInfo);
} else if (data.type === 'room') {
const r: CustomerRoomInfo = data.data;
@@ -407,6 +432,7 @@ function handleEditBuilding(node: TreeNode) {
formData.buildingName = b.buildingName;
formData.purpose = b.purpose || '';
formData.floorCount = b.floorCount;
formData.floorDownCount = b.floorDownCount;
formData.basicInfo = b.basicInfo || '';
modalVisible.value = true;
}
@@ -451,6 +477,7 @@ function resetForm() {
formData.buildingName = '';
formData.purpose = '';
formData.floorCount = undefined;
formData.floorDownCount = undefined;
formData.basicInfo = '';
formData.roomCode = '';
formData.roomName = '';
@@ -474,12 +501,13 @@ async function handleSubmit() {
let res: any;
if (modalType.value === 'building') {
const payload = {
customerId: formData.customerId,
buildingName: formData.buildingName,
purpose: formData.purpose,
floorCount: formData.floorCount,
basicInfo: formData.basicInfo,
};
customerId: formData.customerId,
buildingName: formData.buildingName,
purpose: formData.purpose,
floorCount: formData.floorCount,
floorDownCount: formData.floorDownCount,
basicInfo: formData.basicInfo,
};
if (isEdit.value && editId.value != null) {
res = await customerBuildingApi.update(editId.value, payload);
} else {
@@ -0,0 +1,5 @@
-- 客户建筑信息表增加地下楼层数 floordown_count(INT,默认0)
-- 语义:floor_count 为地上楼层数,floordown_count 为地下楼层数
-- 幂等:ADD COLUMN IF NOT EXISTS 重复执行安全
ALTER TABLE customer_building
ADD COLUMN IF NOT EXISTS floordown_count INT DEFAULT 0;
+2
View File
@@ -13,6 +13,7 @@ export class CustomerBuildingCreateDTO {
@IsOptional() @IsString() @MaxLength(2000) @Matches(/^[^<>]*$/) basicInfo?: string;
@IsOptional() @IsString() @MaxLength(128) @Matches(/^[^<>]*$/) purpose?: string;
@IsOptional() @IsInt() @Min(0) floorCount?: number;
@IsOptional() @IsInt() @Min(0) floorDownCount?: number;
}
export class CustomerBuildingUpdateDTO {
@@ -21,4 +22,5 @@ export class CustomerBuildingUpdateDTO {
@IsOptional() @IsString() @MaxLength(2000) @Matches(/^[^<>]*$/) basicInfo?: string;
@IsOptional() @IsString() @MaxLength(128) @Matches(/^[^<>]*$/) purpose?: string;
@IsOptional() @IsInt() @Min(0) floorCount?: number;
@IsOptional() @IsInt() @Min(0) floorDownCount?: number;
}
@@ -26,9 +26,12 @@ export default class CustomerBuilding extends Model {
@Column({ type: DataType.STRING(128), comment: "用途" })
purpose!: string;
@Column({ type: DataType.INTEGER, field: "floor_count", comment: "层数" })
@Column({ type: DataType.INTEGER, field: "floor_count", comment: "地上楼层数" })
floorCount!: number;
@Column({ type: DataType.INTEGER, field: "floordown_count", comment: "地下楼层数", defaultValue: 0 })
floorDownCount!: number;
@BelongsTo(() => Customer)
customer!: Customer;