| | |
| | | class="search-text" |
| | | :placeholder="searchPlaceholder" |
| | | v-model="queryParams.searchAll" |
| | | @change="search" |
| | | clearable |
| | | /> |
| | | </view> |
| | |
| | | </view> |
| | | |
| | | <!-- 标签页 --> |
| | | <view class="tabs-section"> |
| | | <!-- <view class="tabs-section"> |
| | | <u-tabs |
| | | :list="tabs" |
| | | :current="activeTabIndex" |
| | |
| | | fontWeight: 'bold' |
| | | }" |
| | | /> |
| | | </view> |
| | | </view> --> |
| | | |
| | | <!-- 列表区域 --> |
| | | <scroll-view |
| | |
| | | |
| | | <view class="item-details"> |
| | | <!-- 设备列表页面 --> |
| | | <template v-if="activeTab === 'management'"> |
| | | <!-- <template v-if="activeTab === 'management'"> --> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">设备名称</text> |
| | | <text class="detail-value">{{ item.equipmentName || '-' }}</text> |
| | |
| | | <text class="detail-label">采购价格</text> |
| | | <text class="detail-value">{{ item.purchasePrice ? `¥${item.purchasePrice}` : '-' }}</text> |
| | | </view> |
| | | </template> |
| | | <!-- </template> --> |
| | | |
| | | <!-- 设备领用页面 --> |
| | | <template v-else-if="activeTab === 'equipmentRequisition'"> |
| | | <!-- <template v-else-if="activeTab === 'equipmentRequisition'"> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">领用人</text> |
| | | <text class="detail-value">{{ item.userName || '-' }}</text> |
| | |
| | | <text class="detail-label">备注</text> |
| | | <text class="detail-value">{{ item.remarks }}</text> |
| | | </view> |
| | | </template> |
| | | </template> --> |
| | | </view> |
| | | |
| | | <!-- 操作按钮 - 只在设备领用页面显示 --> |
| | | <template v-if="activeTab === 'equipmentRequisition'"> |
| | | <!-- <template v-if="activeTab === 'equipmentRequisition'"> |
| | | <up-divider></up-divider> |
| | | <view class="action-buttons"> |
| | | <u-button |
| | |
| | | 归还 |
| | | </u-button> |
| | | </view> |
| | | </template> |
| | | </template> --> |
| | | </view> |
| | | </view> |
| | | </view> |
| | |
| | | </scroll-view> |
| | | |
| | | <!-- 浮动操作按钮 - 设备领用页面显示领用按钮 --> |
| | | <view |
| | | <!-- <view |
| | | v-if="activeTab === 'equipmentRequisition'" |
| | | class="fab-button" |
| | | @tap="handleAdd" |
| | | > |
| | | <up-icon name="plus" size="24" color="#ffffff"></up-icon> |
| | | </view> |
| | | </view> --> |
| | | |
| | | <!-- 弹窗组件 --> |
| | | <managementDialog |
| | | <!-- <managementDialog |
| | | v-if="activeTab == 'management'" |
| | | v-model:copyForm="copyForm" |
| | | v-model:managementFormDialog="manaDialog" |
| | | :addOrEdit="addOrEdit" |
| | | :form="form" |
| | | @submit="getList" |
| | | /> |
| | | <EquipmentRequisition |
| | | /> --> |
| | | <!-- <EquipmentRequisition |
| | | v-model="equipmentRequisitionDialog" |
| | | :formData="form" |
| | | :maxQuantity="getMaxQuantity()" |
| | | :addOrEdit="addOrEdit" |
| | | :equipmentStatus="form.equipmentStatus" |
| | | @submit="onEquipmentRequisitionSubmit" |
| | | /> |
| | | /> --> |
| | | |
| | | <!-- 查看详情弹窗 --> |
| | | <u-popup |
| | | <!-- <u-popup |
| | | v-model="dialogTableVisible" |
| | | :title="dialogTableTitle" |
| | | mode="center" |
| | |
| | | height="400px" |
| | | /> |
| | | </view> |
| | | </u-popup> |
| | | </u-popup> --> |
| | | </view> |
| | | </template> |
| | | |
| | |
| | | |
| | | // 组件导入 |
| | | import PageHeader from "@/components/PageHeader.vue"; |
| | | import managementDialog from "./mould/managementDialog.vue"; |
| | | import EquipmentRequisition from "./mould/equipmentRequisitionDialog.vue"; |
| | | // import managementDialog from "./mould/managementDialog.vue"; |
| | | // import EquipmentRequisition from "./mould/equipmentRequisitionDialog.vue"; |
| | | |
| | | // API 服务导入 |
| | | import { |
| | | getManagementList, |
| | | } from "@/api/equipment/management/index.js"; |
| | | import { getUsageRecordList, getUsageDetailList } from "@/api/equipment/requisition/index.js"; |
| | | // import { getUsageRecordList, getUsageDetailList } from "@/api/equipment/requisition/index.js"; |
| | | |
| | | // 设备状态枚举 |
| | | const EQUIPMENT_STATUS = { |
| | |
| | | { prop: "purchasePrice", label: "采购价格", minWidth: 100 }, |
| | | ], |
| | | }, |
| | | equipmentRequisition: { |
| | | label: "设备领用", |
| | | searchPlaceholder: "设备编号/设备名称/规格型号", |
| | | showSearch: true, |
| | | api: getUsageRecordList, |
| | | columns: [ |
| | | { prop: "userName", label: "领用人", minWidth: 100 }, |
| | | { prop: "equipmentNo", label: "设备编号", minWidth: 100 }, |
| | | { prop: "equipmentName", label: "设备名称", minWidth: 100 }, |
| | | { prop: "usageQuantity", label: "领用数量", minWidth: 100 }, |
| | | {prop: "returnQuantity" , label: "归还数量", minWidth: 100, |
| | | formatter: (row) => row.returnQuantity || 0 |
| | | }, |
| | | { |
| | | prop: "equipmentStatus", |
| | | label: "使用状态", |
| | | minWidth: 100, |
| | | formatter: (row) => getStatusText(row.equipmentStatus), |
| | | cellStyle: (row) => ({ color: getStatusColor(row.equipmentStatus) }), |
| | | }, |
| | | { prop: "usageStartTime", label: "使用开始时间", minWidth: 100 }, |
| | | { prop: "usageEndTime", label: "使用结束时间", minWidth: 100 }, |
| | | { prop: "remarks", label: "备注", minWidth: 100 }, |
| | | ], |
| | | }, |
| | | // equipmentRequisition: { |
| | | // label: "设备领用", |
| | | // searchPlaceholder: "设备编号/设备名称/规格型号", |
| | | // showSearch: true, |
| | | // api: getUsageRecordList, |
| | | // columns: [ |
| | | // { prop: "userName", label: "领用人", minWidth: 100 }, |
| | | // { prop: "equipmentNo", label: "设备编号", minWidth: 100 }, |
| | | // { prop: "equipmentName", label: "设备名称", minWidth: 100 }, |
| | | // { prop: "usageQuantity", label: "领用数量", minWidth: 100 }, |
| | | // {prop: "returnQuantity" , label: "归还数量", minWidth: 100, |
| | | // formatter: (row) => row.returnQuantity || 0 |
| | | // }, |
| | | // { |
| | | // prop: "equipmentStatus", |
| | | // label: "使用状态", |
| | | // minWidth: 100, |
| | | // formatter: (row) => getStatusText(row.equipmentStatus), |
| | | // cellStyle: (row) => ({ color: getStatusColor(row.equipmentStatus) }), |
| | | // }, |
| | | // { prop: "usageStartTime", label: "使用开始时间", minWidth: 100 }, |
| | | // { prop: "usageEndTime", label: "使用结束时间", minWidth: 100 }, |
| | | // { prop: "remarks", label: "备注", minWidth: 100 }, |
| | | // ], |
| | | // }, |
| | | }; |
| | | |
| | | // 标签页数据 - u-tabs需要name作为显示文本 |
| | | const tabs = computed(() => |
| | | Object.entries(tabsConfig).map(([name, config]) => ({ |
| | | name: config.label, // 使用label作为显示文本 |
| | | value: name, // 保存原始name值 |
| | | })) |
| | | ); |
| | | // const tabs = computed(() => |
| | | // Object.entries(tabsConfig).map(([name, config]) => ({ |
| | | // name: config.label, // 使用label作为显示文本 |
| | | // value: name, // 保存原始name值 |
| | | // })) |
| | | // ); |
| | | const tabs = computed(() => [ |
| | | { |
| | | name: tabsConfig.management.label, |
| | | value: 'management' |
| | | } |
| | | ]); |
| | | |
| | | // 当前标签页索引 - 使用ref而不是computed,确保响应式更新 |
| | | const activeTabIndex = ref(0); |
| | |
| | | ); |
| | | |
| | | // 判断是否显示归还按钮 |
| | | const shouldShowReturnButton = (item) => { |
| | | if (activeTab.value !== 'equipmentRequisition') { |
| | | return false; |
| | | } |
| | | // 如果设备状态是已归还,不显示归还按钮 |
| | | if (item.equipmentStatus === EQUIPMENT_STATUS.RETURNED) { |
| | | return false; |
| | | } |
| | | // 其他状态都显示归还按钮(使用中、部分归还、或者没有状态) |
| | | return true; |
| | | }; |
| | | // const shouldShowReturnButton = (item) => { |
| | | // if (activeTab.value !== 'equipmentRequisition') { |
| | | // return false; |
| | | // } |
| | | // // 如果设备状态是已归还,不显示归还按钮 |
| | | // if (item.equipmentStatus === EQUIPMENT_STATUS.RETURNED) { |
| | | // return false; |
| | | // } |
| | | // // 其他状态都显示归还按钮(使用中、部分归还、或者没有状态) |
| | | // return true; |
| | | // }; |
| | | |
| | | // 动态获取自定义按钮配置(保留用于其他用途) |
| | | const getCustomButtons = () => { |
| | | const buttons = []; |
| | | |
| | | // 在设备领用页面添加归还按钮 |
| | | if (activeTab.value === 'equipmentRequisition') { |
| | | buttons.push({ |
| | | name: 'return', |
| | | label: '归还', |
| | | type: 'success', |
| | | size: 'small', |
| | | link: true, |
| | | show: (row) => shouldShowReturnButton(row), |
| | | disabled: (row) => row.equipmentStatus === EQUIPMENT_STATUS.RETURNED, |
| | | }); |
| | | } |
| | | |
| | | return buttons; |
| | | }; |
| | | // const getCustomButtons = () => { |
| | | // const buttons = []; |
| | | // |
| | | // // 在设备领用页面添加归还按钮 |
| | | // if (activeTab.value === 'equipmentRequisition') { |
| | | // buttons.push({ |
| | | // name: 'return', |
| | | // label: '归还', |
| | | // type: 'success', |
| | | // size: 'small', |
| | | // link: true, |
| | | // show: (row) => shouldShowReturnButton(row), |
| | | // disabled: (row) => row.equipmentStatus === EQUIPMENT_STATUS.RETURNED, |
| | | // }); |
| | | // } |
| | | // |
| | | // return buttons; |
| | | // }; |
| | | |
| | | // 处理自定义按钮点击事件 |
| | | const handleCustomButtonClick = ({ buttonName, row }) => { |
| | | switch (buttonName) { |
| | | case 'return': |
| | | handleReturn(row); |
| | | break; |
| | | // 可以在这里添加更多自定义按钮的处理逻辑 |
| | | default: |
| | | console.warn(`未处理的自定义按钮: ${buttonName}`); |
| | | } |
| | | }; |
| | | const handleReturn = (row) => { |
| | | // 检查设备状态 |
| | | if (row.equipmentStatus === EQUIPMENT_STATUS.RETURNED) { |
| | | showToast('该设备已归还完成,无需再次归还', 'warning'); |
| | | return; |
| | | } |
| | | |
| | | if (row.equipmentStatus !== EQUIPMENT_STATUS.USING && row.equipmentStatus !== EQUIPMENT_STATUS.PARTIAL_RETURN) { |
| | | showToast('该设备当前状态不支持归还操作', 'warning'); |
| | | return; |
| | | } |
| | | |
| | | form.value = { ...row }; |
| | | addOrEdit.value = "return"; // 设置为归还模式 |
| | | title.value = `归还设备 - ${row.equipmentName || ''}`; |
| | | copyForm.value = { ...row }; |
| | | equipmentRequisitionDialog.value = true; |
| | | console.log("归还设备:", row); |
| | | }; |
| | | // const handleCustomButtonClick = ({ buttonName, row }) => { |
| | | // switch (buttonName) { |
| | | // case 'return': |
| | | // handleReturn(row); |
| | | // break; |
| | | // // 可以在这里添加更多自定义按钮的处理逻辑 |
| | | // default: |
| | | // console.warn(`未处理的自定义按钮: ${buttonName}`); |
| | | // } |
| | | // }; |
| | | // const handleReturn = (row) => { |
| | | // // 检查设备状态 |
| | | // if (row.equipmentStatus === EQUIPMENT_STATUS.RETURNED) { |
| | | // showToast('该设备已归还完成,无需再次归还', 'warning'); |
| | | // return; |
| | | // } |
| | | // |
| | | // if (row.equipmentStatus !== EQUIPMENT_STATUS.USING && row.equipmentStatus !== EQUIPMENT_STATUS.PARTIAL_RETURN) { |
| | | // showToast('该设备当前状态不支持归还操作', 'warning'); |
| | | // return; |
| | | // } |
| | | // |
| | | // form.value = { ...row }; |
| | | // addOrEdit.value = "return"; // 设置为归还模式 |
| | | // title.value = `归还设备 - ${row.equipmentName || ''}`; |
| | | // copyForm.value = { ...row }; |
| | | // equipmentRequisitionDialog.value = true; |
| | | // console.log("归还设备:", row); |
| | | // }; |
| | | // 标签页切换处理 - u-tabs的@change事件传递的是对象 { index: number } |
| | | const handleTabChange = (e) => { |
| | | const index = typeof e === 'object' && e.index !== undefined ? e.index : e; |
| | |
| | | }; |
| | | |
| | | // 处理新增领用 |
| | | const handleAdd = () => { |
| | | console.log('handleAdd 被调用', 'activeTab:', activeTab.value, 'activeTabIndex:', activeTabIndex.value); |
| | | addOrEdit.value = "add"; |
| | | form.value = {}; |
| | | title.value = `新增${currentTabConfig.value?.label || '设备领用'}`; |
| | | copyForm.value = {}; |
| | | console.log('准备打开弹窗,equipmentRequisitionDialog当前值:', equipmentRequisitionDialog.value); |
| | | equipmentRequisitionDialog.value = true; |
| | | console.log('弹窗已打开,equipmentRequisitionDialog新值:', equipmentRequisitionDialog.value); |
| | | }; |
| | | // const handleAdd = () => { |
| | | // console.log('handleAdd 被调用', 'activeTab:', activeTab.value, 'activeTabIndex:', activeTabIndex.value); |
| | | // addOrEdit.value = "add"; |
| | | // form.value = {}; |
| | | // title.value = `新增${currentTabConfig.value?.label || '设备领用'}`; |
| | | // copyForm.value = {}; |
| | | // console.log('准备打开弹窗,equipmentRequisitionDialog当前值:', equipmentRequisitionDialog.value); |
| | | // equipmentRequisitionDialog.value = true; |
| | | // console.log('弹窗已打开,equipmentRequisitionDialog新值:', equipmentRequisitionDialog.value); |
| | | // }; |
| | | |
| | | const handleView = async (row) => { |
| | | // 只处理设备领用页面的查看功能 |
| | | if (activeTab.value === 'equipmentRequisition') { |
| | | try { |
| | | dialogTableTitle.value = `${row.equipmentName || '设备'} - 操作记录详情`; |
| | | |
| | | // 显示加载状态 |
| | | dialogTableVisible.value = true; |
| | | dialogTableData.value = []; |
| | | |
| | | // 调用详情接口获取数据 |
| | | const { data, code } = await getUsageDetailList(row.id); |
| | | if (code === 200 && data) { |
| | | // 处理数组数据,直接显示操作记录列表 |
| | | if (Array.isArray(data)) { |
| | | dialogTableData.value = data; |
| | | dialogTableColumns.value = [ |
| | | { prop: 'equipmentNo', label: '设备编号', minWidth: 100 }, |
| | | { prop: 'equipmentName', label: '设备名称', minWidth: 120 }, |
| | | { prop: 'specification', label: '规格型号', minWidth: 100 }, |
| | | { |
| | | prop: 'operationType', |
| | | label: '操作类型', |
| | | minWidth: 80, |
| | | formatter: (row) => row.operationType === 1 ? '领用' : '归还' |
| | | }, |
| | | { prop: 'quantity', label: '操作数量', minWidth: 80 }, |
| | | { prop: 'operator', label: '操作人', minWidth: 80 }, |
| | | { prop: 'remark', label: '备注', minWidth: 150, showOverflowTooltip: true }, |
| | | { prop: 'createTime', label: '操作时间', minWidth: 150 } |
| | | ]; |
| | | } else { |
| | | showToast('暂无操作记录', 'warning'); |
| | | } |
| | | } else { |
| | | showToast('获取详情数据失败', 'error'); |
| | | dialogTableVisible.value = false; |
| | | } |
| | | |
| | | } catch (error) { |
| | | console.error('获取详情失败:', error); |
| | | showToast('获取详情数据失败', 'error'); |
| | | dialogTableVisible.value = false; |
| | | } |
| | | } |
| | | }; |
| | | // const handleView = async (row) => { |
| | | // // 只处理设备领用页面的查看功能 |
| | | // if (activeTab.value === 'equipmentRequisition') { |
| | | // try { |
| | | // dialogTableTitle.value = `${row.equipmentName || '设备'} - 操作记录详情`; |
| | | // |
| | | // // 显示加载状态 |
| | | // dialogTableVisible.value = true; |
| | | // dialogTableData.value = []; |
| | | // |
| | | // // 调用详情接口获取数据 |
| | | // const { data, code } = await getUsageDetailList(row.id); |
| | | // if (code === 200 && data) { |
| | | // // 处理数组数据,直接显示操作记录列表 |
| | | // if (Array.isArray(data)) { |
| | | // dialogTableData.value = data; |
| | | // dialogTableColumns.value = [ |
| | | // { prop: 'equipmentNo', label: '设备编号', minWidth: 100 }, |
| | | // { prop: 'equipmentName', label: '设备名称', minWidth: 120 }, |
| | | // { prop: 'specification', label: '规格型号', minWidth: 100 }, |
| | | // { |
| | | // prop: 'operationType', |
| | | // label: '操作类型', |
| | | // minWidth: 80, |
| | | // formatter: (row) => row.operationType === 1 ? '领用' : '归还' |
| | | // }, |
| | | // { prop: 'quantity', label: '操作数量', minWidth: 80 }, |
| | | // { prop: 'operator', label: '操作人', minWidth: 80 }, |
| | | // { prop: 'remark', label: '备注', minWidth: 150, showOverflowTooltip: true }, |
| | | // { prop: 'createTime', label: '操作时间', minWidth: 150 } |
| | | // ]; |
| | | // } else { |
| | | // showToast('暂无操作记录', 'warning'); |
| | | // } |
| | | // } else { |
| | | // showToast('获取详情数据失败', 'error'); |
| | | // dialogTableVisible.value = false; |
| | | // } |
| | | // |
| | | // } catch (error) { |
| | | // console.error('获取详情失败:', error); |
| | | // showToast('获取详情数据失败', 'error'); |
| | | // dialogTableVisible.value = false; |
| | | // } |
| | | // } |
| | | // }; |
| | | |
| | | // 下拉刷新 |
| | | const onRefresh = async () => { |
| | |
| | | }; |
| | | |
| | | // 获取设备最大可领用数量 |
| | | const getMaxQuantity = () => { |
| | | if (form.value.equipmentId) { |
| | | const equipment = tableData.value.find( |
| | | (item) => item.equipmentId === form.value.equipmentId |
| | | ); |
| | | return equipment ? equipment.quantity : null; |
| | | } |
| | | return null; |
| | | }; |
| | | // const getMaxQuantity = () => { |
| | | // if (form.value.equipmentId) { |
| | | // const equipment = tableData.value.find( |
| | | // (item) => item.equipmentId === form.value.equipmentId |
| | | // ); |
| | | // return equipment ? equipment.quantity : null; |
| | | // } |
| | | // return null; |
| | | // }; |
| | | |
| | | // 设备领用弹窗提交处理 |
| | | const onEquipmentRequisitionSubmit = (formData) => { |
| | | if (formData.equipmentStatus === EQUIPMENT_STATUS.RETURNED) { |
| | | showToast("设备已完全归还", 'success'); |
| | | } else if (formData.equipmentStatus === EQUIPMENT_STATUS.PARTIAL_RETURN) { |
| | | } else if (formData.equipmentStatus === EQUIPMENT_STATUS.USING) { |
| | | showToast("设备领用成功", 'success'); |
| | | } else { |
| | | showToast("操作成功", 'success'); |
| | | } |
| | | equipmentRequisitionDialog.value = false; |
| | | nextTick(() => { |
| | | form.value = {}; |
| | | getList(); |
| | | }); |
| | | }; |
| | | // const onEquipmentRequisitionSubmit = (formData) => { |
| | | // if (formData.equipmentStatus === EQUIPMENT_STATUS.RETURNED) { |
| | | // showToast("设备已完全归还", 'success'); |
| | | // } else if (formData.equipmentStatus === EQUIPMENT_STATUS.PARTIAL_RETURN) { |
| | | // } else if (formData.equipmentStatus === EQUIPMENT_STATUS.USING) { |
| | | // showToast("设备领用成功", 'success'); |
| | | // } else { |
| | | // showToast("操作成功", 'success'); |
| | | // } |
| | | // equipmentRequisitionDialog.value = false; |
| | | // nextTick(() => { |
| | | // form.value = {}; |
| | | // getList(); |
| | | // }); |
| | | // }; |
| | | |
| | | // 数据获取 |
| | | const getList = async () => { |