xdd 2 hónapja
szülő
commit
a81bb94008

+ 5 - 5
src/api/wxUser/wxUser.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询个微用户列表
 export function listWxUser(query) {
   return request({
-    url: '/company/wxUser/list',
+    url: '/company/wxuser/list',
     method: 'get',
     params: query
   })
@@ -12,7 +12,7 @@ export function listWxUser(query) {
 // 查询个微用户详细
 export function getWxUser(userId) {
   return request({
-    url: '/company/wxUser/' + userId,
+    url: '/company/wxuser/' + userId,
     method: 'get'
   })
 }
@@ -20,7 +20,7 @@ export function getWxUser(userId) {
 // 新增个微用户
 export function addWxUser(data) {
   return request({
-    url: '/company/wxUser',
+    url: '/company/wxuser',
     method: 'post',
     data: data
   })
@@ -29,7 +29,7 @@ export function addWxUser(data) {
 // 修改个微用户
 export function updateWxUser(data) {
   return request({
-    url: '/company/wxUser',
+    url: '/company/wxuser',
     method: 'put',
     data: data
   })
@@ -38,7 +38,7 @@ export function updateWxUser(data) {
 // 删除个微用户
 export function delWxUser(userId) {
   return request({
-    url: '/company/wxUser/' + userId,
+    url: '/company/wxuser/' + userId,
     method: 'delete'
   })
 }

+ 303 - 0
src/views/company/companyUser/gwQueryListDialog/gwQueryListDialog.vue

@@ -0,0 +1,303 @@
+<template>
+  <el-dialog title="个微搜索" :visible.sync="gwSearchOpen" width="800px" append-to-body>
+
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="所属销售" prop="companyUserId">
+        <el-select v-model="queryParams.companyUserId" remote placeholder="请选择" filterable clearable  style="width: 100%;" @keyup.enter.native="handleQuery">
+          <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="nickName">
+        <el-input
+          v-model="queryParams.nickName"
+          placeholder="请输入微信昵称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="微信号" prop="weixinId">
+        <el-input
+          v-model="queryParams.weixinId"
+          placeholder="请输入微信号"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
+          <el-option v-for="dict in personalWechatStatusOptions"
+                     :key="dict.dictValue"
+                     :label="dict.dictLabel"
+                     :value="dict.dictValue"
+          />
+        </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-table 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="companyUserName" />
+      <el-table-column label="微信昵称" align="center" prop="nickName" />
+      <el-table-column label="微信号" align="center" prop="weixinId" />
+      <el-table-column label="状态" align="center" prop="statusText" />
+      <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"
+            @click="handleSelected(scope.row)"
+            v-hasPermi="['system:user: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"
+    />
+  </div>
+  </el-dialog>
+</template>
+
+<script>
+import { listWxUser, getWxUser, delWxUser, addWxUser, updateWxUser, exportWxUser } from "@/api/wxUser/wxUser";
+import {getUserList} from "@/api/company/companyUser";
+
+export default {
+  name: "gwQueryListDialog",
+  props:{
+    visible:{
+      type:Boolean,
+      default:false
+    }
+  },
+  watch: {
+    visible(val) {
+      this.gwSearchOpen = val
+    },
+    gwSearchOpen(val) {
+      this.$emit('update:visible', val)
+    }
+  },
+  data() {
+    return {
+      gwSearchOpen: this.visible,
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 【个人微信】表格数据
+      userList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        companyId: null,
+        companyUserId: null,
+        nickName: null,
+        weixinId: null,
+        status: null,
+        avatar: null,
+        groupId: null,
+        fsUserId: null,
+        accountId: null
+      },
+      personalWechatStatusOptions: [],
+      // 表单参数
+      form: {},
+      companyUserList: [],
+      // 表单校验
+      rules: {
+        weixinId: [
+          { required: true, message: "微信号不能为空", trigger: "blur" }
+        ],
+        status: [
+          { required: true, message: "状态不能为空", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+    getUserList().then(res=>{
+      if(res.code === 200) {
+        this.companyUserList = res.data
+      }
+    })
+    // 获取个人微信状态字典
+    this.getDicts('personal_wechat_status').then(response => {
+      this.personalWechatStatusOptions = response.data;
+    })
+  },
+  computed:{
+    /**
+     * 处理 el-radio-group v-model 可能需要字符串类型的问题
+     * 假设 form.status 的实际类型是 Number
+     */
+    statusModel: {
+      get() {
+        // 读取时转为字符串
+        return this.form.status?.toString();
+      },
+      set(newVal) {
+        // 写入时根据需要转回 Number 或保持 String,取决于后端接口
+        // 如果后端 status 字段是 Number 类型:
+        this.form.status = newVal === null || newVal === undefined || newVal === '' ? null : Number(newVal);
+        // 如果后端 status 字段是 String 类型:
+        // this.form.status = newVal;
+      }
+    }
+  },
+  methods: {
+    handleSelected(row){
+      this.$emit('selected',row.userId)
+    },
+    /** 查询【个人微信】列表 */
+    getList() {
+      this.loading = true;
+      listWxUser(this.queryParams).then(response => {
+        this.userList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        userId: null,
+        companyId: null,
+        companyUserId: null,
+        nickName: null,
+        weixinId: null,
+        status: '1',
+        remark: null,
+        createTime: null,
+        avatar: null,
+        groupId: null,
+        fsUserId: null,
+        accountId: 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.userId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加【个人微信】";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const userId = row.userId || this.ids
+      getWxUser(userId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改【个人微信】";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.userId != null) {
+            updateWxUser(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("修改成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          } else {
+            addWxUser(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("新增成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$confirm('是否确认删除【个人微信】编号为"' + userIds + '"的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(function() {
+        return delUser(userIds);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("删除成功");
+      }).catch(function() {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有【个人微信】数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(function() {
+        return exportUser(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function() {});
+    }
+  }
+};
+</script>

+ 48 - 21
src/views/company/companyUser/index.vue

@@ -99,6 +99,14 @@
           </el-table-column>
           <el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width">
             <template slot-scope="scope">
+              <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="gwBind(scope.row)"
+                v-hasPermi="['qw:user:bind']"
+              >绑定个微</el-button>
+
               <el-button
                 v-if="scope.row.qwStatus == 0"
                 size="mini"
@@ -154,6 +162,27 @@
         <el-button @click="qwCancel">取 消</el-button>
       </div>
     </el-dialog>
+    <el-dialog title="绑定个微账号" :visible.sync="gwOpen" width="800px" append-to-body>
+      <el-form ref="gwForm" :model="gwForm" label-width="80px">
+        <el-form-item label="查询"  prop="companyUserId">
+          <el-button type="primary" icon="el-icon-search"  @click="selectGwUser()"  size="mini">搜索账号</el-button>
+        </el-form-item>
+        <el-form-item label="个微账号"  prop="companyUserId">
+
+          <el-tag
+            style="margin-left: 5px"
+            size="medium"
+            :key="id"
+            v-for="id in qwUser"
+            closable
+            :disable-transitions="false"
+            @close="handleClosegroupUser(id)">
+            <span v-for="list in qwUserList" :key="list.qwUserId" v-if="list.id==id">{{list.qwUserName}}({{list.corpName}})
+            </span>
+          </el-tag>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
     <el-dialog title="选择企微主体" :visible.sync="synOpen" width="800px" append-to-body>
 
       <el-form   label-width="80px">
@@ -275,29 +304,10 @@
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
-
-<!--    &lt;!&ndash; 用户导入对话框 &ndash;&gt;-->
-<!--    <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>-->
-<!--      <el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>-->
-<!--        <i class="el-icon-upload"></i>-->
-<!--        <div class="el-upload__text">-->
-<!--          将文件拖到此处,或-->
-<!--          <em>点击上传</em>-->
-<!--        </div>-->
-<!--        <div class="el-upload__tip" slot="tip">-->
-<!--          <el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据-->
-<!--          <el-link type="info" style="font-size:12px" @click="importTemplate">下载模板</el-link>-->
-<!--        </div>-->
-<!--        <div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入“xls”或“xlsx”格式文件!</div>-->
-<!--      </el-upload>-->
-<!--      <div slot="footer" class="dialog-footer">-->
-<!--        <el-button type="primary" @click="submitFileForm">确 定</el-button>-->
-<!--        <el-button @click="upload.open = false">取 消</el-button>-->
-<!--      </div>-->
-<!--    </el-dialog>-->
     <el-dialog :title="user.title" :visible.sync="user.open" width="800px" append-to-body>
       <selectUser ref="selectUser" @bindQwUser="bindQwUser"></selectUser>
     </el-dialog>
+    <gw-query-list-dialog :visible="gwSearchOpen"/>
   </div>
 </template>
 
@@ -311,9 +321,11 @@ import {bindQwUser, getQwUserList, addQwUser, getQwUser, getQwUserByIds} from '@
 import { syncDept } from '@/api/qw/qwDept';
 import { getMyQwUserList,getMyQwCompanyList } from "@/api/qw/user";
 import  selectUser  from "@/views/company/components/selectQwUser.vue";
+import {listWxUser} from "@/api/wxUser/wxUser";
+import GwQueryListDialog from "@/views/company/companyUser/gwQueryListDialog/gwQueryListDialog.vue";
 export default {
   name: "User",
-  components: { Treeselect ,selectUser},
+  components: {GwQueryListDialog, Treeselect ,selectUser},
   data() {
     return {
       // 遮罩层
@@ -347,6 +359,9 @@ export default {
       // 是否显示弹出层
       open: false,
       qwOpen:false,
+      gwOpen: false,
+      gwSearchOpen: false,
+      wxUserList: [],
       // 部门名称
       deptName: undefined,
       // 默认密码
@@ -369,6 +384,8 @@ export default {
         id:null,
         companyUserId:null,
       },
+      gwForm: {
+      },
       // 表单参数
       form: {},
       defaultProps: {
@@ -464,6 +481,16 @@ export default {
     });
   },
   methods: {
+    // 绑定个微
+    gwBind(row){
+      this.gwOpen = true
+    },
+    // 查询个微账号
+    selectGwUser(){
+      listWxUser().then(res=>{
+        this.gwSearchOpen = true;
+      })
+    },
     /** 查询用户列表 */
     getList() {
       this.loading = true;

+ 17 - 10
src/views/course/courseWatchLog/watchLogStatistics.vue

@@ -2,14 +2,15 @@
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
 
-      <el-form-item label="企微昵称" prop="nickName" >
-        <el-input
-          v-model="queryParams.nickName"
-          placeholder="请输入企微昵称"
-          clearable
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
+      <el-form-item label="销售用户名" prop="nickName" >
+        <el-select v-model="queryParams.companyUserId" remote placeholder="请选择" filterable clearable  style="width: 100%;" @keyup.enter.native="handleQuery">
+          <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>
 
 
@@ -39,9 +40,8 @@
     </el-row>
 
     <el-table border v-loading="loading" :data="courseWatchLogList" @selection-change="handleSelectionChange">
-      <el-table-column label="企微客户" align="center" prop="externalUserName"/>
+      <el-table-column label="销售名称" align="center" prop="userName"/>
 <!--      <el-table-column label="所属销售" align="center" prop="companyUserName" /> -->
-      <el-table-column label="企微员工名称" align="center" prop="qwUserName" />
       <el-table-column label="创建时间" align="center" prop="createTime" />
       <el-table-column label="进线时间" align="center" prop="userCreateTime" />
     </el-table>
@@ -61,6 +61,7 @@
 import { listCourseWatchLog, getCourseWatchLog, delCourseWatchLog, addCourseWatchLog, updateCourseWatchLog, exportCourseWatchLog,watchLogStatistics,watchLogStatisticsExport } from "@/api/course/courseWatchLog";
 import {allList}from "@/api/company/company";
 import { courseList,videoList } from '@/api/course/courseRedPacketLog'
+import {getUserList} from "@/api/company/companyUser";
 export default {
   name: "CourseWatchLog",
   data() {
@@ -113,6 +114,7 @@ export default {
         scheduleStartTime: null,
         scheduleEndTime: null,
       },
+      companyUserList: [],
       // 表单参数
       form: {},
       // 表单校验
@@ -129,6 +131,11 @@ export default {
     this.getDicts("sys_course_watch_log_type").then(response => {
       this.logTypeOptions = response.data;
     });
+    getUserList().then(res=>{
+      if(res.code === 200) {
+        this.companyUserList = res.data
+      }
+    })
   },
   methods: {
     courseChange(row){

+ 412 - 0
src/views/wxUser/index.vue

@@ -0,0 +1,412 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="所属销售" prop="companyUserId">
+        <el-select v-model="queryParams.companyUserId" remote placeholder="请选择" filterable clearable  style="width: 100%;" @keyup.enter.native="handleQuery">
+          <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="nickName">
+        <el-input
+          v-model="queryParams.nickName"
+          placeholder="请输入微信昵称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="微信号" prop="weixinId">
+        <el-input
+          v-model="queryParams.weixinId"
+          placeholder="请输入微信号"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
+          <el-option v-for="dict in personalWechatStatusOptions"
+                     :key="dict.dictValue"
+                     :label="dict.dictLabel"
+                     :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="所属分组" prop="groupId">
+        <el-input
+          v-model="queryParams.groupId"
+          placeholder="请输入所属分组"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="小程序用户id" prop="fsUserId">
+        <el-input
+          v-model="queryParams.fsUserId"
+          placeholder="请输入小程序用户id"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="个微账户ID" prop="accountId">
+        <el-input
+          v-model="queryParams.accountId"
+          placeholder="请输入个微账户ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </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">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['system:user: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="['system:user: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="['system:user:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['system:user:export']"
+        >导出</el-button>
+      </el-col>
+	  <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table 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="companyUserName" />
+      <el-table-column label="微信昵称" align="center" prop="nickName" />
+      <el-table-column label="微信号" align="center" prop="weixinId" />
+      <el-table-column label="状态" align="center" prop="statusText" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="头像" align="center" prop="avatar" />
+      <el-table-column label="所属分组" align="center" prop="groupId" />
+      <el-table-column label="小程序用户id" align="center" prop="fsUserId" />
+      <el-table-column label="个微账户ID" align="center" prop="accountId" />
+      <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="['system:user:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:user:remove']"
+          >删除</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="80px">
+        <el-form-item label="所属销售"  style="height: 50px;">
+          <el-select v-model="form.companyUserId" remote placeholder="请选择" filterable clearable  style="width: 100%;">
+            <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="nickName">
+          <el-input v-model="form.nickName" placeholder="请输入微信昵称" />
+        </el-form-item>
+        <el-form-item label="微信号" prop="weixinId">
+          <el-input v-model="form.weixinId" placeholder="请输入微信号" />
+        </el-form-item>
+        <el-form-item label="状态">
+          <el-select v-model="statusModel" placeholder="请选择状态" clearable size="small">
+            <el-option v-for="dict in personalWechatStatusOptions"
+                       :key="dict.dictValue"
+                       :label="dict.dictLabel"
+                       :value="dict.dictValue"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+        <el-form-item label="头像" prop="avatar">
+          <el-input v-model="form.avatar" placeholder="请输入头像" />
+        </el-form-item>
+        <el-form-item label="所属分组" prop="groupId">
+          <el-input v-model="form.groupId" placeholder="请输入所属分组" />
+        </el-form-item>
+        <el-form-item label="小程序用户id" prop="fsUserId">
+          <el-input v-model="form.fsUserId" placeholder="请输入小程序用户id" />
+        </el-form-item>
+        <el-form-item label="个微账户ID" prop="accountId">
+          <el-input v-model="form.accountId" placeholder="请输入个微账户ID" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listWxUser, getWxUser, delWxUser, addWxUser, updateWxUser, exportWxUser } from "@/api/wxUser/wxUser";
+import {getUserList} from "@/api/company/companyUser";
+
+export default {
+  name: "User",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 【个人微信】表格数据
+      userList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        companyId: null,
+        companyUserId: null,
+        nickName: null,
+        weixinId: null,
+        status: null,
+        avatar: null,
+        groupId: null,
+        fsUserId: null,
+        accountId: null
+      },
+      personalWechatStatusOptions: [],
+      // 表单参数
+      form: {},
+      companyUserList: [],
+      // 表单校验
+      rules: {
+        weixinId: [
+          { required: true, message: "微信号不能为空", trigger: "blur" }
+        ],
+        status: [
+          { required: true, message: "状态不能为空", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+    getUserList().then(res=>{
+      if(res.code === 200) {
+        this.companyUserList = res.data
+      }
+    })
+    // 获取个人微信状态字典
+    this.getDicts('personal_wechat_status').then(response => {
+      this.personalWechatStatusOptions = response.data;
+    })
+  },
+  computed:{
+    /**
+     * 处理 el-radio-group v-model 可能需要字符串类型的问题
+     * 假设 form.status 的实际类型是 Number
+     */
+    statusModel: {
+      get() {
+        // 读取时转为字符串
+        return this.form.status?.toString();
+      },
+      set(newVal) {
+        // 写入时根据需要转回 Number 或保持 String,取决于后端接口
+        // 如果后端 status 字段是 Number 类型:
+        this.form.status = newVal === null || newVal === undefined || newVal === '' ? null : Number(newVal);
+        // 如果后端 status 字段是 String 类型:
+        // this.form.status = newVal;
+      }
+    }
+  },
+  methods: {
+    /** 查询【个人微信】列表 */
+    getList() {
+      this.loading = true;
+      listWxUser(this.queryParams).then(response => {
+        this.userList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        userId: null,
+        companyId: null,
+        companyUserId: null,
+        nickName: null,
+        weixinId: null,
+        status: '1',
+        remark: null,
+        createTime: null,
+        avatar: null,
+        groupId: null,
+        fsUserId: null,
+        accountId: 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.userId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加【个人微信】";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const userId = row.userId || this.ids
+      getWxUser(userId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改【个人微信】";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.userId != null) {
+            updateWxUser(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("修改成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          } else {
+            addWxUser(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("新增成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$confirm('是否确认删除【个人微信】编号为"' + userIds + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delUser(userIds);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(function() {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有【个人微信】数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportUser(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>