Jelajahi Sumber

feat(sopTemp): 新增红包设置功能

新增sop模板红包设置接口和前端页面。
修改课程目录,增加批量添加视频功能。
新增公司SOP权限管理功能。
修改系统配置,增加红包金额配置项。
吴树波 1 bulan lalu
induk
melakukan
fc3a4c930a

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

@@ -41,6 +41,15 @@ export function updates(data) {
   })
 }
 
+// 新增课堂视频
+export function batchSaveVideo(data) {
+  return request({
+    url: '/course/userCourseVideo/batchSaveVideo',
+    method: 'post',
+    data: data
+  })
+}
+
 // 修改课堂视频
 export function updateUserCourseVideo(data) {
   return request({

+ 16 - 0
src/api/qw/sopTemp.js

@@ -8,6 +8,14 @@ export function listSopTemp(query) {
     params: query
   })
 }
+// 查询sop模板列表
+export function redList(id) {
+  return request({
+    url: '/qw/sopTemp/redList',
+    method: 'get',
+    params: {id}
+  })
+}
 
 // 查询sop模板详细
 export function getSopTemp(id) {
@@ -57,6 +65,14 @@ export function addSopTemp(data) {
   })
 }
 // 新增sop模板
+export function updateRedPackage(data) {
+  return request({
+    url: '/qw/sopTemp/updateRedPackage',
+    method: 'post',
+    data: data
+  })
+}
+// 新增sop模板
 export function addTemp(data) {
   return request({
     url: '/qw/sopTemp/add',

+ 53 - 0
src/api/sop/companySopRole.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询公司SOP权限列表
+export function listCompanySopRole(query) {
+  return request({
+    url: '/sop/companySopRole/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询公司SOP权限详细
+export function getCompanySopRole(id) {
+  return request({
+    url: '/sop/companySopRole/' + id,
+    method: 'get'
+  })
+}
+
+// 新增公司SOP权限
+export function addCompanySopRole(data) {
+  return request({
+    url: '/sop/companySopRole',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改公司SOP权限
+export function updateCompanySopRole(data) {
+  return request({
+    url: '/sop/companySopRole',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除公司SOP权限
+export function delCompanySopRole(id) {
+  return request({
+    url: '/sop/companySopRole/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出公司SOP权限
+export function exportCompanySopRole(query) {
+  return request({
+    url: '/sop/companySopRole/export',
+    method: 'get',
+    params: query
+  })
+}

+ 113 - 7
src/views/components/course/userCourseCatalogDetails.vue

@@ -37,6 +37,14 @@
           @click="openUpdates"
         >修改时间</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          size="mini"
+          @click="openAdds"
+        >批量添加</el-button>
+      </el-col>
       <el-col :span="1.5">
         <el-button
           type="danger"
@@ -224,19 +232,80 @@
     <el-dialog :title="questionBank.title" :visible.sync="questionBank.open" width="800px" append-to-body >
       <question-bank ref="questionBank" @questionBankResult="questionBankResult" ></question-bank>
     </el-dialog>
+    <el-dialog title="视频库选择" :visible.sync="addBatchData.open" width="900px" append-to-body>
+      <!-- 搜索条件 -->
+      <el-form :inline="true" :model="addBatchData.queryParams" class="library-search">
+        <el-form-item label="素材名称">
+          <el-input
+            v-model="addBatchData.queryParams.resourceName"
+            placeholder="请输入素材名称"
+            clearable
+            size="small"
+            @keyup.enter.native="resourceList"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" size="mini" @click="resourceList">搜索</el-button>
+        </el-form-item>
+      </el-form>
+
+      <!-- 视频列表 -->
+      <el-table v-loading="addBatchData.loading" :data="addBatchData.list" @selection-change="handVideoleSelectionChange" height="400px">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="素材名称" align="center" prop="resourceName" />
+        <el-table-column label="文件名称" align="center" prop="fileName" />
+        <el-table-column label="缩略图" align="center">
+          <template slot-scope="scope">
+            <el-popover
+              placement="right"
+              title=""
+              trigger="hover"
+            >
+              <img alt="" slot="reference" :src="scope.row.thumbnail" style="width: 80px; height: 50px" />
+              <img alt="" :src="scope.row.thumbnail" style="max-width: 150px;" />
+            </el-popover>
+          </template>
+        </el-table-column>
+        <el-table-column label="视频时长" align="center">
+          <template slot-scope="scope">
+            <span>{{ formatDuration(scope.row.duration) }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 分页 -->
+      <pagination
+        v-show="addBatchData.total>0"
+        :total="addBatchData.total"
+        :page.sync="addBatchData.queryParams.pageNum"
+        :limit.sync="addBatchData.queryParams.pageSize"
+        @pagination="resourceList"
+      />
+
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="batchVideoSave">确 定</el-button>
+      </div>
+    </el-dialog>
 
   </div>
 </template>
 
 <script>
-import { getSort,getVideoListByCourseId,delUserCourseVideo,getUserCourseVideo,addUserCourseVideo,updateUserCourseVideo, updates } from "@/api/course/userCourseVideo";
-import {getSignature,uploadHuaWeiVod,uploadHuaWeiObs} from "@/api/common"
-import  QuestionBank from  "@/views/course/courseQuestionBank/QuestionBank.vue";
-import TcVod from 'vod-js-sdk-v6'
-import request from '@/utils/request'
-import {uploadObject} from "@/utils/cos";
+import {
+  addUserCourseVideo,
+  delUserCourseVideo,
+  getSort,
+  getUserCourseVideo,
+  getVideoListByCourseId,
+  updates,
+  batchSaveVideo,
+  updateUserCourseVideo
+} from "@/api/course/userCourseVideo";
+import QuestionBank from "@/views/course/courseQuestionBank/QuestionBank.vue";
 import VideoUpload from "@/components/VideoUpload/index.vue";
-  export default {
+import { listVideoResource } from '@/api/course/videoResource';
+
+export default {
     name: "userCourseCatalog",
     components: {VideoUpload,QuestionBank},
     data() {
@@ -286,6 +355,17 @@ import VideoUpload from "@/components/VideoUpload/index.vue";
           courseId:null,
           title:null
         },
+        addBatchData: {
+          open: false,
+          loading: true,
+          form: {},
+          select: [],
+          total:0,
+          queryParams: {
+            pageNum: 1,
+            pageSize: 10,
+          },
+        },
         // 显示搜索条件
         showSearch: true,
         // 遮罩层
@@ -517,6 +597,10 @@ import VideoUpload from "@/components/VideoUpload/index.vue";
         this.single = selection.length!==1
         this.multiple = !selection.length
       },
+      // 多选框选中数据
+      handVideoleSelectionChange(selection) {
+        this.addBatchData.select = selection.map(item => item.id);
+      },
       handleAdd(){
         this.reset();
         this.form.courseId = this.courseId;
@@ -641,6 +725,28 @@ import VideoUpload from "@/components/VideoUpload/index.vue";
             this.msgSuccess("删除成功");
           }).catch(() => {});
       },
+      openAdds(){
+        this.addBatchData.open = true;
+        this.addBatchData.form = {
+          courseId: this.courseId,
+        };
+        this.resourceList();
+      },
+      resourceList(){
+        this.addBatchData.loading = true;
+        listVideoResource(this.addBatchData.queryParams).then(response => {
+          this.addBatchData.loading = false;
+          this.addBatchData.list = response.rows;
+          this.addBatchData.total = response.total;
+        });
+      },
+      batchVideoSave(){
+        this.addBatchData.form.ids = this.addBatchData.select;
+        batchSaveVideo(this.addBatchData.form).then(response => {
+          this.addBatchData.open = false;
+          this.getList();
+        })
+      },
     }
   }
 </script>

+ 49 - 0
src/views/qw/sopTemp/index.vue

@@ -175,6 +175,15 @@
             v-hasPermi="['qw:sopTemp:edit']"
           >管理规则
           </el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdateRed(scope.row)"
+            v-if="scope.row.sendType == 5"
+            v-hasPermi="['qw:sopTemp:edit']"
+          >红包设置
+          </el-button>
           <el-button
             size="mini"
             type="text"
@@ -267,6 +276,20 @@
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
+
+    <el-dialog title="课程红包" :visible.sync="redData.open" width="900px" append-to-body>
+      <el-table v-loading="redData.loading" border :data="redData.list" height="500px">
+        <el-table-column label="小节" align="left" prop="videoName"/>
+        <el-table-column label="金额" align="center">
+          <template slot-scope="scope">
+            <el-input-number v-model="scope.row.redPacketMoney" :min="0.01" step="0.01" label="红包金额"></el-input-number>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div slot="footer" class="dialog-footer" style="float: right;">
+        <el-button type="primary" @click="updateRedData" :disabled="redData.loading">保 存</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
@@ -277,12 +300,15 @@ import {
   delSopTemp,
   exportSopTemp,
   getSopTemp,
+  redList,
   listSopTemp,
   shareSopTemp,
+  updateRedPackage,
   updateTemp
 } from "@/api/qw/sopTemp";
 import { getCompanyList } from "@/api/company/company";
 import {courseList} from "@/api/qw/sop";
+import fa from "element-ui/src/locale/lang/fa";
 
 export default {
   name: "SopTemp",
@@ -326,6 +352,11 @@ export default {
         open: false,
         templateId: null,
       },
+      redData: {
+        open: false,
+        loading: true,
+        list: [],
+      },
       queryCompanyParams: {
         pageNum: 1,
         pageSize: 10,
@@ -489,6 +520,24 @@ export default {
       this.$router.push(url)
       // }
     },
+    /** 修改按钮操作 */
+    handleUpdateRed(row) {
+      this.redData.open = true;
+      redList(row.id).then(e => {
+        this.redData.loading = false;
+        this.redData.list = e.data;
+      })
+    },
+    /** 修改按钮操作 */
+    updateRedData() {
+      this.redData.loading = true;
+      updateRedPackage({list: this.redData.list}).then(e => {
+        this.redData.open = false;
+        this.getList();
+      }).catch(() => {
+        this.redData.loading = false;
+      });
+    },
 
     /** 分享模板 */
     shareTemplate(row) {

+ 309 - 0
src/views/sop/companySopRole/index.vue

@@ -0,0 +1,309 @@
+<template>
+  <div class="app-container">
+<!--    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">-->
+<!--      <el-form-item label="销售公司" prop="companyId">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.companyId"-->
+<!--          placeholder="请输入销售公司"-->
+<!--          clearable-->
+<!--          size="small"-->
+<!--          @keyup.enter.native="handleQuery"-->
+<!--        />-->
+<!--      </el-form-item>-->
+<!--      <el-form-item label="权限名称" prop="roleName">-->
+<!--        <el-input-->
+<!--          v-model="queryParams.roleName"-->
+<!--          placeholder="请输入权限名称"-->
+<!--          clearable-->
+<!--          size="small"-->
+<!--          @keyup.enter.native="handleQuery"-->
+<!--        />-->
+<!--      </el-form-item>-->
+<!--      <el-form-item>-->
+<!--        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>-->
+<!--        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>-->
+<!--      </el-form-item>-->
+<!--    </el-form>-->
+
+<!--    <el-row :gutter="10" class="mb8">-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="primary"-->
+<!--          plain-->
+<!--          icon="el-icon-plus"-->
+<!--          size="mini"-->
+<!--          @click="handleAdd"-->
+<!--          v-hasPermi="['sop:companySopRole:add']"-->
+<!--        >新增</el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="success"-->
+<!--          plain-->
+<!--          icon="el-icon-edit"-->
+<!--          size="mini"-->
+<!--          :disabled="single"-->
+<!--          @click="handleUpdate"-->
+<!--          v-hasPermi="['sop:companySopRole:edit']"-->
+<!--        >修改</el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="danger"-->
+<!--          plain-->
+<!--          icon="el-icon-delete"-->
+<!--          size="mini"-->
+<!--          :disabled="multiple"-->
+<!--          @click="handleDelete"-->
+<!--          v-hasPermi="['sop:companySopRole:remove']"-->
+<!--        >删除</el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
+<!--        <el-button-->
+<!--          type="warning"-->
+<!--          plain-->
+<!--          icon="el-icon-download"-->
+<!--          size="mini"-->
+<!--          :loading="exportLoading"-->
+<!--          @click="handleExport"-->
+<!--          v-hasPermi="['sop:companySopRole:export']"-->
+<!--        >导出</el-button>-->
+<!--      </el-col>-->
+<!--    </el-row>-->
+
+    <el-table border v-loading="loading" :data="companySopRoleList">
+      <el-table-column label="销售公司" align="center" prop="companyId">
+        <template slot-scope="scope">
+          <el-tag v-for="item in companyList" v-if="item.companyId == scope.row.companyId"> {{scope.row.companyName}}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="权限" align="center">
+        <template slot-scope="scope">
+          <div style="display: flex;flex-flow: wrap;justify-content: flex-start;">
+            <el-tag style="width: 30%" v-for="item in scope.row.rules">{{roleMap[item]}}</el-tag>
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['sop:companySopRole:edit']"
+          >修改</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"
+    />
+
+    <!-- 添加或修改公司SOP权限对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="700px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="销售公司" prop="companyId">
+          <el-select filterable  v-model="form.companyId" placeholder="请选择公司名" size="small">
+            <el-option
+              v-for="item in companyList"
+              :key="item.companyId"
+              :label="item.companyName"
+              :value="item.companyId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="权限" prop="rules">
+          <div style="margin: 15px 0;"></div>
+          <el-checkbox-group v-model="form.rules" style="display: flex;flex-flow: wrap;justify-content: flex-start;">
+            <el-checkbox style="width: 28%" v-for="item in roleOptions" :label="item.dictValue" :key="item.dictValue">{{item.dictLabel}}</el-checkbox>
+          </el-checkbox-group>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listCompanySopRole, getCompanySopRole, delCompanySopRole, addCompanySopRole, updateCompanySopRole, exportCompanySopRole } from "@/api/sop/companySopRole";
+import { getCompanyList } from "@/api/company/company";
+
+export default {
+  name: "CompanySopRole",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 公司SOP权限表格数据
+      companySopRoleList: [],
+      roleOptions: [],
+      roleMap: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      companyList: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        companyId: null,
+        roleName: null,
+        roleValue: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("company_sop_role").then(response => {
+      this.roleOptions = response.data;
+      this.roleMap = response.data.reduce((obj, item) => {
+        obj[item.dictValue] = item.dictLabel;
+        return obj;
+      }, {});
+    });
+    getCompanyList().then(response => {
+      this.companyList = response.data;
+    });
+  },
+  methods: {
+    /** 查询公司SOP权限列表 */
+    getList() {
+      this.loading = true;
+      listCompanySopRole(this.queryParams).then(response => {
+        this.companySopRoleList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        companyId: null,
+        roleName: null,
+        roleValue: null,
+        createTime: null,
+        createBy: null,
+        updateBy: null,
+        updateTime: null,
+        rules: this.roleOptions.map(e => e.dictValue),
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加公司SOP权限";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      if(row.rules && row.rules.length > 0){
+        this.form.rules = row.rules;
+      }
+      this.form.companyId = row.companyId;
+      this.open = true;
+      this.title = "修改公司SOP权限";
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateCompanySopRole(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addCompanySopRole(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除公司SOP权限编号为"' + ids + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delCompanySopRole(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有公司SOP权限数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportCompanySopRole(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    },
+  }
+};
+</script>

+ 6 - 0
src/views/system/config/config.vue

@@ -382,6 +382,12 @@
              </el-radio-group>
            </el-form-item>
 
+           <el-form-item label="红包金额" v-if="form18.rewardType == 1">
+             <el-tooltip class="item" effect="dark" content="课程默认红包金额" placement="top-end">
+               <el-input-number  v-model="form18.redPackageMoney" :min="0.01" ></el-input-number>
+             </el-tooltip>
+           </el-form-item>
+
            <el-form-item label="红包模式">
              <el-radio-group v-model="form18.redPacketMode">
                <el-radio label="1">总公司</el-radio>