8/4 更新 输入限制,修复收银台

This commit is contained in:
Zy
2026-08-04 16:07:22 +08:00
parent ca5f214bac
commit 494b7869ea
26 changed files with 668 additions and 412 deletions

View File

@@ -21,7 +21,7 @@
</el-select>
</el-form-item>
<el-form-item @change="handleChangeHouseNo" label="房号" prop="houseId">
<el-select v-model="queryParams.houseId" placeholder="请选择收费项目">
<el-select v-model="queryParams.houseId" placeholder="请选择房号">
<el-option-group v-for="group in houseList" :key="group.floorNo" :label="String(group.floorNo) + ' 楼'">
<el-option v-for="item in group.houses" :key="item.houseId" :label="item.houseNo" :value="item.houseId" />
</el-option-group>
@@ -30,7 +30,7 @@
</div>
<div>
<el-form-item label="收费项目" prop="itemId">
<el-select v-model="queryParams.chargeItemId" placeholder="请选择收费项目">
<el-select multiple v-model="queryParams.chargeItemId" placeholder="请选择收费项目">
<el-option
:disabled="item.status === '1'"
v-for="(item, index) in chargeItems"
@@ -147,7 +147,10 @@
<el-table-column label="应收金额" width="100" align="center" prop="amount" />
<el-table-column label="缴费状态" width="100" align="center" prop="payStatus">
<template #default="scope">
<DictTag :options="com_pay_status" :value="scope.row.payStatus"></DictTag>
<span v-if="scope.row.payStatus === '0'">未缴纳</span>
<span v-else-if="scope.row.payStatus === '1'">已缴纳</span>
<span v-else-if="scope.row.payStatus === '2'">缴纳失败</span>
<span v-else>部分缴纳</span>
</template>
</el-table-column>
<el-table-column label="应缴金额" width="100" align="center" prop="amount" />
@@ -159,7 +162,7 @@
<el-table-column label="操作" width="110" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-button link type="primary" v-if="scope.row.payStatus !== '1'" @click="handleIncome(scope.row)" v-has-permi="['bill:bill:edit']"
></el-button
></el-button
>
<el-button link type="success" v-if="scope.row.payStatus === '1'" @click="printPIaoJuByOnly(scope.row)" v-has-permi="['bill:bill:query']"
>打印票据</el-button
@@ -180,7 +183,10 @@
<el-dialog :title="dialog.title" v-model="dialog.visible" width="650px" append-to-body>
<div class="payInfo">
<div>
<div>缴费人 {{ inComeFrom.residentName }}</div>
<div class="flex flex-items-center justify-between">
<span>缴费人 {{ inComeFrom.residentName }}</span>
<span style="color: #ff9947">待缴纳</span>
</div>
</div>
<div class="flex">
<span>收费名称 </span>
@@ -204,11 +210,11 @@
<span>{{ item.amount }}</span>
</div>
<div style="text-align: right" class="flex justify-between">
<span>上次优惠金额</span>
<span>累计优惠金额</span>
<span> {{ item.singleDiscountAmount }}</span>
</div>
<div style="text-align: right" class="flex justify-between">
<span>上次已交金额</span>
<span>累计已交金额</span>
<span> {{ item.paidAmount }}</span>
</div>
<div
@@ -264,40 +270,11 @@
</el-form-item>
<el-form-item label="缴纳状态" prop="payStatus">
<el-radio-group v-model="inComeFrom.payStatus">
<el-radio v-for="dict in com_pay_status" :key="dict.value" :label="dict.label" :value="dict.value"></el-radio>
<el-radio value="1" label="已缴纳"></el-radio>
<el-radio value="2" label="部分缴纳"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="支付方式" prop="payType" v-if="inComeFrom.payStatus !== '0'">
<div class="flex-1">
<div class="flex flex-items-center" v-for="(item, index) in payList" :key="index">
<div class="flex-1 flex">
<el-select @change="handleChangePayTypeId($event, index)" v-model="item.payType" placeholder="请选择">
<el-option
:disabled="isOptionDisabled(dict.value, item.payType)"
v-for="dict in com_pay_method"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
<el-input @change="(val: string) => handleChangePay(val, index)" v-model.number.trim="item.payAmount" style="margin: 0 10px">
<template #append></template>
</el-input>
</div>
<div style="width: 80px; text-align: left">
<el-icon
color="blue"
size="24"
v-if="index === payList.length - 1 && payList.length < com_pay_method.length"
@click="addPayList"
style="margin-right: 10px; cursor: pointer"
><CirclePlus
/></el-icon>
<el-icon color="red" style="cursor: pointer" size="24" v-if="payList.length > 1" @click="removePayList(index)"><Delete /></el-icon>
</div>
</div>
</div>
</el-form-item>
<el-form-item label="优惠方式" prop="discountMethod" v-if="inComeFrom.payStatus !== '0'">
<el-select style="width: 400px" @change="handleChangeDisCountMethod" v-model="inComeFrom.discountMethod" placeholder="请选择">
<el-option label="不优惠" :value="0"></el-option>
@@ -335,6 +312,37 @@
</el-input>
</el-form-item>
</div>
<el-form-item label="支付方式" prop="payType" v-if="inComeFrom.payStatus !== '0'">
<div class="flex-1">
<div class="flex flex-items-center" v-for="(item, index) in payList" :key="index">
<div class="flex-1 flex">
<el-select @change="handleChangePayTypeId($event, index)" v-model="item.payType" placeholder="请选择">
<el-option
:disabled="isOptionDisabled(dict.value, item.payType)"
v-for="dict in com_pay_method"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
<el-input @change="(val: string) => handleChangePay(val, index)" v-model.number.trim="item.payAmount" style="margin: 0 10px">
<template #append></template>
</el-input>
</div>
<div style="width: 80px; text-align: left">
<el-icon
color="blue"
size="24"
v-if="index === payList.length - 1 && payList.length < com_pay_method.length"
@click="addPayList"
style="margin-right: 10px; cursor: pointer"
><CirclePlus
/></el-icon>
<el-icon color="red" style="cursor: pointer" size="24" v-if="payList.length > 1" @click="removePayList(index)"><Delete /></el-icon>
</div>
</div>
</div>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input style="width: 400px" type="textarea" show-word-limit maxlength="100" :rows="5" v-model="inComeFrom.remark"></el-input>
</el-form-item>
@@ -433,9 +441,7 @@ import { CirclePlus, Delete, QuestionFilled } from '@element-plus/icons-vue';
import { useUserStore } from '@/store/modules/user';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_pay_status, com_pay_method, com_charge_item_unit } = toRefs<any>(
proxy?.useDict('com_pay_status', 'com_pay_method', 'com_charge_item_unit')
);
const { com_pay_method, com_charge_item_unit } = toRefs<any>(proxy?.useDict('com_pay_method', 'com_charge_item_unit'));
const userStore = useUserStore();
const loading = ref(false);
@@ -668,7 +674,7 @@ function initInComeFrom() {
inComeFrom.value = {
allCost: 0, // 总金额
billResidentId: [], // 账单id
payStatus: '1', // 0:未缴 1:已缴
payStatus: '1', // 0:未缴 1:已缴 2: 缴纳失败 3: 部分缴纳
payType: '2', // 0:微信 1:支付宝 2 线下
remark: '',
discountMethod: 0, // 优惠方式 0 不优惠 1 比例 2 金额
@@ -694,7 +700,6 @@ function initInComeFrom() {
}
// 改变优惠方式
function handleChangeDisCountMethod(val: number) {
console.log(val);
inComeFrom.value.discountRate = '0'; // 优惠比例
inComeFrom.value.discount = '0.00'; // 优惠金额
totalReadDiscount.value = '0.00'; // 实际优惠金额
@@ -718,7 +723,6 @@ function handleChangeDiscountMoney(val: string) {
}
let discount = toBig(cleanVal).toNumber();
if (Number.isNaN(discount)) discount = 0;
console.log('折扣金额:', discount);
const allCost = inComeFrom.value.allCost ?? 0;
if (discount < 0) {
ElMessage.warning('优惠金额不能为负数');
@@ -830,6 +834,7 @@ function handleIncome(row: billlistType | false) {
if (row) {
inComeFrom.value.allCost = row.needPayAmount;
inComeFrom.value.billResidentId = [row];
inComeFrom.value.remark = row.remark;
inComeFrom.value.residentName = row.residentName;
totalPayAmount.value = row.needPayAmount;
} else {
@@ -845,6 +850,7 @@ function handleIncome(row: billlistType | false) {
ElMessage.warning('缴费人不一致,重新选择');
return;
} else if (set.size === 1) {
inComeFrom.value.remark = '';
inComeFrom.value.residentName = ids.value[0].residentName;
ids.value.forEach((item) => {
inComeFrom.value.billResidentId.push(item);
@@ -866,12 +872,17 @@ const closer = () => {
};
// 提交
const submitForm = () => {
if (!handlePayListIsEmpt()) {
ElMessage.warning('请填写完整支付方式和支付金额');
return;
}
buttonLoading.value = true;
// 部分缴纳时 不管
// 已缴纳时 判断 支付金额 和 预计支付金额 是否相等
// 混合缴纳时 不管
if (inComeFrom.value.payStatus === '1') {
if (!eqMoney(totalPayAmount.value, payListAllAmount.value)) {
return ElMessage.error('实际支付金额 和 预计支付金额 不相等');
buttonLoading.value = false;
return ElMessage.warning('支付金额不足,可选择 部分缴纳 方式');
}
}
const obj = {
@@ -998,11 +1009,15 @@ const printOption = {
}
`,
afterCloseCallback: () => {
console.log('打印结束');
isPrint.value = false;
isLoading.value = false;
}
};
// 打印状态恢复函数
function resetPrintState() {
isPrint.value = false;
isLoading.value = false;
}
function conFimPrint() {
isLoading.value = true;
isPrint.value = true;
@@ -1017,7 +1032,8 @@ function conFimPrint() {
// isPrint.value = false;
// isLoading.value = false;
// });
}, 1000);
resetPrintState();
}, 100);
}
onMounted(() => {
@@ -1072,7 +1088,6 @@ const payListAllAmount = computed(() => {
});
// 添加支付方式
function addPayList() {
console.log(com_pay_method.value);
payList.value.push({
payType: '',
payAmount: null
@@ -1104,6 +1119,27 @@ function handleChangePay(val: string, index: number = -1) {
}
}
}
function handlePayListIsEmpt() {
if (payList.value.length === 0) {
ElMessage.warning('请添加支付方式');
return false;
}
const invalidIndex = payList.value.findIndex(
(item) =>
item.payType === null ||
item.payType === undefined ||
item.payType === '' ||
item.payAmount === null ||
item.payAmount === undefined ||
item.payAmount === ''
);
if (invalidIndex !== -1) {
return false;
}
return true;
}
// 校验数字
function checkMoney(value: string) {
if (!value) return false;