MaintPlanDetailContent.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. <template>
  2. <div>
  3. <!-- 基础信息区域 -->
  4. <div class="form-section">
  5. <div class="section-header">
  6. <i class="el-icon-info"></i>
  7. <span class="section-title">基础信息</span>
  8. </div>
  9. <el-descriptions :column="2" border size="small">
  10. <el-descriptions-item label="装置">{{ planData.plant || '-' }}</el-descriptions-item>
  11. <el-descriptions-item label="设备名称">{{ planData.devName || '-' }}</el-descriptions-item>
  12. <el-descriptions-item label="设备位号">{{ planData.devTag || '-' }}</el-descriptions-item>
  13. <el-descriptions-item label="计划开始时间">
  14. <span v-if="planData.planTime">{{ parseTime(planData.planTime, '{y}-{m}-{d}') }}</span>
  15. <span v-else>-</span>
  16. </el-descriptions-item>
  17. <el-descriptions-item label="计划结束时间">
  18. <span v-if="planData.planEndTime">{{ parseTime(planData.planEndTime, '{y}-{m}-{d}') }}</span>
  19. <span v-else>-</span>
  20. </el-descriptions-item>
  21. <el-descriptions-item label="责任人">{{ getStaffNameById(planData.responsible) || '-' }}</el-descriptions-item>
  22. <el-descriptions-item label="审批人">{{ getStaffNameById(planData.approver) || '-' }}</el-descriptions-item>
  23. <el-descriptions-item label="计划审批状态">
  24. <el-tag v-if="planData.approvalStatus === '9'" type="" size="mini">未开始</el-tag>
  25. <el-tag v-else-if="planData.approvalStatus === '0'" type="warning" size="mini">待审批</el-tag>
  26. <el-tag v-else-if="planData.approvalStatus === '1'" type="success" size="mini">已通过</el-tag>
  27. <el-tag v-else-if="planData.approvalStatus === '-1'" type="danger" size="mini">未通过</el-tag>
  28. <span v-else>{{ planData.approvalStatus || '-' }}</span>
  29. </el-descriptions-item>
  30. <el-descriptions-item label="计划完成状态">
  31. <el-tag v-if="planData.completionStatus === '9'" type="" size="mini">计划中</el-tag>
  32. <el-tag v-else-if="planData.completionStatus === '0'" type="info" size="mini">未完成</el-tag>
  33. <el-tag v-else-if="planData.completionStatus === '1'" type="success" size="mini">已完成</el-tag>
  34. <el-tag v-else-if="planData.completionStatus === '-1'" type="danger" size="mini">已拒绝</el-tag>
  35. <span v-else>{{ planData.completionStatus || '-' }}</span>
  36. </el-descriptions-item>
  37. <el-descriptions-item label="创建人">{{ planData.createrCode || '-' }}</el-descriptions-item>
  38. <el-descriptions-item label="创建时间">
  39. <span v-if="planData.createdate">{{ parseTime(planData.createdate, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
  40. <span v-else>-</span>
  41. </el-descriptions-item>
  42. <el-descriptions-item label="备注" :span="2">{{ planData.remarks || '-' }}</el-descriptions-item>
  43. </el-descriptions>
  44. </div>
  45. <!-- 设备信息展示 -->
  46. <div class="form-section" v-if="deviceInfo">
  47. <div class="section-header">
  48. <i class="el-icon-s-platform"></i>
  49. <span class="section-title">设备信息</span>
  50. </div>
  51. <el-descriptions :column="3" border size="small">
  52. <el-descriptions-item label="装置">{{ deviceInfo.plant || '-' }}</el-descriptions-item>
  53. <el-descriptions-item label="设备位号">{{ deviceInfo.devTag || '-' }}</el-descriptions-item>
  54. <el-descriptions-item label="设备名称">{{ deviceInfo.devName || '-' }}</el-descriptions-item>
  55. <el-descriptions-item label="位置">{{ deviceInfo.devLoc || '-' }}</el-descriptions-item>
  56. <el-descriptions-item label="设备类型">{{ deviceInfo.devType || '-' }}</el-descriptions-item>
  57. <el-descriptions-item label="区域负责人">{{ deviceInfo.areaResponsible || '-' }}</el-descriptions-item>
  58. </el-descriptions>
  59. </div>
  60. <!-- 维修记录列表 -->
  61. <div class="form-section">
  62. <div class="section-header">
  63. <i class="el-icon-s-grid"></i>
  64. <span class="section-title">维修列表</span>
  65. </div>
  66. <el-table
  67. :data="maintRecords"
  68. border
  69. size="small"
  70. style="margin-top: 10px"
  71. v-loading="recordsLoading">
  72. <el-table-column type="index" label="序号" width="60" align="center" />
  73. <el-table-column label="部件名称" align="center" prop="compoName" width="150" />
  74. <el-table-column label="维修类型" width="80" align="center">
  75. <template slot-scope="scope">
  76. <span v-if="scope.row.maintType === '1'">检查</span>
  77. <span v-else-if="scope.row.maintType === '2'">维修</span>
  78. <span v-else-if="scope.row.maintType === '3'">更换</span>
  79. <span v-else>{{ scope.row.maintType || '-' }}</span>
  80. </template>
  81. </el-table-column>
  82. <el-table-column label="负责人" width="100" align="center">
  83. <template slot-scope="scope">
  84. <span>{{ getStaffNameById(scope.row.responsible) || '-' }}</span>
  85. </template>
  86. </el-table-column>
  87. <el-table-column label="维修状态" width="80" align="center">
  88. <template slot-scope="scope">
  89. <el-tag :type="getRecordStatusTagType(scope.row.recordStatus)" size="small">
  90. {{ getRecordStatusText(scope.row.recordStatus) }}
  91. </el-tag>
  92. <el-tag
  93. v-if="scope.row.memo"
  94. type="warning"
  95. size="small"
  96. style="margin-left: 5px; cursor: pointer;"
  97. @click.native.stop="handleViewMemo(scope.row.memo)">
  98. </el-tag>
  99. </template>
  100. </el-table-column>
  101. <el-table-column label="检查/维修时间" width="120" align="center">
  102. <template slot-scope="scope">
  103. <span v-if="scope.row.inspectTime || scope.row.maintTime">
  104. <span v-if="scope.row.inspectTime">
  105. {{ parseTime(scope.row.inspectTime, '{y}-{m}-{d}') }}
  106. </span>
  107. <span v-if="scope.row.inspectTime && scope.row.maintTime"> / </span>
  108. <span v-if="scope.row.maintTime">
  109. {{ parseTime(scope.row.maintTime, '{y}-{m}-{d}') }}
  110. </span>
  111. </span>
  112. <span v-else>-</span>
  113. </template>
  114. </el-table-column>
  115. <el-table-column label="检查内容" prop="inspectContent" align="center" :show-overflow-tooltip="true" />
  116. <el-table-column label="维修内容" prop="maintContent" align="center" :show-overflow-tooltip="true" />
  117. <el-table-column label="维修结果" prop="maintResult" align="center" width="100" :show-overflow-tooltip="true" />
  118. <el-table-column label="维修费用k" align="center" prop="maintCost" width="100" >
  119. <template slot-scope="scope">
  120. <span v-if="scope.row.maintCost">{{ scope.row.maintCost }}</span>
  121. <span v-else>-</span>
  122. </template>
  123. </el-table-column>
  124. <el-table-column label="维修时长h" align="center" prop="maintDuration" width="100" >
  125. <template slot-scope="scope">
  126. <span v-if="scope.row.maintDuration">{{ scope.row.maintDuration }}</span>
  127. <span v-else>-</span>
  128. </template>
  129. </el-table-column>
  130. <el-table-column label="工艺损失k" align="center" prop="processLoss" width="100" :show-overflow-tooltip="true" />
  131. <el-table-column label="备注" align="center" prop="remarks" :show-overflow-tooltip="true" />
  132. </el-table>
  133. <div v-if="maintRecords.length === 0 && !recordsLoading" style="text-align: center; padding: 20px; color: #909399;">
  134. 暂无维修记录
  135. </div>
  136. </div>
  137. <!-- 查看备忘录详情对话框 -->
  138. <el-dialog title="备忘录详情" :visible.sync="memoDialogVisible" width="700px" append-to-body>
  139. <el-descriptions :column="2" border v-if="memoDetail">
  140. <el-descriptions-item label="装置">{{ memoDetail.plant || '-' }}</el-descriptions-item>
  141. <el-descriptions-item label="设备名称">{{ memoDetail.devName || '-' }}</el-descriptions-item>
  142. <el-descriptions-item label="设备位号">{{ memoDetail.devTag || '-' }}</el-descriptions-item>
  143. <el-descriptions-item label="部件名称">{{ memoDetail.compoName || '-' }}</el-descriptions-item>
  144. <el-descriptions-item label="维修类型">
  145. <span v-if="memoDetail.maintType === '1'">检查</span>
  146. <span v-else-if="memoDetail.maintType === '2'">维修</span>
  147. <span v-else-if="memoDetail.maintType === '3'">更换</span>
  148. <span v-else>{{ memoDetail.maintType || '-' }}</span>
  149. </el-descriptions-item>
  150. <el-descriptions-item label="维修责任人">{{ getStaffNameById(memoDetail.responsible) || '-' }}</el-descriptions-item>
  151. <el-descriptions-item label="维修内容" :span="2">{{ memoDetail.maintContent || '-' }}</el-descriptions-item>
  152. <el-descriptions-item label="备忘原因" :span="2">{{ memoDetail.memoReason || '-' }}</el-descriptions-item>
  153. <el-descriptions-item label="备忘时间">
  154. <span v-if="memoDetail.memoTime">{{ parseTime(memoDetail.memoTime, '{y}-{m}-{d}') }}</span>
  155. <span v-else>-</span>
  156. </el-descriptions-item>
  157. <el-descriptions-item label="备注" :span="2">{{ memoDetail.remarks || '-' }}</el-descriptions-item>
  158. </el-descriptions>
  159. <div slot="footer" class="dialog-footer">
  160. <el-button @click="memoDialogVisible = false">关 闭</el-button>
  161. </div>
  162. </el-dialog>
  163. </div>
  164. </template>
  165. <script>
  166. import { parseTime as formatTime } from "@/utils/ruoyi";
  167. import { getRel_maint_memo } from "@/api/reliability/rel_maint_memo";
  168. export default {
  169. name: "MaintPlanDetailContent",
  170. props: {
  171. planData: {
  172. type: Object,
  173. default: () => ({})
  174. },
  175. deviceInfo: {
  176. type: Object,
  177. default: null
  178. },
  179. maintRecords: {
  180. type: Array,
  181. default: () => []
  182. },
  183. recordsLoading: {
  184. type: Boolean,
  185. default: false
  186. },
  187. staffOptions: {
  188. type: Array,
  189. default: () => []
  190. }
  191. },
  192. data() {
  193. return {
  194. // 备忘录对话框
  195. memoDialogVisible: false,
  196. memoDetail: null
  197. };
  198. },
  199. methods: {
  200. /** 根据员工号获取员工姓名 */
  201. getStaffNameById(staffid) {
  202. if (!staffid) return '';
  203. const staff = this.staffOptions.find(s => s.staffid === staffid);
  204. return staff ? staff.name : staffid;
  205. },
  206. /** 时间格式化 */
  207. parseTime(time, pattern) {
  208. return formatTime(time, pattern);
  209. },
  210. /** 获取维修状态文本 */
  211. getRecordStatusText(status) {
  212. if (status === 9 || status === '9') return '计划中';
  213. if (status === -1 || status === '-1') return '删除申请中';
  214. if (status === 0 || status === '0') return '新增申请中';
  215. if (status === 1 || status === '1') return '待完成';
  216. if (status === 2 || status === '2') return '已完成';
  217. if (status === 3 || status === '3') return '已延期';
  218. return status != null ? status : '-';
  219. },
  220. /** 获取维修状态标签类型 */
  221. getRecordStatusTagType(status) {
  222. if (status === -1 || status === '-1') return 'danger';
  223. if (status === 0 || status === '0') return 'warning';
  224. if (status === 1 || status === '1') return 'info';
  225. if (status === 2 || status === '2') return 'success';
  226. if (status === 3 || status === '3') return 'warning';
  227. return '';
  228. },
  229. /** 查看备忘录 */
  230. handleViewMemo(memo) {
  231. if (memo && memo.memoId) {
  232. // 如果memo对象已经有完整信息,直接显示
  233. this.memoDetail = memo;
  234. this.memoDialogVisible = true;
  235. } else if (memo && memo.recordId) {
  236. // 如果只有recordId,需要通过recordId查询备忘录
  237. // 这里可以根据需要调用API查询
  238. this.memoDetail = memo;
  239. this.memoDialogVisible = true;
  240. }
  241. }
  242. }
  243. };
  244. </script>
  245. <style scoped lang="scss">
  246. .form-section {
  247. margin-bottom: 20px;
  248. .section-header {
  249. display: flex;
  250. align-items: center;
  251. margin-bottom: 15px;
  252. padding-bottom: 10px;
  253. border-bottom: 1px solid #e4e7ed;
  254. .el-icon-info,
  255. .el-icon-s-platform,
  256. .el-icon-s-grid {
  257. font-size: 18px;
  258. color: #409EFF;
  259. margin-right: 8px;
  260. }
  261. .section-title {
  262. font-size: 16px;
  263. font-weight: 600;
  264. color: #303133;
  265. }
  266. }
  267. }
  268. </style>