gaoluyang
2026-06-24 712aa51536236d43e87273e4ce45ac5691dffad8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<script lang="ts" setup>
import { ref } from 'vue';
 
import { useVbenModal } from '..\..\..\..\..\packages\effects\common-ui\src';
import { IconifyIcon } from '..\..\..\..\..\packages\icons\src';
import { base64ToFile } from '..\..\..\..\..\packages\utils\src';
 
import { Button, Tooltip } from 'ant-design-vue';
import Vue3Signature from 'vue3-signature';
 
import { uploadFile } from '#/api/infra/file';
 
defineOptions({
  name: 'BpmProcessInstanceSignature',
});
 
const emits = defineEmits(['success']);
 
const signature = ref<InstanceType<typeof Vue3Signature>>();
 
const [Modal, modalApi] = useVbenModal({
  async onConfirm() {
    modalApi.lock();
    try {
      const signFileUrl = await uploadFile({
        file: base64ToFile(signature?.value?.save('image/jpeg') || '', '签名'),
      });
      emits('success', signFileUrl);
      await modalApi.close();
    } finally {
      modalApi.unlock();
    }
  },
});
</script>
 
<template>
  <Modal title="流程签名" class="w-3/5">
    <div class="flex h-[50vh] flex-col">
      <div class="mb-2 flex justify-end gap-2">
        <Tooltip title="撤销上一步操作">
          <Button @click="signature?.undo()" size="small">
            <template #icon>
              <IconifyIcon icon="lucide:undo" class="mb-1 size-3" />
            </template>
            撤销
          </Button>
        </Tooltip>
        <Tooltip title="清空画布">
          <Button @click="signature?.clear()" size="small">
            <template #icon>
              <IconifyIcon icon="lucide:trash" class="mb-1 size-3" />
            </template>
            <span>清除</span>
          </Button>
        </Tooltip>
      </div>
      <Vue3Signature
        class="h-full flex-1 border border-solid border-gray-300"
        ref="signature"
      />
    </div>
  </Modal>
</template>