Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/master'

yuhongqi 12 stundas atpakaļ
vecāks
revīzija
586e2b003d

+ 10 - 0
src/api/course/courseCouponUser.js

@@ -0,0 +1,10 @@
+import request from '@/utils/request'
+
+// 查询答题日志列表
+export function getRecordList(query) {
+  return request({
+    url: '/course/courseCouponUser/getRecordList',
+    method: 'get',
+    params: query
+  })
+}

+ 7 - 0
src/api/live/live.js

@@ -147,3 +147,10 @@ export function createAppLink(data) {
         params: data
     })
 }
+
+export function getAppAllList() {
+    return request({
+        url: '/live/live/getAppAllList',
+        method: 'get'
+    })
+}

+ 9 - 3
src/views/company/companyUser/companyUserList.vue

@@ -4,7 +4,7 @@
       <!--部门数据-->
       <el-col :span="4" :xs="24">
         <div class="head-container">
-          <el-input v-model="deptName" placeholder="请输入部门名称" clearable size="small" prefix-icon="el-icon-search" style="margin-bottom: 20px" />
+          <el-input v-model="deptName" placeholder="请输入部门名称" clearable size="small" prefix-icon="el-icon-search" style="margin-bottom: 20px" @blur="trimInput('deptName')" />
         </div>
         <div class="head-container">
           <el-tree :data="deptOptions" :props="defaultProps" :expand-on-click-node="false" :filter-node-method="filterNode" ref="tree"  @node-click="handleNodeClick" />
@@ -15,10 +15,10 @@
       <el-col :span="20" :xs="24">
         <el-form  :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
           <el-form-item label="员工姓名" prop="nickName">
-            <el-input v-model="queryParams.nickName" placeholder="请输入员工姓名" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" />
+            <el-input v-model="queryParams.nickName" placeholder="请输入员工姓名" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" @blur="trimInput('nickName', queryParams)" />
           </el-form-item>
           <el-form-item label="手机号码" prop="phonenumber">
-            <el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" />
+            <el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" @blur="trimInput('phonenumber', queryParams)" />
           </el-form-item>
           <el-form-item label="状态" prop="status">
             <el-select v-model="queryParams.status" placeholder="员工状态" clearable size="small" style="width: 240px">
@@ -182,6 +182,12 @@ export default {
     });
   },
   methods: {
+    trimInput(key, obj) {
+      const target = obj || this;
+      if (target[key] && typeof target[key] === 'string') {
+        target[key] = target[key].trim();
+      }
+    },
     /** 查询用户列表 */
     getList() {
       this.loading = true;

+ 19 - 10
src/views/company/companyUser/index.vue

@@ -4,7 +4,7 @@
       <!--部门数据-->
       <el-col :span="2" :xs="24">
         <div class="head-container">
-          <el-input v-model="deptName" placeholder="请输入部门名称" clearable size="small" prefix-icon="el-icon-search" style="margin-bottom: 20px" />
+          <el-input v-model="deptName" placeholder="请输入部门名称" clearable size="small" prefix-icon="el-icon-search" style="margin-bottom: 20px" @blur="trimInput('deptName')" />
         </div>
         <div class="head-container">
           <el-tree :data="deptOptions" :props="defaultProps" :expand-on-click-node="false" :filter-node-method="filterNode" ref="tree"  @node-click="handleNodeClick" />
@@ -14,13 +14,13 @@
       <el-col :span="22" :xs="24">
         <el-form  :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
           <el-form-item label="ID" prop="userId">
-            <el-input v-model="queryParams.userId" placeholder="请输入员工ID" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" />
+            <el-input v-model="queryParams.userId" placeholder="请输入员工ID" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" @blur="trimInput('userId', queryParams)" />
           </el-form-item>
           <el-form-item label="员工后台昵称" prop="nickName">
-            <el-input v-model="queryParams.nickName" placeholder="请输入员工后台昵称" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" />
+            <el-input v-model="queryParams.nickName" placeholder="请输入员工后台昵称" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" @blur="trimInput('nickName', queryParams)" />
           </el-form-item>
           <el-form-item label="手机号码" prop="phonenumber">
-            <el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" />
+            <el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" @blur="trimInput('phonenumber', queryParams)" />
           </el-form-item>
           <el-form-item label="状态" prop="status">
             <el-select v-model="queryParams.status" placeholder="员工状态" clearable size="small" style="width: 240px" @change="handleQuery">
@@ -430,7 +430,7 @@
 <!--              <el-input v-model="form.userName" placeholder="请输入员工后台账号" />-->
 <!--            </el-form-item>-->
             <el-form-item label="员工姓名" prop="nickName">
-              <el-input v-model="form.nickName" placeholder="请输入员工后台昵称" />
+              <el-input v-model="form.nickName" placeholder="请输入员工后台昵称" @blur="trimInput('nickName', form)" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -442,24 +442,24 @@
         <el-row>
           <el-col :span="12">
             <el-form-item label="手机号码" prop="phonenumber">
-              <el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" />
+              <el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" @blur="trimInput('phonenumber', form)" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="邮箱" prop="email">
-              <el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" />
+              <el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" @blur="trimInput('email', form)" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
             <el-form-item label="员工账号" prop="userName">
-              <el-input v-model="form.userName" placeholder="请输入员工工号" />
+              <el-input v-model="form.userName" placeholder="请输入员工工号" @blur="trimInput('userName', form)" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item v-if="form.userId == undefined" label="用户密码" prop="password">
-              <el-input v-model="form.password" placeholder="请输入用户密码" type="password" show-password />
+              <el-input v-model="form.password" placeholder="请输入用户密码" type="password" show-password @blur="trimInput('password', form)" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -501,7 +501,7 @@
          <el-row>
           <el-col :span="12">
             <el-form-item label="身份证号">
-              <el-input v-model="form.idCard" placeholder="请输入身份证号" maxlength="18" />
+              <el-input v-model="form.idCard" placeholder="请输入身份证号" maxlength="18" @blur="trimInput('idCard', form)" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -720,6 +720,7 @@
             clearable
             style="width: 300px;"
             @keyup.enter.native="queryFsUserByPhone"
+            @blur="trimInput('phone', bindUserForm)"
           >
             <el-button slot="append" icon="el-icon-search" @click="queryFsUserByPhone">查询</el-button>
           </el-input>
@@ -787,6 +788,7 @@
               placeholder="请输入昵称"
               clearable
               @keyup.enter.native="handleMemberQuery"
+              @blur="trimInput('nickName', memberQueryParams)"
               prefix-icon="el-icon-user"
               style="width: 100%;"
             />
@@ -798,6 +800,7 @@
               placeholder="请输入手机号"
               clearable
               @keyup.enter.native="handleMemberQuery"
+              @blur="trimInput('phone', memberQueryParams)"
               prefix-icon="el-icon-phone"
               style="width: 100%;"
             />
@@ -1204,6 +1207,12 @@ export default {
     });
   },
   methods: {
+    trimInput(key, obj) {
+      const target = obj || this;
+      if (target[key] && typeof target[key] === 'string') {
+        target[key] = target[key].trim();
+      }
+    },
 
       handlePagination(data) {
           // 添加防抖或判断,避免初始化时自动触发

+ 24 - 11
src/views/company/companyUser/myCompanyUserIndex.vue

@@ -9,7 +9,7 @@
       <!--部门数据-->
       <el-col :span="2" :xs="24">
         <div class="head-container">
-          <el-input v-model="deptName" placeholder="请输入部门名称" clearable size="small" prefix-icon="el-icon-search" style="margin-bottom: 20px" />
+          <el-input v-trim v-model="deptName" placeholder="请输入部门名称" clearable size="small" prefix-icon="el-icon-search" style="margin-bottom: 20px" />
         </div>
         <div class="head-container">
           <el-tree :data="deptOptions" :props="defaultProps" :expand-on-click-node="false" :filter-node-method="filterNode" ref="tree"  @node-click="handleNodeClick" />
@@ -19,13 +19,13 @@
       <el-col :span="22" :xs="24">
         <el-form  :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
           <el-form-item label="ID" prop="userId">
-            <el-input v-model="queryParams.userId" placeholder="请输入员工ID" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" />
+            <el-input v-trim v-model="queryParams.userId" placeholder="请输入员工ID" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" />
           </el-form-item>
           <el-form-item label="员工后台昵称" prop="nickName">
-            <el-input v-model="queryParams.nickName" placeholder="请输入员工后台昵称" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" />
+            <el-input v-trim v-model="queryParams.nickName" placeholder="请输入员工后台昵称" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" />
           </el-form-item>
           <el-form-item label="手机号码" prop="phonenumber">
-            <el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" />
+            <el-input v-trim v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" />
           </el-form-item>
           <el-form-item label="状态" prop="status">
             <el-select v-model="queryParams.status" placeholder="员工状态" clearable size="small" style="width: 240px" @change="handleQuery">
@@ -364,7 +364,7 @@
 <!--              <el-input v-model="form.userName" placeholder="请输入员工后台账号" />-->
 <!--            </el-form-item>-->
             <el-form-item label="员工姓名" prop="nickName">
-              <el-input v-model="form.nickName" placeholder="请输入员工后台昵称" />
+              <el-input v-trim v-model="form.nickName" placeholder="请输入员工后台昵称" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -376,24 +376,24 @@
         <el-row>
           <el-col :span="12">
             <el-form-item label="手机号码" prop="phonenumber">
-              <el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" />
+              <el-input v-trim v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="邮箱" prop="email">
-              <el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" />
+              <el-input v-trim v-model="form.email" placeholder="请输入邮箱" maxlength="50" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
             <el-form-item label="员工账号" prop="userName">
-              <el-input v-model="form.userName" placeholder="请输入员工工号" />
+              <el-input v-trim v-model="form.userName" placeholder="请输入员工工号" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item v-if="form.userId == undefined" label="用户密码" prop="password">
-              <el-input v-model="form.password" placeholder="请输入用户密码" type="password" show-password />
+              <el-input v-trim v-model="form.password" placeholder="请输入用户密码" type="password" show-password />
             </el-form-item>
           </el-col>
         </el-row>
@@ -435,7 +435,7 @@
          <el-row>
           <el-col :span="12">
             <el-form-item label="身份证号">
-              <el-input v-model="form.idCard" placeholder="请输入身份证号" maxlength="18" />
+              <el-input v-trim v-model="form.idCard" placeholder="请输入身份证号" maxlength="18" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -477,7 +477,7 @@
         <el-row>
           <el-col :span="24">
             <el-form-item label="备注">
-              <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
+              <el-input v-trim v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
             </el-form-item>
           </el-col>
         </el-row>
@@ -639,6 +639,7 @@
       <el-form :model="bindUserForm" label-width="100px">
         <el-form-item label="手机号码">
           <el-input
+            v-trim
             v-model="bindUserForm.phone"
             placeholder="请输入手机号码(完全匹配)"
             clearable
@@ -937,6 +938,18 @@ export default {
       bindUserLoading: false,
     };
   },
+  directives: {
+    trim: {
+      inserted(el, binding, vnode) {
+        vnode.componentInstance.$on('blur', () => {
+          const value = vnode.componentInstance.value;
+          if (typeof value === 'string') {
+            vnode.componentInstance.$emit('input', value.trim());
+          }
+        });
+      }
+    }
+  },
   watch: {
     // 根据名称筛选部门树
     deptName(val) {

+ 6 - 1
src/views/components/QwUserSelect.vue

@@ -7,7 +7,7 @@
           <el-row :gutter="16">
             <el-col :span="8">
               <el-form-item label="认领人" prop="companyUserNickName">
-                <el-input v-model="queryParams.companyUserNickName" placeholder="请输入" clearable size="small" @keyup.enter.native="handleQuery"/>
+                <el-input v-model="queryParams.companyUserNickName" placeholder="请输入" clearable size="small" @keyup.enter.native="handleQuery" @blur="trimInput('companyUserNickName')"/>
               </el-form-item>
             </el-col>
             <el-col :span="8">
@@ -216,6 +216,11 @@ export default {
     this.getCitys();
   },
   methods: {
+    trimInput(field) {
+      if (typeof this.queryParams[field] === 'string') {
+        this.queryParams[field] = this.queryParams[field].trim();
+      }
+    },
     setRows(rows){
       this.shows = true;
       this.rows = rows || [];

+ 7 - 2
src/views/components/QwUserSelectTwo.vue

@@ -7,12 +7,12 @@
           <el-row :gutter="16">
             <el-col :span="6">
               <el-form-item label="企微用户名" prop="qwUserName">
-                <el-input v-model="queryParams.qwUserName" placeholder="请输入企微用户名" clearable size="small" @keyup.enter.native="handleQuery"/>
+                <el-input v-model="queryParams.qwUserName" placeholder="请输入企微用户名" clearable size="small" @keyup.enter.native="handleQuery" @blur="trimInput('qwUserName')"/>
               </el-form-item>
             </el-col>
             <el-col :span="6">
               <el-form-item label="企微用户 ID" prop="qwUserId">
-                <el-input v-model="queryParams.qwUserId" placeholder="请输入企微用户 ID" clearable size="small" @keyup.enter.native="handleQuery"/>
+                <el-input v-model="queryParams.qwUserId" placeholder="请输入企微用户 ID" clearable size="small" @keyup.enter.native="handleQuery" @blur="trimInput('qwUserId')"/>
               </el-form-item>
             </el-col>
             <el-col :span="6">
@@ -93,6 +93,11 @@ export default {
     };
   },
   methods: {
+    trimInput(field) {
+      if (typeof this.queryParams[field] === 'string') {
+        this.queryParams[field] = this.queryParams[field].trim();
+      }
+    },
     setRows(rows){
       this.shows = true;
       this.rows = rows || [];

+ 88 - 0
src/views/course/courseWatchLog/index.vue

@@ -460,6 +460,7 @@
         <template slot-scope="scope">
           <el-button @click="openAnswerLogFun(scope.row)" type="text" size="small">答题记录</el-button>
           <el-button @click="openRedLogFun(scope.row)" type="text" size="small">红包记录</el-button>
+          <el-button @click="openCouponLogFun(scope.row)" type="text" size="small">优惠券记录</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -577,6 +578,50 @@
       />
     </el-drawer>
 
+        <!-- 优惠券记录 Drawer -->
+    <el-drawer title="优惠券记录" :visible.sync="openCouponLog" size="70%" append-to-body>
+      <el-table border v-loading="loadingCouponLog" :data="couponLogsList">
+         <!-- 新增:展示当前行数据的列 -->
+        <el-table-column label="用户昵称" align="center" width="120">
+          <template slot-scope="scope">
+            <!-- 这里其实每一行都显示同一个用户,因为是根据用户查询的 -->
+            {{ currentRow ? currentRow.fsNickName : '-' }}
+          </template>
+        </el-table-column>
+        
+        <el-table-column label="课程名称" align="center" min-width="150">
+          <template slot-scope="scope">
+             {{ currentRow ? currentRow.courseName : '-' }}
+          </template>
+        </el-table-column>
+
+        <el-table-column label="小节名称" align="center" min-width="150">
+          <template slot-scope="scope">
+             {{ currentRow ? currentRow.videoName : '-' }}
+          </template>
+        </el-table-column>
+        <el-table-column label="优惠券名称" align="center" prop="couponName" />
+        <el-table-column label="状态" align="center" prop="status">
+             <template slot-scope="scope">
+                <!-- 根据实际后端返回的状态值调整显示逻辑 -->
+                <el-tag :type="scope.row.status === 1 ? 'success' : 'info'">
+                   {{ scope.row.status === 1 ? '已使用' : '未使用' }}
+                </el-tag>
+             </template>
+        </el-table-column>
+        <el-table-column label="领取时间" align="center" prop="createTime" />
+        <el-table-column label="使用时间" align="center" prop="updateTime" />
+      </el-table>
+
+      <pagination
+        v-show="couponLogTotal>0"
+        :total="couponLogTotal"
+        :page.sync="couponLogQueryParams.pageNum"
+        :limit.sync="couponLogQueryParams.pageSize"
+        @pagination="getCouponLogList"
+      />
+    </el-drawer>
+
     <el-dialog title="批量添加标签" :visible.sync="tagOpen" width="800px" append-to-body>
       <div>搜索标签:
         <el-input v-model="tagChange.tagName" placeholder="请输入标签名称" clearable size="small" style="width: 200px;margin-right: 10px" />
@@ -723,6 +768,7 @@ import {treeselect} from "@/api/company/companyDept";
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 import {getCourseConfigByRewardType} from "../../../api/system/config";
+import {getRecordList} from "@/api/course/courseCouponUser";
 
 Vue.use(Calendar)
 
@@ -864,6 +910,18 @@ export default {
         pageSize: 10,
       },
 
+      // 优惠券记录
+      openCouponLog: false,
+      loadingCouponLog: false,
+      couponLogsList: [],
+      couponLogTotal: 0,
+      couponLogQueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        logId: null, // 关联的看课记录ID
+      },
+      currentRow : null,
+
       isVipList: [
         { dictLabel: '是', dictValue: 1 },
         { dictLabel: '否', dictValue: 0 }
@@ -973,6 +1031,36 @@ export default {
     this.loading=false;
   },
   methods: {
+
+     // 打开优惠券记录弹窗
+    openCouponLogFun(row) {
+      // 确保传入的 row 不是 null 或 undefined
+      if (!row) {
+        this.$message.error('无法获取当前行数据');
+        return;
+      }
+      this.currentRow  = row;
+      this.openCouponLog = true;
+      // 重置分页参数
+      this.couponLogQueryParams.pageNum = 1;
+      this.couponLogQueryParams.logId = row.logId;
+      this.couponLogQueryParams.userId = row.userId; // 假设行数据中有userId
+      this.getCouponLogList();
+      
+    },
+
+    // 获取优惠券记录列表
+    getCouponLogList() {
+      this.loadingCouponLog = true;
+      getRecordList(this.couponLogQueryParams).then(response => {
+        // 根据实际接口返回结构调整,通常是 response.rows 和 response.total
+        this.couponLogsList = response.rows || [];
+        this.couponLogTotal = response.total || 0;
+        this.loadingCouponLog = false;
+      }).catch(() => {
+        this.loadingCouponLog = false;
+      });
+    },
     getCourseByRewardType(){
           getCourseConfigByRewardType().then(res=>{
               this.RewardType=res.rewardType;

+ 19 - 4
src/views/live/live/index.vue

@@ -428,10 +428,10 @@
   </span>
     </el-dialog>
 
-      <el-dialog title="选择销售公司" :visible.sync="statusDialog.open" width="500px" append-to-body>
+      <el-dialog title="选择销售所属企微主体" :visible.sync="statusDialog.open" width="500px" append-to-body>
           <el-form ref="corpForm" :model="corpForm" :rules="corpIdRules" label-width="100px">
-              <el-form-item label="状态" prop="corpId">
-                  <el-select v-model="corpForm.corpId" placeholder="请选择销售公司" size="small">
+              <el-form-item label="主体" prop="corpId">
+                  <el-select v-model="corpForm.corpId" placeholder="选择销售所属企微主体" size="small">
                       <el-option
                           v-for="dict in myQwCompanyList"
                           :key="dict.dictValue"
@@ -440,6 +440,16 @@
                       />
                   </el-select>
               </el-form-item>
+              <el-form-item label="选择app" prop="appName">
+                  <el-select v-model="corpForm.appName" placeholder="请选择app" size="small">
+                      <el-option
+                          v-for="dict in AppAllListList"
+                          :key="dict.id"
+                          :label="dict.name"
+                          :value="dict.name"
+                      />
+                  </el-select>
+              </el-form-item>
           </el-form>
           <div slot="footer" class="dialog-footer">
               <el-button @click="statusDialog.open = false">取 消</el-button>
@@ -469,6 +479,7 @@ import Editor from '@/components/Editor/wang';
 import user from '@/store/modules/user';
 import VideoUpload from "@/components/LiveVideoUpload/single.vue";
 import {listTag} from "@/api/qw/tag";
+import {getAppAllLint, getAppAllList} from "../../../api/live/live";
 
 export default {
   name: "Live",
@@ -477,9 +488,10 @@ export default {
     return {
         //公司列表
       myQwCompanyList:[],
+      AppAllListList:[],
         statusDialog: {
             open: false,
-            title: "选择销售公司"
+            title: "选择销售所属企微公司"
         },
       liveTypeDictList: [],
       // 是否只读
@@ -610,6 +622,9 @@ export default {
 
           }
       });
+      getAppAllList().then(res=>{
+          this.AppAllListList=res.data;
+      })
   },
   watch: {
     'form.startTime': {