瀏覽代碼

feat: 提交积分规则的详情接口对接

xyh 5 月之前
父節點
當前提交
2c13557a39

+ 12 - 0
src/api/points/rules_api.js

@@ -23,6 +23,18 @@ export function getActivityList(query) {
   })
 }
 
+/**
+ * 根据id获取积分活动详情
+ * @param {Object} query - 查询参数对象,包含查询条件
+ */
+export function getActivityById(query) {
+  console.log(query)
+  return request({
+    url: '/point/activity/'+query.id,
+    method: 'get',
+  })
+}
+
 /**
  * 获取单一活动统计信息
  * @param {Object} query - 查询参数对象,包含查询条件

+ 104 - 95
src/views/pointsManagement/pointsRules/compontents/Activity_editBox.vue

@@ -5,7 +5,7 @@
     width="900px"
     :before-close="handleClose"
     custom-class="activity-edit-dialog">
-
+{{form}}
     <el-form :model="form" :rules="rules" ref="formRef" label-width="140px" class="activity-form">
       <el-row :gutter="20">
         <el-col :span="12">
@@ -22,27 +22,27 @@
 
       <el-row :gutter="20">
         <el-col :span="12">
-          <el-form-item label="活动城市" prop="city">
-             <DictSelect v-model="form.city" :dictOptions="cityOptions" placeholder="请选择" :disabled="type === 'view'"/>
+          <el-form-item label="活动城市" prop="cityCode">
+             <DictSelect v-model="form.cityCode" :dictOptions="cityOptions" placeholder="请选择" :disabled="type === 'view'"/>
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="活动类型" prop="activityType">
-            <DictSelect v-model="form.activityType" :dictOptions="activityTypeOption" placeholder="请选择" :disabled="type === 'view'" @change="handleActivityTypeChange"/>
+            <DictSelect v-model="form.activityType.toString()" :dictOptions="activityTypeOption" placeholder="请选择" :disabled="type === 'view'" @change="handleActivityTypeChange"/>
           </el-form-item>
         </el-col>
       </el-row>
 
       <el-row :gutter="20">
         <el-col :span="12">
-          <el-form-item label="活动时间" prop="isLongTerm">
-            <el-radio-group v-model="form.isLongTerm" :disabled="type === 'view'">
-              <el-radio label="1">长期有效</el-radio>
-              <el-radio label="2">指定时间</el-radio>
+          <el-form-item label="活动时间" prop="isPermanent">
+            <el-radio-group v-model="form.isPermanent" :disabled="type === 'view'">
+              <el-radio :label="1">长期有效</el-radio>
+              <el-radio :label="0">指定时间</el-radio>
             </el-radio-group>
           </el-form-item>
         </el-col>
-        <el-col :span="12" v-if="form.isLongTerm === '2'">
+        <el-col :span="12" v-if="form.isPermanent == '0'">
            <el-form-item label="指定时间" prop="dateRange">
               <el-date-picker
                 v-model="form.dateRange"
@@ -60,36 +60,36 @@
       </el-row>
 
       <!-- 签到活动特有的内容 -->
-      <template v-if="form.activityType === '1'">
+      <template v-if="form.activityType == '0'">
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="每日签到基础积分" prop="dailyBasePoints">
-              <el-input v-model="form.dailyBasePoints" type="number" placeholder="请输入" :disabled="type === 'view'"></el-input>
+            <el-form-item label="每日签到基础积分" prop="basePoints">
+              <el-input v-model="form.basePoints" type="number" placeholder="请输入" :disabled="type === 'view'"></el-input>
             </el-form-item>
           </el-col>
         </el-row>
 
         <el-row :gutter="20">
           <el-col :span="24">
-            <el-form-item label="连续签到加成" prop="consecutiveBonus">
-              <el-table :data="form.consecutiveBonus" style="width: 100%" :disabled="type === 'view'" size="mini">
-                <el-table-column prop="period" label="连续签到周期(天)">
+            <el-form-item label="连续签到加成" prop="signRewardList">
+              <el-table :data="form.signRewardList" style="width: 100%" :disabled="type === 'view'" size="mini">
+                <el-table-column prop="continueDays" label="连续签到周期(天)">
                   <template slot-scope="scope">
                     <span v-if="type === 'view'">
-                      {{ scope.row.period }}天
+                      {{ scope.row.continueDays }}天
                     </span>
-                    <el-input v-else v-model="scope.row.period" type="number" placeholder="天数" @blur="updatePeriod(scope.$index, scope.row.period)"></el-input>
+                    <el-input v-else v-model="scope.row.continueDays" type="number" placeholder="天数" @blur="updatePeriod(scope.$index, scope.row.continueDays)"></el-input>
                   </template>
                 </el-table-column>
-                <el-table-column prop="points" label="连续签到积分">
+                <el-table-column prop="rewardPoints" label="连续签到积分">
                   <template slot-scope="scope">
                     <span v-if="type === 'view'">
-                      {{ scope.row.points }}
+                      {{ scope.row.rewardPoints }}
                     </span>
-                    <el-input v-else v-model="scope.row.points" type="number" placeholder="积分"></el-input>
+                    <el-input v-else v-model="scope.row.rewardPoints" type="number" placeholder="积分"></el-input>
                   </template>
                 </el-table-column>
-                <el-table-column prop="points" label="说明" width="280">
+                <el-table-column label="说明" width="280">
                   <template slot-scope="scope">
                     {{ getDescription(scope.$index) }}
                   </template>
@@ -97,7 +97,7 @@
                 <el-table-column width="50">
                   <template slot="header" slot-scope="scope">
                     <span>
-                      <el-button v-if="type !== 'view' && form.consecutiveBonus.length < 5" type="text" size="medium" @click="addPeriod" title="添加周期">
+                      <el-button v-if="type !== 'view' && form.signRewardList.length < 5" type="text" size="medium" @click="addPeriod" title="添加周期">
                         <i class="el-icon-circle-plus-outline"></i>
                       </el-button>
                     </span>
@@ -116,11 +116,11 @@
         <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="断签规则">
-              <el-radio-group v-model="form.breakRule" :disabled="type === 'view'">
-                <el-radio label="reset">
+              <el-radio-group v-model="form.breakRule.toString()" :disabled="type === 'view'">
+                <el-radio label="0">
                   断签重置
                 </el-radio>
-                <el-radio label="keep">
+                <el-radio label="1">
                   保留进度
                 </el-radio>
               </el-radio-group>
@@ -133,46 +133,51 @@
       <template v-else>
         <el-row :gutter="20">
           <el-col :span="24">
-            <el-form-item label="任务列表" prop="tasks">
-              <el-table :data="form.tasks" style="width: 100%" :disabled="type === 'view'" size="medium">
+            <el-form-item label="任务列表" prop="activityTaskList">
+              <el-table :data="form.activityTaskList" style="width: 100%" :disabled="type === 'view'" size="medium">
                 <el-table-column prop="taskName" label="任务名称" width="150">
                   <template slot-scope="scope">
                     <span>{{ scope.row.taskName }}</span>
                   </template>
                 </el-table-column>
-                <el-table-column prop="triggerCondition" label="触发条件" width="200">
+                <el-table-column prop="triggerValue" label="触发条件" width="200">
                   <template slot-scope="scope">
                     <span v-if="type === 'view'">
-                      {{ scope.row.triggerCondition }}
+                      <span v-if="scope.row.taskName === '分享服务号' || scope.row.taskName === '浏览动态' || scope.row.taskName === '浏览商户'">
+                        点击
+                      </span>
+                       <template v-else>
+                          <span style="margin-right: 5px;">&gt;=</span> {{ scope.row.triggerValue }}
+                       </template>
                     </span>
                     <template v-else>
                       <span v-if="scope.row.taskName === '分享服务号' || scope.row.taskName === '浏览动态' || scope.row.taskName === '浏览商户'">
                         点击
                       </span>
                       <span v-else style="display: flex; align-items: center;">
-                        <template v-if="scope.row.isEnabled">
+                        <template v-if="scope.row.status == 0">
                            <span style="margin-right: 5px;">&gt;=</span>
-                          <el-input v-model="scope.row.triggerCondition" type="number" placeholder="请输入" style="width: 80px"></el-input>
+                          <el-input v-model="scope.row.triggerValue" type="number" placeholder="请输入" style="width: 80px"></el-input>
                         </template>
                         <span v-else>--</span>
                       </span>
                     </template>
                   </template>
                 </el-table-column>
-                <el-table-column prop="points" label="积分">
+                <el-table-column prop="rewardPoints" label="积分">
                   <template slot-scope="scope">
-                    <span v-if="type === 'view'">{{ scope.row.points }}</span>
+                    <span v-if="type === 'view'">{{ scope.row.rewardPoints }}</span>
                     <template v-else>
-                      <el-input v-if="scope.row.isEnabled" v-model="scope.row.points" type="number" placeholder="请输入"></el-input>
+                      <el-input v-if="scope.row.status == 0" v-model="scope.row.rewardPoints" type="number" placeholder="请输入"></el-input>
                       <span v-else>--</span>
                     </template>
                   </template>
                 </el-table-column>
-                <el-table-column prop="limit" label="次数限制" width="120">
+                <el-table-column prop="frequencyLimitValue" label="次数限制" width="120">
                   <template slot-scope="scope">
-                    <span v-if="type === 'view'">{{ scope.row.limit }}</span>
+                    <span v-if="type === 'view'">{{ scope.row.frequencyLimitValue }}</span>
                     <template v-else>
-                      <el-select v-if="scope.row.isEnabled" v-model="scope.row.limit" placeholder="请选择">
+                      <el-select v-if="scope.row.status == 0" v-model="scope.row.frequencyLimitValue" placeholder="请选择">
                         <el-option label="无限制" value="无限制"></el-option>
                         <el-option label="每日1次" value="每日1次"></el-option>
                         <el-option label="每周1次" value="每周1次"></el-option>
@@ -184,7 +189,8 @@
                 </el-table-column>
                 <el-table-column label="是否开启" width="120">
                   <template slot-scope="scope">
-                    <el-switch v-model="scope.row.isEnabled" :disabled="type === 'view'"></el-switch>
+                    <el-switch v-model="scope.row.status" active-value="0"
+                               inactive-value="1" :disabled="type === 'view'"></el-switch>
                   </template>
                 </el-table-column>
               </el-table>
@@ -206,6 +212,7 @@
 </template>
 
 <script>
+import { getActivityById } from "@/api/points/rules_api";
 export default {
   name: "Activity_editBox",
   props: ['activityTypeOption', 'cityOptions'],
@@ -217,18 +224,18 @@ export default {
       form: {
         name: '',
         description: '',
-        city: '',
+        cityCode: '',
         activityType: '',
-        isLongTerm: '',
+        isPermanent: '',
         startTime: '',
         endTime: '',
         dateRange: '',
-        dailyBasePoints: '',
-        consecutiveBonus: [
-          { period: '3', points: '' },
+        basePoints: '',
+        signRewardList: [
+          { continueDays: '3', rewardPoints: '' },
         ],
-        breakRule: 'reset', // reset: 断签重置, keep: 保留进度
-        tasks: []
+        breakRule: '0', // 0: 断签重置, 1: 保留进度
+        activityTaskList: []
       },
       pickerOptions: {
         onPick: ({ maxDate, minDate }) => {
@@ -257,13 +264,13 @@ export default {
           { required: true, message: '请输入活动简述', trigger: 'blur' },
           { min: 2, max: 30, message: '请输入2-30个字符', trigger: 'blur' }
         ],
-        city: [
+        cityCode: [
           { required: true, message: '请选择活动城市', trigger: 'change' }
         ],
         activityType: [
           { required: true, message: '请选择活动类型', trigger: 'change' }
         ],
-        dailyBasePoints: [
+        basePoints: [
           { required: true, message: '请输入基础积分', trigger: 'blur' },
           { validator: (rule, value, callback) => {
               if (Number(value) < 0) {
@@ -275,7 +282,7 @@ export default {
             trigger: 'blur'
           }
         ],
-        consecutiveBonus: [
+        signRewardList: [
           { validator: (rule, value, callback) => {
               if (!value || value.length === 0) {
                 callback(new Error('请添加连续签到加成'));
@@ -284,11 +291,11 @@ export default {
 
               for (let i = 0; i < value.length; i++) {
                 const bonus = value[i];
-                if (!bonus.period || Number(bonus.period) <= 0) {
+                if (!bonus.period || Number(bonus.continueDays) <= 0) {
                   callback(new Error('连续签到周期必须大于0'));
                   return;
                 }
-                if (!bonus.points || Number(bonus.points) <= 0) {
+                if (!bonus.rewardPoints || Number(bonus.rewardPoints) <= 0) {
                   callback(new Error('连续签到积分必须大于0'));
                   return;
                 }
@@ -296,8 +303,8 @@ export default {
 
               // 检查连续签到周期总和是否超过活动总天数
               const totalDays = this.getTotalDays();
-              if (this.form.isLongTerm === '2' && totalDays > 0) {
-                const totalPeriod = value.reduce((sum, item) => sum + Number(item.period), 0);
+              if (this.form.isPermanent == '0' && totalDays > 0) {
+                const totalPeriod = value.reduce((sum, item) => sum + Number(item.continueDays), 0);
                 if (totalPeriod > totalDays) {
                   callback(new Error('连续签到周期总和不能超过活动总天数'));
                   return;
@@ -312,19 +319,19 @@ export default {
         dateRange: [
           { required: true, message: '请选择活动时间', trigger: 'change' }
         ],
-        tasks: [
+        activityTaskList: [
           { validator: (rule, value, callback) => {
               for (let i = 0; i < value.length; i++) {
                 const task = value[i];
                 // 只在任务开启的情况下才校验
-                if (task.isEnabled) {
+                if (task.status == '0') {
                   // 验证完成订单和充值任务的触发条件
-                  if ((task.taskName === '完成订单' || task.taskName === '充值任务') && (!task.triggerCondition || Number(task.triggerCondition) <= 0)) {
+                  if ((task.taskName === '完成订单' || task.taskName === '充值任务') && (!task.triggerValue || Number(task.triggerValue) <= 0)) {
                     callback(new Error('触发条件必须大于0'));
                     return;
                   }
                   // 验证所有任务的积分
-                  if (!task.points || Number(task.points) <= 0) {
+                  if (!task.rewardPoints || Number(task.rewardPoints) <= 0) {
                     callback(new Error('积分必须大于0'));
                     return;
                   }
@@ -339,33 +346,35 @@ export default {
     }
   },
   methods: {
+    async getActivityInfo(row) {
+      const res = await getActivityById({id: row.id});
+      return res.data.detail;
+    },
     getDefaultTasks() {
       return [
-        { taskName: '完成订单', triggerCondition: '', points: '', limit: '无限制', isEnabled: false },
-        { taskName: '充值任务', triggerCondition: '', points: '', limit: '无限制', isEnabled: false },
-        { taskName: '分享服务号', triggerCondition: '点击', points: '', limit: '无限制', isEnabled: false },
-        { taskName: '浏览动态', triggerCondition: '点击', points: '', limit: '无限制', isEnabled: false },
-        { taskName: '浏览商户', triggerCondition: '点击', points: '', limit: '无限制', isEnabled: false }
+        { taskName: '完成订单', triggerValue: '', rewardPoints: '', frequencyLimitValue: '无限制', status: '1' },
+        { taskName: '充值任务', triggerValue: '', rewardPoints: '', frequencyLimitValue: '无限制', status: '1' },
+        { taskName: '分享服务号', triggerValue: '点击', rewardPoints: '', frequencyLimitValue: '无限制', status: '1' },
+        { taskName: '浏览动态', triggerValue: '点击', rewardPoints: '', frequencyLimitValue: '无限制', status: '1' },
+        { taskName: '浏览商户', triggerValue: '点击', rewardPoints: '', frequencyLimitValue: '无限制', status: '1' }
       ];
     },
     getTotalDays() {
-      if (this.form.isLongTerm === '2' && this.form.startTime && this.form.endTime) {
+      if (this.form.isPermanent == '0' && this.form.startTime && this.form.endTime) {
         const start = new Date(this.form.startTime);
         const end = new Date(this.form.endTime);
         return Math.floor((end - start) / (1000 * 60 * 60 * 24)) + 1;
       }
       return 0;
     },
-    getRow(row, type) {
+    async getRow(row, type) {
       /** type ==== 添加:add 复制:copy 编辑:edit 查看:view */
       this.type = type;
       this.resetForm();
-      if (row) {
-        if (type === 'copy') {
-          this.form = {...row, id: ''};
-        } else if (type === 'edit' || type === 'view') {
-          this.form = { ...row };
-        }
+      if (type !== 'add') {
+        const data = await this.getActivityInfo(row);
+        this.form = type === 'copy' ? {...data, id: ''} : {...data};
+        this.form.dateRange = [this.form.startTime, this.form.endTime];
       }
       this.pointsActivity = true;
     },
@@ -376,18 +385,18 @@ export default {
       this.form = {
         name: '',
         description: '',
-        city: '',
-        activityType: '1',
-        isLongTerm: '1',
+        cityCode: '',
+        activityType: '0',
+        isPermanent: '1',
         startTime: '',
         endTime: '',
         dateRange: '',
-        dailyBasePoints: '',
-        consecutiveBonus: [
-          { period: '3', points: '' },
+        basePoints: '',
+        signRewardList: [
+          { continueDays: '3', rewardPoints: '' },
         ],
-        breakRule: 'reset',
-        tasks: this.getDefaultTasks()
+        breakRule: '0',
+        activityTaskList: this.getDefaultTasks()
       };
     },
     handleDateChange(val) {
@@ -401,56 +410,56 @@ export default {
       this.handleActivityTypeChange();
     },
     deletePeriod(index) {
-      if (this.form.consecutiveBonus.length <= 1) {
+      if (this.form.signRewardList.length <= 1) {
         this.$message.warning('至少保留一个连续签到周期');
         return;
       }
-      this.form.consecutiveBonus.splice(index, 1);
+      this.form.signRewardList.splice(index, 1);
     },
     handleActivityTypeChange() {
       // 重置相关内容
-      if (this.form.activityType === '1') {
+      if (this.form.activityType == '0') {
         // 签到活动
-        this.form.dailyBasePoints = '';
-        this.form.consecutiveBonus = [
-          { period: '3', points: ''},
+        this.form.basePoints = '';
+        this.form.signRewardList = [
+          { continueDays: '3', rewardPoints: ''},
         ];
-        this.form.breakRule = 'reset';
+        this.form.breakRule = '0';
       } else {
         // 其他活动
-        this.form.tasks = this.getDefaultTasks();
+        this.form.activityTaskList = this.getDefaultTasks();
       }
     },
     addPeriod() {
       const totalDays = this.getTotalDays();
-      const currentTotalPeriod = this.form.consecutiveBonus.reduce((sum, item) => {
-        return sum + (Number(item.period) || 0);
+      const currentTotalPeriod = this.form.signRewardList.reduce((sum, item) => {
+        return sum + (Number(item.continueDays) || 0);
       }, 0);
 
-      if (this.form.isLongTerm === '2' && totalDays > 0 && currentTotalPeriod >= totalDays) {
+      if (this.form.isPermanent == '0' && totalDays > 0 && currentTotalPeriod >= totalDays) {
         this.$message.warning('连续签到周期总和不能超过活动总天数');
         return;
       }
 
-      this.form.consecutiveBonus.push({
-        period: '',
-        points: ''
+      this.form.signRewardList.push({
+        continueDays: '',
+        rewardPoints: ''
       });
     },
     updatePeriod(index, value) {
       // 触发表单验证
-      this.$refs.formRef.validateField('consecutiveBonus');
+      this.$refs.formRef.validateField('signRewardList');
     },
     getDescription(index) {
       let totalPeriodDays = 0;
       let totalPoints = 0;
 
       for (let i = 0; i <= index; i++) {
-        totalPeriodDays += Number(this.form.consecutiveBonus[i].period) || 0;
-        totalPoints += Number(this.form.consecutiveBonus[i].points) || 0;
+        totalPeriodDays += Number(this.form.signRewardList[i].continueDays) || 0;
+        totalPoints += Number(this.form.signRewardList[i].rewardPoints) || 0;
       }
 
-      const basePoints = Number(this.form.dailyBasePoints) || 0;
+      const basePoints = Number(this.form.basePoints) || 0;
       const finalPoints = totalPoints + basePoints;
 
       if (!totalPeriodDays || !finalPoints) {

+ 4 - 0
src/views/pointsManagement/pointsRules/index.vue

@@ -200,6 +200,10 @@ export default {
     },
     /** 添加:add 复制:copy 编辑:edit 查看:view */
     handleRule(row,type) {
+      if (type === 'edit' && row.status === '1') {
+        this.$message.warning('活动进行中,不可编辑');
+        return;
+      }
       this.$refs.activityEditBoxRef?.getRow(row,type);
     },
     /** 积分时效 */