浏览代码

95:红德堂APP调试 同步会员项目代码

Long 3 月之前
父节点
当前提交
d33bdebf87

+ 27 - 0
src/api/company/companyApply.js

@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+
+// 查询更换会员归属申请列表
+export function listApply(query) {
+  return request({
+    url: '/company/apply/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询更换会员归属申请详细
+export function getApply(id) {
+  return request({
+    url: '/company/apply/' + id,
+    method: 'get'
+  })
+}
+
+// 审核更换会员归属申请
+export function auditApply(data) {
+  return request({
+    url: '/company/apply/audit',
+    method: 'post',
+    data: data
+  })
+}

+ 404 - 0
src/views/company/companyApply/index.vue

@@ -0,0 +1,404 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="审核状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择审核状态" clearable size="small">
+          <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="cyan" 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">
+	  <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="applyList" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" />
+      <el-table-column label="原归属销售" align="center" prop="fromName" />
+      <el-table-column label="申请归属销售" align="center" prop="toName" />
+      <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-tag v-if="scope.row.status === 2" type="danger">拒绝</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="申请人" align="center" prop="applyBy" />
+      <el-table-column label="申请时间" align="center" prop="applyTime"/>
+      <el-table-column label="审核人" align="center" prop="auditBy" />
+      <el-table-column label="审核时间" align="center" prop="auditTime" />
+      <el-table-column label="拒绝原因" align="center" prop="reason" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            v-if="scope.row.status === 0"
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleAudit(scope.row)"
+            v-hasPermi="['company:apply:audit']"
+          >审核</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDetails(scope.row)"
+            v-hasPermi="['company:apply:query']"
+          >详情</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="申请详情"
+      :visible.sync="detailsVisible"
+      width="50%"
+      :close-on-click-modal="false"
+      custom-class="apply-details-dialog"
+    >
+      <!-- 申请基本信息 -->
+      <div class="details-header">
+        <div class="info-item">
+          <span class="label">原归属销售:</span>
+          <span class="value">{{ selectedApply.fromName }}</span>
+        </div>
+        <div class="info-item">
+          <span class="label">申请归属销售:</span>
+          <span class="value">{{ selectedApply.toName }}</span>
+        </div>
+        <div class="info-item">
+          <span class="label">申请时间:</span>
+          <span class="value">{{ selectedApply.applyTime }}</span>
+        </div>
+        <div class="info-item">
+          <span class="label">审核状态:</span>
+          <el-tag :type="selectedApply.status === 0 ? 'warning' : selectedApply.status === 1 ? 'success' : 'danger'">
+            {{ selectedApply.status === 0 ? '待审核' : selectedApply.status === 1 ? '通过' : '拒绝' }}
+          </el-tag>
+        </div>
+      </div>
+
+      <!-- 用户列表 -->
+      <div class="details-content">
+        <div class="content-title">变更用户列表</div>
+        <el-table
+          :data="selectedUsers"
+          border
+          style="width: 100%"
+          :header-cell-style="{background:'#f5f7fa',color:'#606266'}"
+        >
+          <el-table-column prop="projectId" label="项目" align="center">
+            <template slot-scope="scope">
+              <el-tag v-if="scope.row.projectId !== null">{{ getProjectLabel(scope.row.projectId) }}</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column prop="userId" label="用户ID" align="center"></el-table-column>
+          <el-table-column prop="userName" label="姓名" align="center"></el-table-column>
+        </el-table>
+      </div>
+
+      <!-- 底部操作区 -->
+      <div class="details-footer">
+        <el-button @click="detailsVisible = false">关闭</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 审核对话框 -->
+    <el-dialog
+      title="审核申请"
+      :visible.sync="auditVisible"
+      width="40%"
+      :close-on-click-modal="false"
+      custom-class="audit-dialog"
+    >
+      <!-- 审核表单 -->
+      <el-form ref="auditForm" :model="auditForm" :rules="auditRules" label-width="100px">
+        <el-form-item label="原归属销售" prop="fromName">
+          <span>{{ auditForm.fromName }}</span>
+        </el-form-item>
+        <el-form-item label="申请归属销售" prop="toName">
+          <span>{{ auditForm.toName }}</span>
+        </el-form-item>
+        <el-form-item label="审核结果" prop="status">
+          <el-radio-group v-model="auditForm.status">
+            <el-radio :label="1">通过</el-radio>
+            <el-radio :label="2">拒绝</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item
+          label="拒绝原因"
+          prop="reason"
+          v-if="auditForm.status === 2"
+        >
+          <el-input
+            type="textarea"
+            v-model="auditForm.reason"
+            placeholder="请输入拒绝原因"
+            :rows="3"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+
+      <!-- 底部操作区 -->
+      <div class="audit-footer">
+        <el-button @click="auditVisible = false">取 消</el-button>
+        <el-button type="primary" @click="submitAudit" :loading="submitLoading">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listApply, getApply, auditApply } from "@/api/company/companyApply";
+
+export default {
+  name: "Apply",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 更换会员归属申请表格数据
+      applyList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        status: null
+      },
+      // 详情对话框
+      detailsVisible: false,
+      // 选中的用户
+      selectedUsers: [],
+      // 选中的申请
+      selectedApply: {},
+      // 审核对话框
+      auditVisible: false,
+      // 提交加载状态
+      submitLoading: false,
+      // 审核表单
+      auditForm: {
+        id: undefined,
+        status: 1,
+        reason: ''
+      },
+      // 审核表单校验规则
+      auditRules: {
+        status: [
+          { required: true, message: "请选择审核结果", trigger: "change" }
+        ],
+        reason: [
+          { required: true, message: "请输入拒绝原因", trigger: "blur" }
+        ]
+      },
+      projectOptions: [],
+    };
+  },
+  created() {
+    this.getDicts("sys_course_project").then(response => {
+      this.projectOptions = response.data;
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询更换会员归属申请列表 */
+    getList() {
+      this.loading = true;
+      listApply(this.queryParams).then(response => {
+        this.applyList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 详情按钮操作 */
+    handleDetails(row) {
+      this.detailsVisible = true;
+      this.selectedApply = row;
+      getApply(row.id).then(response => {
+        this.selectedUsers = response.data.users;
+      });
+    },
+    /** 审核按钮操作 */
+    handleAudit(row) {
+      this.auditVisible = true;
+      this.auditForm = {
+        id: row.id,
+        fromName: row.fromName,
+        toName: row.toName,
+        status: 1,
+        reason: ''
+      };
+    },
+    /** 提交审核 */
+    submitAudit() {
+      this.$refs["auditForm"].validate(valid => {
+        if (valid) {
+          // 如果选择通过,不需要填写原因
+          if (this.auditForm.status === 1) {
+            this.auditForm.reason = '';
+          }
+
+          this.submitLoading = true;
+          auditApply(this.auditForm).then(response => {
+            this.msgSuccess("审核成功");
+            this.auditVisible = false;
+            this.getList();
+          }).catch(error => {
+            this.msgError("审核失败:" + error);
+          }).finally(() => {
+            this.submitLoading = false;
+          });
+        }
+      });
+    },
+    /** 获取项目对应名称 */
+    getProjectLabel(projectId) {
+      return this.projectOptions.find(item => parseInt(item.dictValue) === projectId)?.dictLabel;
+    },
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+/* 详情弹窗样式 */
+.apply-details-dialog {
+  ::v-deep .el-dialog__body {
+    padding: 20px;
+  }
+
+  /* 头部信息样式 */
+  .details-header {
+    display: flex;
+    flex-wrap: wrap;
+    padding: 15px;
+    background-color: #f8f9fa;
+    border-radius: 4px;
+    margin-bottom: 20px;
+
+    .info-item {
+      width: 50%;
+      margin-bottom: 10px;
+      display: flex;
+      align-items: center;
+
+      .label {
+        color: #606266;
+        font-size: 14px;
+        width: 100px;
+        text-align: right;
+      }
+
+      .value {
+        color: #303133;
+        font-size: 14px;
+        margin-left: 10px;
+      }
+    }
+  }
+
+  /* 内容区域样式 */
+  .details-content {
+    .content-title {
+      font-size: 16px;
+      color: #303133;
+      font-weight: bold;
+      margin-bottom: 15px;
+      padding-left: 10px;
+      border-left: 3px solid #409EFF;
+    }
+  }
+
+  /* 底部样式 */
+  .details-footer {
+    margin-top: 20px;
+    text-align: right;
+    padding-top: 15px;
+    border-top: 1px solid #ebeef5;
+  }
+}
+
+/* 表格样式优化 */
+::v-deep .el-table {
+  .el-table__header-wrapper {
+    th {
+      background-color: #f5f7fa;
+      color: #606266;
+      font-weight: bold;
+    }
+  }
+
+  .el-table__body-wrapper {
+    tr:hover > td {
+      background-color: #f5f7fa;
+    }
+  }
+}
+
+/* 审核弹窗样式 */
+.audit-dialog {
+  ::v-deep .el-dialog__body {
+    padding: 20px;
+  }
+
+  /* 表单样式 */
+  .el-form {
+    padding: 20px 0;
+
+    .el-form-item {
+      margin-bottom: 20px;
+
+      span {
+        color: #606266;
+        font-size: 14px;
+      }
+    }
+  }
+
+  /* 底部样式 */
+  .audit-footer {
+    margin-top: 20px;
+    text-align: right;
+    padding-top: 15px;
+    border-top: 1px solid #ebeef5;
+  }
+}
+</style>

+ 52 - 77
src/views/member/list.vue

@@ -2,6 +2,26 @@
   <div class="app-container">
     <!-- Search Form -->
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="80px">
+      <el-form-item label="项目" prop="projectId">
+        <el-select  v-model="queryParams.projectId" placeholder="请选择项目" clearable size="small" >
+          <el-option
+            v-for="item in projectOptions"
+            :key="item.dictValue"
+            :label="item.dictLabel"
+            :value="item.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="会员ID" prop="userId">
+        <el-input
+          style="width: 200px"
+          v-model="queryParams.userId"
+          placeholder="请输入会员ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
       <el-form-item label="昵称" prop="nickname">
         <el-input
           style="width: 200px"
@@ -74,19 +94,7 @@
         <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="warning"
-          icon="el-icon-d-arrow-right"
-          size="mini"
-          :disabled="multiple"
-          @click="handleTransfer"
-          v-hasPermi="['company:user:transfer']"
-        >转移</el-button>
-      </el-col>
-    </el-row>
+
     <!-- Tab Selection -->
     <!--    <el-tabs v-model="queryParams.tabValue" @tab-click="handleTabChange">-->
     <!--      <el-tab-pane label="全部" name="0"></el-tab-pane>-->
@@ -143,9 +151,14 @@
     </el-row>
 
     <!-- User Table -->
-    <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
+    <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange" border>
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="ID" align="center" prop="userId" />
+      <el-table-column label="项目" align="center" prop="projectId">
+        <template slot-scope="scope">
+          <el-tag v-if="scope.row.projectId !== null">{{ getProjectLabel(scope.row.projectId) }}</el-tag>
+        </template>
+      </el-table-column>
       <el-table-column label="昵称" align="center" prop="nickname" />
       <el-table-column label="头像" align="center" width="80">
         <template slot-scope="scope">
@@ -180,12 +193,19 @@
       </el-table-column>
       <el-table-column label="标签" align="center" prop="tag" show-overflow-tooltip />
       <el-table-column label="最后看课时间" align="center" prop="lastWatchDate" width="160" />
-      <el-table-column label="停课天数" align="center" prop="stopWatchDays" />
+<!--      <el-table-column label="停课天数" align="center" prop="stopWatchDays" />-->
       <el-table-column label="注册时间" align="center" prop="createTime" width="160" />
       <el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip />
       <el-table-column label="所属员工" align="center" prop="companyUserNickName" />
       <el-table-column label="操作" align="center" width="120" 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="['store:user:edit']"
+          >修改</el-button>
           <el-button
             size="mini"
             type="text"
@@ -286,35 +306,6 @@
       </div>
     </el-dialog>
 
-    <!-- 客户转移对话框 (可选,更复杂的转移逻辑可能需要) -->
-
-    <el-dialog title="客户转移" :visible.sync="openTransferDialog" width="500px" append-to-body>
-      <el-form ref="transferForm" :model="transferForm" label-width="100px" :rules="cusTransfer">
-        <el-alert
-          title="会经过总后台审核后才进行转移"
-          type="warning">
-        </el-alert>
-        <el-form-item label="转移至销售" prop="targetUserId">
-          <el-select v-model="transferForm.targetUserId" remote placeholder="请选择" filterable clearable>
-            <el-option
-              v-for="dict in companyUserList"
-              :key="`${dict.nickName} - ${dict.userName}`"
-              :label="`${dict.nickName} - ${dict.userName}`"
-              :value="dict.userId">
-            </el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="转移原因" prop="content">
-          <el-input type="textarea" v-model="transferForm.content" placeholder="转移原因"></el-input>
-        </el-form-item>
-        <p>确定要转移选中的 <strong>{{ ids.length }}</strong> 个客户吗?</p>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="danger" @click="submitTransfer">提交申请</el-button>
-        <el-button @click="cancelTransfer">取 消</el-button>
-      </div>
-    </el-dialog>
-
     <el-drawer
         :with-header="false"
         size="75%"
@@ -327,7 +318,6 @@
 
 <script>
 import { listUser, getUser, addUser, updateUser, delUser, exportUser, auditUser } from "@/api/user/fsUser";
-import {transferUser} from "@/api/users/user";
 import {getUserList} from "@/api/company/companyUser";
 import userDetails from '@/views/store/components/userDetails.vue';
 export default {
@@ -336,7 +326,6 @@ export default {
   data() {
     return {
       show:{
-        
         open:false,
       },
       cusTransfer: {
@@ -389,7 +378,8 @@ export default {
         missCourseStatus: "0",
         continueMissCourseSort: "0",
         registerStartTime: null,
-        registerEndTime: null
+        registerEndTime: null,
+        projectId: null,
       },
       // 表单参数
       form: {},
@@ -405,7 +395,8 @@ export default {
         status: [
           { required: true, message: "状态不能为空", trigger: "change" }
         ]
-      }
+      },
+      projectOptions: []
     };
   },
   created() {
@@ -418,6 +409,9 @@ export default {
     this.getDicts("user_status").then(response => {
       this.statusOptions = response.data;
     });
+    this.getDicts("sys_course_project").then(response => {
+      this.projectOptions = response.data;
+    });
     this.getTagOptions();
     this.getSalesOptions();
   },
@@ -428,29 +422,6 @@ export default {
                  this.$refs.userDetails.getDetails(row.userId);
             }, 1);
      },
-    /** 提交转移按钮 (如果使用对话框) */
-
-    submitTransfer() {
-      this.$refs["transferForm"].validate(valid => {
-        if (valid) {
-          transferUser({
-            userIds: this.ids,
-            targetCompanyUserId: this.transferForm.targetUserId,
-            content: this.transferForm.content
-          }).then(response => {
-            if (response.code === 200) {
-              this.msgSuccess(response.msg);
-              this.openTransferDialog = false;
-              this.getList();
-            } else {
-              this.msgError(response.msg || "转移失败");
-            }
-          }).catch(() => {
-            this.msgError("转移请求失败");
-          });
-        }
-      });
-    },
     // 重置表单
     resetForm() {
       this.linkForm={
@@ -513,11 +484,11 @@ export default {
 
     /** 获取销售员工选项 */
     getSalesOptions() {
-      this.salesOptions = [
-        { userId: 1, nickName: "销售A" },
-        { userId: 2, nickName: "销售B" },
-        { userId: 3, nickName: "销售C" }
-      ];
+      getUserList().then(res=>{
+        if(res.code === 200) {
+          this.salesOptions = res.data
+        }
+      });
     },
 
     /** 获取看课状态类型 */
@@ -682,7 +653,11 @@ export default {
           }
         });
       }).catch(() => {});
-    }
+    },
+    /** 获取项目对应名称 */
+    getProjectLabel(projectId) {
+      return this.projectOptions.find(item => parseInt(item.dictValue) === projectId)?.dictLabel;
+    },
   }
 };
 </script>

+ 29 - 45
src/views/member/mylist.vue

@@ -2,6 +2,16 @@
   <div class="app-container">
     <!-- Search Form -->
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="80px">
+      <el-form-item label="项目" prop="projectId">
+        <el-select  v-model="queryParams.projectId" placeholder="请选择项目" clearable size="small" >
+          <el-option
+            v-for="item in projectOptions"
+            :key="item.dictValue"
+            :label="item.dictLabel"
+            :value="item.dictValue"
+          />
+        </el-select>
+      </el-form-item>
       <el-form-item label="昵称" prop="nickname">
         <el-input
           style="width: 200px"
@@ -74,19 +84,7 @@
         <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="warning"
-          icon="el-icon-d-arrow-right"
-          size="mini"
-          :disabled="multiple"
-          @click="handleTransfer"
-          v-hasPermi="['company:user:transfer']"
-        >转移</el-button>
-      </el-col>
-    </el-row>
+
     <!-- Tab Selection -->
     <!--    <el-tabs v-model="queryParams.tabValue" @tab-click="handleTabChange">-->
     <!--      <el-tab-pane label="全部" name="0"></el-tab-pane>-->
@@ -143,9 +141,14 @@
     </el-row>
 
     <!-- User Table -->
-    <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
+    <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange" border>
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="ID" align="center" prop="userId" />
+      <el-table-column label="项目" align="center" prop="projectId">
+        <template slot-scope="scope">
+          <el-tag v-if="scope.row.projectId !== null">{{ getProjectLabel(scope.row.projectId) }}</el-tag>
+        </template>
+      </el-table-column>
       <el-table-column label="昵称" align="center" prop="nickname" />
       <el-table-column label="头像" align="center" width="80">
         <template slot-scope="scope">
@@ -285,34 +288,6 @@
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
-    <!-- 客户转移对话框 (可选,更复杂的转移逻辑可能需要) -->
-
-    <el-dialog title="客户转移" :visible.sync="openTransferDialog" width="500px" append-to-body>
-      <el-form ref="transferForm" :model="transferForm" label-width="100px" :rules="cusTransfer">
-        <el-alert
-          title="会经过总后台审核后才进行转移"
-          type="warning">
-        </el-alert>
-        <el-form-item label="转移至销售" prop="targetUserId">
-          <el-select v-model="transferForm.targetUserId" remote placeholder="请选择" filterable clearable>
-            <el-option
-              v-for="dict in companyUserList"
-              :key="`${dict.nickName} - ${dict.userName}`"
-              :label="`${dict.nickName} - ${dict.userName}`"
-              :value="dict.userId">
-            </el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="转移原因" prop="content">
-          <el-input type="textarea" v-model="transferForm.content" placeholder="转移原因"></el-input>
-        </el-form-item>
-        <p>确定要转移选中的 <strong>{{ ids.length }}</strong> 个客户吗?</p>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="danger" @click="submitTransfer">提交申请</el-button>
-        <el-button @click="cancelTransfer">取 消</el-button>
-      </div>
-    </el-dialog>
 
     <el-drawer
         :with-header="false"
@@ -387,7 +362,8 @@ export default {
         missCourseStatus: "0",
         continueMissCourseSort: "0",
         registerStartTime: null,
-        registerEndTime: null
+        registerEndTime: null,
+        projectId: null,
       },
       // 表单参数
       form: {},
@@ -403,7 +379,8 @@ export default {
         status: [
           { required: true, message: "状态不能为空", trigger: "change" }
         ]
-      }
+      },
+      projectOptions: []
     };
   },
   created() {
@@ -416,6 +393,9 @@ export default {
     this.getDicts("user_status").then(response => {
       this.statusOptions = response.data;
     });
+    this.getDicts("sys_course_project").then(response => {
+      this.projectOptions = response.data;
+    });
     this.getTagOptions();
     this.getSalesOptions();
   },
@@ -678,7 +658,11 @@ export default {
           }
         });
       }).catch(() => {});
-    }
+    },
+    /** 获取项目对应名称 */
+    getProjectLabel(projectId) {
+      return this.projectOptions.find(item => parseInt(item.dictValue) === projectId)?.dictLabel;
+    },
   }
 };
 </script>

+ 24 - 21
src/views/users/user/darkRoom.vue

@@ -32,6 +32,7 @@
     <el-table  height="500" border v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="用户id" align="center" prop="userId" />
+      <el-table-column label="项目" align="center" prop="projectName" />
       <el-table-column label="用户昵称" align="center" prop="nickname" />
       <el-table-column label="用户头像" align="center" prop="avatar">
         <template slot-scope="scope">
@@ -44,25 +45,25 @@
         </template>
       </el-table-column>
       <el-table-column label="注册时间" align="center" prop="createTime" width="160px"/>
-      <el-table-column label="看课数量" align="center" prop="watchCourseCount" />
-      <el-table-column label="缺课数量" align="center" prop="missCourseCount" />
-      <el-table-column label="缺课状态" align="center" prop="missCourseStatus">
-        <template slot-scope="scope">
-          <el-tag effect="dark" type="danger"  v-if="scope.row.missCourseStatus === 1">已缺课</el-tag>
-          <el-tag effect="dark" type="success" v-else>未缺课</el-tag>
-        </template>
-      </el-table-column>
-      <el-table-column label="参与营期数量" align="center" prop="partCourseCount" width="100px"/>
+<!--      <el-table-column label="看课数量" align="center" prop="watchCourseCount" />-->
+<!--      <el-table-column label="缺课数量" align="center" prop="missCourseCount" />-->
+<!--      <el-table-column label="缺课状态" align="center" prop="missCourseStatus">-->
+<!--        <template slot-scope="scope">-->
+<!--          <el-tag effect="dark" type="danger"  v-if="scope.row.missCourseStatus === 1">已缺课</el-tag>-->
+<!--          <el-tag effect="dark" type="success" v-else>未缺课</el-tag>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+<!--      <el-table-column label="参与营期数量" align="center" prop="partCourseCount" width="100px"/>-->
       <el-table-column label="最后一次看课时间" align="center" prop="lastWatchDate"  width="160px"/>
-      <el-table-column label="用户状态" align="center" prop="courseCountStatus">
-        <template slot-scope="scope">
-          <el-tag effect="dark" type="success" v-if="scope.row.courseCountStatus === 1">正常</el-tag>
-          <el-tag effect="dark" type="info"    v-else-if="scope.row.courseCountStatus === 2">停止</el-tag>
-          <el-tag effect="dark" type="danger"  v-else>未看</el-tag>
-        </template>
-      </el-table-column>
-      <el-table-column label="停课天数" align="center" prop="stopWatchDays" />
-      <el-table-column label="完播时间" align="center" prop="completeWatchDate" width="160px"/>
+<!--      <el-table-column label="用户状态" align="center" prop="courseCountStatus">-->
+<!--        <template slot-scope="scope">-->
+<!--          <el-tag effect="dark" type="success" v-if="scope.row.courseCountStatus === 1">正常</el-tag>-->
+<!--          <el-tag effect="dark" type="info"    v-else-if="scope.row.courseCountStatus === 2">停止</el-tag>-->
+<!--          <el-tag effect="dark" type="danger"  v-else>未看</el-tag>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+<!--      <el-table-column label="停课天数" align="center" prop="stopWatchDays" />-->
+<!--      <el-table-column label="完播时间" align="center" prop="completeWatchDate" width="160px"/>-->
       <el-table-column label="标签名称" align="center" prop="tag" />
       <el-table-column label="所属销售名称" align="center" prop="companyUserNickName" width="120px"/>
       <el-table-column label="备注" align="center" prop="remark" />
@@ -114,8 +115,9 @@ export default {
         pageNum: 1,
         pageSize: 10,
         keyword: null,
-        isBlack: true
+        status: 2
       },
+      selectUser: []
     };
   },
   created() {
@@ -144,12 +146,13 @@ export default {
     // 多选框选中数据
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.userId)
+      this.selectedUser = selection.map(item => {return {userId: item.userId, projectId: item.projectId}})
       this.single = selection.length!==1
       this.multiple = !selection.length
     },
     // 启用
     handleUpdate(row) {
-      enabledUsers([row.userId]).then(response => {
+      enabledUsers([{userId: row.userId, projectId: row.projectId}]).then(response => {
         if (response.code === 200) {
           this.msgSuccess("取消禁用成功");
           this.getList();
@@ -160,7 +163,7 @@ export default {
     },
     // 启用
     handleUpdateBatch() {
-      enabledUsers(this.ids).then(response => {
+      enabledUsers(this.selectedUser).then(response => {
         if (response.code === 200) {
           this.msgSuccess("取消禁用成功");
           this.getList();

+ 39 - 3
src/views/users/user/transfer.vue

@@ -12,6 +12,26 @@
           </el-option>
         </el-select>
       </el-form-item>
+      <el-form-item label="会员ID" prop="userId">
+        <el-input
+          style="width: 200px"
+          v-model="queryParams.userId"
+          placeholder="请输入会员ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="会员昵称" prop="nickname">
+        <el-input
+          style="width: 200px"
+          v-model="queryParams.nickname"
+          placeholder="请输入会员昵称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
       <el-form-item label="手机号码" prop="phone">
         <el-input
           style="width: 220px"
@@ -47,6 +67,12 @@
     <el-table height="500" border v-loading="loading" :data="customerList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="客户ID" align="center" prop="userId" />
+      <el-table-column label="项目" align="center" prop="projectId">
+        <template slot-scope="scope">
+          <el-tag v-if="scope.row.projectId !== null">{{ getProjectLabel(scope.row.projectId) }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="会员ID" align="center" prop="userId" />
       <el-table-column label="昵称" align="center" prop="nickname" />
       <el-table-column label="所属销售" align="center" prop="companyUserNickName" />
       <el-table-column label="手机号码" align="center" prop="phone" />
@@ -76,7 +102,7 @@
     <el-dialog title="客户转移" :visible.sync="openTransferDialog" width="500px" append-to-body>
       <el-form ref="transferForm" :model="transferForm" label-width="100px" :rules="cusTransfer">
         <el-alert
-          title="会经过总后台审核后才进行转移"
+          title="会自动通过审核"
           type="warning">
         </el-alert>
         <el-form-item label="转移至销售" prop="targetUserId">
@@ -135,9 +161,14 @@ export default {
         salesName: null,
         phoneNumber: null,
       },
+      projectOptions: [],
+      selectedUser: [],
     };
   },
   created() {
+    this.getDicts("sys_course_project").then(response => {
+      this.projectOptions = response.data;
+    });
     getUserList().then(res=>{
       if(res.code === 200) {
         this.companyUserList = res.data
@@ -184,6 +215,7 @@ export default {
     // 多选框选中数据
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.userId)
+      this.selectedUser = selection.map(item => {return {userId: item.userId, projectId: item.projectId}})
       this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
@@ -206,7 +238,7 @@ export default {
       this.$refs["transferForm"].validate(valid => {
         if (valid) {
           transferUser({
-            userIds: this.ids,
+            userIds: this.selectedUser,
             targetCompanyUserId: this.transferForm.targetUserId,
             content: this.transferForm.content
           }).then(response => {
@@ -240,7 +272,11 @@ export default {
           // 处理下载
           this.download(response.msg); // RuoYi 提供的下载方法
         }).catch(function() {});
-    }
+    },
+    /** 获取项目对应名称 */
+    getProjectLabel(projectId) {
+      return this.projectOptions.find(item => parseInt(item.dictValue) === projectId)?.dictLabel;
+    },
 
   }
 };

+ 15 - 2
src/views/users/user/transferLog.vue

@@ -153,6 +153,11 @@
         <el-form-item label="转移矩阵" prop="customerIds">
           <el-table :data="form.customerList" border>
             <el-table-column label="客户" align="center" prop="userName" />
+            <el-table-column label="项目" align="center" prop="projectId">
+              <template slot-scope="scope">
+                <el-tag v-if="scope.row.projectId !== null">{{ getProjectLabel(scope.row.projectId) }}</el-tag>
+              </template>
+            </el-table-column>
             <el-table-column label="转移前销售" align="center" prop="beforeCompanyUserName" />
             <el-table-column label="转移后销售" align="center" prop="afterCompanyUserName" />
           </el-table>
@@ -268,7 +273,8 @@ export default {
         updatedAt: [
           { required: true, message: "记录最后更新时间不能为空", trigger: "blur" }
         ]
-      }
+      },
+      projectOptions: [],
     };
   },
   created() {
@@ -278,6 +284,9 @@ export default {
     getDicts('transfer_approval_status').then(response => {
       this.approvalStatusList = response.data;
     })
+    this.getDicts("sys_course_project").then(response => {
+      this.projectOptions = response.data;
+    });
     getUserList().then(res=>{
       if(res.code === 200) {
         this.companyUserList = res.data
@@ -393,7 +402,11 @@ export default {
         }).then(response => {
           this.download(response.msg);
         }).catch(function() {});
-    }
+    },
+    /** 获取项目对应名称 */
+    getProjectLabel(projectId) {
+      return this.projectOptions.find(item => parseInt(item.dictValue) === projectId)?.dictLabel;
+    },
   }
 };
 </script>