2024-11-14 13:43:41 +08:00
|
|
|
<template>
|
2025-04-21 13:02:10 +08:00
|
|
|
<BasicDrawer v-bind="$attrs" @register="registerDrawer" showFooter :title="getTitle" width="960px" @ok="handleSubmit">
|
2025-05-08 11:37:08 +08:00
|
|
|
<BasicForm @register="registerForm" @field-value-change="handleValuesChanged" />
|
2024-12-27 13:50:13 +08:00
|
|
|
<BasicTable @register="registerTable">
|
|
|
|
<template #toolbar>
|
2025-05-08 11:37:08 +08:00
|
|
|
<a-button type="primary" :icon="h(PlusOutlined)" @click="handleCreate">新 增</a-button>
|
|
|
|
<a-button type="primary" :icon="h(EyeOutlined)" :disabled="importDisabled" @click="handleOpenFileDialog">OCR识别</a-button>
|
|
|
|
<a-button type="primary" :icon="h(FileExcelOutlined)" :disabled="importDisabled" @click="handleImport">导入Excel</a-button>
|
2025-04-23 17:00:27 +08:00
|
|
|
<Popconfirm
|
|
|
|
title="确定要清空预埋件列表吗?"
|
|
|
|
ok-text="确定"
|
|
|
|
cancel-text="取消"
|
|
|
|
@confirm="handleDeleteAll"
|
|
|
|
>
|
|
|
|
<a-button type="primary" :icon="h(MinusOutlined)">清空列表</a-button>
|
|
|
|
</Popconfirm>
|
2024-12-27 13:50:13 +08:00
|
|
|
</template>
|
|
|
|
<template #bodyCell="{ column, record }">
|
2025-04-23 17:00:27 +08:00
|
|
|
<template v-if="column.dataIndex === 'x'">
|
2025-04-23 17:28:55 +08:00
|
|
|
<span v-if="markField('x', record)" style="color: red">{{ record.x }}</span>
|
2025-04-23 17:00:27 +08:00
|
|
|
<span v-else style="color: white">{{ record.x }}</span>
|
|
|
|
</template>
|
|
|
|
<template v-if="column.dataIndex === 'center'">
|
2025-04-23 17:28:55 +08:00
|
|
|
<span v-if="markField('center', record)" style="color: red">{{ record.center }}</span>
|
2025-04-23 17:00:27 +08:00
|
|
|
<span v-else style="color: white">{{ record.center }}</span>
|
|
|
|
</template>
|
|
|
|
<template v-if="column.dataIndex === 'w'">
|
|
|
|
<span v-if="record.w !== record.h" style="color: red">{{ record.w }}</span>
|
|
|
|
<span v-else style="color: white">{{ record.w }}</span>
|
|
|
|
</template>
|
|
|
|
<template v-if="column.dataIndex === 'h'">
|
|
|
|
<span v-if="record.w !== record.h" style="color: red">{{ record.h }}</span>
|
|
|
|
<span v-else style="color: white">{{ record.h }}</span>
|
|
|
|
</template>
|
2024-12-27 13:50:13 +08:00
|
|
|
<template v-if="column.dataIndex === 'action'">
|
|
|
|
<TableAction
|
|
|
|
:actions="[
|
|
|
|
{
|
|
|
|
label: '编辑',
|
|
|
|
icon: 'clarity:note-edit-line',
|
|
|
|
onClick: handleEdit.bind(null, record),
|
|
|
|
divider: true,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
label: '删除',
|
|
|
|
icon: 'ant-design:delete-outlined',
|
|
|
|
color: 'error',
|
|
|
|
popConfirm: {
|
|
|
|
title: '是否确认删除',
|
|
|
|
confirm: handleDelete.bind(null, record),
|
|
|
|
placement: 'topRight',
|
|
|
|
},
|
|
|
|
divider: true,
|
|
|
|
},
|
|
|
|
]"
|
|
|
|
/>
|
|
|
|
</template>
|
|
|
|
</template>
|
|
|
|
</BasicTable>
|
2025-01-03 11:19:45 +08:00
|
|
|
<Modal @register="register" @success="updateParamData" />
|
2024-11-14 13:43:41 +08:00
|
|
|
</BasicDrawer>
|
|
|
|
</template>
|
|
|
|
<script lang="ts" setup>
|
2025-05-08 11:37:08 +08:00
|
|
|
import { defineEmits, ref, computed, unref, h } from 'vue';
|
2024-12-27 13:50:13 +08:00
|
|
|
import { BasicForm, useForm } from '@/components/Form/index';
|
|
|
|
import { formSchema } from './schema';
|
|
|
|
import { BasicDrawer, useDrawerInner } from '@/components/Drawer';
|
|
|
|
import * as TaskApi from '@/api/data/taskApi';
|
|
|
|
import { BasicTable, useTable, TableAction } from '@/components/Table';
|
2025-05-08 11:37:08 +08:00
|
|
|
import { EyeOutlined, PlusOutlined, MinusOutlined, FileExcelOutlined } from "@ant-design/icons-vue";
|
2025-04-23 17:00:27 +08:00
|
|
|
import { Popconfirm } from 'ant-design-vue';
|
2024-12-27 13:50:13 +08:00
|
|
|
import Modal from "@/views/data/task/modal.vue";
|
|
|
|
import { useModal } from '/@/components/Modal';
|
|
|
|
const [register, { openModal }] = useModal();
|
|
|
|
const columns = [
|
2025-04-21 13:02:10 +08:00
|
|
|
{
|
|
|
|
title: '序号',
|
2025-04-23 14:49:49 +08:00
|
|
|
dataIndex: 'sn',
|
|
|
|
key: 'sn',
|
2025-04-21 13:02:10 +08:00
|
|
|
width: '50px',
|
|
|
|
},
|
2024-12-27 13:50:13 +08:00
|
|
|
{
|
|
|
|
title: '预埋件编号',
|
|
|
|
dataIndex: 'code',
|
|
|
|
key: 'code',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
title: '类型',
|
|
|
|
dataIndex: 'type',
|
|
|
|
key: 'type',
|
|
|
|
},
|
|
|
|
{
|
|
|
|
title: 'X(mm)',
|
|
|
|
dataIndex: 'x',
|
|
|
|
key: 'x',
|
2025-04-21 13:02:10 +08:00
|
|
|
width: '72px',
|
2024-12-27 13:50:13 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
title: 'Y(mm)',
|
|
|
|
dataIndex: 'y',
|
|
|
|
key: 'y',
|
2025-04-21 13:02:10 +08:00
|
|
|
width: '72px',
|
2024-12-27 13:50:13 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
title: 'w(mm)',
|
|
|
|
dataIndex: 'w',
|
|
|
|
key: 'w',
|
2025-04-21 13:02:10 +08:00
|
|
|
width: '72px',
|
2024-12-27 13:50:13 +08:00
|
|
|
},
|
|
|
|
{
|
|
|
|
title: 'h(mm)',
|
|
|
|
dataIndex: 'h',
|
|
|
|
key: 'h',
|
2025-04-21 13:02:10 +08:00
|
|
|
width: '72px',
|
2024-12-27 13:50:13 +08:00
|
|
|
},
|
2025-02-14 11:08:21 +08:00
|
|
|
{
|
|
|
|
title: '中心点(m)',
|
|
|
|
dataIndex: 'center',
|
|
|
|
key: 'center',
|
|
|
|
width: '80px',
|
|
|
|
},
|
2024-12-27 13:50:13 +08:00
|
|
|
];
|
|
|
|
|
2025-01-03 11:19:45 +08:00
|
|
|
const paramData = ref<any>([]);
|
2024-11-14 13:43:41 +08:00
|
|
|
|
2025-01-08 11:28:29 +08:00
|
|
|
const emit = defineEmits(['success', 'register', 'ocrClick']);
|
2024-12-27 13:50:13 +08:00
|
|
|
const isUpdate = ref(true);
|
2025-05-08 11:37:08 +08:00
|
|
|
const importDisabled = ref(true);
|
2024-12-27 13:50:13 +08:00
|
|
|
const entity = ref();
|
2024-11-14 13:43:41 +08:00
|
|
|
|
2025-05-08 11:37:08 +08:00
|
|
|
const [registerForm, { resetFields, setFieldsValue, validate, getFieldsValue, updateSchema }] = useForm({
|
2024-12-27 13:50:13 +08:00
|
|
|
labelWidth: 120,
|
|
|
|
schemas: formSchema,
|
|
|
|
showActionButtonGroup: false,
|
|
|
|
});
|
|
|
|
|
|
|
|
const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
|
|
|
|
await resetFields();
|
2025-05-08 11:37:08 +08:00
|
|
|
setDrawerProps({confirmLoading: false});
|
2024-12-27 13:50:13 +08:00
|
|
|
isUpdate.value = !!data?.isUpdate;
|
|
|
|
entity.value = data?.record;
|
2025-01-03 11:19:45 +08:00
|
|
|
paramData.value = [];
|
|
|
|
const items = entity.value && entity.value.paramJson ? JSON.parse(entity.value.paramJson) : [];
|
2025-04-23 15:24:05 +08:00
|
|
|
items.forEach((d: any, index: number) => {
|
|
|
|
if (Object.keys(d).includes('sn')) {
|
|
|
|
paramData.value.push({...d});
|
|
|
|
} else {
|
2025-05-08 11:37:08 +08:00
|
|
|
paramData.value.push({sn: (index + 1) + '', ...d});
|
2025-04-23 15:24:05 +08:00
|
|
|
}
|
2025-01-03 11:19:45 +08:00
|
|
|
});
|
2024-12-27 13:50:13 +08:00
|
|
|
await setFieldsValue({
|
|
|
|
...data.record,
|
2024-11-14 13:43:41 +08:00
|
|
|
});
|
2025-05-08 11:37:08 +08:00
|
|
|
await updateSchema([
|
|
|
|
{
|
|
|
|
field: 'wallType',
|
|
|
|
componentProps: {
|
|
|
|
disabled: unref(isUpdate)
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
field: 'direction',
|
|
|
|
componentProps: {
|
|
|
|
disabled: unref(isUpdate)
|
|
|
|
}
|
|
|
|
}]);
|
|
|
|
handleValuesChanged();
|
2024-12-27 13:50:13 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
const [registerTable] = useTable({
|
|
|
|
title: '预埋件列表',
|
|
|
|
columns,
|
|
|
|
dataSource: paramData,
|
|
|
|
useSearchForm: false,
|
|
|
|
showTableSetting: false,
|
|
|
|
bordered: true,
|
|
|
|
showIndexColumn: false,
|
|
|
|
canResize: false,
|
|
|
|
pagination: false,
|
|
|
|
rowKey: (record: any) => record.code,
|
|
|
|
actionColumn: {
|
2025-02-18 17:18:44 +08:00
|
|
|
width: 140,
|
2024-12-27 13:50:13 +08:00
|
|
|
title: '操作',
|
|
|
|
dataIndex: 'action',
|
|
|
|
fixed: undefined,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
const getTitle = computed(() => (!unref(isUpdate) ? '新增' : '编辑'));
|
2024-11-14 13:43:41 +08:00
|
|
|
|
2024-12-27 13:50:13 +08:00
|
|
|
async function handleSubmit() {
|
2025-01-08 11:28:29 +08:00
|
|
|
const values = await validate();
|
|
|
|
setDrawerProps({confirmLoading: true});
|
|
|
|
const {
|
|
|
|
...rest
|
|
|
|
} = values;
|
|
|
|
const action = !unref(isUpdate) ? TaskApi.add : TaskApi.update;
|
|
|
|
const data = !unref(isUpdate)
|
|
|
|
? {
|
|
|
|
...rest,
|
|
|
|
}
|
|
|
|
: Object.assign({},
|
|
|
|
{
|
|
|
|
...unref(entity),
|
|
|
|
...rest,
|
|
|
|
},
|
|
|
|
);
|
|
|
|
let p: any = [];
|
|
|
|
paramData.value.forEach((d: any) => {
|
2025-05-08 11:37:08 +08:00
|
|
|
// 添加 墙体类型 方向(正面、背面) 堆芯坐标
|
|
|
|
d.wallType = data.wallType;
|
|
|
|
d.direction = data.direction;
|
|
|
|
d.coreA = data.coreA;
|
|
|
|
d.coreB = data.coreB;
|
|
|
|
p.push({ ...d });
|
2025-01-08 11:28:29 +08:00
|
|
|
});
|
|
|
|
data.paramJson = JSON.stringify(p);
|
|
|
|
await action(data);
|
|
|
|
closeDrawer();
|
|
|
|
emit('success');
|
|
|
|
setDrawerProps({confirmLoading: false});
|
2025-01-03 11:19:45 +08:00
|
|
|
}
|
2024-11-14 13:43:41 +08:00
|
|
|
|
2024-12-27 13:50:13 +08:00
|
|
|
const handleCreate = () => {
|
|
|
|
openModal(true, { isUpdate: false });
|
|
|
|
};
|
|
|
|
|
2025-01-03 11:19:45 +08:00
|
|
|
const handleEdit = (record: Recordable, index: number) => {
|
|
|
|
openModal(true, { record, isUpdate: true });
|
2024-12-27 13:50:13 +08:00
|
|
|
};
|
2024-11-14 13:43:41 +08:00
|
|
|
|
2024-12-27 13:50:13 +08:00
|
|
|
const handleDelete = (record: Recordable) => {
|
2025-04-23 14:49:49 +08:00
|
|
|
paramData.value = paramData.value.filter((d: any) => d.code !== record.code);
|
2024-12-27 13:50:13 +08:00
|
|
|
};
|
2024-11-14 13:43:41 +08:00
|
|
|
|
2024-12-27 13:50:13 +08:00
|
|
|
const handleOpenFileDialog = () => {
|
2025-01-08 11:28:29 +08:00
|
|
|
const rest = getFieldsValue();
|
|
|
|
const data = !unref(isUpdate)
|
|
|
|
? {
|
|
|
|
...rest,
|
|
|
|
}
|
|
|
|
: Object.assign({},
|
|
|
|
{
|
|
|
|
...unref(entity),
|
|
|
|
...rest,
|
|
|
|
},
|
|
|
|
);
|
|
|
|
emit("ocrClick", data);
|
2024-12-27 13:50:13 +08:00
|
|
|
};
|
|
|
|
|
2025-05-08 11:37:08 +08:00
|
|
|
const handleImport = () => {
|
|
|
|
WebViewService.importExcel().then((res: any) => {
|
|
|
|
const data = getFieldsValue();
|
|
|
|
if (res === "") {
|
|
|
|
WebViewService.setMessage('没有预埋件数据!', 'information').then(() => {});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const items = JSON.parse(res);
|
|
|
|
if (items.length === 0) {
|
|
|
|
WebViewService.setMessage('没有预埋件数据!', 'information').then(() => {});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (!paramData.value) {
|
|
|
|
paramData.value = [];
|
|
|
|
}
|
|
|
|
items.forEach((d: any) => {
|
|
|
|
if (d.wallType.toUpperCase() === data.wallType && d.direction === data.direction) {
|
|
|
|
const items = paramData.value.filter((p: any) => p.code === d.code);
|
|
|
|
// if (data.wallType === "B类") {
|
|
|
|
// const nX: any = d["y"];
|
|
|
|
// const nY: any = d["x"];
|
|
|
|
// d.x = nX;
|
|
|
|
// d.y = nY;
|
|
|
|
// }
|
|
|
|
if (items.length === 0) {
|
|
|
|
paramData.value.push({...d});
|
|
|
|
} else {
|
|
|
|
items[0] = {...d};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
WebViewService.setMessage('数据导入成功!', "success").then(() => {});
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2025-04-23 17:00:27 +08:00
|
|
|
const handleDeleteAll = (e: MouseEvent) => {
|
|
|
|
paramData.value = [];
|
|
|
|
};
|
|
|
|
|
2025-01-08 11:28:29 +08:00
|
|
|
const updateParamData = async (data: any) => {
|
2025-04-23 14:49:49 +08:00
|
|
|
paramData.value.forEach((d: any, index: number) => {
|
|
|
|
if (d["code"] === data["code"]) {
|
|
|
|
paramData.value[index] = { ...data };
|
|
|
|
}
|
|
|
|
});
|
2025-01-03 11:19:45 +08:00
|
|
|
}
|
2025-01-08 11:28:29 +08:00
|
|
|
|
2025-04-23 17:28:55 +08:00
|
|
|
const markField = computed(() => {
|
|
|
|
return (field: any, record: any) => {
|
2025-04-23 17:00:27 +08:00
|
|
|
let c = 0
|
|
|
|
paramData.value.forEach((d: any) => {
|
|
|
|
if (Number(d[field]) < 0) {
|
|
|
|
c += 1;
|
|
|
|
}
|
|
|
|
});
|
2025-04-23 17:28:55 +08:00
|
|
|
if (paramData.value.length - c < c) {
|
|
|
|
return Number(record[field]) > 0
|
|
|
|
} else {
|
|
|
|
return Number(record[field]) < 0
|
|
|
|
}
|
2025-04-23 17:00:27 +08:00
|
|
|
};
|
|
|
|
});
|
|
|
|
|
2025-05-08 11:37:08 +08:00
|
|
|
const handleValuesChanged = () => {
|
|
|
|
const data = getFieldsValue();
|
|
|
|
importDisabled.value = data.wallType === undefined || data.direction === undefined;
|
|
|
|
};
|
|
|
|
|
|
|
|
const setParamData = (data: any) => {
|
|
|
|
const items = handleParamData(data);
|
|
|
|
if (!paramData.value)
|
|
|
|
paramData.value = [];
|
|
|
|
items.forEach((d: any) => {
|
|
|
|
if (d.hasOwnProperty("zm")) {
|
|
|
|
delete d.zm;
|
|
|
|
}
|
|
|
|
if (d.hasOwnProperty("nX")) {
|
|
|
|
delete d.nX;
|
|
|
|
}
|
|
|
|
if (d.hasOwnProperty("nY")) {
|
|
|
|
delete d.nY;
|
|
|
|
}
|
|
|
|
const items = paramData.value.filter((p: any) => p.code === d.code);
|
|
|
|
if (items.length === 0) {
|
|
|
|
paramData.value.push({...d});
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
items[0] = {...d};
|
|
|
|
}
|
|
|
|
});
|
|
|
|
WebViewService.setMessage('数据导入成功!', "success").then(() => {});
|
|
|
|
};
|
|
|
|
|
|
|
|
const handleParamData = (items: any) => {
|
|
|
|
const data = getFieldsValue();
|
|
|
|
const wallType = data.wallType;
|
|
|
|
const direction = data.direction;
|
|
|
|
// x去重
|
|
|
|
const uniqueListX = Array.from(new Map(items.map((item: any) => [item.x, item])).values());
|
|
|
|
// y去重
|
|
|
|
const uniqueListY = Array.from(new Map(items.map((item: any) => [item.y, item])).values());
|
|
|
|
// 墙体类型为 B
|
|
|
|
items.forEach((d: any) => {
|
|
|
|
if (wallType === "B类" && uniqueListX.length <= 3 && uniqueListY.length > 3) {
|
|
|
|
const nX: any = d["y"];
|
|
|
|
const nY: any = d["x"];
|
|
|
|
d.nX = nX;
|
|
|
|
d.nY = nY;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
// 判断正面、背面
|
|
|
|
const uniqueY = Array.from(new Map(items.map((item: any) => [item.nY, item])).values());
|
|
|
|
const maxY = Math.max(...uniqueY.map((item: any) => Number(item.nY)));
|
|
|
|
const minY = Math.min(...uniqueY.map((item: any) => Number(item.nY)));
|
|
|
|
items.forEach((d: any) => {
|
|
|
|
if (Number(d.nY) === minY) {
|
|
|
|
d.zm = 1;
|
|
|
|
} else if (Number(d.nY) === maxY) {
|
|
|
|
d.zm = 0;
|
|
|
|
} else if (maxY - Number(d.nY) < Number(d.nY) - minY) {
|
|
|
|
d.zm = 0;
|
|
|
|
} else {
|
|
|
|
d.zm = 1;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return direction === "正面" ? items.filter((d: any) => { return d.zm === 1 }).map((d: any) => ({...d})) : items.filter((d: any) => { return d.zm === 0 }).map((d: any) => ({...d}));
|
|
|
|
}
|
|
|
|
|
2025-01-08 11:28:29 +08:00
|
|
|
defineExpose({
|
|
|
|
setParamData
|
|
|
|
});
|
|
|
|
|
2024-11-14 13:43:41 +08:00
|
|
|
</script>
|
2024-11-19 09:55:07 +08:00
|
|
|
<style lang="scss" scoped>
|
|
|
|
@use '@/assets/custom.scss';
|
|
|
|
</style>
|