|
@@ -1,288 +1,331 @@
|
|
|
<template>
|
|
<template>
|
|
|
- <div class="growth-task-management">
|
|
|
|
|
|
|
+ <div class="growth-task">
|
|
|
<el-card>
|
|
<el-card>
|
|
|
- <el-tabs v-model="activeTab" @tab-click="handleTabChange">
|
|
|
|
|
- <el-tab-pane label="成长任务" name="growth">
|
|
|
|
|
- <div style="margin-bottom: 16px">
|
|
|
|
|
- <el-button type="primary" size="small" @click="handleCreateTask">新建任务</el-button>
|
|
|
|
|
- </div>
|
|
|
|
|
- <el-table :data="growthTaskList" v-loading="growthLoading" border stripe>
|
|
|
|
|
- <el-table-column prop="id" label="ID" width="70" />
|
|
|
|
|
- <el-table-column prop="title" label="标题" min-width="140" show-overflow-tooltip />
|
|
|
|
|
- <el-table-column prop="type" label="类型" width="90">
|
|
|
|
|
- <template slot-scope="{ row }">
|
|
|
|
|
- <el-tag size="mini">{{ row.type }}</el-tag>
|
|
|
|
|
- </template>
|
|
|
|
|
- </el-table-column>
|
|
|
|
|
- <el-table-column prop="rewardPoints" label="奖励积分" width="90" />
|
|
|
|
|
- <el-table-column prop="rewardEnergy" label="奖励能量" width="90" />
|
|
|
|
|
- <el-table-column prop="targetValue" label="目标值" width="80" />
|
|
|
|
|
- <el-table-column prop="taskKey" label="任务Key" width="140" show-overflow-tooltip />
|
|
|
|
|
- <el-table-column label="启用" width="70" align="center">
|
|
|
|
|
- <template slot-scope="{ row }">
|
|
|
|
|
- <el-switch v-model="row.enabled" :active-value="1" :inactive-value="0" @change="(val) => handleToggleEnabled(row, val)" />
|
|
|
|
|
- </template>
|
|
|
|
|
- </el-table-column>
|
|
|
|
|
- <el-table-column prop="sortOrder" label="排序" width="70" />
|
|
|
|
|
- <el-table-column label="操作" width="120" fixed="right">
|
|
|
|
|
- <template slot-scope="{ row }">
|
|
|
|
|
- <el-button size="mini" @click="handleEditTask(row)">编辑</el-button>
|
|
|
|
|
- </template>
|
|
|
|
|
- </el-table-column>
|
|
|
|
|
- </el-table>
|
|
|
|
|
- </el-tab-pane>
|
|
|
|
|
- <el-tab-pane label="新手任务" name="onboarding">
|
|
|
|
|
- <el-table :data="onboardingList" v-loading="onboardingLoading" border stripe>
|
|
|
|
|
- <el-table-column prop="taskType" label="任务类型" min-width="180">
|
|
|
|
|
- <template slot-scope="{ row }">{{ taskTypeLabel(row.taskType) }}</template>
|
|
|
|
|
- </el-table-column>
|
|
|
|
|
- <el-table-column prop="rewardPoints" label="奖励积分" width="100" />
|
|
|
|
|
- <el-table-column prop="rewardEnergy" label="奖励能量" width="100" />
|
|
|
|
|
- <el-table-column label="操作" width="120" fixed="right">
|
|
|
|
|
- <template slot-scope="{ row }">
|
|
|
|
|
- <el-button size="mini" @click="handleEditOnboarding(row)">编辑</el-button>
|
|
|
|
|
- </template>
|
|
|
|
|
- </el-table-column>
|
|
|
|
|
- </el-table>
|
|
|
|
|
- </el-tab-pane>
|
|
|
|
|
- </el-tabs>
|
|
|
|
|
|
|
+ <div slot="header">
|
|
|
|
|
+ <span>成长任务管理</span>
|
|
|
|
|
+ <div style="float:right">
|
|
|
|
|
+ <el-select
|
|
|
|
|
+ v-model="filter.status"
|
|
|
|
|
+ placeholder="状态筛选"
|
|
|
|
|
+ size="mini"
|
|
|
|
|
+ style="margin-right:12px;width:130px"
|
|
|
|
|
+ clearable
|
|
|
|
|
+ @change="loadTasks"
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-option label="全部" value="" />
|
|
|
|
|
+ <el-option label="开启" value="enabled" />
|
|
|
|
|
+ <el-option label="关闭" value="disabled" />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ <el-button type="primary" size="mini" @click="openCreate">创建任务</el-button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <el-table :data="tasks" v-loading="loading" border stripe>
|
|
|
|
|
+ <el-table-column prop="id" label="ID" width="80" />
|
|
|
|
|
+ <el-table-column prop="name" label="任务名称" min-width="150" show-overflow-tooltip />
|
|
|
|
|
+ <el-table-column prop="dimensionCode" label="关联维度" width="100">
|
|
|
|
|
+ <template slot-scope="{ row }">
|
|
|
|
|
+ <el-tag size="mini" :type="dimensionType(row.dimensionCode)">{{ dimensionLabel(row.dimensionCode) }}</el-tag>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ <el-table-column prop="type" label="任务类型" width="100" />
|
|
|
|
|
+ <el-table-column label="触发方式" width="80">
|
|
|
|
|
+ <template slot-scope="{ row }">{{ row.triggerType || '—' }}</template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ <el-table-column prop="description" label="描述" min-width="180" show-overflow-tooltip />
|
|
|
|
|
+ <el-table-column label="任务值" width="80">
|
|
|
|
|
+ <template slot-scope="{ row }">{{ row.taskValue ?? '-' }}</template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ <el-table-column label="奖励" width="160">
|
|
|
|
|
+ <template slot-scope="{ row }">
|
|
|
|
|
+ <div v-if="row.rewardItems && row.rewardItems.length">
|
|
|
|
|
+ <el-tag size="mini" v-for="(ri, i) in row.rewardItems" :key="i" style="margin:1px">
|
|
|
|
|
+ {{ ri.type }}:{{ ri.value }}
|
|
|
|
|
+ </el-tag>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <span v-else style="color:#999">—</span>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ <el-table-column label="状态" width="80">
|
|
|
|
|
+ <template slot-scope="{ row }">
|
|
|
|
|
+ <el-switch
|
|
|
|
|
+ :value="row.status === 'enabled'"
|
|
|
|
|
+ @change="toggleStatus(row)"
|
|
|
|
|
+ />
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ <el-table-column label="操作" width="140">
|
|
|
|
|
+ <template slot-scope="{ row }">
|
|
|
|
|
+ <el-button size="mini" @click="handleEditTask(row)">编辑</el-button>
|
|
|
|
|
+ <el-button size="mini" type="primary" @click="handleTaskSubmit(row)">保存</el-button>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ </el-table>
|
|
|
|
|
+ <el-pagination
|
|
|
|
|
+ v-if="total > 0"
|
|
|
|
|
+ @size-change="handleSizeChange"
|
|
|
|
|
+ @current-change="handlePageChange"
|
|
|
|
|
+ :current-page="filter.page"
|
|
|
|
|
+ :page-sizes="[10, 20, 50]"
|
|
|
|
|
+ :page-size="filter.size"
|
|
|
|
|
+ layout="total, sizes, prev, pager, next, jumper"
|
|
|
|
|
+ :total="total"
|
|
|
|
|
+ style="margin-top:16px;text-align:right"
|
|
|
|
|
+ />
|
|
|
</el-card>
|
|
</el-card>
|
|
|
|
|
|
|
|
- <el-dialog :visible.sync="taskDialogVisible" :title="isEditTask ? '编辑成长任务' : '新建成长任务'" width="550px">
|
|
|
|
|
- <el-form :model="taskForm" label-width="120px">
|
|
|
|
|
- <el-form-item label="标题" required>
|
|
|
|
|
- <el-input v-model="taskForm.title" placeholder="请输入任务标题" />
|
|
|
|
|
|
|
+ <el-dialog
|
|
|
|
|
+ :title="editId ? '编辑任务' : '创建任务'"
|
|
|
|
|
+ :visible.sync="dialogVisible"
|
|
|
|
|
+ width="700px"
|
|
|
|
|
+ @closed="resetForm"
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-form label-width="120px">
|
|
|
|
|
+ <el-form-item label="任务名称">
|
|
|
|
|
+ <el-input v-model="form.name" placeholder="请输入任务名称" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="类型" required>
|
|
|
|
|
- <el-select v-model="taskForm.type" placeholder="请选择类型" style="width: 100%">
|
|
|
|
|
- <el-option label="DAILY" value="DAILY" />
|
|
|
|
|
- <el-option label="NEWBIE" value="NEWBIE" />
|
|
|
|
|
|
|
+
|
|
|
|
|
+ <el-form-item label="任务类型">
|
|
|
|
|
+ <el-select v-model="form.type" placeholder="选择任务类型" style="width:100%">
|
|
|
|
|
+ <el-option label="每日任务" value="daily" />
|
|
|
|
|
+ <el-option label="每周任务" value="weekly" />
|
|
|
|
|
+ <el-option label="每月任务" value="monthly" />
|
|
|
|
|
+ <el-option label="一次性任务" value="one_time" />
|
|
|
</el-select>
|
|
</el-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="奖励积分">
|
|
|
|
|
- <el-input-number v-model="taskForm.rewardPoints" :min="0" style="width: 200px" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item label="奖励能量">
|
|
|
|
|
- <el-input-number v-model="taskForm.rewardEnergy" :min="0" style="width: 200px" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item label="目标值">
|
|
|
|
|
- <el-input-number v-model="taskForm.targetValue" :min="1" style="width: 200px" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item label="排序">
|
|
|
|
|
- <el-input-number v-model="taskForm.sortOrder" :min="0" style="width: 200px" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item label="启用">
|
|
|
|
|
- <el-switch v-model="taskForm.enabled" :active-value="1" :inactive-value="0" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </el-form>
|
|
|
|
|
- <div slot="footer">
|
|
|
|
|
- <el-button @click="taskDialogVisible = false">取消</el-button>
|
|
|
|
|
- <el-button type="primary" @click="handleTaskSubmit" :loading="taskSubmitting">保存</el-button>
|
|
|
|
|
- </div>
|
|
|
|
|
- </el-dialog>
|
|
|
|
|
|
|
|
|
|
- <el-dialog title="编辑新手任务配置" :visible.sync="onboardingDialogVisible" width="450px">
|
|
|
|
|
- <el-form :model="onboardingForm" label-width="120px">
|
|
|
|
|
- <el-form-item label="任务类型" required>
|
|
|
|
|
- <el-input v-model="onboardingForm.taskType" disabled />
|
|
|
|
|
|
|
+ <el-row :gutter="16">
|
|
|
|
|
+ <el-col :span="12">
|
|
|
|
|
+ <el-form-item label="关联维度">
|
|
|
|
|
+ <el-select v-model="form.dimensionCode" placeholder="选择维度" style="width:100%">
|
|
|
|
|
+ <el-option label="身" value="body" />
|
|
|
|
|
+ <el-option label="心" value="heart" />
|
|
|
|
|
+ <el-option label="智" value="mind" />
|
|
|
|
|
+ <el-option label="行" value="action" />
|
|
|
|
|
+ <el-option label="富" value="wealth" />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :span="12">
|
|
|
|
|
+ <el-form-item label="触发方式">
|
|
|
|
|
+ <el-select v-model="form.triggerType" placeholder="选择触发方式" style="width:100%" clearable>
|
|
|
|
|
+ <el-option label="手动" value="manual" />
|
|
|
|
|
+ <el-option label="自动" value="auto" />
|
|
|
|
|
+ <el-option label="条件" value="condition" />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+
|
|
|
|
|
+ <el-form-item label="描述">
|
|
|
|
|
+ <el-input v-model="form.description" type="textarea" :rows="3" placeholder="任务描述" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="奖励积分">
|
|
|
|
|
- <el-input-number v-model="onboardingForm.rewardPoints" :min="0" style="width: 200px" />
|
|
|
|
|
|
|
+
|
|
|
|
|
+ <el-row :gutter="16">
|
|
|
|
|
+ <el-col :span="12">
|
|
|
|
|
+ <el-form-item label="任务值">
|
|
|
|
|
+ <el-input-number v-model="form.taskValue" :min="0" :step="1" style="width:100%" placeholder="0" />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :span="12">
|
|
|
|
|
+ <el-form-item label="排序">
|
|
|
|
|
+ <el-input-number v-model="form.sortOrder" :min="0" :step="1" style="width:100%" placeholder="0" />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+
|
|
|
|
|
+ <el-form-item label="五维权重">
|
|
|
|
|
+ <dimension-weight-picker v-model="form.dimensionWeights" :show-presets="true" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="奖励能量">
|
|
|
|
|
- <el-input-number v-model="onboardingForm.rewardEnergy" :min="0" style="width: 200px" />
|
|
|
|
|
|
|
+
|
|
|
|
|
+ <el-form-item label="启用">
|
|
|
|
|
+ <el-switch v-model="form.statusBool" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-form>
|
|
</el-form>
|
|
|
<div slot="footer">
|
|
<div slot="footer">
|
|
|
- <el-button @click="onboardingDialogVisible = false">取消</el-button>
|
|
|
|
|
- <el-button type="primary" @click="handleOnboardingSubmit" :loading="onboardingSubmitting">保存</el-button>
|
|
|
|
|
|
|
+ <el-button @click="dialogVisible = false">取消</el-button>
|
|
|
|
|
+ <el-button type="primary" @click="handleTaskSubmit" :loading="saving">保存</el-button>
|
|
|
</div>
|
|
</div>
|
|
|
</el-dialog>
|
|
</el-dialog>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
<script>
|
|
|
-import { getGrowthTaskList, updateGrowthTask, createGrowthTask, getOnboardingConfigList, updateOnboardingConfig } from '@/api/growthTask'
|
|
|
|
|
|
|
+import DimensionWeightPicker from '@/components/DimensionWeightPicker.vue'
|
|
|
|
|
+import { getTaskList, createTask, updateTask, toggleTaskStatus } from '@/api/growth-task'
|
|
|
|
|
+import { saveDimensionWeights, getDimensionWeights } from '@/api/dimension-weight.js'
|
|
|
|
|
|
|
|
-const TASK_TYPE_LABELS = {
|
|
|
|
|
- REGISTER: '注册账号',
|
|
|
|
|
- COMPLETE_PROFILE: '完善个人资料',
|
|
|
|
|
- ADD_CHILD: '添加孩子',
|
|
|
|
|
- FIRST_CHECKIN: '首次签到',
|
|
|
|
|
- FIRST_TASK: '完成首个任务',
|
|
|
|
|
- BIND_REFERRAL: '绑定推荐码'
|
|
|
|
|
|
|
+const DIMENSION_CONFIG = {
|
|
|
|
|
+ body: { label: '身', type: 'success' },
|
|
|
|
|
+ heart: { label: '心', type: 'danger' },
|
|
|
|
|
+ mind: { label: '智', type: 'warning' },
|
|
|
|
|
+ action: { label: '行', type: 'primary' },
|
|
|
|
|
+ wealth: { label: '富', type: 'info' }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
export default {
|
|
export default {
|
|
|
name: 'GrowthTaskManagement',
|
|
name: 'GrowthTaskManagement',
|
|
|
|
|
+ components: { DimensionWeightPicker },
|
|
|
data() {
|
|
data() {
|
|
|
return {
|
|
return {
|
|
|
- activeTab: 'growth',
|
|
|
|
|
- growthTaskList: [],
|
|
|
|
|
- growthLoading: false,
|
|
|
|
|
- onboardingList: [],
|
|
|
|
|
- onboardingLoading: false,
|
|
|
|
|
- taskDialogVisible: false,
|
|
|
|
|
- isEditTask: false,
|
|
|
|
|
- taskSubmitting: false,
|
|
|
|
|
- taskForm: this.getEmptyTaskForm(),
|
|
|
|
|
- onboardingDialogVisible: false,
|
|
|
|
|
- onboardingSubmitting: false,
|
|
|
|
|
- onboardingForm: {
|
|
|
|
|
- taskType: '',
|
|
|
|
|
- rewardPoints: 0,
|
|
|
|
|
- rewardEnergy: 0
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ loading: false,
|
|
|
|
|
+ saving: false,
|
|
|
|
|
+ tasks: [],
|
|
|
|
|
+ total: 0,
|
|
|
|
|
+ editId: null,
|
|
|
|
|
+ dialogVisible: false,
|
|
|
|
|
+ filter: {
|
|
|
|
|
+ status: '',
|
|
|
|
|
+ page: 1,
|
|
|
|
|
+ size: 10
|
|
|
|
|
+ },
|
|
|
|
|
+ form: {}
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
- created() {
|
|
|
|
|
- this.loadGrowthTasks()
|
|
|
|
|
- },
|
|
|
|
|
methods: {
|
|
methods: {
|
|
|
- taskTypeLabel(type) {
|
|
|
|
|
- return TASK_TYPE_LABELS[type] || type
|
|
|
|
|
|
|
+ dimensionLabel(code) {
|
|
|
|
|
+ return (DIMENSION_CONFIG[code] && DIMENSION_CONFIG[code].label) || code || '—'
|
|
|
|
|
+ },
|
|
|
|
|
+ dimensionType(code) {
|
|
|
|
|
+ return (DIMENSION_CONFIG[code] && DIMENSION_CONFIG[code].type) || ''
|
|
|
},
|
|
},
|
|
|
getEmptyTaskForm() {
|
|
getEmptyTaskForm() {
|
|
|
return {
|
|
return {
|
|
|
- id: null,
|
|
|
|
|
- title: '',
|
|
|
|
|
- type: 'DAILY',
|
|
|
|
|
- rewardPoints: 0,
|
|
|
|
|
- rewardEnergy: 0,
|
|
|
|
|
- targetValue: 1,
|
|
|
|
|
|
|
+ name: '',
|
|
|
|
|
+ type: 'daily',
|
|
|
|
|
+ dimensionCode: '',
|
|
|
|
|
+ triggerType: '',
|
|
|
|
|
+ description: '',
|
|
|
|
|
+ taskValue: null,
|
|
|
sortOrder: 0,
|
|
sortOrder: 0,
|
|
|
- enabled: 1
|
|
|
|
|
|
|
+ statusBool: true,
|
|
|
|
|
+ dimensionWeights: []
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
- handleTabChange() {
|
|
|
|
|
- if (this.activeTab === 'onboarding') {
|
|
|
|
|
- this.loadOnboardingConfigs()
|
|
|
|
|
- } else {
|
|
|
|
|
- this.loadGrowthTasks()
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ resetForm() {
|
|
|
|
|
+ this.form = this.getEmptyTaskForm()
|
|
|
},
|
|
},
|
|
|
- async loadGrowthTasks() {
|
|
|
|
|
- this.growthLoading = true
|
|
|
|
|
|
|
+ async loadTasks() {
|
|
|
|
|
+ this.loading = true
|
|
|
try {
|
|
try {
|
|
|
- const res = await getGrowthTaskList({})
|
|
|
|
|
- if (res.data) {
|
|
|
|
|
- this.growthTaskList = res.data.records || res.data.list || res.data
|
|
|
|
|
|
|
+ const params = {
|
|
|
|
|
+ page: this.filter.page,
|
|
|
|
|
+ size: this.filter.size
|
|
|
}
|
|
}
|
|
|
- } catch (e) {
|
|
|
|
|
- console.error(e)
|
|
|
|
|
- } finally {
|
|
|
|
|
- this.growthLoading = false
|
|
|
|
|
- }
|
|
|
|
|
- },
|
|
|
|
|
- async loadOnboardingConfigs() {
|
|
|
|
|
- this.onboardingLoading = true
|
|
|
|
|
- try {
|
|
|
|
|
- const res = await getOnboardingConfigList()
|
|
|
|
|
- if (res.data) {
|
|
|
|
|
- this.onboardingList = res.data.records || res.data.list || res.data
|
|
|
|
|
|
|
+ if (this.filter.status) {
|
|
|
|
|
+ params.status = this.filter.status
|
|
|
}
|
|
}
|
|
|
|
|
+ const res = await getTaskList(params)
|
|
|
|
|
+ this.tasks = (res.data && res.data.records) || []
|
|
|
|
|
+ this.total = (res.data && res.data.total) || 0
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
- console.error(e)
|
|
|
|
|
|
|
+ this.$message && this.$message.error && this.$message.error('加载任务列表失败')
|
|
|
} finally {
|
|
} finally {
|
|
|
- this.onboardingLoading = false
|
|
|
|
|
|
|
+ this.loading = false
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
- handleCreateTask() {
|
|
|
|
|
- this.isEditTask = false
|
|
|
|
|
- this.taskForm = this.getEmptyTaskForm()
|
|
|
|
|
- this.taskDialogVisible = true
|
|
|
|
|
|
|
+ handleSizeChange(size) {
|
|
|
|
|
+ this.filter.size = size
|
|
|
|
|
+ this.filter.page = 1
|
|
|
|
|
+ this.loadTasks()
|
|
|
|
|
+ },
|
|
|
|
|
+ handlePageChange(page) {
|
|
|
|
|
+ this.filter.page = page
|
|
|
|
|
+ this.loadTasks()
|
|
|
|
|
+ },
|
|
|
|
|
+ openCreate() {
|
|
|
|
|
+ this.editId = null
|
|
|
|
|
+ this.resetForm()
|
|
|
|
|
+ this.dialogVisible = true
|
|
|
},
|
|
},
|
|
|
handleEditTask(row) {
|
|
handleEditTask(row) {
|
|
|
- this.isEditTask = true
|
|
|
|
|
- this.taskForm = {
|
|
|
|
|
- id: row.id,
|
|
|
|
|
- title: row.title,
|
|
|
|
|
- type: row.type,
|
|
|
|
|
- rewardPoints: row.rewardPoints,
|
|
|
|
|
- rewardEnergy: row.rewardEnergy,
|
|
|
|
|
- targetValue: row.targetValue,
|
|
|
|
|
- sortOrder: row.sortOrder,
|
|
|
|
|
- enabled: row.enabled
|
|
|
|
|
|
|
+ this.editId = row.id
|
|
|
|
|
+ this.form = {
|
|
|
|
|
+ name: row.name || '',
|
|
|
|
|
+ type: row.type || 'daily',
|
|
|
|
|
+ dimensionCode: row.dimensionCode || '',
|
|
|
|
|
+ triggerType: row.triggerType || '',
|
|
|
|
|
+ description: row.description || '',
|
|
|
|
|
+ taskValue: row.taskValue ?? null,
|
|
|
|
|
+ sortOrder: row.sortOrder ?? 0,
|
|
|
|
|
+ statusBool: row.status === 'enabled',
|
|
|
|
|
+ dimensionWeights: []
|
|
|
|
|
+ }
|
|
|
|
|
+ this.dialogVisible = true
|
|
|
|
|
+ if (row.id) {
|
|
|
|
|
+ this.loadDimensionWeights(row.id)
|
|
|
}
|
|
}
|
|
|
- this.taskDialogVisible = true
|
|
|
|
|
},
|
|
},
|
|
|
- async handleToggleEnabled(row, val) {
|
|
|
|
|
|
|
+ async loadDimensionWeights(taskId) {
|
|
|
try {
|
|
try {
|
|
|
- await updateGrowthTask(row.id, { enabled: val })
|
|
|
|
|
- this.$message.success(val ? '已启用' : '已禁用')
|
|
|
|
|
|
|
+ const res = await getDimensionWeights('task', taskId)
|
|
|
|
|
+ if (res.data) {
|
|
|
|
|
+ this.form.dimensionWeights = res.data
|
|
|
|
|
+ }
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
- this.$message.error('操作失败')
|
|
|
|
|
- this.loadGrowthTasks()
|
|
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
async handleTaskSubmit() {
|
|
async handleTaskSubmit() {
|
|
|
- if (!this.taskForm.title) {
|
|
|
|
|
- this.$message.warning('请输入任务标题')
|
|
|
|
|
|
|
+ if (!this.form.name) {
|
|
|
|
|
+ this.$message.warning('请填写任务名称')
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
- this.taskSubmitting = true
|
|
|
|
|
|
|
+ this.saving = true
|
|
|
try {
|
|
try {
|
|
|
- if (this.isEditTask) {
|
|
|
|
|
- await updateGrowthTask(this.taskForm.id, {
|
|
|
|
|
- title: this.taskForm.title,
|
|
|
|
|
- type: this.taskForm.type,
|
|
|
|
|
- rewardPoints: this.taskForm.rewardPoints,
|
|
|
|
|
- rewardEnergy: this.taskForm.rewardEnergy,
|
|
|
|
|
- targetValue: this.taskForm.targetValue,
|
|
|
|
|
- sortOrder: this.taskForm.sortOrder,
|
|
|
|
|
- enabled: this.taskForm.enabled
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ const payload = {
|
|
|
|
|
+ name: this.form.name,
|
|
|
|
|
+ type: this.form.type,
|
|
|
|
|
+ dimensionCode: this.form.dimensionCode,
|
|
|
|
|
+ triggerType: this.form.triggerType || null,
|
|
|
|
|
+ description: this.form.description || '',
|
|
|
|
|
+ taskValue: this.form.taskValue,
|
|
|
|
|
+ sortOrder: this.form.sortOrder || 0,
|
|
|
|
|
+ status: this.form.statusBool ? 'enabled' : 'disabled'
|
|
|
|
|
+ }
|
|
|
|
|
+ let taskId = this.editId
|
|
|
|
|
+ if (this.editId) {
|
|
|
|
|
+ payload.id = this.editId
|
|
|
|
|
+ await updateTask(payload)
|
|
|
|
|
+ this.$message.success('更新成功')
|
|
|
} else {
|
|
} else {
|
|
|
- await createGrowthTask({
|
|
|
|
|
- title: this.taskForm.title,
|
|
|
|
|
- type: this.taskForm.type,
|
|
|
|
|
- rewardPoints: this.taskForm.rewardPoints,
|
|
|
|
|
- rewardEnergy: this.taskForm.rewardEnergy,
|
|
|
|
|
- targetValue: this.taskForm.targetValue,
|
|
|
|
|
- sortOrder: this.taskForm.sortOrder,
|
|
|
|
|
- enabled: this.taskForm.enabled
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ const res = await createTask(payload)
|
|
|
|
|
+ if (res.data && res.data.id) {
|
|
|
|
|
+ taskId = res.data.id
|
|
|
|
|
+ }
|
|
|
|
|
+ this.$message.success('创建成功')
|
|
|
}
|
|
}
|
|
|
- this.$message.success('保存成功')
|
|
|
|
|
- this.taskDialogVisible = false
|
|
|
|
|
- this.loadGrowthTasks()
|
|
|
|
|
|
|
+ if (taskId && this.form.dimensionWeights && this.form.dimensionWeights.length) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ await saveDimensionWeights('task', taskId, this.form.dimensionWeights)
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('保存维度权重失败', e)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ this.dialogVisible = false
|
|
|
|
|
+ this.loadTasks()
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
this.$message.error('保存失败')
|
|
this.$message.error('保存失败')
|
|
|
} finally {
|
|
} finally {
|
|
|
- this.taskSubmitting = false
|
|
|
|
|
- }
|
|
|
|
|
- },
|
|
|
|
|
- handleEditOnboarding(row) {
|
|
|
|
|
- this.onboardingForm = {
|
|
|
|
|
- taskType: row.taskType,
|
|
|
|
|
- rewardPoints: row.rewardPoints,
|
|
|
|
|
- rewardEnergy: row.rewardEnergy
|
|
|
|
|
|
|
+ this.saving = false
|
|
|
}
|
|
}
|
|
|
- this.onboardingDialogVisible = true
|
|
|
|
|
},
|
|
},
|
|
|
- async handleOnboardingSubmit() {
|
|
|
|
|
- this.onboardingSubmitting = true
|
|
|
|
|
|
|
+ async toggleStatus(row) {
|
|
|
try {
|
|
try {
|
|
|
- await updateOnboardingConfig({
|
|
|
|
|
- taskType: this.onboardingForm.taskType,
|
|
|
|
|
- rewardPoints: this.onboardingForm.rewardPoints,
|
|
|
|
|
- rewardEnergy: this.onboardingForm.rewardEnergy
|
|
|
|
|
- })
|
|
|
|
|
- this.$message.success('保存成功')
|
|
|
|
|
- this.onboardingDialogVisible = false
|
|
|
|
|
- this.loadOnboardingConfigs()
|
|
|
|
|
|
|
+ const newStatus = row.status === 'enabled' ? 'disabled' : 'enabled'
|
|
|
|
|
+ await toggleTaskStatus(row.id, newStatus)
|
|
|
|
|
+ this.$message.success('状态已更新')
|
|
|
|
|
+ this.loadTasks()
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
- this.$message.error('保存失败')
|
|
|
|
|
- } finally {
|
|
|
|
|
- this.onboardingSubmitting = false
|
|
|
|
|
|
|
+ this.$message.error('状态更新失败')
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ },
|
|
|
|
|
+ created() {
|
|
|
|
|
+ this.loadTasks()
|
|
|
|
|
+ this.resetForm()
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
<style scoped>
|
|
<style scoped>
|
|
|
-.growth-task-management {
|
|
|
|
|
- padding: 20px;
|
|
|
|
|
-}
|
|
|
|
|
-</style>
|
|
|
|
|
|
|
+.growth-task { padding: 20px; }
|
|
|
|
|
+</style>
|