130 lines
4.4 KiB
Vue
130 lines
4.4 KiB
Vue
<template>
|
|
<template v-if="needsReconcile">
|
|
<el-button
|
|
v-perms="['tcm.prescriptionOrder/confirmGancaoSubmission']"
|
|
type="danger"
|
|
size="small"
|
|
plain
|
|
@click="openDialog"
|
|
>核对甘草提交</el-button
|
|
>
|
|
<el-dialog
|
|
v-model="visible"
|
|
title="人工核对甘草提交"
|
|
width="min(92vw, 520px)"
|
|
append-to-body
|
|
destroy-on-close
|
|
:close-on-click-modal="false"
|
|
>
|
|
<el-alert
|
|
title="请先在甘草后台核对。本操作会写入不可变更的审计记录。"
|
|
type="warning"
|
|
:closable="false"
|
|
show-icon
|
|
class="mb-4"
|
|
/>
|
|
<el-form label-width="100px" @submit.prevent="submit">
|
|
<el-form-item label="核对结果" required>
|
|
<el-radio-group v-model="form.resolution">
|
|
<el-radio label="CONFIRM_SUCCESS">确认已创建</el-radio>
|
|
<el-radio label="CONFIRM_NOT_CREATED">确认未创建</el-radio>
|
|
</el-radio-group>
|
|
</el-form-item>
|
|
<el-form-item
|
|
v-if="form.resolution === 'CONFIRM_SUCCESS'"
|
|
label="甘草单号"
|
|
required
|
|
>
|
|
<el-input v-model="form.remote_order_no" maxlength="64" clearable />
|
|
</el-form-item>
|
|
<el-form-item label="核对依据" required>
|
|
<el-input
|
|
v-model="form.note"
|
|
type="textarea"
|
|
:rows="3"
|
|
maxlength="1000"
|
|
show-word-limit
|
|
placeholder="例如:核对时间、甘草后台查询条件及结果"
|
|
/>
|
|
</el-form-item>
|
|
</el-form>
|
|
<template #footer>
|
|
<el-button @click="visible = false">取消</el-button>
|
|
<el-button type="primary" :loading="submitting" @click="submit"
|
|
>确认并记录</el-button
|
|
>
|
|
</template>
|
|
</el-dialog>
|
|
</template>
|
|
</template>
|
|
|
|
<script lang="ts" setup>
|
|
import { computed, reactive, ref } from 'vue'
|
|
import { prescriptionOrderConfirmGancaoSubmission } from '@/api/tcm'
|
|
import feedback from '@/utils/feedback'
|
|
|
|
const props = defineProps<{ order: Record<string, any> | null | undefined }>()
|
|
const emit = defineEmits<{ resolved: [] }>()
|
|
|
|
const needsReconcile = computed(() => {
|
|
const target = String(props.order?.pharmacy_claim_target || '')
|
|
.trim()
|
|
.toLowerCase()
|
|
const status = String(props.order?.pharmacy_claim_status || '')
|
|
.trim()
|
|
.toUpperCase()
|
|
const leaseExpiresAt = Number(props.order?.pharmacy_claim_lease_expires_at || 0)
|
|
const expiredPending =
|
|
status === 'PENDING' &&
|
|
leaseExpiresAt > 0 &&
|
|
leaseExpiresAt <= Math.floor(Date.now() / 1000)
|
|
return (
|
|
target === 'gancao' && (expiredPending || ['UNKNOWN', 'PENDING_RECONCILE'].includes(status))
|
|
)
|
|
})
|
|
const visible = ref(false)
|
|
const submitting = ref(false)
|
|
const form = reactive({
|
|
resolution: 'CONFIRM_SUCCESS' as 'CONFIRM_SUCCESS' | 'CONFIRM_NOT_CREATED',
|
|
remote_order_no: '',
|
|
note: ''
|
|
})
|
|
|
|
function openDialog() {
|
|
form.resolution = 'CONFIRM_SUCCESS'
|
|
form.remote_order_no = ''
|
|
form.note = ''
|
|
visible.value = true
|
|
}
|
|
|
|
async function submit() {
|
|
const id = Number(props.order?.id)
|
|
if (!id) return
|
|
if (form.resolution === 'CONFIRM_SUCCESS' && !form.remote_order_no.trim()) {
|
|
feedback.msgError('请填写甘草药方单号')
|
|
return
|
|
}
|
|
if (!form.note.trim()) {
|
|
feedback.msgError('请填写甘草后台核对依据')
|
|
return
|
|
}
|
|
submitting.value = true
|
|
try {
|
|
await prescriptionOrderConfirmGancaoSubmission({
|
|
id,
|
|
resolution: form.resolution,
|
|
remote_order_no:
|
|
form.resolution === 'CONFIRM_SUCCESS' ? form.remote_order_no.trim() : '',
|
|
note: form.note.trim()
|
|
})
|
|
feedback.msgSuccess('甘草提交核对已记录')
|
|
visible.value = false
|
|
emit('resolved')
|
|
} catch {
|
|
// Request interceptor presents the server-side reconciliation error.
|
|
} finally {
|
|
submitting.value = false
|
|
}
|
|
}
|
|
</script>
|