地大bug整改,工会报销:入住医院必填;校工会审核默认通过改成已付款成功;余额字段隐藏,只有系统管理员、校工会管理员可以看的。费用报销:隐藏分工会的经费类型

This commit is contained in:
2026-09-28 11:35:46 +08:00
parent 75740de31e
commit c3fd832496
5 changed files with 56 additions and 19 deletions
@@ -150,7 +150,7 @@ layout("/layouts/platform.html"){
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="余额" v-if="formData.reimburseFundSource"> <el-descriptions-item label="余额" v-if="formData.reimburseFundSource">
<el-form-item label="余额"> <el-form-item label="余额">
<el-input :value="fundBalanceText" readonly></el-input> <el-input :value="canViewFundBalance ? fundBalanceText : '******'" readonly></el-input>
</el-form-item> </el-form-item>
</el-descriptions-item> </el-descriptions-item>
@@ -820,6 +820,8 @@ layout("/layouts/platform.html"){
condolenceUserId: [{required: true, message: "请选择慰问对象", trigger: ["change", "blur"]}], condolenceUserId: [{required: true, message: "请选择慰问对象", trigger: ["change", "blur"]}],
condolenceTypeId: [{required: true, message: "请选择慰问类型", trigger: ["change", "blur"]}], condolenceTypeId: [{required: true, message: "请选择慰问类型", trigger: ["change", "blur"]}],
// 住院慰问显示入住医院字段时,提交和重新提交均须填写非空白医院名称。
hospital: [{required: true, whitespace: true, message: "请输入入住医院", trigger: ["change", "blur"]}],
way: [{required: true, message: "请选择慰问方式", trigger: ["change", "blur"]}], way: [{required: true, message: "请选择慰问方式", trigger: ["change", "blur"]}],
condolenceMoney: [{required: true, message: "请输入慰问金额", trigger: ["change", "blur"]}], condolenceMoney: [{required: true, message: "请输入慰问金额", trigger: ["change", "blur"]}],
participants: [{required: true, message: "请填写参与随行人员", trigger: ["change", "blur"]}], participants: [{required: true, message: "请填写参与随行人员", trigger: ["change", "blur"]}],
@@ -865,6 +867,10 @@ layout("/layouts/platform.html"){
} }
}, },
computed: { computed: {
// 仅系统管理员和校工会管理员可查看真实余额,其他账号统一显示余额遮罩。
canViewFundBalance() {
return this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])
},
showInvoiceTab() { showInvoiceTab() {
return !!this.formData.reimburseProject return !!this.formData.reimburseProject
}, },
@@ -212,7 +212,7 @@ layout("/layouts/platform.html"){
this.showApprovalForm = true this.showApprovalForm = true
this.formData = { this.formData = {
id: row.id, id: row.id,
reviewOpinion: '通过' reviewOpinion: '已付款成功'
} }
this.$refs.unionReimburseInfoRef.onOpen(row) this.$refs.unionReimburseInfoRef.onOpen(row)
}) })
@@ -473,7 +473,7 @@ layout("/layouts/platform_h5.html"){
<van-field <van-field
v-if="formData.reimburseFundSource" v-if="formData.reimburseFundSource"
label="余额" label="余额"
v-model="formData.fundBalance" :value="canViewFundBalance ? formData.fundBalance : '******'"
readonly readonly
placeholder="自动查询" placeholder="自动查询"
></van-field> ></van-field>
@@ -706,7 +706,10 @@ layout("/layouts/platform_h5.html"){
@cancel="closePopup('showHospitalizationEndTimePicker')" @cancel="closePopup('showHospitalizationEndTimePicker')"
@confirm="onDateConfirm('hospitalizationEndTime', 'showHospitalizationEndTimePicker', $event)"></van-datetime-picker> @confirm="onDateConfirm('hospitalizationEndTime', 'showHospitalizationEndTimePicker', $event)"></van-datetime-picker>
</van-popup> </van-popup>
<van-field label="入住医院" v-model="formData.hospital" placeholder="请输入入住医院"></van-field> <!-- 住院慰问提交和重新提交时,入住医院不能为空或仅包含空白字符。 -->
<van-field label="入住医院" name="hospital" v-model="formData.hospital" required
:rules="[{ required: true, message: '请输入入住医院' }, { pattern: /\S/, message: '请输入入住医院' }]"
placeholder="请输入入住医院"></van-field>
<van-field label="当年次数" v-model="formData.hospitalCount" placeholder="请填写当年次数" type="number"></van-field> <van-field label="当年次数" v-model="formData.hospitalCount" placeholder="请填写当年次数" type="number"></van-field>
</template> </template>
@@ -1248,6 +1251,10 @@ layout("/layouts/platform_h5.html"){
} }
}, },
computed: { computed: {
// 仅系统管理员和校工会管理员可查看真实余额,其他账号统一显示余额遮罩。
canViewFundBalance() {
return this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])
},
paymentInfoRows() { paymentInfoRows() {
return this.formData.paymentDetails || [] return this.formData.paymentDetails || []
}, },
@@ -2,7 +2,7 @@ const UNION_REIMBURSE_INFO = {
template: template:
/*language=HTML*/ /*language=HTML*/
` `
<van-popup v-model="visible" position="right" :style="{width: '100%', height: '100%'}" get-container="#app" :close-on-click-overlay="false" class="union-reimburse-info-sheet"> <van-popup v-model="visible" position="right" :style="{width: '100%', height: '100%'}" :get-container="false" :close-on-click-overlay="false" class="union-reimburse-info-sheet">
<div class="union-reimburse-info-detail"> <div class="union-reimburse-info-detail">
<van-nav-bar :title="detailTitle" left-text="返回" left-arrow fixed @click-left="onClose"></van-nav-bar> <van-nav-bar :title="detailTitle" left-text="返回" left-arrow fixed @click-left="onClose"></van-nav-bar>
<div class="detail-container"> <div class="detail-container">
@@ -308,6 +308,9 @@ const UNION_REIMBURSE_INFO = {
<slot></slot> <slot></slot>
</div> </div>
</div> </div>
<div v-if="$slots.footer" class="union-reimburse-info-footer">
<slot name="footer"></slot>
</div>
</div> </div>
</van-popup> </van-popup>
`, `,
@@ -336,18 +339,23 @@ const UNION_REIMBURSE_INFO = {
}, },
mounted() { mounted() {
this.injectInfoStyle() this.injectInfoStyle()
const manager = window.h5HistoryLayerManager this.subscribeHistoryLayer()
if (manager) {
manager.ensureRegistered("union-reimburse-info")
this.$set(this, "historyLayerUnsubscribe", manager.subscribe((layers) => {
this.$set(this, "visible", layers.includes(this.historyLayerName))
}))
}
}, },
beforeDestroy() { beforeDestroy() {
if (this.historyLayerUnsubscribe) this.historyLayerUnsubscribe() if (this.historyLayerUnsubscribe) this.historyLayerUnsubscribe()
}, },
methods: { methods: {
// PJAX 会重置全局历史栈订阅;每次打开前重新订阅,保证返回事件能同步关闭详情。
subscribeHistoryLayer() {
if (this.historyLayerUnsubscribe) this.historyLayerUnsubscribe()
this.$set(this, "historyLayerUnsubscribe", null)
const manager = window.h5HistoryLayerManager
if (!manager) return
manager.ensureRegistered("union-reimburse-info")
this.$set(this, "historyLayerUnsubscribe", manager.subscribe((layers) => {
this.$set(this, "visible", layers.includes(this.historyLayerName))
}))
},
injectInfoStyle() { injectInfoStyle() {
// 当前组件是普通 JS 对象注册,Vue 不会自动注入 style 字段,这里只为本详情弹窗注入一次样式。 // 当前组件是普通 JS 对象注册,Vue 不会自动注入 style 字段,这里只为本详情弹窗注入一次样式。
const styleId = "union-reimburse-info-style" const styleId = "union-reimburse-info-style"
@@ -365,6 +373,7 @@ const UNION_REIMBURSE_INFO = {
this.$set(this, "detailTitle", title || "报销详情") this.$set(this, "detailTitle", title || "报销详情")
this.$set(this, "currentPaymentIndex", 0) this.$set(this, "currentPaymentIndex", 0)
// 详情弹层的显示状态由全局历史栈统一同步,确保系统返回键与页面返回按钮关闭同一层。 // 详情弹层的显示状态由全局历史栈统一同步,确保系统返回键与页面返回按钮关闭同一层。
this.subscribeHistoryLayer()
const manager = window.h5HistoryLayerManager const manager = window.h5HistoryLayerManager
if (manager && manager.open(this.historyLayerName)) { if (manager && manager.open(this.historyLayerName)) {
this.getInfo() this.getInfo()
@@ -375,10 +384,13 @@ const UNION_REIMBURSE_INFO = {
this.getInfo() this.getInfo()
this.getDoneTasks() this.getDoneTasks()
}, },
// 只关闭当前详情对应的历史层,避免误关闭审核确认弹框等上层业务弹框。 // 详情之上存在确认框或预览时先关闭最上层;无历史层时才直接关闭详情。
onClose() { onClose() {
const manager = window.h5HistoryLayerManager const manager = window.h5HistoryLayerManager
if (manager && manager.close(this.historyLayerName)) return if (manager && manager.stack.length) {
manager.close()
return
}
this.$set(this, "visible", false) this.$set(this, "visible", false)
}, },
formatCreateTime(value) { formatCreateTime(value) {
@@ -533,12 +545,19 @@ const UNION_REIMBURSE_INFO = {
color: #1989fa; color: #1989fa;
} }
.detail-container { .union-reimburse-info-detail > .detail-container {
flex: 1; flex: 1;
min-height: 0;
overflow: hidden; overflow: hidden;
background: #f3f7fd; background: #f3f7fd;
} }
/* 审核按钮占独立底部区域,意见表单随正文滚动,避免被按钮遮挡或挤出可视区。 */
.union-reimburse-info-footer {
flex-shrink: 0;
background: #fff;
}
.union-info-scroll { .union-info-scroll {
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
@@ -44,7 +44,7 @@ layout("/layouts/platform_h5.html"){
</main> </main>
<union-reimburse-info ref="unionReimburseInfoRef" history-layer-name="union-reimburse-review-info"> <union-reimburse-info ref="unionReimburseInfoRef" history-layer-name="union-reimburse-review-info">
<template v-if="showApprovalForm"> <div v-if="showApprovalForm" class="union-reimburse-approval">
<section class="union-reimburse-approval-card"> <section class="union-reimburse-approval-card">
<h2 class="union-reimburse-approval-card__title">{{formData.taskName || '校工会审核'}}</h2> <h2 class="union-reimburse-approval-card__title">{{formData.taskName || '校工会审核'}}</h2>
<van-form ref="formRef"> <van-form ref="formRef">
@@ -52,7 +52,9 @@ layout("/layouts/platform_h5.html"){
<van-field v-model="formData.reviewOpinion" class="union-reimburse-approval-field" name="reviewOpinion" type="textarea" rows="6" label="" placeholder="请输入审批意见" :rules="[{required: true, message: '请填写审批意见'}]" maxlength="100" show-word-limit></van-field> <van-field v-model="formData.reviewOpinion" class="union-reimburse-approval-field" name="reviewOpinion" type="textarea" rows="6" label="" placeholder="请输入审批意见" :rules="[{required: true, message: '请填写审批意见'}]" maxlength="100" show-word-limit></van-field>
</van-form> </van-form>
</section> </section>
<div class="union-reimburse-approval-actions"> </div>
<template slot="footer">
<div v-if="showApprovalForm" class="union-reimburse-approval-actions">
<van-button :loading="formLoading" type="danger" block @click="handleTaskAction(5)">退回</van-button> <van-button :loading="formLoading" type="danger" block @click="handleTaskAction(5)">退回</van-button>
<van-button :loading="formLoading" type="danger" block @click="handleTaskAction(4)">不同意</van-button> <van-button :loading="formLoading" type="danger" block @click="handleTaskAction(4)">不同意</van-button>
<van-button :loading="formLoading" type="primary" block @click="handleTaskAction(3)">同意</van-button> <van-button :loading="formLoading" type="primary" block @click="handleTaskAction(3)">同意</van-button>
@@ -173,9 +175,12 @@ layout("/layouts/platform_h5.html"){
this.$set(this, "formData", { this.$set(this, "formData", {
id: row.id, id: row.id,
taskName: "校工会审核", taskName: "校工会审核",
reviewOpinion: "" reviewOpinion: "已付款成功"
})
// 先完成审批意见及插槽渲染,再打开详情,避免首次打开时表单尚未更新。
this.$nextTick(() => {
this.$refs.unionReimburseInfoRef.onOpen(row, "报销审核")
}) })
this.$refs.unionReimburseInfoRef.onOpen(row, "报销审核")
}, },
onLoadingChange(state) { this.$set(this, "listLoading", state.loading) }, onLoadingChange(state) { this.$set(this, "listLoading", state.loading) },
onNavBack() { const manager = window.h5HistoryLayerManager; if (manager && manager.stack.length) { manager.close(); return } historyBack() }, onNavBack() { const manager = window.h5HistoryLayerManager; if (manager && manager.stack.length) { manager.close(); return } historyBack() },