IotMaintainDetail.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. <template>
  2. <ContentWrap v-loading="formLoading">
  3. <el-form
  4. ref="formRef"
  5. :model="formData"
  6. :rules="formData.type === 'in' ? formRules : outFormRules"
  7. v-loading="formLoading"
  8. style="margin-right: 4em; margin-left: 0.5em; margin-top: 1em"
  9. label-width="130px"
  10. >
  11. <div class="base-expandable-content">
  12. <el-row>
  13. <el-col :span="8">
  14. <el-form-item :label="t('maintain.deviceName')" prop="deviceName">
  15. <el-select disabled v-model="formData.deviceName" />
  16. </el-form-item>
  17. </el-col>
  18. <el-col :span="8">
  19. <el-form-item :label="t('maintain.status')" prop="status">
  20. <el-select v-model="formData.status" clearable disabled>
  21. <el-option
  22. v-for="dict in getStrDictOptions(DICT_TYPE.PMS_MAIN_STATUS)"
  23. :key="dict.value"
  24. :label="dict.label"
  25. :value="dict.value"
  26. />
  27. </el-select>
  28. </el-form-item>
  29. </el-col>
  30. <el-col :span="8">
  31. <el-form-item :label="t('iotMaintain.repairType')" prop="type">
  32. <el-select disabled v-model="formData.type" clearable>
  33. <el-option
  34. v-for="dict in getStrDictOptions(DICT_TYPE.PMS_MAIN_TYPE)"
  35. :key="dict.value"
  36. :label="dict.label"
  37. :value="dict.value"
  38. />
  39. </el-select>
  40. </el-form-item>
  41. </el-col>
  42. <el-col :span="8">
  43. <el-form-item :label="t('iotMaintain.shutDown')" prop="ifStop">
  44. <el-select v-model="formData.ifStop" clearable disabled>
  45. <el-option
  46. v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
  47. :key="dict.value"
  48. :label="dict.label"
  49. :value="dict.value"
  50. />
  51. </el-select>
  52. </el-form-item>
  53. </el-col>
  54. <el-col :span="8">
  55. <el-form-item
  56. :label="t('iotMaintain.startTime')"
  57. prop="maintainStartTime"
  58. :rules="formData.type === 'in' ? startRule : []"
  59. >
  60. <el-date-picker
  61. disabled
  62. style="width: 150%"
  63. v-model="formData.maintainStartTime"
  64. type="date"
  65. value-format="x"
  66. />
  67. </el-form-item>
  68. </el-col>
  69. <el-col :span="8">
  70. <el-form-item
  71. :label="t('iotMaintain.endTime')"
  72. prop="maintainEndTime"
  73. :rules="formData.type === 'in' ? endRule : []"
  74. >
  75. <el-date-picker
  76. disabled
  77. style="width: 150%"
  78. v-model="formData.maintainEndTime"
  79. type="date"
  80. value-format="x"
  81. />
  82. </el-form-item>
  83. </el-col>
  84. <el-col :span="8">
  85. <el-form-item :label="t('iotMaintain.PersonInCharge')" prop="maintainPerson">
  86. <el-select
  87. v-model="formData.maintainPerson"
  88. filterable
  89. clearable
  90. style="width: 100%"
  91. disabled
  92. >
  93. <el-option
  94. v-for="item in deptUsers"
  95. :key="item.id"
  96. :label="item.nickname"
  97. :value="item.id"
  98. />
  99. </el-select>
  100. </el-form-item>
  101. </el-col>
  102. <el-col :span="8">
  103. <el-form-item :label="t('iotMaintain.failureTime')" prop="failureTime">
  104. <el-date-picker
  105. disabled
  106. style="width: 150%"
  107. v-model="formData.failureTime"
  108. type="date"
  109. value-format="x"
  110. />
  111. </el-form-item>
  112. </el-col>
  113. <el-col :span="8">
  114. <el-form-item :label="t('iotMaintain.failureImpact')" prop="failureInfluence">
  115. <el-input v-model="formData.failureInfluence" disabled />
  116. </el-form-item>
  117. </el-col>
  118. <el-col :span="8">
  119. <el-form-item :label="t('iotMaintain.faultySystem')" prop="failureSystem">
  120. <el-input v-model="formData.failureSystem" disabled />
  121. </el-form-item>
  122. </el-col>
  123. <el-col :span="8">
  124. <el-form-item :label="t('iotMaintain.picture')" prop="pic">
  125. <UploadImg v-model="formData.pic" :disabled="true" height="55px" />
  126. </el-form-item>
  127. </el-col>
  128. <!-- <el-col :span="8">-->
  129. <!-- <el-form-item label="维修费用" prop="maintainFee">-->
  130. <!-- <el-input v-model="formData.maintainFee" :disabled="true" />-->
  131. <!-- </el-form-item>-->
  132. <!-- </el-col>-->
  133. <el-col :span="8" v-if="formData.type === 'out'&&formData.maintainPerson===userId">
  134. <el-form-item :label="t('iotMaintain.supplier')" prop="supplier">
  135. <el-select
  136. disabled
  137. v-model="formData.supplierName"
  138. :placeholder="t('iotMaintain.suppHolder')"
  139. :model-value="supplierLabel"
  140. />
  141. </el-form-item>
  142. </el-col>
  143. <el-col :span="8">
  144. <el-form-item :label="t('iotMaintain.repairCosts')" prop="maintainFee">
  145. <el-input-number
  146. disabled
  147. v-model="formData.maintainFee"
  148. :min="0"
  149. :precision="2"
  150. :step="0.1"
  151. :placeholder="t('iotMaintain.costHolder')"
  152. style="width: 100%"
  153. />
  154. </el-form-item>
  155. </el-col>
  156. <el-col :span="8" v-if="formData.type === 'out'&&formData.maintainPerson===userId">
  157. <el-form-item :label="t('iotMaintain.attachment')" prop="outFile">
  158. <UploadFile disabled="" v-model="formData.outFile" class="min-w-80px" />
  159. </el-form-item>
  160. </el-col>
  161. <el-col :span="8">
  162. <el-form-item :label="t('iotMaintain.faultDescription')" prop="description">
  163. <el-input type="textarea" v-model="formData.description" disabled />
  164. </el-form-item>
  165. </el-col>
  166. <el-col :span="8">
  167. <el-form-item :label="t('iotMaintain.repairDescription')" prop="maintainDescription">
  168. <el-input type="textarea" v-model="formData.maintainDescription" disabled />
  169. </el-form-item>
  170. </el-col>
  171. <el-col :span="8">
  172. <el-form-item :label="t('iotMaintain.solution')" prop="solution">
  173. <el-input type="textarea" v-model="formData.solution" disabled />
  174. </el-form-item>
  175. </el-col>
  176. <el-col :span="12">
  177. <el-form-item :label="t('iotMaintain.remark')" prop="remark">
  178. <el-input v-model="formData.remark" type="textarea" disabled />
  179. </el-form-item>
  180. </el-col>
  181. </el-row>
  182. </div>
  183. </el-form>
  184. </ContentWrap>
  185. <ContentWrap>
  186. <!-- 列表 -->
  187. <ContentWrap>
  188. <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
  189. <el-table-column :label="t('iotMaintain.deviceCode')" align="center" prop="deviceCode" />
  190. <el-table-column :label="t('iotMaintain.deviceName')" align="center" prop="deviceName" />
  191. <el-table-column :label="t('iotMaintain.repairItems')" align="center" prop="name" />
  192. <el-table-column :label="t('iotMaintain.operation')" align="center" min-width="120px">
  193. <template #default="scope">
  194. <div style="display: flex; justify-content: center; align-items: center; width: 100%">
  195. <div style="margin-left: 12px">
  196. <el-button
  197. link
  198. type="primary"
  199. @click="handleViewNew(scope.row.id, scope.row.bomNodeId)"
  200. >
  201. 物料详情
  202. </el-button>
  203. </div>
  204. </div>
  205. </template>
  206. </el-table-column>
  207. </el-table>
  208. </ContentWrap>
  209. </ContentWrap>
  210. <ContentWrap>
  211. <el-form>
  212. <el-form-item style="float: right">
  213. <el-button type="info" @click="close">取 消</el-button>
  214. </el-form-item>
  215. </el-form>
  216. </ContentWrap>
  217. <MaterialListDrawer
  218. :model-value="drawerVisible"
  219. @update:model-value="(val) => (drawerVisible = val)"
  220. :node-id="currentBomNodeId"
  221. :materials="materialList"
  222. />
  223. </template>
  224. <script setup lang="ts">
  225. import { DICT_TYPE, getBoolDictOptions, getStrDictOptions } from '@/utils/dict'
  226. import * as UserApi from '@/api/system/user'
  227. import { ref } from 'vue'
  228. import { IotMaintainMaterialApi, IotMaintainMaterialVO } from '@/api/pms/maintain/material'
  229. import { useTagsViewStore } from '@/store/modules/tagsView'
  230. import { IotMaintainApi } from '@/api/pms/maintain'
  231. import MaterialListDrawer from '@/views/pms/iotmainworkorder/SelectedMaterialDrawer.vue'
  232. import { IotMaintainMaterialsApi } from '@/api/pms/maintain/materials'
  233. import {CACHE_KEY, useCache} from "@/hooks/web/useCache";
  234. /** 维修工单 表单 */
  235. defineOptions({ name: 'IotMaintainDetail' })
  236. const { t } = useI18n() // 国际化
  237. const props = defineProps<{ id?: number }>()
  238. const message = useMessage() // 消息弹窗
  239. const { delView } = useTagsViewStore() // 视图操作
  240. const { currentRoute, push } = useRouter()
  241. const deptUsers = ref<UserApi.UserVO[]>([]) // 用户列表
  242. const dialogTitle = ref('') // 弹窗的标题
  243. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  244. const deviceLabel = ref('') // 表单的类型:create - 新增;update - 修改
  245. const drawerVisible = ref<boolean>(false)
  246. const showDrawer = ref()
  247. const list = ref<IotMaintainMaterialVO[]>([]) // 列表的数据
  248. const { params, name } = useRoute() // 查询参数
  249. const id = params.id || props.id
  250. const materialList = ref<any[]>([]) // 保养工单bom关联物料列表
  251. const { wsCache } = useCache()
  252. const currentBomNodeId = ref<string>()
  253. const formData = ref({
  254. id: undefined,
  255. failureCode: undefined,
  256. failureName: undefined,
  257. deviceId: undefined,
  258. status: undefined,
  259. type: undefined,
  260. ifStop: undefined,
  261. failureTime: undefined,
  262. failureInfluence: undefined,
  263. failureSystem: undefined,
  264. description: undefined,
  265. pic: undefined,
  266. solution: undefined,
  267. maintainStartTime: undefined,
  268. maintainEndTime: undefined,
  269. remark: undefined,
  270. deviceName: undefined,
  271. processInstanceId: undefined,
  272. auditStatus: undefined,
  273. deptId: undefined,
  274. maintainPerson: undefined,
  275. maintainDescription: undefined,
  276. supplier: undefined,
  277. maintainFee: undefined,
  278. outFile: undefined,
  279. supplierName: undefined,
  280. })
  281. const formRules = reactive({
  282. // deviceName: [{ required: true, message: '设备不能为空', trigger: 'blur' }],
  283. // failureCode: [{ required: true, message: '故障编码不能为空', trigger: 'blur' }],
  284. // type: [{ required: true, message: '维修类型不能为空', trigger: 'blur' }],
  285. // ifStop: [{ required: true, message: '是否停机不能为空', trigger: 'blur' }],
  286. // failureName: [{ required: true, message: '故障名称不能为空', trigger: 'blur' }],
  287. // // failureTime: [{ required: true, message: '故障时间不能为空', trigger: 'blur' }],
  288. // maintainStartTime: [{ required: true, message: '维修开始时间不能为空', trigger: 'blur' }],
  289. // maintainDescription: [{ required: true, message: '维修描述不能为空', trigger: 'blur' }],
  290. // maintainPerson: [{ required: true, message: '维修负责人不能为空', trigger: 'blur' }],
  291. // deviceId: [{ required: true, message: '设备id不能为空', trigger: 'blur' }],
  292. // status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
  293. })
  294. const outFormRules = reactive({
  295. // deviceName: [{ required: true, message: '设备不能为空', trigger: 'blur' }],
  296. // failureCode: [{ required: true, message: '故障编码不能为空', trigger: 'blur' }],
  297. // type: [{ required: true, message: '维修类型不能为空', trigger: 'blur' }],
  298. // ifStop: [{ required: true, message: '是否停机不能为空', trigger: 'blur' }],
  299. // failureName: [{ required: true, message: '故障名称不能为空', trigger: 'blur' }],
  300. // maintainStartTime: [{ required: true, message: '维修开始时间不能为空', trigger: 'blur' }],
  301. // maintainEndTime: [{ required: true, message: '维修结束时间不能为空', trigger: 'blur' }],
  302. // maintainDescription: [{ required: true, message: '维修描述不能为空', trigger: 'blur' }],
  303. // maintainPerson: [{ required: true, message: '维修负责人不能为空', trigger: 'blur' }],
  304. // deviceId: [{ required: true, message: '设备id不能为空', trigger: 'blur' }],
  305. // maintainFee: [{ required: true, message: '维修费用不能为空', trigger: 'blur' }],
  306. // supplier: [{ required: true, message: '供应商不能为空', trigger: 'blur' }]
  307. })
  308. const formRef = ref() // 表单 Ref
  309. const close = () => {
  310. delView(unref(currentRoute))
  311. push({ name: 'IotMaintain', params: {} })
  312. }
  313. const startRule = [
  314. // { required: true, message: '维修开始时间不能为空', trigger: 'blur' }
  315. ]
  316. const endRule = [
  317. // { required: true, message: '维修结束时间不能为空', trigger: 'blur' }
  318. ]
  319. const handleViewNew = (nodeId, bomId) => {
  320. drawerVisible.value = true
  321. // showDrawer.value.openDrawer()
  322. const queryParams = {
  323. pageNo: 1,
  324. pageSize: 100,
  325. bomId: nodeId
  326. }
  327. IotMaintainMaterialsApi.getIotMaintainMaterialsPage(queryParams).then((res) => {
  328. currentBomNodeId.value = bomId
  329. materialList.value = res.list
  330. })
  331. }
  332. const userId = ref('')
  333. /** 提交表单 */
  334. onMounted(async () => {
  335. const userInfo = wsCache.get(CACHE_KEY.USER)
  336. userId.value = userInfo.user.nickname;
  337. await IotMaintainApi.getIotMaintain(id).then((res) => {
  338. debugger
  339. formData.value = res
  340. if (res.outFile) {
  341. formData.value.outFile = res.outFile.split(',')
  342. }
  343. list.value = res.maintainBomDOS
  344. list.value.forEach((item) => {
  345. item.deviceName = res.deviceName
  346. item.deviceCode = res.deviceCode
  347. })
  348. UserApi.getUser(formData.value.maintainPerson).then((res) => {
  349. formData.value.maintainPerson = res.nickname
  350. })
  351. IotMaintainMaterialApi.getMaterialsByDeviceId()
  352. })
  353. })
  354. </script>