commit
This commit is contained in:
@@ -456,6 +456,8 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
|
||||
complete_result></file-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="40">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="其他" prop="otherFiles">
|
||||
<file-upload :value.sync="formData.otherFiles" accept=".jpg,.jpeg,.png"
|
||||
|
||||
@@ -107,7 +107,7 @@ const ACTIVITY_CULTURE_INFO_MANAGE = {
|
||||
:disabled="row.projectTypeCode==50004">
|
||||
编辑
|
||||
</el-dropdown-item>
|
||||
<el-dropdown-item
|
||||
<el-dropdown-item u
|
||||
v-if="row.canRevoke" :command="{type:'Revoke',row}">
|
||||
撤回
|
||||
</el-dropdown-item>
|
||||
|
||||
@@ -80,7 +80,7 @@ layout("/layouts/platform.html"){
|
||||
})
|
||||
},
|
||||
openAnnualLimit() {
|
||||
window.location.href = '/platform/trainSignUp/annualLimit'
|
||||
commonUtil.pjaxPush('/platform/trainSignUp/annualLimit')
|
||||
},
|
||||
openAdd() {
|
||||
this.$refs.guava.edit(() => {
|
||||
|
||||
@@ -571,6 +571,11 @@ layout("/layouts/platform.html"){
|
||||
{{formatNumber(row.support)}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="其他收入(元)" prop="otherIncome">
|
||||
<template slot-scope="{row}">
|
||||
{{formatNumber(row.otherIncome)}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="年度总支出(元)" prop="totalExpend">
|
||||
<template slot-scope="{row}">
|
||||
{{formatNumber(row.totalExpend)}}
|
||||
@@ -662,7 +667,7 @@ layout("/layouts/platform.html"){
|
||||
// 财务数据
|
||||
financeData: {
|
||||
incomeDetailed: [], // 收支明细
|
||||
incomeCensus: [{ lastYearSurplus: 0, income: 0, allocate: 0, support: 0, totalExpend: 0, surplus: 0 }] // 收支统计
|
||||
incomeCensus: [{ lastYearSurplus: 0, income: 0, allocate: 0, support: 0, otherIncome: 0, totalExpend: 0, surplus: 0 }] // 收支统计
|
||||
},
|
||||
|
||||
// 表单校验规则
|
||||
@@ -680,12 +685,13 @@ layout("/layouts/platform.html"){
|
||||
{ label: "校工会拨款", value: "校工会拨款" },
|
||||
{ label: "年度结余", value: "年度结余" },
|
||||
{ label: "社会赞助", value: "社会赞助" },
|
||||
{ label: "其他收入", value: "其他收入" },
|
||||
{ label: "支出", value: "支出" }
|
||||
];
|
||||
},
|
||||
// 收入类型集合
|
||||
INCOME_TYPES() {
|
||||
return ["会费收入", "校工会拨款", "社会赞助", "其它"];
|
||||
return ["会费收入", "校工会拨款", "社会赞助", "其他收入"];
|
||||
},
|
||||
// 支出类型集合
|
||||
EXPEND_TYPES() {
|
||||
@@ -730,8 +736,9 @@ layout("/layouts/platform.html"){
|
||||
const income = row.income || 0;
|
||||
const allocate = row.allocate || 0;
|
||||
const support = row.support || 0;
|
||||
const otherIncome = row.otherIncome || 0;
|
||||
const totalExpend = row.totalExpend || 0;
|
||||
const total = Number(lastYearSurplusVal) + Number(income) + Number(allocate) + Number(support) - Number(totalExpend);
|
||||
const total = Number(lastYearSurplusVal) + Number(income) + Number(allocate) + Number(support) + Number(otherIncome) - Number(totalExpend);
|
||||
return this.formatNumber(total);
|
||||
},
|
||||
// 表单校验通用方法
|
||||
@@ -788,7 +795,7 @@ layout("/layouts/platform.html"){
|
||||
data.year = data.year?.toString() || new Date().getFullYear() + "";
|
||||
this.formData = data;
|
||||
// 初始化财务数据
|
||||
this.financeData.incomeCensus = data.incomeCensus || [{ lastYearSurplus: 0, income: 0, allocate: 0, support: 0, totalExpend: 0, surplus: 0 }];
|
||||
this.financeData.incomeCensus = data.incomeCensus || [{ lastYearSurplus: 0, income: 0, allocate: 0, support: 0, otherIncome: 0, totalExpend: 0, surplus: 0 }];
|
||||
|
||||
// 从统计数据中提取去年年度结余
|
||||
if (this.financeData.incomeCensus && this.financeData.incomeCensus.length > 0) {
|
||||
@@ -948,6 +955,8 @@ layout("/layouts/platform.html"){
|
||||
this.financeData.incomeCensus[0].allocate = (this.financeData.incomeCensus[0].allocate || 0) - income;
|
||||
} else if (row.incomeType === "社会赞助") {
|
||||
this.financeData.incomeCensus[0].support = (this.financeData.incomeCensus[0].support || 0) - income;
|
||||
} else if (row.incomeType === "其他收入") {
|
||||
this.financeData.incomeCensus[0].otherIncome = (this.financeData.incomeCensus[0].otherIncome || 0) - income;
|
||||
} else if (row.incomeType === "支出") {
|
||||
this.financeData.incomeCensus[0].totalExpend = (this.financeData.incomeCensus[0].totalExpend || 0) - expend;
|
||||
}
|
||||
@@ -968,6 +977,10 @@ layout("/layouts/platform.html"){
|
||||
this.$set(row, "expend", null);
|
||||
this.calcSupportTotal();
|
||||
break;
|
||||
case "其他收入":
|
||||
this.$set(row, "expend", null);
|
||||
this.calcOtherIncomeTotal();
|
||||
break;
|
||||
case "支出":
|
||||
this.$set(row, "income", null);
|
||||
this.calcExpendTotal();
|
||||
@@ -993,6 +1006,8 @@ layout("/layouts/platform.html"){
|
||||
this.calcAllocateTotal();
|
||||
} else if (row.incomeType === "会费收入") {
|
||||
this.calcDueIncomeTotal();
|
||||
} else if (row.incomeType === "其他收入") {
|
||||
this.calcOtherIncomeTotal();
|
||||
}
|
||||
// 重新计算所有统计数据,确保一致性
|
||||
this.recalculateCensus();
|
||||
@@ -1018,6 +1033,13 @@ layout("/layouts/platform.html"){
|
||||
.reduce((sum, item) => sum + (Number(item.income) || 0), 0);
|
||||
this.financeData.incomeCensus[0].support = total;
|
||||
},
|
||||
// 计算其他收入合计
|
||||
calcOtherIncomeTotal() {
|
||||
const total = this.financeData.incomeDetailed
|
||||
.filter(item => item.incomeType === "其他收入")
|
||||
.reduce((sum, item) => sum + (Number(item.income) || 0), 0);
|
||||
this.financeData.incomeCensus[0].otherIncome = total;
|
||||
},
|
||||
// 计算会费收入合计
|
||||
calcDueIncomeTotal() {
|
||||
const total = this.financeData.incomeDetailed
|
||||
@@ -1049,6 +1071,11 @@ layout("/layouts/platform.html"){
|
||||
.filter(item => item.incomeType === "社会赞助")
|
||||
.reduce((sum, item) => sum + (Number(item.income) || 0), 0);
|
||||
|
||||
// 计算其他收入总额
|
||||
const otherIncomeTotal = this.financeData.incomeDetailed
|
||||
.filter(item => item.incomeType === "其他收入")
|
||||
.reduce((sum, item) => sum + (Number(item.income) || 0), 0);
|
||||
|
||||
// 计算总支出
|
||||
const totalExpend = this.financeData.incomeDetailed
|
||||
.filter(item => item.incomeType === "支出")
|
||||
@@ -1058,9 +1085,12 @@ layout("/layouts/platform.html"){
|
||||
this.financeData.incomeCensus[0].income = dueIncomeTotal;
|
||||
this.financeData.incomeCensus[0].allocate = allocateTotal;
|
||||
this.financeData.incomeCensus[0].support = supportTotal;
|
||||
this.financeData.incomeCensus[0].otherIncome = otherIncomeTotal;
|
||||
this.financeData.incomeCensus[0].totalExpend = totalExpend;
|
||||
// 确保去年年度结余不丢失
|
||||
this.financeData.incomeCensus[0].lastYearSurplus = this.lastYearSurplus;
|
||||
// 同步写回结余,避免保存后统计值与页面展示不一致
|
||||
this.financeData.incomeCensus[0].surplus = Number(this.calcSurplus(this.financeData.incomeCensus[0]));
|
||||
|
||||
// 同步更新全局变量
|
||||
this.dueIncome = dueIncomeTotal;
|
||||
@@ -1134,6 +1164,7 @@ layout("/layouts/platform.html"){
|
||||
// 保存
|
||||
async handleSave() {
|
||||
try {
|
||||
this.recalculateCensus();
|
||||
const resp = await this.$axios.post("/platform/club/examine/apply/save", {
|
||||
data: JSON.stringify(this.formData),
|
||||
incomeDetailed: JSON.stringify(this.financeData.incomeDetailed),
|
||||
@@ -1150,6 +1181,7 @@ layout("/layouts/platform.html"){
|
||||
// 提交(新增)
|
||||
async handleSubmit() {
|
||||
try {
|
||||
this.recalculateCensus();
|
||||
await this.$confirm("确定要提交此申请吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
@@ -1175,6 +1207,7 @@ layout("/layouts/platform.html"){
|
||||
// 提交(任务处理)
|
||||
async handleFinishTask() {
|
||||
try {
|
||||
this.recalculateCensus();
|
||||
await this.$confirm("您确定要提交吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
|
||||
@@ -68,8 +68,12 @@ const EXAMINE_INFO_COMPONENT = {
|
||||
<el-table-column label="会费收入" prop="income"></el-table-column>
|
||||
<el-table-column label="校工会拨款" prop="allocate"></el-table-column>
|
||||
<el-table-column label="社会赞助" prop="support"></el-table-column>
|
||||
<el-table-column label="其他收入" prop="otherIncome"></el-table-column>
|
||||
<el-table-column label="年度总支出" prop="totalExpend"></el-table-column>
|
||||
<el-table-column label="本年度结余" prop="surplus">
|
||||
<template slot-scope="{row}">
|
||||
{{ getIncomeCensusSurplus(row) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-tab-pane>
|
||||
@@ -132,6 +136,19 @@ const EXAMINE_INFO_COMPONENT = {
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
// 历史数据可能没有落库存量结余,这里按统计项兜底重算
|
||||
getIncomeCensusSurplus(row) {
|
||||
if (!row) {
|
||||
return 0
|
||||
}
|
||||
const lastYearSurplus = Number(row.lastYearSurplus) || 0
|
||||
const income = Number(row.income) || 0
|
||||
const allocate = Number(row.allocate) || 0
|
||||
const support = Number(row.support) || 0
|
||||
const otherIncome = Number(row.otherIncome) || 0
|
||||
const totalExpend = Number(row.totalExpend) || 0
|
||||
return lastYearSurplus + income + allocate + support + otherIncome - totalExpend
|
||||
},
|
||||
async onOpen(row) {
|
||||
this.row = row
|
||||
const resp = await this.$axios.post("/platform/club/examine/common/findOne", { id: row.id })
|
||||
|
||||
@@ -37,6 +37,7 @@ const CLUB_INFO_MANAGE_TEMPLATE = {
|
||||
<el-table-column label="电话" prop="mobile" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="所属单位" prop="unitName" sortable show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="身份" prop="roleName" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="入会时间" prop="joinTime" show-overflow-tooltip sortable></el-table-column>
|
||||
<el-table-column label="操作">
|
||||
<template slot-scope="{row}">
|
||||
<el-dropdown>
|
||||
|
||||
@@ -58,7 +58,8 @@ const CLUB_SPONSOR_TEMPLATE = {
|
||||
`,
|
||||
data() {
|
||||
return {
|
||||
sponsorData: [],
|
||||
// 发起人至少需要 3 人,默认先展示 3 行,方便录入。
|
||||
sponsorData: [{}, {}, {}],
|
||||
userOptions: []
|
||||
}
|
||||
},
|
||||
@@ -91,6 +92,10 @@ const CLUB_SPONSOR_TEMPLATE = {
|
||||
})
|
||||
},
|
||||
sponsorDeleteRow(row, index) {
|
||||
if (this.sponsorData.length <= 3) {
|
||||
this.$message.warning("发起人至少保留3行")
|
||||
return
|
||||
}
|
||||
this.sponsorData.splice(index, 1)
|
||||
}
|
||||
},
|
||||
|
||||
@@ -38,7 +38,7 @@ layout("/layouts/platform.html"){
|
||||
<el-button v-if="activeName === 1" type="primary" @click="activeName = 0">上一步</el-button>
|
||||
<el-button v-if="activeName === 2" type="primary" @click="activeName = 1">上一步</el-button>
|
||||
<el-button v-if="activeName === 0" type="primary" @click="nextStep">下一步</el-button>
|
||||
<el-button v-if="activeName === 1" type="primary" @click="activeName = 2">下一步</el-button>
|
||||
<el-button v-if="activeName === 1" type="primary" @click="nextSponsorStep">下一步</el-button>
|
||||
|
||||
<el-button type="primary" plain @click="onSave">保存</el-button>
|
||||
<el-button type="primary" @click="onSubmit" v-if="!taskId">提交</el-button>
|
||||
@@ -73,6 +73,14 @@ layout("/layouts/platform.html"){
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
validateSponsorCount() {
|
||||
const sponsorList = this.$refs.clubSponsorRef.sponsorData.filter((o) => o.userId !== "" && o.userId !== undefined)
|
||||
if (sponsorList.length < 3) {
|
||||
this.$message.warning({ title: "温馨提醒", message: "发起人不少于3人" })
|
||||
return false
|
||||
}
|
||||
return true
|
||||
},
|
||||
nextStep() {
|
||||
let valid = true
|
||||
this.$refs.clubFormRef.$refs.form.validateField(["clubName"], (errMsg) => {
|
||||
@@ -85,6 +93,13 @@ layout("/layouts/platform.html"){
|
||||
if (valid) return
|
||||
this.activeName = 1
|
||||
},
|
||||
nextSponsorStep() {
|
||||
// 第二步进入第三步前,先校验发起人数量,避免遗漏必填人数要求。
|
||||
if (!this.validateSponsorCount()) {
|
||||
return
|
||||
}
|
||||
this.activeName = 2
|
||||
},
|
||||
async onSave() {
|
||||
let valid = true
|
||||
this.$refs.clubFormRef.$refs.form.validateField("clubName", (errMsg) => {
|
||||
@@ -122,8 +137,7 @@ layout("/layouts/platform.html"){
|
||||
formData.sponsor = this.$refs.clubSponsorRef.sponsorData
|
||||
.filter((o) => o.userId !== "" && o.userId !== undefined)
|
||||
.map((o) => o.userId)
|
||||
if (['onFinishTask', 'onSubmit'].includes(type) && formData.sponsor && formData.sponsor.length < 3) {
|
||||
this.$message.warning({ title: "警告", message: "发起人要求不少于3人" })
|
||||
if (['onFinishTask', 'onSubmit'].includes(type) && !this.validateSponsorCount()) {
|
||||
return
|
||||
}
|
||||
let manageValid = false
|
||||
@@ -200,7 +214,6 @@ layout("/layouts/platform.html"){
|
||||
let users = resp.data.clubUser.map((o) => o.userId)
|
||||
let array = []
|
||||
if (resp.data.sponsor) {
|
||||
this.sponsorData = []
|
||||
array = resp.data.sponsor.split(",")
|
||||
formData.sponsor = array
|
||||
}
|
||||
@@ -211,12 +224,16 @@ layout("/layouts/platform.html"){
|
||||
if (users) {
|
||||
this.$refs.clubManagerRef.userOptions = await this.queryUserByIds(users)
|
||||
}
|
||||
this.$refs.clubSponsorRef.sponsorData = []
|
||||
array.forEach((item, index) => {
|
||||
let row = {}
|
||||
row.userId = item
|
||||
this.$refs.clubSponsorRef.sponsorPersonChange(item, row, index)
|
||||
this.$refs.clubSponsorRef.sponsorData.push(row)
|
||||
})
|
||||
while (this.$refs.clubSponsorRef.sponsorData.length < 3) {
|
||||
this.$refs.clubSponsorRef.sponsorData.push({})
|
||||
}
|
||||
this.$refs.clubFormRef.formData = formData
|
||||
this.$refs.clubFormRef.concatPersonChange(resp.data.concatPerson)
|
||||
}
|
||||
|
||||
+8
-6
@@ -31,12 +31,14 @@ layout("/layouts/platform.html"){
|
||||
</el-card>
|
||||
<el-card shadow="never" class="mt10">
|
||||
<table-tool label="温馨提示:请先更新拨付金额后再点击核对按钮">
|
||||
<el-button @click="closeAudit(false)" size="mini" type="primary">
|
||||
开启核对入口
|
||||
</el-button>
|
||||
<el-button @click="closeAudit(true)" size="mini" type="danger">
|
||||
取消核对入口
|
||||
</el-button>
|
||||
<template v-if="$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_CLUB_ADMIN'])">
|
||||
<el-button @click="closeAudit(false)" size="mini" type="primary">
|
||||
开启核对入口
|
||||
</el-button>
|
||||
<el-button @click="closeAudit(true)" size="mini" type="danger">
|
||||
取消核对入口
|
||||
</el-button>
|
||||
</template>
|
||||
</table-tool>
|
||||
<el-table :data="tableData" style="width: 100%" row-key="id"
|
||||
v-loading="tableLoading" :size="tableSize" class="vi-table">
|
||||
|
||||
+587
-24
@@ -2,6 +2,42 @@
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<style>
|
||||
.reimbursement-tabs {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.invoice-toolbar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
flex-wrap: wrap;
|
||||
gap: 12px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.invoice-toolbar-title {
|
||||
font-size: 14px;
|
||||
color: #1867b0;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.invoice-summary-tip {
|
||||
margin-top: 8px;
|
||||
font-size: 12px;
|
||||
color: #909399;
|
||||
}
|
||||
|
||||
.invoice-file-name {
|
||||
color: #1867b0;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.invoice-file-name:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<el-card shadow="never">
|
||||
<template #header>
|
||||
@@ -12,7 +48,9 @@ layout("/layouts/platform.html"){
|
||||
</template>
|
||||
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=":"
|
||||
class="flow-task-form">
|
||||
<el-descriptions :column="2" border>
|
||||
<el-tabs class="reimbursement-tabs" v-model="activeTabName">
|
||||
<el-tab-pane label="申请基本信息" name="basic">
|
||||
<el-descriptions :column="2" border>
|
||||
<el-descriptions-item label="经办人">{{formData.userName}}</el-descriptions-item>
|
||||
<el-descriptions-item label="工号">{{formData.loginName}}</el-descriptions-item>
|
||||
<!-- <el-descriptions-item label="报销类别">-->
|
||||
@@ -26,7 +64,7 @@ layout("/layouts/platform.html"){
|
||||
<!-- </el-descriptions-item>-->
|
||||
<el-descriptions-item label="报销项目" span="2">
|
||||
<el-form-item label="报销项目" prop="reimburseProject">
|
||||
<el-radio-group v-model="formData.reimburseProject" size="medium">
|
||||
<el-radio-group v-model="formData.reimburseProject" size="medium" @change="handleReimburseProjectChange">
|
||||
<el-radio :label="item.code" border v-for="item in reimburseProjectList">
|
||||
{{item.name}}
|
||||
</el-radio>
|
||||
@@ -82,11 +120,32 @@ layout("/layouts/platform.html"){
|
||||
</el-form-item>
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="户名" v-if="formData.paymentWay === 'UNION_REIMBURSE_PAYMENT_WAY_2'">
|
||||
<el-form-item label="户名" prop="bankUserName">
|
||||
<el-select
|
||||
v-model="formData.bankUserName"
|
||||
@change="handleBankUserNameChange"
|
||||
clearable
|
||||
filterable
|
||||
allow-create
|
||||
default-first-option
|
||||
placeholder="请输入户名"
|
||||
style="width: 100%">
|
||||
<el-option
|
||||
v-for="(item, index) in bankHistoryUserNames"
|
||||
:key="index"
|
||||
:label="item"
|
||||
:value="item">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="开户行" v-if="formData.paymentWay === 'UNION_REIMBURSE_PAYMENT_WAY_2'">
|
||||
<el-form-item label="开户行" prop="bankOfDeposit">
|
||||
<el-select
|
||||
v-model="formData.bankOfDeposit"
|
||||
@change="getUserBankHistory"
|
||||
@change="fillBankInfoFromHistory"
|
||||
clearable
|
||||
filterable
|
||||
allow-create
|
||||
@@ -107,7 +166,7 @@ layout("/layouts/platform.html"){
|
||||
<el-form-item label="银行卡号" prop="bankCardNumber" >
|
||||
<el-select
|
||||
v-model="formData.bankCardNumber"
|
||||
@change="getUserBankHistory"
|
||||
@change="fillBankInfoFromHistory"
|
||||
clearable
|
||||
filterable
|
||||
allow-create
|
||||
@@ -268,8 +327,7 @@ layout("/layouts/platform.html"){
|
||||
|
||||
<el-descriptions-item label="报销金额" v-if="formData.reimburseProject !== 'UNION_REIMBURSE_PROJECT_1'">
|
||||
<el-form-item label="报销金额" prop="money">
|
||||
<el-input v-model="formData.money" placeholder="输入报销金额"
|
||||
type="number"></el-input>
|
||||
<el-input v-model="formData.money" placeholder="自动汇总发票金额" readonly></el-input>
|
||||
</el-form-item>
|
||||
</el-descriptions-item>
|
||||
|
||||
@@ -282,15 +340,6 @@ layout("/layouts/platform.html"){
|
||||
</el-form-item>
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="发票张数">
|
||||
<el-form-item label="发票张数" prop="invoiceNumber">
|
||||
<el-input-number v-model="formData.invoiceNumber"
|
||||
:max="1000" :min="0" controls-position="right"
|
||||
placeholder="请填写发票张数"
|
||||
style="width: 100%"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="慰问时间" v-if="formData.reimburseProject === 'UNION_REIMBURSE_PROJECT_1'">
|
||||
<el-form-item label="慰问时间" prop="condolenceTime">
|
||||
<el-date-picker v-model="formData.condolenceTime"
|
||||
@@ -396,13 +445,13 @@ layout("/layouts/platform.html"){
|
||||
type="textarea" :autosize="{ minRows: 4, maxRows: 8}"></el-input>
|
||||
</el-form-item>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="报销事由" :span="2">
|
||||
<el-descriptions-item label="报销事由" :span="2" v-if="formData.reimburseProject === 'UNION_REIMBURSE_PROJECT_1'">
|
||||
<el-form-item prop="paymentNotes" label="报销事由">
|
||||
<el-input maxlength="500" v-model="formData.paymentNotes" placeholder="请填写报销事由"
|
||||
type="textarea" :autosize="{ minRows: 4, maxRows: 8}"></el-input>
|
||||
</el-form-item>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="备注" :span="2">
|
||||
<el-descriptions-item label="备注" :span="2" v-if="formData.reimburseProject === 'UNION_REIMBURSE_PROJECT_1'">
|
||||
<el-form-item prop="notes" label="备注">
|
||||
<el-input maxlength="500" v-model="formData.notes" placeholder="需要填写:发票编号、开具方、金额"
|
||||
type="textarea" :autosize="{ minRows: 4, maxRows: 8}"></el-input>
|
||||
@@ -436,7 +485,83 @@ layout("/layouts/platform.html"){
|
||||
<!-- <pc-signature v-model="formData.userSign"></pc-signature>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-descriptions-item>-->
|
||||
</el-descriptions>
|
||||
</el-descriptions>
|
||||
</el-tab-pane>
|
||||
|
||||
<el-tab-pane label="发票信息" name="invoice" v-if="showInvoiceTab">
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="报销金额" prop="money">
|
||||
<el-input v-model="formData.money" placeholder="自动汇总发票金额" readonly></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="发票张数" prop="invoiceNumber">
|
||||
<el-input v-model="formData.invoiceNumber" placeholder="自动统计发票数量" readonly></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item prop="paymentNotes" label="支付内容">
|
||||
<el-input maxlength="500" v-model="formData.paymentNotes" placeholder="请填写支付内容"
|
||||
type="textarea" :autosize="{ minRows: 4, maxRows: 8}"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item prop="notes" label="备注">
|
||||
<el-input maxlength="500" v-model="formData.notes" placeholder="补充说明"
|
||||
type="textarea" :autosize="{ minRows: 3, maxRows: 6}"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<div class="invoice-toolbar">
|
||||
<div>
|
||||
<div class="invoice-toolbar-title">发票明细列表</div>
|
||||
<div class="invoice-summary-tip">
|
||||
每条明细对应一个发票文件,可上传图片或 PDF;报销金额和发票张数会根据下表自动汇总。
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<el-switch
|
||||
v-model="formData.invoiceVerifyEnabled"
|
||||
@change="handleVerifySwitchChange"
|
||||
active-text="自动校验"
|
||||
inactive-text="手工录入">
|
||||
</el-switch>
|
||||
<el-button @click="openInvoiceDialog('add')" plain type="primary" style="margin-left: 12px">新增发票</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<el-table :data="formData.invoiceDetails" border empty-text="暂无发票明细">
|
||||
<el-table-column align="center" label="序号" type="index" width="70"></el-table-column>
|
||||
<el-table-column label="文件名称" min-width="170">
|
||||
<template slot-scope="scope">
|
||||
<span class="invoice-file-name"
|
||||
v-if="getInvoiceFile(scope.row)"
|
||||
@click="previewInvoiceFile(scope.row)">
|
||||
{{ getInvoiceFile(scope.row).name || getInvoiceFile(scope.row).filename }}
|
||||
</span>
|
||||
<span v-else>未上传</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="发票号码" min-width="140" prop="invoiceNo"></el-table-column>
|
||||
<el-table-column align="right" label="发票金额" min-width="110" prop="invoiceAmount"></el-table-column>
|
||||
<el-table-column label="销售方信息名称" min-width="180" prop="sellerName"></el-table-column>
|
||||
<el-table-column label="项目名称" min-width="180" prop="itemName"></el-table-column>
|
||||
<el-table-column label="备注" min-width="150" prop="remark"></el-table-column>
|
||||
<el-table-column align="center" fixed="right" label="操作" width="160">
|
||||
<template slot-scope="scope">
|
||||
<el-button @click="openInvoiceDialog('edit', scope.row, scope.$index)" size="mini" type="text">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button @click="removeInvoiceDetail(scope.$index)" size="mini" type="text">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</el-form>
|
||||
<el-row type="flex" justify="end" class="mt20">
|
||||
<el-button type="primary" plain @click="onSave">保存</el-button>
|
||||
@@ -444,6 +569,70 @@ layout("/layouts/platform.html"){
|
||||
<el-button type="primary" @click="onFinishTask" v-else>提交</el-button>
|
||||
</el-row>
|
||||
</el-card>
|
||||
|
||||
<el-dialog :close-on-click-modal="false"
|
||||
:title="invoiceDialogMode === 'edit' ? '编辑发票明细' : '新增发票明细'"
|
||||
:visible.sync="invoiceDialogVisible"
|
||||
append-to-body
|
||||
width="820px">
|
||||
<el-form :model="detailForm" :rules="detailRules" label-position="right"
|
||||
label-suffix=":" label-width="120px" ref="invoiceDetailForm">
|
||||
<el-row :gutter="30">
|
||||
<el-col :span="24">
|
||||
<el-form-item label="发票文件" prop="invoiceFiles">
|
||||
<file-upload
|
||||
:value.sync="detailForm.invoiceFiles"
|
||||
:upload_number="1"
|
||||
upload_return_id_api="/platform/sys/file/uploadDynamicReturnUrl"
|
||||
upload_result_type="id"
|
||||
upload_result_category="array"
|
||||
complete_result
|
||||
upload_mode="drag"
|
||||
accept=".jpg,.jpeg,.png,.pdf">
|
||||
</file-upload>
|
||||
<div class="invoice-summary-tip">
|
||||
上传发票文件后会自动识别发票号码、金额、销售方信息名称和项目名称;如已开启自动校验,还会继续校验发票信息。
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="发票号码" prop="invoiceNo">
|
||||
<el-input placeholder="请输入发票号码" v-model="detailForm.invoiceNo"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="发票金额" prop="invoiceAmount">
|
||||
<el-input-number :controls="false" :min="0" :precision="2"
|
||||
placeholder="请输入发票金额" style="width: 100%"
|
||||
v-model="detailForm.invoiceAmount"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="销售方信息名称" prop="sellerName">
|
||||
<el-input placeholder="请输入销售方信息名称" v-model="detailForm.sellerName"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="项目名称" prop="itemName">
|
||||
<el-input placeholder="请输入项目名称" v-model="detailForm.itemName"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input :autosize="{ minRows: 3, maxRows: 5}"
|
||||
placeholder="请输入备注"
|
||||
type="textarea"
|
||||
v-model="detailForm.remark"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
|
||||
<span class="dialog-footer" slot="footer">
|
||||
<el-button @click="invoiceDialogVisible = false">取 消</el-button>
|
||||
<el-button @click="saveInvoiceDetail" type="primary">保 存</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -456,12 +645,31 @@ layout("/layouts/platform.html"){
|
||||
return {
|
||||
bizId: GetQueryString("bizId"),
|
||||
taskId: GetQueryString("taskId"),
|
||||
activeTabName: "basic",
|
||||
formData: {
|
||||
reimburseType: "",
|
||||
hospitalizationTimeRange: [],
|
||||
reimburseProject:''
|
||||
reimburseProject:'',
|
||||
invoiceDetails: [],
|
||||
invoiceVerifyEnabled: true
|
||||
},
|
||||
historyData: [],
|
||||
invoiceDialogVisible: false,
|
||||
invoiceDialogMode: "add",
|
||||
detailFormIndex: -1,
|
||||
lastRecognizedFileId: "",
|
||||
recognizingInvoice: false,
|
||||
detailForm: {
|
||||
invoiceFiles: [],
|
||||
invoiceNo: "",
|
||||
invoiceAmount: null,
|
||||
sellerName: "",
|
||||
itemName: "",
|
||||
remark: "",
|
||||
invoiceCode: "",
|
||||
invoiceDate: "",
|
||||
invoiceCheckCode: ""
|
||||
},
|
||||
condolenceWays: [
|
||||
{label: "慰问金(A)", value: "慰问金(A)"},
|
||||
{label: "提货券(B)", value: "提货券(B)"},
|
||||
@@ -492,7 +700,10 @@ layout("/layouts/platform.html"){
|
||||
paymentNotes: [{required: true, message: "请填写支付内容", trigger: ["change", "blur"]}],
|
||||
activityName: [{required: true, message: "请填写活动名称", trigger: ["change", "blur"]}],
|
||||
money: [{required: true, message: "请填写报销金额", trigger: ["change", "blur"]}],
|
||||
mobile: [{required: true, message: "请填写联系方式", trigger: ["change", "blur"]}],
|
||||
mobile: [
|
||||
{required: true, message: "请填写联系方式", trigger: ["change", "blur"]},
|
||||
{pattern: /^(1[3-9]\d{9}|0\d{2,3}-?\d{7,8})$/, message: "请输入正确的联系方式", trigger: "blur"}
|
||||
],
|
||||
files: [{required: true, message: "请上传附件", trigger: ["change", "blur"]}],
|
||||
userSign: [{required: true, message: "请签名", trigger: ["change", "blur"]}],
|
||||
// certifierUserId: [{required: true, message: "请填写认证人", trigger: ["change", "blur"]}],
|
||||
@@ -508,6 +719,13 @@ layout("/layouts/platform.html"){
|
||||
activityTime: [{required: true, message: "请选择活动时间", trigger: ["change", "blur"]}],
|
||||
activityNumber: [{required: true, message: "请输入活动人数", trigger: ["change", "blur"]}]
|
||||
},
|
||||
detailRules: {
|
||||
invoiceFiles: [{required: true, message: "请上传发票文件", trigger: ["change", "blur"]}],
|
||||
invoiceNo: [{required: true, message: "请输入发票号码", trigger: ["change", "blur"]}],
|
||||
invoiceAmount: [{required: true, message: "请输入发票金额", trigger: ["change", "blur"]}],
|
||||
sellerName: [{required: true, message: "请输入销售方信息名称", trigger: ["change", "blur"]}],
|
||||
itemName: [{required: true, message: "请输入项目名称", trigger: ["change", "blur"]}]
|
||||
},
|
||||
chooseType: {},
|
||||
userOptions: [],
|
||||
typeOptions: [],
|
||||
@@ -519,7 +737,37 @@ layout("/layouts/platform.html"){
|
||||
payerOptions: []
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
showInvoiceTab() {
|
||||
return this.formData.reimburseProject !== "UNION_REIMBURSE_PROJECT_1"
|
||||
},
|
||||
bankHistoryUserNames() {
|
||||
const userNameMap = {}
|
||||
return (this.historyData || []).reduce((result, item) => {
|
||||
if (item.bankUserName && !userNameMap[item.bankUserName]) {
|
||||
userNameMap[item.bankUserName] = true
|
||||
result.push(item.bankUserName)
|
||||
}
|
||||
return result
|
||||
}, [])
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
"detailForm.invoiceFiles": {
|
||||
handler(newVal) {
|
||||
const file = newVal && newVal.length ? newVal[0] : null
|
||||
const currentFileId = this.getInvoiceFileId(file)
|
||||
if (!currentFileId) {
|
||||
this.lastRecognizedFileId = ""
|
||||
return
|
||||
}
|
||||
if (currentFileId === this.lastRecognizedFileId) {
|
||||
return
|
||||
}
|
||||
this.recognizeCurrentInvoice(false)
|
||||
},
|
||||
deep: true
|
||||
},
|
||||
"formData.hospitalizationTimeRange"(newVal) {
|
||||
if (newVal && newVal.length === 2) {
|
||||
this.$set(this.formData, "hospitalizationStartTime", newVal[0]);
|
||||
@@ -543,12 +791,38 @@ layout("/layouts/platform.html"){
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
buildDefaultDetailForm() {
|
||||
return {
|
||||
invoiceFiles: [],
|
||||
invoiceNo: "",
|
||||
invoiceAmount: null,
|
||||
sellerName: "",
|
||||
itemName: "",
|
||||
remark: "",
|
||||
invoiceCode: "",
|
||||
invoiceDate: "",
|
||||
invoiceCheckCode: ""
|
||||
}
|
||||
},
|
||||
ensureFormData(formData) {
|
||||
const nextFormData = formData || {}
|
||||
if (!Array.isArray(nextFormData.invoiceDetails)) {
|
||||
this.$set(nextFormData, "invoiceDetails", [])
|
||||
}
|
||||
if (!Array.isArray(nextFormData.files)) {
|
||||
this.$set(nextFormData, "files", [])
|
||||
}
|
||||
if (typeof nextFormData.invoiceVerifyEnabled !== "boolean") {
|
||||
this.$set(nextFormData, "invoiceVerifyEnabled", true)
|
||||
}
|
||||
return nextFormData
|
||||
},
|
||||
createRemoteMethodForPayer(keyword) {
|
||||
this.selectQueryUserForPayer(keyword, this.payerOptions)
|
||||
},
|
||||
selectQueryUserForPayer(keyword, options) {
|
||||
options.length = 0
|
||||
this.$axios.post("/platform/UnionReimburse/apply/listUser", {keyword: keyword}).then((res) => {
|
||||
this.$axios.post("/platform/unionReimburse/apply/listUser", {keyword: keyword}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
options.push(...res.data)
|
||||
}
|
||||
@@ -585,10 +859,44 @@ layout("/layouts/platform.html"){
|
||||
}
|
||||
})
|
||||
},
|
||||
fillBankInfoFromHistory() {
|
||||
const matchItem = this.historyData.find((item) => {
|
||||
if (this.formData.bankUserName && item.bankUserName !== this.formData.bankUserName) {
|
||||
return false
|
||||
}
|
||||
if (this.formData.bankCardNumber && item.bankCardNumber !== this.formData.bankCardNumber) {
|
||||
return false
|
||||
}
|
||||
if (this.formData.bankOfDeposit && item.bankOfDeposit !== this.formData.bankOfDeposit) {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
})
|
||||
if (matchItem) {
|
||||
this.$set(this.formData, "bankUserName", matchItem.bankUserName)
|
||||
this.$set(this.formData, "bankCardNumber", matchItem.bankCardNumber)
|
||||
this.$set(this.formData, "bankOfDeposit", matchItem.bankOfDeposit)
|
||||
}
|
||||
},
|
||||
handleBankUserNameChange(value) {
|
||||
const matchItem = this.historyData.find((item) => item.bankUserName === value)
|
||||
if (matchItem) {
|
||||
this.$set(this.formData, "bankCardNumber", matchItem.bankCardNumber)
|
||||
this.$set(this.formData, "bankOfDeposit", matchItem.bankOfDeposit)
|
||||
}
|
||||
},
|
||||
handleVerifySwitchChange(value) {
|
||||
this.$set(this.formData, "invoiceVerifyEnabled", !!value)
|
||||
if (value && this.invoiceDialogVisible) {
|
||||
this.recognizeCurrentInvoice(true)
|
||||
}
|
||||
},
|
||||
|
||||
async payerUserChange(){
|
||||
if (this.formData.payer) {
|
||||
await this.getUserBankHistory();
|
||||
} else {
|
||||
this.historyData = []
|
||||
}
|
||||
const user = this.payerOptions.find(o => o.id === this.formData.payer)
|
||||
if (user) {
|
||||
@@ -637,6 +945,253 @@ layout("/layouts/platform.html"){
|
||||
this.$set(this.formData, "typeName", name)
|
||||
}
|
||||
},
|
||||
handleReimburseProjectChange(value) {
|
||||
if (value === "UNION_REIMBURSE_PROJECT_1") {
|
||||
this.$set(this, "activeTabName", "basic")
|
||||
this.$set(this.formData, "invoiceDetails", [])
|
||||
this.$set(this.formData, "invoiceNumber", "")
|
||||
this.$set(this.formData, "money", null)
|
||||
} else {
|
||||
this.rebuildInvoiceSummary()
|
||||
}
|
||||
},
|
||||
openInvoiceDialog(mode, row, index) {
|
||||
this.invoiceDialogMode = mode
|
||||
this.detailFormIndex = typeof index === "number" ? index : -1
|
||||
this.lastRecognizedFileId = ""
|
||||
if (mode === "edit" && row) {
|
||||
this.$set(this, "detailForm", JSON.parse(JSON.stringify(row)))
|
||||
} else {
|
||||
this.$set(this, "detailForm", this.buildDefaultDetailForm())
|
||||
}
|
||||
this.invoiceDialogVisible = true
|
||||
this.$nextTick(() => {
|
||||
if (this.$refs.invoiceDetailForm) {
|
||||
this.$refs.invoiceDetailForm.clearValidate()
|
||||
}
|
||||
})
|
||||
},
|
||||
getInvoiceFile(row) {
|
||||
if (!row || !row.invoiceFiles || row.invoiceFiles.length === 0) {
|
||||
return null
|
||||
}
|
||||
return row.invoiceFiles[0]
|
||||
},
|
||||
/**
|
||||
* 兼容上传组件返回完整对象、历史地址回显等多种场景,统一提取文件 id 给识别接口使用。
|
||||
*/
|
||||
getInvoiceFileId(file) {
|
||||
if (!file) {
|
||||
return ""
|
||||
}
|
||||
if (file.id) {
|
||||
return file.id
|
||||
}
|
||||
if (file.response && file.response.data) {
|
||||
if (typeof file.response.data === "string") {
|
||||
const data = file.response.data
|
||||
const idIndex = data.indexOf("id=")
|
||||
if (idIndex > -1) {
|
||||
return data.substring(idIndex + 3)
|
||||
}
|
||||
return data
|
||||
}
|
||||
if (file.response.data.id) {
|
||||
return file.response.data.id
|
||||
}
|
||||
}
|
||||
if (file.downloadPath && typeof file.downloadPath === "string") {
|
||||
const downloadPath = file.downloadPath
|
||||
const idIndex = downloadPath.indexOf("id=")
|
||||
if (idIndex > -1) {
|
||||
return downloadPath.substring(idIndex + 3)
|
||||
}
|
||||
}
|
||||
if (file.url && typeof file.url === "string") {
|
||||
const url = file.url
|
||||
const idIndex = url.indexOf("id=")
|
||||
if (idIndex > -1) {
|
||||
return url.substring(idIndex + 3)
|
||||
}
|
||||
}
|
||||
return ""
|
||||
},
|
||||
previewInvoiceFile(row) {
|
||||
const file = this.getInvoiceFile(row)
|
||||
const fileId = this.getInvoiceFileId(file)
|
||||
if (!fileId) {
|
||||
this.$message.warning("暂无发票文件")
|
||||
return
|
||||
}
|
||||
window.open("/platform/sys/file/download?id=" + fileId)
|
||||
},
|
||||
recognizeCurrentInvoice(showLoading) {
|
||||
const invoiceFile = this.getInvoiceFile(this.detailForm)
|
||||
const invoiceFileId = this.getInvoiceFileId(invoiceFile)
|
||||
if (!invoiceFileId) {
|
||||
return Promise.resolve()
|
||||
}
|
||||
this.lastRecognizedFileId = invoiceFileId
|
||||
this.recognizingInvoice = !!showLoading
|
||||
return this.$axios.get("/platform/unionReimburse/apply/recognizeInvoice", {
|
||||
params: {
|
||||
fileId: invoiceFileId,
|
||||
verifySwitch: this.formData.invoiceVerifyEnabled
|
||||
}
|
||||
}).then((resp) => {
|
||||
if (resp.code !== 0) {
|
||||
this.$message.warning(resp.msg)
|
||||
return false
|
||||
}
|
||||
const data = resp.data || {}
|
||||
if (data.invoiceNo) {
|
||||
this.$set(this.detailForm, "invoiceNo", data.invoiceNo)
|
||||
}
|
||||
if (data.invoiceAmount !== null && data.invoiceAmount !== undefined && data.invoiceAmount !== "") {
|
||||
this.$set(this.detailForm, "invoiceAmount", Number(data.invoiceAmount))
|
||||
}
|
||||
if (data.sellerName) {
|
||||
this.$set(this.detailForm, "sellerName", data.sellerName)
|
||||
}
|
||||
if (data.itemName) {
|
||||
this.$set(this.detailForm, "itemName", data.itemName)
|
||||
}
|
||||
if (data.invoiceCode) {
|
||||
this.$set(this.detailForm, "invoiceCode", data.invoiceCode)
|
||||
}
|
||||
if (data.invoiceDate) {
|
||||
this.$set(this.detailForm, "invoiceDate", data.invoiceDate)
|
||||
}
|
||||
if (data.invoiceCheckCode) {
|
||||
this.$set(this.detailForm, "invoiceCheckCode", data.invoiceCheckCode)
|
||||
}
|
||||
if (this.detailForm.invoiceNo) {
|
||||
return this.validateInvoiceDuplicateBeforeSave()
|
||||
}
|
||||
return true
|
||||
}).catch((error) => {
|
||||
const errorMsg = error && error.response && error.response.data && error.response.data.msg
|
||||
? error.response.data.msg
|
||||
: (error && error.msg ? error.msg : "发票识别请求失败,请稍后重试")
|
||||
this.$message.error(errorMsg)
|
||||
return false
|
||||
}).finally(() => {
|
||||
this.recognizingInvoice = false
|
||||
})
|
||||
},
|
||||
async validateInvoiceDuplicateBeforeSave() {
|
||||
const invoiceNo = this.detailForm.invoiceNo ? String(this.detailForm.invoiceNo).trim() : ""
|
||||
if (!invoiceNo) {
|
||||
return false
|
||||
}
|
||||
const duplicateRows = []
|
||||
const invoiceDetails = this.formData.invoiceDetails || []
|
||||
for (let i = 0; i < invoiceDetails.length; i++) {
|
||||
if (this.detailFormIndex > -1 && i === this.detailFormIndex) {
|
||||
continue
|
||||
}
|
||||
const currentNo = invoiceDetails[i].invoiceNo ? String(invoiceDetails[i].invoiceNo).trim() : ""
|
||||
if (currentNo && currentNo === invoiceNo) {
|
||||
duplicateRows.push(i + 1)
|
||||
}
|
||||
}
|
||||
if (duplicateRows.length > 0) {
|
||||
this.$message.warning("发票号码【" + invoiceNo + "】与本次提交的第" + duplicateRows.join("、") + "条发票重复,不能保存")
|
||||
return false
|
||||
}
|
||||
const resp = await this.$axios.get("/platform/unionReimburse/apply/checkInvoiceDuplicate", {
|
||||
params: {
|
||||
invoiceNo: invoiceNo,
|
||||
reimburseId: this.formData.id || ""
|
||||
}
|
||||
})
|
||||
if (resp.code !== 0) {
|
||||
this.$message.warning(resp.msg)
|
||||
return false
|
||||
}
|
||||
return true
|
||||
},
|
||||
async saveInvoiceDetail() {
|
||||
this.$refs.invoiceDetailForm.validate(async (valid) => {
|
||||
if (!valid) {
|
||||
return
|
||||
}
|
||||
const duplicateValid = await this.validateInvoiceDuplicateBeforeSave()
|
||||
if (!duplicateValid) {
|
||||
return
|
||||
}
|
||||
const detailData = JSON.parse(JSON.stringify(this.detailForm))
|
||||
if (this.detailFormIndex > -1) {
|
||||
this.$set(this.formData.invoiceDetails, this.detailFormIndex, detailData)
|
||||
} else {
|
||||
this.formData.invoiceDetails.push(detailData)
|
||||
}
|
||||
this.rebuildInvoiceSummary()
|
||||
this.invoiceDialogVisible = false
|
||||
})
|
||||
},
|
||||
removeInvoiceDetail(index) {
|
||||
this.$confirm("确定删除这条发票明细吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(() => {
|
||||
this.formData.invoiceDetails.splice(index, 1)
|
||||
this.rebuildInvoiceSummary()
|
||||
})
|
||||
},
|
||||
rebuildInvoiceSummary() {
|
||||
if (this.formData.reimburseProject === "UNION_REIMBURSE_PROJECT_1") {
|
||||
return
|
||||
}
|
||||
let totalMoney = 0
|
||||
let fileCount = 0
|
||||
const invoiceDetails = this.formData.invoiceDetails || []
|
||||
for (let i = 0; i < invoiceDetails.length; i++) {
|
||||
if (invoiceDetails[i].invoiceAmount !== null && invoiceDetails[i].invoiceAmount !== undefined && invoiceDetails[i].invoiceAmount !== "") {
|
||||
totalMoney = totalMoney + Number(invoiceDetails[i].invoiceAmount)
|
||||
}
|
||||
if (invoiceDetails[i].invoiceFiles && invoiceDetails[i].invoiceFiles.length > 0) {
|
||||
fileCount = fileCount + 1
|
||||
}
|
||||
}
|
||||
this.$set(this.formData, "money", totalMoney ? totalMoney.toFixed(2) : "0.00")
|
||||
this.$set(this.formData, "invoiceNumber", String(fileCount))
|
||||
},
|
||||
validateInvoiceDetailsBeforeSubmit() {
|
||||
if (this.formData.reimburseProject === "UNION_REIMBURSE_PROJECT_1") {
|
||||
return true
|
||||
}
|
||||
const invoiceDetails = this.formData.invoiceDetails || []
|
||||
if (!invoiceDetails.length) {
|
||||
this.$message.warning("请至少维护一条发票明细")
|
||||
return false
|
||||
}
|
||||
for (let i = 0; i < invoiceDetails.length; i++) {
|
||||
const currentDetail = invoiceDetails[i]
|
||||
if (!currentDetail.invoiceFiles || currentDetail.invoiceFiles.length === 0) {
|
||||
this.$message.warning("第" + (i + 1) + "条发票明细请上传发票文件")
|
||||
return false
|
||||
}
|
||||
if (!currentDetail.invoiceNo) {
|
||||
this.$message.warning("第" + (i + 1) + "条发票明细请填写发票号码")
|
||||
return false
|
||||
}
|
||||
if (!currentDetail.invoiceAmount || Number(currentDetail.invoiceAmount) <= 0) {
|
||||
this.$message.warning("第" + (i + 1) + "条发票明细请填写正确的发票金额")
|
||||
return false
|
||||
}
|
||||
if (!currentDetail.sellerName) {
|
||||
this.$message.warning("第" + (i + 1) + "条发票明细请填写销售方信息名称")
|
||||
return false
|
||||
}
|
||||
if (!currentDetail.itemName) {
|
||||
this.$message.warning("第" + (i + 1) + "条发票明细请填写项目名称")
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
},
|
||||
//
|
||||
// typeChange(id) {
|
||||
// this.chooseType = this.typeOptions.find(o => o.id === id)
|
||||
@@ -647,6 +1202,7 @@ layout("/layouts/platform.html"){
|
||||
// },
|
||||
// 保存
|
||||
onSave() {
|
||||
this.rebuildInvoiceSummary()
|
||||
this.$confirm("您确定保存吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
@@ -665,6 +1221,12 @@ layout("/layouts/platform.html"){
|
||||
return new Promise((resolve) => {
|
||||
this.$refs.formRef.validate((valid) => {
|
||||
if (valid) {
|
||||
if (!this.validateInvoiceDetailsBeforeSubmit()) {
|
||||
this.$set(this, "activeTabName", "invoice")
|
||||
resolve(false)
|
||||
return
|
||||
}
|
||||
this.rebuildInvoiceSummary()
|
||||
resolve(true)
|
||||
} else {
|
||||
this.$message.warning("请完善必填信息")
|
||||
@@ -842,14 +1404,15 @@ layout("/layouts/platform.html"){
|
||||
if (this.bizId) {
|
||||
this.$axios.post("/platform/unionReimburse/apply/info", {id: this.bizId}).then(async (res) => {
|
||||
if (res.code === 0) {
|
||||
this.formData = res.data
|
||||
this.formData = this.ensureFormData(res.data)
|
||||
await this.selectQueryUser(this.formData.certifierLoginName, this.userOptions)
|
||||
this.rebuildInvoiceSummary()
|
||||
// this.chooseType = this.typeOptions.find(o => o.id === this.formData.type)
|
||||
}
|
||||
})
|
||||
} else {
|
||||
const {username, loginname, id, unit, union, mobile} = this.$store.state.user
|
||||
this.formData = {
|
||||
this.formData = this.ensureFormData({
|
||||
userName: username,
|
||||
loginName: loginname,
|
||||
unitId: unit?.id,
|
||||
@@ -861,7 +1424,7 @@ layout("/layouts/platform.html"){
|
||||
paymentWay: 'UNION_REIMBURSE_PAYMENT_WAY_2',
|
||||
mobile: mobile,
|
||||
userId: id,
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
+16
-11
@@ -12,7 +12,7 @@ layout("/layouts/platform.html"){
|
||||
<search-item label="姓名/工号">
|
||||
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"></el-input>
|
||||
</search-item>
|
||||
<search-item label="所属工会">
|
||||
<search-item label="所属工会" v-if="isAdmin">
|
||||
<el-select v-model="pageForm.unionId" @change="doSearch" style="width: 100%"
|
||||
placeholder="请选择所属工会" clearable>
|
||||
<el-option v-for="item in unionOptions"
|
||||
@@ -22,7 +22,7 @@ layout("/layouts/platform.html"){
|
||||
></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="所属单位">
|
||||
<search-item label="所属单位" v-if="isAdmin">
|
||||
<el-select v-model="pageForm.unitId" @change="doSearch" style="width: 100%"
|
||||
placeholder="请选择所属单位" clearable>
|
||||
<el-option v-for="item in unitOptions"
|
||||
@@ -53,10 +53,10 @@ layout("/layouts/platform.html"){
|
||||
</table-tool>
|
||||
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
|
||||
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
|
||||
<el-table-column prop="loginName" label="经办人工号"></el-table-column>
|
||||
<el-table-column prop="loginName" label="经办人工号" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="userName" label="姓名"></el-table-column>
|
||||
<el-table-column prop="unionName" label="所属工会"></el-table-column>
|
||||
<el-table-column prop="unitName" label="所属单位"></el-table-column>
|
||||
<el-table-column prop="unionName" label="所属工会" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="unitName" label="所属单位" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="certifierUserName" label="证明人">
|
||||
<template slot-scope="{row}">
|
||||
{{row.certifierUserName}}({{row.certifierLoginName}})
|
||||
@@ -69,7 +69,7 @@ layout("/layouts/platform.html"){
|
||||
</dict-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="reimburseProject" label="报销项目">
|
||||
<el-table-column prop="reimburseProject" label="报销项目" sortable="custom">
|
||||
<template slot-scope="{row}">
|
||||
<dict-tag :options="dict.type.UNION_REIMBURSE_PROJECT"
|
||||
:value="row.reimburseProject">
|
||||
@@ -77,7 +77,7 @@ layout("/layouts/platform.html"){
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="money" label="金额"></el-table-column>
|
||||
<el-table-column prop="createTime" label="申请时间"></el-table-column>
|
||||
<el-table-column prop="createTime" label="申请时间" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="curTaskName" label="当前节点"></el-table-column>
|
||||
<el-table-column prop="instanceState" label="流程状态">
|
||||
<template slot-scope="{row}">
|
||||
@@ -151,6 +151,11 @@ layout("/layouts/platform.html"){
|
||||
}
|
||||
}
|
||||
,
|
||||
computed: {
|
||||
isAdmin() {
|
||||
return this.$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN'])
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onView(row) {
|
||||
this.$refs.guava.edit(() => {
|
||||
@@ -214,10 +219,10 @@ layout("/layouts/platform.html"){
|
||||
},
|
||||
created() {
|
||||
this.pageData()
|
||||
//工会查询
|
||||
this.$businessTool.listUnion().then((res) => (this.unionOptions = res))
|
||||
//单位查询
|
||||
this.$businessTool.listUnit().then((res) => (this.unitOptions = res))
|
||||
if (this.isAdmin) {
|
||||
this.$businessTool.listUnion().then((res) => (this.unionOptions = res))
|
||||
this.$businessTool.listUnit().then((res) => (this.unitOptions = res))
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
+33
-26
@@ -12,7 +12,7 @@ layout("/layouts/platform.html"){
|
||||
<search-item label="姓名/工号">
|
||||
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"></el-input>
|
||||
</search-item>
|
||||
<search-item label="所属工会">
|
||||
<search-item label="所属工会" v-if="isAdmin">
|
||||
<el-select v-model="pageForm.unionId" @change="doSearch" style="width: 100%"
|
||||
placeholder="请选择所属工会" clearable>
|
||||
<el-option v-for="item in unionOptions"
|
||||
@@ -22,7 +22,7 @@ layout("/layouts/platform.html"){
|
||||
></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="所属单位">
|
||||
<search-item label="所属单位" v-if="isAdmin">
|
||||
<el-select v-model="pageForm.unitId" @change="doSearch" style="width: 100%"
|
||||
placeholder="请选择所属单位" clearable>
|
||||
<el-option v-for="item in unitOptions"
|
||||
@@ -51,12 +51,12 @@ layout("/layouts/platform.html"){
|
||||
</table-tool>
|
||||
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
|
||||
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
|
||||
<el-table-column prop="loginName" label="经办人工号"></el-table-column>
|
||||
<el-table-column prop="loginName" label="经办人工号" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="userName" label="姓名"></el-table-column>
|
||||
<el-table-column prop="unionName" label="所属工会"></el-table-column>
|
||||
<el-table-column prop="unitName" label="所属单位"></el-table-column>
|
||||
<el-table-column prop="createTime" label="申请时间"></el-table-column>
|
||||
<el-table-column prop="reimburseProject" label="报销项目">
|
||||
<el-table-column prop="unionName" label="所属工会" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="unitName" label="所属单位" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="createTime" label="申请时间" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="reimburseProject" label="报销项目" sortable="custom">
|
||||
<template slot-scope="{row}">
|
||||
<span v-if="row.reimburseProject === 'UNION_REIMBURSE_PROJECT_1'">慰问</span>
|
||||
<span v-else-if="row.reimburseProject === 'UNION_REIMBURSE_PROJECT_2'">文体活动</span>
|
||||
@@ -85,7 +85,7 @@ layout("/layouts/platform.html"){
|
||||
<el-table-column label="操作" fixed="right" width="350px">
|
||||
<template slot-scope="{row}">
|
||||
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
|
||||
<el-button @click="openEdit(row)" size="mini" type="primary">实际金额</el-button>
|
||||
<el-button v-if="isAdmin" @click="openEdit(row)" size="mini" type="primary">实际金额</el-button>
|
||||
<el-button v-if="row.stateId == 3" @click="doPrint(row)" size="mini" type="primary">打印</el-button>
|
||||
<el-button v-if="$auth.hasRole('SYSADMIN')" @click="onDelete(row.id)" size="mini" type="danger">删除</el-button>
|
||||
</template>
|
||||
@@ -144,6 +144,11 @@ layout("/layouts/platform.html"){
|
||||
}
|
||||
}
|
||||
,
|
||||
computed: {
|
||||
isAdmin() {
|
||||
return this.$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN'])
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onView(row) {
|
||||
this.$refs.guava.edit(()=>{
|
||||
@@ -174,30 +179,32 @@ layout("/layouts/platform.html"){
|
||||
|
||||
// 弹窗关闭时的处理
|
||||
handleDialogClose() {
|
||||
this.$refs.editForm.resetFields();
|
||||
if (this.$refs.editForm) {
|
||||
this.$refs.editForm.resetFields();
|
||||
}
|
||||
},
|
||||
|
||||
// 保存实际报销金额
|
||||
saveFinallyMoney() {
|
||||
this.$refs.editForm.validate(async (valid) => {
|
||||
this.$refs.editForm.validate((valid) => {
|
||||
if (valid) {
|
||||
const resp = await this.$axios.post("/platform/unionReimburse/collect/updateActuallyAmount", {
|
||||
id: this.editFormData.id,
|
||||
realMoney: this.editFormData.realMoney
|
||||
}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success('保存成功');
|
||||
this.editDialogVisible = false;
|
||||
this.$refs.editForm.resetFields();
|
||||
this.pageData();
|
||||
}
|
||||
})
|
||||
this.$axios.post("/platform/unionReimburse/collect/updateActuallyAmount", {
|
||||
id: this.editFormData.id,
|
||||
realMoney: this.editFormData.realMoney
|
||||
}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success('保存成功');
|
||||
this.editDialogVisible = false;
|
||||
this.$refs.editForm.resetFields();
|
||||
this.pageData();
|
||||
}
|
||||
})
|
||||
}
|
||||
});
|
||||
},
|
||||
exportSkr() {
|
||||
const {year = '', unionId = '', unitId = '', reimburseProject = ''} = this.pageForm
|
||||
window.open('/platform/unionReimburse/collect/exportSkr?year=' + year + "&unionId=" + unionId + '&unitId=' + unitId + "&reiItemId=" + reimburseProject)
|
||||
window.open('/platform/unionReimburse/collect/exportSkr?year=' + year + "&unionId=" + unionId + '&unitId=' + unitId + "&reimburseProject=" + reimburseProject)
|
||||
},
|
||||
doPrint(row) {
|
||||
if (row.reimburseProject != "UNION_REIMBURSE_PROJECT_1") {
|
||||
@@ -212,10 +219,10 @@ layout("/layouts/platform.html"){
|
||||
},
|
||||
created() {
|
||||
this.pageData()
|
||||
//工会查询
|
||||
this.$businessTool.listUnion().then((res) => (this.unionOptions = res))
|
||||
//单位查询
|
||||
this.$businessTool.listUnit().then((res) => (this.unitOptions = res))
|
||||
if (this.isAdmin) {
|
||||
this.$businessTool.listUnion().then((res) => (this.unionOptions = res))
|
||||
this.$businessTool.listUnit().then((res) => (this.unitOptions = res))
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
+16
-11
@@ -12,7 +12,7 @@ layout("/layouts/platform.html"){
|
||||
<search-item label="姓名/工号">
|
||||
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"></el-input>
|
||||
</search-item>
|
||||
<search-item label="所属工会">
|
||||
<search-item label="所属工会" v-if="isAdmin">
|
||||
<el-select v-model="pageForm.unionId" @change="doSearch" style="width: 100%"
|
||||
placeholder="请选择所属工会" clearable>
|
||||
<el-option v-for="item in unionOptions"
|
||||
@@ -22,7 +22,7 @@ layout("/layouts/platform.html"){
|
||||
></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="所属单位">
|
||||
<search-item label="所属单位" v-if="isAdmin">
|
||||
<el-select v-model="pageForm.unitId" @change="doSearch" style="width: 100%"
|
||||
placeholder="请选择所属单位" clearable>
|
||||
<el-option v-for="item in unitOptions"
|
||||
@@ -48,12 +48,12 @@ layout("/layouts/platform.html"){
|
||||
<table-tool></table-tool>
|
||||
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
|
||||
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
|
||||
<el-table-column prop="loginName" label="经办人工号"></el-table-column>
|
||||
<el-table-column prop="loginName" label="经办人工号" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="userName" label="姓名"></el-table-column>
|
||||
<el-table-column prop="unionName" label="所属工会"></el-table-column>
|
||||
<el-table-column prop="unitName" label="所属单位"></el-table-column>
|
||||
<el-table-column prop="createTime" label="申请时间"></el-table-column>
|
||||
<el-table-column prop="reimburseProject" label="报销项目">
|
||||
<el-table-column prop="unionName" label="所属工会" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="unitName" label="所属单位" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="createTime" label="申请时间" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="reimburseProject" label="报销项目" sortable="custom">
|
||||
<template slot-scope="{row}">
|
||||
<span v-if="row.reimburseProject === 'UNION_REIMBURSE_PROJECT_1'">慰问</span>
|
||||
<span v-else-if="row.reimburseProject === 'UNION_REIMBURSE_PROJECT_2'">文体活动</span>
|
||||
@@ -119,6 +119,11 @@ layout("/layouts/platform.html"){
|
||||
}
|
||||
}
|
||||
,
|
||||
computed: {
|
||||
isAdmin() {
|
||||
return this.$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN'])
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onView(row) {
|
||||
this.$refs.guava.view(() => {
|
||||
@@ -177,10 +182,10 @@ layout("/layouts/platform.html"){
|
||||
},
|
||||
created() {
|
||||
this.pageData()
|
||||
//工会查询
|
||||
this.$businessTool.listUnion().then((res) => (this.unionOptions = res))
|
||||
//单位查询
|
||||
this.$businessTool.listUnit().then((res) => (this.unitOptions = res))
|
||||
if (this.isAdmin) {
|
||||
this.$businessTool.listUnion().then((res) => (this.unionOptions = res))
|
||||
this.$businessTool.listUnit().then((res) => (this.unitOptions = res))
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
+27
-26
@@ -12,7 +12,7 @@ layout("/layouts/platform.html"){
|
||||
<search-item label="姓名/工号">
|
||||
<el-input placeholder="请输入姓名或工号" clearable v-model="pageForm.searchKeyword"></el-input>
|
||||
</search-item>
|
||||
<search-item label="所属工会">
|
||||
<search-item label="所属工会" v-if="isAdmin">
|
||||
<el-select v-model="pageForm.unionId" @change="doSearch" style="width: 100%"
|
||||
placeholder="请选择所属工会" clearable>
|
||||
<el-option v-for="item in unionOptions"
|
||||
@@ -22,7 +22,7 @@ layout("/layouts/platform.html"){
|
||||
></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="所属单位">
|
||||
<search-item label="所属单位" v-if="isAdmin">
|
||||
<el-select v-model="pageForm.unitId" @change="doSearch" style="width: 100%"
|
||||
placeholder="请选择所属单位" clearable>
|
||||
<el-option v-for="item in unitOptions"
|
||||
@@ -46,7 +46,7 @@ layout("/layouts/platform.html"){
|
||||
</el-card>
|
||||
<el-card shadow="never">
|
||||
<table-tool>
|
||||
<el-button @click="AllReview" size="medium" type="primary">一键审核</el-button>
|
||||
<el-button @click="AllReview" size="small" type="primary">一键审核</el-button>
|
||||
<el-radio-group v-model="pageForm.approval" size="small" @change="doSearch">
|
||||
<el-radio-button :label="true">已审核</el-radio-button>
|
||||
<el-radio-button :label="false">未审核</el-radio-button>
|
||||
@@ -54,12 +54,12 @@ layout("/layouts/platform.html"){
|
||||
</table-tool>
|
||||
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
|
||||
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
|
||||
<el-table-column prop="loginName" label="经办人工号"></el-table-column>
|
||||
<el-table-column prop="loginName" label="经办人工号" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="userName" label="姓名"></el-table-column>
|
||||
<el-table-column prop="unionName" label="所属工会"></el-table-column>
|
||||
<el-table-column prop="unitName" label="所属单位"></el-table-column>
|
||||
<el-table-column prop="createTime" label="申请时间"></el-table-column>
|
||||
<el-table-column prop="reimburseProject" label="报销项目">
|
||||
<el-table-column prop="unionName" label="所属工会" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="unitName" label="所属单位" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="createTime" label="申请时间" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="reimburseProject" label="报销项目" sortable="custom">
|
||||
<template slot-scope="{row}">
|
||||
<span v-if="row.reimburseProject === 'UNION_REIMBURSE_PROJECT_1'">慰问</span>
|
||||
<span v-else-if="row.reimburseProject === 'UNION_REIMBURSE_PROJECT_2'">文体活动</span>
|
||||
@@ -70,8 +70,9 @@ layout("/layouts/platform.html"){
|
||||
</el-table-column>
|
||||
<el-table-column label="备注">
|
||||
<template slot-scope="{row}">
|
||||
<span v-if="row.reimburseProject === 'UNION_REIMBURSE_PROJECT_1'">
|
||||
被慰问人:{{ row.condolenceUserName }}</span>
|
||||
<span v-if="row.reimburseProject === 'UNION_REIMBURSE_PROJECT_1'">
|
||||
被慰问人:{{ row.condolenceUserName }}
|
||||
</span>
|
||||
<span v-else>活动名称:{{ row.activityName }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -88,8 +89,7 @@ layout("/layouts/platform.html"){
|
||||
<el-table-column label="操作" fixed="right" width="300px">
|
||||
<template slot-scope="{row}">
|
||||
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
|
||||
<el-button v-if="row.stateId == 2" @click="openAudit(row)" size="mini" type="primary">审核
|
||||
</el-button>
|
||||
<el-button v-if="row.stateId == 2" @click="openAudit(row)" size="mini" type="primary">审核</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@@ -125,14 +125,13 @@ layout("/layouts/platform.html"){
|
||||
</guava>
|
||||
</div>
|
||||
|
||||
|
||||
<script nonce="${cspNonce!}">
|
||||
<!--#include('../info.js'){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
dicts: ["UNION_REIMBURSE_TYPE", "UNION_REIMBURSE_PROJECT"],
|
||||
//分页数据
|
||||
// 分页数据
|
||||
mixins: [initTableMixins],
|
||||
components: {
|
||||
"union-reimburse-info": unionReimburseInfo
|
||||
@@ -148,8 +147,12 @@ layout("/layouts/platform.html"){
|
||||
unionOptions: [],
|
||||
unitOptions: []
|
||||
}
|
||||
}
|
||||
,
|
||||
},
|
||||
computed: {
|
||||
isAdmin() {
|
||||
return this.$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN'])
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onView(row) {
|
||||
this.$refs.guava.edit(() => {
|
||||
@@ -159,7 +162,7 @@ layout("/layouts/platform.html"){
|
||||
},
|
||||
|
||||
AllReview() {
|
||||
this.$confirm('确定所有申请都通过线下审核了吗?', '提示', {
|
||||
this.$confirm('确定所选申请都已通过线下审核了吗?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
@@ -168,9 +171,9 @@ layout("/layouts/platform.html"){
|
||||
if (resp && resp.code === 0) {
|
||||
this.pageForm.approval = true
|
||||
this.pageData();
|
||||
this.$message.success(resp.msg || '一键审核成功');
|
||||
this.$message.success(resp.msg || '一键审核成功')
|
||||
} else {
|
||||
this.$message.error(resp.msg || '一键审核失败');
|
||||
this.$message.error(resp.msg || '一键审核失败')
|
||||
}
|
||||
}).catch(() => {
|
||||
// 用户取消操作
|
||||
@@ -209,16 +212,14 @@ layout("/layouts/platform.html"){
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.pageData()
|
||||
//工会查询
|
||||
this.$businessTool.listUnion().then((res) => (this.unionOptions = res))
|
||||
//单位查询
|
||||
this.$businessTool.listUnit().then((res) => (this.unitOptions = res))
|
||||
if (this.isAdmin) {
|
||||
this.$businessTool.listUnion().then((res) => (this.unionOptions = res))
|
||||
this.$businessTool.listUnit().then((res) => (this.unitOptions = res))
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
+14
-9
@@ -12,7 +12,7 @@ layout("/layouts/platform.html"){
|
||||
<search-item label="姓名/工号">
|
||||
<el-input placeholder="请输入慰问对象姓名或工号" clearable v-model="pageForm.searchKeyword"></el-input>
|
||||
</search-item>
|
||||
<search-item label="所属工会">
|
||||
<search-item label="所属工会" v-if="isAdmin">
|
||||
<el-select v-model="pageForm.unionId" @change="doSearch" style="width: 100%"
|
||||
placeholder="请选择所属工会" clearable>
|
||||
<el-option v-for="item in unionOptions"
|
||||
@@ -80,15 +80,15 @@ layout("/layouts/platform.html"){
|
||||
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="condolenceLoginName" label="被慰问人工号"></el-table-column>
|
||||
<el-table-column prop="condolenceLoginName" label="被慰问人工号" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="condolenceUserName" label="姓名"></el-table-column>
|
||||
<el-table-column prop="condolenceUnionCode" label="分工会代码"></el-table-column>
|
||||
<el-table-column prop="condolenceUnionName" label="分工会名称"></el-table-column>
|
||||
<el-table-column prop="condolenceUnionName" label="分工会名称" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="typeName" label="慰问类型"></el-table-column>
|
||||
<el-table-column prop="way" label="慰问方式"></el-table-column>
|
||||
<el-table-column prop="condolenceMoney" label="慰问金额"></el-table-column>
|
||||
<el-table-column prop="newCreateTime" label="慰问时间"></el-table-column>
|
||||
<el-table-column prop="newCondolenceTime" label="录入时间"></el-table-column>
|
||||
<el-table-column prop="newCreateTime" label="慰问时间" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="newCondolenceTime" label="录入时间" sortable="custom"></el-table-column>
|
||||
<el-table-column label="申请状态">
|
||||
<template slot-scope="{row}">
|
||||
<span v-if="row.stateId == 1" style="color: #409eff;">待提交</span>
|
||||
@@ -170,6 +170,11 @@ layout("/layouts/platform.html"){
|
||||
}
|
||||
}
|
||||
,
|
||||
computed: {
|
||||
isAdmin() {
|
||||
return this.$auth.hasRoleOr(['SYSADMIN', 'SCHOOL_UNION_ADMIN'])
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onView(row) {
|
||||
this.$refs.guava.edit(()=>{
|
||||
@@ -294,10 +299,10 @@ layout("/layouts/platform.html"){
|
||||
created() {
|
||||
this.pageData()
|
||||
this.queryCondolenceType()
|
||||
//工会查询
|
||||
this.$businessTool.listUnion().then((res) => (this.unionOptions = res))
|
||||
//单位查询
|
||||
this.$businessTool.listUnit().then((res) => (this.unitOptions = res))
|
||||
if (this.isAdmin) {
|
||||
this.$businessTool.listUnion().then((res) => (this.unionOptions = res))
|
||||
this.$businessTool.listUnit().then((res) => (this.unitOptions = res))
|
||||
}
|
||||
this.$nextTick(() => {
|
||||
setTimeout(() => {
|
||||
this.getCondolencesType()
|
||||
|
||||
+5
-1
@@ -30,7 +30,7 @@ const write = {
|
||||
|
||||
<div class="info-box" :class="{ hidden: !isSelected }">
|
||||
<div class="info-content">
|
||||
<i class="fa fa-info-circle info-icon"></i>
|
||||
<!-- <i class="fa fa-info-circle info-icon"></i>-->
|
||||
<div class="info-text">
|
||||
<h2 class="info-title" style="font-size: 18px;">推选信息</h2>
|
||||
<p class="info-desc">您已被预选为{{ sessionName }}代表</p>
|
||||
@@ -484,7 +484,11 @@ const write = {
|
||||
}
|
||||
|
||||
.header-x .header-right {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
color: #64748b;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.notice-panel {
|
||||
|
||||
+24
-39
@@ -11,7 +11,7 @@ layout("/layouts/platform_h5.html"){
|
||||
@search="doSearch"
|
||||
input-align="left"
|
||||
placeholder="请输入经办人搜索"
|
||||
v-model="pageForm.userName"
|
||||
v-model="pageForm.searchKeyword"
|
||||
></van-search>
|
||||
<van-tabs v-model="pageForm.approvalText"
|
||||
@change="(val)=>{this.pageForm.approval = val==='1';this.doSearch();}">
|
||||
@@ -39,21 +39,24 @@ layout("/layouts/platform_h5.html"){
|
||||
</dict-tag>
|
||||
</table-column>
|
||||
<table-column label="金额(元)">{{row.money}}</table-column>
|
||||
<table-column label="当前节点">{{row.curTaskName}}</table-column>
|
||||
<table-column label="申请状态">
|
||||
<span v-if="row.stateId == 1" style="color: #409eff;">待提交</span>
|
||||
<span v-else-if="row.stateId == 2" style="color: #409eff;">待审核确认</span>
|
||||
<span v-else-if="row.stateId == 3" style="color: #67c23a;">报销成功</span>
|
||||
<span v-else-if="row.stateId == 4" style="color: #f56c6c;">拒绝</span>
|
||||
<span v-else-if="row.stateId == 5" style="color: #409eff;">退回</span>
|
||||
<span v-else>{{row.stateId}}</span>
|
||||
</table-column>
|
||||
</template>
|
||||
<template #actions="{index,row}">
|
||||
<div class="action-btn" @click="onView(row)">
|
||||
<i class="fa fa-eye"></i>
|
||||
<span>查看</span>
|
||||
</div>
|
||||
<div class="action-btn" v-if="row.taskState === 10" @click="onAudit(row)">
|
||||
<div class="action-btn" v-if="row.stateId == 2" @click="onAudit(row)">
|
||||
<i class="fa fa-edit"></i>
|
||||
<span>审核</span>
|
||||
</div>
|
||||
<div class="action-btn delete" v-if="row.canRevoke" @click="onRevoke(row)">
|
||||
<i class="fa fa-undo"></i>
|
||||
<span>撤回</span>
|
||||
</div>
|
||||
</template>
|
||||
</table-list>
|
||||
|
||||
@@ -67,10 +70,10 @@ layout("/layouts/platform_h5.html"){
|
||||
<van-cell-group title="审批意见">
|
||||
<van-field label=""
|
||||
:rules="[{ required: true,message:'请填审批意见' }]"
|
||||
v-model="formData.tf_opinion"
|
||||
v-model="formData.reviewOpinion"
|
||||
required
|
||||
type="textarea"
|
||||
name="tf_opinion"
|
||||
name="reviewOpinion"
|
||||
rows="4"
|
||||
autosize
|
||||
class="more-text"
|
||||
@@ -78,17 +81,16 @@ layout("/layouts/platform_h5.html"){
|
||||
</van-cell-group>
|
||||
<van-cell-group title="电子签名" class="form-section">
|
||||
<van-field class="more-text" name="tf_userSign" label="" required
|
||||
v-model="formData.tf_opinion" :rules="[{ required: true,message:'请签名' }]">
|
||||
v-model="formData.reviewOpinion" :rules="[{ required: true,message:'请签名' }]">
|
||||
<template #input>
|
||||
<h5-signature v-model="formData.tf_userSign" slot="input"></h5-signature>
|
||||
</template>
|
||||
</van-field>
|
||||
</van-cell-group>
|
||||
<!-- 按钮区域 -->
|
||||
<div class="form-actions">
|
||||
<van-button type="danger" @click="handleTaskAction(6)">退回到发起人</van-button>
|
||||
<van-button type="danger" @click="handleTaskAction(2)">拒绝申请</van-button>
|
||||
<van-button type="primary" @click="handleTaskAction(1)">同意申请</van-button>
|
||||
<van-button type="danger" @click="handleTaskAction(5)">退回到发起人</van-button>
|
||||
<van-button type="danger" @click="handleTaskAction(4)">拒绝申请</van-button>
|
||||
<van-button type="primary" @click="handleTaskAction(3)">同意申请</van-button>
|
||||
</div>
|
||||
</van-form>
|
||||
</div>
|
||||
@@ -122,33 +124,18 @@ layout("/layouts/platform_h5.html"){
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onRevoke(row) {
|
||||
this.$dialog.confirm({
|
||||
title: "温馨提示",
|
||||
message: "您确定要撤回吗?"
|
||||
}).then(() => {
|
||||
this.$axios.post("/flow/common/revokeTask", { taskId: row.taskId }).then(res => {
|
||||
if (res.code === 0) {
|
||||
this.$toast.success("提交成功")
|
||||
this.doSearch()
|
||||
this.infoShow = false
|
||||
}
|
||||
})
|
||||
}).catch(() => {
|
||||
// on cancel
|
||||
})
|
||||
},
|
||||
handleTaskAction(val) {
|
||||
this.$refs.formRef.validate().then(() => {
|
||||
this.$dialog.confirm({
|
||||
title: "温馨提示",
|
||||
message: "您确定要提交吗?"
|
||||
}).then(() => {
|
||||
this.$axios.post("/flow/common/executeTask", {
|
||||
this.$axios.post("/platform/unionReimburse/review/reviewTask", {
|
||||
data: JSON.stringify({
|
||||
...this.formData,
|
||||
submitType: val
|
||||
})
|
||||
id: this.formData.id,
|
||||
reviewOpinion: this.formData.reviewOpinion
|
||||
}),
|
||||
submitType: val
|
||||
}).then(res => {
|
||||
if (res.code === 0) {
|
||||
this.$toast.success("提交成功")
|
||||
@@ -157,7 +144,6 @@ layout("/layouts/platform_h5.html"){
|
||||
}
|
||||
})
|
||||
}).catch(() => {
|
||||
// on cancel
|
||||
})
|
||||
}).catch()
|
||||
},
|
||||
@@ -168,10 +154,9 @@ layout("/layouts/platform_h5.html"){
|
||||
onAudit(row) {
|
||||
this.showApprovalForm = true
|
||||
this.formData = {
|
||||
tf_opinion: null,
|
||||
tf_userSign: null,
|
||||
processTaskId: row.taskId,
|
||||
taskName: row.curTaskName
|
||||
id: row.id,
|
||||
reviewOpinion: null,
|
||||
tf_userSign: null
|
||||
}
|
||||
this.$refs.unionReimburseInfoRef.onOpen(row)
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user