From 5c292912fe3e9db28f85e4f882cf193692048bf9 Mon Sep 17 00:00:00 2001
From: huangchenhao <123673748@qq.com>
Date: Tue, 4 Nov 2025 10:13:02 +0800
Subject: [PATCH] =?UTF-8?q?=E5=85=BB=E6=8A=A4=E7=AB=99=E7=89=A9=E8=B5=84?=
=?UTF-8?q?=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/screen/src/router/index.js | 5 +
.../views/EquipmentManagement/addDialog.vue | 166 +++----
.../src/views/EquipmentManagement/index.js | 8 +-
.../views/MaterialManagement/addDialog.vue | 66 +++
.../views/MaterialManagement/detailDialog.vue | 57 +++
.../views/MaterialManagement/editDialog.vue | 66 +++
.../src/views/MaterialManagement/index.js | 421 ++++++++++++++++++
.../src/views/MaterialManagement/index.vue | 152 +++++++
8 files changed, 857 insertions(+), 84 deletions(-)
create mode 100644 packages/screen/src/views/MaterialManagement/addDialog.vue
create mode 100644 packages/screen/src/views/MaterialManagement/detailDialog.vue
create mode 100644 packages/screen/src/views/MaterialManagement/editDialog.vue
create mode 100644 packages/screen/src/views/MaterialManagement/index.js
create mode 100644 packages/screen/src/views/MaterialManagement/index.vue
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