index.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <template>
  2. <div class="approval-flow-container">
  3. <div class="page-header">
  4. <PageTitle title="审批流程" />
  5. <el-button type="danger" @click="handleAddFlow">新增流程</el-button>
  6. </div>
  7. <el-table v-loading="loading" :data="flowList" border>
  8. <el-table-column prop="flowName" label="流程名称" min-width="200" />
  9. <el-table-column prop="status" label="流程状态" min-width="120">
  10. <template #default="{ row }">
  11. <span :class="['status-text', row.status === '1' ? 'active' : '']">
  12. {{ row.status === '1' ? '生效' : '禁用' }}
  13. </span>
  14. </template>
  15. </el-table-column>
  16. <el-table-column prop="createTime" label="创建时间" min-width="180" />
  17. <el-table-column label="操作" width="200" align="center">
  18. <template #default="{ row }">
  19. <el-button type="primary" link size="small" @click="handleEdit(row)">编辑</el-button>
  20. <el-button
  21. :type="row.status === '1' ? 'warning' : 'success'"
  22. link
  23. size="small"
  24. @click="handleToggleStatus(row)"
  25. >{{ row.status === '1' ? '关闭' : '开启' }}</el-button>
  26. <el-button type="danger" link size="small" @click="handleDisable(row)">删除</el-button>
  27. </template>
  28. </el-table-column>
  29. </el-table>
  30. </div>
  31. </template>
  32. <script setup lang="ts">
  33. import { ref, onMounted } from 'vue';
  34. import { useRouter } from 'vue-router';
  35. import { ElMessage, ElMessageBox } from 'element-plus';
  36. import { PageTitle } from '@/components';
  37. import { getOrderFlowList, deleteOrderFlow, startOrderFlow, closeOrderFlow } from '@/api/pc/enterprise/order';
  38. import type { OrderCustomerFlow } from '@/api/pc/enterprise/orderTypes';
  39. const router = useRouter();
  40. const loading = ref(false);
  41. const flowList = ref<OrderCustomerFlow[]>([]);
  42. /** 加载流程列表 */
  43. const loadFlowList = async () => {
  44. loading.value = true;
  45. try {
  46. const res = await getOrderFlowList();
  47. flowList.value = res.rows || [];
  48. } catch (e) {
  49. ElMessage.error('加载流程列表失败');
  50. } finally {
  51. loading.value = false;
  52. }
  53. };
  54. onMounted(() => {
  55. loadFlowList();
  56. });
  57. const handleAddFlow = () => {
  58. router.push('/organization/approvalFlow/create');
  59. };
  60. const handleEdit = (row: OrderCustomerFlow) => {
  61. router.push(`/organization/approvalFlow/create?id=${row.id}`);
  62. };
  63. const handleToggleStatus = (row: OrderCustomerFlow) => {
  64. const isActive = row.status === '1';
  65. const actionText = isActive ? '关闭' : '开启';
  66. ElMessageBox.confirm(`确定要${actionText}"${row.flowName}"吗?`, '提示', {
  67. confirmButtonText: '确定',
  68. cancelButtonText: '取消',
  69. type: 'warning'
  70. })
  71. .then(async () => {
  72. try {
  73. if (isActive) {
  74. await closeOrderFlow(row.id as number);
  75. } else {
  76. await startOrderFlow(row.id as number);
  77. }
  78. ElMessage.success(`${actionText}成功`);
  79. loadFlowList();
  80. } catch (e) {
  81. ElMessage.error(`${actionText}失败`);
  82. }
  83. })
  84. .catch(() => {});
  85. };
  86. const handleDisable = (row: OrderCustomerFlow) => {
  87. ElMessageBox.confirm(`确定要删除"${row.flowName}"吗?`, '提示', {
  88. confirmButtonText: '确定',
  89. cancelButtonText: '取消',
  90. type: 'warning'
  91. })
  92. .then(async () => {
  93. try {
  94. await deleteOrderFlow(row.id!);
  95. ElMessage.success('删除成功');
  96. loadFlowList();
  97. } catch (e) {
  98. ElMessage.error('删除失败');
  99. }
  100. })
  101. .catch(() => {});
  102. };
  103. </script>
  104. <style scoped lang="scss">
  105. .approval-flow-container {
  106. padding: 20px;
  107. background: #fff;
  108. min-height: 100%;
  109. }
  110. .page-header {
  111. display: flex;
  112. justify-content: space-between;
  113. align-items: center;
  114. margin-bottom: 20px;
  115. :deep(.page-title) {
  116. margin-bottom: 0;
  117. }
  118. }
  119. :deep(.el-table) {
  120. th.el-table__cell {
  121. background: #fafafa;
  122. font-weight: 500;
  123. color: #333;
  124. }
  125. .el-table__cell {
  126. padding: 12px 0;
  127. }
  128. }
  129. .status-text {
  130. color: #999;
  131. &.active {
  132. color: #67c23a;
  133. }
  134. }
  135. </style>