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;
|
basicInfo?: string;
|
||||||
purpose?: string;
|
purpose?: string;
|
||||||
floorCount?: number;
|
floorCount?: number;
|
||||||
|
floorDownCount?: number;
|
||||||
createdAt: string;
|
createdAt: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,6 +31,7 @@ export interface CustomerBuildingCreateParams {
|
|||||||
basicInfo?: string;
|
basicInfo?: string;
|
||||||
purpose?: string;
|
purpose?: string;
|
||||||
floorCount?: number;
|
floorCount?: number;
|
||||||
|
floorDownCount?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface CustomerBuildingUpdateParams {
|
export interface CustomerBuildingUpdateParams {
|
||||||
@@ -38,6 +40,7 @@ export interface CustomerBuildingUpdateParams {
|
|||||||
basicInfo?: string;
|
basicInfo?: string;
|
||||||
purpose?: string;
|
purpose?: string;
|
||||||
floorCount?: number;
|
floorCount?: number;
|
||||||
|
floorDownCount?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const customerBuildingApi = {
|
export const customerBuildingApi = {
|
||||||
|
|||||||
@@ -145,8 +145,11 @@
|
|||||||
<a-form-item label="建筑用途" name="purpose">
|
<a-form-item label="建筑用途" name="purpose">
|
||||||
<a-input v-model:value="formData.purpose" placeholder="请输入建筑用途" maxlength="128" />
|
<a-input v-model:value="formData.purpose" placeholder="请输入建筑用途" maxlength="128" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label="楼层数" name="floorCount">
|
<a-form-item label="地上楼层数" name="floorCount">
|
||||||
<a-input-number v-model:value="formData.floorCount" :min="0" style="width: 100%" placeholder="请输入楼层数" />
|
<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>
|
||||||
<a-form-item label="基本信息" name="basicInfo">
|
<a-form-item label="基本信息" name="basicInfo">
|
||||||
<a-textarea v-model:value="formData.basicInfo" :rows="3" placeholder="请输入建筑基本信息" maxlength="2000" />
|
<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-input v-model:value="formData.roomName" placeholder="请输入房间名称" maxlength="128" />
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label="所在楼层" name="floorNo">
|
<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>
|
||||||
<a-form-item label="房间用途" name="roomPurpose">
|
<a-form-item label="房间用途" name="roomPurpose">
|
||||||
<a-input v-model:value="formData.roomPurpose" placeholder="请输入房间用途" maxlength="128" />
|
<a-input v-model:value="formData.roomPurpose" placeholder="请输入房间用途" maxlength="128" />
|
||||||
@@ -237,6 +245,7 @@ const formData = reactive({
|
|||||||
buildingName: '',
|
buildingName: '',
|
||||||
purpose: '',
|
purpose: '',
|
||||||
floorCount: undefined as number | undefined,
|
floorCount: undefined as number | undefined,
|
||||||
|
floorDownCount: undefined as number | undefined,
|
||||||
basicInfo: '',
|
basicInfo: '',
|
||||||
roomCode: '',
|
roomCode: '',
|
||||||
roomName: '',
|
roomName: '',
|
||||||
@@ -263,6 +272,21 @@ const buildingOptions = computed<{ label: string; value: number }[]>(() => {
|
|||||||
const departmentOptions = ref<{ label: string; value: number }[]>([]);
|
const departmentOptions = ref<{ label: string; value: number }[]>([]);
|
||||||
const departmentLoading = ref(false);
|
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(() => {
|
const formRules = computed(() => {
|
||||||
if (modalType.value === 'building') {
|
if (modalType.value === 'building') {
|
||||||
return {
|
return {
|
||||||
@@ -293,7 +317,8 @@ function descFor(data: TreeNode): string {
|
|||||||
if (data.type === 'building') {
|
if (data.type === 'building') {
|
||||||
const b: CustomerBuildingInfo = data.data;
|
const b: CustomerBuildingInfo = data.data;
|
||||||
if (b.purpose) parts.push(b.purpose);
|
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);
|
if (b.basicInfo) parts.push(b.basicInfo);
|
||||||
} else if (data.type === 'room') {
|
} else if (data.type === 'room') {
|
||||||
const r: CustomerRoomInfo = data.data;
|
const r: CustomerRoomInfo = data.data;
|
||||||
@@ -407,6 +432,7 @@ function handleEditBuilding(node: TreeNode) {
|
|||||||
formData.buildingName = b.buildingName;
|
formData.buildingName = b.buildingName;
|
||||||
formData.purpose = b.purpose || '';
|
formData.purpose = b.purpose || '';
|
||||||
formData.floorCount = b.floorCount;
|
formData.floorCount = b.floorCount;
|
||||||
|
formData.floorDownCount = b.floorDownCount;
|
||||||
formData.basicInfo = b.basicInfo || '';
|
formData.basicInfo = b.basicInfo || '';
|
||||||
modalVisible.value = true;
|
modalVisible.value = true;
|
||||||
}
|
}
|
||||||
@@ -451,6 +477,7 @@ function resetForm() {
|
|||||||
formData.buildingName = '';
|
formData.buildingName = '';
|
||||||
formData.purpose = '';
|
formData.purpose = '';
|
||||||
formData.floorCount = undefined;
|
formData.floorCount = undefined;
|
||||||
|
formData.floorDownCount = undefined;
|
||||||
formData.basicInfo = '';
|
formData.basicInfo = '';
|
||||||
formData.roomCode = '';
|
formData.roomCode = '';
|
||||||
formData.roomName = '';
|
formData.roomName = '';
|
||||||
@@ -474,12 +501,13 @@ async function handleSubmit() {
|
|||||||
let res: any;
|
let res: any;
|
||||||
if (modalType.value === 'building') {
|
if (modalType.value === 'building') {
|
||||||
const payload = {
|
const payload = {
|
||||||
customerId: formData.customerId,
|
customerId: formData.customerId,
|
||||||
buildingName: formData.buildingName,
|
buildingName: formData.buildingName,
|
||||||
purpose: formData.purpose,
|
purpose: formData.purpose,
|
||||||
floorCount: formData.floorCount,
|
floorCount: formData.floorCount,
|
||||||
basicInfo: formData.basicInfo,
|
floorDownCount: formData.floorDownCount,
|
||||||
};
|
basicInfo: formData.basicInfo,
|
||||||
|
};
|
||||||
if (isEdit.value && editId.value != null) {
|
if (isEdit.value && editId.value != null) {
|
||||||
res = await customerBuildingApi.update(editId.value, payload);
|
res = await customerBuildingApi.update(editId.value, payload);
|
||||||
} else {
|
} 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(2000) @Matches(/^[^<>]*$/) basicInfo?: string;
|
||||||
@IsOptional() @IsString() @MaxLength(128) @Matches(/^[^<>]*$/) purpose?: string;
|
@IsOptional() @IsString() @MaxLength(128) @Matches(/^[^<>]*$/) purpose?: string;
|
||||||
@IsOptional() @IsInt() @Min(0) floorCount?: number;
|
@IsOptional() @IsInt() @Min(0) floorCount?: number;
|
||||||
|
@IsOptional() @IsInt() @Min(0) floorDownCount?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class CustomerBuildingUpdateDTO {
|
export class CustomerBuildingUpdateDTO {
|
||||||
@@ -21,4 +22,5 @@ export class CustomerBuildingUpdateDTO {
|
|||||||
@IsOptional() @IsString() @MaxLength(2000) @Matches(/^[^<>]*$/) basicInfo?: string;
|
@IsOptional() @IsString() @MaxLength(2000) @Matches(/^[^<>]*$/) basicInfo?: string;
|
||||||
@IsOptional() @IsString() @MaxLength(128) @Matches(/^[^<>]*$/) purpose?: string;
|
@IsOptional() @IsString() @MaxLength(128) @Matches(/^[^<>]*$/) purpose?: string;
|
||||||
@IsOptional() @IsInt() @Min(0) floorCount?: number;
|
@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: "用途" })
|
@Column({ type: DataType.STRING(128), comment: "用途" })
|
||||||
purpose!: string;
|
purpose!: string;
|
||||||
|
|
||||||
@Column({ type: DataType.INTEGER, field: "floor_count", comment: "层数" })
|
@Column({ type: DataType.INTEGER, field: "floor_count", comment: "地上楼层数" })
|
||||||
floorCount!: number;
|
floorCount!: number;
|
||||||
|
|
||||||
|
@Column({ type: DataType.INTEGER, field: "floordown_count", comment: "地下楼层数", defaultValue: 0 })
|
||||||
|
floorDownCount!: number;
|
||||||
|
|
||||||
@BelongsTo(() => Customer)
|
@BelongsTo(() => Customer)
|
||||||
customer!: Customer;
|
customer!: Customer;
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user