diff --git a/packages/screen/src/router/index.js b/packages/screen/src/router/index.js index c6edabc..abe5d97 100644 --- a/packages/screen/src/router/index.js +++ b/packages/screen/src/router/index.js @@ -21,6 +21,11 @@ const routes = [ path: '/yhzsb', name: 'yhzsb', component: () => import('../views/EquipmentManagement/index.vue') + }, + { + path: '/yhzwz', + name: 'yhzwz', + component: () => import('../views/MaterialManagement/index.vue') } ] diff --git a/packages/screen/src/views/EquipmentManagement/addDialog.vue b/packages/screen/src/views/EquipmentManagement/addDialog.vue index 77dc523..67e142b 100644 --- a/packages/screen/src/views/EquipmentManagement/addDialog.vue +++ b/packages/screen/src/views/EquipmentManagement/addDialog.vue @@ -1,88 +1,88 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +import { ref } from "vue"; + +const props = defineProps({ + detailData: { + type: Object, + default: () => ({}), + }, + form: { + type: Object, + default: () => ({}), + }, +}); + \ No newline at end of file + \ No newline at end of file diff --git a/packages/screen/src/views/EquipmentManagement/index.js b/packages/screen/src/views/EquipmentManagement/index.js index b1f4d96..b6ebf80 100644 --- a/packages/screen/src/views/EquipmentManagement/index.js +++ b/packages/screen/src/views/EquipmentManagement/index.js @@ -121,7 +121,13 @@ const getTreeData = async () => { } }; // 处理节点点击事件 -const handleNodeClick = (data) => { +const handleNodeClick = (data, node) => { + if (node.expanded === false) { + console.log('树节点关闭', node.expanded) + yhzid.value = ''; // 重置养护站id + qxmc.value = ''; // 重置区县名称 + return; + } if (data.type === 'area') { console.log('你点击的是区县', data.id) yhzid.value = ''; // 重置养护站id diff --git a/packages/screen/src/views/MaterialManagement/addDialog.vue b/packages/screen/src/views/MaterialManagement/addDialog.vue new file mode 100644 index 0000000..a0e9a75 --- /dev/null +++ b/packages/screen/src/views/MaterialManagement/addDialog.vue @@ -0,0 +1,66 @@ + + + + + \ No newline at end of file diff --git a/packages/screen/src/views/MaterialManagement/detailDialog.vue b/packages/screen/src/views/MaterialManagement/detailDialog.vue new file mode 100644 index 0000000..f6c1851 --- /dev/null +++ b/packages/screen/src/views/MaterialManagement/detailDialog.vue @@ -0,0 +1,57 @@ + + + + + \ No newline at end of file diff --git a/packages/screen/src/views/MaterialManagement/editDialog.vue b/packages/screen/src/views/MaterialManagement/editDialog.vue new file mode 100644 index 0000000..5b9dfb8 --- /dev/null +++ b/packages/screen/src/views/MaterialManagement/editDialog.vue @@ -0,0 +1,66 @@ + + + + + \ No newline at end of file diff --git a/packages/screen/src/views/MaterialManagement/index.js b/packages/screen/src/views/MaterialManagement/index.js new file mode 100644 index 0000000..a1eaae3 --- /dev/null +++ b/packages/screen/src/views/MaterialManagement/index.js @@ -0,0 +1,421 @@ +import { h, ref, onMounted, reactive, watch, toRaw } from "vue"; +import { request } from "@/utils/request"; +import { Search } from "@element-plus/icons-vue"; +import DetailDialog from "./detailDialog.vue"; +import EditDialog from "./editDialog.vue"; +import AddDialog from "./addDialog.vue"; +import { th } from "element-plus/es/locales.mjs"; + +const treeData = ref([]); +const treeProps = { + children: "children", + label: "name", + key: "id", +} +const filterText = ref(''); // 树节点过滤条件 +const tableData = ref([]); +const qxmc = ref(''); // 区县名称 +const yhzid = ref(''); // 养护站id +const filterData = reactive({ + wzmc: '', +}); // 表格过滤条件 +const pagination = reactive({ + current: 1, + pageSize: 10, + total: 0, + pageSizes: [10, 20, 50], + layout: "prev, pager, next, jumper", + onChange: (page, pageSize) => { + pagination.current = page; + pagination.pageSize = pageSize; + getyhzwzList(qxmc.value, yhzid.value, filterData); + }, +}); // 表格分页 +const modelVisible = ref(false); // 弹窗显示状态 +const model = reactive({ + title: '', + content: null, + props: {}, + onCancel: null, + onConfirm: null, +}); // 弹窗内容 +const dialogType = ref(''); // 弹窗类型 +const dialogRef = ref(null); // 弹窗实例 + +const INIT_FORM = { + rid: "", + rkrq: "", + rkdw: "", + sl: "", + dw: "", + cfdd: "", + fzr: "", + lxdh: "", + ye: "", + qxmc: "", + wzmc: "", + fzrid: "", + yhzid: "", +}; // 表单初始值 +const form = reactive({ ...INIT_FORM }); // 表单 + + + +// 节点过滤函数 +const filterNode = (value, node) => { + const keyword = (value || '').toLowerCase(); + + const nodeData = node || {} + + // 处理区域节点匹配 + if (nodeData.type === 'area') { + return (nodeData.rawName || '').toLowerCase().includes(keyword) + } + + // 处理站点节点匹配 + if (nodeData.type === 'site') { + const parentData = node.parent?.data?.type === 'area' ? node.parent.data : {} + const parentMatch = (parentData.rawName || '').toLowerCase().includes(keyword) + return parentMatch || (nodeData.name || '').toLowerCase().includes(keyword) + } + + return false +} +// 获取养护站列表分组 +const getTreeData = async () => { + try { + const res = await request({ + url: '/api/yhz/listAreaGroup', + method: 'GET' + }) + if (res.code === '00000') { + treeData.value = Object.entries(res.data).map(([areaName, sites]) => ({ + id: areaName, + name: `${areaName}(${sites.length})`, + type: 'area', + children: sites.map(site => ({ + id: site.id, + name: site.mc, + type: 'site' + })), + rawName: areaName // 原始名称 + })); + console.log('treeData', toRaw(treeData.value)) + } else { + throw new Error(res.message); + } + } catch (error) { + ElMessage.error(error.message); + console.log(error); + } +}; +// 处理节点点击事件 +const handleNodeClick = (data, node) => { + if (node.expanded === false) { + console.log('树节点关闭', node.expanded) + yhzid.value = ''; // 重置养护站id + qxmc.value = ''; // 重置区县名称 + return; + } + if (data.type === 'area') { + console.log('你点击的是区县', data.id) + yhzid.value = ''; // 重置养护站id + qxmc.value = data.id; // 保存区县名称 + + } + if (data.type === 'site') { + console.log('你点击的是站点', data.name) + yhzid.value = data.id; // 保存养护站id + qxmc.value = ''; // 重置区县名称 + } +}; + +// 获取养护站物资列表 +const getyhzwzList = async (qxmc, yhzid, filterData) => { + try { + const data = { + qxmc: qxmc, + yhzid: yhzid, + wzmc: filterData?.wzmc || '', + pageNum: pagination.current, + pageSize: pagination.pageSize, + } + const res = await request({ + url: '/api/yjwz/list', + method: 'GET', + params: data, + }) + if (res.code === '00000') { + tableData.value = res.data.records; + pagination.total = res.data.total; + } else { + tableData.value = []; + pagination.total = 0; + throw new Error(res.message); + } + } catch (error) { + ElMessage.error(error.message); + console.log(error); + } +}; + +const columns = [ + { + prop: 'wzmc', + label: '物资名称', + }, + { + prop: 'ye', + label: '余量', + }, + { + prop: 'rkdw', + label: '入库单位', + }, + { + prop: 'rkrq', + label: '入库日期', + }, + { + prop: 'sl', + label: '数量', + }, + { + prop: 'dw', + label: '单位', + }, + { + prop: 'cfdd', + label: '存放地点', + }, + { + prop: 'fzr', + label: '负责人', + }, + { + prop: 'lxdh', + label: '联系电话', + }, + { + prop: 'qxmc', + label: '所属区县', + }, + { + label: "操作", + fixed: "right", + width: 150, + render: (row) => () => + h("div", { class: "action-btns" }, [ + h( + ElButton, + { + type: "primary", + link: true, + onClick: async () => { + dialogType.value = 'detail' + await getDetailData(row); + }, + }, + () => "详情" + ), + h( + ElButton, + { + type: "primary", + link: true, + onClick: async () => { + dialogType.value = 'edit' + await getDetailData(row); + }, + }, + () => "编辑" + ), + h( + ElButton, + { + type: "danger", + link: true, + onClick: async () => { + try { + await ElMessageBox.confirm("确定要删除该设备吗?", "删除确认", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning", + }); + const res = await request({ + url: `/api/yjsb/${row.rid}`, + method: 'DELETE', + }); + if (res.code === '00000') { + ElMessage.success('删除成功'); + getyhzwzList(qxmc.value, yhzid.value, filterData); + } else { + throw new Error(res.message); + } + } catch (error) { + ElMessage.error(error.message); + console.log(error); + } + }, + }, + () => "删除" + ), + + ]), + }, +] + +const handleEdit = async () => { + try { + await dialogRef?.value?.dynamicComponentRef?.formRef.validate(); + console.log('form', toRaw(form)) + const res = await request({ + url: '/api/yjsb', + method: 'PUT', + data: toRaw(form), + }); + if (res.code === '00000') { + ElMessage.success('编辑成功'); + dialogType.value = ''; + modelVisible.value = false; + getyhzwzList(qxmc.value, yhzid.value, filterData); + } else { + throw new Error(res.message); + } + } catch (error) { + ElMessage.error(error.message); + console.log('error', error) + } +}; + +// 获取养护站物资详情 +const getDetailData = async (row) => { + try { + const res = await request({ + url: `/api/yjwz/${row.rid}`, + method: 'GET', + }); + if (!res || res.code !== '00000') { + throw new Error('获取物资详情失败') + } + if (res.code === '00000') { + if (dialogType.value === 'detail') { + model.title = `物资详情`; + model.content = DetailDialog; + model.props = { + detailData: res.data, + }; + model.onCancel = () => { + dialogType.value = ''; + modelVisible.value = false; + }; + model.onConfirm = () => { + dialogType.value = ''; + modelVisible.value = false; + }; + modelVisible.value = true; + } + if (dialogType.value === 'edit') { + model.title = `编辑物资`; + model.content = EditDialog; + Object.assign(form, res.data); + model.props = { + detailData: res.data, + form: form, + }; + model.onCancel = () => { + dialogType.value = ''; + modelVisible.value = false; + }; + model.onConfirm = async () => { + await handleEdit(); + }; + modelVisible.value = true; + } + + } + else { + throw new Error(res.message); + } + } catch (error) { + ElMessage.error(error.message); + console.log(error); + } +}; + +// 打开新增物资弹窗 +const openAddModel = () => { + model.title = `新增物资`; + model.content = AddDialog; + Object.assign(form, INIT_FORM); + model.props = { + detailData: {}, + form: form, + }; + model.onCancel = () => { + dialogType.value = ''; + modelVisible.value = false; + }; + model.onConfirm = async () => { + try { + console.log('form', toRaw(form)) + const res = await request({ + url: '/api/yjwz', + method: 'POST', + data: toRaw(form), + }); + if (res.code === '00000') { + ElMessage.success('新增成功'); + dialogType.value = ''; + modelVisible.value = false; + getyhzwzList(qxmc.value, yhzid.value, filterData); + } else { + throw new Error(res.message); + } + } catch (error) { + ElMessage.error(error.message); + console.log('error', error) + } + }; + modelVisible.value = true; +} + + +export default () => { + + const treeRef = ref(null); + watch(() => filterText.value, (val) => { + treeRef.value.filter(val || '') + }) + + watch( + [() => filterData, qxmc, yhzid], + ([newFilterData, newQxmc, newYhzid]) => { + getyhzwzList(newQxmc, newYhzid, newFilterData) + }, + { deep: true } + ) + + + onMounted(() => { + getTreeData(); + getyhzwzList(); + }); + return { + treeRef, + treeData, + treeProps, + filterText, + filterNode, + handleNodeClick, + + tableData, + filterData, + pagination, + columns, + modelVisible, + dialogRef, + model, + openAddModel, + } +} \ No newline at end of file diff --git a/packages/screen/src/views/MaterialManagement/index.vue b/packages/screen/src/views/MaterialManagement/index.vue new file mode 100644 index 0000000..cfe5ad1 --- /dev/null +++ b/packages/screen/src/views/MaterialManagement/index.vue @@ -0,0 +1,152 @@ + + + + \ No newline at end of file