Order-circulation-record.vue 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <template>
  2. <div>
  3. <el-dialog v-model="state.dialogVisible" draggable title="流转记录" width="80%" append-to-body>
  4. <div v-loading="state.loading">
  5. <el-form label-width="90px" ref="ruleFormRef">
  6. <el-row :gutter="35">
  7. <el-col :xs="24" :sm="8" :md="8" :lg="8" :xl="8">
  8. <el-form-item label="工单编码"> {{ state.ruleForm.no }} </el-form-item>
  9. </el-col>
  10. <el-col :xs="24" :sm="16" :md="16" :lg="16" :xl="16">
  11. <el-form-item label="工单标题"> {{ state.ruleForm.title }} </el-form-item>
  12. </el-col>
  13. </el-row>
  14. </el-form>
  15. <process-time-line :data="state.traces" defaultExpandAll/>
  16. </div>
  17. <template #footer>
  18. <span class="dialog-footer">
  19. <el-button class="default-button" @click="state.dialogVisible = false">关闭</el-button>
  20. </span>
  21. </template>
  22. </el-dialog>
  23. </div>
  24. </template>
  25. <script setup lang="ts" name="orderCirculationRecord">
  26. import { reactive, ref, defineAsyncComponent } from 'vue';
  27. import { workflowTraces } from '/@/api/system/workflow';
  28. const ProcessTimeLine = defineAsyncComponent(() => import('/@/components/ProcessTimeLine/index.vue')); // 流程时间轴
  29. // 定义变量内容
  30. const state = reactive<any>({
  31. dialogVisible: false, // 弹窗显示隐藏
  32. ruleForm: {}, // 表单数据
  33. loading: false, // 加载状态
  34. traces: [] // 流转记录
  35. });
  36. const ruleFormRef = ref<RefType>();
  37. // 打开弹窗
  38. const openDialog = async (val: any) => {
  39. try {
  40. state.loading = true;
  41. const res = await workflowTraces(val.workflowId);
  42. state.traces = res.result?.traces ?? [];
  43. state.traces = formatTraces(state.traces);
  44. state.ruleForm = val;
  45. state.dialogVisible = true;
  46. state.loading = false;
  47. } catch (error) {
  48. state.loading = false;
  49. }
  50. };
  51. const formatTraces = (val: any) => {
  52. if (!val || !val.length) return [];
  53. val.forEach((item: any) => {
  54. switch (item.expiredStatus) {
  55. case 0:
  56. item.type = 'success';
  57. break;
  58. case 1:
  59. item.type = 'primary';
  60. break;
  61. case 2:
  62. item.type = 'danger';
  63. break;
  64. default:
  65. break;
  66. }
  67. if (item.traces?.length) {
  68. formatTraces(item.traces);
  69. }
  70. });
  71. return val;
  72. };
  73. // 关闭弹窗
  74. const closeDialog = () => {
  75. state.dialogVisible = false;
  76. };
  77. // 暴露变量
  78. defineExpose({
  79. openDialog,
  80. closeDialog,
  81. });
  82. </script>
  83. <style lang="scss" scoped></style>