吴树波 5 dni temu
rodzic
commit
55f5a8086b

+ 77 - 0
src/api/company/CompanyRedPackageLogs.js

@@ -0,0 +1,77 @@
+import request from '@/utils/request'
+
+// 查询公司红包余额日志列表
+export function listCompanyRedPackageLogs(query) {
+  return request({
+    url: '/company/CompanyRedPackageLogs/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询公司红包余额日志详细
+export function getCompanyRedPackageLogs(id) {
+  return request({
+    url: '/company/CompanyRedPackageLogs/' + id,
+    method: 'get'
+  })
+}
+
+// 新增公司红包余额日志
+export function recharge(data) {
+  return request({
+    url: '/company/CompanyRedPackageLogs/recharge',
+    method: 'post',
+    data: data
+  })
+}
+// 新增公司红包余额日志
+export function addCompanyRedPackageLogs(data) {
+  return request({
+    url: '/company/CompanyRedPackageLogs',
+    method: 'post',
+    data: data
+  })
+}
+// 新增公司红包余额日志
+export function rew(data) {
+  return request({
+    url: '/company/CompanyRedPackageLogs/rew',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改公司红包余额日志
+export function updateCompanyRedPackageLogs(data) {
+  return request({
+    url: '/company/CompanyRedPackageLogs',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除公司红包余额日志
+export function delCompanyRedPackageLogs(id) {
+  return request({
+    url: '/company/CompanyRedPackageLogs/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出公司红包余额日志
+export function exportCompanyRedPackageLogs(query) {
+  return request({
+    url: '/company/CompanyRedPackageLogs/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出公司红包余额日志
+export function getMoneyPri() {
+  return request({
+    url: '/company/CompanyRedPackageLogs/getMoneyPri',
+    method: 'get',
+  })
+}

+ 17 - 6
src/api/course/courseRedPacketLog.js

@@ -22,12 +22,12 @@ export function getCourseRedPacketLog(logId) {
 //     method: 'get',
 //   })
 // }
-export function videoList(id) {
-  return request({
-    url: '/course/courseRedPacketLog/videoList/' + id,
-    method: 'get'
-  })
-}
+// export function videoList(id) {
+//   return request({
+//     url: '/course/courseRedPacketLog/videoList/' + id,
+//     method: 'get'
+//   })
+// }
 // 新增短链课程看课记录
 export function addCourseRedPacketLog(data) {
   return request({
@@ -73,3 +73,14 @@ export function courseList(){
     method: 'get',
   })
 }
+
+/**
+ * 获取课程列表
+ * @returns {*}
+ */
+export function videoList(id){
+  return request({
+    url: '/course/courseTrafficLog/videoList/' + id,
+    method: 'get',
+  })
+}

+ 53 - 0
src/api/course/fsUserCoursePeriodDays.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询营期课程列表
+export function listFsUserCoursePeriodDays(query) {
+  return request({
+    url: '/course/fsUserCoursePeriodDays/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询营期课程详细
+export function getFsUserCoursePeriodDays(id) {
+  return request({
+    url: '/course/fsUserCoursePeriodDays/' + id,
+    method: 'get'
+  })
+}
+
+// 新增营期课程
+export function addFsUserCoursePeriodDays(data) {
+  return request({
+    url: '/course/fsUserCoursePeriodDays',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改营期课程
+export function updateFsUserCoursePeriodDays(data) {
+  return request({
+    url: '/course/fsUserCoursePeriodDays',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除营期课程
+export function delFsUserCoursePeriodDays(id) {
+  return request({
+    url: '/course/fsUserCoursePeriodDays/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出营期课程
+export function exportFsUserCoursePeriodDays(query) {
+  return request({
+    url: '/course/fsUserCoursePeriodDays/export',
+    method: 'get',
+    params: query
+  })
+}

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

@@ -8,6 +8,14 @@ export function listPeriod(query) {
     params: query
   })
 }
+// 查询会员营期列表
+export function getDays(query) {
+  return request({
+    url: '/course/period/getDays',
+    method: 'get',
+    params: query
+  })
+}
 
 // 自定义查询主列表分页
 export function pagePeriod(data) {
@@ -35,6 +43,23 @@ export function addPeriod(data) {
   })
 }
 
+// 新增会员营期
+export function addCourse(data) {
+  return request({
+    url: '/course/period/addCourse',
+    method: 'post',
+    data: data
+  })
+}
+// 新增会员营期
+export function updateListCourseData(data) {
+  return request({
+    url: '/course/period/updateListCourseData',
+    method: 'post',
+    data: data
+  })
+}
+
 // 修改会员营期
 export function updatePeriod(data) {
   return request({

+ 365 - 0
src/views/company/CompanyRedPackageLogs/index.vue

@@ -0,0 +1,365 @@
+<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-select v-model="queryParams.status" clearable>
+          <el-option label="待审核" :value="0" />
+          <el-option label="已通过" :value="1" />
+          <el-option label="已解决" :value="2" />
+        </el-select>
+      </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="['company:CompanyRedPackageLogs:add']"-->
+<!--        >充值</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="['company:CompanyRedPackageLogs:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="CompanyRedPackageLogsList">
+      <el-table-column label="公司" align="center" prop="companyName" />
+      <el-table-column label="操作类型" align="center" prop="operateType">
+        <template slot-scope="scope">
+          <el-tag v-if="scope.row.operateType == 0">充值</el-tag>
+          <el-tag v-if="scope.row.operateType == 1">发红包</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="充值金额" align="center" prop="upMoney" />
+      <el-table-column label="手续费" align="center" prop="handlMoney" />
+      <el-table-column label="手续费比例" align="center" prop="handlPri">
+        <template slot-scope="scope">{{scope.row.handlPri}}%</template>
+      </el-table-column>
+      <el-table-column label="实际金额" align="center" prop="money" />
+      <el-table-column label="审核状态" align="center" prop="status" >
+        <template slot-scope="scope">
+          <el-tag v-if="scope.row.status == 0" type="warning">待审核</el-tag>
+          <el-tag v-if="scope.row.status == 1" type="success">审核通过</el-tag>
+          <el-tooltip class="item" effect="dark" :content="scope.row.rejectMemo" placement="top" v-if="scope.row.status == 2">
+            <el-tag type="danger">审核拒绝</el-tag>
+          </el-tooltip>
+        </template>
+      </el-table-column>
+      <el-table-column label="凭证照片" align="center" prop="images" >
+        <template slot-scope="scope">
+          <el-image
+            style="width: 100px; height: 100px"
+            :src="scope.row.images.split(',')[0]"
+            :preview-src-list="scope.row.images.split(',')">
+          </el-image>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark" />
+      <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"
+            v-if="scope.row.status == 0"
+            @click="rewOpen(scope.row)"
+            v-hasPermi="['company:CompanyRedPackageLogs: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"
+    />
+
+    <!-- 添加或修改公司红包余额日志对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="充值金额" prop="upMoney">
+          <el-input v-model="form.upMoney" @change="handlMoneyChange" type="number" placeholder="请输入充值金额" style="width: 200px">
+            <template slot="append">元</template>
+          </el-input>
+        </el-form-item>
+        <el-form-item label="手续费" prop="handlMoney">
+          <el-input v-model="form.handlMoney" disabled placeholder="请输入充值金额" style="width: 200px">
+            <template slot="append">元</template>
+          </el-input>
+        </el-form-item>
+        <el-form-item label="手续费比例" prop="handlPri">
+          <el-input v-model="pri" disabled placeholder="请输入充值金额" style="width: 200px">
+            <template slot="append">%</template>
+          </el-input>
+        </el-form-item>
+        <el-form-item label="到账金额" prop="money">
+          <el-input v-model="form.money" disabled placeholder="请输入充值金额"  style="width: 200px">
+            <template slot="append">元</template>
+          </el-input>
+        </el-form-item>
+        <el-form-item label="凭证照片" prop="images">
+          <image-upload v-model="form.images" :limit="7" />
+        </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>
+    <!-- 添加或修改公司红包余额日志对话框 -->
+    <el-dialog title="充值审核" :visible.sync="rewData.open" width="500px" append-to-body>
+      <el-form ref="form" :model="rewData.form" :rules="rules" label-width="100px">
+        <el-form-item label="审核" prop="status">
+          <el-radio-group v-model="rewData.form.status">
+            <el-radio :label="1">审核通过</el-radio>
+            <el-radio :label="2">审核拒绝</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark" v-if="rewData.form.status == 1">
+          <el-input type="textarea" :rows="3" class="el-input" v-model="rewData.form.remark" />
+        </el-form-item>
+        <el-form-item label="拒绝原因" prop="rejectMemo" v-if="rewData.form.status == 2">
+          <el-input type="textarea" :rows="3" class="el-input" v-model="rewData.form.rejectMemo" />
+        </el-form-item>
+<!--        <el-form-item label="拒绝凭证" prop="rejectImages" v-if="rewData.form.status == 2">-->
+<!--          <image-upload v-model="rewData.form.rejectImages" :limit="7" />-->
+<!--        </el-form-item>-->
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="rewFun">确 定</el-button>
+        <el-button @click="cancelRew">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listCompanyRedPackageLogs, getCompanyRedPackageLogs, delCompanyRedPackageLogs, getMoneyPri, recharge, exportCompanyRedPackageLogs, rew } from "@/api/company/CompanyRedPackageLogs";
+
+export default {
+  name: "CompanyRedPackageLogs",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      pri: 0,
+      // 公司红包余额日志表格数据
+      CompanyRedPackageLogsList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        companyId: null,
+        operateType: null,
+        type: null,
+        upMoney: null,
+        handlMoney: null,
+        handlPri: null,
+        money: null,
+        status: null,
+        images: null,
+        rejectMemo: null,
+        rejectImages: null,
+      },
+      // 表单参数
+      form: {},
+      rewData: {
+        open: false,
+        form:{},
+        row:{},
+      },
+      // 表单校验
+      rules: {
+        upMoney:[
+          { required: true, message: "充值金额不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    getMoneyPri().then(e => {
+      this.pri =e.data;
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询公司红包余额日志列表 */
+    getList() {
+      this.loading = true;
+      listCompanyRedPackageLogs(this.queryParams).then(response => {
+        this.CompanyRedPackageLogsList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    handlMoneyChange(){
+      let money = this.form.upMoney
+      if(money != null && Number(money) > 0){
+        this.form.handlMoney = (money * (this.pri / 100).toFixed(2)).toFixed(2);
+        this.form.money = money - this.form.handlMoney;
+      }
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 取消按钮
+    cancelRew() {
+      this.rewData.open = false;
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        companyId: null,
+        operateType: null,
+        type: null,
+        upMoney: null,
+        handlMoney: null,
+        handlPri: null,
+        money: null,
+        status: 0,
+        images: null,
+        rejectMemo: null,
+        rejectImages: null,
+        createTime: null,
+        createBy: null,
+        updateBy: null,
+        updateTime: null,
+        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 = "添加公司红包余额日志";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getCompanyRedPackageLogs(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改公司红包余额日志";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          recharge(this.form).then(response => {
+            this.msgSuccess("充值成功");
+            this.open = false;
+            this.getList();
+          });
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除公司红包余额日志编号为"' + ids + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delCompanyRedPackageLogs(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有公司红包余额日志数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportCompanyRedPackageLogs(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    },
+    rewOpen(row){
+      this.rewData.open = true;
+      getCompanyRedPackageLogs(row.id).then(e => {
+        this.rewData.row = e.data;
+        this.rewData.form = {
+          id: row.id,
+          status: 1,
+          remark: "",
+          rejectMemo: "",
+          rejectImages: "",
+        };
+      })
+    },
+    rewFun(){
+      rew(this.rewData.form).then(response => {
+        this.msgSuccess("审核成功");
+        this.rewData.open = false;
+        this.getList();
+      });
+    },
+  }
+};
+</script>

+ 13 - 12
src/views/company/company/index.vue

@@ -11,7 +11,7 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-     
+
       <el-form-item label="状态" prop="status">
         <el-select style="width: 220px" v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
               <el-option
@@ -81,6 +81,7 @@
       <el-table-column label="联系电话" align="center" prop="companyMobile" />
       <el-table-column label="员工数量" align="center" prop="limitUserCount" />
       <el-table-column label="坐席数量" align="center" prop="voiceCallerNumber" />
+      <el-table-column label="红包余额" align="center" prop="redPackageMoney" />
       <el-table-column label="公司地址" align="center" prop="companyAddress" />
       <el-table-column label="通话API" align="center" prop="voiceApiName" />
       <!-- <el-table-column label="AppId" align="center" prop="appId" />
@@ -111,7 +112,7 @@
             @click="handleUpdate(scope.row)"
             v-hasPermi="['company:company:edit']"
           >编辑</el-button>
-           
+
            <el-button
             size="mini"
             type="text"
@@ -143,7 +144,7 @@
         </template>
       </el-table-column>
     </el-table>
-    
+
     <pagination
       v-show="total>0"
       :total="total"
@@ -204,8 +205,8 @@
             </el-form-item>
           </el-col>
         </el-row>
-        
-        
+
+
         <el-form-item  label="管理员帐号" prop="userName" v-if="form.companyId==null">
           <el-input v-model="form.userName" placeholder="请输入管理员帐号" />
         </el-form-item>
@@ -414,7 +415,7 @@ export default {
     });
     getExpressList().then(response => {
       this.expressOptions = response.data;
-       
+
     });
     this.getList();
   },
@@ -424,7 +425,7 @@ export default {
       this.erpForm.omsCode = item.omsCode;
     },
     handleDeduct(row) {
-      const companyId = row.companyId  
+      const companyId = row.companyId
       this.deductForm.companyId=row.companyId;
       this.deductForm.companyName=row.companyName;
       this.deductForm.balance=row.money;
@@ -445,7 +446,7 @@ export default {
       });
     },
     handleRecharge(row) {
-      const companyId = row.companyId  
+      const companyId = row.companyId
       this.rechargeForm.companyId=row.companyId;
       this.rechargeForm.companyName=row.companyName;
       this.rechargeForm.balance=row.money;
@@ -533,7 +534,7 @@ export default {
           packageList.forEach(element => {
             this.packageIds.push(parseInt(element))
           });
-           
+
         }
         this.erpForm.omsCode = response.data.omsCode;
         this.open = true;
@@ -564,7 +565,7 @@ export default {
         }
       });
     },
-    
+
     handleResetPwd(row) {
       const companyIds = row.companyId || this.ids;
       this.$confirm('是否确认重复密码为123456?', "警告", {
@@ -606,8 +607,8 @@ export default {
           this.download(response.msg);
         }).catch(function() {});
     },
-    
-    
+
+
   }
 };
 </script>

+ 309 - 91
src/views/course/userCoursePeriod/index.vue

@@ -137,26 +137,6 @@
               v-hasPermi="['course:period:add']"
             >新增</el-button>
           </el-col>
-          <el-col :span="1.5">
-            <el-button
-              type="success"
-              icon="el-icon-edit"
-              size="mini"
-              :disabled="single"
-              @click="handleUpdate"
-              v-hasPermi="['course:period:edit']"
-            >修改</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button
-              type="danger"
-              icon="el-icon-delete"
-              size="mini"
-              :disabled="multiple"
-              @click="handleDelete"
-              v-hasPermi="['course:period:remove']"
-            >删除</el-button>
-          </el-col>
           <el-col :span="1.5">
             <el-button
               type="warning"
@@ -169,26 +149,13 @@
           <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
         </el-row>
 
-        <el-table v-loading="loading" :data="periodList" @selection-change="handleSelectionChange">
-          <el-table-column type="selection" width="55" align="center" />
+        <el-table v-loading="loading" :data="periodList">
           <el-table-column label="所属训练营" align="center" prop="trainingCampName" />
           <el-table-column label="营期名称" align="center" prop="periodName" />
           <el-table-column label="公司名称" align="center" prop="companyName" />
-          <el-table-column label="开营开始时间" align="center" prop="periodStartingTime" width="180">
-            <template slot-scope="scope">
-              <span>{{ parseTime(scope.row.periodStartingTime, '{y}-{m}-{d}') }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column label="开营结束时间" align="center" prop="periodEndTime" width="180">
-            <template slot-scope="scope">
-              <span>{{ parseTime(scope.row.periodEndTime, '{y}-{m}-{d}') }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column label="创建时间" align="center" prop="createTime" width="180">
-            <template slot-scope="scope">
-              <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
-            </template>
-          </el-table-column>
+          <el-table-column label="开营开始时间" align="center" prop="periodStartingTime" width="180" />
+          <el-table-column label="开营结束时间" align="center" prop="periodEndTime" width="180" />
+          <el-table-column label="创建时间" align="center" prop="createTime" width="180" />
           <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
             <template slot-scope="scope">
               <el-button
@@ -198,6 +165,13 @@
                 @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"
@@ -220,59 +194,78 @@
     </el-container>
 
     <!-- 添加或修改会员营期对话框-->
-    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+    <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="periodName">
           <el-input v-model="form.periodName" placeholder="请输入营期名称" />
         </el-form-item>
         <el-form-item label="公司id" prop="companyId">
-          <el-select v-model="form.companyId" placeholder="请选择公司id">
-            <el-option label="请选择字典生成" value="" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="课程id" prop="courseId">
-          <el-select v-model="form.courseId" placeholder="请选择课程id">
-            <el-option label="请选择字典生成" value="" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="视频id" prop="videoId">
-          <el-select v-model="form.videoId" placeholder="请选择视频id">
-            <el-option label="请选择字典生成" value="" />
+          <el-select v-model="form.companyId" placeholder="请选择公司" multiple>
+            <el-option
+              v-for="item in companyOptions"
+              :key="item.companyId"
+              :label="item.companyName"
+              :value="item.companyId"
+            />
           </el-select>
         </el-form-item>
-        <el-form-item label="训练营id" prop="trainingCampId">
-          <el-input v-model="form.trainingCampId" placeholder="请输入训练营id" />
-        </el-form-item>
-        <el-form-item label="课程风格url" prop="courseStyle">
-          <el-input v-model="form.courseStyle" placeholder="请输入课程风格url" />
+        <el-form-item label="课程风格" prop="courseStyle">
+          <image-upload v-model="form.courseStyle" :limit="1" />
         </el-form-item>
-        <el-form-item label="直播间风格url" prop="liveRoomStyle">
-          <el-input v-model="form.liveRoomStyle" placeholder="请输入直播间风格url" />
+        <el-form-item label="直播间风格" prop="liveRoomStyle">
+          <image-upload v-model="form.liveRoomStyle" :limit="1" />
         </el-form-item>
-        <el-form-item label="红包发放方式,1-按课程,每个课程可得一个;2-按营期,每个营期可得一个" prop="redPacketGrantMethod">
-          <el-input v-model="form.redPacketGrantMethod" placeholder="请输入红包发放方式,1-按课程,每个课程可得一个;2-按营期,每个营期可得一个" />
+        <el-form-item label="红包发放方式" prop="redPacketGrantMethod">
+          <el-radio-group v-model="form.redPacketGrantMethod">
+            <el-radio :label="1" >按课程</el-radio>
+            <el-radio :label="2" >按营期</el-radio>
+          </el-radio-group>
         </el-form-item>
-        <el-form-item label="营期类型,1-多课程营期;2-单课程营期" prop="periodType">
-          <el-select v-model="form.periodType" placeholder="请选择营期类型,1-多课程营期;2-单课程营期">
-            <el-option label="请选择字典生成" value="" />
-          </el-select>
+        <el-form-item label="营期类型" prop="periodType">
+          <el-radio-group v-model="form.periodType">
+            <el-radio :label="1" >多课程</el-radio>
+            <el-radio :label="2" >单课程</el-radio>
+          </el-radio-group>
         </el-form-item>
-        <el-form-item label="开营日期-开始时间" prop="periodStartingTime">
-          <el-date-picker clearable size="small" style="width: 200px"
-            v-model="form.periodStartingTime"
-            type="date"
-            value-format="yyyy-MM-dd"
-            placeholder="选择开营日期-开始时间">
+        <el-form-item label="开营日期" prop="periodStartingTime">
+          <el-date-picker
+            :style="{display: form.periodType == 1 ? '' : 'none !important'}"
+            v-model="form.dateRange"
+            @change="timeChange(1)"
+            type="daterange"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            value-format="yyyy-MM-dd">
           </el-date-picker>
-        </el-form-item>
-        <el-form-item label="开营日期-结束时间" prop="periodEndTime">
-          <el-date-picker clearable size="small" style="width: 200px"
-            v-model="form.periodEndTime"
+          <el-date-picker
+            :style="{display: form.periodType == 2 ? '' : 'none !important'}"
+            @change="timeChange(2)"
+            v-model="form.date"
             type="date"
             value-format="yyyy-MM-dd"
-            placeholder="选择开营日期-结束时间">
+            placeholder="选择日期">
           </el-date-picker>
         </el-form-item>
+
+<!--        <div v-if="form.periodType == 1">-->
+<!--          <el-form-item label="开课时间" prop="periodType">-->
+<!--            <el-radio-group v-model="form.periodType">-->
+<!--              <el-radio :label="1" >多课程</el-radio>-->
+<!--              <el-radio :label="2" >单课程</el-radio>-->
+<!--            </el-radio-group>-->
+<!--          </el-form-item>-->
+<!--          <el-form-item :label="'第' + item.lesson + '节'" prop="periodStartingTime" v-for="item in form.days">-->
+<!--            <el-date-picker-->
+<!--              v-model="item.dateRange"-->
+<!--              type="datetimerange"-->
+<!--              range-separator="至"-->
+<!--              start-placeholder="开始日期"-->
+<!--              end-placeholder="结束日期"-->
+<!--              value-format="yyyy-MM-dd HH:mm:ss">-->
+<!--            </el-date-picker>-->
+<!--          </el-form-item>-->
+<!--        </div>-->
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
@@ -292,13 +285,105 @@
         <el-button @click="cancelCampForm">取 消</el-button>
       </div>
     </el-dialog>
+
+    <!-- 添加或修改会员营期对话框-->
+    <el-dialog title="课程管理" :visible.sync="course.open" width="90%" 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" />
+        <el-table-column label="小节" align="center" prop="videoName" />
+        <el-table-column v-if="course.row.redPacketGrantMethod == 2" label="红包金额" align="center" prop="money">
+          <template slot-scope="scope">
+            <el-input v-model="scope.row.money">
+              <template slot="append">元</template>
+            </el-input>
+          </template>
+        </el-table-column>
+<!--        <el-table-column label="有效时间" align="center" prop="periodStartingTime" width="180" />-->
+        <el-table-column label="创建时间" align="center" prop="createTime" width="180" />
+<!--        <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="['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-delete"-->
+<!--              @click="handleDelete(scope.row)"-->
+<!--              v-hasPermi="['course:period:remove']"-->
+<!--            >删除</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>
+
+    <!-- 添加或修改会员营期对话框-->
+    <el-dialog title="添加课程" :visible.sync="course.addOpen" width="500px" append-to-body>
+      <el-form ref="courseAddForm" :model="course.form" label-width="100px">
+        <el-form-item label="课程" prop="courseId">
+          <el-select filterable  v-model="course.form.courseId" placeholder="请选择课程"  clearable size="small" @change="courseChange(course.form.courseId)" style="width: 100%">
+            <el-option
+              v-for="dict in courseList"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="parseInt(dict.dictValue)"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="小节" prop="videoId">
+          <el-select filterable  v-model="course.form.videoIds" placeholder="请选择小节" :multiple-limit="getDiff(course.row.periodStartingTime, course.row.periodEndTime) - course.total" multiple clearable size="small" style="width: 100%">
+            <el-option
+              v-for="dict in videoList"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="parseInt(dict.dictValue)"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitCourseForm">确 定</el-button>
+        <el-button @click="closeAddCourse">取 消</el-button>
+      </div>
+    </el-dialog>
+
+
+
   </div>
 </template>
 
 <script>
-import { listPeriod, getPeriod, delPeriod, addPeriod, updatePeriod, exportPeriod, pagePeriod } from "@/api/course/userCoursePeriod";
-import { getCompanyList } from "@/api/company/company";
+import {addPeriod, delPeriod, exportPeriod, getPeriod, pagePeriod, updatePeriod, getDays, addCourse, updateListCourseData} from "@/api/course/userCoursePeriod";
+import {getCompanyList} from "@/api/company/company";
 import { listCamp, addCamp, delCamp, copyCamp } from "@/api/course/userCourseCamp";
+import { courseList,videoList } from '@/api/course/courseRedPacketLog'
 
 export default {
   name: "Period",
@@ -324,6 +409,7 @@ export default {
       periodList: [],
       // 左侧列表数据
       leftList: [],
+      videoList: [],
       // 弹出层标题
       title: "",
       // 是否显示弹出层
@@ -347,6 +433,19 @@ export default {
       },
       // 表单参数
       form: {},
+      course: {
+        open: false,
+        row:{},
+        list:[],
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+        },
+        loading: true,
+        total: 0,
+        addOpen: false,
+        form: {},
+      },
       // 表单校验
       rules: {
       },
@@ -358,6 +457,7 @@ export default {
       activeCampIndex: null,
       // 训练营对话框是否显示
       campDialogVisible: false,
+      courseList: false,
       // 训练营表单
       campForm: {
         trainingCampName: ''
@@ -376,9 +476,14 @@ export default {
     };
   },
   created() {
-    this.getList();
+
+    courseList().then(response => {
+      this.courseList = response.list;
+    });
+    // this.getList();
     this.getLeftList();
     this.getCompanyList();
+
   },
   methods: {
     /** 查询会员营期列表 */
@@ -404,7 +509,7 @@ export default {
           this.campList = response.data.list || [];
           this.leftQueryParams.hasNextPage = response.data.hasNextPage;
           this.activeCampIndex = this.campList.length > 0 ? 0 : null;
-
+          this.selectCamp(this.activeCampIndex);
           // 如果当前显示的列表高度不足以触发滚动,但还有更多数据,自动加载下一页
           this.$nextTick(() => {
             const scrollEl = this.$refs.campList;
@@ -462,6 +567,12 @@ export default {
       const periodId = row.periodId || this.ids
       getPeriod(periodId).then(response => {
         this.form = response.data;
+        if(this.form.periodType == 1){
+          this.form.dateRange = [this.form.periodStartingTime, this.form.periodEndTime];
+        }
+        if(this.form.periodType == 1){
+          this.form.date = this.form.periodStartingTime;
+        }
         this.open = true;
         this.title = "修改会员营期";
       });
@@ -470,8 +581,11 @@ export default {
     submitForm() {
       this.$refs["form"].validate(valid => {
         if (valid) {
-          if (this.form.periodId != null) {
-            updatePeriod(this.form).then(response => {
+          let data = JSON.parse(JSON.stringify(this.form));
+          data.companyId = data.companyId.join()
+          data.trainingCampId = this.queryParams.trainingCampId
+          if (data.periodId != null) {
+            updatePeriod(data).then(response => {
               if (response.code === 200) {
                 this.msgSuccess("修改成功");
                 this.open = false;
@@ -479,7 +593,7 @@ export default {
               }
             });
           } else {
-            addPeriod(this.form).then(response => {
+            addPeriod(data).then(response => {
               if (response.code === 200) {
                 this.msgSuccess("新增成功");
                 this.open = false;
@@ -543,9 +657,12 @@ export default {
         updateTime: null,
         courseStyle: null,
         liveRoomStyle: null,
-        redPacketGrantMethod: null,
-        periodType: null,
+        redPacketGrantMethod: 1,
+        periodType: 1,
         periodStartingTime: null,
+        dateRange: [],
+        date: null,
+        days: [],
         periodEndTime: null
       };
       this.resetForm("form");
@@ -668,12 +785,8 @@ export default {
       this.activeCampIndex = index;
       // TODO:加载对应的训练营营期数据
       const selectedCamp = this.campList[index];
-      // 设置查询参数
-      // this.queryParams = {
-      //   ...this.queryParams,
-      //   trainingCampId: selectedCamp.trainingCampId
-      // };
-      // this.getList();
+      this.queryParams.trainingCampId = selectedCamp.trainingCampId;
+      this.getList();
     },
     /** 处理滚动事件,实现滚动到底部加载更多 */
     handleScroll() {
@@ -739,8 +852,113 @@ export default {
         this.$message.error('加载更多训练营失败');
         this.loadingMore = false;
       });
-    }
-  }
+    },
+    timeChange(type){
+      if(type == 1){
+        this.form.periodStartingTime = this.form.dateRange[0];
+        this.form.periodEndTime = this.form.dateRange[1];
+
+
+         // 转换为天数
+        let days = this.getDiff(this.form.periodStartingTime, this.form.periodEndTime);
+        for (let i = 0; i < days; i++) {
+          this.form.days.push({lesson: i + 1});
+        }
+      }
+      if(type == 2){
+        this.form.periodStartingTime = this.form.date;
+        this.form.periodEndTime = this.form.date;
+      }
+    },
+    getDiff(start, end) {
+      if(start == null || start == undefined || start == '') return 0;
+      if(end == null || end == undefined || end == '') return 0;
+      if(start == end) 1;
+      const startDate = this.getUTCDate(start);
+      const endDate = this.getUTCDate(end);
+
+      // 判断是否为同一天(UTC 日期)
+      const isSameDay =
+        startDate.getUTCFullYear() === endDate.getUTCFullYear() &&
+        startDate.getUTCMonth() === endDate.getUTCMonth() &&
+        startDate.getUTCDate() === endDate.getUTCDate();
+
+      if (isSameDay) {
+        return 1; // 同一天返回 1
+      } else {
+        // 计算非同日期的天数差(基于 UTC 午夜时间)
+        const timeDiff = endDate - startDate;
+        return Math.floor(timeDiff / (1000 * 3600 * 24)); // 直接取整
+      }
+    },
+    getUTCDate(dateStr) {
+      const [year, month, day] = dateStr.split('-').map(Number);
+      return new Date(Date.UTC(year, month - 1, day)); // 月份从0开始
+    },
+    handleCourse(row){
+      this.course = {
+        open: false,
+        row:{},
+        list:[],
+        queryParams: {
+          pageNum: 1,
+          pageSize: 9999,
+        },
+        loading: true,
+        total: 0,
+        addOpen: false,
+        form: {},
+      };
+      this.course.open = true;
+      this.course.row = row;
+      this.course.queryParams.periodId = row.periodId;
+      this.getCourseList();
+    },
+    getCourseList(){
+      this.course.loading = true;
+      getDays(this.course.queryParams).then(e => {
+        this.course.list = e.rows;
+        this.course.total = e.total;
+        this.course.loading = false;
+      });
+    },
+    handleAddCourse(){
+      this.course.addOpen = true;
+      this.course.form = {
+        periodId: this.course.row.periodId,
+      };
+    },
+    closeAddCourse(){
+      this.course.addOpen = false;
+    },
+
+    //查询小节
+    courseChange(row){
+      this.course.form.videoIds = [];
+      videoList(row).then(response => {
+        this.videoList=response.list
+      });
+    },
+    submitCourseForm(){
+      this.$refs.courseAddForm.validate(valid => {
+        if (valid) {
+          // 提交数据
+          addCourse(this.course.form).then(response => {
+            this.$message.success('添加成功');
+            this.course.addOpen = false;
+            // 重新加载训练营列表
+            this.getCourseList();
+          });
+        }
+      });
+    },
+    saveCourseData(){
+      updateListCourseData(this.course.list).then(response => {
+        this.$message.success('保存成功');
+        this.getCourseList();
+      });
+    },
+  },
 };
 </script>
 

+ 32 - 2
src/views/system/config/config.vue

@@ -463,7 +463,20 @@
            </div>
          </div>
        </el-tab-pane>
-
+       <el-tab-pane label="企微配置" name="qw.config">
+         <el-form ref="form11" :model="form11" :rules="rules11" label-width="180px">
+           <el-form-item   label="是否开启重粉" prop="isRepeat">
+             <el-switch v-model="form11.ooo
+" />
+           </el-form-item>
+           <el-form-item   label="是否重项目" prop="isProject">
+             <el-switch v-model="form11.isProject" />
+           </el-form-item>
+           <div   class="footer">
+             <el-button type="primary" @click="submitForm11">提  交</el-button>
+           </div>
+         </el-form>
+       </el-tab-pane>
 
     </el-tabs>
      <el-dialog :title="sign.title" :visible.sync="sign.open" width="500px" append-to-body>
@@ -527,6 +540,9 @@ export default {
       // 表单校验
       rules1: {
 
+      },
+      rules11: {
+
       },
       form2: {
 
@@ -568,6 +584,7 @@ export default {
       form18:{
       },
       form10:[],
+      form11:{},
       form19:{
       },
       // 表单校验
@@ -627,7 +644,7 @@ export default {
           if(key=="store.config"){
               this.configId=response.data.configId;
               this.configKey=response.data.configKey;
-              this.form1 =JSON.parse(response.data.configValue);
+            CompanyRedPackageLogsthis.form1 =JSON.parse(response.data.configValue);
               if(this.form1.certs!=null){
                   this.photoArr=this.form1.certs.split(",");
               }
@@ -685,6 +702,11 @@ export default {
              this.configKey=response.data.configKey;
              this.form10 =JSON.parse(response.data.configValue);
            }
+           if(key=="qw.config"){
+             this.configId=response.data.configId;
+             this.configKey=response.data.configKey;
+             this.form11 =JSON.parse(response.data.configValue);
+           }
         });
      },
     /** 提交按钮 */
@@ -793,6 +815,14 @@ export default {
         }
       });
     },
+    submitForm11(){
+      var param={configId:this.configId,configKey:this.configKey,configValue:JSON.stringify(this.form11)}
+      updateConfigByKey(param).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("修改成功");
+        }
+      });
+    },
     /** 清理缓存按钮操作 */
     handleClearCache() {
       clearCache().then(response => {