Explorar el Código

Merge remote-tracking branch 'origin/master'

吴树波 hace 1 mes
padre
commit
7e6f356f8e

+ 9 - 0
src/api/course/courseQuestionBank.js

@@ -59,3 +59,12 @@ export function importTemplate() {
     method: 'get'
   })
 }
+
+// 根据ids查询
+export function getByIds(query) {
+  return request({
+    url: '/course/courseQuestionBank/getByIds',
+    method: 'get',
+    params: query
+  })
+}

+ 9 - 0
src/api/course/userCoursePeriod.js

@@ -104,3 +104,12 @@ export function batchSaveRedPacket(data) {
   })
 }
 
+// 获取设置红包金额列表
+export function getPeriodRedPacketList(query) {
+  return request({
+    url: '/course/period/redPacketList',
+    method: 'get',
+    params: query
+  })
+}
+

+ 11 - 2
src/api/course/videoResource.js

@@ -21,13 +21,13 @@ export function getVideoResource(resourceId) {
 export function addVideoResource(data) {
   return request({
     url: '/course/videoResource',
-    method: 'post', 
+    method: 'post',
     data: data
   })
 }
 
 // 修改视频资源
-export function updateVideoResource(data) { 
+export function updateVideoResource(data) {
   return request({
     url: '/course/videoResource',
     method: 'put',
@@ -43,3 +43,12 @@ export function deleteVideoResource(resourceId) {
   })
 }
 
+// 批量新增视频资源
+export function batchAddVideoResource(data) {
+  return request({
+    url: '/course/videoResource/batchAddVideoResource',
+    method: 'post',
+    data: data
+  })
+}
+

+ 136 - 167
src/views/course/userCoursePeriod/index.vue

@@ -162,13 +162,25 @@
                 @click="handleUpdate(scope.row)"
                 v-hasPermi="['course:period:edit']"
               >修改</el-button>
+    <!--              <el-button-->
+    <!--                size="mini"-->
+    <!--                type="text"-->
+    <!--                icon="el-icon-edit"-->
+    <!--                @click="handleCourse(scope.row)"-->
+    <!--                v-hasPermi="['course:period:edit']"-->
+    <!--              >课程管理</el-button>-->
+    <!--              <el-button-->
+    <!--                size="mini"-->
+    <!--                type="text"-->
+    <!--                icon="el-icon-money"-->
+    <!--                @click="setRedPacket(scope.row)"-->
+    <!--              >设置红包</el-button>-->
               <el-button
                 size="mini"
                 type="text"
-                icon="el-icon-edit"
-                @click="handleCourse(scope.row)"
-                v-hasPermi="['course:period:edit']"
-              >课程管理</el-button>
+                icon="el-icon-setting"
+                @click="handlePeriodSettings(scope.row)"
+              >营期相关设置</el-button>
               <el-button
                 size="mini"
                 type="text"
@@ -178,15 +190,15 @@
               >删除</el-button>
             </template>
           </el-table-column>
-        </el-table>
-
-        <pagination
-          v-show="total>0"
-          :total="total"
-          :page.sync="queryParams.pageNum"
-          :limit.sync="queryParams.pageSize"
-          @pagination="getList"
-        />
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
       </el-main>
     </el-container>
 
@@ -283,41 +295,31 @@
       </div>
     </el-drawer>
 
-    <!-- 添加或修改会员营期对话框-->
-    <el-dialog title="课程管理" :visible.sync="course.open" width="75%" top="10px" append-to-body style="padding-bottom: 10px">
-      <el-row :gutter="10" class="mb8">
-        <el-col :span="1.5">
-          <el-button
-            v-if="(getDiff(course.row.periodStartingTime, course.row.periodEndTime) - course.total) > 0"
-            type="primary"
-            icon="el-icon-plus"
-            size="mini"
-            @click="handleAddCourse"
-            v-hasPermi="['course:period:add']"
-          >添加课程</el-button>
-        </el-col>
-      </el-row>
-      <el-table v-loading="course.loading" :data="course.list">
-        <el-table-column label="课程" align="center" prop="courseName" width="180" />
-        <el-table-column label="小节" align="center" prop="videoName" />
-        <el-table-column label="营期时间" align="center" prop="dayDate" width="150"  />
-        <el-table-column label="创建时间" align="center" prop="createTime" width="150" />
-        <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120">
-          <template slot-scope="scope">
-            <el-button
-              size="mini"
-              type="text"
-              icon="el-icon-money"
-              @click="handleSetRedPacket(scope.row)"
-            >设置红包</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-
-      <div slot="footer" class="dialog-footer">
-<!--        <el-button type="primary" @click="saveCourseData">保存</el-button>-->
-      </div>
-    </el-dialog>
+<!--    &lt;!&ndash; 添加或修改会员营期对话框&ndash;&gt;-->
+<!--    <el-dialog title="课程管理" :visible.sync="course.open" width="75%" top="10px" append-to-body style="padding-bottom: 10px">-->
+<!--      <el-row :gutter="10" class="mb8">-->
+<!--        <el-col :span="1.5">-->
+<!--          <el-button-->
+<!--            v-if="(getDiff(course.row.periodStartingTime, course.row.periodEndTime) - course.total) > 0"-->
+<!--            type="primary"-->
+<!--            icon="el-icon-plus"-->
+<!--            size="mini"-->
+<!--            @click="handleAddCourse"-->
+<!--            v-hasPermi="['course:period:add']"-->
+<!--          >添加课程</el-button>-->
+<!--        </el-col>-->
+<!--      </el-row>-->
+<!--      <el-table v-loading="course.loading" :data="course.list">-->
+<!--        <el-table-column label="课程" align="center" prop="courseName" width="180" />-->
+<!--        <el-table-column label="小节" align="center" prop="videoName" />-->
+<!--        <el-table-column label="营期时间" align="center" prop="dayDate" width="150"  />-->
+<!--        <el-table-column label="创建时间" align="center" prop="createTime" width="150" />-->
+<!--      </el-table>-->
+
+<!--      <div slot="footer" class="dialog-footer">-->
+<!--&lt;!&ndash;        <el-button type="primary" @click="saveCourseData">保存</el-button>&ndash;&gt;-->
+<!--      </div>-->
+<!--    </el-dialog>-->
 
     <!-- 添加或修改会员营期对话框-->
     <el-dialog title="添加课程" :visible.sync="course.addOpen" width="500px" append-to-body>
@@ -349,53 +351,72 @@
       </div>
     </el-dialog>
 
-    <!-- 设置红包对话框 -->
-    <el-dialog title="设置红包" :visible.sync="redPacketOpen" width="800px" append-to-body>
-      <el-table :data="redPacketTableData" border>
-        <el-table-column type="index" label="序号" width="60" align="center" />
-        <el-table-column label="公司名称" prop="companyName" align="center" />
-        <el-table-column label="红包金额" align="center">
-          <template slot-scope="scope">
-            <el-input-number
-              v-model="scope.row.amount"
-              :min="0"
-              :precision="2"
-              :step="0.01"
-              size="small"
-              style="width: 150px"
-            >
-              <template slot="append">元</template>
-            </el-input-number>
-          </template>
-        </el-table-column>
-        <el-table-column label="操作" align="center" width="100">
-          <template slot-scope="scope">
-            <el-button
-              size="mini"
-              type="primary"
-              @click="saveRedPacket(scope.row)"
-            >保存</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <div slot="footer" class="dialog-footer">
-        <el-button @click="cancelRedPacket">关 闭</el-button>
-        <el-button type="primary" @click="batchSaveRedPacket">批量保存</el-button>
-      </div>
-    </el-dialog>
+    <red-packet
+      :visible.sync="redPacketVisible"
+      :periodId="currentRedPacketData.periodId"
+      :videoId="currentRedPacketData.videoId"
+      @success="handleRedPacketSuccess"
+    />
+
+    <!-- 营期相关设置抽屉 -->
+  <el-drawer
+    title="营期相关设置"
+    :visible.sync="periodSettingsVisible"
+    direction="rtl"
+    size="70%"
+    :destroy-on-close="true"
+    append-to-body
+    custom-class="period-settings-drawer"
+  >
+    <div class="drawer-content" style="margin-left:25px">
+      <el-tabs v-model="activeTab">
+        <el-tab-pane label="课程管理" name="course">
+          <el-row :gutter="10" class="mb8">
+            <el-col :span="1.5">
+              <el-button
+                v-if="(getDiff(periodSettingsData.periodStartingTime, periodSettingsData.periodEndTime) - course.total) > 0"
+                type="primary"
+                icon="el-icon-plus"
+                size="mini"
+                @click="handleAddCourse"
+                v-hasPermi="['course:period:add']"
+              >添加课程</el-button>
+            </el-col>
+          </el-row>
+          <el-table v-loading="course.loading" :data="course.list">
+            <el-table-column label="课程" align="center" prop="courseName" width="180" />
+            <el-table-column label="小节" align="center" prop="videoName" />
+            <el-table-column label="营期时间" align="center" prop="dayDate" width="150" />
+            <el-table-column label="创建时间" align="center" prop="createTime" width="150" />
+          </el-table>
+        </el-tab-pane>
+        <el-tab-pane label="公司列表" name="company">
+          <red-packet
+            :visible.sync="redPacketVisible"
+            :activeTab="activeTab"
+            :periodId="periodSettingsData.periodId"
+            @success="handleRedPacketSuccess"
+          />
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+  </el-drawer>
 
   </div>
 </template>
 
 <script>
-import {addPeriod, delPeriod, exportPeriod, getPeriod, pagePeriod, updatePeriod, getDays, addCourse, updateListCourseData, getPeriodCompanyList,
-  batchSaveRedPacket} from "@/api/course/userCoursePeriod";
+import {addPeriod, delPeriod, exportPeriod, getPeriod, pagePeriod, updatePeriod, getDays, addCourse, updateListCourseData} from "@/api/course/userCoursePeriod";
 import {getCompanyList} from "@/api/company/company";
 import { listCamp, addCamp, editCamp, delCamp, copyCamp } from "@/api/course/userCourseCamp";
 import { courseList,videoList } from '@/api/course/courseRedPacketLog'
+import RedPacket from './redPacket.vue'
 
 export default {
   name: "Period",
+  components: {
+    RedPacket
+  },
   data() {
     return {
       // 遮罩层
@@ -484,11 +505,20 @@ export default {
       // 加载更多状态
       loadingMore: false,
       // 设置红包对话框
-      redPacketOpen: false,
-      // 红包表格数据
-      redPacketTableData: [],
-      // 营期公司列表
+      redPacketVisible: false,
       periodCompanyList: [],
+      currentRedPacketData: {
+        periodId: '',
+        videoId: ''
+      },
+      // 营期相关设置抽屉
+      periodSettingsVisible: false,
+      activeTab: 'course',
+      periodSettingsData: {},
+      companyList: [],
+      courseDialogVisible: false,
+      redPacketList: [],
+      currentCompany: null
     };
   },
   created() {
@@ -982,7 +1012,7 @@ export default {
     handleAddCourse() {
       this.course.addOpen = true;
       this.course.form = {
-        periodId: this.course.row.periodId,
+        periodId: this.course.queryParams.periodId,
         courseId: null,
         videoIds: []
       };
@@ -1030,87 +1060,26 @@ export default {
         this.getCourseList();
       });
     },
-    /** 设置红包按钮操作 */
-    handleSetRedPacket(row) {
-      this.redPacketOpen = true;
-      // 获取营期公司金额列表
-      getPeriodCompanyList({ periodId: this.course.row.periodId, videoId: row.videoId }).then(response => {
-        this.periodCompanyList = response.data || [];
-        // 初始化表格数据
-        this.redPacketTableData = this.periodCompanyList.map(company => ({
-          companyId: company.companyId,
-          companyName: company.companyName,
-          amount: company.amount,
-          videoId: row.videoId,
-          periodId: this.course.row.periodId
-        }));
-      });
-    },
-    /** 取消设置红包 */
-    cancelRedPacket() {
-      this.redPacketOpen = false;
-      this.redPacketTableData = [];
-      this.periodCompanyList = [];
+    setRedPacket(row) {
+      this.currentRedPacketData = {
+        periodId: row.periodId
+        // videoId: row.videoId
+      };
+      this.redPacketVisible = true;
     },
-    /** 保存单个红包设置 */
-    saveRedPacket(row) {
-      if (row.amount <= 0) {
-        this.$message.warning('请输入红包金额');
-        return;
-      }
-
-      const saveData = [{
-        companyId: row.companyId,
-        redPacketMoney: row.amount,
-        videoId: row.videoId,
-        periodId: row.periodId,
-        dataType: 2
-      }];
-
-      // 调用保存接口
-      batchSaveRedPacket(saveData).then(response => {
-        if (response.code === 200) {
-          this.$message.success('保存成功');
-          // 刷新课程列表
-          this.getCourseList();
-        } else {
-          this.$message.error(response.msg || "保存失败");
-        }
-      }).catch(error => {
-        this.$message.error("保存失败:" + error.message);
-      });
+    handleRedPacketSuccess() {
+      this.getCourseList();
     },
-    /** 批量保存红包设置 */
-    batchSaveRedPacket() {
-      // 过滤出有设置金额的数据,并转换数据结构
-      const saveData = this.redPacketTableData
-        .filter(item => item.amount > 0)
-        .map(item => ({
-          companyId: item.companyId,
-          redPacketMoney: item.amount,
-          videoId: item.videoId,
-          periodId: item.periodId,
-          dataType: 2
-        }));
-
-      if (saveData.length === 0) {
-        this.$message.warning('请至少设置一个红包金额');
-        return;
+    handlePeriodSettings(row) {
+      this.periodSettingsData = row;
+      this.periodSettingsVisible = true;
+      // 初始化课程列表
+      this.course.queryParams.periodId = row.periodId;
+      this.getCourseList();
+      // 如果是公司列表tab,显示红包设置
+      if (this.activeTab === 'company') {
+        this.redPacketVisible = true;
       }
-
-      // 调用批量保存接口
-      batchSaveRedPacket(saveData).then(response => {
-        if (response.code === 200) {
-          this.$message.success('批量保存成功');
-          this.redPacketOpen = false;
-          // 刷新课程列表
-          this.getCourseList();
-        } else {
-          this.$message.error(response.msg || "保存失败");
-        }
-      }).catch(error => {
-        this.$message.error("保存失败:" + error.message);
-      });
     },
   },
 };

+ 167 - 0
src/views/course/userCoursePeriod/redPacket.vue

@@ -0,0 +1,167 @@
+<template>
+  <div>
+    <!-- 公司列表弹窗 -->
+<!--    <el-dialog title="设置红包" :visible.sync="companyDialogVisible" width="800px" append-to-body>-->
+      <el-table :data="companyList" border>
+        <el-table-column type="index" label="序号" width="60" align="center" />
+        <el-table-column label="公司名称" prop="companyName" align="center" />
+        <el-table-column label="操作" align="center" width="120">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              @click="handleInputAmount(scope.row)"
+            >录入金额</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+<!--      <div slot="footer" class="dialog-footer">-->
+<!--      </div>-->
+<!--    </el-dialog>-->
+
+    <!-- 课程红包设置弹窗 -->
+    <el-dialog title="设置红包金额" :visible.sync="courseDialogVisible" width="1200px" append-to-body>
+      <el-table :data="redPacketList" border>
+        <el-table-column type="index" label="序号" width="60" align="center" />
+        <el-table-column label="课程" prop="courseName" align="center" />
+        <el-table-column label="小节" prop="videoName" align="center" />
+        <el-table-column label="红包金额" width="200px" align="center">
+          <template slot-scope="scope">
+            <el-input-number
+              v-model="scope.row.amount"
+              :min="0"
+              :precision="2"
+              :step="0.01"
+              size="small"
+              style="width: 150px"
+            >
+              <template slot="append">元</template>
+            </el-input-number>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="courseDialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="handleSave">保 存</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getPeriodCompanyList, getDays, batchSaveRedPacket, getPeriodRedPacketList } from "@/api/course/userCoursePeriod";
+import redPacket from "@/views/course/userCoursePeriod/redPacket.vue";
+
+export default {
+  name: "RedPacket",
+  computed: {
+    // redPacket() {
+    //   return redPacket
+    // }
+  },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    activeTab: {
+      type: String,
+      default: ''
+    },
+    periodId: {
+      type: [String, Number],
+      default: ''
+    },
+    // videoId: {
+    //   type: [String, Number],
+    //   default: ''
+    // }
+  },
+  data() {
+    return {
+      // companyDialogVisible: false,
+      activeTab: '',
+      courseDialogVisible: false,
+      companyList: [],
+      redPacketList: [],
+      currentCompany: null
+    };
+  },
+  watch: {
+    activeTab(val) {
+      this.activeTab = val;
+      if (val) {
+        this.getCompanyList();
+      }
+    },
+    companyDialogVisible(val) {
+      if (!val) {
+        this.$emit('update:visible', false);
+      }
+    }
+  },
+  methods: {
+    // 获取公司列表
+    getCompanyList() {
+      getPeriodCompanyList({
+        periodId: this.periodId
+      }).then(response => {
+        this.companyList = response.data || [];
+      });
+    },
+    // 点击录入金额
+    handleInputAmount(row) {
+      this.currentCompany = row;
+      this.courseDialogVisible = true;
+      this.getCourseList();
+    },
+    // 获取课程列表
+    getCourseList() {
+      getPeriodRedPacketList({
+        periodId: this.periodId,
+        companyId: this.currentCompany.companyId
+      }).then(response => {
+        this.redPacketList = (response.data || []).map(item => ({
+          ...item,
+          amount: item.amount || 0
+        }));
+      });
+    },
+    // 保存红包金额
+    handleSave() {
+      const saveData = this.redPacketList
+        .filter(item => item.amount > 0)
+        .map(item => ({
+          companyId: this.currentCompany.companyId,
+          redPacketMoney: item.amount,
+          videoId: item.videoId,
+          periodId: this.periodId,
+          dataType: 2
+        }));
+
+      if (saveData.length === 0) {
+        this.$message.warning('请至少设置一个红包金额');
+        return;
+      }
+
+      batchSaveRedPacket(saveData).then(response => {
+        if (response.code === 200) {
+          this.$message.success('保存成功');
+          this.courseDialogVisible = false;
+          this.$emit('success');
+        } else {
+          this.$message.error(response.msg || "保存失败");
+        }
+      }).catch(error => {
+        this.$message.error("保存失败:" + error.message);
+      });
+    }
+  }
+};
+</script>
+
+<style scoped>
+.el-input-number {
+  width: 100%;
+}
+</style>

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1189 - 70
src/views/course/videoResource/index.vue


+ 3 - 1
src/views/statistics/index.vue

@@ -193,7 +193,7 @@
                 </div>
                 <div class="card-row">
                   <span>视频完播率</span>
-                  <span class="highlight">{{watchRate}}</span>
+                  <span class="highlight">{{watchRate}}%</span>
                 </div>
               </div>
             </div>
@@ -873,6 +873,7 @@ export default {
           this.correctRate = res.data.correctRate;
           this.rewardCount = res.data.rewardCount;
           this.rewardMoney = res.data.rewardMoney;
+          this.watchRate = res.data.watchRate;
         }
       })
       smsBalance().then(res=>{
@@ -1019,6 +1020,7 @@ export default {
           this.correctRate = res.data.correctRate;
           this.rewardCount = res.data.rewardCount;
           this.rewardMoney = res.data.rewardMoney;
+          this.watchRate = res.data.watchRate;
         }
       })
 

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio