lipenghui преди 4 месеца
родител
ревизия
8e3a4e5afb

+ 49 - 0
src/api/pms/maintain/material/index.ts

@@ -0,0 +1,49 @@
+import request from '@/config/axios'
+
+// 工单物料 VO
+export interface IotMaintainMaterialVO {
+  id: number // 主键
+  code: string // 物料编码
+  name: string // 物料名称
+  unit: string // 单位
+  price: number // 单价
+  sourceType: string // 物料来源
+  depleteCount: number // 消耗数量
+  totalCount: number // 总库存数量
+  sapCode: string // SAP系统中的物料唯一编号
+  status: number // 状态 0启用  1停用
+  remark: string // 备注
+}
+
+// 工单物料 API
+export const IotMaintainMaterialApi = {
+  // 查询工单物料分页
+  getIotMaintainMaterialPage: async (params: any) => {
+    return await request.get({ url: `/rq/iot-maintain-material/page`, params })
+  },
+
+  // 查询工单物料详情
+  getIotMaintainMaterial: async (id: number) => {
+    return await request.get({ url: `/rq/iot-maintain-material/get?id=` + id })
+  },
+
+  // 新增工单物料
+  createIotMaintainMaterial: async (data: IotMaintainMaterialVO) => {
+    return await request.post({ url: `/rq/iot-maintain-material/create`, data })
+  },
+
+  // 修改工单物料
+  updateIotMaintainMaterial: async (data: IotMaintainMaterialVO) => {
+    return await request.put({ url: `/rq/iot-maintain-material/update`, data })
+  },
+
+  // 删除工单物料
+  deleteIotMaintainMaterial: async (id: number) => {
+    return await request.delete({ url: `/rq/iot-maintain-material/delete?id=` + id })
+  },
+
+  // 导出工单物料 Excel
+  exportIotMaintainMaterial: async (params) => {
+    return await request.download({ url: `/rq/iot-maintain-material/export-excel`, params })
+  },
+}

+ 3 - 0
src/api/system/user/index.ts

@@ -77,3 +77,6 @@ export const getSimpleUserList = (): Promise<UserVO[]> => {
 export const getDeptUsers = (id): Promise<UserVO[]> => {
   return request.get({ url: '/system/user/dept/users?userId=' + id })
 }
+export const getDeptUsersByDeptId = (id): Promise<UserVO[]> => {
+  return request.get({ url: '/system/user/dept/users/id?userId=' + id })
+}

+ 25 - 2
src/views/pms/maintain/IotMaintain.vue

@@ -90,6 +90,18 @@
             />
           </el-form-item>
         </el-col>
+        <el-col :span="6">
+          <el-form-item label="维修负责人" prop="maintainPerson">
+            <el-select v-model="formData.maintainPerson" filterable clearable style="width: 100%">
+              <el-option
+                v-for="item in deptUsers"
+                :key="item.id"
+                :label="item.nickname"
+                :value="item.id"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
         <el-col :span="6">
       <el-form-item label="故障影响" prop="failureInfluence">
         <el-input v-model="formData.failureInfluence" placeholder="请输入故障影响" />
@@ -143,6 +155,9 @@
       </div>
     </el-form>
   </ContentWrap>
+  <ContentWrap>
+    <MaintainMaterial />
+  </ContentWrap>
   <ContentWrap>
   <el-form>
     <el-form-item style="float: right">
@@ -155,8 +170,11 @@
 </template>
 <script setup lang="ts">
 import { IotMaintainApi, IotMaintainVO } from '@/api/pms/maintain'
-import {DICT_TYPE, getBoolDictOptions, getStrDictOptions} from "@/utils/dict";
+import {DICT_TYPE, getStrDictOptions} from "@/utils/dict";
 import DeviceList from "@/views/pms/failure/DeviceList.vue";
+import MaintainMaterial from "@/views/pms/maintain/material/index.vue";
+import * as UserApi from "@/api/system/user";
+import {useUserStore} from "@/store/modules/user";
 
 /** 维修工单 表单 */
 defineOptions({ name: 'IotMaintain' })
@@ -164,6 +182,7 @@ defineOptions({ name: 'IotMaintain' })
 const { t } = useI18n() // 国际化
 const message = useMessage() // 消息弹窗
 
+const deptUsers = ref<UserApi.UserVO[]>([]) // 用户列表
 const dialogVisible = ref(false) // 弹窗的是否展示
 const dialogTitle = ref('') // 弹窗的标题
 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
@@ -190,6 +209,7 @@ const formData = ref({
   processInstanceId: undefined,
   auditStatus: undefined,
   deptId: undefined,
+  maintainPerson: undefined,
 })
 const formRules = reactive({
   deviceName: [{ required: true, message: '设备不能为空', trigger: 'blur' }],
@@ -200,6 +220,7 @@ const formRules = reactive({
   failureTime: [{ required: true, message: '故障时间不能为空', trigger: 'blur' }],
   maintainStartTime: [{ required: true, message: '维修开始时间不能为空', trigger: 'blur' }],
   maintainDescription: [{ required: true, message: '维修描述不能为空', trigger: 'blur' }],
+  maintainPerson: [{ required: true, message: '维修负责人不能为空', trigger: 'blur' }],
   deviceId: [{ required: true, message: '设备id不能为空', trigger: 'blur' }],
   status: [{ required: true, message: '状态不能为空', trigger: 'blur' }],
 })
@@ -263,8 +284,10 @@ const resetForm = () => {
   }
   formRef.value?.resetFields()
 }
-onMounted(()=>{
+onMounted(async ()=>{
   formData.value.type = 'in'
+  const deptId = useUserStore().getUser.deptId
+  deptUsers.value = await UserApi.getDeptUsersByDeptId(deptId);
 })
 </script>
 <style scoped>

+ 140 - 0
src/views/pms/maintain/material/IotMaintainMaterialForm.vue

@@ -0,0 +1,140 @@
+<template>
+  <Dialog :title="dialogTitle" v-model="dialogVisible">
+    <el-form
+      ref="formRef"
+      :model="formData"
+      :rules="formRules"
+      label-width="100px"
+      v-loading="formLoading"
+    >
+      <el-form-item label="物料编码" prop="code">
+        <el-input v-model="formData.code" placeholder="请输入物料编码" />
+      </el-form-item>
+      <el-form-item label="物料名称" prop="name">
+        <el-input v-model="formData.name" placeholder="请输入物料名称" />
+      </el-form-item>
+      <el-form-item label="单位" prop="unit">
+        <el-input v-model="formData.unit" placeholder="请输入单位" />
+      </el-form-item>
+      <el-form-item label="单价" prop="price">
+        <el-input v-model="formData.price" placeholder="请输入单价" />
+      </el-form-item>
+      <el-form-item label="物料来源" prop="sourceType">
+        <el-select v-model="formData.sourceType" placeholder="请选择物料来源">
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item>
+<!--      <el-form-item label="消耗数量" prop="depleteCount">-->
+<!--        <el-input v-model="formData.depleteCount" placeholder="请输入消耗数量" />-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="总库存数量" prop="totalCount">-->
+<!--        <el-input v-model="formData.totalCount" placeholder="请输入总库存数量" />-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="SAP系统中的物料唯一编号" prop="sapCode">-->
+<!--        <el-input v-model="formData.sapCode" placeholder="请输入SAP系统中的物料唯一编号" />-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="状态 0启用  1停用" prop="status">-->
+<!--        <el-radio-group v-model="formData.status">-->
+<!--          <el-radio value="1">请选择字典生成</el-radio>-->
+<!--        </el-radio-group>-->
+<!--      </el-form-item>-->
+      <el-form-item label="备注" prop="remark">
+        <el-input v-model="formData.remark" placeholder="请输入备注" />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
+</template>
+<script setup lang="ts">
+import { IotMaintainMaterialApi, IotMaintainMaterialVO } from '@/api/pms/maintain/material'
+
+/** 工单物料 表单 */
+defineOptions({ name: 'IotMaintainMaterialForm' })
+
+const { t } = useI18n() // 国际化
+const message = useMessage() // 消息弹窗
+
+const dialogVisible = ref(false) // 弹窗的是否展示
+const dialogTitle = ref('') // 弹窗的标题
+const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+const formType = ref('') // 表单的类型:create - 新增;update - 修改
+const formData = ref({
+  id: undefined,
+  code: undefined,
+  name: undefined,
+  unit: undefined,
+  price: undefined,
+  sourceType: undefined,
+  depleteCount: undefined,
+  totalCount: undefined,
+  sapCode: undefined,
+  status: undefined,
+  remark: undefined,
+})
+const formRules = reactive({
+})
+const formRef = ref() // 表单 Ref
+
+/** 打开弹窗 */
+const open = async (type: string, id?: number) => {
+  dialogVisible.value = true
+  dialogTitle.value = t('action.' + type)
+  formType.value = type
+  resetForm()
+  // 修改时,设置数据
+  if (id) {
+    formLoading.value = true
+    try {
+      formData.value = await IotMaintainMaterialApi.getIotMaintainMaterial(id)
+    } finally {
+      formLoading.value = false
+    }
+  }
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+/** 提交表单 */
+const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
+const submitForm = async () => {
+  // 校验表单
+  await formRef.value.validate()
+  // 提交请求
+  formLoading.value = true
+  try {
+    const data = formData.value as unknown as IotMaintainMaterialVO
+    if (formType.value === 'create') {
+      await IotMaintainMaterialApi.createIotMaintainMaterial(data)
+      message.success(t('common.createSuccess'))
+    } else {
+      await IotMaintainMaterialApi.updateIotMaintainMaterial(data)
+      message.success(t('common.updateSuccess'))
+    }
+    dialogVisible.value = false
+    // 发送操作成功的事件
+    emit('success')
+  } finally {
+    formLoading.value = false
+  }
+}
+
+/** 重置表单 */
+const resetForm = () => {
+  formData.value = {
+    id: undefined,
+    code: undefined,
+    name: undefined,
+    unit: undefined,
+    price: undefined,
+    sourceType: undefined,
+    depleteCount: undefined,
+    totalCount: undefined,
+    sapCode: undefined,
+    status: undefined,
+    remark: undefined,
+  }
+  formRef.value?.resetFields()
+}
+</script>

+ 151 - 0
src/views/pms/maintain/material/MaintainMaterialDrawer.vue

@@ -0,0 +1,151 @@
+<template>
+  <el-drawer
+    title="新增物料"
+    :append-to-body="true"
+    :model-value="modelValue"
+    @update:model-value="$emit('update:modelValue', $event)"
+    :show-close="false"
+    direction="rtl"
+    :size="computedSize"
+    :before-close="handleClose"
+  >
+    <el-form
+      ref="drawerRef"
+      :model="drawerFormData"
+      :rules="formRules"
+      label-width="100px"
+      v-loading="formLoading"
+    >
+      <el-form-item label="物料主数据" prop="code1">
+        <el-select
+          v-model="drawerFormData.code1"
+          :model-value="materialLabel"
+          placeholder="请输入物料主数据"
+          @click="openForm"
+        />
+      </el-form-item>
+      <el-form-item label="消耗数量" prop="depleteCount1">
+        <el-input v-model="drawerFormData.depleteCount1" type="number" placeholder="请输入消耗数量" />
+      </el-form-item>
+      <el-form-item label="单位" prop="unit1">
+        <el-input v-model="drawerFormData.unit1" placeholder="请输入单位" />
+      </el-form-item>
+      <el-form-item label="单价" prop="price1">
+        <el-input v-model="drawerFormData.price1" placeholder="请输入单价" />
+      </el-form-item>
+      <el-form-item label="备注" prop="remark1">
+        <el-input v-model="drawerFormData.remark1" type="textarea" placeholder="请输入备注" />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
+      <el-button @click="handleClose">取 消</el-button>
+    </template>
+  </el-drawer>
+  <MaterialSelect ref="materialFormRef" @choose="materialChoose" />
+</template>
+<script setup lang="ts">
+import { defineEmits, defineOptions, ref, watch } from 'vue'
+import { ElMessage } from 'element-plus'
+import * as PmsMaterialApi from '@/api/pms/material'
+import {CommonStatusEnum} from "@/utils/constants";
+
+const drawerVisible = ref<boolean>(false)
+const emit = defineEmits(['update:modelValue', 'add'])
+const materialLabel = ref('') // 表单的类型:create - 新增;update - 修改
+defineOptions({
+  name: 'MaintainMaterialDrawer'
+})
+const materialChoose = (row) => {
+  drawerFormData.value.code1 = row.code
+  drawerFormData.value.name1 = row.name
+  materialLabel.value = row.name
+}
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  createTime: [],
+  bomId: '',
+  name: '',
+  code: ''
+})
+const drawerFormData = ref({
+  id: undefined,
+  code1: undefined,
+  name1: undefined,
+  unit1: undefined,
+  price1: undefined,
+  sourceType: undefined,
+  depleteCount1: undefined,
+  totalCount: undefined,
+  sapCode: undefined,
+  status1: undefined,
+  remark1: undefined
+})
+const resetDrawerForm = () => {
+  drawerFormData.value = {
+    id: undefined,
+    code1: undefined,
+    name: undefined,
+    unit: undefined,
+    price: undefined,
+    sourceType: undefined,
+    depleteCount: undefined,
+    totalCount: undefined,
+    sapCode: undefined,
+    status: undefined,
+    remark: undefined
+  }
+  drawerRef.value?.resetFields()
+}
+const formRules = reactive({
+  code1: [{ required: true, message: '物料编码不能为空', trigger: 'blur' }],
+  name1: [{ required: true, message: '物料名称不能为空', trigger: 'blur' }],
+  depleteCount1: [{ required: true, message: '消耗数量不能为空', trigger: 'blur' }]
+})
+const materialFormRef = ref()
+const openForm = () => {
+  materialFormRef.value.open()
+}
+const windowWidth = ref(window.innerWidth)
+// 动态计算百分比
+const computedSize = computed(() => {
+  return windowWidth.value > 800 ? '40%' : '60%'
+})
+
+const loading = ref(false)
+const total = ref(0) // 列表的总页数
+const materials = ref([])
+
+const props = defineProps({
+  modelValue: Boolean
+})
+
+// 打开抽屉
+const openDrawer = () => {
+  drawerVisible.value = true
+  resetDrawerForm()
+  materialLabel.value = undefined
+}
+
+
+// 关闭抽屉
+const closeDrawer = () => {
+  drawerVisible.value = false
+}
+
+// 关闭抽屉
+const handleClose = () => {
+  emit('update:modelValue', false)
+}
+const drawerRef = ref()
+const submitForm= async ()=> {
+  await drawerRef.value.validate()
+  emit('add', drawerFormData.value);
+  emit('update:modelValue', false)
+}
+
+defineExpose({ openDrawer, closeDrawer }) // 暴露方法给父组件
+</script>
+
+<style lang="scss" scoped></style>

+ 170 - 0
src/views/pms/maintain/material/MaterialSelect.vue

@@ -0,0 +1,170 @@
+<template>
+  <Dialog v-model="dialogVisible" title="选择品牌" style="width: 1100px; max-height: 800px">
+    <ContentWrap>
+      <el-form
+        class="-mb-15px"
+        :model="queryParams"
+        ref="queryFormRef"
+        :inline="true"
+        label-width="68px"
+      >
+        <el-form-item label="物料名称" prop="name">
+          <el-input
+            v-model="queryParams.name"
+            placeholder="请输入物料名称"
+            clearable
+            @keyup.enter="handleQuery"
+            class="!w-240px"
+          />
+        </el-form-item>
+        <el-form-item label="物料编码" prop="code">
+          <el-input
+            v-model="queryParams.code"
+            placeholder="请输入物料编码"
+            clearable
+            @keyup.enter="handleQuery"
+            class="!w-240px"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
+          <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
+        </el-form-item>
+      </el-form>
+    </ContentWrap>
+    <ContentWrap>
+      <el-table
+        v-loading="loading"
+        :data="list"
+        :stripe="true"
+        :show-overflow-tooltip="true"
+        @row-click="handleRowClick"
+      >
+        <el-table-column width="60" label="选择">
+          <template #default="{ row }">
+            <el-radio
+              :model-value="selectedRow?.id"
+              :label="row.id"
+              @click.stop="selectRow(row)"
+              class="no-label-radio"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="物料编码"
+          align="center"
+          prop="code"
+          :show-overflow-tooltip="true"
+        />
+        <el-table-column
+          label="物料名称"
+          align="center"
+          prop="name"
+          :show-overflow-tooltip="true"
+        />
+        <el-table-column label="规格型号" align="center" prop="model" width="120" />
+        <el-table-column label="单位" align="center" prop="unit" width="120" />
+        <el-table-column label="状态" key="status">
+          <template #default="scope">
+            <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="创建时间"
+          align="center"
+          prop="createTime"
+          :formatter="dateFormatter"
+          width="180"
+        />
+      </el-table>
+      <!-- 分页 -->
+      <Pagination
+        :total="total"
+        v-model:page="queryParams.pageNo"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </ContentWrap>
+  </Dialog>
+</template>
+
+<script setup lang="ts">
+import { DictDataVO } from '@/api/system/dict/dict.data'
+import { dateFormatter } from '@/utils/formatTime'
+import * as DictTypeApi from '@/api/system/dict/dict.type'
+import { checkPermi } from '@/utils/permission'
+import * as MaterialApi from '@/api/pms/material'
+import {DICT_TYPE} from "@/utils/dict";
+
+const emit = defineEmits(['choose']) // 定义 success 事件,用于操作成功后的回调
+const dialogVisible = ref(false) // 弹窗的是否展示
+const loading = ref(true) // 列表的加载中
+const queryFormRef = ref() // 搜索的表单
+const list = ref<DictDataVO[]>([]) // 列表的数据
+const dictTypeList = ref<DictTypeApi.DictTypeVO[]>() // 字典类型的列表
+const total = ref(0) // 列表的总页数
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  label: '',
+  status: undefined,
+  dictType: 'pms_device_brand'
+})
+
+const selectedRow = ref(null)
+
+// 处理单选逻辑
+const selectRow = (row) => {
+  selectedRow.value = selectedRow.value?.id === row.id ? null : row
+  emit('choose', row)
+  dialogVisible.value = false
+}
+
+// 点击整行选中
+const handleRowClick = (row) => {
+  selectRow(row)
+}
+const open = async (type: string, id?: number) => {
+  dialogVisible.value = true
+  await getList()
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await MaterialApi.getMaterialPage(queryParams)
+    list.value = data.list
+    total.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNo = 1
+  getList()
+}
+const choose = (row: DictDataVO) => {
+  emit('choose', row)
+  dialogVisible.value = false
+}
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+/** 初始化 **/
+// onMounted(async () => {
+//   // 查询字典(精简)列表
+//   dictTypeList.value = await DictTypeApi.getSimpleDictTypeList()
+// })
+</script>
+<style lang="scss">
+.no-label-radio .el-radio__label {
+  display: none;
+}
+.no-label-radio .el-radio__inner {
+  margin-right: 0;
+}
+</style>

+ 166 - 0
src/views/pms/maintain/material/index.vue

@@ -0,0 +1,166 @@
+<template>
+  <ContentWrap>
+    <!-- 搜索工作栏 -->
+    <el-form
+      class="-mb-15px"
+      :model="queryParams"
+      ref="queryFormRef"
+      :inline="true"
+      label-width="68px"
+    >
+      <el-form-item>
+        <el-button @click="handleQuery" type="primary"
+          ><Icon icon="ep:plus" class="mr-5px" /> 选择物料</el-button
+        >
+        <el-button @click="handleView" type="warning"
+          ><Icon icon="ep:plus" class="mr-5px" /> 新增物料</el-button
+        >
+      </el-form-item>
+    </el-form>
+  </ContentWrap>
+
+  <!-- 列表 -->
+  <ContentWrap>
+    <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
+      <el-table-column label="物料编码" align="center" prop="code" />
+      <el-table-column label="物料名称" align="center" prop="name" />
+      <el-table-column label="单位" align="center" prop="unit" />
+      <el-table-column label="单价" align="center" prop="price" />
+      <el-table-column label="消耗数量" align="center" prop="depleteCount" />
+      <el-table-column label="总库存数量" align="center" prop="totalCount" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="物料来源" align="center" prop="sourceType" />
+      <el-table-column label="操作" align="center" min-width="120px">
+        <template #default="scope">
+          <div style="display: flex; justify-content: center;align-items: center;width: 100%">
+            <div>
+              <Icon style="vertical-align: middle;color: #ea3434" icon="ep:zoom-out"/>
+              <el-button style="vertical-align: middle" link type="danger" @click="handleDelete(scope.row.code)"> 移除 </el-button>
+            </div>
+          </div>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+<!--    <Pagination-->
+<!--      :total="total"-->
+<!--      v-model:page="queryParams.pageNo"-->
+<!--      v-model:limit="queryParams.pageSize"-->
+<!--      @pagination="getList"-->
+<!--    />-->
+  </ContentWrap>
+
+  <!-- 表单弹窗:添加/修改 -->
+<!--  <IotMaintainMaterialForm ref="formRef" @success="getList" />-->
+  <MaintainMaterialDrawer ref="showDrawer" :model-value="drawerVisible"
+    @update:model-value="val => drawerVisible = val"
+    @add="handleChildSubmit"
+  />
+</template>
+
+<script setup lang="ts">
+import download from '@/utils/download'
+import { IotMaintainMaterialApi, IotMaintainMaterialVO } from '@/api/pms/maintain/material'
+import IotMaintainMaterialForm from './IotMaintainMaterialForm.vue'
+import {ref} from "vue";
+import MaintainMaterialDrawer from "@/views/pms/maintain/material/MaintainMaterialDrawer.vue";
+
+/** 工单物料 列表 */
+defineOptions({ name: 'IotMaintainMaterial' })
+
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+
+const loading = ref(true) // 列表的加载中
+const drawerVisible = ref<boolean>(false)
+const showDrawer = ref()
+const list = ref<IotMaintainMaterialVO[]>([]) // 列表的数据
+const total = ref(0) // 列表的总页数
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  code: undefined,
+  name: undefined,
+  unit: undefined,
+  price: undefined,
+  sourceType: undefined,
+  depleteCount: undefined,
+  totalCount: undefined,
+  sapCode: undefined,
+  status: undefined,
+  remark: undefined,
+  createTime: []
+})
+const queryFormRef = ref() // 搜索的表单
+const exportLoading = ref(false) // 导出的加载中
+
+const handleChildSubmit=(formData)=> {
+  console.log('接收到的数据:', JSON.stringify(formData));
+
+  const modified = removeOnesFromKeys(formData);
+  list.value.push(modified);
+}
+
+const removeOnesFromKeys = (obj: Record<string, any>) => {
+  return Object.keys(obj).reduce((acc, key) => {
+    const newKey = key.replace(/1/g, ''); // 替换所有 1
+    acc[newKey] = obj[key];
+    return acc;
+  }, {} as Record<string, any>);
+};
+const handleView = () => {
+  drawerVisible.value = true
+  showDrawer.value.openDrawer()
+}
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    list.value = []
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNo = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+
+/** 添加/修改操作 */
+const formRef = ref()
+const openForm = (type: string, id?: number) => {
+  formRef.value.open(type, id)
+}
+
+/** 删除按钮操作 */
+const handleDelete = async (id: number) => {
+  try {
+    // 删除的二次确认
+    //await message.delConfirm()
+    // 发起删除
+    // await IotMaintainMaterialApi.deleteIotMaintainMaterial(id)
+    // message.success(t('common.delSuccess'))
+    // // 刷新列表
+    // await getList()
+    const index = list.value.findIndex(item => item.code === id);
+    debugger
+    if (index !== -1) {
+      // 通过 splice 删除元素
+      list.value.splice(index, 1);
+    }
+  } catch {}
+}
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+</script>