FlowTable.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <template>
  2. <view class="container">
  3. <ApprovalFlow
  4. :list="groupedNodes"
  5. :currentNode="currentNode"
  6. :loading="fetchFlowLoading"
  7. />
  8. </view>
  9. </template>
  10. <script setup lang="ts">
  11. import { watch, computed, ref } from 'vue';
  12. import ApprovalFlow from '@/components/ApprovalFlow.vue';
  13. import { useFlowApi } from '@/api/flow/index';
  14. import to from 'await-to-js';
  15. /**
  16. * 接收来自父组件的流程属性配置
  17. */
  18. const props = defineProps({
  19. id: { type: Number, default: 0 },
  20. businessCode: { type: String, default: '' },
  21. defCode: { type: String, default: '' },
  22. memberList: { type: Array, default: () => [] }
  23. });
  24. const flowApi = useFlowApi();
  25. // 审批实例节点列表(组件内独立维护,避免多个 FlowTable 互相覆盖)
  26. const apprList = ref<any[]>([]);
  27. // 当前处于的节点
  28. const currentNode = ref<string>('');
  29. // 加载状态
  30. const fetchFlowLoading = ref<boolean>(false);
  31. // 将原始审批记录按节点分组
  32. const groupedNodes = computed(() => {
  33. const list = apprList.value || [];
  34. if (!list.length) return [];
  35. const map: Record<string, any> = {};
  36. list.forEach((item: any) => {
  37. const key = item.nodeId || `node_${item.nodeTitle || ''}`;
  38. if (!map[key]) {
  39. map[key] = {
  40. nodeId: item.nodeId,
  41. nodeTitle: item.nodeTitle,
  42. nodeType: item.nodeType,
  43. nodeModel: item.nodeModel,
  44. items: [] as any[]
  45. };
  46. }
  47. map[key].items.push(item);
  48. });
  49. return Object.values(map);
  50. });
  51. const fetchFlowInstance = async () => {
  52. if (!props.id) return;
  53. fetchFlowLoading.value = true;
  54. apprList.value = [];
  55. currentNode.value = '';
  56. const params = { id: props.id, businessCode: props.businessCode, defCode: props.defCode };
  57. const [err, res] = await to(flowApi.getFlowInstance(params)) as [any, any];
  58. fetchFlowLoading.value = false;
  59. if (err) {
  60. console.error('获取审批流实例失败:', err);
  61. return;
  62. }
  63. if (res && res.code === 200) {
  64. const arr = res.data?.nodes || [];
  65. // 匹配附加数据
  66. apprList.value = arr.map((item: any) => {
  67. const obj = (props.memberList as any[]).find((i: any) => i.memberId === item.userId);
  68. return {
  69. ...item,
  70. templateContent: obj?.templateContent || null
  71. };
  72. });
  73. currentNode.value = res.data?.nodeId || '';
  74. }
  75. };
  76. /**
  77. * 监听属性变化并在有传入的时候触发拉取审批流信息
  78. */
  79. watch(
  80. () => [props.id, props.businessCode, props.defCode],
  81. () => {
  82. fetchFlowInstance();
  83. },
  84. { deep: true, immediate: true }
  85. );
  86. </script>
  87. <style lang="scss" scoped>
  88. .container {
  89. padding: 0 10rpx;
  90. }
  91. </style>