feat: 积分发放模块

This commit is contained in:
2026-07-27 11:03:19 +08:00
parent dd7c35eb50
commit 784350bb42
6 changed files with 504 additions and 0 deletions
@@ -0,0 +1,199 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<el-card shadow="never">
<search @search="doSearch">
<search-item label="计划名称">
<el-input clearable placeholder="请输入计划名称" v-model="pageForm.planName"></el-input>
</search-item>
<search-item label="状态">
<el-select clearable placeholder="请选择状态" v-model="pageForm.status">
<el-option label="待执行" value="待执行"></el-option>
<el-option label="执行中" value="执行中"></el-option>
<el-option label="已完成" value="已完成"></el-option>
<el-option label="已取消" value="已取消"></el-option>
<el-option label="已失败" value="已失败"></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool label="积分发放">
<el-button @click="openAdd" icon="el-icon-plus" size="small" type="primary">新建</el-button>
</table-tool>
<el-table :data="tableData" border size="small" style="width:100%" v-loading="tableLoading">
<el-table-column :index="indexMethod" align="center" label="序号" type="index" width="70"></el-table-column>
<el-table-column align="center" label="计划名称" min-width="180" prop="planName" show-overflow-tooltip></el-table-column>
<el-table-column align="center" label="计划描述" min-width="180" prop="planDescription" show-overflow-tooltip></el-table-column>
<el-table-column align="center" label="发放模式" prop="grantMode" width="110">
<template slot-scope="{row}">{{ row.grantMode === '2' ? '定时发放' : '手动发放' }}</template>
</el-table-column>
<el-table-column align="center" label="发放时间" prop="grantTime" width="170"></el-table-column>
<el-table-column align="center" label="发放积分" prop="grantPoints" width="110"></el-table-column>
<el-table-column align="center" label="当前状态" prop="status" width="110">
<template slot-scope="{row}">
<el-tag :type="statusTag(row.status)" size="small">{{ row.status }}</el-tag>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" label="操作" width="170">
<template slot-scope="{row}">
<template v-if="row.status === '待执行'">
<el-button @click="startPlan(row)" size="mini" type="text">立即执行</el-button>
<el-button @click="cancelPlan(row)" size="mini" type="text">取消执行</el-button>
</template>
<span v-else>-</span>
</template>
</el-table-column>
</el-table>
<el-pagination :current-page="pageForm.pageNumber" :page-size="pageForm.pageSize" :page-sizes="[10,20,30,50]" :total="pageForm.totalCount" @current-change="pageChange" @size-change="sizeChange" layout="total, sizes, prev, pager, next" style="margin-top:16px;text-align:right"></el-pagination>
</el-card>
<el-dialog :close-on-click-modal="false" title="新建发放计划" :visible.sync="editDialogVisible" width="720px">
<el-form :model="formData" :rules="rules" label-width="120px" ref="form">
<el-form-item label="计划名称" prop="planName">
<el-input clearable placeholder="请输入计划名称" v-model="formData.planName"></el-input>
</el-form-item>
<el-form-item label="发放积分" prop="grantPoints">
<el-input-number :min="0.01" :precision="2" :step="1" controls-position="right" style="width:100%" v-model="formData.grantPoints"></el-input-number>
</el-form-item>
<el-form-item label="发放模式" prop="grantMode">
<el-radio-group v-model="formData.grantMode">
<el-radio border label="1">手动发放</el-radio>
<el-radio border label="2">定时发放</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="formData.grantMode === '2'" label="发放时间" prop="grantTime">
<el-date-picker placeholder="请选择发放时间" style="width:100%" type="datetime" value-format="yyyy-MM-dd HH:mm:ss" v-model="formData.grantTime"></el-date-picker>
</el-form-item>
<el-form-item label="用户ID列表" prop="userIdList">
<el-input :rows="4" placeholder="请输入用户ID,多个用户用英文逗号分隔" type="textarea" v-model="formData.userIdList"></el-input>
</el-form-item>
<el-form-item label="计划描述">
<el-input :rows="3" maxlength="500" placeholder="请输入计划描述" show-word-limit type="textarea" v-model="formData.planDescription"></el-input>
</el-form-item>
</el-form>
<span slot="footer">
<el-button @click="editDialogVisible=false">取消</el-button>
<el-button :loading="submitLoading" @click="submitForm" type="primary">保存</el-button>
</span>
</el-dialog>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: "#app",
data() {
return {
tableData: [],
tableLoading: false,
submitLoading: false,
editDialogVisible: false,
pageForm: {pageNumber: 1, pageSize: 10, totalCount: 0, planName: "", status: ""},
formData: {},
rules: {
planName: [{required: true, message: "请输入计划名称", trigger: "blur"}],
grantPoints: [{required: true, message: "请输入发放积分", trigger: "blur"}],
grantMode: [{required: true, message: "请选择发放模式", trigger: "change"}],
grantTime: [{required: true, message: "请选择发放时间", trigger: "change"}],
userIdList: [{required: true, message: "请输入用户ID列表", trigger: "blur"}]
}
}
},
methods: {
indexMethod(index) {
return index + 1 + (this.pageForm.pageNumber - 1) * this.pageForm.pageSize
},
statusTag(status) {
if (status === "已完成") return "success"
if (status === "已取消") return "info"
if (status === "已失败") return "danger"
if (status === "执行中") return "warning"
return "primary"
},
doSearch() {
this.pageForm.pageNumber = 1
this.pageData()
},
async pageData() {
this.tableLoading = true
const res = await this.$axios.post("/platform/zhgh/points-mall/pointsgrant/pageData", this.pageForm)
this.tableLoading = false
if (res.code === 0) {
this.tableData = res.data.list || []
this.pageForm.totalCount = res.data.totalCount || 0
} else {
this.$message.warning(res.msg)
}
},
pageChange(value) {
this.pageForm.pageNumber = value
this.pageData()
},
sizeChange(value) {
this.pageForm.pageSize = value
this.pageForm.pageNumber = 1
this.pageData()
},
openAdd() {
this.formData = {planName: "", grantMode: "1", grantTime: "", cronExp: "", userIdList: "", grantPoints: 1, planDescription: ""}
this.editDialogVisible = true
this.$nextTick(() => this.$refs.form && this.$refs.form.clearValidate())
},
submitForm() {
this.$refs.form.validate(async valid => {
if (!valid) return
this.submitLoading = true
const res = await this.$axios.post("/platform/zhgh/points-mall/pointsgrant/doAdd", this.formData)
this.submitLoading = false
if (res.code === 0) {
this.$message.success(res.msg)
this.editDialogVisible = false
this.pageData()
} else {
this.$message.warning(res.msg)
}
})
},
startPlan(row) {
this.$confirm("确定立即执行该积分发放计划吗?", "提示", {
type: "warning",
callback: async action => {
if (action === "confirm") {
const res = await this.$axios.post("/platform/zhgh/points-mall/pointsgrant/startPlan", {id: row.id})
if (res.code === 0) {
this.$message.success("执行成功")
this.pageData()
} else {
this.$message.warning(res.msg)
}
}
}
})
},
cancelPlan(row) {
this.$confirm("确定取消该积分发放计划吗?", "提示", {
type: "warning",
callback: async action => {
if (action === "confirm") {
const res = await this.$axios.post("/platform/zhgh/points-mall/pointsgrant/cancelPlan", {id: row.id})
if (res.code === 0) {
this.$message.success("取消成功")
this.pageData()
} else {
this.$message.warning(res.msg)
}
}
}
})
}
},
created() {
this.pageData()
}
})
</script>
<!--#
}
#-->