ProcessInstanceOperationButton.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685
  1. <template>
  2. <div
  3. class="h-50px bottom-10 text-14px flex items-center color-#32373c dark:color-#fff font-bold btn-container"
  4. v-if="runningTask.id"
  5. >
  6. <!-- 【通过】按钮 -->
  7. <el-popover
  8. :visible="popOverVisible.approve"
  9. placement="top-end"
  10. :width="420"
  11. trigger="click"
  12. v-if="isShowButton(OperationButtonType.APPROVE)"
  13. >
  14. <template #reference>
  15. <el-button plain type="success" @click="openPopover('approve')">
  16. <Icon icon="ep:select" />&nbsp; {{ getButtonDisplayName(OperationButtonType.APPROVE) }}
  17. </el-button>
  18. </template>
  19. <!-- 审批表单 -->
  20. <div class="flex flex-col flex-1 pt-20px px-20px" v-loading="formLoading">
  21. <el-form
  22. label-position="top"
  23. class="mb-auto"
  24. ref="formRef"
  25. :model="genericForm"
  26. :rules="genericRule"
  27. label-width="100px"
  28. >
  29. <el-card v-if="runningTask.formId > 0" class="mb-15px !-mt-10px">
  30. <template #header>
  31. <span class="el-icon-picture-outline"> 填写表单【{{ runningTask?.formName }}】 </span>
  32. </template>
  33. <form-create
  34. v-model="approveForm.value"
  35. v-model:api="approveFormFApi"
  36. :option="approveForm.option"
  37. :rule="approveForm.rule"
  38. />
  39. </el-card>
  40. <el-form-item label="审批意见" prop="reason">
  41. <el-input v-model="genericForm.reason" placeholder="请输入审批意见" type="textarea" :rows="4" />
  42. </el-form-item>
  43. <el-form-item>
  44. <el-button :disabled="formLoading" type="success" @click="handleAudit(true)">
  45. {{ getButtonDisplayName(OperationButtonType.APPROVE) }}
  46. </el-button>
  47. <el-button @click="popOverVisible.approve = false"> 取消 </el-button>
  48. </el-form-item>
  49. </el-form>
  50. </div>
  51. </el-popover>
  52. <!-- 【拒绝】按钮 -->
  53. <el-popover
  54. :visible="popOverVisible.reject"
  55. placement="top-end"
  56. :width="420"
  57. trigger="click"
  58. v-if="isShowButton(OperationButtonType.REJECT)"
  59. >
  60. <template #reference>
  61. <el-button class="mr-20px" plain type="danger" @click="openPopover('reject')">
  62. <Icon icon="ep:close" />&nbsp; {{ getButtonDisplayName(OperationButtonType.REJECT) }}
  63. </el-button>
  64. </template>
  65. <!-- 审批表单 -->
  66. <div class="flex flex-col flex-1 pt-20px px-20px" v-loading="formLoading">
  67. <el-form
  68. label-position="top"
  69. class="mb-auto"
  70. ref="formRef"
  71. :model="genericForm"
  72. :rules="genericRule"
  73. label-width="100px"
  74. >
  75. <el-card v-if="runningTask.formId > 0" class="mb-15px !-mt-10px">
  76. <template #header>
  77. <span class="el-icon-picture-outline"> 填写表单【{{ runningTask?.formName }}】 </span>
  78. </template>
  79. <form-create
  80. v-model="approveForm.value"
  81. v-model:api="approveFormFApi"
  82. :option="approveForm.option"
  83. :rule="approveForm.rule"
  84. />
  85. </el-card>
  86. <el-form-item label="审批意见" prop="reason">
  87. <el-input v-model="genericForm.reason" placeholder="请输入审批意见" type="textarea" :rows="4" />
  88. </el-form-item>
  89. <el-form-item>
  90. <el-button :disabled="formLoading" type="danger" @click="handleAudit(false)">
  91. {{ getButtonDisplayName(OperationButtonType.REJECT) }}
  92. </el-button>
  93. <el-button @click="popOverVisible.reject = false"> 取消 </el-button>
  94. </el-form-item>
  95. </el-form>
  96. </div>
  97. </el-popover>
  98. <!-- 【抄送】按钮 -->
  99. <el-popover
  100. :visible="popOverVisible.copy"
  101. placement="top-start"
  102. :width="420"
  103. trigger="click"
  104. v-if="isShowButton(OperationButtonType.COPY)"
  105. >
  106. <template #reference>
  107. <div @click="openPopover('copy')" class="hover-bg-gray-100 rounded-xl p-6px" >
  108. <Icon :size="14" icon="svg-icon:send" />&nbsp;
  109. {{ getButtonDisplayName(OperationButtonType.COPY) }}
  110. </div>
  111. </template>
  112. <div class="flex flex-col flex-1 pt-20px px-20px" v-loading="formLoading">
  113. <el-form
  114. label-position="top"
  115. class="mb-auto"
  116. ref="formRef"
  117. :model="genericForm"
  118. :rules="genericRule"
  119. label-width="100px"
  120. >
  121. <el-form-item label="抄送人" prop="copyUserIds">
  122. <el-select v-model="genericForm.copyUserIds" clearable style="width: 100%" multiple placeholder="请选择抄送人">
  123. <el-option
  124. v-for="item in userOptions"
  125. :key="item.id"
  126. :label="item.nickname"
  127. :value="item.id"
  128. />
  129. </el-select>
  130. </el-form-item>
  131. <el-form-item label="抄送意见" prop="copyReason">
  132. <el-input v-model="genericForm.copyReason" clearable placeholder="请输入抄送意见" type="textarea" :rows="3" />
  133. </el-form-item>
  134. <el-form-item>
  135. <el-button :disabled="formLoading" type="primary" @click="handleCopy">
  136. {{ getButtonDisplayName(OperationButtonType.COPY) }}
  137. </el-button>
  138. <el-button @click="popOverVisible.copy = false"> 取消 </el-button>
  139. </el-form-item>
  140. </el-form>
  141. </div>
  142. </el-popover>
  143. <!-- 【转交】按钮 -->
  144. <el-popover
  145. :visible="popOverVisible.transfer"
  146. placement="top-start"
  147. :width="420"
  148. trigger="click"
  149. v-if="isShowButton(OperationButtonType.TRANSFER)"
  150. >
  151. <template #reference>
  152. <div @click="openPopover('transfer')" class="hover-bg-gray-100 rounded-xl p-6px" >
  153. <Icon :size="14" icon="fa:share-square-o" />&nbsp;
  154. {{ getButtonDisplayName(OperationButtonType.TRANSFER) }}
  155. </div>
  156. </template>
  157. <div class="flex flex-col flex-1 pt-20px px-20px" v-loading="formLoading">
  158. <el-form
  159. label-position="top"
  160. class="mb-auto"
  161. ref="formRef"
  162. :model="genericForm"
  163. :rules="genericRule"
  164. label-width="100px"
  165. >
  166. <el-form-item label="新审批人" prop="assigneeUserId">
  167. <el-select v-model="genericForm.assigneeUserId" clearable style="width: 100%">
  168. <el-option
  169. v-for="item in userOptions"
  170. :key="item.id"
  171. :label="item.nickname"
  172. :value="item.id"
  173. />
  174. </el-select>
  175. </el-form-item>
  176. <el-form-item label="审批意见" prop="reason">
  177. <el-input v-model="genericForm.reason" clearable placeholder="请输入审批意见" type="textarea" :rows="3" />
  178. </el-form-item>
  179. <el-form-item>
  180. <el-button :disabled="formLoading" type="primary" @click="handleTransfer()">
  181. {{ getButtonDisplayName(OperationButtonType.TRANSFER) }}
  182. </el-button>
  183. <el-button @click="popOverVisible.transfer = false"> 取消 </el-button>
  184. </el-form-item>
  185. </el-form>
  186. </div>
  187. </el-popover>
  188. <!-- 【委派】按钮 -->
  189. <el-popover
  190. :visible="popOverVisible.delegate"
  191. placement="top-start"
  192. :width="420"
  193. trigger="click"
  194. v-if="isShowButton(OperationButtonType.DELEGATE)"
  195. >
  196. <template #reference>
  197. <div @click="openPopover('delegate')" class="hover-bg-gray-100 rounded-xl p-6px" >
  198. <Icon :size="14" icon="ep:position" />&nbsp;
  199. {{ getButtonDisplayName(OperationButtonType.DELEGATE) }}
  200. </div>
  201. </template>
  202. <div class="flex flex-col flex-1 pt-20px px-20px" v-loading="formLoading">
  203. <el-form
  204. label-position="top"
  205. class="mb-auto"
  206. ref="formRef"
  207. :model="genericForm"
  208. :rules="genericRule"
  209. label-width="100px"
  210. >
  211. <el-form-item label="接收人" prop="delegateUserId">
  212. <el-select v-model="genericForm.delegateUserId" clearable style="width: 100%">
  213. <el-option
  214. v-for="item in userOptions"
  215. :key="item.id"
  216. :label="item.nickname"
  217. :value="item.id"
  218. />
  219. </el-select>
  220. </el-form-item>
  221. <el-form-item label="审批意见" prop="reason">
  222. <el-input v-model="genericForm.reason" clearable placeholder="请输入审批意见" type="textarea" :rows="3" />
  223. </el-form-item>
  224. <el-form-item>
  225. <el-button :disabled="formLoading" type="primary" @click="handleDelegate()">
  226. {{ getButtonDisplayName(OperationButtonType.DELEGATE) }}
  227. </el-button>
  228. <el-button @click="popOverVisible.delegate = false"> 取消 </el-button>
  229. </el-form-item>
  230. </el-form>
  231. </div>
  232. </el-popover>
  233. <!-- 【加签】按钮 当前任务审批人为A,向前加签选了一个C,则需要C先审批,然后再是A审批,向后加签B,A审批完,需要B再审批完,才算完成这个任务节点 -->
  234. <el-popover
  235. :visible="popOverVisible.addSign"
  236. placement="top-start"
  237. :width="420"
  238. trigger="click"
  239. v-if="isShowButton(OperationButtonType.ADD_SIGN)"
  240. >
  241. <template #reference>
  242. <div @click="openPopover('addSign')" class="hover-bg-gray-100 rounded-xl p-6px" >
  243. <Icon :size="14" icon="ep:plus" />&nbsp;
  244. {{ getButtonDisplayName(OperationButtonType.ADD_SIGN) }}
  245. </div>
  246. </template>
  247. <div class="flex flex-col flex-1 pt-20px px-20px" v-loading="formLoading">
  248. <el-form
  249. label-position="top"
  250. class="mb-auto"
  251. ref="formRef"
  252. :model="genericForm"
  253. :rules="genericRule"
  254. label-width="100px"
  255. >
  256. <el-form-item label="加签处理人" prop="addSignUserIds">
  257. <el-select v-model="genericForm.addSignUserIds" multiple clearable style="width: 100%">
  258. <el-option
  259. v-for="item in userOptions"
  260. :key="item.id"
  261. :label="item.nickname"
  262. :value="item.id"
  263. />
  264. </el-select>
  265. </el-form-item>
  266. <el-form-item label="审批意见" prop="reason">
  267. <el-input v-model="genericForm.reason" clearable placeholder="请输入审批意见" type="textarea" :rows="3" />
  268. </el-form-item>
  269. <el-form-item>
  270. <el-button :disabled="formLoading" type="primary" @click="handlerAddSign('before')">
  271. 向前{{ getButtonDisplayName(OperationButtonType.ADD_SIGN) }}
  272. </el-button>
  273. <el-button :disabled="formLoading" type="primary" @click="handlerAddSign('after')">
  274. 向后{{ getButtonDisplayName(OperationButtonType.ADD_SIGN) }}
  275. </el-button>
  276. <el-button @click="popOverVisible.addSign = false"> 取消 </el-button>
  277. </el-form-item>
  278. </el-form>
  279. </div>
  280. </el-popover>
  281. <!-- TODO @jason:减签 -->
  282. <!-- 【退回】按钮 -->
  283. <el-popover
  284. :visible="popOverVisible.return"
  285. placement="top-start"
  286. :width="420"
  287. trigger="click"
  288. v-if="isShowButton(OperationButtonType.RETURN)"
  289. >
  290. <template #reference>
  291. <div @click="openReturnPopover" class="hover-bg-gray-100 rounded-xl p-6px" >
  292. <Icon :size="14" icon="fa:mail-reply" />&nbsp;
  293. {{ getButtonDisplayName(OperationButtonType.RETURN) }}
  294. </div>
  295. </template>
  296. <div class="flex flex-col flex-1 pt-20px px-20px" v-loading="formLoading">
  297. <el-form
  298. label-position="top"
  299. class="mb-auto"
  300. ref="formRef"
  301. :model="genericForm"
  302. :rules="genericRule"
  303. label-width="100px"
  304. >
  305. <el-form-item label="退回节点" prop="targetTaskDefinitionKey">
  306. <el-select v-model="genericForm.targetTaskDefinitionKey" clearable style="width: 100%">
  307. <el-option
  308. v-for="item in returnList"
  309. :key="item.taskDefinitionKey"
  310. :label="item.name"
  311. :value="item.taskDefinitionKey"
  312. />
  313. </el-select>
  314. </el-form-item>
  315. <el-form-item label="退回理由" prop="returnReason">
  316. <el-input v-model="genericForm.returnReason" clearable placeholder="请输入退回理由" type="textarea" :rows="3" />
  317. </el-form-item>
  318. <el-form-item>
  319. <el-button :disabled="formLoading" type="primary" @click="handleReturn()">
  320. {{ getButtonDisplayName(OperationButtonType.RETURN) }}
  321. </el-button>
  322. <el-button @click="popOverVisible.return = false"> 取消 </el-button>
  323. </el-form-item>
  324. </el-form>
  325. </div>
  326. </el-popover>
  327. <!--TODO @jason:撤回 -->
  328. <!--TODO @jason:再次发起 -->
  329. </div>
  330. </template>
  331. <script lang="ts" setup>
  332. import { setConfAndFields2 } from '@/utils/formCreate'
  333. import { useUserStore } from '@/store/modules/user'
  334. import * as TaskApi from '@/api/bpm/task'
  335. import { propTypes } from '@/utils/propTypes'
  336. import { isEmpty } from '@/utils/is'
  337. import {
  338. OperationButtonType,
  339. OPERATION_BUTTON_NAME
  340. } from '@/components/SimpleProcessDesignerV2/src/consts'
  341. defineOptions({ name: 'ProcessInstanceBtnConatiner' })
  342. const userId = useUserStore().getUser.id // 当前登录的编号
  343. const message = useMessage() // 消息弹窗
  344. const { proxy } = getCurrentInstance() as any
  345. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  346. defineProps({
  347. processInstance: propTypes.any, // 流程实例信息
  348. userOptions: propTypes.any
  349. })
  350. const formLoading = ref(false) // 表单加载中
  351. /** 气泡卡是否展示 */
  352. const popOverVisible = ref({
  353. approve: false,
  354. reject: false,
  355. transfer: false,
  356. delegate: false,
  357. addSign: false,
  358. return : false,
  359. copy: false
  360. })
  361. /** 退回节点 */
  362. const returnList = ref([] as any)
  363. // ========== 审批信息 ==========
  364. const runningTask = ref<any>({}) // 运行中的任务
  365. const genericForm = ref<any>({}) // 通用表单
  366. const approveForm = ref<any>({}) // 审批通过时,额外的补充信息
  367. const approveFormFApi = ref<any>({}) // approveForms 的 fAPi
  368. const formRef = ref()
  369. /** 表单校验规则 */
  370. const genericRule = reactive({
  371. reason: [{ required: true, message: '审批意见不能为空', trigger: 'blur' }],
  372. returnReason: [{ required: true, message: '退回理由不能为空', trigger: 'blur' }],
  373. copyUserIds: [{ required: true, message: '抄送人不能为空', trigger: 'change' }],
  374. assigneeUserId:[{ required: true, message: '新审批人不能为空', trigger: 'change' }],
  375. delegateUserId: [{ required: true, message: '接收人不能为空', trigger: 'change' }],
  376. addSignUserIds: [{ required: true, message: '加签处理人不能为空', trigger: 'change' }]
  377. })
  378. /** 监听 approveFormFApis,实现它对应的 form-create 初始化后,隐藏掉对应的表单提交按钮 */
  379. watch(
  380. () => approveFormFApi.value,
  381. (val) => {
  382. val?.btn?.show(false)
  383. val?.resetBtn?.show(false)
  384. },
  385. {
  386. deep: true
  387. }
  388. )
  389. // TODO @jaosn:具体的审批任务,要不改成后端返回。让前端弱化下
  390. /**
  391. * 设置 runningTasks 中的任务
  392. */
  393. const loadRunningTask = (tasks: any[]) => {
  394. runningTask.value = {}
  395. genericForm.value = {}
  396. approveForm.value = {}
  397. approveFormFApi.value = {}
  398. tasks.forEach((task: any) => {
  399. if (!isEmpty(task.children)) {
  400. loadRunningTask(task.children)
  401. }
  402. // 2.1 只有待处理才需要
  403. if (task.status !== 1 && task.status !== 6) {
  404. return
  405. }
  406. // 2.2 自己不是处理人
  407. if (!task.assigneeUser || task.assigneeUser.id !== userId) {
  408. return
  409. }
  410. // 2.3 添加到处理任务
  411. runningTask.value = { ...task }
  412. genericForm.value = {
  413. reason: '',
  414. copyUserIds: []
  415. }
  416. // 2.4 处理 approve 表单
  417. if (task.formId && task.formConf) {
  418. const tempApproveForm = {}
  419. setConfAndFields2(tempApproveForm, task.formConf, task.formFields, task.formVariables)
  420. approveForm.value = tempApproveForm
  421. } else {
  422. approveForm.value = {} // 占位,避免为空
  423. }
  424. })
  425. }
  426. /** 处理审批通过和不通过的操作 */
  427. const handleAudit = async (pass: boolean) => {
  428. formLoading.value = true
  429. try {
  430. const genericFormRef = proxy.$refs['formRef']
  431. // 1.2 校验表单
  432. const elForm = unref(genericFormRef)
  433. if (!elForm) return
  434. const valid = await elForm.validate()
  435. if (!valid) return
  436. // 2.1 提交审批
  437. const data = {
  438. id: runningTask.value.id,
  439. reason: genericForm.value.reason
  440. }
  441. if (pass) {
  442. // 审批通过,并且有额外的 approveForm 表单,需要校验 + 拼接到 data 表单里提交
  443. const formCreateApi = approveFormFApi.value
  444. if (Object.keys(formCreateApi)?.length > 0) {
  445. await formCreateApi.validate()
  446. // @ts-ignore
  447. data.variables = approveForm.value.value
  448. }
  449. await TaskApi.approveTask(data)
  450. popOverVisible.value.approve = false
  451. message.success('审批通过成功')
  452. } else {
  453. await TaskApi.rejectTask(data)
  454. popOverVisible.value.reject = false
  455. message.success('审批不通过成功')
  456. }
  457. // 2.2 加载最新数据
  458. getDetail()
  459. } finally {
  460. formLoading.value = false
  461. }
  462. }
  463. /* 处理抄送 */
  464. const handleCopy = async () => {
  465. formLoading.value = true
  466. try {
  467. const copyFormRef = proxy.$refs['formRef']
  468. // 1. 校验表单
  469. const elForm = unref(copyFormRef)
  470. if (!elForm) return
  471. const valid = await elForm.validate()
  472. if (!valid) return
  473. // 2. 提交抄送
  474. const data = {
  475. id: runningTask.value.id,
  476. reason: genericForm.value.copyReason,
  477. copyUserIds: genericForm.value.copyUserIds
  478. }
  479. await TaskApi.copyTask(data)
  480. popOverVisible.value.copy = false
  481. message.success('操作成功')
  482. } finally {
  483. formLoading.value = false
  484. }
  485. }
  486. /** 处理转交 */
  487. const handleTransfer = async () => {
  488. formLoading.value = true
  489. try {
  490. const transferFormRef = proxy.$refs['formRef']
  491. // 1.1 校验表单
  492. const elForm = unref(transferFormRef)
  493. if (!elForm) return
  494. const valid = await elForm.validate()
  495. if (!valid) return
  496. // 1.2 提交转交
  497. const data = {
  498. id: runningTask.value.id,
  499. reason: genericForm.value.reason,
  500. assigneeUserId: genericForm.value.assigneeUserId
  501. }
  502. await TaskApi.transferTask(data)
  503. popOverVisible.value.transfer = false
  504. message.success('操作成功')
  505. // 2. 加载最新数据
  506. getDetail()
  507. } finally {
  508. formLoading.value = false
  509. }
  510. }
  511. /** 处理委派 */
  512. const handleDelegate = async () => {
  513. formLoading.value = true
  514. try {
  515. const deletegateFormRef = proxy.$refs['formRef']
  516. // 1.1 校验表单
  517. const elForm = unref(deletegateFormRef)
  518. if (!elForm) return
  519. const valid = await elForm.validate()
  520. if (!valid) return
  521. // 1.2 处理委派
  522. const data = {
  523. id: runningTask.value.id,
  524. reason: genericForm.value.reason,
  525. delegateUserId: genericForm.value.delegateUserId
  526. }
  527. await TaskApi.delegateTask(data)
  528. popOverVisible.value.delegate = false
  529. message.success('操作成功')
  530. // 2. 加载最新数据
  531. getDetail()
  532. } finally {
  533. formLoading.value = false
  534. }
  535. }
  536. /** 处理加签 */
  537. const handlerAddSign = async (type: string) => {
  538. formLoading.value = true
  539. try {
  540. const transferFormRef = proxy.$refs['formRef']
  541. // 1.1 校验表单
  542. const elForm = unref(transferFormRef)
  543. if (!elForm) return
  544. const valid = await elForm.validate()
  545. if (!valid) return
  546. // 1.2 提交加签
  547. const data = {
  548. id: runningTask.value.id,
  549. type,
  550. reason: genericForm.value.reason,
  551. userIds: genericForm.value.addSignUserIds
  552. }
  553. await TaskApi.signCreateTask(data)
  554. message.success('操作成功')
  555. popOverVisible.value.addSign = false
  556. // 2 加载最新数据
  557. getDetail()
  558. } finally {
  559. formLoading.value = false
  560. }
  561. }
  562. /** 处理退回 */
  563. const handleReturn = async () => {
  564. formLoading.value = true
  565. try {
  566. const returnFormRef = proxy.$refs['formRef']
  567. // 1.1 校验表单
  568. const elForm = unref(returnFormRef)
  569. if (!elForm) return
  570. const valid = await elForm.validate()
  571. if (!valid) return
  572. // 1.2 提交退回
  573. const data = {
  574. id: runningTask.value.id,
  575. reason: genericForm.value.returnReason,
  576. targetTaskDefinitionKey: genericForm.value.targetTaskDefinitionKey
  577. }
  578. await TaskApi.returnTask(data)
  579. popOverVisible.value.return = false
  580. message.success('操作成功')
  581. // 2 加载最新数据
  582. getDetail()
  583. } finally {
  584. formLoading.value = false
  585. }
  586. }
  587. /** 弹出退回气泡卡 */
  588. const openReturnPopover = async () => {
  589. returnList.value = await TaskApi.getTaskListByReturn(runningTask.value.id)
  590. if (returnList.value.length === 0) {
  591. message.warning('当前没有可退回的节点')
  592. return
  593. }
  594. openPopover('return')
  595. }
  596. /** 弹出气泡卡 */
  597. const openPopover = (type: string ) => {
  598. Object.keys(popOverVisible.value).forEach( item => {
  599. if( item === type) {
  600. popOverVisible.value[item] = true
  601. } else {
  602. popOverVisible.value[item] = false
  603. }
  604. })
  605. formRef.value.resetFields()
  606. }
  607. /** 获得详情 */
  608. const getDetail = () => {
  609. emit('success')
  610. }
  611. /** 是否显示按钮 */
  612. const isShowButton = (btnType: OperationButtonType): boolean => {
  613. let isShow = true
  614. if (runningTask.value.buttonsSetting && runningTask.value.buttonsSetting[btnType]) {
  615. isShow = runningTask.value.buttonsSetting[btnType].enable
  616. }
  617. return isShow
  618. }
  619. /** 获取按钮的显示名称 */
  620. const getButtonDisplayName = (btnType: OperationButtonType) => {
  621. let displayName = OPERATION_BUTTON_NAME.get(btnType)
  622. if (runningTask.value.buttonsSetting && runningTask.value.buttonsSetting[btnType]) {
  623. displayName = runningTask.value.buttonsSetting[btnType].displayName
  624. }
  625. return displayName
  626. }
  627. defineExpose({ loadRunningTask })
  628. </script>
  629. <style lang="scss" scoped>
  630. :deep(.el-affix--fixed) {
  631. background-color: var(--el-bg-color);
  632. }
  633. .btn-container {
  634. > div {
  635. display: flex;
  636. margin: 0 15px;
  637. cursor: pointer;
  638. align-items: center;
  639. &:hover {
  640. color: #6db5ff;
  641. }
  642. }
  643. }
  644. </style>