Files
gao-customer-h5/src/pages/package/FundRecordRevoke.vue
T
2026-09-01 01:14:54 +08:00

153 lines
5.3 KiB
Vue

<template>
<div v-can="permissionCodes.fund.revoke" class="package-operation-edit">
<t-cell-group v-if="record" title="原资金记录" theme="card" v-entrance-transition>
<t-cell title="操作类型" :note="getFundOperationText(record.operationType)" />
<t-cell title="金额" :note="formatPackageAmount(record.amount)" />
<t-cell title="原状态" :note="getFundStatusText(record.status)" />
<t-cell title="客户套餐" :note="record.customerPackageId || record.bizId || '未知'" />
</t-cell-group>
<t-form v-if="record" class="form" label-align="left" label-width="6rem" v-entrance-transition="70">
<t-form-item label="冲正原因" required-mark><t-textarea v-model.trim="reason" borderless autosize maxlength="500" placeholder="请输入冲正原因" /></t-form-item>
<t-form-item label="冲正时间" arrow @click="pickerVisible = true"><span class="picker-text" v-text="occurredAtText || '使用当前时间'" /></t-form-item>
<t-form-item label="备注"><t-textarea v-model.trim="remark" borderless autosize maxlength="500" placeholder="备注(可选)" /></t-form-item>
</t-form>
<package-photo-field v-if="record" v-model="photoItems" required title="冲正凭证照片" />
<t-empty v-if="!record" :description="isLoading ? '正在加载资金记录' : '资金记录不存在'" />
<t-popup v-model="pickerVisible" placement="bottom">
<t-date-time-picker v-model="draftTime" format="YYYY-MM-DD HH:mm" :mode="['date', 'minute']" title="冲正时间" @cancel="pickerVisible = false" @confirm="confirmTime" />
</t-popup>
</div>
</template>
<script setup lang="ts">
import { useUserStore } from "timi-web-api";
import PackageAPI from "@/api/PackageAPI";
import PackagePhotoField from "@/components/PackagePhotoField.vue";
import { useNavBarStore } from "@/store/navBarStore";
import type { GaoFundRecord, PackageAttachment } from "@/types/Package";
import type { PhotoItem } from "@/types/Photo";
import { createPackageRequestNo, formatPackageAmount, getFundOperationText, getFundStatusText } from "@/utils/package";
import { getErrorMessage } from "@/utils/error";
import { Message } from "@/utils/message";
import { permissionCodes } from "@/utils/permission";
defineOptions({ name: "FundRecordRevoke" });
const route = useRoute();
const router = useRouter();
const userStore = useUserStore();
const navBarStore = useNavBarStore();
const record = ref<GaoFundRecord>();
const reason = ref("");
const remark = ref("");
const occurredAtText = ref("");
const draftTime = ref("");
const pickerVisible = ref(false);
const photoItems = ref<PhotoItem[]>([]);
const isLoading = ref(false);
const isSaving = ref(false);
function confirmTime(value: string | number): void {
occurredAtText.value = String(value);
pickerVisible.value = false;
}
function resolveTimestamp(value: string): number | undefined {
if (!value) {
return undefined;
}
const timestamp = new Date(value.replace(" ", "T")).getTime();
return Number.isFinite(timestamp) ? timestamp : undefined;
}
function buildAttachments(): PackageAttachment[] {
return photoItems.value.flatMap(item => item.tempFileId ? [{ tempFileId: item.tempFileId, attachType: "PHOTO" }] : []);
}
async function loadData(): Promise<void> {
const id = String(route.params.id || "");
if (!id) {
return;
}
isLoading.value = true;
try {
record.value = await PackageAPI.fundRecordDetail(id);
} catch (error) {
Message.error(getErrorMessage(error, "资金记录加载失败"));
} finally {
isLoading.value = false;
}
}
async function save(): Promise<void> {
if (isSaving.value) {
return;
}
if (!record.value?.id || record.value.status !== "VERIFIED" || record.value.operationType === "REVOKE") {
Message.warning("只有已核销且非冲正的资金记录可以冲正");
return;
}
if (!reason.value.trim()) {
Message.warning("请输入冲正原因");
return;
}
if (!photoItems.value.some(item => item.tempFileId)) {
Message.warning("资金冲正必须上传至少一张照片");
return;
}
isSaving.value = true;
try {
const result = await PackageAPI.revokeFundRecord({
requestNo: createPackageRequestNo(),
fundRecordId: record.value.id,
occurredAt: resolveTimestamp(occurredAtText.value),
reason: reason.value.trim(),
attachmentList: buildAttachments(),
remark: remark.value.trim() || null
});
Message.success("资金记录已冲正");
const customerPackageId = record.value.customerPackageId || record.value.bizId;
if (customerPackageId) {
await router.replace(`/management/customer-packages/${customerPackageId}`);
return;
}
await router.replace(`/management/fund-records/${result.id || record.value.id}`);
} catch (error) {
Message.error(getErrorMessage(error, "资金冲正失败,请刷新后确认状态"));
} finally {
isSaving.value = false;
}
}
onMounted(async () => {
if (userStore.hasPermissions(permissionCodes.fund.revoke)) {
navBarStore.setRightText("提交冲正", "var(--td-danger-color)", save);
}
await loadData();
});
onUnmounted(() => navBarStore.clearRight());
</script>
<style scoped lang="less">
.package-operation-edit {
gap: 1rem;
padding: calc(var(--app-nav-height) + 1rem) 0 2rem;
display: flex;
flex-direction: column;
.form {
border-radius: .75rem;
}
.picker-text {
width: 100%;
text-align: right;
}
.package-photo-field {
padding: 0 1rem;
}
}
</style>