view.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. <template>
  2. <el-dialog title="查看工单详情" v-model="visible" width="1000px" append-to-body @close="handleClose">
  3. <el-row :gutter="20">
  4. <!-- 工单信息 -->
  5. <el-col :span="8">
  6. <div class="info-section">
  7. <h3 class="section-title">工单信息</h3>
  8. <div class="info-content">
  9. <el-form label-width="100px" label-position="top">
  10. <el-row :gutter="20">
  11. <el-col :span="24">
  12. <el-form-item label="工单编码">{{ formData.workOrderProjectNo }}</el-form-item>
  13. </el-col>
  14. <el-col :span="24">
  15. <el-form-item label="工单状态">
  16. <dict-tag :options="workOrderStatusOptions" :value="formData.workOrderStatus" />
  17. </el-form-item>
  18. </el-col>
  19. <el-col :span="24">
  20. <el-form-item label="风机编号">{{ formData.pcsDeviceName || '-' }}</el-form-item>
  21. </el-col>
  22. <el-col :span="24">
  23. <el-form-item label="维保中心">{{ formData.gxtCenter || '-' }}</el-form-item>
  24. </el-col>
  25. <el-col :span="24">
  26. <el-form-item label="场站">{{ formData.pcsStationName || '-' }}</el-form-item>
  27. </el-col>
  28. <el-col :span="24">
  29. <el-form-item label="品牌">{{ formData.brand || '-' }}</el-form-item>
  30. </el-col>
  31. <el-col :span="24">
  32. <el-form-item label="机型">{{ formData.model || '-' }}</el-form-item>
  33. </el-col>
  34. <el-col :span="24">
  35. <el-form-item label="发生时间">{{ parseTime(formData.occurTime, '{y}-{m}-{d} {h}:{i}') || '-' }}</el-form-item>
  36. </el-col>
  37. <el-col :span="24">
  38. <el-form-item label="故障代码">{{ formData.faultCode || '-' }}</el-form-item>
  39. </el-col>
  40. </el-row>
  41. </el-form>
  42. </div>
  43. </div>
  44. </el-col>
  45. <!-- 处理信息 -->
  46. <el-col :span="8">
  47. <div class="info-section">
  48. <h3 class="section-title">处理信息</h3>
  49. <div class="info-content">
  50. <el-form label-width="100px" label-position="top">
  51. <el-row :gutter="20">
  52. <el-col :span="24">
  53. <el-form-item label="下发人">{{ formData.assignUserName || '-' }}</el-form-item>
  54. </el-col>
  55. <el-col :span="24">
  56. <el-form-item label="下发时间">{{ parseTime(formData.assignTime, '{y}-{m}-{d} {h}:{i}') || '-' }}</el-form-item>
  57. </el-col>
  58. <el-col :span="24">
  59. <el-form-item label="接单人">{{ formData.acceptUserName || '-'}}</el-form-item>
  60. </el-col>
  61. <el-col :span="24">
  62. <el-form-item label="接单时间">{{ parseTime(formData.acceptTime, '{y}-{m}-{d} {h}:{i}') || '-' }}</el-form-item>
  63. </el-col>
  64. <el-col :span="24">
  65. <el-form-item label="工作负责人">{{ formData.teamLeaderName || '-' }}</el-form-item>
  66. </el-col>
  67. <el-col :span="24">
  68. <el-form-item label="检修人员">{{ formData.workGroupMemberName || '-' }}</el-form-item>
  69. </el-col>
  70. <template v-if="formData.repairMethod !== '2'">
  71. <el-col :span="24">
  72. <el-form-item label="工作部位">{{ formattedWorkArea }}</el-form-item>
  73. </el-col>
  74. <el-col :span="24" v-if="formData.infoEntry == 1">
  75. <el-form-item label="MIS工单编码">{{ formData.misOrderNo || '-' }}</el-form-item>
  76. </el-col>
  77. <el-col :span="24" v-if="formData.infoEntry == 2">
  78. <el-form-item label="工票编号">{{ formData.workPermitNum || '-' }}</el-form-item>
  79. </el-col>
  80. <el-col :span="24">
  81. <el-form-item label="开始时间">{{ parseTime(formData.realStartTime, '{y}-{m}-{d} {h}:{i}') || '-' }}</el-form-item>
  82. </el-col>
  83. <el-col :span="24">
  84. <el-form-item label="结束时间">{{ parseTime(formData.realEndTime, '{y}-{m}-{d} {h}:{i}') || '-' }}</el-form-item>
  85. </el-col>
  86. <el-col :span="24">
  87. <el-form-item label="外委人员数(人)">{{ formData.wwryNum || '-' }}</el-form-item>
  88. </el-col>
  89. <el-col :span="24">
  90. <el-form-item label="外来人员数(人)">{{ formData.wlryNum || '-' }}</el-form-item>
  91. </el-col>
  92. </template>
  93. <template v-if="formData.repairMethod === '2'">
  94. <el-col :span="24">
  95. <el-form-item label="复位方式">
  96. <dict-tag :options="resetMethodOptions" :value="formData.resetMethod" />
  97. </el-form-item>
  98. </el-col>
  99. </template>
  100. <el-col :span="24">
  101. <el-form-item label="恢复运行时间">{{ parseTime(formData.restartTime, '{y}-{m}-{d} {h}:{i}') || '-' }}</el-form-item>
  102. </el-col>
  103. <el-col :span="24">
  104. <el-form-item label="损失电量(kWh)">{{ formData.lostPower || '-' }}</el-form-item>
  105. </el-col>
  106. </el-row>
  107. </el-form>
  108. </div>
  109. </div>
  110. </el-col>
  111. <!-- 工单流转记录 -->
  112. <el-col :span="8">
  113. <div class="info-section">
  114. <h3 class="section-title">工单流转</h3>
  115. <div class="flow-history">
  116. <el-timeline>
  117. <el-timeline-item type="primary"
  118. v-for="(flow, index) in flowList"
  119. :key="index"
  120. :timestamp="parseTime(flow.actionTime, '{y}-{m}-{d} {h}:{i}')"
  121. >
  122. <div class="flow-item">
  123. <h4><dict-tag :options="repairOrderFlowActionTypeOptions" :value="flow.actionType" /></h4>
  124. <p>
  125. {{ flow.operatorName }}
  126. </p>
  127. </div>
  128. </el-timeline-item>
  129. </el-timeline>
  130. </div>
  131. </div>
  132. </el-col> </el-row>
  133. <el-form label-position="top">
  134. <el-row>
  135. <el-col :span="24">
  136. <el-form-item label="故障信息">
  137. <div class="content-text">{{ formData.faultBarcode || '-' }}</div>
  138. </el-form-item>
  139. </el-col>
  140. <el-col :span="24">
  141. <el-form-item label="真实故障原因">
  142. <div class="content-text">{{ formData.realFailureReason || '-' }}</div>
  143. </el-form-item>
  144. </el-col>
  145. </el-row>
  146. </el-form>
  147. <!-- 附件信息 -->
  148. <div class="info-section" v-if="formData.attachmentUrls">
  149. <h3 class="section-title">结单附件</h3>
  150. <el-row>
  151. <el-col :span="24">
  152. <el-form-item label="附件">
  153. <preview :limit="8" v-model="formData.attachmentUrls" :filesize="5" disabled></preview>
  154. </el-form-item>
  155. </el-col>
  156. </el-row>
  157. </div>
  158. <template #footer>
  159. <div class="dialog-footer">
  160. <el-button @click="handleCancel">关 闭</el-button>
  161. </div>
  162. </template>
  163. </el-dialog>
  164. </template>
  165. <script setup>
  166. import { ref, defineProps, defineEmits, getCurrentInstance, watch, computed } from 'vue'
  167. import preview from '@/components/FileUpload/preview.vue'
  168. import DictTag from '@/components/DictTag'
  169. // 获取当前实例
  170. const { proxy } = getCurrentInstance()
  171. // 定义属性
  172. const props = defineProps({
  173. modelValue: {
  174. type: Boolean,
  175. default: false
  176. },
  177. data: {
  178. type: Object,
  179. default: () => ({})
  180. },
  181. workOrderStatusOptions: {
  182. type: Array,
  183. default: () => ([])
  184. },
  185. resetMethodOptions: {
  186. type: Array,
  187. default: () => ([])
  188. },
  189. repairOrderFlowActionTypeOptions: {
  190. type: Array,
  191. default: () => ([])
  192. }
  193. })
  194. // 定义事件
  195. const emit = defineEmits(['update:modelValue'])
  196. // 响应式数据
  197. const visible = ref(false)
  198. const formData = ref({})
  199. const flowList = ref([])
  200. // 计算属性
  201. const formattedWorkArea = computed(() => {
  202. if (!formData.value.workArea) return '-'
  203. // 如果是数组,转换为字符串
  204. if (Array.isArray(formData.value.workArea)) {
  205. return formData.value.workArea.join(',')
  206. }
  207. return formData.value.workArea
  208. })
  209. // 监听modelValue变化
  210. watch(() => props.modelValue, (val) => {
  211. visible.value = val
  212. if (val) {
  213. // 初始化表单数据
  214. formData.value = { ...props.data }
  215. // 从repairOrderFlowList属性获取流转记录
  216. flowList.value = props.data.repairOrderFlowList || []
  217. }
  218. })
  219. // 监听props.data变化
  220. watch(() => props.data, (newData) => {
  221. if (visible.value) {
  222. // 只有在对话框打开时才更新数据
  223. formData.value = { ...newData }
  224. // 从repairOrderFlowList属性获取流转记录
  225. flowList.value = newData.repairOrderFlowList || []
  226. }
  227. }, { deep: true })
  228. // 监听visible变化
  229. watch(visible, (val) => {
  230. emit('update:modelValue', val)
  231. })
  232. // 关闭对话框
  233. const handleClose = () => {
  234. visible.value = false
  235. }
  236. // 取消操作
  237. const handleCancel = () => {
  238. visible.value = false
  239. }
  240. // 解析时间函数
  241. const parseTime = (time, pattern) => {
  242. if (!time) return ''
  243. return proxy.parseTime(time, pattern)
  244. }
  245. </script>
  246. <style scoped>
  247. .info-section {
  248. margin-bottom: 20px;
  249. }
  250. .section-title {
  251. font-size: 16px;
  252. font-weight: bold;
  253. margin-bottom: 15px;
  254. padding-bottom: 10px;
  255. border-bottom: 1px solid #eee;
  256. }
  257. .info-content {
  258. padding: 15px;
  259. //background-color: #f9f9f9;
  260. border-radius: 4px;
  261. }
  262. .flow-history {
  263. padding: 15px;
  264. //background-color: #f9f9f9;
  265. border-radius: 4px;
  266. max-height: 400px;
  267. overflow-y: auto;
  268. }
  269. .flow-item h4 {
  270. margin: 0 0 5px 0;
  271. font-size: 14px;
  272. }
  273. .flow-item p {
  274. margin: 0;
  275. font-size: 12px;
  276. color: #666;
  277. }
  278. .content-text {
  279. min-height: 60px;
  280. padding: 10px;
  281. //background-color: #f5f5f5;
  282. border-radius: 4px;
  283. white-space: pre-wrap;
  284. word-break: break-word;
  285. line-height: 1.5;
  286. }
  287. </style>