刘光辉
4 小时以前 cf11e63b659afcc9792ab3e395f1b45d844431a8
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<script lang="ts" setup>
import { computed, nextTick, onBeforeUnmount, onMounted, ref, shallowRef } from 'vue';
import { BasicModal } from '@jnpf/ui/modal';
import { Alert, Button, Descriptions, DescriptionsItem, Spin } from 'ant-design-vue';
import dayjs from 'dayjs';
import { onlineUtils } from '#/utils/jnpf';
import { cancelDmsReprint, refreshDmsReprintLock, resumeDmsReprint, REPRINT_LOCK_EVENT, REPRINT_COMPLETED_EVENT } from './dmsReprint';
import type { DmsReprintLockDialog } from './dmsReprint';
 
const dialog = shallowRef<DmsReprintLockDialog>();
const busy = ref(false);
const confirmingCancel = ref(false);
const error = ref('');
const status = computed(() => dialog.value?.status);
const phaseText = computed(
  () =>
    ({ READY: '待发送', UNKNOWN: '发送结果待核对', PARTIAL: '部分批次已发送', REGISTRATION_PENDING: '发送成功,待完成不平衡登记' })[
      status.value?.phase || 'READY'
    ],
);
const hint = computed(() => {
  if (!status.value?.locked) return '原任务已结束,占用已解除。请关闭本窗口,从打印记录重新操作。';
  if (!status.value.owner) return '该记录由其他人占用,请由原发起人继续或处理。';
  switch (status.value.phase) {
    case 'UNKNOWN':
      return '可能已经发送,不能取消或重复打印。刷新可补交当前浏览器已收到的成功回执;若仍未知,请保留原客户端任务并核查,系统不会自动解锁。';
    case 'PARTIAL':
      return '部分批次已发送成功,继续时只发送尚未派发的批次,不能取消后重新打印整份。';
    case 'REGISTRATION_PENDING':
      return '本次打印已发送成功,请补充完成不平衡登记,不会再次打印。';
    default:
      return '本次尚未派发。可继续重打,或取消本次任务并解除锁定。';
  }
});
function open(value: DmsReprintLockDialog) {
  if (busy.value) return;
  dialog.value = value;
  confirmingCancel.value = false;
  error.value = '';
}
async function close() {
  if (busy.value) return false;
  dialog.value = undefined;
  confirmingCancel.value = false;
  return true;
}
async function run(action: 'refresh' | 'resume' | 'cancel') {
  if (busy.value || !dialog.value) return;
  const current = dialog.value;
  busy.value = true;
  error.value = '';
  try {
    if (action === 'resume') {
      dialog.value = undefined;
      await nextTick();
      await resumeDmsReprint(current.status.printRecordId, current.status.requestId!, current.onConfirm, current.buildCustomBarcode, current.watermarkBusinessTypes);
      dialog.value = undefined;
    } else {
      if (action === 'cancel') {
        await cancelDmsReprint(current.status.printRecordId, current.status.requestId!);
        current.onConfirm?.();
        confirmingCancel.value = false;
      }
      dialog.value = { ...current, status: await refreshDmsReprintLock(current.status) };
    }
  } catch (e: any) {
    if (action === 'resume') dialog.value = current;
    error.value = e?.message || '读取或更新状态失败,请重试';
  } finally {
    busy.value = false;
  }
}
const emitter = onlineUtils.getEmitter();
function completed(value: { printRecordId: string; requestId: string }) {
  if (status.value?.printRecordId !== value.printRecordId || status.value?.requestId !== value.requestId) return;
  dialog.value = { ...dialog.value!, status: { ...status.value, locked: false, canCancel: false, canResume: false } };
}
onMounted(() => {
  emitter.on(REPRINT_LOCK_EVENT, open);
  emitter.on(REPRINT_COMPLETED_EVENT, completed);
});
onBeforeUnmount(() => {
  emitter.off(REPRINT_LOCK_EVENT, open);
  emitter.off(REPRINT_COMPLETED_EVENT, completed);
});
</script>
 
<template>
  <BasicModal
    :open="!!dialog"
    title="重打任务状态"
    :width="620"
    :can-fullscreen="false"
    :mask-closable="false"
    :close-func="close"
    :closable="!busy"
    :keyboard="!busy">
    <Spin :spinning="busy">
      <Alert :message="hint" :type="status?.phase === 'UNKNOWN' ? 'warning' : 'info'" show-icon class="mb-4" />
      <Alert v-if="error" :message="error" type="error" show-icon class="mb-4" />
      <Descriptions v-if="status?.locked" :column="1" bordered size="small">
        <DescriptionsItem label="当前状态 / Status">{{ phaseText }}</DescriptionsItem>
        <DescriptionsItem label="发起人 / Initiated By">{{ status.userName || status.userId }}</DescriptionsItem>
        <DescriptionsItem label="发起日期 / Initiated On">{{ status.createdAt ? dayjs(status.createdAt).format('YYYY-MM-DD') : '—' }}</DescriptionsItem>
        <DescriptionsItem label="重打原因 / Reprint Reason">{{ status.reason }}</DescriptionsItem>
        <DescriptionsItem label="发送进度 / Submission Progress"
          >{{ status.submittedBatches || 0 }} / {{ status.totalBatches || 0 }} 批次确认成功</DescriptionsItem
        >
      </Descriptions>
      <Alert v-if="confirmingCancel" message="确定取消本次尚未发送的重打并解除锁定?取消记录会保留。" type="warning" class="mt-4" />
    </Spin>
    <template #footer>
      <Button :disabled="busy" @click="close">关闭</Button>
      <Button v-if="status?.locked" :loading="busy" :disabled="busy" @click="run('refresh')">刷新状态 / 补交回执</Button>
      <Button v-if="status?.canCancel && !confirmingCancel" danger :disabled="busy" @click="confirmingCancel = true">取消重打并解除锁定</Button>
      <Button v-if="status?.canCancel && confirmingCancel" danger :disabled="busy" @click="run('cancel')">确认取消</Button>
      <Button v-if="status?.canResume && !confirmingCancel" type="primary" :disabled="busy" @click="run('resume')">{{
        status.phase === 'REGISTRATION_PENDING' ? '补登记' : '继续重打'
      }}</Button>
    </template>
  </BasicModal>
</template>