feat(topology): 建筑支持地下楼层数,房间所在楼层下拉自动按地上+地下生成 - 建筑表新增floordown_count,建筑表单拆分地上/地下楼层数;房间所在楼层改下拉,按地上(1层/2层)与地下(负1层/负2层)自动生成、负楼层在前,选项采用数字格式
This commit is contained in:
1 parent
d12fa91ec2
commit
77891bf4f2
5 files changed
+52
-11
No files matched your search
@@ -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 = {
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in new issue
Block a user