Ver Fonte

维修工单调整

lipenghui há 3 meses atrás
pai
commit
2afa0948a5

+ 54 - 0
src/api/pms/maintain/materials/index.ts

@@ -0,0 +1,54 @@
+import request from '@/config/axios'
+
+// 维修工单对应物料 VO
+export interface IotMaintainMaterialsVO {
+  id: number // 主键
+  maintainId: number // 维修工单id
+  bomId: number // 维修项id
+  bomNodeId: number // 保养工单明细设备BOM节点id
+  materialId: number // 物料id
+  materialCode: string // 物料编码
+  materialName: string // 物料名称
+  quantity: number // 消耗数量
+  unitPrice: number // 单价(元)
+  totalPrice: number // 总金额(元)
+  totalInventoryQuantity: number // 总数量
+  materialSource: string // 物料来源 (SAP库存 本地库存...)
+  inventoryAddress: string // 库存地点
+  sort: number // 排序
+  status: number // 状态 0启用  1停用
+  remark: string // 备注
+}
+
+// 维修工单对应物料 API
+export const IotMaintainMaterialsApi = {
+  // 查询维修工单对应物料分页
+  getIotMaintainMaterialsPage: async (params: any) => {
+    return await request.get({ url: `/rq/iot-maintain-materials/page`, params })
+  },
+
+  // 查询维修工单对应物料详情
+  getIotMaintainMaterials: async (id: number) => {
+    return await request.get({ url: `/rq/iot-maintain-materials/get?id=` + id })
+  },
+
+  // 新增维修工单对应物料
+  createIotMaintainMaterials: async (data: IotMaintainMaterialsVO) => {
+    return await request.post({ url: `/rq/iot-maintain-materials/create`, data })
+  },
+
+  // 修改维修工单对应物料
+  updateIotMaintainMaterials: async (data: IotMaintainMaterialsVO) => {
+    return await request.put({ url: `/rq/iot-maintain-materials/update`, data })
+  },
+
+  // 删除维修工单对应物料
+  deleteIotMaintainMaterials: async (id: number) => {
+    return await request.delete({ url: `/rq/iot-maintain-materials/delete?id=` + id })
+  },
+
+  // 导出维修工单对应物料 Excel
+  exportIotMaintainMaterials: async (params) => {
+    return await request.download({ url: `/rq/iot-maintain-materials/export-excel`, params })
+  },
+}

+ 2 - 3
src/views/pms/failure/DeviceList.vue

@@ -117,7 +117,6 @@ const open = async (classify) => {
   dialogVisible.value = true
   queryParams.assetClass = classify
   selectedRow.value = ''
-  debugger
   queryParams.deviceName = undefined
   queryParams.deviceCode = undefined
   queryParams.pageNo = 1
@@ -128,8 +127,8 @@ const { wsCache } = useCache()
 const getList = async () => {
   loading.value = true
   try {
-    const user = wsCache.get(CACHE_KEY.USER)
-    queryParams.deptId = user.user.deptId
+    // const user = wsCache.get(CACHE_KEY.USER)
+    // queryParams.deptId = user.user.deptId
     const data = await IotDeviceApi.getIotDevicePage(queryParams)
     list.value = data.list
     total.value = data.total

+ 7 - 7
src/views/pms/failure/index.vue

@@ -185,13 +185,13 @@
         <el-table-column label="图片" align="center" prop="pic" />
   <!--      <el-table-column label="解决办法" align="center" prop="solution" />-->
   <!--      <el-table-column label="备注" align="center" prop="remark" />-->
-        <el-table-column
-          label="创建时间"
-          align="center"
-          prop="createTime"
-          :formatter="dateFormatter"
-          width="180px"
-        />
+<!--        <el-table-column-->
+<!--          label="创建时间"-->
+<!--          align="center"-->
+<!--          prop="createTime"-->
+<!--          :formatter="dateFormatter"-->
+<!--          width="180px"-->
+<!--        />-->
         <el-table-column label="操作" align="center" min-width="120px">
           <template #default="scope">
 

+ 14 - 13
src/views/pms/maintain/IotMaintain.vue

@@ -241,6 +241,9 @@
       label-position="right"
       label-width="68px"
     >
+      <el-form-item label="BOM节点id" v-if="false" prop="deviceCode">
+        <el-input v-model="addFormData.bomNodeId" disabled />
+      </el-form-item>
       <el-form-item label="资产编码" prop="deviceCode">
         <el-input v-model="addFormData.deviceCode" disabled />
       </el-form-item>
@@ -273,7 +276,7 @@ import CustomerList from '@/views/pms/device/CustomerList.vue'
 import WorkOrderMaterial from '@/views/pms/iotmainworkorder/WorkOrderMaterial.vue'
 import { IotMainWorkOrderBomMaterialVO } from '@/api/pms/iotmainworkorderbommaterial'
 import MaterialListDrawer from '@/views/pms/iotmainworkorder/SelectedMaterialDrawer.vue'
-
+import ChooseMaintain from "@/views/pms/maintain/material/ChooseMaintain.vue";
 /** 维修工单 表单 */
 defineOptions({ name: 'IotMaintainAe' })
 const addItemVisible = ref(false) // 弹窗的是否展示
@@ -295,7 +298,8 @@ const supplierLabel = ref('') // 表单的类型:create - 新增;update - 
 const addFormData = ref({
   name: '',
   deviceName: '',
-  deviceCode: ''
+  deviceCode: '',
+  bomNodeId: ''
 })
 const formData = ref({
   id: undefined,
@@ -366,6 +370,7 @@ const outFormRules = reactive({
 })
 
 const handleConfirm = () => {
+  addFormData.value.bomNodeId = Math.floor(100000 + Math.random() * 900000);
   list.value.push(addFormData.value)
   addItemVisible.value = false
 }
@@ -413,6 +418,7 @@ const openMaintainItem = () => {
   addItemVisible.value = true
   addFormData.value.deviceName = formData.value.deviceName
   addFormData.value.deviceCode = formData.value.deviceCode
+  addFormData.value.name = ''
 }
 const endTimeBlur = () => {
   if (formData.value.maintainEndTime <= formData.value.maintainStartTime) {
@@ -437,8 +443,6 @@ const handleViewNew = (nodeId) => {
 const materialList = ref<IotMainWorkOrderBomMaterialVO[]>([]) // 保养工单bom关联物料列表
 const bomNodeId = ref() // 最新的bomNodeId
 const selectChoose = (selectedMaterial) => {
-  // console.log('接收到的数据:', JSON.stringify(formData))
-  // list.value.push(formData)
   selectedMaterial.bomNodeId = bomNodeId.value
   // 关联 bomNodeId
   const processedMaterials = selectedMaterial.map((material) => ({
@@ -457,6 +461,11 @@ const selectChoose = (selectedMaterial) => {
       materialList.value.push(newMaterial)
     }
   })
+  list.value.forEach((item) => {
+    if (item.bomNodeId === bomNodeId.value) {
+      item.materials = processedMaterials;
+    }
+  })
   console.log('选择完成的数据:', JSON.stringify(selectedMaterial))
   console.log('添加到本地列表的数据:', materialList.value)
 }
@@ -488,14 +497,6 @@ const emit = defineEmits(['success']) // 定义 success 事件,用于操作成
 const submitForm = async () => {
   // 校验表单
   await formRef.value.validate()
-  // if (list.value.length > 0) {
-  //   const nullList = list.value.filter((item) => item.depleteCount === null)
-  //   debugger
-  //   if (nullList.length > 0) {
-  //     message.error('请填写消耗数量')
-  //     return
-  //   }
-  // }
   // 提交请求
   formLoading.value = true
   try {
@@ -509,6 +510,7 @@ const submitForm = async () => {
         })
         .join(',')
     }
+    debugger
     const data = {
       maintain: formData.value,
       maintainMaterials: list.value
@@ -575,7 +577,6 @@ onMounted(async () => {
 const handleDelete = async (id: number) => {
   try {
     const index = list.value.findIndex((item) => item.code === id)
-    debugger
     if (index !== -1) {
       // 通过 splice 删除元素
       list.value.splice(index, 1)

+ 77 - 42
src/views/pms/maintain/IotMaintainDetail.vue

@@ -3,7 +3,7 @@
     <el-form
       ref="formRef"
       :model="formData"
-      :rules="formData.type==='in'?formRules:outFormRules"
+      :rules="formData.type === 'in' ? formRules : outFormRules"
       v-loading="formLoading"
       style="margin-right: 4em; margin-left: 0.5em; margin-top: 1em"
       label-width="130px"
@@ -12,10 +12,7 @@
         <el-row>
           <el-col :span="8">
             <el-form-item label="设备" prop="deviceName">
-              <el-select
-                disabled
-                v-model="formData.deviceName"
-              />
+              <el-select disabled v-model="formData.deviceName" />
             </el-form-item>
           </el-col>
           <el-col :span="8">
@@ -78,7 +75,13 @@
           </el-col>
           <el-col :span="8">
             <el-form-item label="维修负责人" prop="maintainPerson">
-              <el-select v-model="formData.maintainPerson" filterable clearable style="width: 100%" disabled>
+              <el-select
+                v-model="formData.maintainPerson"
+                filterable
+                clearable
+                style="width: 100%"
+                disabled
+              >
                 <el-option
                   v-for="item in deptUsers"
                   :key="item.id"
@@ -101,20 +104,20 @@
           </el-col>
           <el-col :span="8">
             <el-form-item label="故障影响" prop="failureInfluence">
-              <el-input v-model="formData.failureInfluence"  disabled/>
+              <el-input v-model="formData.failureInfluence" disabled />
             </el-form-item>
           </el-col>
           <el-col :span="8">
             <el-form-item label="故障系统" prop="failureSystem">
-              <el-input v-model="formData.failureSystem"  disabled/>
+              <el-input v-model="formData.failureSystem" disabled />
             </el-form-item>
           </el-col>
           <el-col :span="8">
-            <el-form-item label="图片" prop="pic" >
+            <el-form-item label="图片" prop="pic">
               <UploadImg v-model="formData.pic" :disabled="true" height="55px" />
             </el-form-item>
           </el-col>
-          <el-col :span="8" v-if="formData.type === 'out'" >
+          <el-col :span="8" v-if="formData.type === 'out'">
             <el-form-item label="供应商" prop="supplier">
               <el-select
                 disabled
@@ -124,7 +127,7 @@
               />
             </el-form-item>
           </el-col>
-          <el-col :span="8" v-if="formData.type === 'out'" >
+          <el-col :span="8" v-if="formData.type === 'out'">
             <el-form-item label="维修费用" prop="maintainFee">
               <el-input-number
                 disabled
@@ -137,20 +140,19 @@
               />
             </el-form-item>
           </el-col>
-          <el-col :span="8" v-if="formData.type === 'out'" >
+          <el-col :span="8" v-if="formData.type === 'out'">
             <el-form-item label="委外相关附件" prop="outFile">
               <UploadFile disabled="" v-model="formData.outFile" class="min-w-80px" />
             </el-form-item>
           </el-col>
           <el-col :span="8">
-
             <el-form-item label="故障描述" prop="description">
               <el-input type="textarea" v-model="formData.description" disabled />
             </el-form-item>
           </el-col>
           <el-col :span="8">
             <el-form-item label="维修描述" prop="maintainDescription">
-              <el-input type="textarea" v-model="formData.maintainDescription"  disabled/>
+              <el-input type="textarea" v-model="formData.maintainDescription" disabled />
             </el-form-item>
           </el-col>
           <el-col :span="8">
@@ -160,7 +162,7 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="备注" prop="remark">
-              <el-input v-model="formData.remark" type="textarea"  disabled/>
+              <el-input v-model="formData.remark" type="textarea" disabled />
             </el-form-item>
           </el-col>
         </el-row>
@@ -171,22 +173,25 @@
     <!-- 列表 -->
     <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">
-<!--          <template #default="scope">-->
-<!--            <el-input v-model="scope.row.depleteCount" disabled/>-->
-<!--          </template>-->
-        </el-table-column>
-        <el-table-column label="总库存数量" align="center" prop="totalCount" />
-        <el-table-column label="备注" align="center" prop="remark">
-<!--          <template #default="scope">-->
-<!--            <el-input v-model="scope.row.remark" />-->
-<!--          </template>-->
+        <el-table-column label="资产编码" align="center" prop="deviceCode" />
+        <el-table-column label="设备名称" align="center" prop="deviceName" />
+        <el-table-column label="维修项" align="center" prop="name" />
+
+        <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 style="margin-left: 12px">
+                <el-button
+                  link
+                  type="primary"
+                  @click="handleViewNew(scope.row.id, scope.row.bomNodeId)"
+                >
+                  物料详情
+                </el-button>
+              </div>
+            </div>
+          </template>
         </el-table-column>
-        <el-table-column label="物料来源" align="center" prop="sourceType" />
       </el-table>
     </ContentWrap>
   </ContentWrap>
@@ -197,17 +202,25 @@
       </el-form-item>
     </el-form>
   </ContentWrap>
+  <MaterialListDrawer
+    :model-value="drawerVisible"
+    @update:model-value="(val) => (drawerVisible = val)"
+    :node-id="currentBomNodeId"
+    :materials="materialList"
+  />
 </template>
 <script setup lang="ts">
-import {DICT_TYPE, getBoolDictOptions, getStrDictOptions} from '@/utils/dict'
+import { DICT_TYPE, getBoolDictOptions, getStrDictOptions } from '@/utils/dict'
 import * as UserApi from '@/api/system/user'
 import { ref } from 'vue'
-import {IotMaintainMaterialApi, IotMaintainMaterialVO} from '@/api/pms/maintain/material'
+import { IotMaintainMaterialApi, IotMaintainMaterialVO } from '@/api/pms/maintain/material'
 import { useTagsViewStore } from '@/store/modules/tagsView'
-import {IotMaintainApi} from "@/api/pms/maintain";
+import { IotMaintainApi } from '@/api/pms/maintain'
+import MaterialListDrawer from '@/views/pms/iotmainworkorder/SelectedMaterialDrawer.vue'
+import { IotMaintainMaterialsApi } from '@/api/pms/maintain/materials'
 
 /** 维修工单 表单 */
-defineOptions({ name: 'IotMaintain' })
+defineOptions({ name: 'IotMaintainDetail' })
 
 const { t } = useI18n() // 国际化
 const message = useMessage() // 消息弹窗
@@ -221,7 +234,9 @@ const drawerVisible = ref<boolean>(false)
 const showDrawer = ref()
 const list = ref<IotMaintainMaterialVO[]>([]) // 列表的数据
 const { params, name } = useRoute() // 查询参数
-const id = params.id||props.id
+const id = params.id || props.id
+const materialList = ref<any[]>([]) // 保养工单bom关联物料列表
+const currentBomNodeId = ref<string>()
 const formData = ref({
   id: undefined,
   failureCode: undefined,
@@ -255,7 +270,7 @@ const formRules = reactive({
   type: [{ required: true, message: '维修类型不能为空', trigger: 'blur' }],
   ifStop: [{ required: true, message: '是否停机不能为空', trigger: 'blur' }],
   failureName: [{ required: true, message: '故障名称不能为空', trigger: 'blur' }],
-  failureTime: [{ required: true, message: '故障时间不能为空', trigger: 'blur' }],
+  // failureTime: [{ required: true, message: '故障时间不能为空', trigger: 'blur' }],
   maintainStartTime: [{ required: true, message: '维修开始时间不能为空', trigger: 'blur' }],
   maintainDescription: [{ required: true, message: '维修描述不能为空', trigger: 'blur' }],
   maintainPerson: [{ required: true, message: '维修负责人不能为空', trigger: 'blur' }],
@@ -274,25 +289,45 @@ const outFormRules = reactive({
   maintainPerson: [{ required: true, message: '维修负责人不能为空', trigger: 'blur' }],
   deviceId: [{ required: true, message: '设备id不能为空', trigger: 'blur' }],
   maintainFee: [{ required: true, message: '维修费用不能为空', trigger: 'blur' }],
-  supplier: [{ required: true, message: '供应商不能为空', trigger: 'blur' }],
+  supplier: [{ required: true, message: '供应商不能为空', trigger: 'blur' }]
 })
 const formRef = ref() // 表单 Ref
 
 const close = () => {
   delView(unref(currentRoute))
-  push({ name: 'IotMaintain', params:{}})
+  push({ name: 'IotMaintain', params: {} })
 }
+
+const handleViewNew = (nodeId, bomId) => {
+  drawerVisible.value = true
+  // showDrawer.value.openDrawer()
+  const queryParams = {
+    pageNo: 1,
+    pageSize: 100,
+    bomId: nodeId
+  }
+  IotMaintainMaterialsApi.getIotMaintainMaterialsPage(queryParams).then((res) => {
+    debugger
+    currentBomNodeId.value = bomId
+    materialList.value = res.list
+  })
+}
+
 /** 提交表单 */
 onMounted(async () => {
   await IotMaintainApi.getIotMaintain(id).then((res) => {
     formData.value = res
-    if (res.outFile){
-      formData.value.outFile = res.outFile.split(",")
+    if (res.outFile) {
+      formData.value.outFile = res.outFile.split(',')
     }
 
-    list.value = res.maintainMaterialDOS
+    list.value = res.maintainBomDOS
+    list.value.forEach((item) => {
+      item.deviceName = res.deviceName
+      item.deviceCode = res.deviceCode
+    })
     UserApi.getUser(formData.value.maintainPerson).then((res) => {
-      formData.value.maintainPerson = res.nickname;
+      formData.value.maintainPerson = res.nickname
     })
     IotMaintainMaterialApi.getMaterialsByDeviceId()
   })

+ 7 - 7
src/views/pms/maintain/index.vue

@@ -183,13 +183,13 @@
 <!--            width="180px"-->
 <!--          />-->
 <!--          <el-table-column label="备注" align="center" prop="remark" />-->
-          <el-table-column
-            label="创建时间"
-            align="center"
-            prop="createTime"
-            :formatter="dateFormatter"
-            width="180px"
-          />
+<!--          <el-table-column-->
+<!--            label="创建时间"-->
+<!--            align="center"-->
+<!--            prop="createTime"-->
+<!--            :formatter="dateFormatter"-->
+<!--            width="180px"-->
+<!--          />-->
           <el-table-column label="操作" align="center" min-width="120px">
             <template #default="scope">
               <el-button

+ 0 - 1
src/views/pms/maintain/material/ChooseMaintain.vue

@@ -186,7 +186,6 @@ const getList = async () => {
   loading.value = true
   try {
     const res = await IotDeviceApi.deviceAssociateBomListPage(queryParams)
-    debugger
     const rawData = res || []
     if (rawData.length === 0) {
       message.error('选择的设备不存在待保养BOM项')

+ 2 - 2
src/views/pms/maintenance/MainPlanDeviceList.vue

@@ -118,8 +118,8 @@ const { wsCache } = useCache()
 const getList = async () => {
   loading.value = true
   try {
-    const user = wsCache.get(CACHE_KEY.USER)
-    queryParams.deptId = user.user.deptId
+    // const user = wsCache.get(CACHE_KEY.USER)
+    // queryParams.deptId = user.user.deptId
     const data = await IotDeviceApi.getIotDevicePage(queryParams)
     list.value = data.list
     total.value = data.total

+ 1 - 1
src/views/system/tree/PmsTree.vue

@@ -33,7 +33,7 @@
             <Icon
               style="vertical-align: middle"
               v-if="node.data.type === 'device'"
-              icon="fa:wrench"
+              icon="ep:collection"
             />
             <el-icon v-if="node.data.type === 'file'" style="vertical-align: middle"
               ><Folder