| | |
| | | clearable |
| | | style="width: 100%" |
| | | v-model="form.createTime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="申请日期" |
| | | > |
| | |
| | | import Li_area_select from "@/components/Address"; |
| | | import OrgSelecter from "@/views/project/components/orgselect"; |
| | | import { getToken } from "@/utils/auth"; |
| | | import { moneySum, moneyAdd, moneySub, moneyMul, moneyRound } from "@/utils/money"; |
| | | import { checkFileName, checkDetails } from "@/utils/fileNameCheck"; |
| | | |
| | | export default { |
| | | //import引入的组件需要注入到对象中才能使用 |
| | |
| | | }, |
| | | /** 提交按钮 */ |
| | | submitForm: debounce(function() { |
| | | // 2026-10-15:保存前附件文件名规范校验(仅新增单据;老单据的历史附件由后端按"只校验本次变更"放行) |
| | | if (!this.checkDetailFileNames()) { |
| | | return; |
| | | } |
| | | |
| | | if (!this.randomnumber) { |
| | | this.randomnumber = this.generateRandomString(9); |
| | | this.form.randomnumber = this.randomnumber; |
| | |
| | | this.$store.dispatch("tagsView/delView", this.$route); |
| | | this.$router.go(-1); |
| | | } else { |
| | | if (res.msg) { |
| | | this.$modal.msgError("操作失误"); |
| | | } else { |
| | | this.$modal.msgError(res.msg); |
| | | } |
| | | this.$modal.msgError(res.msg || "操作失败"); |
| | | } |
| | | }); |
| | | }, |
| | |
| | | }, |
| | | // 接受提醒立刻保存 |
| | | Savenow() { |
| | | // 2026-10-15:保存前附件文件名规范校验(仅新增单据;老单据的历史附件由后端按"只校验本次变更"放行) |
| | | if (!this.checkDetailFileNames()) { |
| | | return; |
| | | } |
| | | |
| | | if (!this.randomnumber) { |
| | | this.randomnumber = this.generateRandomString(9); |
| | | this.form.randomnumber = this.randomnumber; |
| | |
| | | } |
| | | }, |
| | | |
| | | //计算总金额 |
| | | //计算总金额(金额一律走精确运算) |
| | | sumTotalFee(row) { |
| | | let allSum = 0; |
| | | const detailsArr = []; |
| | | if (this.form.applytype != null) { |
| | | for (let i = 0; i < this.rbDetails.length; i++) { |
| | | const detail = this.rbDetails[i]; |
| | | let totalFee = 0; |
| | | let taxFee = 0; |
| | | if (this.form.applytype == 1 || this.form.applytype == 2) { |
| | | //计算当前报销内容费用合计 |
| | | if (!isNaN(parseFloat(this.rbDetails[i].amount))) { |
| | | totalFee += parseFloat(this.rbDetails[i].amount); |
| | | taxFee += parseFloat(this.rbDetails[i].amount); |
| | | //计算当前报销内容费用合计:税前 - 扣税 |
| | | if (!isNaN(parseFloat(detail.amount))) { |
| | | totalFee = moneyAdd(totalFee, detail.amount); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].taxamount))) { |
| | | totalFee -= parseFloat(this.rbDetails[i].taxamount); |
| | | taxFee -= parseFloat(this.rbDetails[i].taxamount); |
| | | if (!isNaN(parseFloat(detail.taxamount))) { |
| | | totalFee = moneySub(totalFee, detail.taxamount); |
| | | } |
| | | } else if (this.form.applytype == 3 || this.form.applytype == 4) { |
| | | //单价*数量=税前金额 |
| | | if ( |
| | | !isNaN(parseFloat(this.rbDetails[i].price)) && |
| | | !isNaN(parseFloat(this.rbDetails[i].quantity)) |
| | | !isNaN(parseFloat(detail.price)) && |
| | | !isNaN(parseFloat(detail.quantity)) |
| | | ) { |
| | | totalFee += |
| | | parseFloat(this.rbDetails[i].price) * |
| | | parseFloat(this.rbDetails[i].quantity); |
| | | totalFee = moneyMul(detail.price, detail.quantity); |
| | | this.rbDetails[i].amount = totalFee; |
| | | } |
| | | } |
| | |
| | | // this.rbDetails[i].taxedamount = taxFee.toFixed(2); |
| | | // } |
| | | |
| | | allSum += totalFee; |
| | | detailsArr.push(totalFee); |
| | | } |
| | | } |
| | | // this.form.amountrequested = allSum.toFixed(2); |
| | | // this.form.amountrequested = moneyRound(moneySum(detailsArr)).toFixed(2); |
| | | // this.$forceUpdate(); |
| | | }, |
| | | |
| | |
| | | // console.log(response.msg); |
| | | // } |
| | | // }, |
| | | /** |
| | | * 2026-10-15:上传时校验附件文件名(业务要求:不合格立即提示且不加入列表)。 |
| | | * 规则与后端 AttachmentNameValidator 同口径:必须含中文 / 去掉扩展名后主干 ≤20 字 / |
| | | * 不含空格及 / \ : * ? " < > | # % 等特殊字符。 |
| | | */ |
| | | checkUploadFileName(file) { |
| | | const raw = file && file.raw ? file.raw.name : file && file.name; |
| | | const r = checkFileName(raw); |
| | | if (!r.ok) { |
| | | this.$modal.msgError(r.msg); |
| | | return false; |
| | | } |
| | | return true; |
| | | }, |
| | | |
| | | /** |
| | | * 2026-10-15:保存前校验整单明细附件文件名(含同一行内重名)。 |
| | | * 口径(业务确认):只校验"本次变更"的附件——老单据里已存在的不合规附件名不能把保存卡死 |
| | | * (否则老单据改一个金额都存不进去)。后端按 id 读旧记录放行历史附件;前端拿不到"哪些是历史" |
| | | * 的权威信息,因此**仅新增单据**做保存前拦截,编辑老单据时新增的不合规附件由后端二次校验拦下。 |
| | | */ |
| | | checkDetailFileNames() { |
| | | if (this.form && this.form.id) { |
| | | return true; |
| | | } |
| | | const c = checkDetails(this.rbDetails); |
| | | if (!c.ok) { |
| | | this.$modal.msgError(c.msg); |
| | | return false; |
| | | } |
| | | return true; |
| | | }, |
| | | |
| | | uploadSccess(response, file, fileList) { |
| | | if (!this.checkUploadFileName(file)) { |
| | | return; |
| | | } |
| | | this.rbDetails; |
| | | |
| | | //获取票据信息位置 |
| | |
| | | |
| | | //生命周期 - 挂载完成(可以访问DOM元素) |
| | | mounted() { |
| | | window.addEventListener("beforeunload", e => this.beforeunloadHandler(e)); |
| | | // 存住同一个引用,否则 removeEventListener 传新箭头函数无法真正移除,会泄漏监听器 |
| | | this._beforeUnloadHandler = e => this.beforeunloadHandler(e); |
| | | window.addEventListener("beforeunload", this._beforeUnloadHandler); |
| | | this.getUserList(); |
| | | this.getUserProfile(); |
| | | let apifunddetailForm = this.funddetailForm; |
| | | let apiform = this.form; |
| | | console.log(apiform); |
| | | console.log(apifunddetailForm); |
| | | |
| | | // this.getFeeUnitList(); |
| | | }, |
| | |
| | | beforeMount() {}, //生命周期 - 挂载之前 |
| | | beforeUpdate() {}, //生命周期 - 更新之前 |
| | | updated() {}, //生命周期 - 更新之后 |
| | | beforeDestroy() {}, //生命周期 - 销毁之前 |
| | | beforeDestroy() { |
| | | if (this._beforeUnloadHandler) { |
| | | window.removeEventListener("beforeunload", this._beforeUnloadHandler); |
| | | this._beforeUnloadHandler = null; |
| | | } |
| | | }, //生命周期 - 销毁之前 |
| | | destroyed() {}, //生命周期 - 销毁完成 |
| | | activated() {} //如果页面有keep-alive缓存功能,这个函数会触发 |
| | | }; |