7/17 修复添加车辆上传样式,校验上传文件不能是exe;

This commit is contained in:
Zy
2026-07-17 15:24:02 +08:00
parent 725bdfa3fe
commit 37970c547b
6 changed files with 263 additions and 231 deletions

View File

@@ -9,9 +9,9 @@ VITE_APP_ENV='development'
# 开发环境 # 开发环境
VITE_APP_BASE_API='/dev-api' VITE_APP_BASE_API='/dev-api'
# # 开发环境 接口代理地址 # # 开发环境 接口代理地址
#VITE_APP_PROXY_API='http://192.168.1.222:8080' VITE_APP_PROXY_API='http://192.168.1.222:8080'
# 开发环境 接口代理地址 # 开发环境 接口代理地址
VITE_APP_PROXY_API='http://192.168.1.6:8080' #VITE_APP_PROXY_API='http://192.168.1.6:8080'
# 图片基础地址 # 图片基础地址
VITE_IMG_URL='http://192.168.1.222:8080' VITE_IMG_URL='http://192.168.1.222:8080'

View File

@@ -83,9 +83,13 @@ export type BillPrintType = {
'useCount': string; 'useCount': string;
'account': string; 'account': string;
'payType': string; 'payType': string;
'singleDiscountAmount': string;
'actualAccount': string;
'remark': string; 'remark': string;
}[]; }[];
'printDate': string; 'printDate': string;
totalDiscountAmount: string;
totalActualAccount: string;
'HouseName': string; 'HouseName': string;
'title': string; 'title': string;
}; };

View File

@@ -148,8 +148,7 @@ export const param2Obj = (url: string) => {
const index = v.indexOf('='); const index = v.indexOf('=');
if (index !== -1) { if (index !== -1) {
const name = v.substring(0, index); const name = v.substring(0, index);
const val = v.substring(index + 1, v.length); obj[name] = v.substring(index + 1, v.length);
obj[name] = val;
} }
}); });
return obj; return obj;
@@ -222,47 +221,15 @@ export const getTime = (type: string) => {
/** /**
* 创建一个防抖函数,确保在指定的等待时间内只执行一次目标函数。 * 创建一个防抖函数,确保在指定的等待时间内只执行一次目标函数。
* *
* @param func - 需要被防抖处理的目标函数
* @param wait - 等待时间(毫秒),在此时间内重复调用将重置计时器
* @param immediate - 是否立即执行。如果为 true则在第一次调用时立即执行函数并在等待期结束后才能再次触发如果为 false则在等待期结束后执行最后一次调用
* @returns 返回一个新的防抖函数,该函数在被调用时会应用防抖逻辑 * @returns 返回一个新的防抖函数,该函数在被调用时会应用防抖逻辑
*/ */
export const debounce = (func: any, wait: number, immediate: boolean) => { export function debounce<T extends (...args: any[]) => void>(fn: T, delay = 300) {
let timeout: any, args: any, context: any, timestamp: any, result: any; let timer: ReturnType<typeof setTimeout> | null = null;
return (...args: Parameters<T>) => {
/** timer && clearTimeout(timer);
* 延迟执行的内部函数,用于判断是否真正执行目标函数 timer = setTimeout(() => fn(...args), delay);
*/
const later = function () {
// 据上一次触发时间间隔
const last = +new Date() - timestamp;
// 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
if (last < wait && last > 0) {
timeout = setTimeout(later, wait - last);
} else {
timeout = null;
// 如果设定为immediate===true因为开始边界已经调用过了此处无需调用
if (!immediate) {
result = func.apply(context, args);
context = args = null;
}
}
}; };
return (...args: any) => {
context = this;
timestamp = +new Date();
const callNow = immediate && !timeout;
// 如果延时不存在,重新设定延时
if (!timeout) timeout = setTimeout(later, wait);
if (callNow) {
result = func.apply(context, args);
context = args = null;
} }
return result;
};
};
/** /**
* This is just a simple version of deep copy * This is just a simple version of deep copy
@@ -395,6 +362,5 @@ export function buildTreeByLevel<T = any>(list: T[]): T[] {
export const splitImages = (url) => { export const splitImages = (url) => {
if (!url) return ''; if (!url) return '';
const imgUrl = import.meta.env.VITE_IMG_URL + url; return import.meta.env.VITE_IMG_URL + url;
return imgUrl;
}; };

View File

@@ -98,9 +98,20 @@ function toBig(num: string | number | undefined | null): Big {
* @returns 保留2位小数字符串 * @returns 保留2位小数字符串
*/ */
export function moneyAdd(a: number | string = 0, b: number | string = 0): string { export function moneyAdd(a: number | string = 0, b: number | string = 0): string {
return new Big(a).plus(b).toFixed(2); return toBig(a).plus(b).toFixed(2);
} }
// 数组高精度求和
export function sum(arr: Array<string | number>): number {
const total = arr.reduce((acc, cur) => acc.plus(toBig(cur)), new Big(0));
return Number(total);
}
// 取较大值
export function maxMoney(a: string | number, b: string | number): number {
const bigA = toBig(a);
const bigB = toBig(b);
return Number(bigA.gt(bigB) ? bigA : bigB);
}
/** /**
* 减法 a - b * 减法 a - b
*/ */
@@ -141,7 +152,6 @@ export function toFixedMoney(num: string | number, digit = 2): number {
return Number(toBig(num).toFixed(digit, Big.roundHalfUp)); return Number(toBig(num).toFixed(digit, Big.roundHalfUp));
} }
/** /**
* 智能金额格式化(带单位:元/万元/亿元) * 智能金额格式化(带单位:元/万元/亿元)
* 兼容数字、字符串、null、undefined * 兼容数字、字符串、null、undefined

View File

@@ -67,19 +67,25 @@
</div> </div>
</div> </div>
<div class="actions"> <div class="actions">
<el-button @click="handleIncome(false)">收费</el-button> <el-button @click="handleIncome(false)" :disabled="!single">收费</el-button>
<el-button @click="printPIaoJuByOnly(false)">打印票据</el-button> <el-button @click="printPIaoJuByOnly(false)" :disabled="!printSingle">打印票据</el-button>
</div> </div>
</div> </div>
<el-card class="flex-1" shadow="never"> <el-card class="flex-1" shadow="never">
<el-table v-loading="loading" border :data="tableData" @selection-change="handleSelectionChange"> <el-table
:default-sort="{ prop: 'residentName', order: 'descending' }"
v-loading="loading"
border
:data="tableData"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="收费项目" align="center" prop="billCode"> <el-table-column label="收费项目" align="center" prop="billCode" width="120">
<template #default="scope"> <template #default="scope">
{{ scope.row.chargeItemName }} {{ scope.row.chargeItemName }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="收费名称" align="center" prop="detailsName"> <el-table-column label="收费名称" align="center" prop="detailsName" width="280">
<template #default="scope"> <template #default="scope">
<div style="text-align: left"> <div style="text-align: left">
<span>{{ scope.row.detailsName }}</span> <span>{{ scope.row.detailsName }}</span>
@@ -97,21 +103,22 @@
<span> <span>
{{ scope.row.fixedPrice }} {{ scope.row.fixedPrice }}
</span> </span>
<span> / </span> <span v-if="scope.row.unit"> / </span>
<dict-tag :options="com_charge_item_unit" :value="scope.row.chargePeriod"></dict-tag> <dict-tag v-if="scope.row.unit" :options="com_charge_item_unit" :value="scope.row.unit"></dict-tag>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="应收金额" width="100" align="center" prop="amount" />
<el-table-column label="缴费状态" width="80" align="center" prop="payStatus"> <el-table-column label="缴费状态" width="80" align="center" prop="payStatus">
<template #default="scope"> <template #default="scope">
<DictTag :options="com_pay_status" :value="scope.row.payStatus"></DictTag> <DictTag :options="com_pay_status" :value="scope.row.payStatus"></DictTag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="应缴金额" width="100" align="center" prop="amount" /> <el-table-column label="应缴金额" width="100" align="center" prop="amount" />
<el-table-column label="实缴金额" width="100" align="center" prop="amount" /> <el-table-column label="减免金额" width="100" align="center" prop="singleDiscountAmount" />
<el-table-column label="缴费人" align="center" prop="residentName" /> <el-table-column label="实缴金额" width="100" align="center" prop="actualAccount" />
<el-table-column label="缴费时间" align="center" prop="payTime" /> <el-table-column label="缴费人" width="120" sortable align="center" prop="residentName" />
<el-table-column label="缴费时间" width="200" align="center" prop="payTime" />
<el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip />
<el-table-column label="操作" width="220" align="center" fixed="right" class-name="small-padding fixed-width"> <el-table-column label="操作" width="220" align="center" fixed="right" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
<el-button link type="primary" v-if="scope.row.payStatus === '0'" @click="handleIncome(scope.row)" v-has-permi="['bill:bill:edit']" <el-button link type="primary" v-if="scope.row.payStatus === '0'" @click="handleIncome(scope.row)" v-has-permi="['bill:bill:edit']"
@@ -126,7 +133,7 @@
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card> </el-card>
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> <el-dialog :title="dialog.title" v-model="dialog.visible" width="650px" append-to-body>
<div class="payInfo"> <div class="payInfo">
<div> <div>
<div>缴费人 {{ inComeFrom.residentName }}</div> <div>缴费人 {{ inComeFrom.residentName }}</div>
@@ -135,15 +142,16 @@
<span>收费名称 </span> <span>收费名称 </span>
<div> <div>
<div v-for="(item, index) in inComeFrom.billResidentId" :key="index" style="text-wrap: wrap; margin-bottom: 5px"> <div v-for="(item, index) in inComeFrom.billResidentId" :key="index" style="text-wrap: wrap; margin-bottom: 5px">
<span style="text-decoration: underline">{{ item.detailsName }} ;</span> <span style="text-decoration: underline">{{ item.detailsName }} ;</span
><span v-if="item.payStatus === '1'">已缴费不计入金额</span>
</div> </div>
</div> </div>
</div> </div>
<div> <div>
<span>应收合计{{ inComeFrom.allCost }}</span> <span>应收合计{{ inComeFrom.allCost }}</span>
</div> </div>
<div> <div>
<span>应缴合计{{ inComeFrom.allCost }}</span> <span>应缴合计{{ totalDiscountAmount }}</span>
</div> </div>
</div> </div>
<el-form ref="formRef" :model="inComeFrom" label-width="100px"> <el-form ref="formRef" :model="inComeFrom" label-width="100px">
@@ -164,8 +172,53 @@
<el-option v-for="dict in com_pay_method" :key="dict.value" :label="dict.label" :value="dict.value"></el-option> <el-option v-for="dict in com_pay_method" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="优惠方式" prop="discountMethod">
<el-select @change="handleChangeDisCountMethod" v-model="inComeFrom.discountMethod" placeholder="请选择">
<el-option label="不优惠" :value="0"></el-option>
<el-option label="金额" :value="2"></el-option>
<el-option label="比例" :value="1"></el-option>
</el-select>
</el-form-item>
<div v-if="inComeFrom.discountMethod !== 0">
<div v-if="inComeFrom.discountMethod === 2">
<!-- <el-form-item label="优惠方式" prop="discount" v-if="inComeFrom.discountMethod === 2">-->
<!-- <el-radio-group v-model="discountType">-->
<!-- <el-radio :value="0">总额优惠</el-radio>-->
<!-- <el-radio :value="1">单笔优惠</el-radio>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<el-form-item label="单笔优惠金额" prop="discount" v-if="discountType === 1">
<el-input v-model.trim.number="inComeFrom.discount" @input="debounceDiscountMoney">
<template #append>
<span></span>
</template>
</el-input>
</el-form-item>
<el-form-item label="总额优惠金额" prop="discount" v-else>
<el-input v-model.trim.number="inComeFrom.discount" @input="debounceDiscountMoney">
<template #append>
<span></span>
</template>
</el-input>
</el-form-item>
</div>
<el-form-item label="优惠比例" prop="discountRate" v-else>
<el-input v-model.trim.number="inComeFrom.discountRate" placeholder="0~1000=无优惠80=优惠80%100=全免" @input="debounceDiscountRate">
<template #append>
<span>%</span>
</template>
</el-input>
</el-form-item>
<el-form-item label="优惠后总金额" prop="totalDiscountAmount">
<el-input disabled v-model="totalDiscountAmount">
<template #append>
<span></span>
</template>
</el-input>
</el-form-item>
</div>
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input type="textarea" :rows="5" v-model="inComeFrom.remark"></el-input> <el-input type="textarea" show-word-limit maxlength="100" :rows="10" v-model="inComeFrom.remark"></el-input>
</el-form-item> </el-form-item>
<div class="flex justify-end"> <div class="flex justify-end">
<el-button @click="closer">取消</el-button> <el-button @click="closer">取消</el-button>
@@ -196,11 +249,12 @@
<th>收费项目</th> <th>收费项目</th>
<th>收费标准</th> <th>收费标准</th>
<th>账单时间</th> <th>账单时间</th>
<th>面积</th> <th style="min-width: 100px">面积</th>
<th style="width: 80px">应收金额</th> <th style="min-width: 80px">应收金额</th>
<th style="width: 80px">实收金额</th> <th style="min-width: 80px">优免金额</th>
<th>收款方式</th> <th style="min-width: 80px">实收金额</th>
<th style="width: 80px">备注</th> <th style="min-width: 80px">收款方式</th>
<th style="width: 200px">备注</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -208,20 +262,23 @@
<td>{{ item.chargeItemName }}</td> <td>{{ item.chargeItemName }}</td>
<td>{{ item.billName }}</td> <td>{{ item.billName }}</td>
<td>{{ item.detailsTime }}</td> <td>{{ item.detailsTime }}</td>
<td>{{ item.useCount }}</td> <td style="min-width: 100px">{{ item.useCount }}</td>
<td style="width: 80px">{{ item.account }}</td> <td style="min-width: 80px">{{ item.account }}</td>
<td style="width: 80px">{{ item.account }}</td> <td style="min-width: 80px">{{ item.singleDiscountAmount }}</td>
<td style="min-width: 80px">{{ item.actualAccount }}</td>
<td>{{ item.payType }}</td> <td>{{ item.payType }}</td>
<td style="width: 80px">{{ item.remark }}</td> <td style="text-wrap: wrap; white-space: wrap">{{ item.remark }}</td>
</tr> </tr>
<tr> <tr>
<td>合计</td> <td>合计</td>
<td></td> <td></td>
<td></td> <td></td>
<td style="min-width: 100px"></td>
<td style="min-width: 80px">{{ print_form.totalAccount }}</td>
<td style="min-width: 80px">{{ print_form.totalDiscountAmount }}</td>
<td style="min-width: 80px">{{ print_form.totalActualAccount }}</td>
<td></td>
<td></td> <td></td>
<td style="width: 80px">{{ print_form.totalAccount }}</td>
<td style="width: 80px">{{ print_form.totalAccount }}</td>
<td style="width: 80px"></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@@ -250,10 +307,11 @@ import { billEdit, billlistType, billPrint, BillPrintType, billQuery } from '@/a
import { listChargeItem } from '@/api/system/SdbChargeItem'; import { listChargeItem } from '@/api/system/SdbChargeItem';
import { ref } from 'vue'; import { ref } from 'vue';
import { printTicketDiv } from '@/utils/print'; import { printTicketDiv } from '@/utils/print';
import { moneyAdd } from '@/utils/money'; import { div, eq, maxMoney, moneyAdd, mul, sub, sum, toFixedMoney } from '@/utils/money';
import { BuildingUnitlist, BuildingVo, FloorsType } from '@/api/system/house/type'; import { BuildingUnitlist, BuildingVo, FloorsType } from '@/api/system/house/type';
import { ChargeItemVO } from '@/api/system/SdbChargeItem/type'; import { ChargeItemVO } from '@/api/system/SdbChargeItem/type';
import { communitylist_rows_type } from '@/api/system/community/type'; import { communitylist_rows_type } from '@/api/system/community/type';
import { debounce } from '@/utils';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { com_bill_charge_period } = toRefs<any>(proxy?.useDict('com_bill_charge_period')); const { com_bill_charge_period } = toRefs<any>(proxy?.useDict('com_bill_charge_period'));
@@ -390,43 +448,158 @@ const resetQuery = () => {
handleQuery(); handleQuery();
}; };
const single = ref(true);
const printSingle = ref(true);
/** 多选框选中数据 */ /** 多选框选中数据 */
const handleSelectionChange = (selection: billlistType[]) => { const handleSelectionChange = (selection: billlistType[]) => {
ids.value = selection.map((item) => item); ids.value = selection.map((item) => item);
// 不能全部都是已缴纳的
single.value = ids.value.some((item) => item.payStatus === '0');
// 必须都要缴费后打印
printSingle.value = ids.value.every((item) => item.payStatus === '1');
}; };
const buttonLoading = ref(false); const buttonLoading = ref(false);
// 收费表单 // 收费表单
const discountType = ref(1); // 0 总额减免 1 单笔减免
let isMore = false;
const inComeFrom = ref({ const inComeFrom = ref({
allCost: null, // 金额 allCost: null, // 金额
billResidentId: [], // 账单id billResidentId: [], // 账单id
payStatus: '1', // 0:未缴 1:已缴 payStatus: '1', // 0:未缴 1:已缴
payType: '0', // 0:微信 1:支付宝 2 线下 payType: '0', // 0:微信 1:支付宝 2 线下
remark: '', remark: '',
discountMethod: 0, // 优惠方式 0 不优惠 1 比例 2 金额
discountRate: 0, // 优惠比例 10 === 10%
discount: 0, // 优惠金额
residentName: '' // 缴费人 residentName: '' // 缴费人
}); });
// 优惠后总额
const totalDiscountAmount = ref(0);
// 初始化
function initInComeFrom() { function initInComeFrom() {
inComeFrom.value = { inComeFrom.value = {
allCost: null, // 金额 allCost: 0, // 金额
billResidentId: [], // 账单id billResidentId: [], // 账单id
payStatus: '1', // 0:未缴 1:已缴 payStatus: '1', // 0:未缴 1:已缴
payType: '2', // 0:微信 1:支付宝 2 线下 payType: '2', // 0:微信 1:支付宝 2 线下
remark: '', remark: '',
discountMethod: 0, // 优惠方式 0 不优惠 1 比例 2 金额
discountRate: 0, // 优惠比例 10 === 10%
discount: 0, // 优惠金额
residentName: '' // 缴费人 residentName: '' // 缴费人
}; };
isMore = false;
} }
// 改变优惠方式
function handleChangeDisCountMethod(val: number) {
if (val === 0) return;
if (val === 1) {
inComeFrom.value.discount && handleChangeDiscountMoney(inComeFrom.value.discount.toString());
} else {
inComeFrom.value.discount && handleChangeDiscountRate(inComeFrom.value.discount.toString());
}
}
// 输入折扣固定金额
function handleChangeDiscountMoney(val: string) {
// 1. 清洗输入空、纯符号、非数字兜底为0
const cleanVal = val.trim();
let discount = Number(cleanVal);
if (Number.isNaN(discount)) discount = 0;
const allCost = inComeFrom.value.allCost ?? 0;
if (discount < 0) {
ElMessage.warning('优惠金额不能为负数');
return;
}
// 折扣为0直接赋值原总价无需计算
if (discount === 0) {
totalDiscountAmount.value = toFixedMoney(allCost, 2);
return;
}
// 优惠不能超过整体总费用
if (discount > allCost) {
ElMessage.warning('优惠金额不能超过总费用');
return;
}
if (isMore) {
// 过滤:只保留未支付账单,已支付直接丢弃
const unPaidList = ids.value.filter((item) => {
return item.payStatus !== '1';
});
const rowDiffList = unPaidList.map((item) => {
const itemAmount = item.amount ?? 0;
const afterSub = sub(itemAmount, discount);
// 不足折扣则取0
return maxMoney(afterSub, 0);
});
// 折扣后合计
const diffRaw = sum(rowDiffList);
totalDiscountAmount.value = toFixedMoney(diffRaw, 2);
} else {
// 单选单条,同样防止负数
const afterSub = sub(allCost, discount);
const finalPay = maxMoney(afterSub, 0);
totalDiscountAmount.value = toFixedMoney(finalPay, 2);
}
}
const debounceDiscountMoney = debounce(handleChangeDiscountMoney);
// 输入折扣固定比例
function handleChangeDiscountRate(val: string) {
const inputStr = val.trim();
let discountPercent = Number(inputStr);
if (Number.isNaN(discountPercent)) discountPercent = 0;
// 百分比校验
if (discountPercent < 0 || discountPercent > 100) {
ElMessage.warning('请输入0-100之间的优惠打折百分比');
return;
}
const allCost = inComeFrom.value.allCost ?? 0;
const rate = div(discountPercent, 100);
// 1. 输入0全部免费实付直接0
if (eq(rate, 0)) {
totalDiscountAmount.value = toFixedMoney(allCost, 2);
return;
}
// 2. 输入100无任何优惠实付等于原价
if (eq(rate, 1)) {
totalDiscountAmount.value = 0;
return;
}
// 批量多选模式
if (isMore) {
const unPaidList = ids.value.filter((item) => {
return item.payStatus !== '1';
});
// 总价格
const sourceTotal = sum(unPaidList.map((item) => item.amount ?? 0));
// 优惠总额 = 未付原价总和 - 打折后实付总和
const discountTotal = mul(sourceTotal, 1 - rate);
// 赋值优惠减免总额
totalDiscountAmount.value = toFixedMoney(discountTotal, 2);
return;
}
// 单选单条账单
const payRaw = mul(allCost, 1 - rate);
// 直接存实付金额
totalDiscountAmount.value = toFixedMoney(payRaw, 2);
}
const debounceDiscountRate = debounce(handleChangeDiscountRate);
// 收费 -------------------------------------------------------------- // 收费 --------------------------------------------------------------
/** 收费 */ /** 收费 */
function handleIncome(row: billlistType | false) { function handleIncome(row: billlistType | false) {
initInComeFrom(); initInComeFrom();
console.log(ids.value);
inComeFrom.value.allCost = 0;
inComeFrom.value.billResidentId = [];
inComeFrom.value.residentName = '';
if (row) { if (row) {
inComeFrom.value.allCost = row.amount; inComeFrom.value.allCost = row.amount;
inComeFrom.value.billResidentId = [row]; inComeFrom.value.billResidentId = [row];
inComeFrom.value.residentName = row.residentName; inComeFrom.value.residentName = row.residentName;
} else { } else {
if (ids.value.length <= 0) return ElMessage.warning('请选择账单');
const set = new Set(); const set = new Set();
ids.value.forEach((item) => { ids.value.forEach((item) => {
set.add(item.residentId); set.add(item.residentId);
@@ -438,9 +611,12 @@ function handleIncome(row: billlistType | false) {
inComeFrom.value.residentName = ids.value[0].residentName; inComeFrom.value.residentName = ids.value[0].residentName;
ids.value.forEach((item) => { ids.value.forEach((item) => {
inComeFrom.value.billResidentId.push(item); inComeFrom.value.billResidentId.push(item);
inComeFrom.value.allCost = moneyAdd(inComeFrom.value.allCost, item.amount); if (item.payStatus === '0') {
inComeFrom.value.allCost = moneyAdd(inComeFrom.value.allCost || 0, item.amount);
}
}); });
console.log(inComeFrom.value); totalDiscountAmount.value = inComeFrom.value.allCost;
isMore = true;
} }
} }
dialog.visible = true; dialog.visible = true;
@@ -455,7 +631,11 @@ const submitForm = () => {
const obj = { const obj = {
'detailsId': inComeFrom.value.billResidentId.map((item) => item.detailsId), 'detailsId': inComeFrom.value.billResidentId.map((item) => item.detailsId),
'payType': inComeFrom.value.payType, 'payType': inComeFrom.value.payType,
'payStatus': inComeFrom.value.payStatus 'payStatus': inComeFrom.value.payStatus,
discountMethod: inComeFrom.value.discountMethod, //优惠方式: 0不优惠 1 比例 2 金额
discountRate: inComeFrom.value.discountRate, // 优惠比例(优惠方式为比例时使用,如 10 表示 10%
singleDiscountAmount: inComeFrom.value.discount, // 单笔优惠金额(优惠方式为金额时使用
remark: inComeFrom.value.remark
}; };
billEdit(obj) billEdit(obj)
.then(() => { .then(() => {
@@ -467,7 +647,7 @@ const submitForm = () => {
buttonLoading.value = false; buttonLoading.value = false;
}); });
}; };
//
// 打印票据-------------------------------------------------------------- // 打印票据--------------------------------------------------------------
const isPrint = ref(false); const isPrint = ref(false);
const dialog_print = reactive<DialogOption>({ const dialog_print = reactive<DialogOption>({
@@ -477,6 +657,8 @@ const dialog_print = reactive<DialogOption>({
// 收款人 // 收款人
const inHomelyUse = ref(''); const inHomelyUse = ref('');
const print_form = ref<BillPrintType>({ const print_form = ref<BillPrintType>({
totalDiscountAmount: '',
totalActualAccount: '',
'totalAccount': '', 'totalAccount': '',
'residentName': '', 'residentName': '',
'detailsList': [], 'detailsList': [],
@@ -514,7 +696,6 @@ function printPIaoJuByOnly(row: billlistType | false) {
}; };
} }
} }
billPrint(query).then((res) => { billPrint(query).then((res) => {
print_form.value = res.data; print_form.value = res.data;
dialog_print.visible = true; dialog_print.visible = true;
@@ -539,142 +720,6 @@ onMounted(() => {
villageList.value = res.rows; villageList.value = res.rows;
}); });
}); });
/*
* 显。     更何况李恩成把自己的要求提得很清楚,一来是【血
* 暾果】,二来是通过【宣元坊】来联系他,不要再去府辰峰。   
*   “此人在宗内独善其身多年,果然有些心思……”     李
* 曦治思忖一阵,先把笔墨搁置,朝着杨宵儿道:     “恐怕还
* 要宵儿去一趟帝云峰,查一查李恩成入宗前后之事,是不是得罪了什
* 么人,在自己峰中都不敢说话。”     李恩成虽然是丹修大师
* ,却处处受制于云丹峰,大部分人情都是求到云丹峰,他苦苦炼成丹
* 药,最后人情与好处大都被云丹峰得去。     只是他一向表现
* 得古怪,众人都当他不在乎,李曦治现下想来也觉得蹊跷了,不敢让
* 自己父亲贸然行事,打算打听个清楚。     ‘杨天衙亲自为我
* 家遮掩,想必与我家有联系或是与萧家有图谋,去帝云峰才能查出真
* 消息,也不至于露出马脚。’     他放了笔墨,取出《六色寻
* 元遁》,创出这遁法的前辈明显是個好面子的,玉简上五彩缤纷,雕
* 刻着各色华纹。     ‘若是论真元华丽,《朝霞采露诀》还真
* 是一等一…’     李曦治看了一夜,便见着杨宵儿驾风回来,
* 皱着眉进来,回答道:     “李恩成…还真得罪过一人!”
*     “谁?”     李曦治连忙抬头,却见杨宵儿面色古怪
* ,低声道:     “迟尉!”     “迟尉?!”    
*  李曦治呆了一瞬,有些难以置信地道:     “怎么可能?”
*     杨宵儿仔细检查门窗,用秘法传音:     “迟尉当
* 年还是筑基,与李恩成外出,两人在一片废墟中寻到了一道丹道传承
* ,李恩成见利起欲,打伤迟尉,将他锁在秘境之中,夺取此道…”
*     “不曾想迟尉后来反而在其中得了大好处,归宗而来,李恩
* 成被拿下审问,只依靠了当年的府辰峰主一力保下,迟尉也大度不再
* 追究。”     “两人化干戈为玉帛,后头李恩成再未出宗,一
* 日日在峰上炼丹,以赎罪过……”     李曦治听得摇头:  
*    “原来还有这种渊源…难怪…”     杨宵儿复又道:
*     “如今迟尉身死,李恩成成了摇钱树,宗内已经抹去这一段
* 不提,乃是老祖派人告诉我的。”     “难怪李恩成很少外出
* …”     李曦治点头,若有所思:     “未必是他不愿
* 出宗,兴许是不敢。”     李曦治从架上取出一枚玉简,仔细
* 一查,若有所悟,低声道:     “果然有这小段记录,所得【
* 密樊宗】一丹道传承…原来其中还有这样一段故事。”     杨
* 宵儿努努嘴,提醒道:     “这事情实在太过久远,除了几个
* 紫府,如今宗内的峰主与弟子皆不晓得,应该没有什么问题。”  
*    “我家老祖当年也不过是个小弟子,这事情几分真几分假,宗
* 内说的和秘境中发生的都不知真假,姑且一听。”     李曦治
* 微微点头,心中暗暗计较,拿起笔来又在信上添了几句,默默折好,
* 用自家秘法封了,准备寄出去。     李渊蛟送来的三枚宝药并
* 没有用上,虽然父亲李渊蛟信中说的是若是结交无望,留以自用,李
* 曦治却不舍得全都塞进自己腰包里。     李曦治仔细看了看,
* 取出其中一枚【云藤灵椒】,准备交给云丹峰炼制一炉丹药,其余两
* 枚还是原封不动地收好,装入小袋之中,随信送回家去。     
* ……     青杜峰。     李曦明端坐在炉火旁,金黄色的
* 火焰照的他面上忽明忽暗,手中轻轻一钩,【玄阳离火】跳动而出,
* 在他指上回荡勾勒。     【玄阳离火】爆裂难缠,却在他手中
* 乖巧犹如精灵,跳跃流动。     这原本是对敌的上好灵火,只
* 可惜家中只有这一份,只能转成【长行元火】,李曦明在手中把玩着
* ,感受着其中爆裂灼热的强大威力,有些惋惜。     李曦明受
* 了符种,修为到达练气五层,距离练气六层本只有一步之遥,闭关四
* 月,轻轻松松地突破练气六层,气息平缓,游刃有余。     
* 箓气如此神妙,可惜只能受一道,若是能服用几道就好了…’   
*   李曦明闭关两月,才出了关,心中痒痒,把院外的下人叫进来,
* 吩咐道:     “把那窦…几个都叫上来…”     这人帮
* 着传唤多次,闻弦歌而知雅意,自然晓得,正拜退下去,李曦明又连
* 忙道:     “等等!等等…有人来了。”     便见着院
* 门嘎吱一声开了,外头进来个白袍少年,剑眉星目,一身真元如寒雪
* ,笑道:     “曦明出关了,倒是来得巧!”     李曦
* 峻的修为也达到了练气五层,两人受的都是筑基级别,一连突破,都
* 比宗内的李曦治高出一筹了,都成了练气中期,唯独山下的李曦峸还
* 是练气二层。     兄弟两坐下,李曦明还有些尴尬,李曦峻不
* 去点破,将他闭关前后的事情一一说了,把两条矿脉一指,李曦明也
* 颇为欣喜,答道:     “是好事!”     李曦峻开口道
*     “仲父如今已经闭关养伤,我这两月外出采气,修炼【
* 屠钧葵光】,顺道走了两个坊市,已经把施【闰阳法】的灵萃灵物为
* 你买齐了。”     说着从储物袋中摆出诸物,凤尾花纹的灵石
* 、入手温热的玉瓶、赤红的灵萃…一系列灵物:     “这是【
* 凤尾石】、这是【灰乌烟】、【元阳灵萃】……”     李曦明
* 一一接过,见着李曦峻风尘仆仆的模样,连忙谢了一句,把东西先放
* 在案上,就不好意思多说什么,只能说着多谢。     李曦峻摆
* 手,不曾放在心上。     他如今修为有所精进,又开始修炼《
* 清目灵瞳》,眼中精光流转,仿佛能把人看个通透,低声道:   
*   “大叔公近来很是憔悴,应该是心魔缠身,只是他从不肯说,你
* 多炼些清心一类的丹药…我找机会再叫几人跑一趟南边大郡,寻一寻
* 这一类的丹药。”     “恰好我有一味灵水也需要外出寻找,
* 把这两件事合在一块做,也方便些。”     李曦明听了他的话
* ,点头应是,李玄宣是他大父,本来是他最该上心的,只是闭关修炼
* ,耽误了时间,愧道:     “我这就去炼丹,我这就去炼丹…
* 大父的事情我今后仔细看着,不必你们操心。”     李曦峻笑
* 着点头,李曦明当下问道:     “【屠钧葵光】竟然这样难修
* 炼?家中已经有一味寒水,一道寒气,袁家那处得了一道,《寒雪集
* 》中有三道寒气,一道寒水寻法…还要外出?”     “就差那
* 一道寒水了。”     李曦峻笑着点头,答道:     “我
* 这【明霜松岭】善于使用法术,【屠钧葵光】在我手中很是厉害。”
*     他伸出两指,将拇指抵在为食指根处,口中念诀,顿时放
* 出一阵刺目的寒光来,寒气凛凛,指尖飘散出一缕缕洁白无瑕的华光
* ,在空中四散飞舞。     李曦明只觉得面上生寒,身后汗毛根
* 根竖起,脚底下的地面浮现出一层白莹莹的霜,体力的真元流转都有
* 些不畅起来。     桌案上放着灵材,李曦峻不敢放开,只略微
* 展示,挥手散去法术,解释道:     “屠钧葵光远不止在寒、
* 还在于阴,等我得了灵水,还能更上一层,到时候在打斗中运起这法
* 术,就算是修为高出我许多,猝不及防也要吃个闷亏。”     
* 李曦明羡慕地看了看:     “只可惜我功法乃是金阳一系,不
* 能修炼,《金殿煌元诀》虽好,却没有配套的法术与遁术。”   
*   两人交谈一阵,青杜山大阵外传来一声娇喝:     “玄岳
* 门孔氏,应约而来,还请开一开山门!”     两人微愣,驾风
* 而起,阵外正站着个素衣女子,腰间佩着金珠,挂着两把弯刀,姿容
* 绰约,后头则是个平平无奇的中年人,一言不发。     ‘好美
* 的女子。’     李曦明性格平和,虽然有些留恋于女色,却还
* 不至于色令智昏,知道是筑基前辈,低垂着头不敢看。     李
* 曦峻则抱拳道:     “来人可是孔婷云前辈?”     “
* 不错,你是…?”     孔婷云看了他一眼,心中暗赞,客气几
* 分,轻声道:     “蛟兄曾经与我约定为贵族修筑火脉,如今
* 我已应约而来。”     “哗啦…”     言谈之间,望月
* 湖深青色的湖面轰然破开,一个黑袍青年驾风上来,阴沉沉地看了一
* 眼孔婷云,目光停留在她腰间配着两把弯刀上,脸色一下难看起来,
* 一言不发地立着。     孔婷云瞥了他一眼,只觉得很是眼熟,
* 震惊了一瞬,失声道:     “钩蛇?!”     李乌梢深
* 深地出了两口气,低声下气地道:     “钩蛇已死,在下是青
* 杜李乌梢,乌梢见过上仙。”     孔婷云很是不自然地应了,
* 埋藏多时的疑惑总算是解决:     ‘我说李渊蛟怎地莫名其妙
* 、不嫌苦累一路把这钩蛇带回李家…原来是有控制妖物的法子…毕竟
* 靠近北方,也不足为奇。’     只是她腰上还挂着钩蛇曾经的
* 尾钩炼制成的一对筑基法器,实在有些尴尬,钩蛇如今是李家的人,
* 该给的面子要给,默默把法器收到储物袋中,孔婷云道:     
* “玄岳孔婷云,见过道友。”     李乌梢面色好看许多,默默
* 退到李曦峻身后。     李渊蛟与李清虹闭关,这担子自然落到
* 李曦峻身上,他客客气气地道:     “还请前辈稍待些时日,
* 长辈正闭关,一时间不能出来迎接…”     孔婷云摆摆手,显
* 现出无所谓的模样,径直道:     “用不着李渊蛟,伱指一座
* 山让我开了火脉,便把那阵盘还我,我便要离去了,没有多少闲功夫
* 。”     言罢,孔婷云还有些提心吊胆地疑问道:     
* “那阵法不会给李渊蛟弄坏了,至今不敢见我?这可是贵重物件,要
* 是弄坏了,你家可赔得多了!”     “前辈放心,自然无事。
* ”     李曦峻点头,火脉的选址本是李家计划好的,选在了乌
* 涂山。     火脉变动大多会影响周边的灵田,其余几峰都矗立
* 在大片灵田之中,唯独乌涂山孤零零地悬在山林中,只能选了这山。
*     孔婷云一示意,那练气巅峰的中年男子已经驾风落向乌涂
* 山,李曦峻带人驾风过去,一齐在空中看着。 亲,点击进去,给个
* 好评呗,分数越高更新越快,据说给香书小说打满分的最后都找到了
* 漂亮的老婆哦! 手机站全新改版升级地址http://wap
* .xbiqugu.la数据和书签与电脑站同步无广告清新阅
* 读!
*/
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@@ -759,7 +804,7 @@ onMounted(() => {
th, th,
td { td {
text-align: center; text-align: center;
min-width: 140px; min-width: 120px;
height: 40px; height: 40px;
border: 1px solid #000; border: 1px solid #000;
} }

View File

@@ -51,7 +51,6 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="车辆照片"> <el-form-item label="车辆照片">
@@ -69,7 +68,7 @@
<img alt="车辆照片" v-if="form.carImageUrl" :src="form.carImageUrl" class="avatar" /> <img alt="车辆照片" v-if="form.carImageUrl" :src="form.carImageUrl" class="avatar" />
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon> <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
<template #tip> <template #tip>
<span>支持jpg, png等格式文件上传文件大小不超过10MB可上传多张 </span> <div style="color: gray; font-size: small">支持jpg, png等格式文件上传</div>
</template> </template>
</el-upload> </el-upload>
</el-form-item> </el-form-item>
@@ -82,12 +81,12 @@
<AppUser returnable="*" :isMultiple="false" ref="HolderRef" @change="handleChange"> <AppUser returnable="*" :isMultiple="false" ref="HolderRef" @change="handleChange">
<template #default> <template #default>
<div class="residentBox" @click="choiceResidentFun"> <div class="residentBox" @click="choiceResidentFun">
<div class="defaultBox" v-if="form.residentId === '' || form.userId === ''"> <div class="defaultBox" v-if="form.userId === ''">
<span>请选择</span> <span>请选择</span>
<el-icon><Search /></el-icon> <el-icon><Search /></el-icon>
</div> </div>
<div v-else class="overflow-auto overflow-hidden w-full text-ellipsis text-nowrap"> <div v-else class="overflow-auto overflow-hidden w-full text-ellipsis text-nowrap">
<span>姓名{{ form.residentName && form.residentName.trim() !== '' ? form.residentName : form.userName }}</span> <span>姓名{{ form.userName && form.userName.trim() !== '' ? form.userName : form.residentName }}</span>
</div> </div>
</div> </div>
</template> </template>
@@ -275,14 +274,22 @@ function handleChange(pop) {
} }
} }
</script> </script>
<style scoped> <style scoped lang="scss">
.avatar-uploader .avatar { .avatar {
width: 178px; width: 178px;
height: 178px; height: 178px;
display: block; vertical-align: center;
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 178px;
height: 178px;
border-radius: 5px;
border: 1px dashed #ccc;
margin-right: 20px;
text-align: center;
} }
</style>
<style scoped lang="scss">
.AddBuildingBox { .AddBuildingBox {
padding: 15px; padding: 15px;
height: 100%; height: 100%;