<template>
|
<view class="account-detail">
|
<!-- 使用通用页面头部组件 -->
|
<PageHeader title="编辑来票台账"
|
@back="goBack" />
|
<up-form @submit="submitForm"
|
ref="formRef"
|
label-width="120"
|
:model="form">
|
<up-form-item label="采购合同号"
|
prop="purchaseContractNumber">
|
<up-input v-model="form.purchaseContractNumber"
|
placeholder="自动生成"
|
disabled />
|
</up-form-item>
|
<up-form-item label="销售合同号"
|
prop="salesContractNo">
|
<up-input v-model="form.salesContractNo"
|
placeholder="自动生成"
|
disabled />
|
</up-form-item>
|
<up-form-item label="含税单价(元)"
|
prop="taxInclusiveUnitPrice">
|
<up-input v-model="form.taxInclusiveUnitPrice"
|
placeholder="自动生成"
|
disabled />
|
</up-form-item>
|
<up-form-item label="创建时间"
|
prop="createdAt">
|
<up-input v-model="form.createdAt"
|
placeholder="自动生成"
|
disabled />
|
</up-form-item>
|
<up-form-item label="发票号"
|
prop="invoiceNumber">
|
<up-input v-model="form.invoiceNumber"
|
placeholder="请输入"
|
disabled />
|
</up-form-item>
|
<up-form-item label="来票数"
|
prop="ticketsNum"
|
required
|
:rules="rules.ticketsNum">
|
<up-input v-model="form.ticketsNum"
|
type="number"
|
placeholder="请输入"
|
@blur="inputTicketsNum" />
|
</up-form-item>
|
<up-form-item label="本次来票金额(元)"
|
prop="ticketsAmount"
|
required
|
:rules="rules.ticketsAmount">
|
<up-input v-model="form.ticketsAmount"
|
type="number"
|
placeholder="请输入"
|
@blur="inputTicketsAmount" />
|
</up-form-item>
|
<view class="tip-text">未来票数:{{ formatAmount(form.futureTickets) }} </view>
|
<!-- 使用公共底部按钮组件 -->
|
<FooterButtons show
|
cancelText="取消"
|
confirmText="保存"
|
@cancel="goBack"
|
@confirm="onSubmit" />
|
</up-form>
|
</view>
|
</template>
|
|
<script setup>
|
import { ref, onMounted } from "vue";
|
import dayjs from "dayjs";
|
import useUserStore from "@/store/modules/user";
|
import { getToken } from "@/utils/auth";
|
import { invoiceLedgerSaveOrUpdate } from "@/api/salesManagement/invoiceLedger.js";
|
import config from "@/config.js";
|
import {
|
getProductRecordById,
|
updateRegistration,
|
} from "@/api/procurementManagement/procurementInvoiceLedger";
|
import PageHeader from "@/components/PageHeader.vue";
|
import FooterButtons from "@/components/FooterButtons.vue";
|
|
const userStore = useUserStore();
|
|
const formRef = ref();
|
let form = ref({
|
salesLedgerId: "",
|
customerId: "",
|
invoiceNo: "",
|
invoiceTotal: "",
|
taxRate: "",
|
invoicePerson: "",
|
invoiceDate: "",
|
customerName: "",
|
fileList: [],
|
createTime: "",
|
taxInclusiveTotalPrice: "",
|
taxInclusiveUnitPrice: "",
|
});
|
const fileList = ref([]);
|
const currentId = ref("");
|
const temFutureTickets = ref(0);
|
const originalTicketsNum = ref(0); // 保存原始来票数
|
|
// 表单校验规则 - 使用简单的 required 规则
|
const rules = {
|
ticketsNum: [{ required: true, message: "请输入来票数", trigger: "blur" }],
|
ticketsAmount: [
|
{ required: true, message: "请输入本次来票金额", trigger: "blur" },
|
],
|
};
|
|
const goBack = () => {
|
uni.removeStorageSync("invoiceLedgerEditRow");
|
uni.navigateBack();
|
};
|
const inputTicketsNum = () => {
|
// 处理空值情况
|
if (!form.value.ticketsNum || form.value.ticketsNum === "") {
|
form.value.ticketsNum = 0;
|
return;
|
}
|
|
// 确保含税单价存在且不为零
|
if (
|
!form.value.taxInclusiveUnitPrice ||
|
Number(form.value.taxInclusiveUnitPrice) === 0
|
) {
|
uni.showToast({
|
title: "含税单价不能为零或未定义",
|
icon: "none",
|
});
|
return;
|
}
|
|
const newTicketsNum = Number(form.value.ticketsNum) || 0;
|
// 计算总可用票数:原始未来票数 + 原始来票数
|
const totalAvailableTickets = Number(temFutureTickets.value) + Number(originalTicketsNum.value);
|
|
// 验证来票数不能大于总可用票数
|
if (newTicketsNum > totalAvailableTickets) {
|
uni.showToast({
|
title: "来票数不得大于总可用票数",
|
icon: "none",
|
});
|
form.value.ticketsNum = totalAvailableTickets;
|
// 重新计算未来票数
|
const futureTickets = totalAvailableTickets - totalAvailableTickets;
|
form.value.futureTickets = Number(futureTickets.toFixed(2));
|
form.value.ticketsAmount = Number((totalAvailableTickets * Number(form.value.taxInclusiveUnitPrice)).toFixed(2));
|
return;
|
}
|
|
// 确保所有数值都转换为数字类型进行计算
|
const ticketsAmount =
|
newTicketsNum * Number(form.value.taxInclusiveUnitPrice);
|
// 计算未来票数:总可用票数 - 新来票数
|
const futureTickets = totalAvailableTickets - newTicketsNum;
|
form.value.futureTickets = Number(futureTickets.toFixed(2));
|
form.value.ticketsAmount = Number(ticketsAmount.toFixed(2));
|
};
|
const inputTicketsAmount = () => {
|
// 处理空值情况
|
if (!form.value.ticketsAmount || form.value.ticketsAmount === "") {
|
form.value.ticketsAmount = 0;
|
}
|
|
// 确保含税单价存在且不为零
|
if (
|
!form.value.taxInclusiveUnitPrice ||
|
Number(form.value.taxInclusiveUnitPrice) === 0
|
) {
|
uni.showToast({
|
title: "含税单价不能为零或未定义",
|
icon: "none",
|
});
|
return;
|
}
|
|
const newTicketsAmount = Number(form.value.ticketsAmount) || 0;
|
// 计算总可用金额:原始未来票数 + 原始来票数
|
const totalAvailableTickets = Number(temFutureTickets.value) + Number(originalTicketsNum.value);
|
const totalAvailableAmount = totalAvailableTickets * Number(form.value.taxInclusiveUnitPrice);
|
|
if (newTicketsAmount > totalAvailableAmount) {
|
uni.showToast({
|
title: "本次来票金额不得大于总金额",
|
icon: "none",
|
});
|
form.value.ticketsAmount = totalAvailableAmount.toFixed(2);
|
const ticketsNum =
|
Number(form.value.ticketsAmount) /
|
Number(form.value.taxInclusiveUnitPrice);
|
form.value.ticketsNum = Number(ticketsNum.toFixed(2));
|
// 更新未来票数
|
const futureTickets = totalAvailableTickets - form.value.ticketsNum;
|
form.value.futureTickets = Number(futureTickets.toFixed(2));
|
return;
|
}
|
|
// 确保所有数值都转换为数字类型进行计算
|
const ticketsNum =
|
newTicketsAmount / Number(form.value.taxInclusiveUnitPrice);
|
form.value.ticketsNum = Number(ticketsNum.toFixed(2));
|
// 更新未来票数
|
const futureTickets = totalAvailableTickets - form.value.ticketsNum;
|
form.value.futureTickets = Number(futureTickets.toFixed(2));
|
};
|
const formatAmount = val => {
|
if (val === undefined || val === null || val === "") return "0.00";
|
const num = Number(val);
|
if (Number.isNaN(num)) return "0.00";
|
return num.toFixed(2);
|
};
|
|
const loadDetail = async (id, purchaseLedgerId, productModelId) => {
|
try {
|
uni.showLoading({
|
title: "加载中...",
|
});
|
const res = await getProductRecordById({
|
id: id,
|
purchaseLedgerId: purchaseLedgerId,
|
productModelId: productModelId,
|
});
|
const data = res?.data || res;
|
form.value = { ...data };
|
temFutureTickets.value = data.futureTickets;
|
originalTicketsNum.value = Number(data.ticketsNum) || 0; // 保存原始来票数
|
fileList.value = data?.fileList || [];
|
if (!form.value.invoicePerson) {
|
form.value.invoicePerson = userStore.nickName;
|
}
|
if (!form.value.invoiceDate) {
|
form.value.invoiceDate = dayjs().format("YYYY-MM-DD");
|
}
|
uni.hideLoading();
|
} catch (e) {
|
uni.hideLoading();
|
uni.showToast({
|
title: "加载失败",
|
icon: "none",
|
});
|
}
|
};
|
|
const submitForm = async () => {
|
try {
|
// 提交表单的具体逻辑
|
await updateRegistration(form.value);
|
uni.showToast({
|
title: "提交成功",
|
icon: "success",
|
});
|
setTimeout(() => {
|
goBack();
|
}, 800);
|
} catch (e) {
|
uni.showToast({
|
title: "提交失败,请重试",
|
icon: "none",
|
});
|
}
|
};
|
|
// 表单提交
|
const onSubmit = async () => {
|
// 在验证前,确保必填字段有值
|
if (!form.value.ticketsNum || form.value.ticketsNum === "" || form.value.ticketsNum === null || form.value.ticketsNum === undefined) {
|
uni.showToast({
|
title: "请输入来票数",
|
icon: "none",
|
});
|
return;
|
}
|
|
if (!form.value.ticketsAmount || form.value.ticketsAmount === "" || form.value.ticketsAmount === null || form.value.ticketsAmount === undefined) {
|
uni.showToast({
|
title: "请输入本次来票金额",
|
icon: "none",
|
});
|
return;
|
}
|
|
// 确保字段是数字类型,并转换为字符串(因为表单可能需要字符串类型)
|
const ticketsNum = Number(form.value.ticketsNum);
|
const ticketsAmount = Number(form.value.ticketsAmount);
|
|
// 如果来票数为0或来票金额为0,提示用户
|
if (isNaN(ticketsNum) || ticketsNum <= 0) {
|
uni.showToast({
|
title: "来票数必须大于0",
|
icon: "none",
|
});
|
return;
|
}
|
|
if (isNaN(ticketsAmount) || ticketsAmount <= 0) {
|
uni.showToast({
|
title: "本次来票金额必须大于0",
|
icon: "none",
|
});
|
return;
|
}
|
|
// 更新表单值,确保是有效的数字字符串
|
form.value.ticketsNum = ticketsNum.toString();
|
form.value.ticketsAmount = ticketsAmount.toString();
|
|
// 手动验证通过后,直接提交,跳过表单验证(避免真机上的验证问题)
|
submitForm();
|
};
|
const purchaseLedgerId = ref("");
|
const productModelId = ref({});
|
|
onMounted(() => {
|
const rowStr = uni.getStorageSync("invoiceLedgerEditRow");
|
if (rowStr) {
|
try {
|
const row = JSON.parse(rowStr);
|
currentId.value = row.id;
|
purchaseLedgerId.value = row.purchaseLedgerId;
|
productModelId.value = row.productModelId;
|
loadDetail(currentId.value, purchaseLedgerId.value, productModelId.value);
|
} catch (e) {
|
// ignore
|
}
|
}
|
});
|
</script>
|
|
<style scoped lang="scss">
|
@import "@/static/scss/form-common.scss";
|
</style>
|