This commit is contained in:
2026-03-02 14:10:53 +08:00
parent 3abdd05ce9
commit f2b2bf129f
11 changed files with 829 additions and 633 deletions
@@ -56,12 +56,12 @@ layout("/layouts/platform.html"){
<div class="search-item-label">年&emsp;&emsp;度:</div>
<div class="search-item-option">
<el-date-picker
@change="doSearch"
placeholder="请选择"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy"
@change="doSearch"
placeholder="请选择"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</div>
</div>
@@ -77,34 +77,34 @@ layout("/layouts/platform.html"){
</table-tool>
<el-table
:data="tableData"
:size="tableSize"
@sort-change="pageOrder"
ref="table"
row-key="id"
style="width: 100%"
v-loading="tableLoading"
:data="tableData"
:size="tableSize"
@sort-change="pageOrder"
ref="table"
row-key="id"
style="width: 100%"
v-loading="tableLoading"
>
<el-table-column
:index="indexMethod"
align="center"
header-align="center"
label="序号"
type="index"
width="80px"
:index="indexMethod"
align="center"
header-align="center"
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"
align="center"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
:key="column.prop"
:label="column.label"
:prop="column.prop"
:sortable="column.sortable"
:width="column.width"
align="center"
header-align="center"
min-width="100px"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template scope="{row}" v-if="column.prop=='choiceTime'">
<i class="el-icon-time"></i>
@@ -130,7 +130,9 @@ layout("/layouts/platform.html"){
<el-table-column align="center" header-align="center" label="操作" prop="userOnline" width="150px">
<template scope="{row}">
<el-button type="primary" size="mini" @click="openChoose(row)">{{confirmButtonInfo(row).text}}</el-button>
<el-button type="primary" size="mini" @click="openChoose(row)">
{{confirmButtonInfo(row).text}}
</el-button>
<!-- <el-button @click="openChoose(row)" size="mini" type="primary"-->
<!-- v-if="new Date().getTime()>moment(row.choiceTimeStart).valueOf()-->
@@ -165,7 +167,8 @@ layout("/layouts/platform.html"){
<el-form-item label="福利礼品">{{projectInfo.gift}}</el-form-item>
</el-col>
<el-col span="8">
<el-form-item label="选择形式">{{projectInfo.isCheckBox==='checkBox'?'多选':'单选'}}</el-form-item>
<el-form-item label="选择形式">{{projectInfo.isCheckBox==='checkBox'?'多选':'单选'}}
</el-form-item>
</el-col>
<el-col span="8" v-if="projectInfo.isCheckBox==='checkBox'">
<el-form-item label="最多选几个">{{projectInfo.multiSelectNum}}个</el-form-item>
@@ -187,7 +190,14 @@ layout("/layouts/platform.html"){
</el-form-item>
</el-col>
<el-col span="8">
<el-form-item label="选择时间">{{projectInfo.choiceTimeStart}}至{{projectInfo.choiceTimeEnd}}</el-form-item>
<el-form-item label="选择时间">
{{projectInfo.choiceTimeStart}}至{{projectInfo.choiceTimeEnd}}
</el-form-item>
</el-col>
<el-col span="8" v-if="projectInfo.isIntegralMode">
<el-form-item label="福利总积分">
{{projectInfo.allIntegral}}
</el-form-item>
</el-col>
</el-row>
@@ -199,16 +209,17 @@ layout("/layouts/platform.html"){
<div slot="header" style="display: flex; justify-content: space-between">
<div style="color: #000; font-size: 18px">{{option.optionName}}</div>
<div>
<el-button @click.stop="viewDesc(option)" type="text">套餐详情</el-button>
<el-button @click.stop="viewDesc(option)" type="text">套餐详情
</el-button>
</div>
</div>
<div style="display: grid; grid-template-rows: auto 1fr auto; height: 200px">
<div style="display: flex">
<el-image
style="width: 150px; height: 150px"
:src="CREATE_PREVIEW_URL(option.imgUrl)"
fit="contain"
style="width: 150px; height: 150px"
:src="CREATE_PREVIEW_URL(option.imgUrl)"
fit="contain"
></el-image>
<div style="width: calc(100% - 150px); padding-left: 20px; position: relative">
@@ -217,8 +228,8 @@ layout("/layouts/platform.html"){
<el-tooltip placement="top" :content="option.supplier">
<!-- style="width: calc(100% - 80px);text-overflow: ellipsis;overflow: hidden;overflow-y: auto;height: 100px;" -->
<span
class="desc_value"
style="text-overflow: ellipsis; overflow: hidden; overflow-y: auto; height: 100px"
class="desc_value"
style="text-overflow: ellipsis; overflow: hidden; overflow-y: auto; height: 100px"
>
{{ option.supplier }}
</span>
@@ -230,31 +241,36 @@ layout("/layouts/platform.html"){
</div>
<div>
<el-input-number
:disabled="isView"
:max="option.maxNum"
:min="0"
@keydown.native="onKeydown"
@change="numChange(option.selectNum, option, oidx)"
style="width: 150px; position: absolute; right: 0; bottom: 0"
v-model="option.selectNum"
:disabled="isView"
:max="option.maxNum"
:min="0"
@keydown.native="onKeydown"
@change="numChange(option.selectNum, option, oidx)"
style="width: 150px; position: absolute; right: 0; bottom: 0"
v-model="option.selectNum"
></el-input-number>
</div>
<div style="width: 150px; position: absolute; right: 0; top: 160px;color:#ac3111;"
v-if="projectInfo.isIntegralMode">
所需积分:{{option.integral}}
</div>
</div>
</div>
<div style="margin-top: 17px">
<el-select
style="width: 100%"
clearable
filterable
v-if="option.receiveAddressList && option.receiveAddressList.length > 0 && option.selectNum > 0"
placeholder="请选择取货门店"
v-model="option.receiveAddress"
style="width: 100%"
clearable
filterable
v-if="option.receiveAddressList && option.receiveAddressList.length > 0 && option.selectNum > 0"
placeholder="请选择取货门店"
v-model="option.receiveAddress"
>
<el-option
v-for="item in option.receiveAddressList"
:key="item.address"
:label="item.address"
:value="item.address"
v-for="item in option.receiveAddressList"
:key="item.address"
:label="item.address"
:value="item.address"
></el-option>
</el-select>
</div>
@@ -269,12 +285,12 @@ layout("/layouts/platform.html"){
<el-col span="24">
<el-form-item label="联系方式" prop="mobile">
<el-input
v-model="formData.mobile"
placeholder="请输入联系方式"
:disabled="isView"
maxlength="11"
type="text"
show-word-limit
v-model="formData.mobile"
placeholder="请输入联系方式"
:disabled="isView"
maxlength="11"
type="text"
show-word-limit
></el-input>
</el-form-item>
</el-col>
@@ -287,17 +303,17 @@ layout("/layouts/platform.html"){
<div style="display: flex; column-gap: 10px">
<div style="flex: 1">
<el-select
@change="addressChange"
filterable
placeholder="请选择收货地址"
style="width: 100%"
v-model="formData.addressId"
@change="addressChange"
filterable
placeholder="请选择收货地址"
style="width: 100%"
v-model="formData.addressId"
>
<el-option
:key="item.id"
:label="item.name+' '+item.defaultName"
:value="item.id"
v-for="item in addressOptions"
:key="item.id"
:label="item.name+' '+item.defaultName"
:value="item.id"
v-for="item in addressOptions"
></el-option>
</el-select>
</div>
@@ -313,17 +329,17 @@ layout("/layouts/platform.html"){
</el-col>
<el-col span="24">
<el-form-item
:rules="{required:true,message: '请确认收货地址', trigger: 'blur'}"
label="请确认收货地址"
prop="receiveAddress"
:rules="{required:true,message: '请确认收货地址', trigger: 'blur'}"
label="请确认收货地址"
prop="receiveAddress"
>
<el-input
:rows="4"
disabled
maxlength="100"
placeholder="选择收货地址联动"
type="textarea"
v-model="formData.receiveAddress"
:rows="4"
disabled
maxlength="100"
placeholder="选择收货地址联动"
type="textarea"
v-model="formData.receiveAddress"
></el-input>
</el-form-item>
</el-col>
@@ -331,20 +347,20 @@ layout("/layouts/platform.html"){
</template>
<el-form-item
:rules="{required:true,message: '请签字', trigger: 'blur'}"
label="签字"
prop="sign"
v-if="projectInfo.signMode===2"
:rules="{required:true,message: '请签字', trigger: 'blur'}"
label="签字"
prop="sign"
v-if="projectInfo.signMode===2"
>
<template v-if="isChoice===0||!isView">
<sign :is_value_base64="false" :qz.sync="formData.sign" prefix="welfare" ref="sign"></sign>
</template>
<template v-else>
<el-image
:src="'/signature/getSignData?path=' +formData.imageUrl"
fit="contain"
style="height: 100px; width: 100%"
v-if="formData.imageUrl"
:src="'/signature/getSignData?path=' +formData.imageUrl"
fit="contain"
style="height: 100px; width: 100%"
v-if="formData.imageUrl"
></el-image>
<span v-else>暂无</span>
</template>
@@ -353,6 +369,8 @@ layout("/layouts/platform.html"){
</el-card>
<el-row class="mt20" justify="end" type="flex">
<span style="display:flex;align-items: center;margin-right: 10px;color: #ac3111"
v-if="projectInfo.isIntegralMode">总消耗积分:{{totalIntegral}}</span>
<el-button @click="$refs.guava.index()">关闭</el-button>
<el-button @click="doChoose" type="primary" v-if="!isView">确定</el-button>
</el-row>
@@ -366,30 +384,31 @@ layout("/layouts/platform.html"){
</el-drawer>
<el-dialog :close-on-click-modal="false" :visible.sync="addressDialogVisible" title="收货地址" width="40%">
<el-form :model="formData" label-position="right" :rules="formRules" label-suffix=":" label-width="120px" ref="addForm">
<el-form :model="formData" label-position="right" :rules="formRules" label-suffix=":" label-width="120px"
ref="addForm">
<el-row :gutter="60">
<el-col :span="24">
<el-form-item label="地址信息" prop="addressList">
<el-cascader
:options="dzOptions"
:props="{ expandTrigger: 'hover' }"
@change="handleChange"
clearable
placeholder="请选择地址信息"
style="width: 100%"
v-model="formData.addressList"
:options="dzOptions"
:props="{ expandTrigger: 'hover' }"
@change="handleChange"
clearable
placeholder="请选择地址信息"
style="width: 100%"
v-model="formData.addressList"
></el-cascader>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="详细地址" prop="addressDetail">
<el-input
maxlength="100"
placeholder="请输入详细地址信息,如道路、门牌号、小区、楼栋号、单元等信息"
rows="3"
show-word-limit
type="textarea"
v-model="formData.addressDetail"
maxlength="100"
placeholder="请输入详细地址信息,如道路、门牌号、小区、楼栋号、单元等信息"
rows="3"
show-word-limit
type="textarea"
v-model="formData.addressDetail"
></el-input>
</el-form-item>
</el-col>
@@ -400,20 +419,21 @@ layout("/layouts/platform.html"){
</el-col>
<el-col :span="24">
<el-form-item label="手机号码" prop="tel">
<el-input maxlength="11" placeholder="请填写手机号码" clearable v-model="formData.tel"></el-input>
<el-input maxlength="11" placeholder="请填写手机号码" clearable
v-model="formData.tel"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="是否默认" prop="isDefault">
<el-switch
v-model="formData.isDefault"
active-color="#13ce66"
inactive-color="#ff4949"
active-value="1"
inactive-value="0"
active-text="是"
inactive-text="否"
v-model="formData.isDefault"
active-color="#13ce66"
inactive-color="#ff4949"
active-value="1"
inactive-value="0"
active-text="是"
inactive-text="否"
></el-switch>
</el-form-item>
</el-col>
@@ -449,12 +469,12 @@ layout("/layouts/platform.html"){
year: moment().format("YYYY")
},
tableColumns: [
{ prop: "year", label: "年度" },
{ prop: "name", label: "项目名称" },
{ prop: "choiceTime", label: "选择时间" },
{ prop: "isChoose", label: "是否选择" },
{ prop: "gist_list", label: "所选福利" },
{ prop: "receiveAddress", label: "收货地址" }
{prop: "year", label: "年度"},
{prop: "name", label: "项目名称"},
{prop: "choiceTime", label: "选择时间"},
{prop: "isChoose", label: "是否选择"},
{prop: "gist_list", label: "所选福利"},
{prop: "receiveAddress", label: "收货地址"}
],
isView: false,
isChoice: false,
@@ -462,25 +482,26 @@ layout("/layouts/platform.html"){
addressDialogVisible: false,
formRules: {
addressList: [{ required: true, message: "请选择地址信息", trigger: ["blur", "change"] }],
addressDetail: [{ required: true, message: "请填写您的详细地址", trigger: ["blur", "change"] }],
userName: [{ required: true, message: "请填写收货人姓名", trigger: ["blur", "change"] }],
addressList: [{required: true, message: "请选择地址信息", trigger: ["blur", "change"]}],
addressDetail: [{required: true, message: "请填写您的详细地址", trigger: ["blur", "change"]}],
userName: [{required: true, message: "请填写收货人姓名", trigger: ["blur", "change"]}],
tel: [
{ required: true, message: "必填", trigger: ["blur", "change"] },
{ pattern: /^1[3-9]\d{9}$/, message: "请输入正确的手机号" }
{required: true, message: "必填", trigger: ["blur", "change"]},
{pattern: /^1[3-9]\d{9}$/, message: "请输入正确的手机号"}
]
},
addFormRules: {
mobile: [
{ required: true, message: "必填", trigger: ["blur", "change"] },
{ pattern: /^1[3-9]\d{9}$/, message: "请输入正确的手机号" }
{required: true, message: "必填", trigger: ["blur", "change"]},
{pattern: /^1[3-9]\d{9}$/, message: "请输入正确的手机号"}
]
},
// 供应商
shoppingType: [],
// 门店地址
offlineStoresOption: []
offlineStoresOption: [],
totalIntegral: 0,
}
},
computed: {
@@ -500,30 +521,30 @@ layout("/layouts/platform.html"){
}
},
confirmButtonInfo(row) {
const { choiceTimeEnd, choiceTimeStart, overdueChoiceTimeEnd, isChoose, selectTime } = row
const {choiceTimeEnd, choiceTimeStart, overdueChoiceTimeEnd, isChoose, selectTime} = row
const now = moment().valueOf()
if (overdueChoiceTimeEnd == null || overdueChoiceTimeEnd === "") {
if (now > moment(choiceTimeStart).valueOf() && now < moment(choiceTimeEnd).valueOf()) {
return { text: isChoose ? "修改" : "选择", disabled: false }
return {text: isChoose ? "修改" : "选择", disabled: false}
} else if (now > moment(choiceTimeEnd).valueOf()) {
return { text: "选择已结束", disabled: true }
return {text: "选择已结束", disabled: true}
} else if (now < moment(choiceTimeStart).valueOf()) {
return { text: "选择未开始", disabled: true }
return {text: "选择未开始", disabled: true}
}
} else {
//已选择了不能再动了
if (isChoose) {
if (moment(selectTime).valueOf() > moment(choiceTimeEnd).valueOf() && now < moment(overdueChoiceTimeEnd).valueOf()) {
return { text: "修改", disabled: false }
return {text: "修改", disabled: false}
}
return { text: "选择已结束", disabled: true }
return {text: "选择已结束", disabled: true}
} else {
if (now > moment(choiceTimeStart).valueOf() && now < moment(overdueChoiceTimeEnd).valueOf()) {
return { text: isChoose ? "修改" : "选择", disabled: false }
return {text: isChoose ? "修改" : "选择", disabled: false}
} else if (now > moment(overdueChoiceTimeEnd).valueOf()) {
return { text: "选择已结束", disabled: true }
return {text: "选择已结束", disabled: true}
} else if (now < moment(choiceTimeStart).valueOf()) {
return { text: "选择未开始", disabled: true }
return {text: "选择未开始", disabled: true}
}
}
}
@@ -583,27 +604,41 @@ layout("/layouts/platform.html"){
})
},
handlePlusButtonClick(value, option, optionIndex) {
const { isCheckBox, multiSelectNum, singleOptionSupportMultipleSelection } = this.projectInfo
if (isCheckBox === "checkBox") {
//判断是否支持单个多选
if (!singleOptionSupportMultipleSelection && value > 1) {
this.$set(this.projectInfo.welfareProjectSubjects[0].options[optionIndex], "selectNum", 1)
this.$message.warning("此套餐最多只能选择1份")
return
const {
isIntegralMode,
isCheckBox,
multiSelectNum,
singleOptionSupportMultipleSelection
} = this.projectInfo
//积分模式
if (isIntegralMode) {
let totalIntegral = 0
this.projectInfo.welfareProjectSubjects[0].options.forEach(v => {
totalIntegral = totalIntegral + (v.integral * v.selectNum)
})
this.totalIntegral = totalIntegral
} else {
if (isCheckBox === "checkBox") {
//判断是否支持单个多选
if (!singleOptionSupportMultipleSelection && value > 1) {
this.$set(this.projectInfo.welfareProjectSubjects[0].options[optionIndex], "selectNum", 1)
this.$message.warning("此套餐最多只能选择1份")
return
}
}
}
//获取用户当前选择的数量
const selectNums = this.projectInfo.welfareProjectSubjects[0].options.map((v) => v.selectNum)
const sum = selectNums.reduce((accumulator, currentValue) => accumulator + currentValue, 0)
//获取用户当前选择的数量
const selectNums = this.projectInfo.welfareProjectSubjects[0].options.map((v) => v.selectNum)
const sum = selectNums.reduce((accumulator, currentValue) => accumulator + currentValue, 0)
if (sum > multiSelectNum) {
this.$set(this.projectInfo.welfareProjectSubjects[0].options[optionIndex], "selectNum", value - 1)
this.$message.warning("此次福利最多只能选择" + multiSelectNum + "份")
if (sum > multiSelectNum) {
this.$set(this.projectInfo.welfareProjectSubjects[0].options[optionIndex], "selectNum", value - 1)
this.$message.warning("此次福利最多只能选择" + multiSelectNum + "份")
}
}
},
async getProjectInfo(id) {
const resp = await $.get("/platform/welfare/common/findOne", { projectId: id })
const resp = await $.get("/platform/welfare/common/findOne", {projectId: id})
if (resp.code === 0) {
resp.data.multiSelectNum = resp.data.multiSelectNum ? resp.data.multiSelectNum : 1
this.projectInfo = resp.data
@@ -634,7 +669,7 @@ layout("/layouts/platform.html"){
doChoose() {
this.$refs["addForm"].validate(async (valid) => {
if (valid) {
const { isCheckBox, multiSelectNum, singleOptionSupportMultipleSelection } = this.projectInfo
const {isCheckBox, multiSelectNum, singleOptionSupportMultipleSelection} = this.projectInfo
if (isCheckBox === "checkBox") {
if (this.sumSelectNum < multiSelectNum) {
//用户没有选择完
@@ -656,13 +691,14 @@ layout("/layouts/platform.html"){
.map((item) => {
return {
optionName: item.optionName,
receiveAddressList: item.receiveAddressList,
selectNum: item.selectNum,
receiveAddress: item.receiveAddress
}
})
let isReceiveAddress = true
for (const item of chooseOptions) {
if (!item.receiveAddress) {
if (!item.receiveAddress && item.receiveAddressList.length > 0) {
this.$message.warning(item.optionName + "还没有选择收货门店哦")
isReceiveAddress = false
break
@@ -697,22 +733,23 @@ layout("/layouts/platform.html"){
selectNum: v.selectNum
}
})
console.log(formData)
const { code, msg, data } = await $.post("/platform/welfare/userChoose/confirmSelect", {
const {code, msg, data} = await $.post("/platform/welfare/userChoose/confirmSelect", {
welfareUserSelections: JSON.stringify(formData),
projectId: this.projectInfo.id,
mobile: this.formData.mobile
mobile: this.formData.mobile,
totalIntegral: this.totalIntegral * 100
})
if (code === 0) {
this.$message.success("您已完成本次福利选择。")
this.doSearch()
this.$refs.guava.index()
} else {
this.$message({
message: msg,
type: "warning"
})
}
this.doSearch()
this.$refs.guava.index()
}
})
},
@@ -748,7 +785,7 @@ layout("/layouts/platform.html"){
},
//获取用户选择的数据
async getUserSelection(projectId) {
const resp = await $.get("/platform/welfare/mine/getUserSelection", { projectId: projectId })
const resp = await $.get("/platform/welfare/mine/getUserSelection", {projectId: projectId})
this.userSelection = resp.data
this.echoUserSelection()
},
@@ -767,7 +804,7 @@ layout("/layouts/platform.html"){
})
},
async getChoice() {
const resp = await $.get("/mobile/welfare/mine/isChoice", { projectId: this.projectInfo.id })
const resp = await $.get("/mobile/welfare/mine/isChoice", {projectId: this.projectInfo.id})
this.isChoice = resp.data
},
async selectUserAddress() {
@@ -788,7 +825,7 @@ layout("/layouts/platform.html"){
},
// 获取供应商
async getShoppingType() {
const { data } = await $.get("/platform/shoppingType/apply/getShoppingType")
const {data} = await $.get("/platform/shoppingType/apply/getShoppingType")
this.projectInfo.welfareProjectSubjects[0].options.forEach((item) => {
item.receiveAddressList = data.find((v) => v.id === item.shoppingId)?.offlineStores
})