first commit

This commit is contained in:
2026-01-08 14:58:16 +08:00
commit 556e5d64aa
9575 changed files with 1621095 additions and 0 deletions
@@ -0,0 +1,99 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="所属年份">
<el-date-picker
:clearable="false"
placeholder="所属年份"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="福利名单"></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" ref="table" row-key="id" v-loading="tableLoading">
<el-table-column :index="indexMethod" label="序号" type="index" width="80px"></el-table-column>
<el-table-column
:key="column.prop"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template v-if="column.prop==='provideMode'" v-slot="{row}">
<dict-tag :options="dict.type.BENEFIT_PROVIDE_MODE" :value="row.provideMode"></dict-tag>
</template>
<template v-else-if="column.prop==='signMode'" v-slot="{row}">
<dict-tag :options="dict.type.BENEFIT_SIGN_MODE" :value="row.signMode"></dict-tag>
</template>
<template v-else-if="column.prop==='isChoice'" v-slot="{row}">{{row.isChoice?'已选择':'未选择'}}</template>
</el-table-column>
<el-table-column label="操作" width="120px">
<template slot-scope="{row}">
<el-button @click="openSelectionBenefit(row)" size="mini" type="primary">选择福利</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
</guava>
<selection-benefit @query="pageData" ref="selectionBenefitRef"></selection-benefit>
</div>
<script nonce="${cspNonce!}">
<!--#include("selectionBefit.js"){}#-->
new Vue({
el: "#app",
mixins: [initTableMixins],
dicts: ["BENEFIT_FESTIVAL", "BENEFIT_SIGN_MODE", "BENEFIT_PROVIDE_MODE", "BENEFIT_GOODS_PROVIDE_MODE"],
data() {
return {
pageForm: {
year: moment().format("YYYY")
},
tableColumns: [
{ prop: "year", label: "年度" },
{ prop: "benefitName", label: "福利名称" },
{ prop: "startChoiceTime", label: "选择开始时间" },
{ prop: "endChoiceTime", label: "选择结束时间" },
{ prop: "signMode", label: "是否电子签字" },
{ prop: "provideMode", label: "发放形式" },
{ prop: "isChoice", label: "是否选择" }
]
}
},
components: {
"selection-benefit": SELECTION_BENEFIT
},
methods: {
openSelectionBenefit(row) {
if (row.isChoice) {
this.$refs.selectionBenefitRef.openEditSelectionBenefit(row)
} else {
this.$refs.selectionBenefitRef.openSelectionBenefit(row)
}
}
},
async created() {
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,474 @@
<!--#include("../goods/goodsInfo.js"){}#-->
<!--#include("../address/addressDialog.js"){}#-->
let SELECTION_BENEFIT = {
/*language=HTML*/
template: `
<div>
<el-dialog title="选择福利"
:visible.sync="visibleDialog" :close-on-click-modal="false" width="70%">
<el-form label-suffix="" :model="formData">
<el-row :gutter="20">
<el-col :span="24">
<span
style="font-weight: bold;font-size: 20px;display: flex;justify-content: center">{{viewData.name}}</span>
</el-col>
<el-col :span="8">
<el-form-item label="福利节日">
<dict-tag :options="dict.type.BENEFIT_FESTIVAL"
:value="viewData.festival"></dict-tag>
</el-form-item>
</el-col>
<el-col :span="8" v-if="viewData.provideMode==='BENEFIT_PROVIDE_MODE_ONE'">
<el-form-item label="福利礼品">
{{viewData.giftName}}
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="是否电子签字">
<dict-tag :options="dict.type.BENEFIT_SIGN_MODE"
:value="viewData.signMode"></dict-tag>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="发放形式">
<dict-tag :options="dict.type.BENEFIT_PROVIDE_MODE"
:value="viewData.provideMode"></dict-tag>
</el-form-item>
</el-col>
<el-col :span="8" v-if="viewData.provideMode==='BENEFIT_PROVIDE_MODE_TWO'">
<el-form-item label="选择时间">
{{$moment(viewData.startChoiceTime).format("YYYY-MM-DD HH:mm")}}
{{$moment(viewData.endChoiceTime).format("YYYY-MM-DD HH:mm")}}
</el-form-item>
</el-col>
<el-col :span="8" v-if="viewData.provideMode==='BENEFIT_PROVIDE_MODE_TWO'">
<el-form-item label="逾期选择时间">
<span v-if="viewData.endOverdueChoiceTime">
{{
$moment(viewData.endOverdueChoiceTime).format("YYYY-MM-DD HH:mm")
}}
</span>
<span v-else>暂无</span>
</el-form-item>
</el-col>
<el-col :span="8" v-if="viewData.provideMode==='BENEFIT_PROVIDE_MODE_TWO'">
<el-form-item label="福利总积分">
{{viewData.totalMoney}}
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" v-if="viewData.provideMode==='BENEFIT_PROVIDE_MODE_TWO'">
<el-form-item label="福利套餐"></el-form-item>
<el-col :span="6" v-for="(item,index) in viewData.benefitGoodsList"
:key="item.id" style="padding-bottom: 10px">
<el-card :body-style="{ padding: '10px' }">
<el-tooltip content="点击查看商品详情" placement="top">
<el-image
style="width: 100%;height: 300px"
v-if="item.imgUrl&&item.imgUrl.length>0"
:src="item.imgUrl[0].url"
fit="contain" @click="openGoods(item.id)"></el-image>
<el-image
style="width: 100%;height: 300px"
v-else
src="/assets/mobile/img/benefit/1.png"
fit="contain" @click="openGoods(item.id)"></el-image>
</el-tooltip>
<div style="padding: 14px;">
<div
style="white-space: nowrap;display: flex;padding: 5px">
<el-tooltip :content="item.simpleDesc" placement="top">
<span
style="text-overflow: ellipsis;overflow: hidden;font-weight: bold;font-size: 15px">
{{item.name}}
</span>
</el-tooltip>
</div>
<div style="padding: 5px">
<span
style="color: red;font-weight: bold;font-size: 20px">¥{{item.money}}</span>
</div>
<div style="padding: 5px">
<el-input-number :min="0" style="width: 100%"
v-model="item.selectNum"></el-input-number>
</div>
</div>
</el-card>
</el-col>
</el-row>
<el-card v-if="viewData.provideMode==='BENEFIT_PROVIDE_MODE_ONE'
&&viewData.signMode==='BENEFIT_SIGN_MODE_ONE'">
<el-row :gutter="20">
<el-col :span="24">
<pc-signature v-model="formData.userSign"></pc-signature>
</el-col>
</el-row>
</el-card>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="visibleDialog = false">取 消</el-button>
<el-button type="primary" @click="openSubmit">提 交</el-button>
</span>
</el-dialog>
<el-dialog title="提交商品确认"
:visible.sync="submitVisibleDialog" :close-on-click-modal="false"
width="50%">
<el-form label-suffix="" :model="formData">
<el-card v-for="(goods,index) in formData.benefitGoodsList"
:key="goods.id">
<el-row :gutter="20">
<el-col :span="24">
{{goods.name}}
<span style="display: flex;justify-content: flex-end;color:red;">
x{{goods.selectNum}}
</span>
</el-col>
<el-col :span="24">
<el-radio-group v-model="goods.specificationsId" size="small"
@change="specificationsChange(goods.specificationsId,index)">
<el-radio :label="specifications.id" border
:key="specifications.id"
v-for="specifications in goods.benefitGoodsSpecificationsList">
{{specifications.name}}
</el-radio>
</el-radio-group>
</el-col>
<el-col :span="24"
v-if="goods.goodsProvideMode==='GOODS_PROVIDE_MODE_POST'"
style="padding-top: 10px">
<div v-if="!goods.receiveAddress">
<div style="display: flex; column-gap: 10px;">
<div style="flex: 1">
<el-select @change="addressChange(goods)"
filterable placeholder="请选择收货地址"
style="width: 100%"
v-model="goods.addressId">
<el-option
:key="item.id"
:label="item.name+' '+item.defaultName"
:value="item.id"
v-for="item in addressOptions">
</el-option>
</el-select>
</div>
<div>
<el-button
@click="openAddress"
type="primary">添加收货地址
</el-button>
</div>
</div>
</div>
<div v-else>
<div style="display: flex; column-gap: 10px;">
<div style="flex: 1">
<el-input :value="goods.receiveAddress"
readonly></el-input>
</div>
<div>
<el-button
@click="editAddress(index)"
type="primary">修改收货地址
</el-button>
</div>
</div>
</div>
</el-col>
<el-col :span="24"
v-if="goods.goodsProvideMode==='GOODS_PROVIDE_MODE_SHOP'"
style="padding-top: 10px">
<el-select filterable placeholder="请选择收货门店"
style="width: 100%"
v-model="goods.shopAddress">
<el-option
:key="item.id"
:label="item.name"
:value="item.name"
v-for="(item,index) in goods.shopAddressList">
</el-option>
</el-select>
</el-col>
</el-row>
</el-card>
<el-card v-if="viewData.signMode==='BENEFIT_SIGN_MODE_ONE'">
<el-row :gutter="20">
<el-col :span="24">
<pc-signature v-model="formData.userSign"></pc-signature>
</el-col>
</el-row>
</el-card>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button
@click="visibleDialog = true;submitVisibleDialog = false">关闭继续选择</el-button>
<el-button type="primary" @click="submit">提 交</el-button>
</span>
</el-dialog>
<benefit-goods-info ref="benefitGoodsInfo"></benefit-goods-info>
<address-dialog ref="addressDialog"
@select_user_address="selectUserAddress"></address-dialog>
</div>
`,
store,
dicts: ["BENEFIT_FESTIVAL", "BENEFIT_SIGN_MODE", "BENEFIT_PROVIDE_MODE", "BENEFIT_GOODS_PROVIDE_MODE"],
data() {
return {
visibleDialog: false,
submitVisibleDialog: false,
viewData: {},
formData: {},
addressOptions: [],
userSelection: []
}
},
components: {
"benefit-goods-info": BENEFIT_GOODS_INFO,
"address-dialog": ADDRESS_DIALOG
},
methods: {
specificationsChange(val, index) {
this.$set(this.formData.benefitGoodsList[index], "specificationsId", val)
this.$forceUpdate()
},
editAddress(index) {
this.$set(this.formData.benefitGoodsList[index], "addressId", "")
this.$set(this.formData.benefitGoodsList[index], "receiveAddress", "")
this.$forceUpdate()
},
submit() {
if (this.viewData.signMode === "BENEFIT_SIGN_MODE_ONE" && !this.formData.userSign) {
this.$message.warning("请签字后再提交!")
return
}
let flag = false
let msg = ""
this.formData.benefitGoodsList.some(b => {
if (b.goodsProvideMode === "GOODS_PROVIDE_MODE_POST" && !b.receiveAddress) {
flag = true
msg = "商品中存在未填写的收货地址,请检查!"
return true
}
if (b.benefitGoodsSpecificationsList && b.benefitGoodsSpecificationsList.length > 0 && !b.specificationsId) {
flag = true
msg = "商品中存在未填写的规格,请检查!"
return true
}
if (b.shopAddressList && b.shopAddressList.length > 0 && !b.shopAddress) {
flag = true
msg = "商品中存在未填写的门店地址,请检查!"
return true
}
return false
})
if (flag) {
this.$message.warning(msg)
return
}
this.$confirm("确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
const benefitUserSelection = this.formData.benefitGoodsList.map(b => {
let data = {
"specificationsId": b.specificationsId,
"receiveAddress": b.receiveAddress,
"shopAddress": b.shopAddress,
"selectNum": b.selectNum,
"benefitId": this.viewData.id,
"goodsId": b.id,
"selectUserId": b.selectUserId,
"userSign": this.formData.userSign
}
return data
})
this.$axios.post("/platform/benefit/userSelection/submit", {
benefitUserSelection: JSON.stringify(benefitUserSelection),
benefitId: this.viewData.id,
userId: this.viewData.userId
}).then((res) => {
if (res.code === 0) {
this.$message.success("提交成功")
this.submitVisibleDialog = false
this.$emit("query")
}
})
})
.catch(() => {
})
},
addressChange(goods) {
const address = this.addressOptions.find(a => a.id === goods.addressId)
const { province, city, county, name, tel } = address
if (goods.postProvideConfig.choiceMunicipality && city !== goods.postProvideConfig.choiceMunicipality) {
this.$message.warning("当前福利限制只能邮寄" + goods.postProvideConfig.choiceMunicipality + "")
this.$set(goods, "addressId", "")
return
}
if (goods.postProvideConfig.choiceProvince && province !== goods.postProvideConfig.choiceProvince) {
this.$message.warning("当前福利限制只能邮寄" + goods.postProvideConfig.choiceProvince + "")
this.$set(goods, "addressId", "")
return
}
if (address) {
this.$set(goods, "receiveAddress", address.name)
}
},
openAddress() {
this.$refs.addressDialog.dialogVisible = true
this.$refs.addressDialog.formData = {}
},
/**
* isAdmin是否为管理员编辑,管理员就要查询当前传过来的userid,不是管理员就要查询当前登录用户的id
* @param isAdmin
* @returns {Promise<void>}
*/
async selectUserAddress(userId) {
const resp = await this.$axios.post("/platform/benefit/address/selectUserAddress", { userId })
resp.data.map(r => {
let defaultName = r.isDefault ? "默认地址" : ""
r.defaultName = defaultName
r.name = "收货地址:" + r.province + r.city + r.county + r.addressDetail + ",收件人:" + r.userName + ",联系方式:" + r.tel
})
this.addressOptions = resp.data
},
provideModeOneDoSubmit() {
if (!this.formData.userSign) {
this.$message.warning("请签字后再提交!")
return
}
this.$confirm("确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/benefit/userSelection/provideModeOneDoSubmit", {
userSign: this.formData.userSign,
benefitId: this.viewData.id
}).then((res) => {
if (res.code === 0) {
this.visibleDialog = false
this.$message.success("提交成功")
this.$emit("query")
}
})
})
},
openSubmit() {
if (this.viewData.provideMode === "BENEFIT_PROVIDE_MODE_ONE"
&& this.viewData.signMode === "BENEFIT_SIGN_MODE_ONE") {
//如果是统一发放并且需要签字
this.provideModeOneDoSubmit()
return
}
let totalMoney = 0
const benefitGoodsList = this.viewData.benefitGoodsList.filter(b => b.selectNum > 0)
benefitGoodsList.map(b => {
totalMoney = totalMoney + b.selectNum * b.money
})
if (totalMoney === 0) {
this.$message.warning("请选择后再提交!")
return
}
if (totalMoney !== this.viewData.totalMoney) {
this.$message.warning("本次福利积分【" + this.viewData.totalMoney + "】请检查商品数量!")
return
}
this.formData.benefitGoodsList = benefitGoodsList
this.openSubmitView()
},
openSubmitView() {
this.visibleDialog = false
setTimeout(() => {
this.submitVisibleDialog = true
}, 400)
},
openGoods(id) {
this.$refs.benefitGoodsInfo.open(id)
},
/**
* 查询单个福利
* @param id
* @returns {Promise<*>}
*/
async findOneBenefit(id) {
const res = await this.$axios.post("/platform/benefit/userSelection/findOneBenefit", { id })
if (res.code === 0) {
return res.data
}
},
/**
*查询用户选择的商品
* @param benefitId
* @param userId
* @returns {Promise<void>}
*/
async selectSelectionBenefit(benefitId, userId) {
const res = await this.$axios.post("/platform/benefit/userSelection/selectSelectionBenefit", {
benefitId,
userId
})
if (res.code === 0) {
this.userSelection = res.data
}
},
/**
* 回显用户选择的数据
* @param benefitId
* @param userId
* @returns {Promise<void>}
*/
async echoUserSelection(benefitId, userId) {
await this.selectSelectionBenefit(benefitId, userId)
//获取用户当前选择的数量
this.viewData.benefitGoodsList.map(v => {
const goods = this.userSelection.find(x => x.goodsId === v.id)
if (goods) {
v.selectNum = goods.selectNum
v.selectUserId = goods.selectUserId
v.receiveAddress = goods.receiveAddress
v.specificationsId = goods.specificationsId
v.shopAddress = goods.shopAddress
} else {
v.selectNum = 0
}
})
},
async openEditSelectionBenefit(row) {
//isAdmin是否为管理员编辑,管理员就要查询当前传过来的userid,不是管理员就要查询当前登录用户的id
const data = await this.findOneBenefit(row.benefitId)
data.userId = row.userId
this.viewData = data
await this.echoUserSelection(row.benefitId, row.userId)
await this.selectUserAddress(row.userId)
this.visibleDialog = true
},
async openSelectionBenefit(row, isAdmin) {
const data = await this.findOneBenefit(row.benefitId)
data.benefitGoodsList.map(v => {
v.selectUserId = row.userId
v.selectNum = 0
v.receiveAddress = ""
v.specificationsId = ""
})
data.userId = row.userId
this.viewData = data
await this.selectUserAddress(row.userId)
this.visibleDialog = true
}
}
}