feat: 优化福利

This commit is contained in:
2026-11-03 20:20:59 +08:00
parent 7faa2730b5
commit 39ee74f0a9
12 changed files with 286 additions and 32 deletions
@@ -17,6 +17,9 @@ layout("/layouts/platform.html"){
value-format="yyyy" value-format="yyyy"
></el-date-picker> ></el-date-picker>
</search-item> </search-item>
<template #actions>
<el-button @click="resetSearch">重置</el-button>
</template>
</search> </search>
</el-card> </el-card>
@@ -115,6 +118,10 @@ layout("/layouts/platform.html"){
"select-view": selectView "select-view": selectView
}, },
methods: { methods: {
resetSearch() {
this.pageForm.year = moment().format("YYYY")
this.doSearch()
},
async openView(row) { async openView(row) {
this.$refs.selectViewRef.onOpen(row.id) this.$refs.selectViewRef.onOpen(row.id)
} }
@@ -117,6 +117,9 @@ const filterUser = {
<el-option label="否" :value="false"></el-option> <el-option label="否" :value="false"></el-option>
</el-select> </el-select>
</search-item> </search-item>
<template #actions>
<el-button @click="resetSearch">重置</el-button>
</template>
</search> </search>
</el-card> </el-card>
@@ -200,6 +203,11 @@ const filterUser = {
this.pageData() this.pageData()
}, },
resetSearch() {
this.resetPageForm()
this.doSearch()
},
resetPageForm() { resetPageForm() {
this.$set(this.pageForm, "userName", null) this.$set(this.pageForm, "userName", null)
this.$set(this.pageForm, "loginName", null) this.$set(this.pageForm, "loginName", null)
@@ -21,6 +21,9 @@ layout("/layouts/platform.html"){
<search-item label="项目名称"> <search-item label="项目名称">
<el-input clearable placeholder="请输入项目名称" v-model="pageForm.name"></el-input> <el-input clearable placeholder="请输入项目名称" v-model="pageForm.name"></el-input>
</search-item> </search-item>
<template #actions>
<el-button @click="resetSearch">重置</el-button>
</template>
</search> </search>
</el-card> </el-card>
@@ -294,6 +297,11 @@ layout("/layouts/platform.html"){
} }
}, },
methods: { methods: {
resetSearch() {
this.pageForm.year = moment().format("YYYY")
this.$set(this.pageForm, "name", null)
this.doSearch()
},
dropdownCommand(command) { dropdownCommand(command) {
const { type, data } = command const { type, data } = command
if (type === "edit") { if (type === "edit") {
@@ -22,6 +22,7 @@ layout("/layouts/platform.html"){
</div> </div>
<div class="search-query"> <div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button> <el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
<el-button @click="resetSearch">重置</el-button>
</div> </div>
</div> </div>
</el-card> </el-card>
@@ -120,6 +121,10 @@ layout("/layouts/platform.html"){
"option-select": optionSelect "option-select": optionSelect
}, },
methods: { methods: {
resetSearch() {
this.$set(this.pageForm, "year", null)
this.doSearch()
},
go_back() { go_back() {
this.doSearch() this.doSearch()
this.$refs.guava.index() this.$refs.guava.index()
@@ -34,7 +34,7 @@ const optionSelect = {
</div> </div>
<div class="info-item"> <div class="info-item">
<div class="info-label">节日信息</div> <div class="info-label">节日信息</div>
<div class="info-value">{{ projectInfo.festival }} · {{ projectInfo.year }}年</div> <div class="info-value"><!--{{ projectInfo.festival }} · -->{{ projectInfo.year }}年</div>
</div> </div>
<div class="info-item"> <div class="info-item">
<div class="info-label">选择时间</div> <div class="info-label">选择时间</div>
@@ -48,10 +48,12 @@ const optionSelect = {
projectInfo.provideTimeEnd) }} projectInfo.provideTimeEnd) }}
</div> </div>
</div> </div>
<!--
<div class="info-item"> <div class="info-item">
<div class="info-label">发放地点</div> <div class="info-label">发放地点</div>
<div class="info-value">{{ projectInfo.provideAddress }}</div> <div class="info-value">{{ projectInfo.provideAddress }}</div>
</div> </div>
-->
</div> </div>
</el-card> </el-card>
@@ -143,8 +145,15 @@ const optionSelect = {
<div class="confirm-mobile-section"> <div class="confirm-mobile-section">
<div class="confirm-section-title">联系信息</div> <div class="confirm-section-title">联系信息</div>
<el-form :model="contactForm" ref="contactForm" :rules="contactRules" label-width="80px"> <el-form :model="contactForm" ref="contactForm" :rules="contactRules" label-width="80px">
<el-form-item label="领取方式" v-if="projectInfo.provideMode === 3">
<el-radio-group v-model="deliveryMethod">
<el-radio-button label="pickup">学校自提</el-radio-button>
<el-radio-button label="mail">邮寄</el-radio-button>
</el-radio-group>
<div style="margin-top: 8px; padding: 8px 12px; border-radius: 6px; line-height: 1.5; background: #fff3e8; color: #9c451c">超出江浙沪不包邮,超出部分自理,具体金额联系供应商。</div>
</el-form-item>
<el-row :gutter="10"> <el-row :gutter="10">
<el-col :span="20" v-if="projectInfo.provideMode == 3"> <el-col :span="20" v-if="projectInfo.provideMode === 3 && deliveryMethod === 'mail'">
<el-form-item prop="receiveAddress" <el-form-item prop="receiveAddress"
label="收货地址" label="收货地址"
:rules="[{ required: true, message: '请选择收货地址', trigger: 'change' }]"> :rules="[{ required: true, message: '请选择收货地址', trigger: 'change' }]">
@@ -158,10 +167,10 @@ const optionSelect = {
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="4" v-if="projectInfo.provideMode == 3"> <el-col :span="4" v-if="projectInfo.provideMode === 3 && deliveryMethod === 'mail'">
<el-button @click="openAddress" type="primary" size="small">添加地址</el-button> <el-button @click="openAddress" type="primary" size="small">添加地址</el-button>
</el-col> </el-col>
<el-col :span="24" v-if="projectInfo.provideMode == 3"> <el-col :span="24" v-if="projectInfo.provideMode === 3 && deliveryMethod === 'mail'">
<el-form-item prop="userName" label="收货人"> <el-form-item prop="userName" label="收货人">
<el-input <el-input
v-model="contactForm.userName" v-model="contactForm.userName"
@@ -170,7 +179,7 @@ const optionSelect = {
</el-input> </el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24" v-if="projectInfo.provideMode !== 3 || deliveryMethod === 'mail'">
<el-form-item prop="mobile" label="联系电话"> <el-form-item prop="mobile" label="联系电话">
<el-input <el-input
v-model="contactForm.mobile" v-model="contactForm.mobile"
@@ -258,6 +267,7 @@ const optionSelect = {
userSelection: [], // 用户选择的选项 userSelection: [], // 用户选择的选项
selectedRadioId: "", // 单选模式下选中的选项ID selectedRadioId: "", // 单选模式下选中的选项ID
showConfirmDialog: false, // 确认弹窗 showConfirmDialog: false, // 确认弹窗
deliveryMethod: "",
isSubmitting: false, // 是否正在提交 isSubmitting: false, // 是否正在提交
hasSubmittedBefore: false, // 是否之前提交过 hasSubmittedBefore: false, // 是否之前提交过
deadlineTime: null, // 选择截止时间 deadlineTime: null, // 选择截止时间
@@ -410,6 +420,7 @@ const optionSelect = {
this.projectId = projectId this.projectId = projectId
this.userId = userId this.userId = userId
this.deliveryMethod = ""
this.selectedRadioId = null this.selectedRadioId = null
this.contactForm = { this.contactForm = {
mobile: "", mobile: "",
@@ -485,7 +496,9 @@ const optionSelect = {
// 地址回显 // 地址回显
if (this.projectInfo.provideMode === 3) { if (this.projectInfo.provideMode === 3) {
if (this.userSelection.length > 0 && this.userSelection[0].receiveAddress) { if (this.userSelection.length > 0 && this.userSelection[0].receiveAddress) {
this.contactForm.receiveAddress = this.userSelection[0].receiveAddress const receiveAddress = this.userSelection[0].receiveAddress
this.deliveryMethod = receiveAddress === "学校自提" ? "pickup" : "mail"
this.contactForm.receiveAddress = this.deliveryMethod === "mail" ? receiveAddress : ""
// this.contactForm.userName = this.userSelection[0].userName; // this.contactForm.userName = this.userSelection[0].userName;
// this.contactForm.mobile = this.userSelection[0].mobile; // this.contactForm.mobile = this.userSelection[0].mobile;
this.$set(this.contactForm, "userName", this.userSelection[0].userName) this.$set(this.contactForm, "userName", this.userSelection[0].userName)
@@ -526,6 +539,10 @@ const optionSelect = {
// 执行提交 // 执行提交
doSubmit() { doSubmit() {
if (this.projectInfo.provideMode === 3 && !this.deliveryMethod) {
this.$message.warning("请选择领取方式")
return
}
// 验证手机号 // 验证手机号
this.$refs.contactForm.validate((valid) => { this.$refs.contactForm.validate((valid) => {
if (!valid) { if (!valid) {
@@ -547,7 +564,7 @@ const optionSelect = {
mobile: this.contactForm.mobile, mobile: this.contactForm.mobile,
userName: this.contactForm.userName, userName: this.contactForm.userName,
userSign: this.contactForm.userSign, userSign: this.contactForm.userSign,
receiveAddress: this.contactForm.receiveAddress receiveAddress: this.deliveryMethod === "pickup" ? "学校自提" : this.contactForm.receiveAddress
} }
] ]
} }
@@ -560,7 +577,7 @@ const optionSelect = {
mobile: this.contactForm.mobile, mobile: this.contactForm.mobile,
userName: this.contactForm.userName, userName: this.contactForm.userName,
userSign: this.contactForm.userSign, userSign: this.contactForm.userSign,
receiveAddress: this.contactForm.receiveAddress receiveAddress: this.deliveryMethod === "pickup" ? "学校自提" : this.contactForm.receiveAddress
})) }))
} }
@@ -69,6 +69,9 @@ layout("/layouts/platform.html"){
<dict-select v-model="pageForm.userAttribute" placeholder="请选择人员属性" @change="doSearch" <dict-select v-model="pageForm.userAttribute" placeholder="请选择人员属性" @change="doSearch"
code="USER_ATTRIBUTE"></dict-select> code="USER_ATTRIBUTE"></dict-select>
</search-item> </search-item>
<template #actions>
<el-button @click="resetSearch">重置</el-button>
</template>
</search> </search>
</el-card> </el-card>
@@ -173,6 +176,18 @@ layout("/layouts/platform.html"){
} }
}, },
methods: { methods: {
resetSearch() {
this.pageForm.year = new Date().getFullYear().toString()
this.$set(this.pageForm, "welfareOptionId", null)
this.$set(this.pageForm, "userName", null)
this.$set(this.pageForm, "loginName", null)
this.$set(this.pageForm, "unionId", null)
this.$set(this.pageForm, "aidFundMemberUserType", null)
this.$set(this.pageForm, "userAttribute", null)
this.$set(this.pageForm, "isSelect", null)
this.$set(this.pageForm, "unitIds", [])
this.getWelfareList()
},
// 获取福利列表 // 获取福利列表
getWelfareList() { getWelfareList() {
this.$axios.post("/platform/welfare/common/list", { year: this.pageForm.year }).then((res) => { this.$axios.post("/platform/welfare/common/list", { year: this.pageForm.year }).then((res) => {
@@ -28,6 +28,9 @@ layout("/layouts/platform.html"){
<el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unionOptions"></el-option> <el-option :key="item.id" :label="item.name" :value="item.id" v-for="item in unionOptions"></el-option>
</el-select> </el-select>
</search-item> </search-item>
<template #actions>
<el-button @click="resetSearch">重置</el-button>
</template>
</search> </search>
</el-card> </el-card>
@@ -110,6 +113,13 @@ layout("/layouts/platform.html"){
} }
}, },
methods: { methods: {
resetSearch() {
this.pageForm.year = new Date().getFullYear().toString()
const isBranchChairman = !this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN", "SCHOOL_UNION_WELFARE_ADMIN"]) &&
this.$auth.hasRoleOr(["BRANCH_UNION_CHAIRMAN"])
this.$set(this.pageForm, "unionId", isBranchChairman ? this.$store.state.user.union.id : null)
this.getWelfareProjectList()
},
remindUnSelectedPlaceholder() { remindUnSelectedPlaceholder() {
this.$message.info("提醒未选择人员功能待开发") this.$message.info("提醒未选择人员功能待开发")
}, },
@@ -112,7 +112,15 @@ let CHOOSE_WELFARE = {
</el-row> </el-row>
</el-form-item> </el-form-item>
<template v-if="projectInfo.provideMode===3"> <div v-if="projectInfo.provideMode === 3 && !is_view" style="padding: 8px 16px">
<div>领取方式</div>
<el-radio-group v-model="deliveryMethod">
<el-radio-button label="pickup">学校自提</el-radio-button>
<el-radio-button label="mail">邮寄</el-radio-button>
</el-radio-group>
<div style="margin-top: 8px; padding: 8px; background: #fff3e8; color: #9c451c">超出江浙沪不包邮,超出部分自理,具体金额联系供应商。</div>
</div>
<template v-if="projectInfo.provideMode === 3 && (is_view || deliveryMethod === 'mail')">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="24" v-if="!is_view"> <el-col :span="24" v-if="!is_view">
<el-form-item label="收货地址" prop="receiveAddress"> <el-form-item label="收货地址" prop="receiveAddress">
@@ -202,6 +210,7 @@ let CHOOSE_WELFARE = {
data() { data() {
return { return {
projectInfo: {}, projectInfo: {},
deliveryMethod: "",
addressOptions: [], addressOptions: [],
welfareProvideMode: [], welfareProvideMode: [],
welfareSignMode: [], welfareSignMode: [],
@@ -295,6 +304,10 @@ let CHOOSE_WELFARE = {
} }
}, },
doChoose() { doChoose() {
if (this.projectInfo.provideMode === 3 && !this.deliveryMethod) {
this.$message.warning("请选择领取方式")
return
}
this.$refs["addForm"].validate(async (valid) => { this.$refs["addForm"].validate(async (valid) => {
if (valid) { if (valid) {
const { const {
@@ -309,7 +322,7 @@ let CHOOSE_WELFARE = {
return return
} }
} }
if (this.formData.receiveAddress == null || this.formData.receiveAddress === "") { if (this.projectInfo.provideMode === 3 && this.deliveryMethod === "mail" && !this.formData.receiveAddress) {
this.$message.warning("请填写收货地址") this.$message.warning("请填写收货地址")
return return
} }
@@ -322,7 +335,7 @@ let CHOOSE_WELFARE = {
welfareId: this.projectInfo.id, welfareId: this.projectInfo.id,
subjectId: v.subjectId, subjectId: v.subjectId,
selectOptionId: v.id, selectOptionId: v.id,
receiveAddress: this.formData.receiveAddress, receiveAddress: this.deliveryMethod === "pickup" ? "学校自提" : this.formData.receiveAddress,
userSign: this.formData.userSign, userSign: this.formData.userSign,
selectNum: v.selectNum selectNum: v.selectNum
} }
@@ -397,12 +410,19 @@ let CHOOSE_WELFARE = {
}, },
async openChoose(row) { async openChoose(row) {
await this.getProjectInfo(row.id) await this.getProjectInfo(row.id)
this.deliveryMethod = ""
this.$set(this.formData, "receiveAddress", null)
this.$set(this.formData, "addressId", null)
this.$set(this.formData, "userName", this.$store.state.user.username) this.$set(this.formData, "userName", this.$store.state.user.username)
this.$set(this.formData, "tel", this.$store.state.user.mobile) this.$set(this.formData, "tel", this.$store.state.user.mobile)
//如果已选择 //如果已选择
if (row.isChoose > 0) { if (row.isChoose > 0) {
this.$set(this.formData, "receiveAddress", this.userSelection[0].receiveAddress) const receiveAddress = this.userSelection[0].receiveAddress
if (this.projectInfo.provideMode === 3 && receiveAddress) {
this.deliveryMethod = receiveAddress === "学校自提" ? "pickup" : "mail"
}
this.$set(this.formData, "receiveAddress", this.deliveryMethod === "pickup" && !this.is_view ? null : receiveAddress)
this.$set(this.formData, "addressId", null) this.$set(this.formData, "addressId", null)
this.$set(this.formData, "userSign", this.userSelection[0].userSign) this.$set(this.formData, "userSign", this.userSelection[0].userSign)
} else { } else {
@@ -22,6 +22,7 @@ layout("/layouts/platform.html"){
</div> </div>
<div class="search-query"> <div class="search-query">
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button> <el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
<el-button @click="resetSearch">重置</el-button>
</div> </div>
</div> </div>
</el-card> </el-card>
@@ -120,6 +121,10 @@ layout("/layouts/platform.html"){
"choose-welfare": CHOOSE_WELFARE "choose-welfare": CHOOSE_WELFARE
}, },
methods: { methods: {
resetSearch() {
this.$set(this.pageForm, "year", null)
this.doSearch()
},
go_back() { go_back() {
this.doSearch() this.doSearch()
this.$refs.guava.index() this.$refs.guava.index()
@@ -138,6 +138,9 @@ layout("/layouts/platform.html"){
<!-- <el-option :key="item.id" :label="item.optionName" :value="item.id" v-for="item in pageFormProject"></el-option>--> <!-- <el-option :key="item.id" :label="item.optionName" :value="item.id" v-for="item in pageFormProject"></el-option>-->
<!-- </el-select>--> <!-- </el-select>-->
<!-- </search-item>--> <!-- </search-item>-->
<template #actions>
<el-button @click="resetSearch">重置</el-button>
</template>
</search> </search>
</el-card> </el-card>
@@ -311,6 +314,22 @@ layout("/layouts/platform.html"){
} }
}, },
methods: { methods: {
resetSearch() {
this.pageForm.year = new Date().getFullYear().toString()
this.$set(this.pageForm, "userName", null)
this.$set(this.pageForm, "loginName", null)
this.$set(this.pageForm, "sex", null)
this.$set(this.pageForm, "birthday", null)
this.$set(this.pageForm, "unionId", null)
this.$set(this.pageForm, "aidFundMemberUserType", null)
this.$set(this.pageForm, "birthMonths", [])
this.$set(this.pageForm, "unitIds", [])
this.$set(this.pageForm, "personTypes", [])
this.$set(this.pageForm, "userStates", [])
this.$set(this.pageForm, "userAttributes", [])
this.unitIdsChange([])
this.getWelfareList()
},
// 导出名单 // 导出名单
openExport() { openExport() {
this.$downLoad("/platform/welfare/list/mange/exportXlsx", { this.$downLoad("/platform/welfare/list/mange/exportXlsx", {
@@ -432,6 +451,9 @@ layout("/layouts/platform.html"){
} }
try { try {
const responses = await Promise.all(unitIds.map((unitId) => this.$axios.post("/platform/sys/unit/child", { pid: unitId }))) const responses = await Promise.all(unitIds.map((unitId) => this.$axios.post("/platform/sys/unit/child", { pid: unitId })))
if (unitIds !== this.pageForm.unitIds) {
return
}
const failedResponse = responses.find((res) => res.code !== 0) const failedResponse = responses.find((res) => res.code !== 0)
if (failedResponse) { if (failedResponse) {
this.$message.error(failedResponse.msg || "三级单位查询失败") this.$message.error(failedResponse.msg || "三级单位查询失败")
File diff suppressed because one or more lines are too long
@@ -227,8 +227,16 @@ layout("/layouts/platform_h5.html"){
></van-card> ></van-card>
</van-cell> </van-cell>
<div v-if="projectInfo.provideMode === 3" style="padding: 8px 16px">
<div>领取方式</div>
<van-radio-group v-model="deliveryMethod" direction="horizontal">
<van-radio name="pickup">学校自提</van-radio>
<van-radio name="mail">邮寄</van-radio>
</van-radio-group>
<div style="margin-top: 8px; padding: 8px; background: #fff3e8; color: #9c451c">超出江浙沪不包邮,超出部分自理,具体金额联系供应商。</div>
</div>
<!--邮寄到家 填写收货地址--> <!--邮寄到家 填写收货地址-->
<van-cell @click="selectAddressPopup = true" class="confirmWelfareCell" is-link v-if="projectInfo.provideMode===3"> <van-cell @click="selectAddressPopup = true" class="confirmWelfareCell" is-link v-if="projectInfo.provideMode === 3 && deliveryMethod === 'mail'">
<van-icon class="van-cell__left-icon" color="red" name="info" slot="icon"></van-icon> <van-icon class="van-cell__left-icon" color="red" name="info" slot="icon"></van-icon>
<div slot="title" style="font-weight: bold; font-size: 15px">收货地址</div> <div slot="title" style="font-weight: bold; font-size: 15px">收货地址</div>
<template #label> <template #label>
@@ -287,6 +295,7 @@ layout("/layouts/platform_h5.html"){
descPopup: false, descPopup: false,
confirmPopup: false, confirmPopup: false,
selectAddressPopup: false, selectAddressPopup: false,
deliveryMethod: "",
selectAddress: null, selectAddress: null,
addressList: [], addressList: [],
userSign: "" userSign: ""
@@ -427,7 +436,11 @@ layout("/layouts/platform_h5.html"){
//回显用户的地址 //回显用户的地址
if (this.projectInfo.provideMode === 3 && this.isSelect && this.userSelection) { if (this.projectInfo.provideMode === 3 && this.isSelect && this.userSelection) {
this.selectAddress = this.userSelection[0].receiveAddress const receiveAddress = this.userSelection[0].receiveAddress
if (receiveAddress) {
this.deliveryMethod = receiveAddress === "学校自提" ? "pickup" : "mail"
}
this.selectAddress = this.deliveryMethod === "mail" ? receiveAddress : null
} }
//回显用户签名 //回显用户签名
@@ -466,8 +479,12 @@ layout("/layouts/platform_h5.html"){
}, },
//提交选择 //提交选择
async submitSelect() { async submitSelect() {
if (this.projectInfo.provideMode === 3 && !this.deliveryMethod) {
this.$toast("请选择领取方式")
return
}
if (this.projectInfo.provideMode === 3) { if (this.projectInfo.provideMode === 3) {
if (this.selectAddress == null || this.selectAddress === "") { if (this.deliveryMethod === "mail" && !this.selectAddress) {
this.$toast("请填写您的收货地址") this.$toast("请填写您的收货地址")
return return
} }
@@ -491,7 +508,7 @@ layout("/layouts/platform_h5.html"){
welfareId: this.projectInfo.id, welfareId: this.projectInfo.id,
subjectId: v.subjectId, subjectId: v.subjectId,
selectOptionId: v.id, selectOptionId: v.id,
receiveAddress: this.selectAddress, receiveAddress: this.deliveryMethod === "pickup" ? "学校自提" : this.selectAddress,
selectNum: v.selectNum, selectNum: v.selectNum,
userSign: this.userSign userSign: this.userSign
} }