This commit is contained in:
2026-07-14 16:28:31 +08:00
15 changed files with 473 additions and 279 deletions
@@ -439,6 +439,11 @@ layout("/layouts/platform_h5.html"){
required
is-link
></van-field>
<van-cell v-if="getProjectTipByProject(formData.reimburseProject)">
<template #title>
<span style="color: #ee0a24; text-align: left;">报销提示:{{getProjectTipByProject(formData.reimburseProject)}}</span>
</template>
</van-cell>
<van-popup position="bottom" round v-model:show="showReimburseProjectPicker">
<van-picker :columns="reimburseProjectColumns" @cancel="closePopup('showReimburseProjectPicker')"
@confirm="onReimburseProjectConfirm" show-toolbar></van-picker>
@@ -528,120 +533,6 @@ layout("/layouts/platform_h5.html"){
-->
</van-cell-group>
<van-cell-group class="form-section">
<div class="payment-section">
<div class="payment-toolbar">
<span>支付信息</span>
<van-button native-type="button" size="small" type="primary" icon="plus" @click="addPaymentInfo">新增</van-button>
</div>
<div class="invoice-tip" v-if="!paymentInfoRows.length">请至少维护一条支付信息。</div>
<van-swipe
ref="paymentSwipe"
class="payment-swipe"
:loop="false"
:show-indicators="false"
@change="handlePaymentSwipeChange"
v-if="paymentInfoRows.length">
<van-swipe-item v-for="(item, index) in paymentInfoRows" :key="index">
<div class="payment-detail-item">
<div class="payment-detail-title">
<div class="payment-title-left">
<span>支付信息{{index + 1}}</span>
<span class="payment-index-text">{{index + 1}} / {{paymentInfoRows.length}}</span>
</div>
<van-tag v-if="item.paymentWayName" type="primary">{{item.paymentWayName}}</van-tag>
</div>
<van-field
v-model="item.paymentWayName"
label="支付方式"
readonly
placeholder="请选择支付方式"
@click="openPaymentWayPicker(item, index)"
clickable
required
is-link
></van-field>
<van-field
label="金额"
v-model="item.money"
placeholder="请输入金额"
type="number"
required
></van-field>
<template v-if="isPrivatePayment(item)">
<van-field
v-model="item.payerName"
label="付款人"
readonly
placeholder="请选择付款人"
@click="openPayerSelect(item, index)"
clickable
required
is-link
></van-field>
<van-field
label="户名"
v-model="item.bankUserName"
placeholder="请输入户名"
required
></van-field>
<van-field
label="开户行"
v-model="item.bankOfDeposit"
placeholder="请输入开户行"
required
></van-field>
<van-field
label="银行卡号"
v-model="item.bankCardNumber"
placeholder="请输入银行卡号"
required
></van-field>
</template>
<div class="payment-detail-actions">
<div class="payment-nav-buttons">
<span class="payment-nav-btn" :class="{active: currentPaymentIndex > 0}" @click="showPrevPayment">
<van-icon name="arrow-left"></van-icon>
</span>
<span class="payment-nav-btn" :class="{active: currentPaymentIndex < paymentInfoRows.length - 1}" @click="showNextPayment">
<van-icon name="arrow"></van-icon>
</span>
</div>
<van-button class="payment-delete-btn" native-type="button" size="small" plain type="danger" icon="delete-o" @click="deletePaymentInfo(index)">删除</van-button>
</div>
</div>
</van-swipe-item>
</van-swipe>
<div class="payment-dots" v-if="paymentInfoRows.length > 1">
<span class="payment-dot" :class="{active: index === currentPaymentIndex}" v-for="(item, index) in paymentInfoRows"></span>
</div>
</div>
<van-popup position="bottom" round v-model:show="showPaymentWayPicker">
<van-picker :columns="paymentWayColumns" @cancel="closePopup('showPaymentWayPicker')"
@confirm="onPaymentWayConfirm" show-toolbar></van-picker>
</van-popup>
<van-action-sheet v-model="payerSelectShow" title="付款人" class="height100">
<van-search
v-model="payerSearchKeyword"
:show-action="false"
:reverse-color="false"
input-align="left"
placeholder="请输入工号或姓名选择付款人"
@input="payerRemoteMethod"
@clear="payerRemoteMethod"
shape="round"
></van-search>
<div class="van-action-sheet__content mt5" v-if="payerOptions && payerOptions.length>0">
<template v-for="item in payerOptions">
<van-button native-type="button" @click="payerUserChange(item)"
class="van-action-sheet__item van-hairline--bottom">
<span class="van-action-sheet__name">{{item.userName}}({{item.loginName}})</span>
</van-button>
</template>
</div>
<van-empty description="暂无数据" v-else></van-empty>
</van-action-sheet>
</van-cell-group>
<van-cell-group :title="formData.reimburseProject === 'UNION_REIMBURSE_PROJECT_1' ? '慰问信息' : '活动信息'" class="form-section">
<template v-if="formData.reimburseProject === 'UNION_REIMBURSE_PROJECT_1'">
@@ -921,6 +812,120 @@ layout("/layouts/platform_h5.html"){
</template>
</van-field>
</van-cell-group>
<van-cell-group class="form-section">
<div class="payment-section">
<div class="payment-toolbar">
<span>支付信息</span>
<van-button native-type="button" size="small" type="primary" icon="plus" @click="addPaymentInfo">新增</van-button>
</div>
<div class="invoice-tip" v-if="!paymentInfoRows.length">请至少维护一条支付信息。</div>
<van-swipe
ref="paymentSwipe"
class="payment-swipe"
:loop="false"
:show-indicators="false"
@change="handlePaymentSwipeChange"
v-if="paymentInfoRows.length">
<van-swipe-item v-for="(item, index) in paymentInfoRows" :key="index">
<div class="payment-detail-item">
<div class="payment-detail-title">
<div class="payment-title-left">
<span>支付信息{{index + 1}}</span>
<span class="payment-index-text">{{index + 1}} / {{paymentInfoRows.length}}</span>
</div>
<van-tag v-if="item.paymentWayName" type="primary">{{item.paymentWayName}}</van-tag>
</div>
<van-field
v-model="item.paymentWayName"
label="支付方式"
readonly
placeholder="请选择支付方式"
@click="openPaymentWayPicker(item, index)"
clickable
required
is-link
></van-field>
<van-field
label="金额"
v-model="item.money"
placeholder="请输入金额"
type="number"
required
></van-field>
<template v-if="isPrivatePayment(item)">
<van-field
v-model="item.payerName"
label="付款人"
readonly
placeholder="请选择付款人"
@click="openPayerSelect(item, index)"
clickable
required
is-link
></van-field>
<van-field
label="户名"
v-model="item.bankUserName"
placeholder="请输入户名"
required
></van-field>
<van-field
label="开户行"
v-model="item.bankOfDeposit"
placeholder="请输入开户行"
required
></van-field>
<van-field
label="银行卡号"
v-model="item.bankCardNumber"
placeholder="请输入银行卡号"
required
></van-field>
</template>
<div class="payment-detail-actions">
<div class="payment-nav-buttons">
<span class="payment-nav-btn" :class="{active: currentPaymentIndex > 0}" @click="showPrevPayment">
<van-icon name="arrow-left"></van-icon>
</span>
<span class="payment-nav-btn" :class="{active: currentPaymentIndex < paymentInfoRows.length - 1}" @click="showNextPayment">
<van-icon name="arrow"></van-icon>
</span>
</div>
<van-button class="payment-delete-btn" native-type="button" size="small" plain type="danger" icon="delete-o" @click="deletePaymentInfo(index)">删除</van-button>
</div>
</div>
</van-swipe-item>
</van-swipe>
<div class="payment-dots" v-if="paymentInfoRows.length > 1">
<span class="payment-dot" :class="{active: index === currentPaymentIndex}" v-for="(item, index) in paymentInfoRows"></span>
</div>
</div>
<van-popup position="bottom" round v-model:show="showPaymentWayPicker">
<van-picker :columns="paymentWayColumns" @cancel="closePopup('showPaymentWayPicker')"
@confirm="onPaymentWayConfirm" show-toolbar></van-picker>
</van-popup>
<van-action-sheet v-model="payerSelectShow" title="付款人" class="height100">
<van-search
v-model="payerSearchKeyword"
:show-action="false"
:reverse-color="false"
input-align="left"
placeholder="请输入工号或姓名选择付款人"
@input="payerRemoteMethod"
@clear="payerRemoteMethod"
shape="round"
></van-search>
<div class="van-action-sheet__content mt5" v-if="payerOptions && payerOptions.length>0">
<template v-for="item in payerOptions">
<van-button native-type="button" @click="payerUserChange(item)"
class="van-action-sheet__item van-hairline--bottom">
<span class="van-action-sheet__name">{{item.userName}}({{item.loginName}})</span>
</van-button>
</template>
</div>
<van-empty description="暂无数据" v-else></van-empty>
</van-action-sheet>
</van-cell-group>
<van-cell-group title="电子发票" class="form-section" v-if="formData.reimburseProject">
<van-field label="报销金额"
v-model="formData.money"
@@ -1186,6 +1191,7 @@ layout("/layouts/platform_h5.html"){
clubOptions: [],
condolenceOptions: [],
typeOptions: [],
descOptions: [],
// 添加报销项目原始数据列表
reimburseProjectList: [],
// 添加日期选择器相关变量
@@ -2025,7 +2031,7 @@ layout("/layouts/platform_h5.html"){
}
this.$dialog.confirm({
title: "温馨提示",
message: "您确定要提交吗?"
message: "您确定要提交吗?审核通过后可前往pc端我的报销打印!"
}).then(() => {
this.$axios.post("/platform/unionReimburse/apply/submit", { data: JSON.stringify(this.buildSubmitFormData(paymentDetails)) })
.then(res => {
@@ -2064,7 +2070,7 @@ layout("/layouts/platform_h5.html"){
}
this.$dialog.confirm({
title: "温馨提示",
message: "您确定要提交吗?"
message: "您确定要提交吗?审核通过后可前往pc端我的报销打印!"
}).then(() => {
this.$axios.post("/platform/unionReimburse/apply/submitAgain", {
data: JSON.stringify(this.buildSubmitFormData(paymentDetails)),
@@ -2195,6 +2201,23 @@ layout("/layouts/platform_h5.html"){
const matchedFundSource = this.reimburseFundSourceColumns.find(item => item.value === code)
return matchedFundSource ? matchedFundSource.text : ""
},
// 查询管理端配置的报销项目提示。
queryProjectDesc() {
return this.$axios.post("/platform/unionReimburse/desc/queryFileDesc")
.then((resp) => {
if (resp.code === 0) {
this.$set(this, "descOptions", resp.data || [])
}
})
},
// 根据当前选择的报销项目获取管理端配置的提示内容。
getProjectTipByProject(projectCode) {
if (!this.descOptions || !Array.isArray(this.descOptions)) {
return ""
}
const project = this.descOptions.find(item => item.reimburseProject === projectCode)
return project ? project.projectTip : ""
},
async initDictOptions() {
// 报销类别
const reimburseTypeData = await this.$businessTool.getDictOptions("UNION_REIMBURSE_TYPE")
@@ -2558,6 +2581,7 @@ layout("/layouts/platform_h5.html"){
async created() {
await this.initDictOptions()
await this.queryProjectDesc()
await this.queryCondolenceType()
await this.queryClubs()
await this.init()