From 8539cd011187d85633204fc22a9c7fc7fd008605 Mon Sep 17 00:00:00 2001
From: yxh <172933527@qq.com>
Date: 星期二, 22 八月 2023 09:57:09 +0800
Subject: [PATCH] Merge branch 'wulong' of http://116.62.18.175:6699/r/~yxh/smartor-web into yxh01

---
 src/views/followvisit/outpatient/index.vue           |  897 +++
 src/views/tool/module/Editinterface.vue              |  255 +
 src/views/sfstatistics/Voicedetail/index.vue         |  379 +
 vue.config.js                                        |    3 
 src/views/sfstatistics/statement/index.vue           |  952 ++++
 src/views/shortmessage/communication/index.vue       |   90 
 src/layout/components/Navbar.vue                     |    8 
 src/views/patient/subsequent/index.vue               |   17 
 src/views/followvisit/satisfaction/index.vue         |  897 +++
 src/views/sfstatistics/propaganda/index.vue          |  951 ++++
 src/api/noteapi/chitchat.js                          |   11 
 src/views/patient/propaganda/index.vue               |   17 
 src/views/sfstatistics/analyse/index.vue             |  107 
 src/views/followvisit/record/detailpage/index.vue    |  136 
 src/views/system/label/index.vue                     |    4 
 src/views/patient/review/index.vue                   |   17 
 src/views/shortmessage/aovideo/index.vue             |  239 +
 src/views/followvisit/tasklist/index.vue             |  897 +++
 src/views/patient/physical/index.vue                 |   17 
 src/views/tool/module/classifyone.vue                |  631 ++
 src/views/tool/module/classifytwo.vue                |  177 
 src/views/complaint/complaintmy/index.vue            |  877 +++
 src/websocket/lemon-message-voice.vue                |   31 
 src/views/patient/questionnaire/index.vue            |   17 
 src/views/followvisit/linem/index.vue                |  798 +++
 src/views/followvisit/record/index.vue               | 1092 ++++
 src/views/shortmessage/messagebank/compile/index.vue |  155 
 src/views/shortmessage/aoprojection/index.vue        |  230 
 /dev/null                                            |   35 
 src/views/login.vue                                  |    7 
 src/websocket/websocket.js                           |    4 
 src/main.js                                          |    2 
 src/views/sfstatistics/percentage/index.vue          |  884 +++
 src/views/patient/servefn/index.vue                  |   27 
 package.json                                         |    2 
 src/views/shortmessage/messagebank/index.vue         |  340 
 src/views/tool/module/classifythreea.vue             |  792 +++
 src/views/shortmessage/aoconnect/index.vue           |   17 
 src/views/complaint/complaintlist/index.vue          |  893 +++
 src/views/followvisit/discharge/index.vue            |  897 +++
 src/views/patient/follow/index.vue                   |   17 
 41 files changed, 13,593 insertions(+), 226 deletions(-)

diff --git a/package.json b/package.json
index e068a32..377e396 100644
--- a/package.json
+++ b/package.json
@@ -37,6 +37,7 @@
   },
   "dependencies": {
     "@riophae/vue-treeselect": "0.4.0",
+    "@vue/babel-plugin-jsx": "^1.1.5",
     "axios": "0.24.0",
     "clipboard": "2.0.8",
     "codemirror": "^5.65.13",
@@ -60,6 +61,7 @@
     "quill-image-resize-module": "^3.0.0",
     "sass": "^1.63.6",
     "screenfull": "5.0.2",
+    "socket.io": "^2.1.1",
     "sortablejs": "1.10.2",
     "style-loader": "^3.3.3",
     "stylus-loader": "^7.1.3",
diff --git a/src/api/noteapi/chitchat.js b/src/api/noteapi/chitchat.js
new file mode 100644
index 0000000..12c05f5
--- /dev/null
+++ b/src/api/noteapi/chitchat.js
@@ -0,0 +1,11 @@
+import request from '@/utils/request'
+import { parseStrEmpty } from "@/utils/ruoyi";//澶勭悊瀛楃涓�,und,null杞崲涓�'';
+
+// 鑱婂ぉ妗嗕笂浼犳枃浠�
+export function chitchatapi(data) {
+  return request({
+    url: '/system/file/admin/uploadFile',
+    method: 'post',
+    data: data
+  })
+};
\ No newline at end of file
diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue
index 39b3dad..9aa306e 100644
--- a/src/layout/components/Navbar.vue
+++ b/src/layout/components/Navbar.vue
@@ -9,13 +9,13 @@
       <template v-if="device!=='mobile'">
         <search id="header-search" class="right-menu-item" />
         
-        <el-tooltip content="婧愮爜鍦板潃" effect="dark" placement="bottom">
+        <!-- <el-tooltip content="婧愮爜鍦板潃" effect="dark" placement="bottom">
           <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />
-        </el-tooltip>
+        </el-tooltip> -->
 
-        <el-tooltip content="鏂囨。鍦板潃" effect="dark" placement="bottom">
+        <!-- <el-tooltip content="鏂囨。鍦板潃" effect="dark" placement="bottom">
           <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />
-        </el-tooltip>
+        </el-tooltip> -->
 
         <screenfull id="screenfull" class="right-menu-item hover-effect" />
 
diff --git a/src/main.js b/src/main.js
index e21d599..5d1eefd 100644
--- a/src/main.js
+++ b/src/main.js
@@ -64,6 +64,8 @@
   selectDictLabels,
   handleTree,
 } from "@/utils/ruoyi";
+import LemonMessageVoice from './websocket/lemon-message-voice';
+Vue.component(LemonMessageVoice.name,LemonMessageVoice);
 // 鍒嗛〉缁勪欢
 import Pagination from "@/components/Pagination";
 // 鑷畾涔夎〃鏍煎伐鍏风粍浠�
diff --git a/src/views/complaint/complaintlist/index.vue b/src/views/complaint/complaintlist/index.vue
new file mode 100644
index 0000000..a1c32bd
--- /dev/null
+++ b/src/views/complaint/complaintlist/index.vue
@@ -0,0 +1,893 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <!--鐢ㄦ埛鏁版嵁-->
+      <el-col :span="24" :xs="24">
+        <el-form
+          :model="topqueryParams"
+          ref="queryForm"
+          size="small"
+          :inline="true"
+          v-show="showSearch"
+          label-width="98px"
+        >
+          <el-form-item label="鎶曡瘔鎻愪氦鏃堕棿">
+            <el-date-picker
+              v-model="dateRange"
+              style="width: 240px"
+              value-format="yyyy-MM-dd"
+              type="daterange"
+              range-separator="-"
+              start-placeholder="寮�濮嬫棩鏈�"
+              end-placeholder="缁撴潫鏃ユ湡"
+            ></el-date-picker>
+          </el-form-item>
+          <el-form-item label="鐥呬汉鎼滅储" prop="userName">
+            <el-input
+              v-model="topqueryParams.userName"
+              placeholder="璇疯緭鍏�"
+              clearable
+              style="width: 200px"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+
+          <el-form-item label="琚姇璇夌瀹�" prop="status">
+            <el-cascader
+              v-model="topqueryParams.tagid"
+              :options="optionss"
+              :props="propss"
+              clearable
+            ></el-cascader>
+          </el-form-item>
+          <el-form-item label="鎶曡瘔绫诲瀷" prop="status">
+            <el-select v-model="topqueryParams.topic" placeholder="璇烽�夋嫨">
+              <el-option
+                v-for="item in topicoptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="琚姇璇夊憳宸�" prop="status">
+            <el-select v-model="topqueryParams.topic" placeholder="璇烽�夋嫨">
+              <el-option
+                v-for="item in topicoptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <el-button
+              type="primary"
+              icon="el-icon-search"
+              size="medium"
+              @click="handleQuery"
+              >鎼滅储</el-button
+            >
+            <el-button icon="el-icon-refresh" size="medium" @click="resetQuery"
+              >閲嶇疆</el-button
+            >
+          </el-form-item>
+        </el-form>
+        <el-divider></el-divider>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              plain
+              icon="el-icon-plus"
+              size="medium"
+              @click="handleAdd"
+              v-hasPermi="['system:user:add']"
+              >鏂板</el-button
+            >
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="success"
+              plain
+              icon="el-icon-edit"
+              size="medium"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['system:user:edit']"
+              >淇敼</el-button
+            >
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="danger"
+              plain
+              icon="el-icon-delete"
+              size="medium"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['system:user:remove']"
+              >鍒犻櫎</el-button
+            >
+          </el-col>
+          <el-col :span="19">
+            <div class="documentf">
+              <div class="document">
+                <el-button
+                  type="warning"
+                  plain
+                  icon="el-icon-download"
+                  size="medium"
+                  @click="handleExport"
+                  v-hasPermi="['system:user:export']"
+                  >瀵煎嚭</el-button
+                >
+              </div>
+            </div>
+          </el-col>
+          <!-- <el-col :span="1.5"> </el-col> -->
+        </el-row>
+        <!-- <right-toolbar
+            :showSearch.sync="showSearch"
+            @queryTable="getList"
+            :columns="columns"
+          ></right-toolbar> -->
+        <el-table
+          v-loading="loading"
+          :data="userList"
+          @selection-change="handleSelectionChange"
+        >
+          <el-table-column type="selection" width="50" align="center" />
+          <el-table-column
+            label="搴忓彿"
+            align="center"
+            key="userId"
+            prop="userId"
+          />
+
+          <el-table-column
+            label="鐥呬汉濮撳悕"
+            align="center"
+            key="userName"
+            prop="userName"
+            :show-overflow-tooltip="true"
+          />
+          <el-table-column
+            label="鎵嬫満鍙�"
+            align="center"
+            key="types"
+            prop="types"
+          />
+          <el-table-column
+            label="鎬у埆"
+            align="center"
+            key="nickName"
+            prop="nickName"
+          />
+          <el-table-column
+            label="鎶曡瘔鏂瑰紡"
+            align="center"
+            key="phonenumber"
+            prop="phonenumber"
+            width="120"
+          />
+
+          <el-table-column
+            label="鎶曡瘔瀵硅薄"
+            align="center"
+            key="topicnumber"
+            prop="topicnumber"
+            width="120"
+            :show-overflow-tooltip="true"
+          />
+          <el-table-column
+            label="绾у埆"
+            align="center"
+            key="topicnumber"
+            prop="topicnumber"
+            width="120"
+            :show-overflow-tooltip="true"
+          /><el-table-column
+            label="鎻愪氦浜�"
+            align="center"
+            key="topicnumber"
+            prop="topicnumber"
+            width="120"
+            :show-overflow-tooltip="true"
+          />
+          <el-table-column
+            label="鎻愪氦鏃堕棿"
+            align="center"
+            prop="createTime"
+            width="160"
+          >
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="灏辫瘖鏃ユ湡"
+            align="center"
+            prop="createTime"
+            width="160"
+          >
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="鎶曡瘔鏃ユ湡"
+            align="center"
+            prop="createTime"
+            width="160"
+          >
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="鎿嶄綔"
+            align="center"
+            width="160"
+            class-name="small-padding fixed-width"
+          >
+            <template slot-scope="scope" v-if="scope.row.userId !== 1">
+              <el-button
+                size="medium"
+                type="text"
+                icon="el-icon-edit"
+                @click="Referencequestion(scope.row)"
+                v-hasPermi="['system:user:edit']"
+                >棰勮</el-button
+              >
+              <el-button
+                size="medium"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['system:user:edit']"
+                >淇敼</el-button
+              >
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <pagination
+          v-show="total > 0"
+          :total="total"
+          :page.sync="topqueryParams.pageNum"
+          :limit.sync="topqueryParams.pageSize"
+          @pagination="getList"
+        />
+      </el-col>
+    </el-row>
+
+    <!-- 娣诲姞鎴栦慨鏀规姇璇夐厤缃璇濇 -->
+    <el-dialog
+      :title="title"
+      :visible.sync="addalteropen"
+      width="900px"
+      append-to-body
+    >
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鎶曡瘔鍚嶇О" prop="nickName">
+              <el-input
+                v-model="form.nickName"
+                placeholder="璇疯緭鍏�"
+                maxlength="30"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎶曡瘔绫诲瀷" prop="deptId">
+              <el-select v-model="form.types" placeholder="璇烽�夋嫨">
+                <el-option
+                  v-for="item in topicoptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-form-item label="绛旀閫夐」" prop="email">
+            <el-tag
+              :key="tag"
+              v-for="tag in dynamicTags"
+              closable
+              :disable-transitions="false"
+              @close="handleClose(tag)"
+            >
+              {{ tag }}
+            </el-tag>
+            <el-input
+              class="input-new-tag"
+              v-if="inputVisible"
+              v-model="inputValue"
+              ref="saveTagInput"
+              size="small"
+              @keyup.enter.native="handleInputConfirm"
+              @blur="handleInputConfirm"
+            >
+            </el-input>
+            <el-button
+              v-else
+              class="button-new-tag"
+              size="small"
+              @click="showInput"
+              >+ 鏂板閫夐」</el-button
+            >
+          </el-form-item>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鎶曡瘔鏍囩" prop="email">
+              <el-cascader
+                v-model="form.totagid"
+                :options="optionss"
+                :props="propss"
+                clearable
+              ></el-cascader>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鏄惁鍚敤">
+              <el-radio-group v-model="form.qystatus">
+                <el-radio
+                  v-for="item in qyoptions"
+                  :key="item.value"
+                  :label="item.value"
+                  >{{ item.label }}</el-radio
+                >
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鏄惁蹇呭~">
+              <el-radio-group v-model="form.btstatus">
+                <el-radio
+                  v-for="item in btoptions"
+                  :key="item.value"
+                  :label="item.value"
+                  >{{ item.label }}</el-radio
+                >
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="澶囨敞">
+              <el-input
+                v-model="form.remark"
+                type="textarea"
+                placeholder="璇疯緭鍏ュ唴瀹�"
+              ></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </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 width="30%" title="鎶曡瘔棰勮" :visible.sync="previewVisible">
+      <div class="qrcode-dialo">
+        <!-- 鍗曢�� -->
+        <div class="topic-dev" v-if="previewtype == 1">
+          <div class="dev-text">
+            [鍗曢�塢&nbsp&nbsp<span>{{ previewvalue.username }}</span>
+          </div>
+          <div class="dev-xx">
+            <el-radio-group v-model="radio">
+              <el-radio
+                v-for="(items, index) in dynamicTags"
+                :key="index"
+                :label="index"
+                >{{ items }}</el-radio
+              >
+            </el-radio-group>
+          </div>
+        </div>
+        <!-- 澶氶�� -->
+        <div class="topic-dev" v-else-if="previewtype == 2">
+          <div class="dev-text">
+            [澶氶�塢&nbsp&nbsp<span>{{ previewvalue.username }}</span>
+          </div>
+          <div class="dev-xx">
+            <el-checkbox-group v-model="radios">
+              <el-checkbox
+                v-for="(items, index) in dynamicTags"
+                :key="index"
+                :label="index"
+              >
+                {{ items }}
+              </el-checkbox>
+            </el-checkbox-group>
+          </div>
+        </div>
+        <!-- 濉┖ -->
+        <div class="topic-dev" v-if="previewtype == 3">
+          <div class="dev-text">
+            [濉┖]&nbsp&nbsp<span>{{ previewvalue.username }}</span>
+          </div>
+          <div class="dev-xx">
+            <el-input placeholder="璇疯緭鍏ョ瓟妗�" v-model="radioas" clearable>
+            </el-input>
+          </div>
+        </div>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listUser,
+  getUser,
+  delUser,
+  addUser,
+  updateUser,
+  resetUserPwd,
+  changeUserStatus,
+} from "@/api/system/user";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "User",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鐢ㄦ埛琛ㄦ牸鏁版嵁
+      userList: null,
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず淇敼銆佹坊鍔犲脊鍑哄眰
+      addalteropen: false,
+      // 閮ㄩ棬鍚嶇О
+      deptName: undefined,
+      // 榛樿瀵嗙爜
+      initPassword: undefined,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      // 瑙掕壊閫夐」
+      roleOptions: [],
+      dynamicTags: ["閫夐」涓�", "閫夐」浜�", "閫夐」涓�"], //閫夐」
+      inputVisible: false,
+      inputValue: "",
+      previewVisible: false, //鎶曡瘔棰勮寮规
+      radio: "",
+      radios: [],
+      previewtype: 2, //棰勮鎶曡瘔绫诲瀷
+      total: 0, // 鎬绘潯鏁�
+      ImportQuantity: 999, //瀵兼姇璇夋暟閲�
+      //棰勮鎶曡瘔淇℃伅
+      previewvalue: {
+        username: "杩欎釜鍖荤敓瀵逛綘鎬庝箞鏍�",
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {
+        phonenumber: "",
+        totagid: "",
+        types: "",
+        nickName: "",
+        qystatus: "",
+        btstatus: "",
+      },
+      //瀵煎叆杩涘害
+      dractive: 1,
+      // 瀵煎叆灞曠ず琛ㄥ崟
+      uploadingData: {},
+      // 鏌ヨ鍙傛暟
+      topqueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userName: undefined,
+        tagid: undefined,
+        topic: undefined,
+      },
+      propss: { multiple: true },
+      optionss: [
+        {
+          value: 1,
+          label: "涓滃崡",
+        },
+        {
+          value: 2,
+          label: "瑗垮寳",
+        },
+        {
+          value: 3,
+          label: "浠ㄤ花浠�",
+        },
+        {
+          value: 4,
+          label: "鍏椋掗",
+        },
+      ],
+      qyoptions: [
+        {
+          value: 1,
+          label: "鍚敤",
+        },
+        {
+          value: 2,
+          label: "鍏抽棴",
+        },
+      ],
+      btoptions: [
+        {
+          value: 1,
+          label: "蹇呭~",
+        },
+        {
+          value: 2,
+          label: "闈炲繀濉�",
+        },
+      ],
+      topicoptions: [
+        {
+          value: 1,
+          label: "鍗曢��",
+        },
+        {
+          value: 2,
+          label: "澶氶��",
+        },
+        {
+          value: 3,
+          label: "濉┖",
+        },
+      ],
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        userName: [
+          { required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 2,
+            max: 20,
+            message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        nickName: [
+          { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        password: [
+          { required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 5,
+            max: 20,
+            message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        email: [
+          {
+            type: "email",
+            message: "璇疯緭鍏ユ纭殑閭鍦板潃",
+            trigger: ["blur", "change"],
+          },
+        ],
+        phonenumber: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+            trigger: "blur",
+          },
+        ],
+        IDnumber: [
+          {
+            pattern:
+              /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/,
+            message: "璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�",
+            trigger: "blur",
+          },
+        ],
+      },
+    };
+  },
+  watch: {},
+  created() {
+    this.getList();
+    this.getConfigKey("sys.user.initPassword").then((response) => {
+      this.initPassword = response.msg;
+    });
+  },
+  methods: {
+    /** 鏌ヨ鎶曡瘔鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listUser(this.addDateRange(this.topqueryParams, this.dateRange)).then(
+        (response) => {
+          this.userList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      );
+    },
+    // 鏌ョ湅鎶曡瘔璇︽儏
+    Referencequestion(row) {
+      this.previewVisible = true;
+    },
+
+    // 鎶曡瘔鐘舵�佷慨鏀�
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "鍚敤" : "鍋滅敤";
+      this.$modal
+        .confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚楋紵')
+        .then(function () {
+          return changeUserStatus(row.userId, row.status);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "鎴愬姛");
+        })
+        .catch(function () {
+          row.status = row.status === "0" ? "1" : "0";
+        });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.addalteropen = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.topqueryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.topqueryParams.deptId = undefined;
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    //鍒犻櫎閫夐」
+    handleClose(tag) {
+      this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
+    },
+    //瑙﹀彂鏂板杈撳叆
+    showInput() {
+      this.inputVisible = true;
+      this.$nextTick((_) => {
+        this.$refs.saveTagInput.$refs.input.focus();
+      });
+    },
+    //鑾峰彇澶卞幓鐒︾偣瑙﹀彂
+    handleInputConfirm() {
+      let inputValue = this.inputValue;
+      if (inputValue) {
+        this.dynamicTags.push(inputValue);
+      }
+      this.inputVisible = false;
+      this.inputValue = "";
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      getUser().then((response) => {
+        this.postOptions = response.posts;
+        this.roleOptions = response.roles;
+        this.addalteropen = true;
+        this.title = "鏂板鎶曡瘔";
+        this.form.password = this.initPassword;
+      });
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const userId = row.userId || this.ids;
+      getUser(userId).then((response) => {
+        this.form = response.data;
+        this.postOptions = response.posts;
+        this.roleOptions = response.roles;
+        this.$set(this.form, "postIds", response.postIds);
+        this.$set(this.form, "roleIds", response.roleIds);
+        this.addalteropen = true;
+        this.title = "淇敼鐢ㄦ埛";
+        this.form.password = "";
+      });
+    },
+    /** 閲嶇疆瀵嗙爜鎸夐挳鎿嶄綔 */
+    handleResetPwd(row) {
+      this.$prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        closeOnClickModal: false,
+        inputPattern: /^.{5,20}$/,
+        inputErrorMessage: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+      })
+        .then(({ value }) => {
+          resetUserPwd(row.userId, value).then((response) => {
+            this.$modal.msgSuccess("淇敼鎴愬姛锛屾柊瀵嗙爜鏄細" + value);
+          });
+        })
+        .catch(() => {});
+    },
+
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            updateUser(this.form).then((response) => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUser(this.form).then((response) => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal
+        .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
+        .then(function () {
+          return delUser(userIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download(
+        "system/user/export",
+        {
+          ...this.topqueryParams,
+        },
+        `user_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.el-button--primary.is-plain {
+  color: #ffffff;
+  background: #409eff;
+  border-color: #4fabe9;
+}
+.document {
+  width: 100px;
+  height: 50px;
+}
+.documentf {
+  display: flex;
+  justify-content: flex-end;
+}
+.download {
+  text-align: center;
+  .el-upload__tip {
+    font-size: 23px;
+  }
+  .el-upload__text {
+    font-size: 23px;
+  }
+}
+.uploading {
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #ffffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+.el-tag + .el-tag {
+  margin-left: 10px;
+}
+.button-new-tag {
+  margin-left: 10px;
+  height: 32px;
+  line-height: 30px;
+  padding-top: 0;
+  padding-bottom: 0;
+}
+.input-new-tag {
+  width: 90px;
+  margin-left: 10px;
+  vertical-align: bottom;
+}
+.drexamine {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 30px;
+  background: #daeaf5;
+  img {
+    width: 100px;
+    height: 100px;
+  }
+}
+.qrcode-dialo {
+  // text-align: center;
+  //   display: flex;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .topic-dev {
+    margin-bottom: 25px;
+    font-size: 20px !important;
+    .dev-text {
+      margin-bottom: 10px;
+    }
+  }
+}
+::v-deep.el-radio-group {
+  span {
+    font-size: 24px;
+  }
+}
+::v-deep.el-checkbox-group {
+  span {
+    font-size: 24px;
+  }
+}
+</style>
diff --git a/src/views/complaint/complaintmy/index.vue b/src/views/complaint/complaintmy/index.vue
new file mode 100644
index 0000000..fcdc24c
--- /dev/null
+++ b/src/views/complaint/complaintmy/index.vue
@@ -0,0 +1,877 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <!--鐢ㄦ埛鏁版嵁-->
+      <el-col :span="24" :xs="24">
+        <el-form
+          :model="topqueryParams"
+          ref="queryForm"
+          size="small"
+          :inline="true"
+          v-show="showSearch"
+          label-width="98px"
+        >
+          <el-form-item label="鎶曡瘔绫诲瀷" prop="status">
+            <el-select v-model="topqueryParams.topic" placeholder="璇烽�夋嫨">
+              <el-option
+                v-for="item in topicoptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="鎶曡瘔鐘舵��" prop="status">
+            <el-select v-model="topqueryParams.topic" placeholder="璇烽�夋嫨">
+              <el-option
+                v-for="item in topicoptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <el-button
+              type="primary"
+              icon="el-icon-search"
+              size="medium"
+              @click="handleQuery"
+              >鎼滅储</el-button
+            >
+            <el-button icon="el-icon-refresh" size="medium" @click="resetQuery"
+              >閲嶇疆</el-button
+            >
+          </el-form-item>
+        </el-form>
+        <el-divider></el-divider>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              plain
+              icon="el-icon-plus"
+              size="medium"
+              @click="handleAdd"
+              v-hasPermi="['system:user:add']"
+              >鏂板</el-button
+            >
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="success"
+              plain
+              icon="el-icon-edit"
+              size="medium"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['system:user:edit']"
+              >淇敼</el-button
+            >
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="danger"
+              plain
+              icon="el-icon-delete"
+              size="medium"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['system:user:remove']"
+              >鍒犻櫎</el-button
+            >
+          </el-col>
+          <el-col :span="19">
+            <div class="documentf">
+              <div class="document">
+                <el-button
+                  type="warning"
+                  plain
+                  icon="el-icon-download"
+                  size="medium"
+                  @click="handleExport"
+                  v-hasPermi="['system:user:export']"
+                  >瀵煎嚭</el-button
+                >
+              </div>
+            </div>
+          </el-col>
+          <!-- <el-col :span="1.5"> </el-col> -->
+        </el-row>
+        <!-- <right-toolbar
+            :showSearch.sync="showSearch"
+            @queryTable="getList"
+            :columns="columns"
+          ></right-toolbar> -->
+        <el-table
+          v-loading="loading"
+          :data="userList"
+          @selection-change="handleSelectionChange"
+        >
+          <el-table-column type="selection" width="50" align="center" />
+          <el-table-column
+            label="搴忓彿"
+            align="center"
+            key="userId"
+            prop="userId"
+          />
+
+          <el-table-column
+            label="鐥呬汉濮撳悕"
+            align="center"
+            sortable
+            key="userName"
+            prop="userName"
+            :show-overflow-tooltip="true"
+          />
+          <el-table-column
+            label="鎵嬫満鍙�"
+            align="center"
+            key="types"
+            prop="types"
+          />
+          <el-table-column
+            label="鎬у埆"
+            align="center"
+            key="nickName"
+            prop="nickName"
+          />
+          <el-table-column
+            label="鎶曡瘔鏂瑰紡"
+            align="center"
+            key="phonenumber"
+            prop="phonenumber"
+            width="120"
+          />
+
+          <el-table-column
+            label="鎶曡瘔瀵硅薄"
+            align="center"
+            key="topicnumber"
+            prop="topicnumber"
+            width="120"
+            :show-overflow-tooltip="true"
+          />
+          <el-table-column
+            label="绾у埆"
+            align="center"
+            key="topicnumberaa"
+            prop="topicnumberaa"
+            sortable
+            width="120"
+            :show-overflow-tooltip="true"
+          />
+
+          <el-table-column
+            label="鎶曡瘔鏃ユ湡"
+            sortable
+            align="center"
+            prop="createTime"
+            width="160"
+          >
+            <template slot-scope="scope">
+              <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="鎿嶄綔"
+            align="center"
+            width="160"
+            class-name="small-padding fixed-width"
+          >
+            <template slot-scope="scope">
+              <el-button
+                size="medium"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['system:user:edit']"
+                >淇敼</el-button
+              >
+            </template>
+          </el-table-column>
+        </el-table>
+
+        <pagination
+          v-show="total > 0"
+          :total="total"
+          :page.sync="topqueryParams.pageNum"
+          :limit.sync="topqueryParams.pageSize"
+          @pagination="getList"
+        />
+      </el-col>
+    </el-row>
+    <!-- 娣诲姞鎴栦慨鏀规姇璇夊璇濇 -->
+    <el-dialog
+      :title="title"
+      :visible.sync="addalteropen"
+      width="900px"
+      append-to-body
+    >
+      <el-form ref="form" :model="form" label-width="80px">
+        <el-row :gutter="20">
+          <el-col :span="12"
+            ><el-form-item label="鐥呬汉濮撳悕">
+              <el-input v-model="form.name"></el-input> </el-form-item
+          ></el-col>
+          <el-col :span="12"
+            ><el-form-item label="鎬у埆">
+              <el-radio v-model="form.radio" label="1">鐢�</el-radio>
+              <el-radio v-model="form.radio" label="2">濂�</el-radio>
+              <el-radio v-model="form.radio" label="3">鏈煡</el-radio>
+            </el-form-item></el-col
+          >
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="鑱旂郴鐢佃瘽">
+              <div style="margin-top: 15px">
+                <el-input
+                  placeholder="璇疯緭鍏ユ墜鏈哄彿"
+                  v-model="form.input3"
+                  class="input-with-select"
+                >
+                  <el-button slot="append" icon="el-icon-search"></el-button>
+                </el-input>
+              </div>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鎶曡瘔绫诲瀷">
+              <el-select v-model="form.region" placeholder="璇烽�夋嫨娲诲姩鍖哄煙">
+                <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
+                <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎶曡瘔鏃ユ湡">
+              <el-date-picker
+                v-model="form.value2"
+                align="right"
+                type="date"
+                placeholder="閫夋嫨鏃ユ湡"
+                :picker-options="pickerOptions"
+              >
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鎶曡瘔绾у埆">
+              <el-select v-model="form.region" placeholder="璇烽�夋嫨娲诲姩鍖哄煙">
+                <el-option label="涓�绾�" value="shanghai"></el-option>
+                <el-option label="浜岀骇" value="beijing"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12"
+            ><el-form-item label="闂ㄨ瘖鏃ユ湡">
+              <el-date-picker
+                v-model="form.value2"
+                align="right"
+                type="date"
+                placeholder="閫夋嫨鏃ユ湡"
+                :picker-options="pickerOptions"
+              >
+              </el-date-picker> </el-form-item
+          ></el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鎶曡瘔瀵硅薄鎼滅储">
+              <el-select
+                v-model="value"
+                multiple
+                filterable
+                remote
+                reserve-keyword
+                placeholder="璇疯緭鍏ュ叧閿瘝"
+                :remote-method="remoteMethod"
+                :loading="loading"
+              >
+                <el-option
+                  v-for="item in options"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                >
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎶曡瘔瀵硅薄鏄剧ず">
+              <div>{{ form.name }}</div>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鎶曡瘔鎻忚堪">
+              <el-input type="textarea" v-model="form.desc"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎶曡瘔瑕佹眰">
+              <el-input type="textarea" v-model="form.desc"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </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 {
+  listUser,
+  getUser,
+  delUser,
+  addUser,
+  updateUser,
+  resetUserPwd,
+  changeUserStatus,
+} from "@/api/system/user";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "User",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鐢ㄦ埛琛ㄦ牸鏁版嵁
+      userList: null,
+      // 寮瑰嚭灞傛爣棰�
+      title: "鏂板鎶曡瘔",
+      // 鏄惁鏄剧ず淇敼銆佹坊鍔犲脊鍑哄眰
+      addalteropen: false,
+      // 閮ㄩ棬鍚嶇О
+      deptName: undefined,
+      // 榛樿瀵嗙爜
+      initPassword: undefined,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      // 瑙掕壊閫夐」
+      roleOptions: [],
+      dynamicTags: ["閫夐」涓�", "閫夐」浜�", "閫夐」涓�"], //閫夐」
+      inputVisible: false,
+      inputValue: "",
+      previewVisible: false, //鎶曡瘔棰勮寮规
+      radio: "",
+      radios: [],
+      previewtype: 2, //棰勮鎶曡瘔绫诲瀷
+      total: 0, // 鎬绘潯鏁�
+      ImportQuantity: 999, //瀵兼姇璇夋暟閲�
+      //棰勮鎶曡瘔淇℃伅
+      previewvalue: {
+        username: "杩欎釜鍖荤敓瀵逛綘鎬庝箞鏍�",
+      },
+      value: [],
+      list: [],
+      loading: false,
+      states: [
+        "Alabama",
+        "Alaska",
+        "Arizona",
+        "Arkansas",
+        "California",
+        "Colorado",
+        "Connecticut",
+        "Delaware",
+        "Florida",
+        "Georgia",
+        "Hawaii",
+        "Idaho",
+        "Illinois",
+        "Indiana",
+        "Iowa",
+        "Kansas",
+        "Kentucky",
+        "Louisiana",
+        "Maine",
+        "Maryland",
+        "Massachusetts",
+        "Michigan",
+        "Minnesota",
+        "Mississippi",
+        "Missouri",
+        "Montana",
+        "Nebraska",
+        "Nevada",
+        "New Hampshire",
+        "New Jersey",
+        "New Mexico",
+        "New York",
+        "North Carolina",
+        "North Dakota",
+        "Ohio",
+        "Oklahoma",
+        "Oregon",
+        "Pennsylvania",
+        "Rhode Island",
+        "South Carolina",
+        "South Dakota",
+        "Tennessee",
+        "Texas",
+        "Utah",
+        "Vermont",
+        "Virginia",
+        "Washington",
+        "West Virginia",
+        "Wisconsin",
+        "Wyoming",
+      ],
+      pickerOptions: {
+        disabledDate(time) {
+          return time.getTime() > Date.now();
+        },
+        shortcuts: [
+          {
+            text: "浠婂ぉ",
+            onClick(picker) {
+              picker.$emit("pick", new Date());
+            },
+          },
+          {
+            text: "鏄ㄥぉ",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24);
+              picker.$emit("pick", date);
+            },
+          },
+          {
+            text: "涓�鍛ㄥ墠",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit("pick", date);
+            },
+          },
+        ],
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {
+        phonenumber: "",
+        totagid: "",
+        types: "",
+        nickName: "",
+        qystatus: "",
+        btstatus: "",
+      },
+      //瀵煎叆杩涘害
+      dractive: 1,
+      // 瀵煎叆灞曠ず琛ㄥ崟
+      uploadingData: {},
+      // 鏌ヨ鍙傛暟
+      topqueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userName: undefined,
+        tagid: undefined,
+        topic: undefined,
+      },
+      propss: { multiple: true },
+      options: [],
+
+      topicoptions: [
+        {
+          value: 1,
+          label: "鍗曢��",
+        },
+        {
+          value: 2,
+          label: "澶氶��",
+        },
+        {
+          value: 3,
+          label: "濉┖",
+        },
+      ],
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        userName: [
+          { required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 2,
+            max: 20,
+            message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        nickName: [
+          { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        password: [
+          { required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 5,
+            max: 20,
+            message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        email: [
+          {
+            type: "email",
+            message: "璇疯緭鍏ユ纭殑閭鍦板潃",
+            trigger: ["blur", "change"],
+          },
+        ],
+        phonenumber: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+            trigger: "blur",
+          },
+        ],
+        IDnumber: [
+          {
+            pattern:
+              /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/,
+            message: "璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�",
+            trigger: "blur",
+          },
+        ],
+      },
+    };
+  },
+  watch: {},
+  created() {
+    this.getList();
+    this.getConfigKey("sys.user.initPassword").then((response) => {
+      this.initPassword = response.msg;
+    });
+  },
+  // 鎼滅储
+  mounted() {
+    this.list = this.states.map((item) => {
+      return { value: `value:${item}`, label: `label:${item}` };
+    });
+  },
+  methods: {
+    /** 鏌ヨ鎶曡瘔鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listUser(this.addDateRange(this.topqueryParams, this.dateRange)).then(
+        (response) => {
+          this.userList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      );
+    },
+    // 鏌ョ湅鎶曡瘔璇︽儏
+    Referencequestion(row) {
+      this.previewVisible = true;
+    },
+    // 娣诲姞寮规鎼滅储
+    remoteMethod(query) {
+      if (query !== "") {
+        this.loading = true;
+        setTimeout(() => {
+          this.loading = false;
+          this.options = this.list.filter((item) => {
+            return item.label.toLowerCase().indexOf(query.toLowerCase()) > -1;
+          });
+        }, 200);
+      } else {
+        this.options = [];
+      }
+    },
+    // 鎶曡瘔鐘舵�佷慨鏀�
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "鍚敤" : "鍋滅敤";
+      this.$modal
+        .confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚楋紵')
+        .then(function () {
+          return changeUserStatus(row.userId, row.status);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "鎴愬姛");
+        })
+        .catch(function () {
+          row.status = row.status === "0" ? "1" : "0";
+        });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.addalteropen = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.topqueryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.topqueryParams.deptId = undefined;
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    //鍒犻櫎閫夐」
+    handleClose(tag) {
+      this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
+    },
+    //瑙﹀彂鏂板杈撳叆
+    showInput() {
+      this.inputVisible = true;
+      this.$nextTick((_) => {
+        this.$refs.saveTagInput.$refs.input.focus();
+      });
+    },
+    //鑾峰彇澶卞幓鐒︾偣瑙﹀彂
+    handleInputConfirm() {
+      let inputValue = this.inputValue;
+      if (inputValue) {
+        this.dynamicTags.push(inputValue);
+      }
+      this.inputVisible = false;
+      this.inputValue = "";
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.addalteropen = true;
+      // getUser().then((response) => {
+      //   this.postOptions = response.posts;
+      //   this.roleOptions = response.roles;
+      //   this.title = "鏂板鎶曡瘔";
+      //   this.form.password = this.initPassword;
+      // });
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const userId = row.userId || this.ids;
+      getUser(userId).then((response) => {
+        this.form = response.data;
+        this.postOptions = response.posts;
+        this.roleOptions = response.roles;
+        this.$set(this.form, "postIds", response.postIds);
+        this.$set(this.form, "roleIds", response.roleIds);
+        this.addalteropen = true;
+        this.title = "淇敼鐢ㄦ埛";
+        this.form.password = "";
+      });
+    },
+    /** 閲嶇疆瀵嗙爜鎸夐挳鎿嶄綔 */
+    handleResetPwd(row) {
+      this.$prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        closeOnClickModal: false,
+        inputPattern: /^.{5,20}$/,
+        inputErrorMessage: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+      })
+        .then(({ value }) => {
+          resetUserPwd(row.userId, value).then((response) => {
+            this.$modal.msgSuccess("淇敼鎴愬姛锛屾柊瀵嗙爜鏄細" + value);
+          });
+        })
+        .catch(() => {});
+    },
+
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            updateUser(this.form).then((response) => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUser(this.form).then((response) => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal
+        .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
+        .then(function () {
+          return delUser(userIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download(
+        "system/user/export",
+        {
+          ...this.topqueryParams,
+        },
+        `user_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.el-button--primary.is-plain {
+  color: #ffffff;
+  background: #409eff;
+  border-color: #4fabe9;
+}
+
+.document {
+  width: 100px;
+  height: 50px;
+}
+
+.documentf {
+  display: flex;
+  justify-content: flex-end;
+}
+
+.download {
+  text-align: center;
+
+  .el-upload__tip {
+    font-size: 23px;
+  }
+
+  .el-upload__text {
+    font-size: 23px;
+  }
+}
+
+.uploading {
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #ffffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+
+.el-tag + .el-tag {
+  margin-left: 10px;
+}
+
+.button-new-tag {
+  margin-left: 10px;
+  height: 32px;
+  line-height: 30px;
+  padding-top: 0;
+  padding-bottom: 0;
+}
+
+.input-new-tag {
+  width: 90px;
+  margin-left: 10px;
+  vertical-align: bottom;
+}
+
+.drexamine {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 30px;
+  background: #daeaf5;
+
+  img {
+    width: 100px;
+    height: 100px;
+  }
+}
+
+.qrcode-dialo {
+  // text-align: center;
+  //   display: flex;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+
+  .topic-dev {
+    margin-bottom: 25px;
+    font-size: 20px !important;
+
+    .dev-text {
+      margin-bottom: 10px;
+    }
+  }
+}
+
+::v-deep.el-radio-group {
+  span {
+    font-size: 24px;
+  }
+}
+
+::v-deep.el-checkbox-group {
+  span {
+    font-size: 24px;
+  }
+}
+</style>
diff --git a/src/views/followvisit/discharge/index.vue b/src/views/followvisit/discharge/index.vue
new file mode 100644
index 0000000..3b969de
--- /dev/null
+++ b/src/views/followvisit/discharge/index.vue
@@ -0,0 +1,897 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <!--鐢ㄦ埛鏁版嵁-->
+
+      <el-form
+        :model="topqueryParams"
+        ref="queryForm"
+        size="small"
+        :inline="true"
+        v-show="showSearch"
+        label-width="98px"
+      >
+        <el-form-item label="浠诲姟鍚嶇О">
+          <el-input v-model="topqueryParams.name"></el-input>
+        </el-form-item>
+        <el-form-item label="瀹℃牳浜�">
+          <el-input v-model="topqueryParams.name"></el-input>
+        </el-form-item>
+        <el-form-item label="瀹℃牳鏃堕棿">
+          <el-date-picker
+            v-model="dateRange"
+            style="width: 240px"
+            value-format="yyyy-MM-dd"
+            type="daterange"
+            range-separator="-"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡"
+          ></el-date-picker>
+        </el-form-item>
+        <el-form-item label="闅忚绫诲瀷" prop="status">
+          <el-select v-model="topqueryParams.topic" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in topicoptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="妯$増" prop="status">
+          <el-select v-model="topqueryParams.topic" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in topicoptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="闂ㄨ瘖闅忚鐘舵��" prop="status">
+          <el-select v-model="topqueryParams.topic" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in topicoptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button
+            type="primary"
+            icon="el-icon-search"
+            size="medium"
+            @click="handleQuery"
+            >鎼滅储</el-button
+          >
+          <el-button icon="el-icon-refresh" size="medium" @click="resetQuery"
+            >閲嶇疆</el-button
+          >
+        </el-form-item>
+      </el-form>
+      <el-divider></el-divider>
+      <el-row :gutter="10" class="mb8">
+        <el-col :span="1.5">
+          <el-button
+            type="primary"
+            plain
+            icon="el-icon-plus"
+            size="medium"
+            @click="handleAdd"
+            v-hasPermi="['system:user:add']"
+            >鏂板</el-button
+          >
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+            type="success"
+            plain
+            icon="el-icon-edit"
+            size="medium"
+            :disabled="single"
+            @click="handleUpdate"
+            v-hasPermi="['system:user:edit']"
+            >淇敼</el-button
+          >
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+            type="danger"
+            plain
+            icon="el-icon-delete"
+            size="medium"
+            :disabled="multiple"
+            @click="handleDelete"
+            v-hasPermi="['system:user:remove']"
+            >鍒犻櫎</el-button
+          >
+        </el-col>
+        <el-col :span="19">
+          <div class="documentf">
+            <div class="document">
+              <el-button
+                type="warning"
+                plain
+                icon="el-icon-download"
+                size="medium"
+                @click="handleExport"
+                v-hasPermi="['system:user:export']"
+                >瀵煎嚭</el-button
+              >
+            </div>
+          </div>
+        </el-col>
+        <!-- <el-col :span="1.5"> </el-col> -->
+      </el-row>
+      <!-- <right-toolbar
+              :showSearch.sync="showSearch"
+              @queryTable="getList"
+              :columns="columns"
+            ></right-toolbar> -->
+      <el-table
+        v-loading="loading"
+        :data="userList"
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="50" align="center" />
+        <el-table-column
+          label="搴忓彿"
+          align="center"
+          key="userId"
+          prop="userId"
+        />
+
+        <el-table-column
+          label="浠诲姟鍚嶇О"
+          align="center"
+          sortable
+          key="userName"
+          prop="userName"
+          :show-overflow-tooltip="true"
+        />
+        <el-table-column
+          label="鏈嶅姟妯℃澘"
+          align="center"
+          key="types"
+          prop="types"
+        />
+        <el-table-column
+          label="鍒涘缓鏃ユ湡"
+          align="center"
+          key="nickName"
+          prop="nickName"
+        />
+        <el-table-column
+          label="寰呮墽琛�/鎬绘暟"
+          align="center"
+          key="phonenumber"
+          prop="phonenumber"
+          width="120"
+        >
+          <template slot-scope="scope">
+            <span style="margin-left: 10px"
+              >{{ scope.row.date }}/{{ scope.row.data }}</span
+            >
+          </template>
+        </el-table-column>
+
+        <el-table-column
+          label="鎵ц鐘舵��"
+          align="center"
+          key="topicnumber"
+          prop="topicnumber"
+          width="120"
+          :show-overflow-tooltip="true"
+        >
+          <template slot-scope="scope">
+            <div>鎵ц瀹屾垚/鎵ц澶辫触</div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="瀹℃牳浜�"
+          align="center"
+          key="topicnumberaa"
+          prop="topicnumberaa"
+          sortable
+          width="120"
+          :show-overflow-tooltip="true"
+        />
+
+        <el-table-column
+          label="瀹℃牳鏃堕棿"
+          sortable
+          align="center"
+          prop="createTime"
+          width="160"
+        >
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.createTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="鎿嶄綔"
+          align="center"
+          width="120"
+          class-name="small-padding fixed-width"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-zx"
+                ><i class="el-icon-s-promotion"></i>寮�濮嬫墽琛�</span
+              ></el-button
+            >
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="浠诲姟璇︽儏"
+          align="center"
+          width="200"
+          class-name="small-padding fixed-width"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-xq"
+                ><i class="el-icon-s-data"></i>璇︽儏</span
+              ></el-button
+            >
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-bb"
+                ><i class="el-icon-s-order"></i>鎶ヨ〃</span
+              ></el-button
+            >
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-sc"
+                ><i class="el-icon-delete"></i>鍒犻櫎</span
+              ></el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        :page.sync="topqueryParams.pageNum"
+        :limit.sync="topqueryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-row>
+    <!-- 娣诲姞鎴栦慨鏀归棬璇婇殢璁垮璇濇 -->
+    <el-dialog
+      :title="title"
+      :visible.sync="addalteropen"
+      width="700px"
+      append-to-body
+    >
+      <el-form ref="form" :model="form" label-width="100px">
+        <el-row :gutter="20">
+          <el-col :span="12"
+            ><el-form-item label="浠诲姟鍚嶇О">
+              <el-input v-model="form.name"></el-input> </el-form-item
+          ></el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24"
+            ><el-form-item label="鎵�灞炵瀹�">
+              <el-select v-model="form.region" placeholder="璇烽�夋嫨绉戝">
+                <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
+                <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+              </el-select> </el-form-item></el-col
+        ></el-row>
+        <el-row :gutter="20">
+          <el-col :span="24"
+            ><el-form-item label="闅忚绫诲瀷">
+              <el-select v-model="form.region" placeholder="璇烽�夋嫨闅忚绫诲瀷">
+                <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
+                <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+              </el-select> </el-form-item
+          ></el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="鏈嶅姟妯″潡">
+              <el-select v-model="form.region" placeholder="璇烽�夋嫨妯″潡">
+                <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
+                <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="闂ㄨ瘖闅忚瑕佹眰">
+              <el-input type="textarea" v-model="form.desc"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </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 {
+  listUser,
+  getUser,
+  delUser,
+  addUser,
+  updateUser,
+  resetUserPwd,
+  changeUserStatus,
+} from "@/api/system/user";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "User",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鐢ㄦ埛琛ㄦ牸鏁版嵁
+      userList: null,
+      // 寮瑰嚭灞傛爣棰�
+      title: "鏂板闂ㄨ瘖闅忚",
+      // 鏄惁鏄剧ず淇敼銆佹坊鍔犲脊鍑哄眰
+      addalteropen: false,
+      // 閮ㄩ棬鍚嶇О
+      deptName: undefined,
+      // 榛樿瀵嗙爜
+      initPassword: undefined,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      // 瑙掕壊閫夐」
+      roleOptions: [],
+      dynamicTags: ["閫夐」涓�", "閫夐」浜�", "閫夐」涓�"], //閫夐」
+      inputVisible: false,
+      inputValue: "",
+      previewVisible: false, //闂ㄨ瘖闅忚棰勮寮规
+      radio: "",
+      radios: [],
+      previewtype: 2, //棰勮闂ㄨ瘖闅忚绫诲瀷
+      total: 0, // 鎬绘潯鏁�
+      ImportQuantity: 999, //瀵奸棬璇婇殢璁挎暟閲�
+      //棰勮闂ㄨ瘖闅忚淇℃伅
+      previewvalue: {
+        username: "杩欎釜鍖荤敓瀵逛綘鎬庝箞鏍�",
+      },
+      value: [],
+      list: [],
+      loading: false,
+      states: [
+        "Alabama",
+        "Alaska",
+        "Arizona",
+        "Arkansas",
+        "California",
+        "Colorado",
+        "Connecticut",
+        "Delaware",
+        "Florida",
+        "Georgia",
+        "Hawaii",
+        "Idaho",
+        "Illinois",
+        "Indiana",
+        "Iowa",
+        "Kansas",
+        "Kentucky",
+        "Louisiana",
+        "Maine",
+        "Maryland",
+        "Massachusetts",
+        "Michigan",
+        "Minnesota",
+        "Mississippi",
+        "Missouri",
+        "Montana",
+        "Nebraska",
+        "Nevada",
+        "New Hampshire",
+        "New Jersey",
+        "New Mexico",
+        "New York",
+        "North Carolina",
+        "North Dakota",
+        "Ohio",
+        "Oklahoma",
+        "Oregon",
+        "Pennsylvania",
+        "Rhode Island",
+        "South Carolina",
+        "South Dakota",
+        "Tennessee",
+        "Texas",
+        "Utah",
+        "Vermont",
+        "Virginia",
+        "Washington",
+        "West Virginia",
+        "Wisconsin",
+        "Wyoming",
+      ],
+      pickerOptions: {
+        disabledDate(time) {
+          return time.getTime() > Date.now();
+        },
+        shortcuts: [
+          {
+            text: "浠婂ぉ",
+            onClick(picker) {
+              picker.$emit("pick", new Date());
+            },
+          },
+          {
+            text: "鏄ㄥぉ",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24);
+              picker.$emit("pick", date);
+            },
+          },
+          {
+            text: "涓�鍛ㄥ墠",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit("pick", date);
+            },
+          },
+        ],
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {
+        phonenumber: "",
+        totagid: "",
+        types: "",
+        nickName: "",
+        qystatus: "",
+        btstatus: "",
+      },
+      // 鏌ヨ鍙傛暟
+      topqueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userName: undefined,
+        tagid: undefined,
+        topic: undefined,
+      },
+      propss: { multiple: true },
+      options: [],
+
+      topicoptions: [
+        {
+          value: 1,
+          label: "寰呭鏍�",
+        },
+        {
+          value: 2,
+          label: "鎵ц涓�",
+        },
+        {
+          value: 3,
+          label: "鎵ц瀹屾垚",
+        },
+        {
+          value: 4,
+          label: "宸插仠姝�",
+        },
+      ],
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        userName: [
+          { required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 2,
+            max: 20,
+            message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        nickName: [
+          { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        password: [
+          { required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 5,
+            max: 20,
+            message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        email: [
+          {
+            type: "email",
+            message: "璇疯緭鍏ユ纭殑閭鍦板潃",
+            trigger: ["blur", "change"],
+          },
+        ],
+        phonenumber: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+            trigger: "blur",
+          },
+        ],
+        IDnumber: [
+          {
+            pattern:
+              /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/,
+            message: "璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�",
+            trigger: "blur",
+          },
+        ],
+      },
+    };
+  },
+  watch: {},
+  created() {
+    this.getList();
+    this.getConfigKey("sys.user.initPassword").then((response) => {
+      this.initPassword = response.msg;
+    });
+  },
+  // 鎼滅储
+  mounted() {
+    this.list = this.states.map((item) => {
+      return { value: `value:${item}`, label: `label:${item}` };
+    });
+  },
+  methods: {
+    /** 鏌ヨ闂ㄨ瘖闅忚鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listUser(this.addDateRange(this.topqueryParams, this.dateRange)).then(
+        (response) => {
+          this.userList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      );
+    },
+    // 鏌ョ湅闂ㄨ瘖闅忚璇︽儏
+    Referencequestion(row) {
+      this.previewVisible = true;
+    },
+    // 娣诲姞寮规鎼滅储
+    remoteMethod(query) {
+      if (query !== "") {
+        this.loading = true;
+        setTimeout(() => {
+          this.loading = false;
+          this.options = this.list.filter((item) => {
+            return item.label.toLowerCase().indexOf(query.toLowerCase()) > -1;
+          });
+        }, 200);
+      } else {
+        this.options = [];
+      }
+    },
+    // 闂ㄨ瘖闅忚鐘舵�佷慨鏀�
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "鍚敤" : "鍋滅敤";
+      this.$modal
+        .confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚楋紵')
+        .then(function () {
+          return changeUserStatus(row.userId, row.status);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "鎴愬姛");
+        })
+        .catch(function () {
+          row.status = row.status === "0" ? "1" : "0";
+        });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.addalteropen = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.topqueryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.topqueryParams.deptId = undefined;
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    //鍒犻櫎閫夐」
+    handleClose(tag) {
+      this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
+    },
+    //瑙﹀彂鏂板杈撳叆
+    showInput() {
+      this.inputVisible = true;
+      this.$nextTick((_) => {
+        this.$refs.saveTagInput.$refs.input.focus();
+      });
+    },
+    //鑾峰彇澶卞幓鐒︾偣瑙﹀彂
+    handleInputConfirm() {
+      let inputValue = this.inputValue;
+      if (inputValue) {
+        this.dynamicTags.push(inputValue);
+      }
+      this.inputVisible = false;
+      this.inputValue = "";
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.addalteropen = true;
+      // getUser().then((response) => {
+      //   this.postOptions = response.posts;
+      //   this.roleOptions = response.roles;
+      //   this.title = "鏂板闂ㄨ瘖闅忚";
+      //   this.form.password = this.initPassword;
+      // });
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const userId = row.userId || this.ids;
+      getUser(userId).then((response) => {
+        this.form = response.data;
+        this.postOptions = response.posts;
+        this.roleOptions = response.roles;
+        this.$set(this.form, "postIds", response.postIds);
+        this.$set(this.form, "roleIds", response.roleIds);
+        this.addalteropen = true;
+        this.title = "淇敼鐢ㄦ埛";
+        this.form.password = "";
+      });
+    },
+    /** 閲嶇疆瀵嗙爜鎸夐挳鎿嶄綔 */
+    handleResetPwd(row) {
+      this.$prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        closeOnClickModal: false,
+        inputPattern: /^.{5,20}$/,
+        inputErrorMessage: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+      })
+        .then(({ value }) => {
+          resetUserPwd(row.userId, value).then((response) => {
+            this.$modal.msgSuccess("淇敼鎴愬姛锛屾柊瀵嗙爜鏄細" + value);
+          });
+        })
+        .catch(() => {});
+    },
+
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            updateUser(this.form).then((response) => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUser(this.form).then((response) => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal
+        .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
+        .then(function () {
+          return delUser(userIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download(
+        "system/user/export",
+        {
+          ...this.topqueryParams,
+        },
+        `user_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.el-button--primary.is-plain {
+  color: #ffffff;
+  background: #409eff;
+  border-color: #4fabe9;
+}
+
+.document {
+  width: 100px;
+  height: 50px;
+}
+
+.documentf {
+  display: flex;
+  justify-content: flex-end;
+}
+
+.download {
+  text-align: center;
+
+  .el-upload__tip {
+    font-size: 23px;
+  }
+
+  .el-upload__text {
+    font-size: 23px;
+  }
+}
+
+.uploading {
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #ffffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+
+.el-tag + .el-tag {
+  margin-left: 10px;
+}
+
+.button-new-tag {
+  margin-left: 10px;
+  height: 32px;
+  line-height: 30px;
+  padding-top: 0;
+  padding-bottom: 0;
+}
+
+.input-new-tag {
+  width: 90px;
+  margin-left: 10px;
+  vertical-align: bottom;
+}
+
+.drexamine {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 30px;
+  background: #daeaf5;
+
+  img {
+    width: 100px;
+    height: 100px;
+  }
+}
+
+.qrcode-dialo {
+  // text-align: center;
+  //   display: flex;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+
+  .topic-dev {
+    margin-bottom: 25px;
+    font-size: 20px !important;
+
+    .dev-text {
+      margin-bottom: 10px;
+    }
+  }
+}
+.button-bb {
+  font-weight: 500;
+  color: #2ba05c;
+}
+.button-xq {
+  font-weight: 500;
+  color: #409eff;
+}
+.button-sc {
+  font-weight: 500;
+  color: #dd302a;
+}
+.button-zx {
+  background: #4fabe9;
+  padding: 5px;
+  border-radius: 1px;
+  color: #ffffff;
+}
+
+::v-deep.el-radio-group {
+  span {
+    font-size: 24px;
+  }
+}
+
+::v-deep.el-checkbox-group {
+  span {
+    font-size: 24px;
+  }
+}
+</style>
diff --git a/src/views/followvisit/linem/index.vue b/src/views/followvisit/linem/index.vue
new file mode 100644
index 0000000..a21e535
--- /dev/null
+++ b/src/views/followvisit/linem/index.vue
@@ -0,0 +1,798 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <!--鐢ㄦ埛鏁版嵁-->
+      <el-divider></el-divider>
+      <el-row :gutter="10" class="mb8">
+        <el-col :span="1.5">
+          <el-button
+            type="primary"
+            plain
+            icon="el-icon-plus"
+            size="medium"
+            @click="handleAdd"
+            v-hasPermi="['system:user:add']"
+            >鏂板</el-button
+          >
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+            type="danger"
+            plain
+            icon="el-icon-delete"
+            size="medium"
+            :disabled="multiple"
+            @click="handleDelete"
+            v-hasPermi="['system:user:remove']"
+            >鍒犻櫎</el-button
+          >
+        </el-col>
+        <!-- <el-col :span="1.5"> </el-col> -->
+      </el-row>
+      <!-- <right-toolbar
+              :showSearch.sync="showSearch"
+              @queryTable="getList"
+              :columns="columns"
+            ></right-toolbar> -->
+      <el-table
+        v-loading="loading"
+        :data="userList"
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="50" align="center" />
+        <el-table-column
+          label="搴忓彿"
+          align="center"
+          key="userId"
+          prop="userId"
+        />
+
+        <el-table-column
+          label="浠诲姟鍚嶇О"
+          align="center"
+          sortable
+          key="userName"
+          prop="userName"
+          :show-overflow-tooltip="true"
+        />
+        <el-table-column
+          label="鏈嶅姟妯℃澘"
+          align="center"
+          key="types"
+          prop="types"
+        />
+        <el-table-column
+          label="鍒涘缓鏃ユ湡"
+          align="center"
+          key="nickName"
+          prop="nickName"
+        />
+        <el-table-column
+          label="寰呮墽琛�/鎬绘暟"
+          align="center"
+          key="phonenumber"
+          prop="phonenumber"
+          width="120"
+        >
+          <template slot-scope="scope">
+            <span style="margin-left: 10px"
+              >{{ scope.row.date }}/{{ scope.row.data }}</span
+            >
+          </template>
+        </el-table-column>
+
+        <el-table-column
+          label="鎵ц鐘舵��"
+          align="center"
+          key="topicnumber"
+          prop="topicnumber"
+          width="120"
+          :show-overflow-tooltip="true"
+        >
+          <template slot-scope="scope">
+            <div>鎵ц瀹屾垚/鎵ц澶辫触</div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="瀹℃牳浜�"
+          align="center"
+          key="topicnumberaa"
+          prop="topicnumberaa"
+          sortable
+          width="120"
+          :show-overflow-tooltip="true"
+        />
+
+        <el-table-column
+          label="瀹℃牳鏃堕棿"
+          sortable
+          align="center"
+          prop="createTime"
+          width="160"
+        >
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.createTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="鎿嶄綔"
+          align="center"
+          width="120"
+          class-name="small-padding fixed-width"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-zx"
+                ><i class="el-icon-s-promotion"></i>寮�濮嬫墽琛�</span
+              ></el-button
+            >
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="浠诲姟璇︽儏"
+          align="center"
+          width="200"
+          class-name="small-padding fixed-width"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-xq"
+                ><i class="el-icon-s-data"></i>璇︽儏</span
+              ></el-button
+            >
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-bb"
+                ><i class="el-icon-s-order"></i>鎶ヨ〃</span
+              ></el-button
+            >
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-sc"
+                ><i class="el-icon-delete"></i>鍒犻櫎</span
+              ></el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        :page.sync="topqueryParams.pageNum"
+        :limit.sync="topqueryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-row>
+    <!-- 娣诲姞鎴栦慨鏀归棬璇婇殢璁垮璇濇 -->
+    <el-dialog
+      :title="title"
+      :visible.sync="addalteropen"
+      width="700px"
+      append-to-body
+    >
+      <el-form ref="form" :model="form" label-width="100px">
+        <el-row :gutter="20">
+          <el-col :span="12"
+            ><el-form-item label="浠诲姟鍚嶇О">
+              <el-input v-model="form.name"></el-input> </el-form-item
+          ></el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24"
+            ><el-form-item label="鎵�灞炵瀹�">
+              <el-select v-model="form.region" placeholder="璇烽�夋嫨绉戝">
+                <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
+                <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+              </el-select> </el-form-item></el-col
+        ></el-row>
+        <el-row :gutter="20">
+          <el-col :span="24"
+            ><el-form-item label="闅忚绫诲瀷">
+              <el-select v-model="form.region" placeholder="璇烽�夋嫨闅忚绫诲瀷">
+                <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
+                <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+              </el-select> </el-form-item
+          ></el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="鏈嶅姟妯″潡">
+              <el-select v-model="form.region" placeholder="璇烽�夋嫨妯″潡">
+                <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
+                <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="闂ㄨ瘖闅忚瑕佹眰">
+              <el-input type="textarea" v-model="form.desc"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </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 {
+  listUser,
+  getUser,
+  delUser,
+  addUser,
+  updateUser,
+  resetUserPwd,
+  changeUserStatus,
+} from "@/api/system/user";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "User",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鐢ㄦ埛琛ㄦ牸鏁版嵁
+      userList: null,
+      // 寮瑰嚭灞傛爣棰�
+      title: "鏂板闂ㄨ瘖闅忚",
+      // 鏄惁鏄剧ず淇敼銆佹坊鍔犲脊鍑哄眰
+      addalteropen: false,
+      // 閮ㄩ棬鍚嶇О
+      deptName: undefined,
+      // 榛樿瀵嗙爜
+      initPassword: undefined,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      // 瑙掕壊閫夐」
+      roleOptions: [],
+      dynamicTags: ["閫夐」涓�", "閫夐」浜�", "閫夐」涓�"], //閫夐」
+      inputVisible: false,
+      inputValue: "",
+      previewVisible: false, //闂ㄨ瘖闅忚棰勮寮规
+      radio: "",
+      radios: [],
+      previewtype: 2, //棰勮闂ㄨ瘖闅忚绫诲瀷
+      total: 0, // 鎬绘潯鏁�
+      ImportQuantity: 999, //瀵奸棬璇婇殢璁挎暟閲�
+      //棰勮闂ㄨ瘖闅忚淇℃伅
+      previewvalue: {
+        username: "杩欎釜鍖荤敓瀵逛綘鎬庝箞鏍�",
+      },
+      value: [],
+      list: [],
+      loading: false,
+      states: [
+        "Alabama",
+        "Alaska",
+        "Arizona",
+        "Arkansas",
+        "California",
+        "Colorado",
+        "Connecticut",
+        "Delaware",
+        "Florida",
+        "Georgia",
+        "Hawaii",
+        "Idaho",
+        "Illinois",
+        "Indiana",
+        "Iowa",
+        "Kansas",
+        "Kentucky",
+        "Louisiana",
+        "Maine",
+        "Maryland",
+        "Massachusetts",
+        "Michigan",
+        "Minnesota",
+        "Mississippi",
+        "Missouri",
+        "Montana",
+        "Nebraska",
+        "Nevada",
+        "New Hampshire",
+        "New Jersey",
+        "New Mexico",
+        "New York",
+        "North Carolina",
+        "North Dakota",
+        "Ohio",
+        "Oklahoma",
+        "Oregon",
+        "Pennsylvania",
+        "Rhode Island",
+        "South Carolina",
+        "South Dakota",
+        "Tennessee",
+        "Texas",
+        "Utah",
+        "Vermont",
+        "Virginia",
+        "Washington",
+        "West Virginia",
+        "Wisconsin",
+        "Wyoming",
+      ],
+      pickerOptions: {
+        disabledDate(time) {
+          return time.getTime() > Date.now();
+        },
+        shortcuts: [
+          {
+            text: "浠婂ぉ",
+            onClick(picker) {
+              picker.$emit("pick", new Date());
+            },
+          },
+          {
+            text: "鏄ㄥぉ",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24);
+              picker.$emit("pick", date);
+            },
+          },
+          {
+            text: "涓�鍛ㄥ墠",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit("pick", date);
+            },
+          },
+        ],
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {
+        phonenumber: "",
+        totagid: "",
+        types: "",
+        nickName: "",
+        qystatus: "",
+        btstatus: "",
+      },
+      // 鏌ヨ鍙傛暟
+      topqueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userName: undefined,
+        tagid: undefined,
+        topic: undefined,
+      },
+      propss: { multiple: true },
+      options: [],
+
+      topicoptions: [
+        {
+          value: 1,
+          label: "寰呭鏍�",
+        },
+        {
+          value: 2,
+          label: "鎵ц涓�",
+        },
+        {
+          value: 3,
+          label: "鎵ц瀹屾垚",
+        },
+        {
+          value: 4,
+          label: "宸插仠姝�",
+        },
+      ],
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        userName: [
+          { required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 2,
+            max: 20,
+            message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        nickName: [
+          { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        password: [
+          { required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 5,
+            max: 20,
+            message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        email: [
+          {
+            type: "email",
+            message: "璇疯緭鍏ユ纭殑閭鍦板潃",
+            trigger: ["blur", "change"],
+          },
+        ],
+        phonenumber: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+            trigger: "blur",
+          },
+        ],
+        IDnumber: [
+          {
+            pattern:
+              /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/,
+            message: "璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�",
+            trigger: "blur",
+          },
+        ],
+      },
+    };
+  },
+  watch: {},
+  created() {
+    this.getList();
+    this.getConfigKey("sys.user.initPassword").then((response) => {
+      this.initPassword = response.msg;
+    });
+  },
+  // 鎼滅储
+  mounted() {
+    this.list = this.states.map((item) => {
+      return { value: `value:${item}`, label: `label:${item}` };
+    });
+  },
+  methods: {
+    /** 鏌ヨ闂ㄨ瘖闅忚鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listUser(this.addDateRange(this.topqueryParams, this.dateRange)).then(
+        (response) => {
+          this.userList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      );
+    },
+    // 鏌ョ湅闂ㄨ瘖闅忚璇︽儏
+    Referencequestion(row) {
+      this.previewVisible = true;
+    },
+    // 娣诲姞寮规鎼滅储
+    remoteMethod(query) {
+      if (query !== "") {
+        this.loading = true;
+        setTimeout(() => {
+          this.loading = false;
+          this.options = this.list.filter((item) => {
+            return item.label.toLowerCase().indexOf(query.toLowerCase()) > -1;
+          });
+        }, 200);
+      } else {
+        this.options = [];
+      }
+    },
+    // 闂ㄨ瘖闅忚鐘舵�佷慨鏀�
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "鍚敤" : "鍋滅敤";
+      this.$modal
+        .confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚楋紵')
+        .then(function () {
+          return changeUserStatus(row.userId, row.status);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "鎴愬姛");
+        })
+        .catch(function () {
+          row.status = row.status === "0" ? "1" : "0";
+        });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.addalteropen = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.topqueryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.topqueryParams.deptId = undefined;
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    //鍒犻櫎閫夐」
+    handleClose(tag) {
+      this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
+    },
+    //瑙﹀彂鏂板杈撳叆
+    showInput() {
+      this.inputVisible = true;
+      this.$nextTick((_) => {
+        this.$refs.saveTagInput.$refs.input.focus();
+      });
+    },
+    //鑾峰彇澶卞幓鐒︾偣瑙﹀彂
+    handleInputConfirm() {
+      let inputValue = this.inputValue;
+      if (inputValue) {
+        this.dynamicTags.push(inputValue);
+      }
+      this.inputVisible = false;
+      this.inputValue = "";
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.addalteropen = true;
+      // getUser().then((response) => {
+      //   this.postOptions = response.posts;
+      //   this.roleOptions = response.roles;
+      //   this.title = "鏂板闂ㄨ瘖闅忚";
+      //   this.form.password = this.initPassword;
+      // });
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const userId = row.userId || this.ids;
+      getUser(userId).then((response) => {
+        this.form = response.data;
+        this.postOptions = response.posts;
+        this.roleOptions = response.roles;
+        this.$set(this.form, "postIds", response.postIds);
+        this.$set(this.form, "roleIds", response.roleIds);
+        this.addalteropen = true;
+        this.title = "淇敼鐢ㄦ埛";
+        this.form.password = "";
+      });
+    },
+    /** 閲嶇疆瀵嗙爜鎸夐挳鎿嶄綔 */
+    handleResetPwd(row) {
+      this.$prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        closeOnClickModal: false,
+        inputPattern: /^.{5,20}$/,
+        inputErrorMessage: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+      })
+        .then(({ value }) => {
+          resetUserPwd(row.userId, value).then((response) => {
+            this.$modal.msgSuccess("淇敼鎴愬姛锛屾柊瀵嗙爜鏄細" + value);
+          });
+        })
+        .catch(() => {});
+    },
+
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            updateUser(this.form).then((response) => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUser(this.form).then((response) => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal
+        .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
+        .then(function () {
+          return delUser(userIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download(
+        "system/user/export",
+        {
+          ...this.topqueryParams,
+        },
+        `user_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.el-button--primary.is-plain {
+  color: #ffffff;
+  background: #409eff;
+  border-color: #4fabe9;
+}
+
+.document {
+  width: 100px;
+  height: 50px;
+}
+
+.documentf {
+  display: flex;
+  justify-content: flex-end;
+}
+
+.download {
+  text-align: center;
+
+  .el-upload__tip {
+    font-size: 23px;
+  }
+
+  .el-upload__text {
+    font-size: 23px;
+  }
+}
+
+.uploading {
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #ffffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+
+.el-tag + .el-tag {
+  margin-left: 10px;
+}
+
+.button-new-tag {
+  margin-left: 10px;
+  height: 32px;
+  line-height: 30px;
+  padding-top: 0;
+  padding-bottom: 0;
+}
+
+.input-new-tag {
+  width: 90px;
+  margin-left: 10px;
+  vertical-align: bottom;
+}
+
+.drexamine {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 30px;
+  background: #daeaf5;
+
+  img {
+    width: 100px;
+    height: 100px;
+  }
+}
+
+.qrcode-dialo {
+  // text-align: center;
+  //   display: flex;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+
+  .topic-dev {
+    margin-bottom: 25px;
+    font-size: 20px !important;
+
+    .dev-text {
+      margin-bottom: 10px;
+    }
+  }
+}
+.button-bb {
+  font-weight: 500;
+  color: #2ba05c;
+}
+.button-xq {
+  font-weight: 500;
+  color: #409eff;
+}
+.button-sc {
+  font-weight: 500;
+  color: #dd302a;
+}
+.button-zx {
+  background: #4fabe9;
+  padding: 5px;
+  border-radius: 1px;
+  color: #ffffff;
+}
+
+::v-deep.el-radio-group {
+  span {
+    font-size: 24px;
+  }
+}
+
+::v-deep.el-checkbox-group {
+  span {
+    font-size: 24px;
+  }
+}
+</style>
diff --git a/src/views/followvisit/outpatient/index.vue b/src/views/followvisit/outpatient/index.vue
new file mode 100644
index 0000000..3b969de
--- /dev/null
+++ b/src/views/followvisit/outpatient/index.vue
@@ -0,0 +1,897 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <!--鐢ㄦ埛鏁版嵁-->
+
+      <el-form
+        :model="topqueryParams"
+        ref="queryForm"
+        size="small"
+        :inline="true"
+        v-show="showSearch"
+        label-width="98px"
+      >
+        <el-form-item label="浠诲姟鍚嶇О">
+          <el-input v-model="topqueryParams.name"></el-input>
+        </el-form-item>
+        <el-form-item label="瀹℃牳浜�">
+          <el-input v-model="topqueryParams.name"></el-input>
+        </el-form-item>
+        <el-form-item label="瀹℃牳鏃堕棿">
+          <el-date-picker
+            v-model="dateRange"
+            style="width: 240px"
+            value-format="yyyy-MM-dd"
+            type="daterange"
+            range-separator="-"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡"
+          ></el-date-picker>
+        </el-form-item>
+        <el-form-item label="闅忚绫诲瀷" prop="status">
+          <el-select v-model="topqueryParams.topic" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in topicoptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="妯$増" prop="status">
+          <el-select v-model="topqueryParams.topic" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in topicoptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="闂ㄨ瘖闅忚鐘舵��" prop="status">
+          <el-select v-model="topqueryParams.topic" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in topicoptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button
+            type="primary"
+            icon="el-icon-search"
+            size="medium"
+            @click="handleQuery"
+            >鎼滅储</el-button
+          >
+          <el-button icon="el-icon-refresh" size="medium" @click="resetQuery"
+            >閲嶇疆</el-button
+          >
+        </el-form-item>
+      </el-form>
+      <el-divider></el-divider>
+      <el-row :gutter="10" class="mb8">
+        <el-col :span="1.5">
+          <el-button
+            type="primary"
+            plain
+            icon="el-icon-plus"
+            size="medium"
+            @click="handleAdd"
+            v-hasPermi="['system:user:add']"
+            >鏂板</el-button
+          >
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+            type="success"
+            plain
+            icon="el-icon-edit"
+            size="medium"
+            :disabled="single"
+            @click="handleUpdate"
+            v-hasPermi="['system:user:edit']"
+            >淇敼</el-button
+          >
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+            type="danger"
+            plain
+            icon="el-icon-delete"
+            size="medium"
+            :disabled="multiple"
+            @click="handleDelete"
+            v-hasPermi="['system:user:remove']"
+            >鍒犻櫎</el-button
+          >
+        </el-col>
+        <el-col :span="19">
+          <div class="documentf">
+            <div class="document">
+              <el-button
+                type="warning"
+                plain
+                icon="el-icon-download"
+                size="medium"
+                @click="handleExport"
+                v-hasPermi="['system:user:export']"
+                >瀵煎嚭</el-button
+              >
+            </div>
+          </div>
+        </el-col>
+        <!-- <el-col :span="1.5"> </el-col> -->
+      </el-row>
+      <!-- <right-toolbar
+              :showSearch.sync="showSearch"
+              @queryTable="getList"
+              :columns="columns"
+            ></right-toolbar> -->
+      <el-table
+        v-loading="loading"
+        :data="userList"
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="50" align="center" />
+        <el-table-column
+          label="搴忓彿"
+          align="center"
+          key="userId"
+          prop="userId"
+        />
+
+        <el-table-column
+          label="浠诲姟鍚嶇О"
+          align="center"
+          sortable
+          key="userName"
+          prop="userName"
+          :show-overflow-tooltip="true"
+        />
+        <el-table-column
+          label="鏈嶅姟妯℃澘"
+          align="center"
+          key="types"
+          prop="types"
+        />
+        <el-table-column
+          label="鍒涘缓鏃ユ湡"
+          align="center"
+          key="nickName"
+          prop="nickName"
+        />
+        <el-table-column
+          label="寰呮墽琛�/鎬绘暟"
+          align="center"
+          key="phonenumber"
+          prop="phonenumber"
+          width="120"
+        >
+          <template slot-scope="scope">
+            <span style="margin-left: 10px"
+              >{{ scope.row.date }}/{{ scope.row.data }}</span
+            >
+          </template>
+        </el-table-column>
+
+        <el-table-column
+          label="鎵ц鐘舵��"
+          align="center"
+          key="topicnumber"
+          prop="topicnumber"
+          width="120"
+          :show-overflow-tooltip="true"
+        >
+          <template slot-scope="scope">
+            <div>鎵ц瀹屾垚/鎵ц澶辫触</div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="瀹℃牳浜�"
+          align="center"
+          key="topicnumberaa"
+          prop="topicnumberaa"
+          sortable
+          width="120"
+          :show-overflow-tooltip="true"
+        />
+
+        <el-table-column
+          label="瀹℃牳鏃堕棿"
+          sortable
+          align="center"
+          prop="createTime"
+          width="160"
+        >
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.createTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="鎿嶄綔"
+          align="center"
+          width="120"
+          class-name="small-padding fixed-width"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-zx"
+                ><i class="el-icon-s-promotion"></i>寮�濮嬫墽琛�</span
+              ></el-button
+            >
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="浠诲姟璇︽儏"
+          align="center"
+          width="200"
+          class-name="small-padding fixed-width"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-xq"
+                ><i class="el-icon-s-data"></i>璇︽儏</span
+              ></el-button
+            >
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-bb"
+                ><i class="el-icon-s-order"></i>鎶ヨ〃</span
+              ></el-button
+            >
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-sc"
+                ><i class="el-icon-delete"></i>鍒犻櫎</span
+              ></el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        :page.sync="topqueryParams.pageNum"
+        :limit.sync="topqueryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-row>
+    <!-- 娣诲姞鎴栦慨鏀归棬璇婇殢璁垮璇濇 -->
+    <el-dialog
+      :title="title"
+      :visible.sync="addalteropen"
+      width="700px"
+      append-to-body
+    >
+      <el-form ref="form" :model="form" label-width="100px">
+        <el-row :gutter="20">
+          <el-col :span="12"
+            ><el-form-item label="浠诲姟鍚嶇О">
+              <el-input v-model="form.name"></el-input> </el-form-item
+          ></el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24"
+            ><el-form-item label="鎵�灞炵瀹�">
+              <el-select v-model="form.region" placeholder="璇烽�夋嫨绉戝">
+                <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
+                <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+              </el-select> </el-form-item></el-col
+        ></el-row>
+        <el-row :gutter="20">
+          <el-col :span="24"
+            ><el-form-item label="闅忚绫诲瀷">
+              <el-select v-model="form.region" placeholder="璇烽�夋嫨闅忚绫诲瀷">
+                <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
+                <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+              </el-select> </el-form-item
+          ></el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="鏈嶅姟妯″潡">
+              <el-select v-model="form.region" placeholder="璇烽�夋嫨妯″潡">
+                <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
+                <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="闂ㄨ瘖闅忚瑕佹眰">
+              <el-input type="textarea" v-model="form.desc"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </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 {
+  listUser,
+  getUser,
+  delUser,
+  addUser,
+  updateUser,
+  resetUserPwd,
+  changeUserStatus,
+} from "@/api/system/user";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "User",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鐢ㄦ埛琛ㄦ牸鏁版嵁
+      userList: null,
+      // 寮瑰嚭灞傛爣棰�
+      title: "鏂板闂ㄨ瘖闅忚",
+      // 鏄惁鏄剧ず淇敼銆佹坊鍔犲脊鍑哄眰
+      addalteropen: false,
+      // 閮ㄩ棬鍚嶇О
+      deptName: undefined,
+      // 榛樿瀵嗙爜
+      initPassword: undefined,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      // 瑙掕壊閫夐」
+      roleOptions: [],
+      dynamicTags: ["閫夐」涓�", "閫夐」浜�", "閫夐」涓�"], //閫夐」
+      inputVisible: false,
+      inputValue: "",
+      previewVisible: false, //闂ㄨ瘖闅忚棰勮寮规
+      radio: "",
+      radios: [],
+      previewtype: 2, //棰勮闂ㄨ瘖闅忚绫诲瀷
+      total: 0, // 鎬绘潯鏁�
+      ImportQuantity: 999, //瀵奸棬璇婇殢璁挎暟閲�
+      //棰勮闂ㄨ瘖闅忚淇℃伅
+      previewvalue: {
+        username: "杩欎釜鍖荤敓瀵逛綘鎬庝箞鏍�",
+      },
+      value: [],
+      list: [],
+      loading: false,
+      states: [
+        "Alabama",
+        "Alaska",
+        "Arizona",
+        "Arkansas",
+        "California",
+        "Colorado",
+        "Connecticut",
+        "Delaware",
+        "Florida",
+        "Georgia",
+        "Hawaii",
+        "Idaho",
+        "Illinois",
+        "Indiana",
+        "Iowa",
+        "Kansas",
+        "Kentucky",
+        "Louisiana",
+        "Maine",
+        "Maryland",
+        "Massachusetts",
+        "Michigan",
+        "Minnesota",
+        "Mississippi",
+        "Missouri",
+        "Montana",
+        "Nebraska",
+        "Nevada",
+        "New Hampshire",
+        "New Jersey",
+        "New Mexico",
+        "New York",
+        "North Carolina",
+        "North Dakota",
+        "Ohio",
+        "Oklahoma",
+        "Oregon",
+        "Pennsylvania",
+        "Rhode Island",
+        "South Carolina",
+        "South Dakota",
+        "Tennessee",
+        "Texas",
+        "Utah",
+        "Vermont",
+        "Virginia",
+        "Washington",
+        "West Virginia",
+        "Wisconsin",
+        "Wyoming",
+      ],
+      pickerOptions: {
+        disabledDate(time) {
+          return time.getTime() > Date.now();
+        },
+        shortcuts: [
+          {
+            text: "浠婂ぉ",
+            onClick(picker) {
+              picker.$emit("pick", new Date());
+            },
+          },
+          {
+            text: "鏄ㄥぉ",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24);
+              picker.$emit("pick", date);
+            },
+          },
+          {
+            text: "涓�鍛ㄥ墠",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit("pick", date);
+            },
+          },
+        ],
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {
+        phonenumber: "",
+        totagid: "",
+        types: "",
+        nickName: "",
+        qystatus: "",
+        btstatus: "",
+      },
+      // 鏌ヨ鍙傛暟
+      topqueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userName: undefined,
+        tagid: undefined,
+        topic: undefined,
+      },
+      propss: { multiple: true },
+      options: [],
+
+      topicoptions: [
+        {
+          value: 1,
+          label: "寰呭鏍�",
+        },
+        {
+          value: 2,
+          label: "鎵ц涓�",
+        },
+        {
+          value: 3,
+          label: "鎵ц瀹屾垚",
+        },
+        {
+          value: 4,
+          label: "宸插仠姝�",
+        },
+      ],
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        userName: [
+          { required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 2,
+            max: 20,
+            message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        nickName: [
+          { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        password: [
+          { required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 5,
+            max: 20,
+            message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        email: [
+          {
+            type: "email",
+            message: "璇疯緭鍏ユ纭殑閭鍦板潃",
+            trigger: ["blur", "change"],
+          },
+        ],
+        phonenumber: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+            trigger: "blur",
+          },
+        ],
+        IDnumber: [
+          {
+            pattern:
+              /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/,
+            message: "璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�",
+            trigger: "blur",
+          },
+        ],
+      },
+    };
+  },
+  watch: {},
+  created() {
+    this.getList();
+    this.getConfigKey("sys.user.initPassword").then((response) => {
+      this.initPassword = response.msg;
+    });
+  },
+  // 鎼滅储
+  mounted() {
+    this.list = this.states.map((item) => {
+      return { value: `value:${item}`, label: `label:${item}` };
+    });
+  },
+  methods: {
+    /** 鏌ヨ闂ㄨ瘖闅忚鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listUser(this.addDateRange(this.topqueryParams, this.dateRange)).then(
+        (response) => {
+          this.userList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      );
+    },
+    // 鏌ョ湅闂ㄨ瘖闅忚璇︽儏
+    Referencequestion(row) {
+      this.previewVisible = true;
+    },
+    // 娣诲姞寮规鎼滅储
+    remoteMethod(query) {
+      if (query !== "") {
+        this.loading = true;
+        setTimeout(() => {
+          this.loading = false;
+          this.options = this.list.filter((item) => {
+            return item.label.toLowerCase().indexOf(query.toLowerCase()) > -1;
+          });
+        }, 200);
+      } else {
+        this.options = [];
+      }
+    },
+    // 闂ㄨ瘖闅忚鐘舵�佷慨鏀�
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "鍚敤" : "鍋滅敤";
+      this.$modal
+        .confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚楋紵')
+        .then(function () {
+          return changeUserStatus(row.userId, row.status);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "鎴愬姛");
+        })
+        .catch(function () {
+          row.status = row.status === "0" ? "1" : "0";
+        });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.addalteropen = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.topqueryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.topqueryParams.deptId = undefined;
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    //鍒犻櫎閫夐」
+    handleClose(tag) {
+      this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
+    },
+    //瑙﹀彂鏂板杈撳叆
+    showInput() {
+      this.inputVisible = true;
+      this.$nextTick((_) => {
+        this.$refs.saveTagInput.$refs.input.focus();
+      });
+    },
+    //鑾峰彇澶卞幓鐒︾偣瑙﹀彂
+    handleInputConfirm() {
+      let inputValue = this.inputValue;
+      if (inputValue) {
+        this.dynamicTags.push(inputValue);
+      }
+      this.inputVisible = false;
+      this.inputValue = "";
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.addalteropen = true;
+      // getUser().then((response) => {
+      //   this.postOptions = response.posts;
+      //   this.roleOptions = response.roles;
+      //   this.title = "鏂板闂ㄨ瘖闅忚";
+      //   this.form.password = this.initPassword;
+      // });
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const userId = row.userId || this.ids;
+      getUser(userId).then((response) => {
+        this.form = response.data;
+        this.postOptions = response.posts;
+        this.roleOptions = response.roles;
+        this.$set(this.form, "postIds", response.postIds);
+        this.$set(this.form, "roleIds", response.roleIds);
+        this.addalteropen = true;
+        this.title = "淇敼鐢ㄦ埛";
+        this.form.password = "";
+      });
+    },
+    /** 閲嶇疆瀵嗙爜鎸夐挳鎿嶄綔 */
+    handleResetPwd(row) {
+      this.$prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        closeOnClickModal: false,
+        inputPattern: /^.{5,20}$/,
+        inputErrorMessage: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+      })
+        .then(({ value }) => {
+          resetUserPwd(row.userId, value).then((response) => {
+            this.$modal.msgSuccess("淇敼鎴愬姛锛屾柊瀵嗙爜鏄細" + value);
+          });
+        })
+        .catch(() => {});
+    },
+
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            updateUser(this.form).then((response) => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUser(this.form).then((response) => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal
+        .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
+        .then(function () {
+          return delUser(userIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download(
+        "system/user/export",
+        {
+          ...this.topqueryParams,
+        },
+        `user_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.el-button--primary.is-plain {
+  color: #ffffff;
+  background: #409eff;
+  border-color: #4fabe9;
+}
+
+.document {
+  width: 100px;
+  height: 50px;
+}
+
+.documentf {
+  display: flex;
+  justify-content: flex-end;
+}
+
+.download {
+  text-align: center;
+
+  .el-upload__tip {
+    font-size: 23px;
+  }
+
+  .el-upload__text {
+    font-size: 23px;
+  }
+}
+
+.uploading {
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #ffffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+
+.el-tag + .el-tag {
+  margin-left: 10px;
+}
+
+.button-new-tag {
+  margin-left: 10px;
+  height: 32px;
+  line-height: 30px;
+  padding-top: 0;
+  padding-bottom: 0;
+}
+
+.input-new-tag {
+  width: 90px;
+  margin-left: 10px;
+  vertical-align: bottom;
+}
+
+.drexamine {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 30px;
+  background: #daeaf5;
+
+  img {
+    width: 100px;
+    height: 100px;
+  }
+}
+
+.qrcode-dialo {
+  // text-align: center;
+  //   display: flex;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+
+  .topic-dev {
+    margin-bottom: 25px;
+    font-size: 20px !important;
+
+    .dev-text {
+      margin-bottom: 10px;
+    }
+  }
+}
+.button-bb {
+  font-weight: 500;
+  color: #2ba05c;
+}
+.button-xq {
+  font-weight: 500;
+  color: #409eff;
+}
+.button-sc {
+  font-weight: 500;
+  color: #dd302a;
+}
+.button-zx {
+  background: #4fabe9;
+  padding: 5px;
+  border-radius: 1px;
+  color: #ffffff;
+}
+
+::v-deep.el-radio-group {
+  span {
+    font-size: 24px;
+  }
+}
+
+::v-deep.el-checkbox-group {
+  span {
+    font-size: 24px;
+  }
+}
+</style>
diff --git a/src/views/followvisit/record/detailpage/index.vue b/src/views/followvisit/record/detailpage/index.vue
new file mode 100644
index 0000000..1b1ffd7
--- /dev/null
+++ b/src/views/followvisit/record/detailpage/index.vue
@@ -0,0 +1,136 @@
+<template>
+  <div class="Followupdetailspage">
+    <div class="Followuserinfo">
+      <div class="userinfo-text">闅忚璇︽儏</div>
+      <div class="userinfo-value">
+        <span><i class="el-icon-user-solid"></i>鍚撮緳</span><span>鐢�</span
+        ><span><i class="el-icon-user-solid"></i>13803963330</span
+        ><span>鍑洪櫌鏃堕棿锛�:2023-03-29 08:57:57</span>
+      </div>
+      <div><el-button type="success">闅忚鍚庣煭淇�</el-button></div>
+    </div>
+    <div>
+      <el-tabs type="border-card">
+        <el-tab-pane>
+          <span class="mulsz" slot="label"
+            ><i class="el-icon-headset"></i> 璇煶璇︽儏1</span
+          >
+          <div class="borderdiv">
+            <div>
+              <div class="leftside">
+                <i class="el-icon-phone-outline"></i><span>璇存拻鍟婂皬璇�</span>
+              </div>
+              <div class="offside">
+                <i class="el-icon-user"></i>
+                <div class="offside-value">
+                  <el-input v-model="input"></el-input>
+                  <el-radio v-model="radio" label="1">澶囬�夐」</el-radio>
+                  <el-radio v-model="radio" label="2">澶囬�夐」2</el-radio>
+                  <el-radio v-model="radio" label="3">澶囬�夐」3</el-radio>
+                  <el-radio v-model="radio" label="4">澶囬�夐」4</el-radio>
+                </div>
+              </div>
+            </div>
+          </div>
+        </el-tab-pane>
+        <el-tab-pane>
+          <span class="mulsz" slot="label"
+            ><i class="el-icon-headset"></i> 璇煶璇︽儏2</span
+          >
+          <div class="borderdiv">璇煶璇︽儏2</div>
+        </el-tab-pane>
+        <el-tab-pane>
+          <span class="mulsz" slot="label"
+            ><i class="el-icon-notebook-1"></i> 璇煶淇℃伅</span
+          >
+          <div class="borderdiv">璇煶淇℃伅</div>
+        </el-tab-pane>
+        <el-tab-pane>
+          <span class="mulsz" slot="label"
+            ><i class="el-icon-phone-outline"></i> 澶栧懠淇℃伅</span
+          >
+          <div class="borderdiv">澶栧懠淇℃伅</div>
+        </el-tab-pane>
+        <el-tab-pane>
+          <span class="mulsz" slot="label"
+            ><i class="el-icon-s-operation"></i> 鏍囩鐘舵��</span
+          >
+          <div class="borderdiv">
+            <el-radio v-model="radio" label="1">涓嶅鐞�</el-radio>
+            <el-radio v-model="radio" label="2">缁х画璺熻釜</el-radio
+            ><el-radio v-model="radio" label="3">閫氱煡鍖婚櫌灏辫瘖</el-radio>
+          </div>
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      radio: "1",
+      userid: "",
+      input: "",
+      radio: "2",
+    };
+  },
+
+  created() {},
+
+  methods: {},
+};
+</script>
+
+<style lang="scss" scoped>
+.Followuserinfo {
+  margin: 20px 10px;
+  display: flex;
+  align-items: center;
+  .userinfo-text {
+    font-size: 20px;
+    margin-right: 20px;
+  }
+  .userinfo-value {
+    color: rgb(15, 139, 211);
+    span {
+      margin-right: 20px;
+    }
+  }
+}
+.borderdiv {
+  min-height: 60vh;
+  font-size: 20px;
+  padding: 30px;
+  .leftside {
+    margin-bottom: 30px;
+    span {
+      width: 400px;
+      margin-left: 20px;
+      padding: 10px;
+      color: #fff;
+      background: rgb(110, 196, 247);
+      border-radius: 10px;
+    }
+  }
+  .offside {
+    display: flex;
+    flex-direction: row-reverse;
+    .offside-value {
+      padding: 10px;
+      background: rgb(217, 173, 253);
+      border-radius: 10px;
+      color: #fff;
+      margin-right: 20px;
+    }
+  }
+}
+::v-deep.offside-value .el-radio__label {
+  color: #fff;
+}
+.mulsz {
+  font-size: 25px;
+  margin-top: 20px;
+}
+</style>
diff --git a/src/views/followvisit/record/index.vue b/src/views/followvisit/record/index.vue
new file mode 100644
index 0000000..0b922c4
--- /dev/null
+++ b/src/views/followvisit/record/index.vue
@@ -0,0 +1,1092 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <!--鐢ㄦ埛鏁版嵁-->
+
+      <el-form
+        :model="topqueryParams"
+        ref="queryForm"
+        size="small"
+        :inline="true"
+        v-show="showSearch"
+        label-width="98px"
+      >
+        <el-form-item label="浠诲姟鍚嶇О">
+          <el-input v-model="topqueryParams.name"></el-input>
+        </el-form-item>
+        <el-form-item label="瀹℃牳浜�">
+          <el-input v-model="topqueryParams.name"></el-input>
+        </el-form-item>
+        <el-form-item label="瀹℃牳鏃堕棿">
+          <el-date-picker
+            v-model="dateRange"
+            style="width: 240px"
+            value-format="yyyy-MM-dd"
+            type="daterange"
+            range-separator="-"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡"
+          ></el-date-picker>
+        </el-form-item>
+        <el-form-item label="闅忚绫诲瀷" prop="status">
+          <el-select v-model="topqueryParams.topic" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in topicoptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="妯$増" prop="status">
+          <el-select v-model="topqueryParams.topic" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in topicoptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="闂ㄨ瘖闅忚鐘舵��" prop="status">
+          <el-select v-model="topqueryParams.topic" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in topicoptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button
+            type="primary"
+            icon="el-icon-search"
+            size="medium"
+            @click="handleQuery"
+            >鎼滅储</el-button
+          >
+          <el-button icon="el-icon-refresh" size="medium" @click="resetQuery"
+            >閲嶇疆</el-button
+          >
+        </el-form-item>
+      </el-form>
+      <el-divider></el-divider>
+      <el-row :gutter="10" class="mb8">
+        <el-col :span="1.5">
+          <el-button
+            type="primary"
+            plain
+            icon="el-icon-plus"
+            size="medium"
+            @click="handleAdd"
+            v-hasPermi="['system:user:add']"
+            >鏂板</el-button
+          >
+        </el-col>
+        <!-- <el-col :span="1.5">
+          <el-button
+            type="success"
+            plain
+            icon="el-icon-edit"
+            size="medium"
+            :disabled="single"
+            @click="handleUpdate"
+            v-hasPermi="['system:user:edit']"
+            >淇敼</el-button
+          >
+        </el-col> -->
+        <!-- <el-col :span="1.5">
+          <el-button
+            type="danger"
+            plain
+            icon="el-icon-delete"
+            size="medium"
+            :disabled="multiple"
+            @click="handleDelete"
+            v-hasPermi="['system:user:remove']"
+            >鍒犻櫎</el-button
+          >
+        </el-col> -->
+        <el-col :span="1.5">
+          <div class="documentf">
+            <div class="document">
+              <el-button
+                type="warning"
+                plain
+                icon="el-icon-upload2"
+                size="medium"
+                @click="handleExport"
+                v-hasPermi="['system:user:export']"
+                >瀵煎嚭</el-button
+              >
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="1.5">
+          <div class="documentf">
+            <div class="document">
+              <el-button
+                type="success"
+                plain
+                icon="el-icon-download"
+                size="medium"
+                @click="toleadExport"
+                v-hasPermi="['system:user:export']"
+                >瀵煎叆</el-button
+              >
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="1.5">
+          <div class="documentf">
+            <div class="document">
+              <el-button
+                type="info"
+                icon="el-icon-refresh"
+                size="medium"
+                @click="TaskReset"
+                v-hasPermi="['system:user:export']"
+                >浠诲姟閲嶇疆</el-button
+              >
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="1.5">
+          <div class="documentf">
+            <div class="document">
+              <el-button
+                type="success"
+                icon="el-icon-position"
+                size="medium"
+                @click="AllStarted"
+                v-hasPermi="['system:user:export']"
+                >鍏ㄩ儴寮�濮�</el-button
+              >
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="1.5">
+          <div class="documentf">
+            <div class="document">
+              <el-button
+                type="warning"
+                icon="el-icon-remove"
+                size="medium"
+                @click="AllStop"
+                v-hasPermi="['system:user:export']"
+                >鍏ㄩ儴鍋滄</el-button
+              >
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="1.5">
+          <div class="documentf">
+            <div class="document">
+              <el-button
+                type="primary"
+                icon="el-icon-remove"
+                size="medium"
+                @click="Sendtimesetting"
+                v-hasPermi="['system:user:export']"
+                >鍙戦�佹椂闂磋缃�</el-button
+              >
+            </div>
+          </div>
+        </el-col>
+
+        <!-- <el-col :span="1.5"> </el-col> -->
+      </el-row>
+      <!-- <right-toolbar
+              :showSearch.sync="showSearch"
+              @queryTable="getList"
+              :columns="columns"
+            ></right-toolbar> -->
+      <el-table
+        v-loading="loading"
+        :data="userList"
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="50" align="center" />
+        <el-table-column
+          label="搴忓彿"
+          align="center"
+          key="userId"
+          prop="userId"
+        />
+
+        <el-table-column
+          label="浠诲姟鍚嶇О"
+          align="center"
+          sortable
+          key="userName"
+          prop="userName"
+          :show-overflow-tooltip="true"
+        />
+        <el-table-column
+          label="鏈嶅姟妯℃澘"
+          align="center"
+          key="types"
+          prop="types"
+        />
+        <el-table-column
+          label="鍒涘缓鏃ユ湡"
+          align="center"
+          key="nickName"
+          prop="nickName"
+        />
+        <el-table-column
+          label="寰呮墽琛�/鎬绘暟"
+          align="center"
+          key="phonenumber"
+          prop="phonenumber"
+          width="120"
+        >
+          <template slot-scope="scope">
+            <span style="margin-left: 10px"
+              >{{ scope.row.date }}/{{ scope.row.data }}</span
+            >
+          </template>
+        </el-table-column>
+
+        <el-table-column
+          label="鎵ц鐘舵��"
+          align="center"
+          key="topicnumber"
+          prop="topicnumber"
+          width="120"
+          :show-overflow-tooltip="true"
+        >
+          <template slot-scope="scope">
+            <div>鎵ц瀹屾垚/寰呭鏍�</div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="瀹℃牳浜�"
+          align="center"
+          key="topicnumberaa"
+          prop="topicnumberaa"
+          sortable
+          width="120"
+          :show-overflow-tooltip="true"
+        />
+
+        <el-table-column
+          label="瀹℃牳鏃堕棿"
+          sortable
+          align="center"
+          prop="createTime"
+          width="160"
+        >
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.createTime) }}</span>
+          </template>
+        </el-table-column>
+
+        <el-table-column
+          label="鎿嶄綔"
+          align="center"
+          width="200"
+          class-name="small-padding fixed-width"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="medium"
+              type="text"
+              @click="followupvisit(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-bb"
+                ><i class="el-icon-s-promotion"></i>閲嶆柊闅忚</span
+              ></el-button
+            >
+            <el-button
+              size="medium"
+              type="text"
+              @click="handlestop(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-sc"
+                ><i class="el-icon-delete"></i>鍋滄</span
+              ></el-button
+            >
+            <el-button
+              size="medium"
+              type="text"
+              @click="Seedetails(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-zx"
+                ><i class="el-icon-s-order"></i>鏌ョ湅璇︽儏</span
+              ></el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        :page.sync="topqueryParams.pageNum"
+        :limit.sync="topqueryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-row>
+    <!-- 娣诲姞鎴栦慨鏀归棬璇婇殢璁垮璇濇 -->
+    <el-dialog
+      :title="title"
+      :visible.sync="addalteropen"
+      width="700px"
+      append-to-body
+    >
+      <el-form ref="form" :model="form" label-width="100px">
+        <el-row :gutter="20">
+          <el-col :span="12"
+            ><el-form-item label="浠诲姟鍚嶇О">
+              <el-input v-model="form.name"></el-input> </el-form-item
+          ></el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24"
+            ><el-form-item label="鎵�灞炵瀹�">
+              <el-select v-model="form.region" placeholder="璇烽�夋嫨绉戝">
+                <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
+                <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+              </el-select> </el-form-item></el-col
+        ></el-row>
+        <el-row :gutter="20">
+          <el-col :span="24"
+            ><el-form-item label="闅忚绫诲瀷">
+              <el-select v-model="form.region" placeholder="璇烽�夋嫨闅忚绫诲瀷">
+                <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
+                <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+              </el-select> </el-form-item
+          ></el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="鏈嶅姟妯″潡">
+              <el-select v-model="form.region" placeholder="璇烽�夋嫨妯″潡">
+                <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
+                <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="闂ㄨ瘖闅忚瑕佹眰">
+              <el-input type="textarea" v-model="form.desc"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </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="modificationVisible"
+      width="45%"
+    >
+      <div style="margin-bottom: 20px; color: red">
+        缁熶竴淇敼褰撳ぉ鏈彂閫佺殑浠诲姟鏃堕棿
+      </div>
+
+      <el-form
+        :model="ruleForm"
+        :rules="rules"
+        ref="ruleForm"
+        label-width="120px"
+        class="demo-ruleForm"
+      >
+        <el-form-item label="鍙戦�佹棩鏈�">
+          <el-date-picker
+            v-model="ruleForm.value1"
+            type="date"
+            placeholder="閫夋嫨鏃ユ湡"
+          >
+          </el-date-picker>
+        </el-form-item>
+
+        <el-form-item label="鏃堕棿娈�" prop="type">
+          <el-checkbox-group v-model="ruleForm.type">
+            <el-checkbox label="涓婂崍" name="type"></el-checkbox>
+            <el-checkbox label="涓嬪崍" name="type"></el-checkbox>
+            <el-checkbox label="鏅氫笂" name="type"></el-checkbox>
+          </el-checkbox-group>
+        </el-form-item>
+        <el-form-item label="涓婂崍鏃堕棿鍖洪棿" required>
+          <el-time-picker
+            is-range
+            v-model="ruleForm.value2"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫椂闂�"
+            end-placeholder="缁撴潫鏃堕棿"
+            placeholder="閫夋嫨鏃堕棿鑼冨洿"
+          >
+          </el-time-picker>
+        </el-form-item>
+        <el-form-item label="涓嬪崍鏃堕棿鍖洪棿" required>
+          <el-time-picker
+            is-range
+            v-model="ruleForm.value3"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫椂闂�"
+            end-placeholder="缁撴潫鏃堕棿"
+            placeholder="閫夋嫨鏃堕棿鑼冨洿"
+          >
+          </el-time-picker>
+        </el-form-item>
+        <el-form-item label="鏅氫笂鏃堕棿鍖洪棿" required>
+          <el-time-picker
+            is-range
+            v-model="ruleForm.value4"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫椂闂�"
+            end-placeholder="缁撴潫鏃堕棿"
+            placeholder="閫夋嫨鏃堕棿鑼冨洿"
+          >
+          </el-time-picker>
+        </el-form-item>
+      </el-form>
+
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="modificationVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="modificationVisible = false"
+          >纭� 瀹�</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listUser,
+  getUser,
+  delUser,
+  addUser,
+  updateUser,
+  resetUserPwd,
+  changeUserStatus,
+} from "@/api/system/user";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "User",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鐢ㄦ埛琛ㄦ牸鏁版嵁
+      userList: null,
+      // 寮瑰嚭灞傛爣棰�
+      title: "鏂板闂ㄨ瘖闅忚",
+      // 鏄惁鏄剧ず淇敼銆佹坊鍔犲脊鍑哄眰
+      addalteropen: false,
+      // 淇敼鍙戦�佹椂闂村璇濇
+      modificationVisible: false,
+      // 閮ㄩ棬鍚嶇О
+      deptName: undefined,
+      // 榛樿瀵嗙爜
+      initPassword: undefined,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      ruleForm: {
+        type: [],
+      },
+      dynamicTags: ["閫夐」涓�", "閫夐」浜�", "閫夐」涓�"], //閫夐」
+      inputVisible: false,
+      inputValue: "",
+      previewVisible: false, //闂ㄨ瘖闅忚棰勮寮规
+      radio: "",
+      radios: [],
+      previewtype: 2, //棰勮闂ㄨ瘖闅忚绫诲瀷
+      total: 0, // 鎬绘潯鏁�
+      ImportQuantity: 999, //瀵奸棬璇婇殢璁挎暟閲�
+      //棰勮闂ㄨ瘖闅忚淇℃伅
+      previewvalue: {
+        username: "杩欎釜鍖荤敓瀵逛綘鎬庝箞鏍�",
+      },
+      value: [],
+      list: [],
+      loading: false,
+      states: [
+        "Alabama",
+        "Alaska",
+        "Arizona",
+        "Arkansas",
+        "California",
+        "Colorado",
+        "Connecticut",
+        "Delaware",
+        "Florida",
+        "Georgia",
+        "Hawaii",
+        "Idaho",
+        "Illinois",
+        "Indiana",
+        "Iowa",
+        "Kansas",
+        "Kentucky",
+        "Louisiana",
+        "Maine",
+        "Maryland",
+        "Massachusetts",
+        "Michigan",
+        "Minnesota",
+        "Mississippi",
+        "Missouri",
+        "Montana",
+        "Nebraska",
+        "Nevada",
+        "New Hampshire",
+        "New Jersey",
+        "New Mexico",
+        "New York",
+        "North Carolina",
+        "North Dakota",
+        "Ohio",
+        "Oklahoma",
+        "Oregon",
+        "Pennsylvania",
+        "Rhode Island",
+        "South Carolina",
+        "South Dakota",
+        "Tennessee",
+        "Texas",
+        "Utah",
+        "Vermont",
+        "Virginia",
+        "Washington",
+        "West Virginia",
+        "Wisconsin",
+        "Wyoming",
+      ],
+      pickerOptions: {
+        disabledDate(time) {
+          return time.getTime() > Date.now();
+        },
+        shortcuts: [
+          {
+            text: "浠婂ぉ",
+            onClick(picker) {
+              picker.$emit("pick", new Date());
+            },
+          },
+          {
+            text: "鏄ㄥぉ",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24);
+              picker.$emit("pick", date);
+            },
+          },
+          {
+            text: "涓�鍛ㄥ墠",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit("pick", date);
+            },
+          },
+        ],
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {
+        phonenumber: "",
+        totagid: "",
+        types: "",
+        nickName: "",
+        qystatus: "",
+        btstatus: "",
+      },
+      // 鏌ヨ鍙傛暟
+      topqueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userName: undefined,
+        tagid: undefined,
+        topic: undefined,
+      },
+      propss: { multiple: true },
+      options: [],
+
+      topicoptions: [
+        {
+          value: 1,
+          label: "寰呭鏍�",
+        },
+        {
+          value: 2,
+          label: "鎵ц涓�",
+        },
+        {
+          value: 3,
+          label: "鎵ц瀹屾垚",
+        },
+        {
+          value: 4,
+          label: "宸插仠姝�",
+        },
+      ],
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        userName: [
+          { required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 2,
+            max: 20,
+            message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        nickName: [
+          { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        password: [
+          { required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 5,
+            max: 20,
+            message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        email: [
+          {
+            type: "email",
+            message: "璇疯緭鍏ユ纭殑閭鍦板潃",
+            trigger: ["blur", "change"],
+          },
+        ],
+        phonenumber: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+            trigger: "blur",
+          },
+        ],
+        IDnumber: [
+          {
+            pattern:
+              /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/,
+            message: "璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�",
+            trigger: "blur",
+          },
+        ],
+      },
+    };
+  },
+  watch: {},
+  created() {
+    this.getList();
+    this.getConfigKey("sys.user.initPassword").then((response) => {
+      this.initPassword = response.msg;
+    });
+  },
+  // 鎼滅储
+  mounted() {
+    this.list = this.states.map((item) => {
+      return { value: `value:${item}`, label: `label:${item}` };
+    });
+  },
+  methods: {
+    /** 鏌ヨ闂ㄨ瘖闅忚鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listUser(this.addDateRange(this.topqueryParams, this.dateRange)).then(
+        (response) => {
+          this.userList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      );
+    },
+    // 鏌ョ湅闂ㄨ瘖闅忚璇︽儏
+    Referencequestion(row) {
+      this.previewVisible = true;
+    },
+    // 娣诲姞寮规鎼滅储
+    remoteMethod(query) {
+      if (query !== "") {
+        this.loading = true;
+        setTimeout(() => {
+          this.loading = false;
+          this.options = this.list.filter((item) => {
+            return item.label.toLowerCase().indexOf(query.toLowerCase()) > -1;
+          });
+        }, 200);
+      } else {
+        this.options = [];
+      }
+    },
+    // 闂ㄨ瘖闅忚鐘舵�佷慨鏀�
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "鍚敤" : "鍋滅敤";
+      this.$modal
+        .confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚楋紵')
+        .then(function () {
+          return changeUserStatus(row.userId, row.status);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "鎴愬姛");
+        })
+        .catch(function () {
+          row.status = row.status === "0" ? "1" : "0";
+        });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.addalteropen = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.topqueryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.topqueryParams.deptId = undefined;
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    //鍒犻櫎閫夐」
+    handleClose(tag) {
+      this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
+    },
+    //瑙﹀彂鏂板杈撳叆
+    showInput() {
+      this.inputVisible = true;
+      this.$nextTick((_) => {
+        this.$refs.saveTagInput.$refs.input.focus();
+      });
+    },
+    //鑾峰彇澶卞幓鐒︾偣瑙﹀彂
+    handleInputConfirm() {
+      let inputValue = this.inputValue;
+      if (inputValue) {
+        this.dynamicTags.push(inputValue);
+      }
+      this.inputVisible = false;
+      this.inputValue = "";
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.addalteropen = true;
+      // getUser().then((response) => {
+      //   this.postOptions = response.posts;
+      //   this.roleOptions = response.roles;
+      //   this.title = "鏂板闂ㄨ瘖闅忚";
+      //   this.form.password = this.initPassword;
+      // });
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    // handleUpdate(row) {
+    //   this.reset();
+    //   const userId = row.userId || this.ids;
+    //   getUser(userId).then((response) => {
+    //     this.form = response.data;
+    //     this.postOptions = response.posts;
+    //     this.roleOptions = response.roles;
+    //     this.$set(this.form, "postIds", response.postIds);
+    //     this.$set(this.form, "roleIds", response.roleIds);
+    //     this.addalteropen = true;
+    //     this.title = "淇敼鐢ㄦ埛";
+    //     this.form.password = "";
+    //   });
+    // },
+    /** 閲嶇疆瀵嗙爜鎸夐挳鎿嶄綔 */
+    handleResetPwd(row) {
+      this.$prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        closeOnClickModal: false,
+        inputPattern: /^.{5,20}$/,
+        inputErrorMessage: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+      })
+        .then(({ value }) => {
+          resetUserPwd(row.userId, value).then((response) => {
+            this.$modal.msgSuccess("淇敼鎴愬姛锛屾柊瀵嗙爜鏄細" + value);
+          });
+        })
+        .catch(() => {});
+    },
+
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            updateUser(this.form).then((response) => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUser(this.form).then((response) => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal
+        .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
+        .then(function () {
+          return delUser(userIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+    // 鍏ㄩ儴鍋滄
+    AllStop() {
+      this.$modal
+        .confirm("鏄惁鍋滄鍏ㄩ儴浠诲姟锛�")
+        .then(function () {
+          return console.log("鍋滄鎴愬姛");
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgWarning("鍋滄鎴愬姛");
+        })
+        .catch(() => {});
+    },
+    // 鍏ㄩ儴寮�濮�
+    AllStarted() {
+      this.$modal
+        .confirm("鏄惁寮�鍚叏閮ㄤ换鍔★紵")
+        .then(function () {
+          return console.log("寮�鍚垚鍔�");
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("寮�鍚垚鍔�");
+        })
+        .catch(() => {});
+    },
+    // 浠诲姟閲嶇疆
+    TaskReset() {
+      this.$modal
+        .confirm("鏄惁閲嶇疆閫変腑鐨勪换鍔¢」锛�")
+        .then(function () {
+          return console.log("閫変腑鎴愬姛");
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("閲嶇疆鎴愬姛");
+        })
+        .catch(() => {});
+    },
+    // 璁剧疆鍙戦�佹椂闂�
+    Sendtimesetting() {
+      this.modificationVisible = true;
+    },
+    // 璺宠浆璇︽儏椤�
+    Seedetails() {
+      this.$router.push({
+        path: "/followvisit/record/detailpage/",
+        query: { id: "1" },
+      });
+    },
+    // 瀵煎叆鎸夐挳
+    toleadExport() {},
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download(
+        "system/user/export",
+        {
+          ...this.topqueryParams,
+        },
+        `user_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.el-button--primary.is-plain {
+  color: #ffffff;
+  background: #409eff;
+  border-color: #4fabe9;
+}
+
+.document {
+  // width: 100px;
+  height: 50px;
+}
+
+.documentf {
+  display: flex;
+  justify-content: flex-end;
+}
+
+.download {
+  text-align: center;
+
+  .el-upload__tip {
+    font-size: 23px;
+  }
+
+  .el-upload__text {
+    font-size: 23px;
+  }
+}
+
+.uploading {
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #ffffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+
+.el-tag + .el-tag {
+  margin-left: 10px;
+}
+
+.button-new-tag {
+  margin-left: 10px;
+  height: 32px;
+  line-height: 30px;
+  padding-top: 0;
+  padding-bottom: 0;
+}
+
+.input-new-tag {
+  width: 90px;
+  margin-left: 10px;
+  vertical-align: bottom;
+}
+
+.drexamine {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 30px;
+  background: #daeaf5;
+
+  img {
+    width: 100px;
+    height: 100px;
+  }
+}
+
+.qrcode-dialo {
+  // text-align: center;
+  //   display: flex;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+
+  .topic-dev {
+    margin-bottom: 25px;
+    font-size: 20px !important;
+
+    .dev-text {
+      margin-bottom: 10px;
+    }
+  }
+}
+.button-bb {
+  font-weight: 500;
+  background-color: #2ba05c;
+  padding: 5px;
+  border-radius: 1px;
+  color: #ffffff;
+}
+.button-xq {
+  font-weight: 500;
+  background-color: #409eff;
+  padding: 5px;
+  border-radius: 1px;
+  color: #ffffff;
+}
+.button-sc {
+  font-weight: 500;
+  background-color: #dd302a;
+  padding: 5px;
+  border-radius: 1px;
+  color: #ffffff;
+}
+.button-zx {
+  background: #4fabe9;
+  padding: 5px;
+  border-radius: 1px;
+  color: #ffffff;
+}
+
+::v-deep.el-radio-group {
+  span {
+    font-size: 24px;
+  }
+}
+
+// 閫夐」瀛椾綋鏀惧ぇ
+// ::v-deep.el-checkbox-group {
+//   span {
+//     font-size: 24px;
+//   }
+// }
+</style>
diff --git a/src/views/followvisit/satisfaction/index.vue b/src/views/followvisit/satisfaction/index.vue
new file mode 100644
index 0000000..3b969de
--- /dev/null
+++ b/src/views/followvisit/satisfaction/index.vue
@@ -0,0 +1,897 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <!--鐢ㄦ埛鏁版嵁-->
+
+      <el-form
+        :model="topqueryParams"
+        ref="queryForm"
+        size="small"
+        :inline="true"
+        v-show="showSearch"
+        label-width="98px"
+      >
+        <el-form-item label="浠诲姟鍚嶇О">
+          <el-input v-model="topqueryParams.name"></el-input>
+        </el-form-item>
+        <el-form-item label="瀹℃牳浜�">
+          <el-input v-model="topqueryParams.name"></el-input>
+        </el-form-item>
+        <el-form-item label="瀹℃牳鏃堕棿">
+          <el-date-picker
+            v-model="dateRange"
+            style="width: 240px"
+            value-format="yyyy-MM-dd"
+            type="daterange"
+            range-separator="-"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡"
+          ></el-date-picker>
+        </el-form-item>
+        <el-form-item label="闅忚绫诲瀷" prop="status">
+          <el-select v-model="topqueryParams.topic" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in topicoptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="妯$増" prop="status">
+          <el-select v-model="topqueryParams.topic" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in topicoptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="闂ㄨ瘖闅忚鐘舵��" prop="status">
+          <el-select v-model="topqueryParams.topic" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in topicoptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button
+            type="primary"
+            icon="el-icon-search"
+            size="medium"
+            @click="handleQuery"
+            >鎼滅储</el-button
+          >
+          <el-button icon="el-icon-refresh" size="medium" @click="resetQuery"
+            >閲嶇疆</el-button
+          >
+        </el-form-item>
+      </el-form>
+      <el-divider></el-divider>
+      <el-row :gutter="10" class="mb8">
+        <el-col :span="1.5">
+          <el-button
+            type="primary"
+            plain
+            icon="el-icon-plus"
+            size="medium"
+            @click="handleAdd"
+            v-hasPermi="['system:user:add']"
+            >鏂板</el-button
+          >
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+            type="success"
+            plain
+            icon="el-icon-edit"
+            size="medium"
+            :disabled="single"
+            @click="handleUpdate"
+            v-hasPermi="['system:user:edit']"
+            >淇敼</el-button
+          >
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+            type="danger"
+            plain
+            icon="el-icon-delete"
+            size="medium"
+            :disabled="multiple"
+            @click="handleDelete"
+            v-hasPermi="['system:user:remove']"
+            >鍒犻櫎</el-button
+          >
+        </el-col>
+        <el-col :span="19">
+          <div class="documentf">
+            <div class="document">
+              <el-button
+                type="warning"
+                plain
+                icon="el-icon-download"
+                size="medium"
+                @click="handleExport"
+                v-hasPermi="['system:user:export']"
+                >瀵煎嚭</el-button
+              >
+            </div>
+          </div>
+        </el-col>
+        <!-- <el-col :span="1.5"> </el-col> -->
+      </el-row>
+      <!-- <right-toolbar
+              :showSearch.sync="showSearch"
+              @queryTable="getList"
+              :columns="columns"
+            ></right-toolbar> -->
+      <el-table
+        v-loading="loading"
+        :data="userList"
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="50" align="center" />
+        <el-table-column
+          label="搴忓彿"
+          align="center"
+          key="userId"
+          prop="userId"
+        />
+
+        <el-table-column
+          label="浠诲姟鍚嶇О"
+          align="center"
+          sortable
+          key="userName"
+          prop="userName"
+          :show-overflow-tooltip="true"
+        />
+        <el-table-column
+          label="鏈嶅姟妯℃澘"
+          align="center"
+          key="types"
+          prop="types"
+        />
+        <el-table-column
+          label="鍒涘缓鏃ユ湡"
+          align="center"
+          key="nickName"
+          prop="nickName"
+        />
+        <el-table-column
+          label="寰呮墽琛�/鎬绘暟"
+          align="center"
+          key="phonenumber"
+          prop="phonenumber"
+          width="120"
+        >
+          <template slot-scope="scope">
+            <span style="margin-left: 10px"
+              >{{ scope.row.date }}/{{ scope.row.data }}</span
+            >
+          </template>
+        </el-table-column>
+
+        <el-table-column
+          label="鎵ц鐘舵��"
+          align="center"
+          key="topicnumber"
+          prop="topicnumber"
+          width="120"
+          :show-overflow-tooltip="true"
+        >
+          <template slot-scope="scope">
+            <div>鎵ц瀹屾垚/鎵ц澶辫触</div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="瀹℃牳浜�"
+          align="center"
+          key="topicnumberaa"
+          prop="topicnumberaa"
+          sortable
+          width="120"
+          :show-overflow-tooltip="true"
+        />
+
+        <el-table-column
+          label="瀹℃牳鏃堕棿"
+          sortable
+          align="center"
+          prop="createTime"
+          width="160"
+        >
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.createTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="鎿嶄綔"
+          align="center"
+          width="120"
+          class-name="small-padding fixed-width"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-zx"
+                ><i class="el-icon-s-promotion"></i>寮�濮嬫墽琛�</span
+              ></el-button
+            >
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="浠诲姟璇︽儏"
+          align="center"
+          width="200"
+          class-name="small-padding fixed-width"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-xq"
+                ><i class="el-icon-s-data"></i>璇︽儏</span
+              ></el-button
+            >
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-bb"
+                ><i class="el-icon-s-order"></i>鎶ヨ〃</span
+              ></el-button
+            >
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-sc"
+                ><i class="el-icon-delete"></i>鍒犻櫎</span
+              ></el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        :page.sync="topqueryParams.pageNum"
+        :limit.sync="topqueryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-row>
+    <!-- 娣诲姞鎴栦慨鏀归棬璇婇殢璁垮璇濇 -->
+    <el-dialog
+      :title="title"
+      :visible.sync="addalteropen"
+      width="700px"
+      append-to-body
+    >
+      <el-form ref="form" :model="form" label-width="100px">
+        <el-row :gutter="20">
+          <el-col :span="12"
+            ><el-form-item label="浠诲姟鍚嶇О">
+              <el-input v-model="form.name"></el-input> </el-form-item
+          ></el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24"
+            ><el-form-item label="鎵�灞炵瀹�">
+              <el-select v-model="form.region" placeholder="璇烽�夋嫨绉戝">
+                <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
+                <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+              </el-select> </el-form-item></el-col
+        ></el-row>
+        <el-row :gutter="20">
+          <el-col :span="24"
+            ><el-form-item label="闅忚绫诲瀷">
+              <el-select v-model="form.region" placeholder="璇烽�夋嫨闅忚绫诲瀷">
+                <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
+                <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+              </el-select> </el-form-item
+          ></el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="鏈嶅姟妯″潡">
+              <el-select v-model="form.region" placeholder="璇烽�夋嫨妯″潡">
+                <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
+                <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="闂ㄨ瘖闅忚瑕佹眰">
+              <el-input type="textarea" v-model="form.desc"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </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 {
+  listUser,
+  getUser,
+  delUser,
+  addUser,
+  updateUser,
+  resetUserPwd,
+  changeUserStatus,
+} from "@/api/system/user";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "User",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鐢ㄦ埛琛ㄦ牸鏁版嵁
+      userList: null,
+      // 寮瑰嚭灞傛爣棰�
+      title: "鏂板闂ㄨ瘖闅忚",
+      // 鏄惁鏄剧ず淇敼銆佹坊鍔犲脊鍑哄眰
+      addalteropen: false,
+      // 閮ㄩ棬鍚嶇О
+      deptName: undefined,
+      // 榛樿瀵嗙爜
+      initPassword: undefined,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      // 瑙掕壊閫夐」
+      roleOptions: [],
+      dynamicTags: ["閫夐」涓�", "閫夐」浜�", "閫夐」涓�"], //閫夐」
+      inputVisible: false,
+      inputValue: "",
+      previewVisible: false, //闂ㄨ瘖闅忚棰勮寮规
+      radio: "",
+      radios: [],
+      previewtype: 2, //棰勮闂ㄨ瘖闅忚绫诲瀷
+      total: 0, // 鎬绘潯鏁�
+      ImportQuantity: 999, //瀵奸棬璇婇殢璁挎暟閲�
+      //棰勮闂ㄨ瘖闅忚淇℃伅
+      previewvalue: {
+        username: "杩欎釜鍖荤敓瀵逛綘鎬庝箞鏍�",
+      },
+      value: [],
+      list: [],
+      loading: false,
+      states: [
+        "Alabama",
+        "Alaska",
+        "Arizona",
+        "Arkansas",
+        "California",
+        "Colorado",
+        "Connecticut",
+        "Delaware",
+        "Florida",
+        "Georgia",
+        "Hawaii",
+        "Idaho",
+        "Illinois",
+        "Indiana",
+        "Iowa",
+        "Kansas",
+        "Kentucky",
+        "Louisiana",
+        "Maine",
+        "Maryland",
+        "Massachusetts",
+        "Michigan",
+        "Minnesota",
+        "Mississippi",
+        "Missouri",
+        "Montana",
+        "Nebraska",
+        "Nevada",
+        "New Hampshire",
+        "New Jersey",
+        "New Mexico",
+        "New York",
+        "North Carolina",
+        "North Dakota",
+        "Ohio",
+        "Oklahoma",
+        "Oregon",
+        "Pennsylvania",
+        "Rhode Island",
+        "South Carolina",
+        "South Dakota",
+        "Tennessee",
+        "Texas",
+        "Utah",
+        "Vermont",
+        "Virginia",
+        "Washington",
+        "West Virginia",
+        "Wisconsin",
+        "Wyoming",
+      ],
+      pickerOptions: {
+        disabledDate(time) {
+          return time.getTime() > Date.now();
+        },
+        shortcuts: [
+          {
+            text: "浠婂ぉ",
+            onClick(picker) {
+              picker.$emit("pick", new Date());
+            },
+          },
+          {
+            text: "鏄ㄥぉ",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24);
+              picker.$emit("pick", date);
+            },
+          },
+          {
+            text: "涓�鍛ㄥ墠",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit("pick", date);
+            },
+          },
+        ],
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {
+        phonenumber: "",
+        totagid: "",
+        types: "",
+        nickName: "",
+        qystatus: "",
+        btstatus: "",
+      },
+      // 鏌ヨ鍙傛暟
+      topqueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userName: undefined,
+        tagid: undefined,
+        topic: undefined,
+      },
+      propss: { multiple: true },
+      options: [],
+
+      topicoptions: [
+        {
+          value: 1,
+          label: "寰呭鏍�",
+        },
+        {
+          value: 2,
+          label: "鎵ц涓�",
+        },
+        {
+          value: 3,
+          label: "鎵ц瀹屾垚",
+        },
+        {
+          value: 4,
+          label: "宸插仠姝�",
+        },
+      ],
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        userName: [
+          { required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 2,
+            max: 20,
+            message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        nickName: [
+          { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        password: [
+          { required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 5,
+            max: 20,
+            message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        email: [
+          {
+            type: "email",
+            message: "璇疯緭鍏ユ纭殑閭鍦板潃",
+            trigger: ["blur", "change"],
+          },
+        ],
+        phonenumber: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+            trigger: "blur",
+          },
+        ],
+        IDnumber: [
+          {
+            pattern:
+              /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/,
+            message: "璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�",
+            trigger: "blur",
+          },
+        ],
+      },
+    };
+  },
+  watch: {},
+  created() {
+    this.getList();
+    this.getConfigKey("sys.user.initPassword").then((response) => {
+      this.initPassword = response.msg;
+    });
+  },
+  // 鎼滅储
+  mounted() {
+    this.list = this.states.map((item) => {
+      return { value: `value:${item}`, label: `label:${item}` };
+    });
+  },
+  methods: {
+    /** 鏌ヨ闂ㄨ瘖闅忚鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listUser(this.addDateRange(this.topqueryParams, this.dateRange)).then(
+        (response) => {
+          this.userList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      );
+    },
+    // 鏌ョ湅闂ㄨ瘖闅忚璇︽儏
+    Referencequestion(row) {
+      this.previewVisible = true;
+    },
+    // 娣诲姞寮规鎼滅储
+    remoteMethod(query) {
+      if (query !== "") {
+        this.loading = true;
+        setTimeout(() => {
+          this.loading = false;
+          this.options = this.list.filter((item) => {
+            return item.label.toLowerCase().indexOf(query.toLowerCase()) > -1;
+          });
+        }, 200);
+      } else {
+        this.options = [];
+      }
+    },
+    // 闂ㄨ瘖闅忚鐘舵�佷慨鏀�
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "鍚敤" : "鍋滅敤";
+      this.$modal
+        .confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚楋紵')
+        .then(function () {
+          return changeUserStatus(row.userId, row.status);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "鎴愬姛");
+        })
+        .catch(function () {
+          row.status = row.status === "0" ? "1" : "0";
+        });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.addalteropen = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.topqueryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.topqueryParams.deptId = undefined;
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    //鍒犻櫎閫夐」
+    handleClose(tag) {
+      this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
+    },
+    //瑙﹀彂鏂板杈撳叆
+    showInput() {
+      this.inputVisible = true;
+      this.$nextTick((_) => {
+        this.$refs.saveTagInput.$refs.input.focus();
+      });
+    },
+    //鑾峰彇澶卞幓鐒︾偣瑙﹀彂
+    handleInputConfirm() {
+      let inputValue = this.inputValue;
+      if (inputValue) {
+        this.dynamicTags.push(inputValue);
+      }
+      this.inputVisible = false;
+      this.inputValue = "";
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.addalteropen = true;
+      // getUser().then((response) => {
+      //   this.postOptions = response.posts;
+      //   this.roleOptions = response.roles;
+      //   this.title = "鏂板闂ㄨ瘖闅忚";
+      //   this.form.password = this.initPassword;
+      // });
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const userId = row.userId || this.ids;
+      getUser(userId).then((response) => {
+        this.form = response.data;
+        this.postOptions = response.posts;
+        this.roleOptions = response.roles;
+        this.$set(this.form, "postIds", response.postIds);
+        this.$set(this.form, "roleIds", response.roleIds);
+        this.addalteropen = true;
+        this.title = "淇敼鐢ㄦ埛";
+        this.form.password = "";
+      });
+    },
+    /** 閲嶇疆瀵嗙爜鎸夐挳鎿嶄綔 */
+    handleResetPwd(row) {
+      this.$prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        closeOnClickModal: false,
+        inputPattern: /^.{5,20}$/,
+        inputErrorMessage: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+      })
+        .then(({ value }) => {
+          resetUserPwd(row.userId, value).then((response) => {
+            this.$modal.msgSuccess("淇敼鎴愬姛锛屾柊瀵嗙爜鏄細" + value);
+          });
+        })
+        .catch(() => {});
+    },
+
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            updateUser(this.form).then((response) => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUser(this.form).then((response) => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal
+        .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
+        .then(function () {
+          return delUser(userIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download(
+        "system/user/export",
+        {
+          ...this.topqueryParams,
+        },
+        `user_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.el-button--primary.is-plain {
+  color: #ffffff;
+  background: #409eff;
+  border-color: #4fabe9;
+}
+
+.document {
+  width: 100px;
+  height: 50px;
+}
+
+.documentf {
+  display: flex;
+  justify-content: flex-end;
+}
+
+.download {
+  text-align: center;
+
+  .el-upload__tip {
+    font-size: 23px;
+  }
+
+  .el-upload__text {
+    font-size: 23px;
+  }
+}
+
+.uploading {
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #ffffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+
+.el-tag + .el-tag {
+  margin-left: 10px;
+}
+
+.button-new-tag {
+  margin-left: 10px;
+  height: 32px;
+  line-height: 30px;
+  padding-top: 0;
+  padding-bottom: 0;
+}
+
+.input-new-tag {
+  width: 90px;
+  margin-left: 10px;
+  vertical-align: bottom;
+}
+
+.drexamine {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 30px;
+  background: #daeaf5;
+
+  img {
+    width: 100px;
+    height: 100px;
+  }
+}
+
+.qrcode-dialo {
+  // text-align: center;
+  //   display: flex;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+
+  .topic-dev {
+    margin-bottom: 25px;
+    font-size: 20px !important;
+
+    .dev-text {
+      margin-bottom: 10px;
+    }
+  }
+}
+.button-bb {
+  font-weight: 500;
+  color: #2ba05c;
+}
+.button-xq {
+  font-weight: 500;
+  color: #409eff;
+}
+.button-sc {
+  font-weight: 500;
+  color: #dd302a;
+}
+.button-zx {
+  background: #4fabe9;
+  padding: 5px;
+  border-radius: 1px;
+  color: #ffffff;
+}
+
+::v-deep.el-radio-group {
+  span {
+    font-size: 24px;
+  }
+}
+
+::v-deep.el-checkbox-group {
+  span {
+    font-size: 24px;
+  }
+}
+</style>
diff --git a/src/views/followvisit/tasklist/index.vue b/src/views/followvisit/tasklist/index.vue
new file mode 100644
index 0000000..3b969de
--- /dev/null
+++ b/src/views/followvisit/tasklist/index.vue
@@ -0,0 +1,897 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <!--鐢ㄦ埛鏁版嵁-->
+
+      <el-form
+        :model="topqueryParams"
+        ref="queryForm"
+        size="small"
+        :inline="true"
+        v-show="showSearch"
+        label-width="98px"
+      >
+        <el-form-item label="浠诲姟鍚嶇О">
+          <el-input v-model="topqueryParams.name"></el-input>
+        </el-form-item>
+        <el-form-item label="瀹℃牳浜�">
+          <el-input v-model="topqueryParams.name"></el-input>
+        </el-form-item>
+        <el-form-item label="瀹℃牳鏃堕棿">
+          <el-date-picker
+            v-model="dateRange"
+            style="width: 240px"
+            value-format="yyyy-MM-dd"
+            type="daterange"
+            range-separator="-"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡"
+          ></el-date-picker>
+        </el-form-item>
+        <el-form-item label="闅忚绫诲瀷" prop="status">
+          <el-select v-model="topqueryParams.topic" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in topicoptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="妯$増" prop="status">
+          <el-select v-model="topqueryParams.topic" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in topicoptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="闂ㄨ瘖闅忚鐘舵��" prop="status">
+          <el-select v-model="topqueryParams.topic" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in topicoptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button
+            type="primary"
+            icon="el-icon-search"
+            size="medium"
+            @click="handleQuery"
+            >鎼滅储</el-button
+          >
+          <el-button icon="el-icon-refresh" size="medium" @click="resetQuery"
+            >閲嶇疆</el-button
+          >
+        </el-form-item>
+      </el-form>
+      <el-divider></el-divider>
+      <el-row :gutter="10" class="mb8">
+        <el-col :span="1.5">
+          <el-button
+            type="primary"
+            plain
+            icon="el-icon-plus"
+            size="medium"
+            @click="handleAdd"
+            v-hasPermi="['system:user:add']"
+            >鏂板</el-button
+          >
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+            type="success"
+            plain
+            icon="el-icon-edit"
+            size="medium"
+            :disabled="single"
+            @click="handleUpdate"
+            v-hasPermi="['system:user:edit']"
+            >淇敼</el-button
+          >
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+            type="danger"
+            plain
+            icon="el-icon-delete"
+            size="medium"
+            :disabled="multiple"
+            @click="handleDelete"
+            v-hasPermi="['system:user:remove']"
+            >鍒犻櫎</el-button
+          >
+        </el-col>
+        <el-col :span="19">
+          <div class="documentf">
+            <div class="document">
+              <el-button
+                type="warning"
+                plain
+                icon="el-icon-download"
+                size="medium"
+                @click="handleExport"
+                v-hasPermi="['system:user:export']"
+                >瀵煎嚭</el-button
+              >
+            </div>
+          </div>
+        </el-col>
+        <!-- <el-col :span="1.5"> </el-col> -->
+      </el-row>
+      <!-- <right-toolbar
+              :showSearch.sync="showSearch"
+              @queryTable="getList"
+              :columns="columns"
+            ></right-toolbar> -->
+      <el-table
+        v-loading="loading"
+        :data="userList"
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="50" align="center" />
+        <el-table-column
+          label="搴忓彿"
+          align="center"
+          key="userId"
+          prop="userId"
+        />
+
+        <el-table-column
+          label="浠诲姟鍚嶇О"
+          align="center"
+          sortable
+          key="userName"
+          prop="userName"
+          :show-overflow-tooltip="true"
+        />
+        <el-table-column
+          label="鏈嶅姟妯℃澘"
+          align="center"
+          key="types"
+          prop="types"
+        />
+        <el-table-column
+          label="鍒涘缓鏃ユ湡"
+          align="center"
+          key="nickName"
+          prop="nickName"
+        />
+        <el-table-column
+          label="寰呮墽琛�/鎬绘暟"
+          align="center"
+          key="phonenumber"
+          prop="phonenumber"
+          width="120"
+        >
+          <template slot-scope="scope">
+            <span style="margin-left: 10px"
+              >{{ scope.row.date }}/{{ scope.row.data }}</span
+            >
+          </template>
+        </el-table-column>
+
+        <el-table-column
+          label="鎵ц鐘舵��"
+          align="center"
+          key="topicnumber"
+          prop="topicnumber"
+          width="120"
+          :show-overflow-tooltip="true"
+        >
+          <template slot-scope="scope">
+            <div>鎵ц瀹屾垚/鎵ц澶辫触</div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="瀹℃牳浜�"
+          align="center"
+          key="topicnumberaa"
+          prop="topicnumberaa"
+          sortable
+          width="120"
+          :show-overflow-tooltip="true"
+        />
+
+        <el-table-column
+          label="瀹℃牳鏃堕棿"
+          sortable
+          align="center"
+          prop="createTime"
+          width="160"
+        >
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.createTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="鎿嶄綔"
+          align="center"
+          width="120"
+          class-name="small-padding fixed-width"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-zx"
+                ><i class="el-icon-s-promotion"></i>寮�濮嬫墽琛�</span
+              ></el-button
+            >
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="浠诲姟璇︽儏"
+          align="center"
+          width="200"
+          class-name="small-padding fixed-width"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-xq"
+                ><i class="el-icon-s-data"></i>璇︽儏</span
+              ></el-button
+            >
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-bb"
+                ><i class="el-icon-s-order"></i>鎶ヨ〃</span
+              ></el-button
+            >
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:user:edit']"
+              ><span class="button-sc"
+                ><i class="el-icon-delete"></i>鍒犻櫎</span
+              ></el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        :page.sync="topqueryParams.pageNum"
+        :limit.sync="topqueryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-row>
+    <!-- 娣诲姞鎴栦慨鏀归棬璇婇殢璁垮璇濇 -->
+    <el-dialog
+      :title="title"
+      :visible.sync="addalteropen"
+      width="700px"
+      append-to-body
+    >
+      <el-form ref="form" :model="form" label-width="100px">
+        <el-row :gutter="20">
+          <el-col :span="12"
+            ><el-form-item label="浠诲姟鍚嶇О">
+              <el-input v-model="form.name"></el-input> </el-form-item
+          ></el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24"
+            ><el-form-item label="鎵�灞炵瀹�">
+              <el-select v-model="form.region" placeholder="璇烽�夋嫨绉戝">
+                <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
+                <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+              </el-select> </el-form-item></el-col
+        ></el-row>
+        <el-row :gutter="20">
+          <el-col :span="24"
+            ><el-form-item label="闅忚绫诲瀷">
+              <el-select v-model="form.region" placeholder="璇烽�夋嫨闅忚绫诲瀷">
+                <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
+                <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+              </el-select> </el-form-item
+          ></el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="鏈嶅姟妯″潡">
+              <el-select v-model="form.region" placeholder="璇烽�夋嫨妯″潡">
+                <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
+                <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="闂ㄨ瘖闅忚瑕佹眰">
+              <el-input type="textarea" v-model="form.desc"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </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 {
+  listUser,
+  getUser,
+  delUser,
+  addUser,
+  updateUser,
+  resetUserPwd,
+  changeUserStatus,
+} from "@/api/system/user";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "User",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鐢ㄦ埛琛ㄦ牸鏁版嵁
+      userList: null,
+      // 寮瑰嚭灞傛爣棰�
+      title: "鏂板闂ㄨ瘖闅忚",
+      // 鏄惁鏄剧ず淇敼銆佹坊鍔犲脊鍑哄眰
+      addalteropen: false,
+      // 閮ㄩ棬鍚嶇О
+      deptName: undefined,
+      // 榛樿瀵嗙爜
+      initPassword: undefined,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      // 瑙掕壊閫夐」
+      roleOptions: [],
+      dynamicTags: ["閫夐」涓�", "閫夐」浜�", "閫夐」涓�"], //閫夐」
+      inputVisible: false,
+      inputValue: "",
+      previewVisible: false, //闂ㄨ瘖闅忚棰勮寮规
+      radio: "",
+      radios: [],
+      previewtype: 2, //棰勮闂ㄨ瘖闅忚绫诲瀷
+      total: 0, // 鎬绘潯鏁�
+      ImportQuantity: 999, //瀵奸棬璇婇殢璁挎暟閲�
+      //棰勮闂ㄨ瘖闅忚淇℃伅
+      previewvalue: {
+        username: "杩欎釜鍖荤敓瀵逛綘鎬庝箞鏍�",
+      },
+      value: [],
+      list: [],
+      loading: false,
+      states: [
+        "Alabama",
+        "Alaska",
+        "Arizona",
+        "Arkansas",
+        "California",
+        "Colorado",
+        "Connecticut",
+        "Delaware",
+        "Florida",
+        "Georgia",
+        "Hawaii",
+        "Idaho",
+        "Illinois",
+        "Indiana",
+        "Iowa",
+        "Kansas",
+        "Kentucky",
+        "Louisiana",
+        "Maine",
+        "Maryland",
+        "Massachusetts",
+        "Michigan",
+        "Minnesota",
+        "Mississippi",
+        "Missouri",
+        "Montana",
+        "Nebraska",
+        "Nevada",
+        "New Hampshire",
+        "New Jersey",
+        "New Mexico",
+        "New York",
+        "North Carolina",
+        "North Dakota",
+        "Ohio",
+        "Oklahoma",
+        "Oregon",
+        "Pennsylvania",
+        "Rhode Island",
+        "South Carolina",
+        "South Dakota",
+        "Tennessee",
+        "Texas",
+        "Utah",
+        "Vermont",
+        "Virginia",
+        "Washington",
+        "West Virginia",
+        "Wisconsin",
+        "Wyoming",
+      ],
+      pickerOptions: {
+        disabledDate(time) {
+          return time.getTime() > Date.now();
+        },
+        shortcuts: [
+          {
+            text: "浠婂ぉ",
+            onClick(picker) {
+              picker.$emit("pick", new Date());
+            },
+          },
+          {
+            text: "鏄ㄥぉ",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24);
+              picker.$emit("pick", date);
+            },
+          },
+          {
+            text: "涓�鍛ㄥ墠",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit("pick", date);
+            },
+          },
+        ],
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {
+        phonenumber: "",
+        totagid: "",
+        types: "",
+        nickName: "",
+        qystatus: "",
+        btstatus: "",
+      },
+      // 鏌ヨ鍙傛暟
+      topqueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userName: undefined,
+        tagid: undefined,
+        topic: undefined,
+      },
+      propss: { multiple: true },
+      options: [],
+
+      topicoptions: [
+        {
+          value: 1,
+          label: "寰呭鏍�",
+        },
+        {
+          value: 2,
+          label: "鎵ц涓�",
+        },
+        {
+          value: 3,
+          label: "鎵ц瀹屾垚",
+        },
+        {
+          value: 4,
+          label: "宸插仠姝�",
+        },
+      ],
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        userName: [
+          { required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 2,
+            max: 20,
+            message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        nickName: [
+          { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        password: [
+          { required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 5,
+            max: 20,
+            message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+            trigger: "blur",
+          },
+        ],
+        email: [
+          {
+            type: "email",
+            message: "璇疯緭鍏ユ纭殑閭鍦板潃",
+            trigger: ["blur", "change"],
+          },
+        ],
+        phonenumber: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+            trigger: "blur",
+          },
+        ],
+        IDnumber: [
+          {
+            pattern:
+              /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/,
+            message: "璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�",
+            trigger: "blur",
+          },
+        ],
+      },
+    };
+  },
+  watch: {},
+  created() {
+    this.getList();
+    this.getConfigKey("sys.user.initPassword").then((response) => {
+      this.initPassword = response.msg;
+    });
+  },
+  // 鎼滅储
+  mounted() {
+    this.list = this.states.map((item) => {
+      return { value: `value:${item}`, label: `label:${item}` };
+    });
+  },
+  methods: {
+    /** 鏌ヨ闂ㄨ瘖闅忚鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listUser(this.addDateRange(this.topqueryParams, this.dateRange)).then(
+        (response) => {
+          this.userList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      );
+    },
+    // 鏌ョ湅闂ㄨ瘖闅忚璇︽儏
+    Referencequestion(row) {
+      this.previewVisible = true;
+    },
+    // 娣诲姞寮规鎼滅储
+    remoteMethod(query) {
+      if (query !== "") {
+        this.loading = true;
+        setTimeout(() => {
+          this.loading = false;
+          this.options = this.list.filter((item) => {
+            return item.label.toLowerCase().indexOf(query.toLowerCase()) > -1;
+          });
+        }, 200);
+      } else {
+        this.options = [];
+      }
+    },
+    // 闂ㄨ瘖闅忚鐘舵�佷慨鏀�
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "鍚敤" : "鍋滅敤";
+      this.$modal
+        .confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚楋紵')
+        .then(function () {
+          return changeUserStatus(row.userId, row.status);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "鎴愬姛");
+        })
+        .catch(function () {
+          row.status = row.status === "0" ? "1" : "0";
+        });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.addalteropen = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.topqueryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.topqueryParams.deptId = undefined;
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    //鍒犻櫎閫夐」
+    handleClose(tag) {
+      this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
+    },
+    //瑙﹀彂鏂板杈撳叆
+    showInput() {
+      this.inputVisible = true;
+      this.$nextTick((_) => {
+        this.$refs.saveTagInput.$refs.input.focus();
+      });
+    },
+    //鑾峰彇澶卞幓鐒︾偣瑙﹀彂
+    handleInputConfirm() {
+      let inputValue = this.inputValue;
+      if (inputValue) {
+        this.dynamicTags.push(inputValue);
+      }
+      this.inputVisible = false;
+      this.inputValue = "";
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.addalteropen = true;
+      // getUser().then((response) => {
+      //   this.postOptions = response.posts;
+      //   this.roleOptions = response.roles;
+      //   this.title = "鏂板闂ㄨ瘖闅忚";
+      //   this.form.password = this.initPassword;
+      // });
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const userId = row.userId || this.ids;
+      getUser(userId).then((response) => {
+        this.form = response.data;
+        this.postOptions = response.posts;
+        this.roleOptions = response.roles;
+        this.$set(this.form, "postIds", response.postIds);
+        this.$set(this.form, "roleIds", response.roleIds);
+        this.addalteropen = true;
+        this.title = "淇敼鐢ㄦ埛";
+        this.form.password = "";
+      });
+    },
+    /** 閲嶇疆瀵嗙爜鎸夐挳鎿嶄綔 */
+    handleResetPwd(row) {
+      this.$prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        closeOnClickModal: false,
+        inputPattern: /^.{5,20}$/,
+        inputErrorMessage: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+      })
+        .then(({ value }) => {
+          resetUserPwd(row.userId, value).then((response) => {
+            this.$modal.msgSuccess("淇敼鎴愬姛锛屾柊瀵嗙爜鏄細" + value);
+          });
+        })
+        .catch(() => {});
+    },
+
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            updateUser(this.form).then((response) => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUser(this.form).then((response) => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal
+        .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
+        .then(function () {
+          return delUser(userIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download(
+        "system/user/export",
+        {
+          ...this.topqueryParams,
+        },
+        `user_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.el-button--primary.is-plain {
+  color: #ffffff;
+  background: #409eff;
+  border-color: #4fabe9;
+}
+
+.document {
+  width: 100px;
+  height: 50px;
+}
+
+.documentf {
+  display: flex;
+  justify-content: flex-end;
+}
+
+.download {
+  text-align: center;
+
+  .el-upload__tip {
+    font-size: 23px;
+  }
+
+  .el-upload__text {
+    font-size: 23px;
+  }
+}
+
+.uploading {
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #ffffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+
+.el-tag + .el-tag {
+  margin-left: 10px;
+}
+
+.button-new-tag {
+  margin-left: 10px;
+  height: 32px;
+  line-height: 30px;
+  padding-top: 0;
+  padding-bottom: 0;
+}
+
+.input-new-tag {
+  width: 90px;
+  margin-left: 10px;
+  vertical-align: bottom;
+}
+
+.drexamine {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 30px;
+  background: #daeaf5;
+
+  img {
+    width: 100px;
+    height: 100px;
+  }
+}
+
+.qrcode-dialo {
+  // text-align: center;
+  //   display: flex;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+
+  .topic-dev {
+    margin-bottom: 25px;
+    font-size: 20px !important;
+
+    .dev-text {
+      margin-bottom: 10px;
+    }
+  }
+}
+.button-bb {
+  font-weight: 500;
+  color: #2ba05c;
+}
+.button-xq {
+  font-weight: 500;
+  color: #409eff;
+}
+.button-sc {
+  font-weight: 500;
+  color: #dd302a;
+}
+.button-zx {
+  background: #4fabe9;
+  padding: 5px;
+  border-radius: 1px;
+  color: #ffffff;
+}
+
+::v-deep.el-radio-group {
+  span {
+    font-size: 24px;
+  }
+}
+
+::v-deep.el-checkbox-group {
+  span {
+    font-size: 24px;
+  }
+}
+</style>
diff --git a/src/views/login.vue b/src/views/login.vue
index 6402807..f595938 100644
--- a/src/views/login.vue
+++ b/src/views/login.vue
@@ -36,7 +36,7 @@
           />
         </el-input>
       </el-form-item>
-      <el-form-item prop="code" v-if="captchaEnabled">
+      <!-- <el-form-item prop="code" v-if="captchaEnabled">
         <el-input
           v-model="loginForm.code"
           auto-complete="off"
@@ -53,7 +53,7 @@
         <div class="login-code">
           <img :src="codeUrl" @click="getCode" class="login-code-img" />
         </div>
-      </el-form-item>
+      </el-form-item> -->
       <el-checkbox
         v-model="loginForm.rememberMe"
         style="margin: 0px 0px 25px 0px"
@@ -108,7 +108,7 @@
         password: [
           { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勫瘑鐮�" },
         ],
-        code: [{ required: true, trigger: "change", message: "璇疯緭鍏ラ獙璇佺爜" }],
+        // code: [{ required: true, trigger: "change", message: "璇疯緭鍏ラ獙璇佺爜" }],
       },
       loading: false,
       // 楠岃瘉鐮佸紑鍏�
@@ -133,6 +133,7 @@
   methods: {
     getCode() {
       getCodeImg().then((res) => {
+        console.log(res);
         this.captchaEnabled =
           res.captchaEnabled === undefined ? true : res.captchaEnabled;
         if (this.captchaEnabled) {
diff --git a/src/views/patient/follow/index.vue b/src/views/patient/follow/index.vue
new file mode 100644
index 0000000..289990c
--- /dev/null
+++ b/src/views/patient/follow/index.vue
@@ -0,0 +1,17 @@
+<template>
+  <div>鎮h�呭洖璁�</div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {};
+  },
+
+  created() {},
+
+  methods: {},
+};
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/src/views/patient/physical/index.vue b/src/views/patient/physical/index.vue
new file mode 100644
index 0000000..80e4c31
--- /dev/null
+++ b/src/views/patient/physical/index.vue
@@ -0,0 +1,17 @@
+<template>
+  <div>浣撴閫氱煡</div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {};
+  },
+
+  created() {},
+
+  methods: {},
+};
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/src/views/patient/propaganda/index.vue b/src/views/patient/propaganda/index.vue
new file mode 100644
index 0000000..54b99d1
--- /dev/null
+++ b/src/views/patient/propaganda/index.vue
@@ -0,0 +1,17 @@
+<template>
+  <div>瀹f暀鏈嶅姟</div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {};
+  },
+
+  created() {},
+
+  methods: {},
+};
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/src/views/patient/questionnaire/index.vue b/src/views/patient/questionnaire/index.vue
new file mode 100644
index 0000000..5e70d58
--- /dev/null
+++ b/src/views/patient/questionnaire/index.vue
@@ -0,0 +1,17 @@
+<template>
+  <div>闂嵎鏈嶅姟</div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {};
+  },
+
+  created() {},
+
+  methods: {},
+};
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/src/views/patient/review/index.vue b/src/views/patient/review/index.vue
new file mode 100644
index 0000000..7f55ecf
--- /dev/null
+++ b/src/views/patient/review/index.vue
@@ -0,0 +1,17 @@
+<template>
+  <div>澶嶆煡閫氱煡</div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {};
+  },
+
+  created() {},
+
+  methods: {},
+};
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/src/views/patient/servefn/index.vue b/src/views/patient/servefn/index.vue
new file mode 100644
index 0000000..92b4835
--- /dev/null
+++ b/src/views/patient/servefn/index.vue
@@ -0,0 +1,27 @@
+<template>
+  <div>
+鎮h�呮湇鍔�
+  </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+
+    }
+  },
+
+  created () {
+
+  },
+
+  methods: {
+
+  }
+}
+</script>
+
+<style lang='scss' scoped>
+
+</style>
diff --git a/src/views/patient/subsequent/index.vue b/src/views/patient/subsequent/index.vue
new file mode 100644
index 0000000..80297ee
--- /dev/null
+++ b/src/views/patient/subsequent/index.vue
@@ -0,0 +1,17 @@
+<template>
+  <div>澶嶈瘖閫氱煡</div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {};
+  },
+
+  created() {},
+
+  methods: {},
+};
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/src/views/sfstatistics/Voicedetail/index.vue b/src/views/sfstatistics/Voicedetail/index.vue
new file mode 100644
index 0000000..0ffbe56
--- /dev/null
+++ b/src/views/sfstatistics/Voicedetail/index.vue
@@ -0,0 +1,379 @@
+<template>
+  <div class="Questionnairemanagement">
+    <!-- 鍙充晶鏁版嵁 -->
+    <div class="leftvlue">
+      <div class="leftvlue-top">
+        <el-tabs v-model="topactiveName" @tab-click="tophandleClick">
+          <el-tab-pane name="Local">
+            <span class="mulsz" slot="label">澶嶆煡缁熻 </span>
+          </el-tab-pane>
+          <el-tab-pane name="sharing">
+            <span class="mulsz" slot="label">澶嶈瘖缁熻 </span>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+    </div>
+    <div class="viewbox">
+      <div class="title-bot">
+        <el-form
+          :model="queryParams"
+          ref="queryForm"
+          size="small"
+          :inline="true"
+          label-width="98px"
+        >
+          <el-form-item prop="userName">
+            <el-select
+              v-model="queryParams.value1"
+              placeholder="榛樿鎸夋湀浠芥殏鏃�"
+            >
+              <el-option
+                v-for="item in options"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="鎶曡瘔鎻愪氦鏃堕棿">
+            <el-date-picker
+              v-model="queryParams.dateRange"
+              style="width: 240px"
+              value-format="yyyy-MM-dd"
+              type="daterange"
+              range-separator="-"
+              start-placeholder="寮�濮嬫棩鏈�"
+              end-placeholder="缁撴潫鏃ユ湡"
+            ></el-date-picker>
+          </el-form-item>
+          <el-form-item label="绉戝锛�" prop="userName">
+            <el-select v-model="queryParams.value2" placeholder="璇烽�夋嫨">
+              <el-option
+                v-for="item in ksoptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="绠$悊鏂规锛�" prop="userName">
+            <el-select v-model="queryParams.value3" placeholder="璇烽�夋嫨">
+              <el-option
+                v-for="item in gloptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div class="viewhez">
+        <div
+          id="fucazCharts"
+          class="sontwoactiveNamecaz"
+          style="width: 800px; height: 800px"
+        ></div>
+        <div
+          id="fucabCharts"
+          class="sontwoactiveNamecab"
+          style="width: 1300px; height: 800px"
+        ></div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import Treeselect from "@riophae/vue-treeselect";
+import * as echarts from "echarts";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+export default {
+  name: "questionnaire",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      topactiveName: "Local", //椤堕儴閫夋嫨
+      fucazCharts: {},
+      fucabCharts: {},
+      queryParams: {},
+      options: [
+        {
+          value: 1,
+          label: "鎸夋湀浠�",
+        },
+        {
+          value: 2,
+          label: "鎸夊搴�",
+        },
+        {
+          value: 3,
+          label: "鎸夊勾",
+        },
+      ],
+      ksoptions: [
+        {
+          value: 1,
+          label: "楠ㄧ",
+        },
+        {
+          value: 2,
+          label: "蹇冭剰绉�",
+        },
+        {
+          value: 3,
+          label: "鍐呭垎娉岀",
+        },
+      ],
+      gloptions: [
+        {
+          value: 4,
+          label: "涓�鍙�",
+        },
+        {
+          value: 2,
+          label: "浜屽彿",
+        },
+        {
+          value: 3,
+          label: "涓夊彿",
+        },
+        {
+          value: 1,
+          label: "鏃�",
+        },
+      ],
+    };
+  },
+  watch: {},
+  created() {},
+  mounted() {
+    this.fucazCharts = document.getElementById("fucazCharts");
+    this.fucabCharts = document.getElementById("fucabCharts");
+
+    console.log(this.fucazCharts);
+    console.log(this.fucabCharts);
+
+    this.fucazChartsInit();
+    this.fucabChartsInit();
+  },
+
+  methods: {
+    // 楗煎浘
+    fucazChartsInit() {
+      var fucazCharts = echarts.init(this.fucazCharts);
+      console.log(fucazCharts);
+      var option = {
+        tooltip: {
+          trigger: "item",
+        },
+        legend: {
+          top: "5%",
+          left: "center",
+        },
+        series: [
+          {
+            name: "鍘熷洜褰掑睘",
+            type: "pie",
+            radius: ["40%", "70%"],
+            avoidLabelOverlap: false,
+            itemStyle: {
+              borderRadius: 10,
+              borderColor: "#fff",
+              borderWidth: 2,
+            },
+            label: {
+              show: false,
+              formatter(param) {
+                // correct the percentage
+                return param.name + " (" + param.percent * 2 + "%)";
+              },
+              position: "center",
+            },
+            emphasis: {
+              label: {
+                show: true,
+                fontSize: 40,
+                fontWeight: "bold",
+              },
+            },
+            labelLine: {
+              show: false,
+            },
+            data: [
+              { value: 1048, name: "涓嶉渶瑕佸璇�" },
+              { value: 735, name: "娌℃湁鎰忎箟" },
+              { value: 580, name: "涓嶇煡閬撴椂闂�" },
+              { value: 484, name: "缁忔祹鍘熷洜" },
+              { value: 300, name: "蹇樿澶嶈瘖" },
+              { value: 200, name: "涓嶆柟渚挎潵闄㈠璇�" },
+              { value: 200, name: "鍏朵粬鍖婚櫌澶嶈瘖" },
+              { value: 100, name: "鍏朵粬" },
+            ],
+          },
+        ],
+      };
+      // 浣跨敤鍒氭寚瀹氱殑閰嶇疆椤瑰拰鏁版嵁鏄剧ず鍥捐〃銆�
+      fucazCharts.setOption(option);
+    },
+    fucabChartsInit() {
+      var fucabCharts = echarts.init(this.fucabCharts);
+      console.log(fucabCharts);
+      var option = {
+        tooltip: {
+          trigger: "axis",
+          axisPointer: {
+            type: "cross",
+            crossStyle: {
+              color: "#999",
+            },
+          },
+        },
+        toolbox: {
+          feature: {
+            dataView: { show: true, readOnly: false },
+            magicType: { show: true, type: ["line", "bar"] },
+            restore: { show: true },
+            saveAsImage: { show: true },
+          },
+        },
+        legend: {
+          data: ["鏈璇婃暟", "鍙婃椂澶嶈瘖鏁�", "鍙婃椂澶嶈瘖鐜�"],
+        },
+        xAxis: [
+          {
+            type: "category",
+            data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
+            axisPointer: {
+              type: "shadow",
+            },
+          },
+        ],
+        yAxis: [
+          {
+            type: "value",
+            name: "浜烘暟",
+            min: 0,
+            max: 250,
+            interval: 50,
+            axisLabel: {
+              formatter: "{value} ",
+            },
+          },
+          {
+            type: "value",
+            name: "鐧惧垎姣�",
+            min: 0,
+            max: 25,
+            interval: 5,
+            axisLabel: {
+              formatter: "{value} %",
+            },
+          },
+        ],
+        series: [
+          {
+            name: "鏈璇婃暟",
+            type: "bar",
+            tooltip: {
+              valueFormatter: function (value) {
+                return value + " ";
+              },
+            },
+            data: [
+              47.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4,
+              3.3,
+            ],
+          },
+          {
+            name: "鍙婃椂澶嶈瘖鏁�",
+            type: "bar",
+            tooltip: {
+              valueFormatter: function (value) {
+                return value + " ";
+              },
+            },
+            data: [
+              66.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0,
+              2.3,
+            ],
+          },
+          {
+            name: "鍙婃椂澶嶈瘖鐜�",
+            type: "line",
+            yAxisIndex: 1,
+            tooltip: {
+              valueFormatter: function (value) {
+                return value + " %";
+              },
+            },
+            data: [
+              7.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2,
+            ],
+          },
+        ],
+      };
+      // 浣跨敤鍒氭寚瀹氱殑閰嶇疆椤瑰拰鏁版嵁鏄剧ず鍥捐〃銆�
+      fucabCharts.setOption(option);
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.Questionnairemanagement {
+}
+
+::v-deep.el-tabs--left,
+.el-tabs--right {
+  overflow: hidden;
+  align-items: center;
+  display: flex;
+}
+::v-deep.el-input--medium .el-input__inner {
+  height: 40px !important;
+}
+::v-deep.el-tabs--right .el-tabs__active-bar.is-right {
+  height: 40px;
+  width: 5px;
+  left: 0;
+}
+::v-deep.el-tabs--right .el-tabs__item.is-right {
+  display: block;
+  text-align: left;
+  font-size: 20px;
+}
+
+.leftvlue {
+  //   display: flex;
+  //   flex: 1;
+  margin-top: 20px;
+  //   margin: 20px;
+  padding: 30px;
+  background: #ffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .mulsz {
+    font-size: 20px;
+  }
+}
+.viewbox {
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  // height: 300px;
+  margin-top: 20px;
+  .title-bot {
+    padding: 20px;
+  }
+}
+.viewhez {
+  display: flex;
+  overflow: hidden;
+}
+</style>
diff --git a/src/views/sfstatistics/analyse/index.vue b/src/views/sfstatistics/analyse/index.vue
new file mode 100644
index 0000000..2313919
--- /dev/null
+++ b/src/views/sfstatistics/analyse/index.vue
@@ -0,0 +1,107 @@
+<template>
+  <div class="indexanalysis">
+    <div class="analysis-top">
+      <div class="title-top">鏌ヨ鏉′欢</div>
+      <div class="value">
+        <el-form ref="form" :model="form" label-width="120px">
+          <el-form-item label="閫夋嫨鎸囨爣绫诲瀷">
+            <el-select v-model="value" filterable placeholder="璇烽�夋嫨">
+              <el-option
+                v-for="item in options"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-form>
+      </div>
+    </div>
+    <div class="formindex">
+      <el-table :data="tableData" border style="width: 100%">
+        <el-table-column prop="date" label="鎸囨爣绫诲瀷"> </el-table-column>
+        <el-table-column prop="name" label="鎸囨爣鍚嶇О"> </el-table-column>
+        <el-table-column prop="address" label="鍑虹幇娆℃暟"> </el-table-column>
+        <el-table-column prop="times" label="鎸囨爣绫诲瀷鍑虹幇娆℃暟">
+        </el-table-column>
+        <el-table-column prop="proportion" label="鍗犳瘮"> </el-table-column>
+      </el-table>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "indexanalysis",
+  data() {
+    return {
+      options: [
+        {
+          value: "閫夐」1",
+          label: "鍙戠儹鏈夋棤",
+        },
+        {
+          value: "閫夐」2",
+          label: "鍜冲椊鏈夋棤",
+        },
+        {
+          value: "閫夐」3",
+          label: "鏈嶈嵂鍚庝笉鑹弽搴�",
+        },
+      ],
+      tableData: [
+        {
+          date: "鍙戠儹鏈夋棤",
+          name: "鏈�",
+          address: 1,
+          times: 2,
+          proportion: "50%",
+        },
+        {
+          date: "鍙戠儹鏈夋棤",
+          name: "鏃�",
+          address: 1,
+          times: 2,
+          proportion: "50%",
+        },
+        {
+          date: "鍙戠儹鏈夋棤",
+          name: "鍏朵粬",
+          address: 0,
+          times: 2,
+          proportion: "0%",
+        },
+      ],
+    };
+  },
+
+  created() {},
+
+  methods: {},
+};
+</script>
+
+<style lang="scss" scoped>
+.analysis-top {
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  margin: 15px;
+  .title-top {
+    background-color: #00bbd3;
+    color: #fff;
+    padding: 10px 20px;
+    font-size: 20px;
+    font-weight: 500;
+    margin-bottom: 20px;
+  }
+}
+.formindex {
+  margin: 0 15px;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  padding: 20px;
+}
+</style>
diff --git a/src/views/sfstatistics/percentage/index.vue b/src/views/sfstatistics/percentage/index.vue
new file mode 100644
index 0000000..14a3057
--- /dev/null
+++ b/src/views/sfstatistics/percentage/index.vue
@@ -0,0 +1,884 @@
+<template>
+  <div class="Questionnairemanagement">
+    <!-- 宸︿晶鏍� -->
+    <div class="sidecolumn">
+      <div class="sidecolumn-top">
+        <div class="top-wj">鎮h�呮潵婧�</div>
+      </div>
+
+      <div class="bottom-fl">
+        <el-tabs
+          tab-position="right"
+          v-model="activeName"
+          @tab-click="handleClick"
+        >
+          <el-tab-pane label="鍏ㄩ儴" name="first"></el-tab-pane>
+          <el-tab-pane label="浣忛櫌" name="bhospitalized"></el-tab-pane>
+          <el-tab-pane label="鍦ㄩ櫌" name="Inhospital"></el-tab-pane>
+          <el-tab-pane label="闂ㄨ瘖" name="outpatient"></el-tab-pane>
+          <el-tab-pane label="浣撴" name="physical"></el-tab-pane>
+        </el-tabs>
+      </div>
+    </div>
+    <!-- 鍙充晶鏁版嵁 -->
+    <div class="leftvlue">
+      <div class="leftvlue-top">
+        <el-tabs v-model="topactiveName" @tab-click="tophandleClick">
+          <el-tab-pane name="Local">
+            <span class="mulsz" slot="label">鎸夊嚭闄㈢梾鍖虹粺璁� </span>
+          </el-tab-pane>
+          <el-tab-pane name="sharing">
+            <span class="mulsz" slot="label">鎸夊嚭闄㈢瀹ょ粺璁� </span>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+      <div class="leftvlue-bg">
+        <el-row :gutter="20">
+          <!--鏍囩鏁版嵁-->
+          <el-col :span="24" :xs="24">
+            <el-form
+              :model="queryParams"
+              ref="queryForm"
+              size="small"
+              :inline="true"
+              v-show="showSearch"
+              label-width="98px"
+            >
+              <el-form-item label="鍖婚櫌" prop="userName">
+                <el-select v-model="queryParams.value1" placeholder="璇烽�夋嫨">
+                  <el-option
+                    v-for="item in options"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="鍑洪櫌鐥呭尯" prop="userName">
+                <el-select v-model="queryParams.value2" placeholder="璇烽�夋嫨">
+                  <el-option
+                    v-for="item in options"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="绠$悊鏂规" prop="userName">
+                <el-select v-model="queryParams.value3" placeholder="璇烽�夋嫨">
+                  <el-option
+                    v-for="item in options"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="鍑洪櫌鏃ユ湡" prop="userName">
+                <el-date-picker
+                  v-model="queryParams.valuetime1"
+                  align="right"
+                  type="date"
+                  placeholder="閫夋嫨鏃ユ湡"
+                  :picker-options="pickerOptionsa"
+                >
+                </el-date-picker>
+              </el-form-item>
+              <el-form-item label="璁″垝闅忚鏃ユ湡" prop="userName">
+                <el-date-picker
+                  v-model="queryParams.valuetime2"
+                  align="right"
+                  type="date"
+                  placeholder="閫夋嫨鏃ユ湡"
+                  :picker-options="pickerOptions"
+                >
+                </el-date-picker>
+              </el-form-item>
+
+              <el-form-item>
+                <el-button
+                  type="primary"
+                  icon="el-icon-search"
+                  size="medium"
+                  @click="handleQuery"
+                  >鎼滅储</el-button
+                >
+                <el-button
+                  icon="el-icon-refresh"
+                  size="medium"
+                  @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="medium"
+                  @click="addladeltag"
+                  v-hasPermi="['system:user:add']"
+                  >鏂板</el-button
+                >
+              </el-col>
+
+              <el-col :span="1.5">
+                <el-button
+                  type="danger"
+                  plain
+                  icon="el-icon-delete"
+                  size="medium"
+                  :disabled="multiple"
+                  @click="handleDelete"
+                  v-hasPermi="['system:user:remove']"
+                  >鍒犻櫎</el-button
+                >
+              </el-col>
+              <el-col :span="1.5">
+                <div class="documentf">
+                  <div class="document">
+                    <el-button
+                      type="warning"
+                      plain
+                      icon="el-icon-download"
+                      size="medium"
+                      @click="handleExport"
+                      v-hasPermi="['system:user:export']"
+                      >瀵煎嚭</el-button
+                    >
+                  </div>
+                </div>
+              </el-col>
+
+              <!-- <el-col :span="1.5"> </el-col> -->
+            </el-row>
+            <!-- <right-toolbar
+          :showSearch.sync="showSearch"
+          @queryTable="getList"
+          :columns="columns"
+        ></right-toolbar> -->
+            <el-table
+              v-loading="loading"
+              :data="userList"
+              :border="true"
+              @selection-change="handleSelectionChange"
+            >
+              <el-table-column type="selection" width="50" align="center" />
+              <el-table-column
+                fixed
+                label="搴忓彿"
+                align="center"
+                key="tagid"
+                prop="tagid"
+                width="50"
+              />
+              <el-table-column
+                fixed
+                label="鍑洪櫌鐥呭尯"
+                align="center"
+                key="tagname"
+                prop="tagname"
+                width="100"
+                :show-overflow-tooltip="true"
+              />
+              <el-table-column
+                label="搴旈殢璁挎暟"
+                align="center"
+                key="updateTime"
+                prop="updateTime"
+              >
+                <template slot-scope="scope">
+                  <span
+                    >{{ scope.row.updateBy }}
+                    <p>{{ scope.row.updateTime }}</p></span
+                  >
+                </template>
+              </el-table-column>
+
+              <el-table-column
+                label="闅忚瀹屾垚鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+              <el-table-column
+                label="闅忚瀹屾垚鐜�"
+                align="center"
+                key="isupload"
+                prop="isupload"
+              >
+              </el-table-column>
+              <el-table-column
+                label="AI澶栧懠娆℃暟"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+              <el-table-column
+                label="AI闅忚瀹屾垚鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+              <el-table-column
+                label="AI闅忚瀹屾垚鐜�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+              <el-table-column
+                label="寰俊鍙戦�佹鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+              <el-table-column
+                label="寰俊闅忚瀹屾垚鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+              <el-table-column
+                label="寰俊闅忚瀹屾垚鐜�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+              <el-table-column
+                label="鐭俊鍙戦�佹鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+              <el-table-column
+                label="鐭俊闅忚瀹屾垚鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+              <el-table-column
+                label="鐭俊闅忚瀹屾垚鐜�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+              <el-table-column
+                label="浜哄伐闅忚娆℃暟"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+              <el-table-column
+                label="浜哄伐闅忚瀹屾垚鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+              <el-table-column
+                label="浜哄伐闅忚瀹屾垚鐜�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+              <el-table-column
+                label="澶辫鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+              <el-table-column
+                label="澶辫鐜�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+              <el-table-column
+                label="澶辫鐜�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+              <el-table-column
+                label="寮傚父鎬绘暟"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+              <el-table-column
+                label="鎬诲紓甯哥巼"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+              <el-table-column
+                label="鍥炲寮傚父鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+              <el-table-column
+                label="鍥炲寮傚父鍙婃椂澶勭悊鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+              <el-table-column
+                label="鍥炲寮傚父鍙婃椂澶勭悊鐜�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+              >
+              </el-table-column>
+
+              <!-- <el-table-column
+                label="鎿嶄綔"
+                align="center"
+                width="300"
+                class-name="small-padding fixed-width"
+              >
+                <template slot-scope="scope">
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="handleUpdate(scope.row)"
+                    v-hasPermi="['system:user:edit']"
+                    ><span class="button-textxg"
+                      ><i class="el-icon-edit"></i>淇敼</span
+                    ></el-button
+                  >
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="handleDelete(scope.row)"
+                    v-hasPermi="['system:user:remove']"
+                    ><span class="button-textsc"
+                      ><i class="el-icon-delete"></i>鍒犻櫎</span
+                    ></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-col>
+        </el-row>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import {
+  toamendtag,
+  addapitag,
+  detailstag,
+  deletetag,
+  changetagcategory,
+  toamendtagcategory,
+  addtagcategory,
+  deletetagcategory,
+  listtag,
+  tagclassifylist,
+} from "@/api/system/label";
+
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+export default {
+  name: "questionnaire",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      topactiveName: "Local", //椤堕儴閫夋嫨
+      activeName: "first", //渚ц竟閫夋嫨
+      // 閬僵灞�
+      loading: false,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      idds: "", //鍒嗙被id
+      // 鎬绘潯鏁�
+      total: 0,
+      amendtag: false, //鏄惁淇敼绫诲埆
+      lstamendtag: false, //鏄惁淇敼鏍囩
+      scavisible: false, //鍒犻櫎寮规
+      deleteVisible: false, //鍒嗙被鍒犻櫎寮规
+      deletefenl: "楂樿鍘�", //鍒犻櫎椤�
+      //淇敼娣诲姞鏍囩寮规鏁版嵁
+      tagform: {
+        isupload: "",
+        tagname: "",
+        tagcategoryid: "",
+        tagdescription: "",
+      },
+      classifyform: {
+        categoryname: "",
+      },
+      // 鏍囩琛ㄦ牸鏁版嵁
+      userList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      // 瑙掕壊閫夐」
+      roleOptions: [],
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      forms: {
+        name: "",
+      },
+      numberlb: 22,
+      dialogFormVisible: false, //娣诲姞銆佷慨鏀圭被鍒脊妗�
+      lstamendtagVisible: false, //娣诲姞銆佷慨鏀规爣绛惧脊妗�
+      goQRCodeVisible: false, //浜岀淮鐮佸脊妗�
+      sidecolumnval: "", //绫诲埆鎼滅储
+      propss: { multiple: true },
+      topqueryParams: {}, //瀵煎嚭绛涢�夋潯浠�
+      options: [
+        {
+          value: 1,
+          label: "涓滃崡",
+        },
+        {
+          value: 2,
+          label: "瑗垮寳",
+        },
+        {
+          value: 3,
+          label: "浠ㄤ花浠�",
+        },
+        {
+          value: 4,
+          label: "鍏椋掗",
+        },
+      ],
+      pickerOptions: {
+        disabledDate(time) {
+          return time.getTime() < Date.now() - 3600 * 1000 * 24;
+        },
+        shortcuts: [
+          {
+            text: "浠婂ぉ",
+            onClick(picker) {
+              picker.$emit("pick", new Date());
+            },
+          },
+          {
+            text: "鏄ㄥぉ",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24);
+              picker.$emit("pick", date);
+            },
+          },
+          {
+            text: "涓�鍛ㄥ墠",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit("pick", date);
+            },
+          },
+        ],
+      },
+      pickerOptionsa: {
+        disabledDate(time) {
+          return time.getTime() > Date.now();
+        },
+        shortcuts: [
+          {
+            text: "浠婂ぉ",
+            onClick(picker) {
+              picker.$emit("pick", new Date());
+            },
+          },
+          {
+            text: "鏄ㄥぉ",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24);
+              picker.$emit("pick", date);
+            },
+          },
+          {
+            text: "涓�鍛ㄥ墠",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit("pick", date);
+            },
+          },
+        ],
+      },
+      // 鏌ヨ鏍囩鍒楄〃鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        tagname: undefined,
+        tagdescription: undefined,
+      },
+      // 鍒椾俊鎭�
+      columns: [
+        { key: 0, label: `鏍囩缂栧彿`, visible: true },
+        { key: 1, label: `鏍囩鍚嶇О`, visible: true },
+        { key: 2, label: `鏍囩鏄电О`, visible: true },
+        { key: 3, label: `閮ㄩ棬`, visible: true },
+        { key: 4, label: `鎵嬫満鍙风爜`, visible: true },
+        { key: 5, label: `鐘舵�乣, visible: true },
+        { key: 6, label: `鍒涘缓鏃堕棿`, visible: true },
+      ],
+      // 琛ㄥ崟鏍¢獙
+      // rules: {
+      //   userName: [
+      //     { required: true, message: "鏍囩鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+      //     {
+      //       min: 2,
+      //       max: 20,
+      //       message: "鏍囩鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+      //       trigger: "blur",
+      //     },
+      //   ],
+      //   nickName: [
+      //     { required: true, message: "鏍囩鏄电О涓嶈兘涓虹┖", trigger: "blur" },
+      //   ],
+      //   password: [
+      //     { required: true, message: "鏍囩瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+      //     {
+      //       min: 5,
+      //       max: 20,
+      //       message: "鏍囩瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+      //       trigger: "blur",
+      //     },
+      //   ],
+      //   email: [
+      //     {
+      //       type: "email",
+      //       message: "璇疯緭鍏ユ纭殑閭鍦板潃",
+      //       trigger: ["blur", "change"],
+      //     },
+      //   ],
+      //   phonenumber: [
+      //     {
+      //       pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+      //       message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+      //       trigger: "blur",
+      //     },
+      //   ],
+      //   IDnumber: [
+      //     {
+      //       pattern:
+      //         /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/,
+      //       message: "璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�",
+      //       trigger: "blur",
+      //     },
+      //   ],
+      // },
+    };
+  },
+  watch: {},
+  created() {
+    this.getList();
+    this.gitclasify();
+  },
+
+  methods: {
+    /** 鏌ヨ鏍囩鍒楄〃 */
+    getList() {
+      listtag(this.addDateRange(this.queryParams)).then((response) => {
+        console.log(response);
+        this.total = response.total;
+        this.userList = response.rows;
+      });
+    },
+    /** 淇敼鏍囩 */
+    handleUpdate(row) {
+      console.log(row, "淇敼鏍囩");
+      this.lstamendtagVisible = true;
+      this.lstamendtag = true;
+      this.tagform = {
+        isupload: row.isupload,
+        tagname: row.tagname,
+        tagcategoryid: row.tagcategoryid,
+        tagdescription: row.tagdescription,
+        tagid: row.tagid,
+      };
+    },
+    addladeltag() {
+      this.lstamendtagVisible = true;
+      this.lstamendtag = false;
+      this.tagform = {
+        isupload: "",
+        tagname: "",
+        tagcategoryid: "",
+        tagdescription: "",
+        tagid: "",
+      };
+    },
+    // 娣诲姞/淇敼鏍囩
+    Maintenancetag() {
+      if (this.lstamendtag) {
+        toamendtag(this.addDateRange(this.tagform)).then((response) => {
+          console.log(response);
+          this.getList();
+        });
+      } else {
+        addapitag(this.addDateRange(this.tagform)).then((response) => {
+          console.log(response);
+          this.getList();
+        });
+      }
+      this.tagform = {
+        isupload: "",
+        tagname: "",
+        tagcategoryid: "",
+        tagdescription: "",
+        tagid: "",
+      };
+    },
+
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+      };
+      this.resetForm("form");
+    },
+    // 鏍囩鐘舵�佷慨鏀�
+    handleStatusChange(row) {
+      console.log(row.isupload);
+      let text = row.isupload === "0" ? "鍚敤" : "鍋滅敤";
+      this.$modal
+        .confirm('纭瑕�"' + text + '""' + row.tagname + '"鏍囩鍚楋紵')
+        .then(function () {
+          return changetagcategory(row.tagid, row.isupload);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "鎴愬姛");
+        })
+        .catch(function () {
+          row.isupload = row.isupload === "0" ? "1" : "0";
+        });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams.tagname = "";
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.tagid);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      console.log(row, "鍒犻櫎寮圭獥");
+      const tagids = row.tagid || this.ids;
+      console.log(tagids);
+      const tagname = row.tagname;
+      this.$modal
+        .confirm(
+          tagname
+            ? '鏄惁纭鍒犻櫎鏍囩鍚嶇О涓�"' + tagname + '"鐨勬暟鎹」锛�'
+            : "鏄惁纭鍒犻櫎閫変腑鐨勬暟鎹」锛�"
+        )
+        .then(function () {
+          return deletetag(tagids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download(
+        "base/tag/export",
+        {
+          ...this.topqueryParams,
+        },
+        `user_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.Questionnairemanagement {
+  display: flex;
+}
+.sidecolumn {
+  width: 180px;
+  min-height: 100vh;
+  text-align: center;
+  //   display: flex;
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .sidecolumn-top {
+    display: flex;
+    justify-content: space-between;
+    .top-wj {
+      font-size: 20px;
+    }
+    .top-tj {
+      font-size: 18px;
+
+      color: rgb(0, 89, 255);
+      cursor: pointer;
+    }
+  }
+  .center-ss {
+    margin-top: 30px;
+    .input-with-select {
+      height: 40px !important;
+    }
+  }
+  .bottom-fl {
+    margin-top: 30px;
+    display: center !important;
+  }
+}
+.qrcode-dialo {
+  text-align: center;
+  //   display: flex;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .qrcode-text {
+    font-size: 20px;
+    span {
+      margin-left: 20px;
+    }
+  }
+  .qrcode-img {
+    width: 300px;
+    height: 400px;
+  }
+}
+::v-deep.el-tabs--left,
+.el-tabs--right {
+  overflow: hidden;
+  align-items: center;
+  display: flex;
+}
+::v-deep.el-input--medium .el-input__inner {
+  height: 40px !important;
+}
+::v-deep.el-tabs--right .el-tabs__active-bar.is-right {
+  height: 40px;
+  width: 5px;
+  left: 0;
+}
+::v-deep.el-tabs--right .el-tabs__item.is-right {
+  display: block;
+  text-align: left;
+  font-size: 20px;
+}
+
+.leftvlue {
+  //   display: flex;
+  //   flex: 1;
+  width: 80%;
+  margin-top: 20px;
+  //   margin: 20px;
+  padding: 30px;
+  background: #ffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .mulsz {
+    font-size: 20px;
+  }
+}
+.document {
+  width: 100px;
+  height: 50px;
+}
+.documentf {
+  display: flex;
+  justify-content: flex-end;
+}
+.button-text {
+  color: rgb(70, 204, 238);
+}
+.button-textck {
+  color: rgb(39, 167, 67);
+}
+.button-textxg {
+  color: rgb(35, 81, 233);
+}
+.button-textsc {
+  color: rgb(235, 23, 23);
+}
+</style>
diff --git a/src/views/sfstatistics/propaganda/index.vue b/src/views/sfstatistics/propaganda/index.vue
new file mode 100644
index 0000000..6d5b549
--- /dev/null
+++ b/src/views/sfstatistics/propaganda/index.vue
@@ -0,0 +1,951 @@
+<template>
+  <div class="Questionnairemanagement">
+    <!-- 宸︿晶鏍� -->
+    <div class="sidecolumn">
+      <div class="sidecolumn-top">
+        <div class="top-wj">鎮h�呮潵婧�</div>
+      </div>
+
+      <div class="bottom-fl">
+        <el-tabs
+          tab-position="right"
+          v-model="activeName"
+          @tab-click="handleClick"
+        >
+          <el-tab-pane label="鍏ㄩ儴" name="first"></el-tab-pane>
+          <el-tab-pane label="浣忛櫌" name="bhospitalized"></el-tab-pane>
+          <el-tab-pane label="鍦ㄩ櫌" name="Inhospital"></el-tab-pane>
+          <el-tab-pane label="闂ㄨ瘖" name="outpatient"></el-tab-pane>
+          <el-tab-pane label="浣撴" name="physical"></el-tab-pane>
+        </el-tabs>
+      </div>
+    </div>
+    <!-- 鍙充晶鏁版嵁 -->
+    <div class="leftvlue">
+      <div class="leftvlue-top">
+        <el-tabs v-model="topactiveName" @tab-click="tophandleClick">
+          <el-tab-pane name="Local">
+            <span class="mulsz" slot="label">鎸夊嚭闄㈢梾鍖虹粺璁� </span>
+          </el-tab-pane>
+          <el-tab-pane name="sharing">
+            <span class="mulsz" slot="label">鎸夊嚭闄㈢瀹ょ粺璁� </span>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+      <div class="leftvlue-bg">
+        <el-row :gutter="20">
+          <!--鏍囩鏁版嵁-->
+          <el-col :span="24" :xs="24">
+            <el-form
+              :model="queryParams"
+              ref="queryForm"
+              size="small"
+              :inline="true"
+              v-show="showSearch"
+              label-width="98px"
+            >
+              <el-form-item label="鍖婚櫌" prop="userName">
+                <el-select
+                  v-model="queryParams.value1"
+                  placeholder="榛樿鏄璐﹀彿鎵�灞炲尰闄�"
+                >
+                  <el-option
+                    v-for="item in options"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="鍑洪櫌鐥呭尯" prop="userName">
+                <el-select v-model="queryParams.value2" placeholder="璇烽�夋嫨">
+                  <el-option
+                    v-for="item in options"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="绠$悊鏂规" prop="userName">
+                <el-select v-model="queryParams.value3" placeholder="璇烽�夋嫨">
+                  <el-option
+                    v-for="item in options"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="鍑洪櫌鏃ユ湡" prop="userName">
+                <el-date-picker
+                  v-model="queryParams.valuetime1"
+                  align="right"
+                  type="date"
+                  placeholder="閫夋嫨鏃ユ湡"
+                  :picker-options="pickerOptionsa"
+                >
+                </el-date-picker>
+              </el-form-item>
+              <el-form-item label="璁″垝鎵ц鏃ユ湡" prop="userName">
+                <el-date-picker
+                  v-model="queryParams.valuetime2"
+                  align="right"
+                  type="date"
+                  placeholder="閫夋嫨鏃ユ湡"
+                  :picker-options="pickerOptions"
+                >
+                </el-date-picker>
+              </el-form-item>
+              <el-form-item label="瀹為檯瀹屾垚鏃ユ湡" prop="userName">
+                <el-date-picker
+                  v-model="queryParams.valuetime2"
+                  align="right"
+                  type="date"
+                  placeholder="閫夋嫨鏃ユ湡"
+                  :picker-options="pickerOptions"
+                >
+                </el-date-picker>
+              </el-form-item>
+
+              <el-form-item>
+                <el-button
+                  type="primary"
+                  icon="el-icon-search"
+                  size="medium"
+                  @click="handleQuery"
+                  >鎼滅储</el-button
+                >
+                <el-button
+                  icon="el-icon-refresh"
+                  size="medium"
+                  @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="medium"
+                  @click="addladeltag"
+                  v-hasPermi="['system:user:add']"
+                  >鏂板</el-button
+                >
+              </el-col>
+
+              <el-col :span="1.5">
+                <el-button
+                  type="danger"
+                  plain
+                  icon="el-icon-delete"
+                  size="medium"
+                  :disabled="multiple"
+                  @click="handleDelete"
+                  v-hasPermi="['system:user:remove']"
+                  >鍒犻櫎</el-button
+                >
+              </el-col>
+              <el-col :span="1.5">
+                <div class="documentf">
+                  <div class="document">
+                    <el-button
+                      type="warning"
+                      plain
+                      icon="el-icon-download"
+                      size="medium"
+                      @click="handleExport"
+                      v-hasPermi="['system:user:export']"
+                      >瀵煎嚭</el-button
+                    >
+                  </div>
+                </div>
+              </el-col>
+
+              <!-- <el-col :span="1.5"> </el-col> -->
+            </el-row>
+            <!-- <right-toolbar
+          :showSearch.sync="showSearch"
+          @queryTable="getList"
+          :columns="columns"
+        ></right-toolbar> -->
+            <el-table
+              v-loading="loading"
+              :data="userList"
+              :border="true"
+              @selection-change="handleSelectionChange"
+            >
+              <el-table-column type="selection" width="50" align="center" />
+              <el-table-column
+                fixed
+                label="搴忓彿"
+                align="center"
+                key="tagid"
+                prop="tagid"
+                width="50"
+              />
+              <el-table-column
+                fixed
+                label="鍑洪櫌鐥呭尯"
+                align="center"
+                key="tagname"
+                prop="tagname"
+                width="100"
+                :show-overflow-tooltip="true"
+              />
+              <el-table-column
+                label="瀹f暀"
+                align="center"
+                key="updateTime"
+                prop="updateTime"
+              >
+              </el-table-column>
+
+              <el-table-column
+                label="瀹f暀鏇存柊鏃ユ湡"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="110"
+              >
+              </el-table-column>
+              <el-table-column
+                label="绠$悊鏂规"
+                align="center"
+                key="isupload"
+                prop="isupload"
+              >
+              </el-table-column>
+              <el-table-column
+                label="闅忚浠诲姟鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="100"
+              >
+              </el-table-column>
+              <el-table-column
+                label="闅忚瀹屾垚鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="100"
+              >
+              </el-table-column>
+              <el-table-column
+                label="闅忚瀹屾垚鐜�"
+                align="center"
+                key="isupload"
+                prop="isupload"
+                width="100"
+              >
+              </el-table-column>
+              <el-table-column
+                label="AI澶栧懠娆℃暟"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="100"
+              >
+              </el-table-column>
+              <el-table-column
+                label="AI闅忚瀹屾垚鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="120"
+              >
+              </el-table-column>
+              <el-table-column
+                label="AI闅忚瀹屾垚鐜�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="120"
+              >
+              </el-table-column>
+              <el-table-column
+                label="寰俊鍙戦�佹鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="100"
+              >
+              </el-table-column>
+              <el-table-column
+                label="寰俊闅忚瀹屾垚鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="120"
+              >
+              </el-table-column>
+              <el-table-column
+                label="寰俊闅忚瀹屾垚鐜�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="120"
+              >
+              </el-table-column>
+              <el-table-column
+                label="鐭俊鍙戦�佹鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="100"
+              >
+              </el-table-column>
+              <el-table-column
+                label="鐭俊闅忚瀹屾垚鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="120"
+              >
+              </el-table-column>
+              <el-table-column
+                label="鐭俊闅忚瀹屾垚鐜�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="120"
+              >
+              </el-table-column>
+              <el-table-column
+                label="浜哄伐闅忚娆℃暟"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="100"
+              >
+              </el-table-column>
+              <el-table-column
+                label="浜哄伐闅忚瀹屾垚鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="120"
+              >
+              </el-table-column>
+              <el-table-column
+                label="浜哄伐闅忚瀹屾垚鐜�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="120"
+              >
+              </el-table-column>
+
+              <el-table-column
+                label="鎿嶄綔"
+                align="center"
+                width="300"
+                class-name="small-padding fixed-width"
+              >
+                <template slot-scope="scope">
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="handleUpdate(scope.row)"
+                    v-hasPermi="['system:user:edit']"
+                    ><span class="button-textxg"
+                      ><i class="el-icon-s-data"></i>鍗曢缁熻</span
+                    ></el-button
+                  >
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="handleDelete(scope.row)"
+                    v-hasPermi="['system:user:remove']"
+                    ><span class="button-textsc"
+                      ><i class="el-icon-share"></i>闅忚缁撴灉鏄庣粏</span
+                    ></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-col>
+        </el-row>
+      </div>
+    </div>
+    <!-- 鍗曢灞曠ず寮规 -->
+    <el-dialog :visible.sync="topicVisible" width="45%">
+      <div class="topicdia">
+        <div class="top-text">{{ topicvalue.name }}</div>
+        <div class="top-mintext">闅忚瀹屾垚鏁皗{ topicvalue.number }}</div>
+        <div style="overflow-x: hidden; overflow-y: auto; max-height: 65vh">
+          <div class="ttaabbcc" v-for="item in topiclist" :key="item.name">
+            <div class="describe">
+              绗瑊{ item.number }}棰橈細 {{ item.name }}?<span
+                >[{{ item.type == 1 ? "鍗曢�夐" : "澶氶�夐" }}]</span
+              >
+            </div>
+            <div>
+              <el-table :data="tableData" style="width: 100%">
+                <el-table-column prop="date" label="闂閫夐」">
+                </el-table-column>
+                <el-table-column prop="name" label="閫夋嫨浜烘暟">
+                </el-table-column>
+                <el-table-column prop="address" label="姣斾緥"> </el-table-column>
+              </el-table>
+            </div>
+          </div>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="topicVisible = false">鍏� 闂�</el-button>
+      </span>
+    </el-dialog>
+    <!-- 缁撴灉缁熻寮规 -->
+    <el-dialog title="鎻愮ず" :visible.sync="consequenceVisible" width="50%">
+      <div class="topicdia">
+        <div class="top-text" style="margin-bottom: 20px">瀹f暀缁熻缁撴灉</div>
+        <div>
+          <el-table :data="tableData" style="width: 100%">
+            <el-table-column prop="date" label="鎮h�呭鍚�"> </el-table-column>
+            <el-table-column prop="namea" label="鎬у埆"> </el-table-column>
+            <el-table-column prop="namec" label="骞撮緞"> </el-table-column>
+            <el-table-column prop="named" label="鑱旂郴鏂瑰紡"> </el-table-column>
+            <el-table-column prop="namee" label="璁″垝鎵ц鏃堕棿" width="120">
+            </el-table-column>
+            <el-table-column prop="namex" label="瀹為檯瀹屾垚鏃堕棿" width="120">
+            </el-table-column>
+            <el-table-column prop="namez" label="瀹屾垚鏂瑰紡"> </el-table-column>
+            <el-table-column prop="nameh" label="瀹f暀"> </el-table-column>
+            <el-table-column prop="namej" label="寰楀垎"> </el-table-column>
+            <!-- 鎴彇鍑犲垪閫夐」灞炴�у悕缁存姢鏁扮粍閬嶅巻 -->
+            <!-- <el-table-column prop="namet">
+              <template slot="header" slot-scope="scope">
+                <div>{{ scope.row.name }}<span>[鍗曢�夐]</span></div>
+              </template>
+            </el-table-column> -->
+          </el-table>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="consequenceVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="consequenceVisible = false"
+          >纭� 瀹�</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  toamendtag,
+  addapitag,
+  deletetag,
+  changetagcategory,
+  listtag,
+} from "@/api/system/label";
+
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+export default {
+  name: "questionnaire",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      topactiveName: "Local", //椤堕儴閫夋嫨
+      activeName: "first",
+      // 閬僵灞�
+      loading: false,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      idds: "", //鍒嗙被id
+      // 鎬绘潯鏁�
+      total: 0,
+      lstamendtag: false, //鏄惁淇敼鏍囩
+      topicVisible: false, //鎺у埗鍗曢寮规
+      consequenceVisible: false, //鎺у埗缁撴灉寮规
+      //淇敼娣诲姞鏍囩寮规鏁版嵁
+      tagform: {
+        isupload: "",
+        tagname: "",
+        tagcategoryid: "",
+        tagdescription: "",
+      },
+      topicvalue: {
+        name: "楠ㄧ闅忚妯$増",
+        number: 222,
+      },
+      classifyform: {
+        categoryname: "",
+      },
+      topiclist: [
+        {
+          name: "鎮ㄧ殑韬綋搴峰鎯呭喌濡備綍",
+          number: 1,
+          type: 1,
+        },
+        {
+          name: "鎮ㄧ殑楗鎯呭喌濡備綍",
+          number: 2,
+          type: 2,
+        },
+        {
+          name: "鎮ㄧ殑鎭㈠鎯呭喌濡備綍",
+          number: 3,
+          type: 1,
+        },
+      ],
+      tableData: [
+        {
+          date: "濂�",
+          name: 12,
+          address: "50%",
+        },
+        {
+          date: "涓�鑸�",
+          name: 2,
+          address: "6.2%",
+        },
+        {
+          date: "宸�",
+          name: 0,
+          address: "0%",
+        },
+      ],
+      // 鏍囩琛ㄦ牸鏁版嵁
+      userList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      // 瑙掕壊閫夐」
+      roleOptions: [],
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      forms: {
+        name: "",
+      },
+      numberlb: 22,
+      dialogFormVisible: false, //娣诲姞銆佷慨鏀圭被鍒脊妗�
+      lstamendtagVisible: false, //娣诲姞銆佷慨鏀规爣绛惧脊妗�
+      goQRCodeVisible: false, //浜岀淮鐮佸脊妗�
+      sidecolumnval: "", //绫诲埆鎼滅储
+      propss: { multiple: true },
+      topqueryParams: {}, //瀵煎嚭绛涢�夋潯浠�
+      options: [
+        {
+          value: 1,
+          label: "涓滃崡",
+        },
+        {
+          value: 2,
+          label: "瑗垮寳",
+        },
+        {
+          value: 3,
+          label: "浠ㄤ花浠�",
+        },
+        {
+          value: 4,
+          label: "鍏椋掗",
+        },
+      ],
+      pickerOptions: {
+        disabledDate(time) {
+          return time.getTime() < Date.now() - 3600 * 1000 * 24;
+        },
+        shortcuts: [
+          {
+            text: "浠婂ぉ",
+            onClick(picker) {
+              picker.$emit("pick", new Date());
+            },
+          },
+          {
+            text: "鏄ㄥぉ",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24);
+              picker.$emit("pick", date);
+            },
+          },
+          {
+            text: "涓�鍛ㄥ墠",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit("pick", date);
+            },
+          },
+        ],
+      },
+      pickerOptionsa: {
+        disabledDate(time) {
+          return time.getTime() > Date.now();
+        },
+        shortcuts: [
+          {
+            text: "浠婂ぉ",
+            onClick(picker) {
+              picker.$emit("pick", new Date());
+            },
+          },
+          {
+            text: "鏄ㄥぉ",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24);
+              picker.$emit("pick", date);
+            },
+          },
+          {
+            text: "涓�鍛ㄥ墠",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit("pick", date);
+            },
+          },
+        ],
+      },
+      // 鏌ヨ鏍囩鍒楄〃鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        tagname: undefined,
+        tagdescription: undefined,
+      },
+      // 鍒椾俊鎭�
+      columns: [
+        { key: 0, label: `鏍囩缂栧彿`, visible: true },
+        { key: 1, label: `鏍囩鍚嶇О`, visible: true },
+        { key: 2, label: `鏍囩鏄电О`, visible: true },
+        { key: 3, label: `閮ㄩ棬`, visible: true },
+        { key: 4, label: `鎵嬫満鍙风爜`, visible: true },
+        { key: 5, label: `鐘舵�乣, visible: true },
+        { key: 6, label: `鍒涘缓鏃堕棿`, visible: true },
+      ],
+      // 琛ㄥ崟鏍¢獙
+      // rules: {
+      //   userName: [
+      //     { required: true, message: "鏍囩鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+      //     {
+      //       min: 2,
+      //       max: 20,
+      //       message: "鏍囩鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+      //       trigger: "blur",
+      //     },
+      //   ],
+      //   nickName: [
+      //     { required: true, message: "鏍囩鏄电О涓嶈兘涓虹┖", trigger: "blur" },
+      //   ],
+      //   password: [
+      //     { required: true, message: "鏍囩瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+      //     {
+      //       min: 5,
+      //       max: 20,
+      //       message: "鏍囩瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+      //       trigger: "blur",
+      //     },
+      //   ],
+      //   email: [
+      //     {
+      //       type: "email",
+      //       message: "璇疯緭鍏ユ纭殑閭鍦板潃",
+      //       trigger: ["blur", "change"],
+      //     },
+      //   ],
+      //   phonenumber: [
+      //     {
+      //       pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+      //       message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+      //       trigger: "blur",
+      //     },
+      //   ],
+      //   IDnumber: [
+      //     {
+      //       pattern:
+      //         /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/,
+      //       message: "璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�",
+      //       trigger: "blur",
+      //     },
+      //   ],
+      // },
+    };
+  },
+  watch: {},
+  created() {
+    this.getList();
+    this.gitclasify();
+  },
+
+  methods: {
+    /** 鏌ヨ鏍囩鍒楄〃 */
+    getList() {
+      listtag(this.addDateRange(this.queryParams)).then((response) => {
+        console.log(response);
+        this.total = response.total;
+        this.userList = response.rows;
+      });
+    },
+    /** 淇敼鏍囩 */
+    handleUpdate(row) {
+      console.log(row, "淇敼鏍囩");
+      this.lstamendtagVisible = true;
+      this.lstamendtag = true;
+      this.tagform = {
+        isupload: row.isupload,
+        tagname: row.tagname,
+        tagcategoryid: row.tagcategoryid,
+        tagdescription: row.tagdescription,
+        tagid: row.tagid,
+      };
+    },
+    addladeltag() {
+      this.lstamendtagVisible = true;
+      this.lstamendtag = false;
+      this.tagform = {
+        isupload: "",
+        tagname: "",
+        tagcategoryid: "",
+        tagdescription: "",
+        tagid: "",
+      };
+    },
+    // 娣诲姞/淇敼鏍囩
+    Maintenancetag() {
+      if (this.lstamendtag) {
+        toamendtag(this.addDateRange(this.tagform)).then((response) => {
+          console.log(response);
+          this.getList();
+        });
+      } else {
+        addapitag(this.addDateRange(this.tagform)).then((response) => {
+          console.log(response);
+          this.getList();
+        });
+      }
+      this.tagform = {
+        isupload: "",
+        tagname: "",
+        tagcategoryid: "",
+        tagdescription: "",
+        tagid: "",
+      };
+    },
+
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+      };
+      this.resetForm("form");
+    },
+    //鍗曢寮规
+    handleUpdate() {
+      this.topicVisible = true;
+    },
+    //缁撴灉寮规
+    handleDelete() {
+      this.consequenceVisible = true;
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams.tagname = "";
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.tagid);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download(
+        "base/tag/export",
+        {
+          ...this.topqueryParams,
+        },
+        `user_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.Questionnairemanagement {
+  display: flex;
+}
+.sidecolumn {
+  width: 180px;
+  min-height: 100vh;
+  text-align: center;
+  //   display: flex;
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .sidecolumn-top {
+    display: flex;
+    justify-content: space-between;
+    .top-wj {
+      font-size: 20px;
+    }
+    .top-tj {
+      font-size: 18px;
+
+      color: rgb(0, 89, 255);
+      cursor: pointer;
+    }
+  }
+  .center-ss {
+    margin-top: 30px;
+    .input-with-select {
+      height: 40px !important;
+    }
+  }
+  .bottom-fl {
+    margin-top: 30px;
+    display: center !important;
+  }
+}
+.topicdia {
+  text-align: center;
+  margin: 0 20px;
+
+  // overflow: scroll;
+
+  .top-text {
+    font-size: 25px;
+    font-weight: 600;
+  }
+  .top-mintext {
+    color: #bdae25;
+    font-size: 15px;
+    margin: 10px 0;
+  }
+  .ttaabbcc {
+    // background: #edf1f7;
+    border: 1px solid #dcdfe6;
+    -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+      0 0 6px 0 rgba(0, 0, 0, 0.04);
+    margin: 15px 0;
+    margin-top: 30px;
+    padding: 30px;
+  }
+  .describe {
+    text-align: left;
+    margin-bottom: 20px;
+    span {
+      color: rgb(23, 140, 235);
+      margin-left: 5px;
+    }
+  }
+}
+::v-deep.el-tabs--left,
+.el-tabs--right {
+  overflow: hidden;
+  align-items: center;
+  display: flex;
+}
+::v-deep.el-input--medium .el-input__inner {
+  height: 40px !important;
+}
+::v-deep.el-tabs--right .el-tabs__active-bar.is-right {
+  height: 40px;
+  width: 5px;
+  left: 0;
+}
+::v-deep.el-tabs--right .el-tabs__item.is-right {
+  display: block;
+  text-align: left;
+  font-size: 20px;
+}
+
+.leftvlue {
+  //   display: flex;
+  //   flex: 1;
+  width: 80%;
+  margin-top: 20px;
+  //   margin: 20px;
+  padding: 30px;
+  background: #ffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .mulsz {
+    font-size: 20px;
+  }
+}
+.document {
+  width: 100px;
+  height: 50px;
+}
+.documentf {
+  display: flex;
+  justify-content: flex-end;
+}
+.button-text {
+  color: rgb(70, 204, 238);
+}
+.button-textck {
+  color: rgb(39, 167, 67);
+}
+.button-textxg {
+  font-size: 18px;
+  color: rgb(35, 81, 233);
+}
+.button-textsc {
+  font-size: 18px;
+
+  color: rgb(23, 140, 235);
+}
+</style>
diff --git a/src/views/sfstatistics/statement/index.vue b/src/views/sfstatistics/statement/index.vue
new file mode 100644
index 0000000..72a380e
--- /dev/null
+++ b/src/views/sfstatistics/statement/index.vue
@@ -0,0 +1,952 @@
+<template>
+  <div class="Questionnairemanagement">
+    <!-- 宸︿晶鏍� -->
+    <div class="sidecolumn">
+      <div class="sidecolumn-top">
+        <div class="top-wj">鎮h�呮潵婧�</div>
+      </div>
+
+      <div class="bottom-fl">
+        <el-tabs
+          tab-position="right"
+          v-model="activeName"
+          @tab-click="handleClick"
+        >
+          <el-tab-pane label="鍏ㄩ儴" name="first"></el-tab-pane>
+          <el-tab-pane label="浣忛櫌" name="bhospitalized"></el-tab-pane>
+          <el-tab-pane label="鍦ㄩ櫌" name="Inhospital"></el-tab-pane>
+          <el-tab-pane label="闂ㄨ瘖" name="outpatient"></el-tab-pane>
+          <el-tab-pane label="浣撴" name="physical"></el-tab-pane>
+        </el-tabs>
+      </div>
+    </div>
+    <!-- 鍙充晶鏁版嵁 -->
+    <div class="leftvlue">
+      <div class="leftvlue-top">
+        <el-tabs v-model="topactiveName" @tab-click="tophandleClick">
+          <el-tab-pane name="Local">
+            <span class="mulsz" slot="label">鎸夊嚭闄㈢梾鍖虹粺璁� </span>
+          </el-tab-pane>
+          <el-tab-pane name="sharing">
+            <span class="mulsz" slot="label">鎸夊嚭闄㈢瀹ょ粺璁� </span>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+      <div class="leftvlue-bg">
+        <el-row :gutter="20">
+          <!--鏍囩鏁版嵁-->
+          <el-col :span="24" :xs="24">
+            <el-form
+              :model="queryParams"
+              ref="queryForm"
+              size="small"
+              :inline="true"
+              v-show="showSearch"
+              label-width="98px"
+            >
+              <el-form-item label="鍖婚櫌" prop="userName">
+                <el-select
+                  v-model="queryParams.value1"
+                  placeholder="榛樿鏄璐﹀彿鎵�灞炲尰闄�"
+                >
+                  <el-option
+                    v-for="item in options"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="鍑洪櫌鐥呭尯" prop="userName">
+                <el-select v-model="queryParams.value2" placeholder="璇烽�夋嫨">
+                  <el-option
+                    v-for="item in options"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="绠$悊鏂规" prop="userName">
+                <el-select v-model="queryParams.value3" placeholder="璇烽�夋嫨">
+                  <el-option
+                    v-for="item in options"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                  >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="鍑洪櫌鏃ユ湡" prop="userName">
+                <el-date-picker
+                  v-model="queryParams.valuetime1"
+                  align="right"
+                  type="date"
+                  placeholder="閫夋嫨鏃ユ湡"
+                  :picker-options="pickerOptionsa"
+                >
+                </el-date-picker>
+              </el-form-item>
+              <el-form-item label="璁″垝闅忚鏃ユ湡" prop="userName">
+                <el-date-picker
+                  v-model="queryParams.valuetime2"
+                  align="right"
+                  type="date"
+                  placeholder="閫夋嫨鏃ユ湡"
+                  :picker-options="pickerOptions"
+                >
+                </el-date-picker>
+              </el-form-item>
+              <el-form-item label="璁″垝闅忚鏃ユ湡" prop="userName">
+                <el-date-picker
+                  v-model="queryParams.valuetime2"
+                  align="right"
+                  type="date"
+                  placeholder="閫夋嫨鏃ユ湡"
+                  :picker-options="pickerOptions"
+                >
+                </el-date-picker>
+              </el-form-item>
+
+              <el-form-item>
+                <el-button
+                  type="primary"
+                  icon="el-icon-search"
+                  size="medium"
+                  @click="handleQuery"
+                  >鎼滅储</el-button
+                >
+                <el-button
+                  icon="el-icon-refresh"
+                  size="medium"
+                  @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="medium"
+                  @click="addladeltag"
+                  v-hasPermi="['system:user:add']"
+                  >鏂板</el-button
+                >
+              </el-col>
+
+              <el-col :span="1.5">
+                <el-button
+                  type="danger"
+                  plain
+                  icon="el-icon-delete"
+                  size="medium"
+                  :disabled="multiple"
+                  @click="handleDelete"
+                  v-hasPermi="['system:user:remove']"
+                  >鍒犻櫎</el-button
+                >
+              </el-col>
+              <el-col :span="1.5">
+                <div class="documentf">
+                  <div class="document">
+                    <el-button
+                      type="warning"
+                      plain
+                      icon="el-icon-download"
+                      size="medium"
+                      @click="handleExport"
+                      v-hasPermi="['system:user:export']"
+                      >瀵煎嚭</el-button
+                    >
+                  </div>
+                </div>
+              </el-col>
+
+              <!-- <el-col :span="1.5"> </el-col> -->
+            </el-row>
+            <!-- <right-toolbar
+          :showSearch.sync="showSearch"
+          @queryTable="getList"
+          :columns="columns"
+        ></right-toolbar> -->
+            <el-table
+              v-loading="loading"
+              :data="userList"
+              :border="true"
+              @selection-change="handleSelectionChange"
+            >
+              <el-table-column type="selection" width="50" align="center" />
+              <el-table-column
+                fixed
+                label="搴忓彿"
+                align="center"
+                key="tagid"
+                prop="tagid"
+                width="50"
+              />
+              <el-table-column
+                fixed
+                label="鍑洪櫌鐥呭尯"
+                align="center"
+                key="tagname"
+                prop="tagname"
+                width="100"
+                :show-overflow-tooltip="true"
+              />
+              <el-table-column
+                label="闂嵎"
+                align="center"
+                key="updateTime"
+                prop="updateTime"
+              >
+              </el-table-column>
+
+              <el-table-column
+                label="闂嵎鏇存柊鏃ユ湡"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="110"
+              >
+              </el-table-column>
+              <el-table-column
+                label="绠$悊鏂规"
+                align="center"
+                key="isupload"
+                prop="isupload"
+              >
+              </el-table-column>
+              <el-table-column
+                label="闅忚浠诲姟鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="100"
+              >
+              </el-table-column>
+              <el-table-column
+                label="闅忚瀹屾垚鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="100"
+              >
+              </el-table-column>
+              <el-table-column
+                label="闅忚瀹屾垚鐜�"
+                align="center"
+                key="isupload"
+                prop="isupload"
+                width="100"
+              >
+              </el-table-column>
+              <el-table-column
+                label="AI澶栧懠娆℃暟"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="100"
+              >
+              </el-table-column>
+              <el-table-column
+                label="AI闅忚瀹屾垚鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="120"
+              >
+              </el-table-column>
+              <el-table-column
+                label="AI闅忚瀹屾垚鐜�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="120"
+              >
+              </el-table-column>
+              <el-table-column
+                label="寰俊鍙戦�佹鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="100"
+              >
+              </el-table-column>
+              <el-table-column
+                label="寰俊闅忚瀹屾垚鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="120"
+              >
+              </el-table-column>
+              <el-table-column
+                label="寰俊闅忚瀹屾垚鐜�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="120"
+              >
+              </el-table-column>
+              <el-table-column
+                label="鐭俊鍙戦�佹鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="100"
+              >
+              </el-table-column>
+              <el-table-column
+                label="鐭俊闅忚瀹屾垚鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="120"
+              >
+              </el-table-column>
+              <el-table-column
+                label="鐭俊闅忚瀹屾垚鐜�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="120"
+              >
+              </el-table-column>
+              <el-table-column
+                label="浜哄伐闅忚娆℃暟"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="100"
+              >
+              </el-table-column>
+              <el-table-column
+                label="浜哄伐闅忚瀹屾垚鏁�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="120"
+              >
+              </el-table-column>
+              <el-table-column
+                label="浜哄伐闅忚瀹屾垚鐜�"
+                align="center"
+                key="tagdescription"
+                prop="tagdescription"
+                width="120"
+              >
+              </el-table-column>
+
+              <el-table-column
+                fixed="right"
+                label="鎿嶄綔"
+                align="center"
+                width="300"
+                class-name="small-padding fixed-width"
+              >
+                <template slot-scope="scope">
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="handleUpdate(scope.row)"
+                    v-hasPermi="['system:user:edit']"
+                    ><span class="button-textxg"
+                      ><i class="el-icon-s-data"></i>鍗曢缁熻</span
+                    ></el-button
+                  >
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="handleDelete(scope.row)"
+                    v-hasPermi="['system:user:remove']"
+                    ><span class="button-textsc"
+                      ><i class="el-icon-share"></i>闅忚缁撴灉鏄庣粏</span
+                    ></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-col>
+        </el-row>
+      </div>
+    </div>
+    <!-- 鍗曢灞曠ず寮规 -->
+    <el-dialog :visible.sync="topicVisible" width="45%">
+      <div class="topicdia">
+        <div class="top-text">{{ topicvalue.name }}</div>
+        <div class="top-mintext">闅忚瀹屾垚鏁皗{ topicvalue.number }}</div>
+        <div style="overflow-x: hidden; overflow-y: auto; max-height: 65vh">
+          <div class="ttaabbcc" v-for="item in topiclist" :key="item.name">
+            <div class="describe">
+              绗瑊{ item.number }}棰橈細 {{ item.name }}?<span
+                >[{{ item.type == 1 ? "鍗曢�夐" : "澶氶�夐" }}]</span
+              >
+            </div>
+            <div>
+              <el-table :data="tableData" style="width: 100%">
+                <el-table-column prop="date" label="闂閫夐」">
+                </el-table-column>
+                <el-table-column prop="name" label="閫夋嫨浜烘暟">
+                </el-table-column>
+                <el-table-column prop="address" label="姣斾緥"> </el-table-column>
+              </el-table>
+            </div>
+          </div>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="topicVisible = false">鍏� 闂�</el-button>
+      </span>
+    </el-dialog>
+    <!-- 缁撴灉缁熻寮规 -->
+    <el-dialog title="鎻愮ず" :visible.sync="consequenceVisible" width="50%">
+      <div class="topicdia">
+        <div class="top-text" style="margin-bottom: 20px">闂嵎缁熻缁撴灉</div>
+        <div>
+          <el-table :data="tableData" style="width: 100%">
+            <el-table-column prop="date" label="鎮h�呭鍚�"> </el-table-column>
+            <el-table-column prop="namea" label="鎬у埆"> </el-table-column>
+            <el-table-column prop="namec" label="骞撮緞"> </el-table-column>
+            <el-table-column prop="named" label="鑱旂郴鏂瑰紡"> </el-table-column>
+            <el-table-column prop="namee" label="璁″垝鎵ц鏃堕棿" width="120">
+            </el-table-column>
+            <el-table-column prop="namex" label="瀹為檯瀹屾垚鏃堕棿" width="120">
+            </el-table-column>
+            <el-table-column prop="namez" label="瀹屾垚鏂瑰紡"> </el-table-column>
+            <el-table-column prop="nameh" label="闂嵎"> </el-table-column>
+            <el-table-column prop="namej" label="寰楀垎"> </el-table-column>
+            <!-- 鎴彇鍑犲垪閫夐」灞炴�у悕缁存姢鏁扮粍閬嶅巻 -->
+            <!-- <el-table-column prop="namet">
+              <template slot="header" slot-scope="scope">
+                <div>{{ scope.row.name }}<span>[鍗曢�夐]</span></div>
+              </template>
+            </el-table-column> -->
+          </el-table>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="consequenceVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="consequenceVisible = false"
+          >纭� 瀹�</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  toamendtag,
+  addapitag,
+  deletetag,
+  changetagcategory,
+  listtag,
+} from "@/api/system/label";
+
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+export default {
+  name: "questionnaire",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      topactiveName: "Local", //椤堕儴閫夋嫨
+      activeName: "first",
+      // 閬僵灞�
+      loading: false,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      idds: "", //鍒嗙被id
+      // 鎬绘潯鏁�
+      total: 0,
+      lstamendtag: false, //鏄惁淇敼鏍囩
+      topicVisible: false, //鎺у埗鍗曢寮规
+      consequenceVisible: false, //鎺у埗缁撴灉寮规
+      //淇敼娣诲姞鏍囩寮规鏁版嵁
+      tagform: {
+        isupload: "",
+        tagname: "",
+        tagcategoryid: "",
+        tagdescription: "",
+      },
+      topicvalue: {
+        name: "楠ㄧ闅忚妯$増",
+        number: 222,
+      },
+      classifyform: {
+        categoryname: "",
+      },
+      topiclist: [
+        {
+          name: "鎮ㄧ殑韬綋搴峰鎯呭喌濡備綍",
+          number: 1,
+          type: 1,
+        },
+        {
+          name: "鎮ㄧ殑楗鎯呭喌濡備綍",
+          number: 2,
+          type: 2,
+        },
+        {
+          name: "鎮ㄧ殑鎭㈠鎯呭喌濡備綍",
+          number: 3,
+          type: 1,
+        },
+      ],
+      tableData: [
+        {
+          date: "濂�",
+          name: 12,
+          address: "50%",
+        },
+        {
+          date: "涓�鑸�",
+          name: 2,
+          address: "6.2%",
+        },
+        {
+          date: "宸�",
+          name: 0,
+          address: "0%",
+        },
+      ],
+      // 鏍囩琛ㄦ牸鏁版嵁
+      userList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      // 瑙掕壊閫夐」
+      roleOptions: [],
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      forms: {
+        name: "",
+      },
+      numberlb: 22,
+      dialogFormVisible: false, //娣诲姞銆佷慨鏀圭被鍒脊妗�
+      lstamendtagVisible: false, //娣诲姞銆佷慨鏀规爣绛惧脊妗�
+      goQRCodeVisible: false, //浜岀淮鐮佸脊妗�
+      sidecolumnval: "", //绫诲埆鎼滅储
+      propss: { multiple: true },
+      topqueryParams: {}, //瀵煎嚭绛涢�夋潯浠�
+      options: [
+        {
+          value: 1,
+          label: "涓滃崡",
+        },
+        {
+          value: 2,
+          label: "瑗垮寳",
+        },
+        {
+          value: 3,
+          label: "浠ㄤ花浠�",
+        },
+        {
+          value: 4,
+          label: "鍏椋掗",
+        },
+      ],
+      pickerOptions: {
+        disabledDate(time) {
+          return time.getTime() < Date.now() - 3600 * 1000 * 24;
+        },
+        shortcuts: [
+          {
+            text: "浠婂ぉ",
+            onClick(picker) {
+              picker.$emit("pick", new Date());
+            },
+          },
+          {
+            text: "鏄ㄥぉ",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24);
+              picker.$emit("pick", date);
+            },
+          },
+          {
+            text: "涓�鍛ㄥ墠",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit("pick", date);
+            },
+          },
+        ],
+      },
+      pickerOptionsa: {
+        disabledDate(time) {
+          return time.getTime() > Date.now();
+        },
+        shortcuts: [
+          {
+            text: "浠婂ぉ",
+            onClick(picker) {
+              picker.$emit("pick", new Date());
+            },
+          },
+          {
+            text: "鏄ㄥぉ",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24);
+              picker.$emit("pick", date);
+            },
+          },
+          {
+            text: "涓�鍛ㄥ墠",
+            onClick(picker) {
+              const date = new Date();
+              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit("pick", date);
+            },
+          },
+        ],
+      },
+      // 鏌ヨ鏍囩鍒楄〃鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        tagname: undefined,
+        tagdescription: undefined,
+      },
+      // 鍒椾俊鎭�
+      columns: [
+        { key: 0, label: `鏍囩缂栧彿`, visible: true },
+        { key: 1, label: `鏍囩鍚嶇О`, visible: true },
+        { key: 2, label: `鏍囩鏄电О`, visible: true },
+        { key: 3, label: `閮ㄩ棬`, visible: true },
+        { key: 4, label: `鎵嬫満鍙风爜`, visible: true },
+        { key: 5, label: `鐘舵�乣, visible: true },
+        { key: 6, label: `鍒涘缓鏃堕棿`, visible: true },
+      ],
+      // 琛ㄥ崟鏍¢獙
+      // rules: {
+      //   userName: [
+      //     { required: true, message: "鏍囩鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+      //     {
+      //       min: 2,
+      //       max: 20,
+      //       message: "鏍囩鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿",
+      //       trigger: "blur",
+      //     },
+      //   ],
+      //   nickName: [
+      //     { required: true, message: "鏍囩鏄电О涓嶈兘涓虹┖", trigger: "blur" },
+      //   ],
+      //   password: [
+      //     { required: true, message: "鏍囩瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+      //     {
+      //       min: 5,
+      //       max: 20,
+      //       message: "鏍囩瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+      //       trigger: "blur",
+      //     },
+      //   ],
+      //   email: [
+      //     {
+      //       type: "email",
+      //       message: "璇疯緭鍏ユ纭殑閭鍦板潃",
+      //       trigger: ["blur", "change"],
+      //     },
+      //   ],
+      //   phonenumber: [
+      //     {
+      //       pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+      //       message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+      //       trigger: "blur",
+      //     },
+      //   ],
+      //   IDnumber: [
+      //     {
+      //       pattern:
+      //         /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/,
+      //       message: "璇疯緭鍏ユ纭殑韬唤璇佸彿鐮�",
+      //       trigger: "blur",
+      //     },
+      //   ],
+      // },
+    };
+  },
+  watch: {},
+  created() {
+    this.getList();
+    this.gitclasify();
+  },
+
+  methods: {
+    /** 鏌ヨ鏍囩鍒楄〃 */
+    getList() {
+      listtag(this.addDateRange(this.queryParams)).then((response) => {
+        console.log(response);
+        this.total = response.total;
+        this.userList = response.rows;
+      });
+    },
+    /** 淇敼鏍囩 */
+    handleUpdate(row) {
+      console.log(row, "淇敼鏍囩");
+      this.lstamendtagVisible = true;
+      this.lstamendtag = true;
+      this.tagform = {
+        isupload: row.isupload,
+        tagname: row.tagname,
+        tagcategoryid: row.tagcategoryid,
+        tagdescription: row.tagdescription,
+        tagid: row.tagid,
+      };
+    },
+    addladeltag() {
+      this.lstamendtagVisible = true;
+      this.lstamendtag = false;
+      this.tagform = {
+        isupload: "",
+        tagname: "",
+        tagcategoryid: "",
+        tagdescription: "",
+        tagid: "",
+      };
+    },
+    // 娣诲姞/淇敼鏍囩
+    Maintenancetag() {
+      if (this.lstamendtag) {
+        toamendtag(this.addDateRange(this.tagform)).then((response) => {
+          console.log(response);
+          this.getList();
+        });
+      } else {
+        addapitag(this.addDateRange(this.tagform)).then((response) => {
+          console.log(response);
+          this.getList();
+        });
+      }
+      this.tagform = {
+        isupload: "",
+        tagname: "",
+        tagcategoryid: "",
+        tagdescription: "",
+        tagid: "",
+      };
+    },
+
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+      };
+      this.resetForm("form");
+    },
+    //鍗曢寮规
+    handleUpdate() {
+      this.topicVisible = true;
+    },
+    //缁撴灉寮规
+    handleDelete() {
+      this.consequenceVisible = true;
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams.tagname = "";
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.tagid);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download(
+        "base/tag/export",
+        {
+          ...this.topqueryParams,
+        },
+        `user_${new Date().getTime()}.xlsx`
+      );
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.Questionnairemanagement {
+  display: flex;
+}
+.sidecolumn {
+  width: 180px;
+  min-height: 100vh;
+  text-align: center;
+  //   display: flex;
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .sidecolumn-top {
+    display: flex;
+    justify-content: space-between;
+    .top-wj {
+      font-size: 20px;
+    }
+    .top-tj {
+      font-size: 18px;
+
+      color: rgb(0, 89, 255);
+      cursor: pointer;
+    }
+  }
+  .center-ss {
+    margin-top: 30px;
+    .input-with-select {
+      height: 40px !important;
+    }
+  }
+  .bottom-fl {
+    margin-top: 30px;
+    display: center !important;
+  }
+}
+.topicdia {
+  text-align: center;
+  margin: 0 20px;
+
+  // overflow: scroll;
+
+  .top-text {
+    font-size: 25px;
+    font-weight: 600;
+  }
+  .top-mintext {
+    color: #bdae25;
+    font-size: 15px;
+    margin: 10px 0;
+  }
+  .ttaabbcc {
+    // background: #edf1f7;
+    border: 1px solid #dcdfe6;
+    -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+      0 0 6px 0 rgba(0, 0, 0, 0.04);
+    margin: 15px 0;
+    margin-top: 30px;
+    padding: 30px;
+  }
+  .describe {
+    text-align: left;
+    margin-bottom: 20px;
+    span {
+      color: rgb(23, 140, 235);
+      margin-left: 5px;
+    }
+  }
+}
+::v-deep.el-tabs--left,
+.el-tabs--right {
+  overflow: hidden;
+  align-items: center;
+  display: flex;
+}
+::v-deep.el-input--medium .el-input__inner {
+  height: 40px !important;
+}
+::v-deep.el-tabs--right .el-tabs__active-bar.is-right {
+  height: 40px;
+  width: 5px;
+  left: 0;
+}
+::v-deep.el-tabs--right .el-tabs__item.is-right {
+  display: block;
+  text-align: left;
+  font-size: 20px;
+}
+
+.leftvlue {
+  //   display: flex;
+  //   flex: 1;
+  width: 80%;
+  margin-top: 20px;
+  //   margin: 20px;
+  padding: 30px;
+  background: #ffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .mulsz {
+    font-size: 20px;
+  }
+}
+.document {
+  width: 100px;
+  height: 50px;
+}
+.documentf {
+  display: flex;
+  justify-content: flex-end;
+}
+.button-text {
+  color: rgb(70, 204, 238);
+}
+.button-textck {
+  color: rgb(39, 167, 67);
+}
+.button-textxg {
+  font-size: 18px;
+  color: rgb(35, 81, 233);
+}
+.button-textsc {
+  font-size: 18px;
+
+  color: rgb(23, 140, 235);
+}
+</style>
diff --git a/src/views/shortmessage/aoconnect/index.vue b/src/views/shortmessage/aoconnect/index.vue
new file mode 100644
index 0000000..574f966
--- /dev/null
+++ b/src/views/shortmessage/aoconnect/index.vue
@@ -0,0 +1,17 @@
+<template>
+  <div>涓�瀵逛竴娴嬭瘯</div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {};
+  },
+
+  created() {},
+
+  methods: {},
+};
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/src/views/shortmessage/aoprojection/index.vue b/src/views/shortmessage/aoprojection/index.vue
new file mode 100644
index 0000000..5fbfa39
--- /dev/null
+++ b/src/views/shortmessage/aoprojection/index.vue
@@ -0,0 +1,230 @@
+<template>
+  <div class="container">
+    <div class="header">
+      <div>
+        鎴块棿鍙�:
+        <input type="text" id="room" />
+        <button @click="createRoom()">鍒涘缓鎴块棿</button>
+      </div>
+      <div>
+        瀵规柟鎴块棿鍙�
+        <input type="text" id="receive" />
+        <button @click="Connect()">杩炴帴</button>
+      </div>
+    </div>
+    <div style="margin-top: 20px">
+      <video
+        src=""
+        id="self"
+        autoplay
+        controls
+        muted
+        style="width: 500px; object-fit: cover; margin-right: 100px"
+      ></video>
+      <video
+        src=""
+        id="other"
+        autoplay
+        controls
+        muted
+        style="width: 500px; object-fit: cover"
+      ></video>
+    </div>
+  </div>
+</template>
+
+<script>
+let PeerConnection =
+  window.PeerConnection ||
+  window.webkitPeerConnection00 ||
+  window.webkitRTCPeerConnection ||
+  window.mozRTCPeerConnection;
+let nativeRTCIceCandidate = window.mozRTCIceCandidate || window.RTCIceCandidate;
+let nativeRTCSessionDescription =
+  window.mozRTCSessionDescription || window.RTCSessionDescription;
+//ice鏈嶅姟鍣ㄥ湴鍧�
+const iceServer = {
+  iceServers: [
+    {
+      url: "turn:42.192.40.58:3478?transport=udp",
+      username: "ddssingsong",
+      credential: "123456",
+    },
+    {
+      url: "turn:42.192.40.58:3478?transport=tcp",
+      username: "ddssingsong",
+      credential: "123456",
+    },
+  ],
+};
+let socket = "";
+let receiver = "";
+let pc;
+
+export default {
+  data() {
+    return {};
+  },
+
+  created() {},
+
+  methods: {
+    createRoom() {
+      let room = document.getElementById("room");
+      if (!room.value) {
+        alert("璇疯緭鍏ユ埧闂村彿!!!");
+        return;
+      }
+      //寤虹珛websocket杩炴帴
+      socket = new WebSocket(`wss://127.0.0.1:3000/single?room=${room.value}`);
+      socket.onopen = async () => {
+        alert("杩炴帴鎴愬姛");
+        try {
+          //鑾峰彇褰撳墠璁惧鐨勮棰戞祦
+          let stream = await navigator.mediaDevices.getDisplayMedia({
+            video: true,
+            audio: false,
+          });
+          console.log(stream);
+          //鍒濆鍖朠C婧�
+          pc = this.initPC(stream);
+          console.log(pc);
+          //娣诲姞闊宠棰戞祦
+          pc.addStream(stream);
+          console.log(pc);
+          let video = document.getElementById("self");
+          video.srcObject = stream;
+          console.log(video);
+        } catch (error) {
+          console.log(error);
+          alert("鑾峰彇娴佸け璐�");
+        }
+      };
+      socket.onmessage = async (message) => {
+        let data = JSON.parse(message.data);
+        switch (data.name) {
+          //鎺ユ敹鍒伴個璇�
+          case "peer":
+            receiver = data.receiver;
+            this.acceptAudio();
+            break;
+          /**
+           * 1.閭�璇蜂汉灏嗗鏂圭殑闊宠棰戞祦閫氳繃setRemoteDescription鍑芥暟杩涜瀛樺偍
+           * 2.瀛樺偍瀹屽悗閭�璇蜂汉鍒涘缓answer鏉ヨ幏鍙栬嚜宸辩殑闊宠棰戞祦,閫氳繃setLocalDescription鍑芥暟瀛樺偍鑷繁鐨勯煶瑙嗛娴�,骞跺彂閫乤nswer鎸囦护(鎼哄甫鑷繁鐨勯煶瑙嗛)鍛婅瘔瀵规柟瑕佸瓨鍌ㄩ個璇蜂汉鐨勯煶瑙嗛
+           */
+          case "offer":
+            //褰撴敹鍒板鏂规帴鏀惰姹傚悗,璁剧疆闊抽婧�,骞跺彂閫乤nswer缁欏鏂�
+            pc.setRemoteDescription(
+              new nativeRTCSessionDescription(data.data.sdp)
+            );
+            pc.createAnswer(
+              (session_desc) => {
+                pc.setLocalDescription(session_desc);
+                socket.send(
+                  JSON.stringify({
+                    name: "answer",
+                    data: {
+                      sdp: session_desc,
+                    },
+                    receiver: receiver,
+                  })
+                );
+              },
+              (err) => {
+                console.log(err);
+              }
+            );
+            break;
+          case "answer":
+            //璁剧疆閭�璇蜂汉鍙戞潵鐨勯煶棰戞簮
+            pc.setRemoteDescription(
+              new nativeRTCSessionDescription(data.data.sdp)
+            );
+            break;
+          case "ice_candidate":
+            //娣诲姞ice婧�,杩欎竴姝ュ緢閲嶈,濡傛灉娌℃湁鎺ユ敹ice鍒欐煡鐪嬫槸鍚︽祦绋嬫湁闂
+            var candidate = new nativeRTCIceCandidate(data.data);
+            pc.addIceCandidate(candidate);
+            break;
+        }
+      };
+    },
+    //鍒濆鍖朠C婧�
+    initPC() {
+      let pc = new PeerConnection(iceServer);
+      pc.onicecandidate = (evt) => {
+        if (evt.candidate) {
+          socket.send(
+            JSON.stringify({
+              name: `ice_candidate`,
+              data: {
+                id: evt.candidate.sdpMid,
+                label: evt.candidate.sdpMLineIndex,
+                sdpMLineIndex: evt.candidate.sdpMLineIndex,
+                candidate: evt.candidate.candidate,
+              },
+              receiver: receiver,
+            })
+          );
+        }
+      };
+      pc.onaddstream = (evt) => {
+        let stream = evt.stream;
+        let video = document.getElementById("other");
+        video.srcObject = stream;
+      };
+      return pc;
+    },
+    //鍜屽鏂瑰缓绔嬭繛鎺�
+    Connect() {
+      receiver = document.getElementById("receive").value;
+      console.log(receiver);
+      if (!socket) {
+        alert("鍏堝垱寤鸿嚜宸辩殑鎴块棿鍙�!!");
+        return;
+      }
+      if (!receiver) {
+        alert("璇疯緭鍏ュ鏂规埧闂村彿");
+        return;
+      }
+      socket.send(JSON.stringify({ name: "createRoom", receiver: receiver }));
+      console.log("鎴愬姛");
+    },
+    //鎺ユ敹閭�璇�
+    async acceptAudio() {
+      /**
+       * 1.鐐瑰嚮鍚屾剰鍚�
+       * 2.鑾峰彇鑷繁鐨勮棰戞祦
+       * 3.鍒濆鍖朠C婧�
+       * 4.PC娣诲姞闊宠棰戞祦
+       * 5.鍒涘缓offer,鑾峰彇鑷繁鐨勯煶瑙嗛娴�,骞堕�氳繃setLocalDescription鍑芥暟瀛樺偍鑷繁鐨勯煶瑙嗛娴�
+       * 6.骞跺彂閫乸eer鎸囦护(鎼哄甫鑷繁鐨勯煶瑙嗛)鍛婅瘔閭�璇蜂汉瑕佸瓨鍌ㄨ嚜宸辩殑闊宠棰�
+       */
+      try {
+        pc.createOffer(
+          (session_desc) => {
+            pc.setLocalDescription(session_desc);
+            socket.send(
+              JSON.stringify({
+                name: "offer",
+                data: {
+                  sdp: session_desc,
+                },
+                receiver: receiver,
+              })
+            );
+          },
+          (err) => {
+            console.log(err);
+          }
+        );
+      } catch (error) {
+        alert("妫�娴嬪埌褰撳墠璁惧涓嶆敮鎸侀害鍏嬮,璇疯缃潈闄愬悗鍦ㄩ噸璇�");
+        this.socket.close();
+      }
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/src/views/shortmessage/aovideo/index.vue b/src/views/shortmessage/aovideo/index.vue
new file mode 100644
index 0000000..099f5d3
--- /dev/null
+++ b/src/views/shortmessage/aovideo/index.vue
@@ -0,0 +1,239 @@
+<template>
+  <div class="demo">
+    <div class="rtcBox">
+      <div>
+        <div class="video-box">
+          <video src="" id="rtcA" controls autoplay></video>
+          <h5>A</h5>
+        </div>
+        <div class="chat-box" v-show="!allowHangup && messageOpen">
+          <h5>鏀舵秷鎭�</h5>
+          <p>{{ receiveText }}</p>
+        </div>
+      </div>
+      <div>
+        <div class="video-box">
+          <video src="" id="rtcB" controls autoplay></video>
+          <h5>B</h5>
+          <button @click="call" :disabled="allowCall">鍙戣捣杩炴帴</button>
+          <button @click="hangup" :disabled="allowHangup">hangup</button>
+        </div>
+        <div class="chat-box" v-show="!allowHangup && messageOpen">
+          <h5>鍙戞秷鎭�</h5>
+          <textarea v-model="sendText"></textarea>
+          <br />
+          <button @click="send">鍙戦��</button>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "local1",
+  data() {
+    return {
+      peerA: null,
+      peerB: null,
+      channelA: null,
+      channelB: null,
+      offerOption: {
+        offerToReceiveAudio: 1,
+        offerToReceiveVideo: 1,
+      },
+      allowCall: true,
+      allowHangup: true,
+      messageOpen: false,
+      sendText: "",
+      receiveText: "",
+    };
+  },
+  methods: {
+    send() {
+      this.channelB.send(JSON.stringify({ name: this.sendText }));
+      this.sendText = "";
+    },
+    start() {
+      this.state = "2";
+      this.newRecognition.start();
+    },
+    stop() {
+      this.state = "1";
+      this.newRecognition.stop();
+    },
+    async call() {
+      if (!this.peerA || !this.peerB) {
+        // 鍒ゆ柇鏄惁鏈夊搴斿疄渚嬶紝娌℃湁灏遍噸鏂板垱寤�
+        this.initPeer();
+      }
+      try {
+        let offer = await this.peerB.createOffer(this.offerOption); // 鍒涘缓 offer
+        await this.onCreateOffer(offer);
+      } catch (e) {
+        console.log("createOffer: ", e);
+      }
+
+      this.allowCall = true;
+      this.allowHangup = false;
+    },
+    hangup() {
+      this.peerA.close();
+      this.peerB.close();
+      this.channelA.close();
+      this.channelB.close();
+      this.peerA = null;
+      this.peerB = null;
+      this.channelA = null;
+      this.channelB = null;
+      this.sendText = "";
+      this.receiveText = "";
+      this.allowCall = false;
+      this.allowHangup = true;
+    },
+    async onCreateOffer(desc) {
+      try {
+        await this.peerB.setLocalDescription(desc); // 鍛煎彨绔缃湰鍦� offer 鎻忚堪
+      } catch (e) {
+        console.log("Offer-setLocalDescription: ", e);
+      }
+      try {
+        await this.peerA.setRemoteDescription(desc); // 鎺ユ敹绔缃繙绋� offer 鎻忚堪
+      } catch (e) {
+        console.log("Offer-setRemoteDescription: ", e);
+      }
+      try {
+        let answer = await this.peerA.createAnswer(); // 鎺ユ敹绔垱寤� answer
+        await this.onCreateAnswer(answer);
+      } catch (e) {
+        console.log("createAnswer: ", e);
+      }
+    },
+    async onCreateAnswer(desc) {
+      try {
+        await this.peerA.setLocalDescription(desc); // 鎺ユ敹绔缃湰鍦� answer 鎻忚堪
+      } catch (e) {
+        console.log("answer-setLocalDescription: ", e);
+      }
+      try {
+        await this.peerB.setRemoteDescription(desc); // 鍛煎彨绔缃繙绋� answer 鎻忚堪
+      } catch (e) {
+        console.log("answer-setRemoteDescription: ", e);
+      }
+    },
+    initPeer() {
+      // 鍒涘缓杈撳嚭绔� PeerConnection
+      let PeerConnection =
+        window.RTCPeerConnection ||
+        window.mozRTCPeerConnection ||
+        window.webkitRTCPeerConnection;
+      this.peerA = new PeerConnection();
+      this.peerA.addStream(this.localstream); // 娣诲姞鏈湴娴�
+      // 鐩戝惉 A 鐨処CE鍊欓�変俊鎭�
+      // 濡傛灉鏀堕泦鍒帮紝灏辨坊鍔犵粰 B
+      this.peerA.onicecandidate = (event) => {
+        if (event.candidate) {
+          this.peerB.addIceCandidate(event.candidate);
+        }
+      };
+      this.peerA.ondatachannel = (event) => {
+        console.log(event);
+        this.channelA = event.channel;
+        this.channelA.binaryType = "arraybuffer";
+        this.channelA.onopen = (e) => {
+          console.log("channelA onopen", e);
+        };
+        this.channelA.onclose = (e) => {
+          console.log("channelA onclose", e);
+        };
+        this.channelA.onmessage = (e) => {
+          this.receiveText = JSON.parse(e.data).name;
+          console.log("channelA onmessage", e.data);
+        };
+      };
+      //                this.channelA.send('Hi you!');
+      // 鍒涘缓鍛煎彨绔�
+      this.peerB = new PeerConnection();
+      this.peerB.onaddstream = (event) => {
+        // 鐩戝惉鏄惁鏈夊獟浣撴祦鎺ュ叆锛屽鏋滄湁灏辫祴鍊肩粰 rtcB 鐨� src
+        console.log("event-stream", event);
+        let video = document.querySelector("#rtcB");
+        video.srcObject = event.stream;
+      };
+      this.channelB = this.peerB.createDataChannel("messagechannel");
+      console.log("this.channelB", this.channelB);
+      this.channelB.binaryType = "arraybuffer";
+      this.channelB.onopen = (event) => {
+        console.log(1);
+        console.log("channelB onopen", event);
+        this.messageOpen = true;
+      };
+      this.channelB.onclose = function (event) {
+        console.log(1);
+        console.log("channelB onclose", event);
+      };
+      // 鐩戝惉 B 鐨処CE鍊欓�変俊鎭�
+      // 濡傛灉鏀堕泦鍒帮紝灏辨坊鍔犵粰 A
+      this.peerB.onicecandidate = (event) => {
+        if (event.candidate) {
+          this.peerA.addIceCandidate(event.candidate);
+        }
+      };
+      this.allowCall = false;
+    },
+    async createMedia() {
+      // 淇濆瓨鏈湴娴佸埌鍏ㄥ眬锛堣棰戦煶棰戦兘鏀寔锛�
+      this.localstream = await navigator.mediaDevices.getUserMedia({
+        audio: true,
+        video: true,
+      });
+      console.log(this.localstream);
+      console.log(
+        this.localstream.getVideoTracks(),
+        this.localstream.getAudioTracks()
+      );
+      let video = document.querySelector("#rtcA");
+      video.srcObject = this.localstream;
+      this.initPeer(); // 鑾峰彇鍒板獟浣撴祦鍚庯紝璋冪敤鍑芥暟鍒濆鍖� RTCPeerConnection
+    },
+  },
+  mounted() {
+    // 鑾峰彇鏈�鏂拌鍥惧悗鑾峰彇鏈湴娴�
+    this.$nextTick(() => {
+      // {mediaSource: 'screen'}
+      this.createMedia();
+    });
+  },
+};
+</script>
+
+<style lang="scss">
+.rtcBox {
+  display: flex;
+  justify-content: center;
+  .video-box {
+    height: 380px;
+    border-bottom: 1px solid #1fbeca;
+    margin-bottom: 10px;
+  }
+  video {
+    width: 400px;
+    height: 300px;
+    margin-left: 20px;
+    background-color: #ddd;
+  }
+  .chat-box {
+    text-align: center;
+    h5 {
+      margin-bottom: 10px;
+    }
+    p,
+    textarea {
+      width: 240px;
+      height: 60px;
+      border: 1px solid #000;
+      display: inline-block;
+    }
+  }
+}
+</style>
diff --git a/src/views/shortmessage/communication/index.vue b/src/views/shortmessage/communication/index.vue
index 34e458f..afcbac4 100644
--- a/src/views/shortmessage/communication/index.vue
+++ b/src/views/shortmessage/communication/index.vue
@@ -63,9 +63,13 @@
 </template>
 
 <script>
-import LemonMessageVoice from "./lemon-message-voice";
 import EmojiData from "./database/emoji";
-import { sendWebsocket, closeWebsocket } from "@/websocket/websocket.js";
+import { chitchatapi } from "@/api/noteapi/chitchat";
+import {
+  sendWebsocket,
+  websocketSend,
+  closeWebsocket,
+} from "@/websocket/websocket.js";
 // Vue.component(LemonMessageVoice.name, LemonMessageVoice);
 // 鑾峰彇鏃堕棿
 const getTime = () => {
@@ -102,6 +106,9 @@
 };
 export default {
   name: "communication",
+  provide: {
+    IMUI: "IMUI value",
+  },
   data() {
     return {
       theme: "blue",
@@ -292,19 +299,19 @@
     setTimeout(() => {
       IMUI.changeContact("contact-1");
     }, 500);
-
+    // 宸︿晶鑱旂郴浜烘渶鏂版秷鎭�
     IMUI.setLastContentRender("event", (message) => {
       return `[鑷畾涔夐�氱煡鍐呭]`;
     });
-
     let contactList = [
       { ...contactData1 },
       { ...contactData2 },
       { ...contactData3 },
       //...Array(100).fill(contactData1)
     ];
-
+    // 鍒濆鑱旂郴浜�
     IMUI.initContacts(contactList);
+    // 鍒濆鍖栧乏渚у鑸�
     IMUI.initMenus([
       {
         name: "messages",
@@ -365,7 +372,7 @@
         isBottom: true,
       },
     ]);
-
+    // 宸ュ叿鏍�
     IMUI.initEditorTools([
       {
         name: "emoji",
@@ -491,6 +498,7 @@
         IMUI.messageViewToBottom();
       }
     },
+    // 瀹氫箟鏂版秷鎭�
     appendCustomMessage() {
       const { IMUI } = this.$refs;
       const message = {
@@ -581,15 +589,74 @@
       instance.closeDrawer();
     },
     // 寤虹珛杩炴帴
-    requstWs() {
+    requstWs(message, next, file) {
       console.log("杩炴帴");
       // 闃叉鐢ㄦ埛澶氭杩炵画鐐瑰嚮鍙戣捣璇锋眰锛屾墍浠ヨ鍏堝叧闂笂娆$殑ws璇锋眰銆�
       closeWebsocket();
+      let formData = new FormData();
+
+      // if (file) {
+      //   const reader = new FileReader();
+      //   console.log(reader);
+      //   console.log(file);
+      //   reader.onload = (file) => {
+      //     console.log(file);
+      //     console.log(reader);
+      //     const imageData = reader.result;
+      //     //鏂囦欢瀛楄妭澶у皬
+      //     //  const fileSize = file.loaded;
+      //     const fileSize = imageData.length;
+      //     console.log("byteLength 锛� ", fileSize);
+      //     const chunkSize = 4096; // 璁剧疆姣忎釜鏁版嵁鍧楃殑澶у皬
+      //     let offset = 0;
+
+      //     // 鍒嗗潡浼犺緭鍥剧墖鏁版嵁
+      //     while (offset < imageData.length) {
+      //       const chunk = imageData.slice(offset, offset + chunkSize);
+      //       const obj = {
+      //         type: file.type,
+      //         userId: "1", //鎺ユ敹鏁版嵁鏂�
+      //         fileSize: fileSize,
+      //         image: chunk,
+      //       };
+      //       console.log(JSON.stringify(obj));
+      //       // 鍙戣捣ws璇锋眰
+      //       // sendWebsocket(
+      //       //   "ws://192.168.31.121:8080/chat?userId=2",
+      //       //   JSON.stringify(obj),
+      //       //   this.wsMessage,
+      //       //   this.wsError
+      //       // );
+      //       websocketSend(JSON.stringify(obj));
+      //       offset += chunkSize;
+
+      //       console.log("offset 锛� ", offset);
+      //     }
+
+      //     // 鍙戦�佸畬鎴愭爣璁�
+      //     console.log("message ");
+      //   };
+
+      //   return reader.readAsDataURL(file);
+      // }
+
       // 璺熷悗绔崗鍟嗭紝闇�瑕佷粈涔堝弬鏁版暟鎹粰鍚庡彴
+      if (file) {
+        formData.append("files", file);
+        console.log(formData.get("files"));
+        // img.src = window.URL.createObjectURL(temp);
+        chitchatapi(formData).then((response) => {
+          console.log(response);
+        });
+
+        return console.log(formData);
+      }
+
       const obj = {
-        type: "text",
-        content: "甯濆緱鍦g浉鐩告洶搴�",
+        type: "object",
         userId: "1", //鎺ユ敹鏁版嵁鏂�
+        fileSize: "1212",
+        image: "12",
       };
       // 鍙戣捣ws璇锋眰
       sendWebsocket(
@@ -625,9 +692,10 @@
     },
     // 鍙戦�佹柊娑堟伅瑙﹀彂
     handleSend(message, next, file) {
-      console.log(message, file);
+      console.log(message);
+      console.log(file);
       console.log(next);
-      this.requstWs();
+      this.requstWs(message, next, file);
       setTimeout(() => {
         next();
       }, 1000);
diff --git a/src/views/shortmessage/communication/lemon-message-voice.vue b/src/views/shortmessage/communication/lemon-message-voice.vue
deleted file mode 100644
index 1f91e54..0000000
--- a/src/views/shortmessage/communication/lemon-message-voice.vue
+++ /dev/null
@@ -1,35 +0,0 @@
-<script>
-export default {
-  name: "lemonMessageVoice",
-  inheritAttrs: false,
-  inject: ["IMUI"],
-  render() {
-    return (
-      <lemon-message-basic
-        class="lemon-message-voice"
-        props={{ ...this.$attrs }}
-        scopedSlots={{
-          content: (props) => {
-            return <span>{props.content}&nbsp;馃攬</span>;
-          },
-        }}
-      />
-    );
-  },
-};
-</script>
-<style lang="scss" scoped>
-.lemon-message.lemon-message-voice {
-  user-select: none;
-
-  .lemon-message__content {
-    border: 2px solid #000;
-    font-size: 12px;
-    cursor: pointer;
-
-    &::before {
-      display: none;
-    }
-  }
-}
-</style>
diff --git a/src/views/shortmessage/messagebank/compile/index.vue b/src/views/shortmessage/messagebank/compile/index.vue
new file mode 100644
index 0000000..bd742e1
--- /dev/null
+++ b/src/views/shortmessage/messagebank/compile/index.vue
@@ -0,0 +1,155 @@
+<template>
+  <div>
+    <div class="headline">
+      <div class="basics">闂閰嶇疆</div>
+      <div class="headbottom">
+        <el-button type="primary" icon="el-icon-notebook-2" @click="addzbiaofn"
+          >鍋ュ悍淇℃伅妯$増</el-button
+        >
+        <el-button @click="emptyfn" type="primary" icon="el-icon-refresh-right"
+          >娓呯┖鐭俊鍐呭</el-button
+        >
+      </div>
+    </div>
+    <div class="top-text">
+      <el-input
+        :rows="5"
+        placeholder="璇疯緭鍏ョ煭淇″唴瀹规垨鍒╃敤妯℃澘杩涜缂栬緫"
+        type="textarea"
+        v-model="form.desc"
+      ></el-input>
+    </div>
+    <div class="headline">
+      <div class="basics">
+        鎺ユ敹鐭俊鍙风爜<span>娉細鎵嬫満鍙风爜鐢ㄨ嫳鏂囩鍙� ';' 鍒嗛殧寮�锛�</span>
+      </div>
+      <div class="headbottom">
+        <el-button type="primary" icon="el-icon-phone" @click="selectphp"
+          >閫夋辰鍙风爜</el-button
+        >
+        <el-button
+          type="primary"
+          icon="el-icon-refresh-right
+"
+          >娓呯┖鍙风爜</el-button
+        >
+      </div>
+    </div>
+    <div class="top-text">
+      <el-input
+        :rows="5"
+        placeholder="璇疯緭鍏�"
+        type="textarea"
+        v-model="form.desc"
+      ></el-input>
+    </div>
+    <div class="headlinetwo">
+      <div class="basics">
+        <el-checkbox v-model="form.checked">棰勭害鍙戦��</el-checkbox>
+      </div>
+      <div class="headbottom">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-arrow-left"
+          @click="addzbiao"
+          >杩斿洖鐭俊鍒楄〃</el-button
+        >
+        <el-button type="success" plain icon="el-icon-position">鍙戦��</el-button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      optionvalue: "涓嶉渶瑕併�佹病鏈夈�佷笉鐭ラ亾",
+      form: {
+        name: "",
+        region: "",
+        date1: "",
+        date2: "",
+        delivery: false,
+        type: [],
+        resource: "",
+        desc: "",
+      },
+      deployList: [
+        {
+          id: 1,
+          name: "鏈�",
+          valuetop:
+            "(?!.*蹇榺.*涓峾.*娌�)^.*(鏄瘄鏈墊瀵箌鍋殀浣渱妫�|鏌澶嶈瘖|濂絴鍙傚姞|澶嶈瘖|鍘�(杩噟濂絴浜唡瀹寍鍖婚櫌)|鏉�(杩噟浜唡鍖婚櫌))|娌¢敊|瀵瑰憖|鍙兘|(宸茬粡|鏃�)鍘讳簡|寮�浜嗚嵂|鑵板甫|鍚婂甫|瑕佺殑|(?<!娌�)鏈夌殑|琛ㄥ甫,10;瑕�,5",
+        },
+        {
+          id: 2,
+          name: "涓嶇煡閬�",
+          valuetop:
+            "(涓峾娌璋亅楝紎鎬庝箞).*(鐥厊鍙兘|鐭ラ亾|浜嗚В|娓呮|鎳倈鏄庣櫧|纭|纭畾|鏅撳緱|鐭ユ檽|璁ゅ緱|璇嗗緱|鍗拌薄|鐔熸倝|璁皘浼殀鍏冲績|鍏虫敞|娉ㄦ剰|鍛婅瘔|閫氱煡|鍚�)",
+        },
+      ],
+    };
+  },
+
+  created() {},
+
+  methods: {
+    onSubmit() {
+      console.log("submit!");
+    },
+    deletei(index) {
+      console.log(index);
+      this.deployList.splice(index, 1);
+    },
+    addzbiao() {
+      this.$router.go(-1);
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.top-text {
+  margin: 15px;
+  margin-top: 0;
+  padding: 10px;
+  background: #f2f5fc;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+.basic {
+  height: 50px;
+  margin: 15px;
+  margin-bottom: 0;
+  padding: 0 20px 20px 20px;
+  line-height: 50px;
+  background: #92c5f0;
+}
+.headline {
+  display: flex;
+  height: 50px;
+  margin: 15px;
+  margin-bottom: 0;
+  padding: 0 20px 20px 20px;
+  line-height: 50px;
+  background: #92c5f0;
+  justify-content: space-between;
+  span {
+    margin-left: 20px;
+    color: #fa3a3a;
+    font-weight: 600;
+  }
+}
+.headlinetwo {
+  display: flex;
+  height: 50px;
+  margin: 15px;
+  margin-bottom: 0;
+  padding: 0 20px 20px 20px;
+  line-height: 50px;
+  justify-content: space-between;
+}
+</style>
diff --git a/src/views/shortmessage/messagebank/index.vue b/src/views/shortmessage/messagebank/index.vue
index 98fc3b7..cab0334 100644
--- a/src/views/shortmessage/messagebank/index.vue
+++ b/src/views/shortmessage/messagebank/index.vue
@@ -2,38 +2,49 @@
   <div class="Questionnairemanagement">
     <!-- 宸︿晶鏍� -->
     <div class="sidecolumn">
-      <div class="notebuttom"><i class="el-icon-chat-dot-square" />鍙戠煭淇�</div>
+      <div class="notebuttom" @click="handleAdd">
+        <i class="el-icon-chat-dot-square" />鍙戠煭淇�
+      </div>
+      <el-divider></el-divider>
       <div class="notestate">
         <div class="state-text">鐭俊鐘舵��</div>
-        <div class="state-line">
-          <div class="value-left">
-            <i class="el-icon-chat-dot-square" />鍏ㄩ儴
-          </div>
+        <div
+          :class="classestag == 1 ? 'state-lines' : 'state-line'"
+          @click="completefn"
+        >
+          <div class="value-left"><i class="el-icon-menu" />鍏ㄩ儴</div>
           <div class="quantityq">22</div>
         </div>
-        <div class="state-line">
+        <div
+          :class="classestag == 2 ? 'state-lines' : 'state-line'"
+          @click="succeedfn"
+        >
           <div class="value-left">
-            <i class="el-icon-chat-dot-square" />鍙戦�佹垚鍔�
+            <i class="el-icon-circle-check" />鍙戦�佹垚鍔�
           </div>
           <div class="quantitycg">22</div>
         </div>
-        <div class="state-line">
+        <div
+          :class="classestag == 3 ? 'state-lines' : 'state-line'"
+          @click="losefn"
+        >
           <div class="value-left">
-            <i class="el-icon-chat-dot-square" />鍙戦�佸け璐�
+            <i class="el-icon-warning-outline" />鍙戦�佸け璐�
           </div>
           <div class="quantitysb">22</div>
         </div>
-        <div class="state-line">
-          <div class="value-left">
-            <i class="el-icon-chat-dot-square" />寰呭彂閫�
-          </div>
+        <div
+          :class="classestag == 4 ? 'state-lines' : 'state-line'"
+          @click="awaitfn"
+        >
+          <div class="value-left"><i class="el-icon-s-help" />寰呭彂閫�</div>
           <div class="quantityd">22</div>
         </div>
       </div>
     </div>
     <!-- 鍙充晶鏁版嵁 -->
     <div class="leftvlue">
-      <div class="leftvlue-top">鐭俊璇︽儏</div>
+      <div class="leftvlue-top">鐭俊璇︽儏({{ total }})</div>
       <div class="leftvlue-bg">
         <el-row :gutter="20">
           <!--鐢ㄦ埛鏁版嵁-->
@@ -55,7 +66,7 @@
                   @keyup.enter.native="handleQuery"
                 />
               </el-form-item>
-              <el-form-item label="鍒涘缓鏃堕棿">
+              <el-form-item label="涓婁紶鏃ユ湡">
                 <el-date-picker
                   v-model="dateRange"
                   style="width: 240px"
@@ -148,63 +159,84 @@
                 prop="userId"
               />
               <el-table-column
-                label="涓绘棬"
+                label="鎵嬫満鍙风爜"
                 align="center"
                 key="userName"
                 prop="userName"
                 :show-overflow-tooltip="true"
               />
               <el-table-column
-                label="闂鏂囨湰"
+                label="绫诲瀷"
                 align="center"
                 key="nickName"
                 prop="nickName"
-                width="400"
                 :show-overflow-tooltip="true"
               />
 
               <el-table-column
-                label="闂璇煶"
+                label="鍙戦�佷汉"
                 align="center"
-                key="aphonenumber"
-                prop="aphonenumber"
-                width="400"
+                key="transmitleg"
+                prop="transmitleg"
               /><el-table-column
-                label="鍏宠仈鎸囨爣"
+                label="鎺ユ敹浜�"
                 align="center"
                 key="bphonenumber"
                 prop="bphonenumber"
                 width="120"
               />
               <el-table-column
-                label="鎸囨爣閫夐」"
+                label="涓婁紶鏃堕棿"
                 align="center"
-                key="bphonenumber"
-                prop="bphonenumber"
-                width="120"
-              />
-              <el-table-column
-                label="璇█"
-                align="center"
-                key="indicator"
-                prop="indicator"
-                width="120"
-              />
-              <el-table-column label="鏄惁鍚敤" align="center" key="status">
+                prop="createTime"
+                width="160"
+              >
                 <template slot-scope="scope">
-                  <el-switch
-                    v-model="scope.row.status"
-                    active-value="0"
-                    inactive-value="1"
-                    @change="handleStatusChange(scope.row)"
-                  ></el-switch>
+                  <span>{{ parseTime(scope.row.createTime) }}</span>
+                </template> </el-table-column
+              ><el-table-column
+                label="鍙戦�佹椂闂�"
+                align="center"
+                prop="createTime"
+                width="160"
+              >
+                <template slot-scope="scope">
+                  <span>{{ parseTime(scope.row.createTime) }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column
+                label="鍙戦�佸唴瀹�"
+                align="center"
+                key="sendvalue"
+                prop="sendvalue"
+                width="300"
+                :show-overflow-tooltip="true"
+              />
+              <el-table-column
+                label="鍙戦�佺姸鎬�"
+                align="center"
+                key="state"
+                prop="state"
+              >
+                <template slot-scope="scope">
+                  <div
+                    v-if="scope.row.state == 1"
+                    style="color: rgb(58, 250, 144)"
+                  >
+                    <i class="el-icon-check"></i>
+                  </div>
+                  <div
+                    v-else-if="scope.row.state == 2"
+                    style="color: rgb(250, 96, 58)"
+                  >
+                    <i class="el-icon-check"></i>
+                  </div>
                 </template>
               </el-table-column>
 
               <el-table-column
                 label="鎿嶄綔"
                 align="center"
-                width="200"
                 class-name="small-padding fixed-width"
               >
                 <template slot-scope="scope">
@@ -214,25 +246,7 @@
                     @click="handleUpdate(scope.row)"
                     v-hasPermi="['system:user:edit']"
                     ><span class="button-textxg"
-                      ><i class="el-icon-edit-outline"></i>淇敼</span
-                    ></el-button
-                  >
-                  <el-button
-                    size="medium"
-                    type="text"
-                    @click="compileUpdate(scope.row)"
-                    v-hasPermi="['system:user:edit']"
-                    ><span class="button-bji"
-                      ><i class="el-icon-edit"></i>缂栬緫鐭俊</span
-                    ></el-button
-                  >
-                  <el-button
-                    size="medium"
-                    type="text"
-                    @click="handleDelete(scope.row)"
-                    v-hasPermi="['system:user:remove']"
-                    ><span class="button-textsc"
-                      ><i class="el-icon-delete-solid"></i>鍒犻櫎</span
+                      ><i class="el-icon-edit-outline"></i>鍐嶆鍙戦��</span
                     ></el-button
                   >
                 </template>
@@ -466,7 +480,6 @@
   components: { Treeselect },
   data() {
     return {
-      topactiveName: "Local", //椤堕儴閫夋嫨
       // 閬僵灞�
       loading: false,
       // 閫変腑鏁扮粍
@@ -479,6 +492,7 @@
       showSearch: true,
       // 鎬绘潯鏁�
       total: 0,
+      classestag: 1, //绫诲埆鏍囪瘑
       namequestionnaire: "",
       haoquestionnaire: "",
       idds: "",
@@ -643,68 +657,9 @@
         console.log(this.userList);
       });
     },
-    // 娣诲姞銆佷慨鏀圭被鍒�
-    submitsidecolumn() {
-      if (this.amendtag) {
-        this.classifyform.tagcategoryid = this.idds;
-        // toamendtagcategory(this.addDateRange(this.classifyform)).then(
-        //   (response) => {
-        //     console.log(response);
-        //     this.gitclasify();
-        //   }
-        // );
-      } else {
-        // addtagcategory(this.addDateRange(this.classifyform)).then(
-        //   (response) => {
-        //     console.log(response);
-        //     this.gitclasify();
-        //   }
-        // );
-      }
-      this.classifyform = {
-        categoryname: "",
-      };
-      this.idds = "";
-      this.dialogFormVisible = false;
-    },
-    //鍒犻櫎鍒嗙被
-    deletefenlei(row) {
-      if (this.deleteVisible) {
-        // deletetagcategory(this.idds).then((response) => {
-        //   console.log(response);
-        //   this.gitclasify();
-        // });
-        this.deleteVisible = false;
-        this.idds = "";
-      } else {
-        this.deleteVisible = true;
-        this.idds = row.tagcategoryid;
-        this.deletefenl = row.title;
-      }
-    },
-    compileUpdate(row) {
-      this.$router.push({
-        path: "/repositoryai/verbaltrick/particulars/",
-        query: { id: "1" },
-      });
-    },
-    // 棰樼洰鐘舵�佷慨鏀�
-    handleStatusChange(row) {
-      let text = row.status === "0" ? "鍚敤" : "鍋滅敤";
-      this.$modal
-        .confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚楋紵')
-        .then(function () {
-          return changeUserStatus(row.userId, row.status);
-        })
-        .then(() => {
-          this.$modal.msgSuccess(text + "鎴愬姛");
-        })
-        .catch(function () {
-          row.status = row.status === "0" ? "1" : "0";
-        });
-    },
-    //鎼滅储绫诲埆
-    sidecolumnss() {},
+    // const { pageNum, pageSize, ...params } = this.queryParams;
+    submitsidecolumn() {},
+    deletefenlei() {},
     // 渚挎嵎鏍囩
     tsgnameto() {},
     // 鍒囨崲鍏变韩/鏈湴
@@ -754,9 +709,7 @@
     },
     /** 鏂板鎸夐挳鎿嶄綔 */
     handleAdd() {
-      this.reset();
-      this.title = "鏂板鐭俊";
-      this.indexopen = true;
+      this.$router.push("/shortmessage/messagebank/compile/");
     },
     /** 淇敼鎸夐挳鎿嶄綔 */
     handleUpdate(row) {
@@ -805,6 +758,22 @@
         })
         .catch(() => {});
     },
+    // 鍒囨崲鍏ㄩ儴绫诲埆
+    completefn() {
+      this.classestag = 1;
+    },
+    // 鍒囨崲鎴愬姛绫诲埆
+    succeedfn() {
+      this.classestag = 2;
+    },
+    // 鍒囨崲澶辫触绫诲埆
+    losefn() {
+      this.classestag = 3;
+    },
+    // 鍒囨崲寰呭彂閫佺被鍒�
+    awaitfn() {
+      this.classestag = 4;
+    },
   },
 };
 </script>
@@ -814,60 +783,95 @@
   display: flex;
 }
 .sidecolumn {
-  width: 300px;
+  width: 350px;
   min-height: 100vh;
   text-align: center;
   //   display: flex;
   margin-top: 20px;
   margin: 20px;
-  padding: 30px;
-  background: #edf1f7;
+  padding: 10px;
+  padding-top: 20px;
+  text-align: center;
+  background: #dfeffd;
   border: 1px solid #dcdfe6;
   -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
     0 0 6px 0 rgba(0, 0, 0, 0.04);
-  .sidecolumn-top {
-    display: flex;
-    justify-content: space-between;
-    .top-wj {
-      font-size: 20px;
+  .notebuttom {
+    height: 35px;
+    background: #85c046;
+    color: #ffff;
+    font-size: 20px;
+    line-height: 35px;
+    cursor: pointer;
+    border-radius: 3px;
+  }
+  .notestate {
+    font-size: 20px;
+    .state-text {
+      height: 40px;
     }
-    .top-tj {
-      font-size: 18px;
-
-      color: rgb(0, 89, 255);
+    .state-line {
+      display: flex;
+      height: 40px;
+      align-items: center;
+      padding: 10px 10px;
       cursor: pointer;
+      justify-content: space-between;
     }
-  }
-  .center-ss {
-    margin-top: 30px;
-    .input-with-select {
-      height: 40px !important;
+    .state-lines {
+      display: flex;
+      height: 40px;
+      align-items: center;
+      padding: 10px 10px;
+      background: #88abfc;
+      color: #fff;
+      cursor: pointer;
+      justify-content: space-between;
     }
-  }
-  .bottom-fl {
-    margin-top: 30px;
-    display: center !important;
+    .state-line:hover {
+      background: #88abfc;
+    }
+    .quantityq {
+      height: 30px;
+      line-height: 30px;
+      padding: 0 5px;
+      border-radius: 10px;
+      color: #fff;
+      background: #9eb8ff;
+    }
+    .quantitycg {
+      height: 30px;
+      line-height: 30px;
+      padding: 0 5px;
+      border-radius: 10px;
+      color: #fff;
+
+      background: #48cf2d;
+    }
+    .quantitysb {
+      height: 30px;
+      line-height: 30px;
+      padding: 0 5px;
+      border-radius: 10px;
+      color: #fff;
+
+      background: #ce513b;
+    }
+    .quantityd {
+      height: 30px;
+      line-height: 30px;
+      padding: 0 5px;
+      border-radius: 10px;
+      color: #fff;
+
+      background: #3fbff1;
+    }
   }
 }
-.qrcode-dialo {
-  text-align: center;
-  //   display: flex;
-  margin: 20px;
-  padding: 30px;
-  background: #edf1f7;
-  border: 1px solid #dcdfe6;
-  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
-    0 0 6px 0 rgba(0, 0, 0, 0.04);
-  .qrcode-text {
-    font-size: 20px;
-    span {
-      margin-left: 20px;
-    }
-  }
-  .qrcode-img {
-    width: 300px;
-    height: 400px;
-  }
+[class^="el-icon-"],
+[class*=" el-icon-"] {
+  font-weight: 600;
+  font-size: 20px;
 }
 .tsgname {
   width: 90px;
diff --git a/src/views/system/label/index.vue b/src/views/system/label/index.vue
index 2f291ed..513af3e 100644
--- a/src/views/system/label/index.vue
+++ b/src/views/system/label/index.vue
@@ -637,7 +637,7 @@
     // 鏍囩鐘舵�佷慨鏀�
     handleStatusChange(row) {
       console.log(row.isupload);
-      let text = row.isupload === "0" ? "鍚敤" : "鍋滅敤";
+      let text = row.isupload == 0 ? "鍋滅敤" : "鍚敤";
       this.$modal
         .confirm('纭瑕�"' + text + '""' + row.tagname + '"鏍囩鍚楋紵')
         .then(function () {
@@ -647,7 +647,7 @@
           this.$modal.msgSuccess(text + "鎴愬姛");
         })
         .catch(function () {
-          row.isupload = row.isupload === "0" ? "1" : "0";
+          row.isupload = row.isupload == 0 ? 1 : 0;
         });
     },
     /** 鎼滅储鎸夐挳鎿嶄綔 */
diff --git a/src/views/tool/module/Editinterface.vue b/src/views/tool/module/Editinterface.vue
new file mode 100644
index 0000000..25b51e6
--- /dev/null
+++ b/src/views/tool/module/Editinterface.vue
@@ -0,0 +1,255 @@
+<template>
+  <div class="Questionnairemanagement">
+    <!-- 宸︿晶鏍� -->
+    <div class="sidecolumn">
+      <el-input placeholder="杈撳叆鍏抽敭瀛楄繘琛岃繃婊�" v-model="filterText">
+      </el-input>
+
+      <el-tree
+        class="filter-tree"
+        :data="data"
+        :props="defaultProps"
+        default-expand-all
+        :filter-node-method="filterNode"
+        ref="tree"
+      >
+        <span class="custom-tree-node" slot-scope="{ node, data }">
+          <span>{{ node.label }}</span>
+          <span>
+            <el-button type="text" size="mini" @click="() => append(data)">
+              鏂板瀛愮骇
+            </el-button>
+            <el-button
+              type="text"
+              size="mini"
+              @click="() => remove(node, data)"
+            >
+              鍒犻櫎
+            </el-button>
+          </span>
+        </span>
+      </el-tree>
+    </div>
+    <!-- 涓儴鏁版嵁 -->
+    <div class="leftvlue">
+      <div class="compile" v-for="item in list">
+        <div class="compile-title">
+          {{ item.name }}: <span>{{ item.uapiurl }}</span>
+        </div>
+        <div class="compile-value">
+          <div class="compile-min" v-for="itea in item.value">
+            <div>
+              <el-input v-model="itea.value" placeholder="鍏ュ弬娉ㄨВ"></el-input>
+            </div>
+            <div>
+              <el-input v-model="itea.name" placeholder="鍏ュ弬鍚�"></el-input>
+            </div>
+            <div @click="drawer = true">灞曞紑涓嬬骇</div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <el-drawer
+      title="鎴戞槸浜岀骇"
+      direction="btt"
+      :visible.sync="drawer"
+      :with-header="false"
+    >
+      <div class="compile-value">
+        <div class="compile-min" v-for="itea in 6">
+          <div>
+            <el-input v-model="input" placeholder="鍏ュ弬娉ㄨВ"></el-input>
+          </div>
+          <div>
+            <el-input v-model="inputs" placeholder="鍏ュ弬鍚�"></el-input>
+          </div>
+        </div>
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+let id = 1000;
+export default {
+  name: "Editinterface",
+
+  watch: {
+    filterText(val) {
+      this.$refs.tree.filter(val);
+    },
+  },
+
+  data() {
+    const data = [
+      {
+        id: 1,
+        label: "鎮h�呮湇鍔′腑蹇�",
+        children: [
+          {
+            id: 4,
+            label: "鎮h�呭垪琛�",
+          },
+          {
+            id: 21,
+            label: "鎮h�呮湇鍔�",
+          },
+        ],
+      },
+      {
+        id: 2,
+        label: "涓�绾� 2",
+        children: [
+          {
+            id: 5,
+            label: "浜岀骇 2-1",
+          },
+          {
+            id: 6,
+            label: "浜岀骇 2-2",
+          },
+        ],
+      },
+      {
+        id: 3,
+        label: "涓�绾� 3",
+        children: [
+          {
+            id: 7,
+            label: "浜岀骇 3-1",
+          },
+          {
+            id: 8,
+            label: "浜岀骇 3-2",
+          },
+        ],
+      },
+    ];
+    return {
+      drawer: false,
+      input: "",
+      inputs: "",
+      // 鏌ヨ鍙傛暟
+      queryParams: {},
+      currentRow: null, //閫変腑琛屾暟鎹�
+      filterText: "",
+
+      data: JSON.parse(JSON.stringify(data)),
+      data: JSON.parse(JSON.stringify(data)),
+
+      defaultProps: {
+        children: "children",
+        label: "label",
+      },
+      list: [
+        {
+          id: "23",
+          name: "鑾峰彇鎮h�呭垪琛�",
+          uapiurl: "http://api",
+          value: [
+            { name: "children", value: "娉ㄨВ" },
+            { name: "childrenone", value: "娉ㄨВ涓�" },
+            { name: "childrentwo", value: "娉ㄨВ浜�" },
+            { name: "childrenthree", value: "娉ㄨВ涓�" },
+          ],
+        },
+        {
+          id: "13",
+          name: "鑾峰彇鎮h�呰鎯�",
+          uapiurl: "http://api/xqq",
+          value: [
+            { name: "children", value: "娉ㄨВ" },
+            { name: "childrenone", value: "娉ㄨВ涓�" },
+            { name: "childrentwo", value: "娉ㄨВ浜�" },
+            { name: "childrenthree", value: "娉ㄨВ涓�" },
+            { name: "childrenthree", value: "娉ㄨВ鍥�" },
+          ],
+        },
+      ],
+    };
+  },
+  watch: {},
+  created() {},
+
+  methods: {
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.label.indexOf(value) !== -1;
+    },
+    append(data) {
+      const newChild = { id: id++, label: "瀛愮骇", children: [] };
+      if (!data.children) {
+        this.$set(data, "children", []);
+      }
+      data.children.push(newChild);
+    },
+
+    remove(node, data) {
+      const parent = node.parent;
+      const children = parent.data.children || parent.data;
+      const index = children.findIndex((d) => d.id === data.id);
+      children.splice(index, 1);
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.Questionnairemanagement {
+  display: flex;
+}
+.sidecolumn {
+  width: 300px;
+  min-height: 100vh;
+  text-align: center;
+  //   display: flex;
+  margin-top: 20px;
+  margin: 20px;
+  padding: 10px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+::v-deep .sidecolumn .el-tree {
+  margin-top: 30px;
+  background: none;
+}
+
+.leftvlue {
+  //   display: flex;
+  //   flex: 1;
+  width: 80%;
+  margin-top: 20px;
+  //   margin: 20px;
+  padding: 30px;
+  background: #ffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .compile {
+    border: 1px solid #dcdfe6;
+    padding: 15px;
+    margin-top: 10px;
+  }
+}
+.compile-value {
+  display: flex;
+  margin-top: 10px;
+
+  .compile-min {
+    border: 1px solid #dcdfe6;
+    width: 150px;
+    div {
+      padding: 5px;
+      text-align: center;
+    }
+  }
+}
+.compile-min div:nth-child(3) {
+  padding: 0;
+  margin: 5px;
+  background: bisque;
+  border-radius: 3px;
+}
+</style>
diff --git a/src/views/tool/module/classifyone.vue b/src/views/tool/module/classifyone.vue
new file mode 100644
index 0000000..ee9e073
--- /dev/null
+++ b/src/views/tool/module/classifyone.vue
@@ -0,0 +1,631 @@
+<template>
+  <div class="Questionnairemanagement">
+    <!-- 宸︿晶鏍� -->
+    <div class="sidecolumn" v-if="Sidecontrol">
+      <div v-if="Typecontrol">
+        <div class="sidecolumn-top">
+          <div class="top-wj">绫诲瀷</div>
+          <div class="top-tj" @click="dialogFormVisible = true">+娣诲姞</div>
+        </div>
+        <div class="center-ss">
+          <el-input
+            placeholder="璇疯緭鍏ュ唴瀹�"
+            v-model="sidecolumnval"
+            class="input-with-select"
+            size="medium "
+          >
+            <el-button
+              @click="sidecolumnss"
+              slot="append"
+              icon="el-icon-search"
+            ></el-button>
+          </el-input>
+        </div>
+      </div>
+
+      <div class="bottom-fl">
+        <el-tabs tab-position="right">
+          <el-tab-pane :label="`鍏ㄩ儴 (${numberlb})`"></el-tab-pane>
+          <el-tab-pane
+            class="tab-paness"
+            :key="item.title"
+            v-for="(item, index) in editableTabs"
+          >
+            <span slot="label">
+              {{
+                item.title + " (" + item.number + ")"
+              }}&nbsp&nbsp&nbsp<el-popover
+                placement="top-start"
+                width="100"
+                trigger="hover"
+              >
+                <div style="text-align: center">
+                  <el-button type="text" @click="popoveramend(item)"
+                    >淇敼</el-button
+                  ><el-button type="text" @click="deletefenlei(item)"
+                    ><span style="color: rgb(173, 55, 55)"
+                      >鍒犻櫎</span
+                    ></el-button
+                  >
+                </div>
+                <i slot="reference" class="el-icon-share"></i> </el-popover
+            ></span>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+    </div>
+    <!-- 涓儴鏁版嵁 -->
+    <div class="leftvlue">
+      <div class="leftvlue-top" v-if="topactiveName">
+        <el-tabs v-model="topactiveName" @tab-click="tophandleClick">
+          <el-tab-pane name="Local">
+            <span class="mulsz" slot="label">鏈湴搴� </span>
+          </el-tab-pane>
+          <el-tab-pane name="sharing">
+            <span class="mulsz" slot="label">鍏变韩搴� </span>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+      <div class="leftvlue-bg">
+        <el-row :gutter="20">
+          <!--鐢ㄦ埛鏁版嵁-->
+          <el-col :span="24" :xs="24">
+            <el-form
+              :model="queryParams"
+              ref="queryForm"
+              size="small"
+              :inline="true"
+              v-show="showSearch"
+              label-width="98px"
+            >
+              <el-form-item label="鍚嶇О" prop="userName">
+                <el-input
+                  v-model="queryParams.userName"
+                  placeholder="璇疯緭鍏�"
+                  clearable
+                  style="width: 200px"
+                  @keyup.enter.native="handleQuery"
+                />
+              </el-form-item>
+              <el-form-item label="閫傜敤鐤剧梾" prop="status">
+                <el-cascader
+                  v-model="queryParams.status"
+                  :options="optionss"
+                  :props="propss"
+                  clearable
+                ></el-cascader>
+              </el-form-item>
+
+              <el-form-item>
+                <el-button
+                  type="primary"
+                  icon="el-icon-search"
+                  size="medium"
+                  @click="handleQuery"
+                  >鎼滅储</el-button
+                >
+                <el-button
+                  icon="el-icon-refresh"
+                  size="medium"
+                  @click="resetQuery"
+                  >閲嶇疆</el-button
+                >
+              </el-form-item>
+            </el-form>
+            <el-divider></el-divider>
+            <el-table
+              v-loading="loading"
+              :data="userList"
+              :border="true"
+              highlight-current-row
+              @selection-change="handleSelectionChange"
+              @current-change="handleCurrentChange"
+            >
+              <el-table-column type="selection" width="50" align="center" />
+              <el-table-column
+                label="搴忓彿"
+                align="center"
+                key="userid"
+                prop="userid"
+              />
+              <el-table-column
+                label="鍚嶇О"
+                align="center"
+                key="userName"
+                prop="userName"
+                :show-overflow-tooltip="true"
+              />
+              <el-table-column
+                label="鐗堟湰"
+                align="center"
+                key="nickName"
+                prop="nickName"
+                :show-overflow-tooltip="true"
+              />
+
+              <el-table-column
+                label="閫傜敤鐤剧梾"
+                align="center"
+                key="aphonenumber"
+                prop="aphonenumber"
+                width="120"
+              /><el-table-column
+                label="鎻忚堪"
+                align="center"
+                key="bphonenumber"
+                prop="bphonenumber"
+                width="120"
+              />
+              <el-table-column
+                label="鏈�杩戠紪杈�"
+                align="center"
+                key="cphonenumber"
+                prop="cphonenumber"
+                width="120"
+              />
+            </el-table>
+
+            <pagination
+              v-show="total > 0"
+              :total="total"
+              :page.sync="queryParams.pageNum"
+              :limit.sync="queryParams.pageSize"
+              @pagination="getList"
+            />
+          </el-col>
+        </el-row>
+
+        <!-- 娣诲姞鎴栦慨鏀归厤缃璇濇 -->
+        <el-dialog
+          :title="title"
+          :visible.sync="open"
+          width="900px"
+          append-to-body
+        >
+          <div slot="footer" class="dialog-footer">
+            <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+          </div>
+        </el-dialog>
+      </div>
+    </div>
+    <!-- 鍙充晶鏁版嵁 -->
+    <div class="sidecolumn">
+      <h3>鎿嶄綔</h3>
+      <div>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              plain
+              icon="el-icon-plus"
+              size="medium"
+              @click="handleAdd"
+              v-hasPermi="['system:user:add']"
+              >鏂板</el-button
+            >
+          </el-col>
+
+          <el-col :span="1.5">
+            <el-button
+              type="danger"
+              plain
+              icon="el-icon-delete"
+              size="medium"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['system:user:remove']"
+              >鍒犻櫎</el-button
+            >
+          </el-col>
+        </el-row>
+        <el-row :gutter="10">
+          <el-col :span="1.5">
+            <el-button
+              type="success"
+              plain
+              icon="el-icon-edit"
+              size="medium"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['system:user:remove']"
+              >淇敼</el-button
+            >
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              plain
+              icon="el-icon-share"
+              size="medium"
+              :disabled="single"
+              @click="ViewQuestionnaire"
+              v-hasPermi="['system:user:remove']"
+              >鏌ョ湅</el-button
+            >
+          </el-col>
+        </el-row>
+      </div>
+    </div>
+    <!-- 娣诲姞绫诲埆寮规 -->
+    <el-dialog
+      :title="amendtag ? '淇敼绫诲埆' : '鏂板绫诲埆'"
+      width="30%"
+      :visible.sync="dialogFormVisible"
+    >
+      <el-form :model="classifyform">
+        <el-form-item
+          :label="amendtag ? '璇疯緭鍏ユ柊鐨勭被鍒悕绉�' : '璇疯緭鍏ョ被鍒悕绉�'"
+        >
+          <el-input
+            v-model="classifyform.categoryname"
+            autocomplete="off"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogFormVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitsidecolumn">纭� 瀹�</el-button>
+      </div>
+    </el-dialog>
+    <!-- 鍒犻櫎绫诲埆纭妗� -->
+    <el-dialog title="璀﹀憡" :visible.sync="deleteVisible" width="40%">
+      <div style="font-size: 20px; color: rgb(247, 76, 76)">
+        鏄惁纭鍒犻櫎鍒嗙被锛歔<span>{{ deletefenl }}</span
+        >]?
+      </div>
+      <div style="font-size: 20px">
+        姝ゆ搷浣滀細灏嗚绫诲埆涓嬫墍鏈夋ā鍧楄浆绉昏嚦[鏈垎绫籡锛屾槸鍚︾户缁垹闄ゆ鍒嗙被锛�
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="deleteVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="deletefenlei">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listUser, delUser, addUser, updateUser } from "@/api/system/user";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+export default {
+  name: "questionnaire",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      topactiveName: "", //鎺у埗鍙充晶鏁版嵁椤堕儴tab灞曠ず
+      loading: false, //閬僵灞�
+      Typecontrol: true, //渚ц竟绫诲瀷灞曠ず鎺у埗
+      Sidecontrol: true, //渚ц竟鏍戝睍绀烘帶鍒�
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      //   鍗曚釜閫変腑
+      MultipleC: false,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鐢ㄦ埛琛ㄦ牸鏁版嵁
+
+      userList: [
+        {
+          userid: 1,
+          userName: "涓夊彿",
+          nickName: "1.2.4",
+          aphonenumber: "鍏宠妭鐐庣棁",
+          bphonenumber: "閲嶅害",
+          cphonenumber: "2022-12-12 ",
+        },
+        {
+          userid: 2,
+          userName: "涓�鍙�",
+          nickName: "1.2.4",
+          aphonenumber: "楂樿鍘�",
+          bphonenumber: "涓害",
+          cphonenumber: "2022-12-12 ",
+        },
+        {
+          userid: 3,
+          userName: "涓�鍙�",
+          nickName: "1.2.4",
+          aphonenumber: "楂樿鍘�",
+          bphonenumber: "涓害",
+          cphonenumber: "2022-12-12 ",
+        },
+      ],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      // 瑙掕壊閫夐」
+      roleOptions: [],
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      numberlb: 22,
+      numberlbs: 2,
+      sidecolumnform: {}, //娣诲姞绫诲埆琛ㄥ崟
+      sidecolumnval: "", //绫诲埆鎼滅储
+      propss: { multiple: true },
+      idds: "",
+      amendtag: false, //鏄惁淇敼绫诲埆
+      dialogFormVisible: false, //淇敼娣诲姞绫诲埆寮规
+      deleteVisible: false, //鍒嗙被鍒犻櫎寮规
+      deletefenl: "楂樿鍘�", //鍒犻櫎椤�
+      //绫诲埆琛ㄥ崟
+      classifyform: {
+        categoryname: "",
+      },
+      //   澶氶�夊垪琛�
+      optionss: [
+        {
+          value: 1,
+          label: "涓滃崡",
+        },
+        {
+          value: 2,
+          label: "瑗垮寳",
+        },
+        {
+          value: 3,
+          label: "浠ㄤ花浠�",
+        },
+        {
+          value: 4,
+          label: "鍏椋掗",
+        },
+      ],
+      //绫诲埆鍒楄〃
+      editableTabs: [
+        {
+          title: "鍒嗙被涓�",
+          number: "1",
+        },
+        {
+          title: "鍒嗙被浜�",
+          number: "2",
+        },
+        {
+          title: "鍒嗙被涓�",
+          number: "2",
+        },
+        {
+          title: "鍒嗙被鍥�",
+          number: "2",
+        },
+        {
+          title: "鍒嗙被浜�",
+          number: "2",
+        },
+      ],
+      // 鏌ヨ鍙傛暟
+      queryParams: {},
+      currentRow: null, //閫変腑琛屾暟鎹�
+    };
+  },
+  watch: {},
+  created() {
+    this.getList();
+  },
+
+  methods: {
+    /** 鏌ヨ鐢ㄦ埛鍒楄〃 */
+    getList() {
+      //   this.loading = true;
+      listUser().then((response) => {
+        console.log(response);
+        // this.userList = response.data;
+        // this.total = response.total;
+        // this.loading = false;
+        console.log(this.userList);
+      });
+      //   const { rows } = await listUser();
+      //   console.log(rows);
+      //   this.list = rows;
+    },
+    // 閫変腑琛岃Е鍙�
+    handleCurrentChange(val) {
+      this.currentRow = val;
+      console.log(val);
+    },
+    // 娣诲姞銆佷慨鏀圭被鍒�
+    submitsidecolumn() {
+      if (this.amendtag) {
+        this.classifyform.tagcategoryid = this.idds;
+        // toamendtagcategory(this.addDateRange(this.classifyform)).then(
+        //   (response) => {
+        //     console.log(response);
+        //     this.gitclasify();
+        //   }
+        // );
+      } else {
+        // addtagcategory(this.addDateRange(this.classifyform)).then(
+        //   (response) => {
+        //     console.log(response);
+        //     this.gitclasify();
+        //   }
+        // );
+      }
+      this.classifyform = {
+        categoryname: "",
+      };
+      this.idds = "";
+      this.dialogFormVisible = false;
+    },
+    //鍒犻櫎鍒嗙被
+    deletefenlei(row) {
+      if (this.deleteVisible) {
+        // deletetagcategory(this.idds).then((response) => {
+        //   console.log(response);
+        //   this.gitclasify();
+        // });
+        this.deleteVisible = false;
+        this.idds = "";
+      } else {
+        this.deleteVisible = true;
+        this.idds = row.tagcategoryid;
+        this.deletefenl = row.title;
+      }
+    },
+    //鎼滅储绫诲埆
+    sidecolumnss() {},
+    // 鍒囨崲鍏变韩/鏈湴
+    tophandleClick() {},
+    // 淇敼鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {};
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams.deptId = undefined;
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {},
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate() {},
+    // 鏌ョ湅
+    ViewQuestionnaire() {},
+    /** 鏇存柊/淇敼鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            // updateUser(this.form).then((response) => {
+            //   this.$modal.msgSuccess("淇敼鎴愬姛");
+            //   this.open = false;
+            //   this.getList();
+            // });
+          } else {
+            // addUser(this.form).then((response) => {
+            //   this.$modal.msgSuccess("鏂板鎴愬姛");
+            //   this.open = false;
+            //   this.getList();
+            // });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal
+        .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
+        .then(function () {
+          return delUser(userIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.Questionnairemanagement {
+  display: flex;
+}
+.sidecolumn {
+  width: 300px;
+  min-height: 100vh;
+  text-align: center;
+  //   display: flex;
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+
+.sidecolumn-top {
+  display: flex;
+  justify-content: space-between;
+  .top-wj {
+    font-size: 20px;
+  }
+  .top-tj {
+    font-size: 18px;
+
+    color: rgb(0, 89, 255);
+    cursor: pointer;
+  }
+}
+.center-ss {
+  margin-top: 30px;
+  .input-with-select {
+    height: 40px !important;
+  }
+}
+.bottom-fl {
+  margin-top: 30px;
+  display: center !important;
+}
+
+::v-deep.el-tabs--left,
+.el-tabs--right {
+  overflow: hidden;
+  align-items: center;
+  display: flex;
+}
+::v-deep.el-input--medium .el-input__inner {
+  height: 40px !important;
+}
+::v-deep.el-tabs--right .el-tabs__active-bar.is-right {
+  height: 40px;
+  width: 5px;
+  left: 0;
+}
+::v-deep.el-tabs--right .el-tabs__item.is-right {
+  display: block;
+  font-size: 20px;
+}
+.leftvlue {
+  //   display: flex;
+  //   flex: 1;
+  width: 80%;
+  margin-top: 20px;
+  //   margin: 20px;
+  padding: 30px;
+  background: #ffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .mulsz {
+    font-size: 20px;
+  }
+}
+</style>
diff --git a/src/views/tool/module/classifythreea.vue b/src/views/tool/module/classifythreea.vue
new file mode 100644
index 0000000..d1c60c1
--- /dev/null
+++ b/src/views/tool/module/classifythreea.vue
@@ -0,0 +1,792 @@
+<template>
+  <div class="Questionnairemanagement">
+    <!-- 宸︿晶鏍� -->
+    <div class="sidecolumn" v-if="Sidecontrol">
+      <div v-if="Typecontrol">
+        <div class="sidecolumn-top">
+          <div class="top-wj">绫诲瀷</div>
+          <div class="top-tj" @click="dialogFormVisible = true">+娣诲姞</div>
+        </div>
+        <div class="center-ss">
+          <el-input
+            placeholder="璇疯緭鍏ュ唴瀹�"
+            v-model="sidecolumnval"
+            class="input-with-select"
+            size="medium "
+          >
+            <el-button
+              @click="sidecolumnss"
+              slot="append"
+              icon="el-icon-search"
+            ></el-button>
+          </el-input>
+        </div>
+      </div>
+
+      <div class="bottom-fl">
+        <el-tabs tab-position="right">
+          <el-tab-pane :label="`鍏ㄩ儴 (${numberlb})`"></el-tab-pane>
+          <el-tab-pane
+            class="tab-paness"
+            :key="item.title"
+            v-for="(item, index) in editableTabs"
+          >
+            <span slot="label">
+              {{
+                item.title + " (" + item.number + ")"
+              }}&nbsp&nbsp&nbsp<el-popover
+                placement="top-start"
+                width="100"
+                trigger="hover"
+              >
+                <div style="text-align: center">
+                  <el-button type="text" @click="popoveramend(item)"
+                    >淇敼</el-button
+                  ><el-button type="text" @click="deletefenlei(item)"
+                    ><span style="color: rgb(173, 55, 55)"
+                      >鍒犻櫎</span
+                    ></el-button
+                  >
+                </div>
+                <i slot="reference" class="el-icon-share"></i> </el-popover
+            ></span>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+    </div>
+    <!-- 涓儴鏁版嵁 -->
+    <div class="leftvlue">
+      <div class="leftvlue-top" v-if="topactiveName">
+        <el-tabs v-model="topactiveName" @tab-click="tophandleClick">
+          <el-tab-pane name="Local">
+            <span class="mulsz" slot="label">鏈湴搴� </span>
+          </el-tab-pane>
+          <el-tab-pane name="sharing">
+            <span class="mulsz" slot="label">鍏变韩搴� </span>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+      <div class="leftvlue-bg">
+        <el-row :gutter="20">
+          <!--鐢ㄦ埛鏁版嵁-->
+          <el-col :span="24" :xs="24">
+            <el-form
+              :model="queryParams"
+              ref="queryForm"
+              size="small"
+              :inline="true"
+              v-show="showSearch"
+              label-width="98px"
+            >
+              <el-form-item label="鍚嶇О" prop="userName">
+                <el-input
+                  v-model="queryParams.userName"
+                  placeholder="璇疯緭鍏�"
+                  clearable
+                  style="width: 200px"
+                  @keyup.enter.native="handleQuery"
+                />
+              </el-form-item>
+              <el-form-item label="閫傜敤鐤剧梾" prop="status">
+                <el-cascader
+                  v-model="queryParams.status"
+                  :options="optionss"
+                  :props="propss"
+                  clearable
+                ></el-cascader>
+              </el-form-item>
+
+              <el-form-item>
+                <el-button
+                  type="primary"
+                  icon="el-icon-search"
+                  size="medium"
+                  @click="handleQuery"
+                  >鎼滅储</el-button
+                >
+                <el-button
+                  icon="el-icon-refresh"
+                  size="medium"
+                  @click="resetQuery"
+                  >閲嶇疆</el-button
+                >
+              </el-form-item>
+            </el-form>
+
+            <el-collapse v-model="activeNames">
+              <el-collapse-item title="涓�鍙疯〃鏍�" name="1">
+                <el-table
+                  v-loading="loading"
+                  :data="userList"
+                  ref="singone"
+                  :border="true"
+                  highlight-current-row
+                  @selection-change="handleSelectionChange"
+                  @current-change="handleCurrentChange"
+                >
+                  <el-table-column type="selection" width="50" align="center" />
+                  <el-table-column
+                    label="搴忓彿"
+                    align="center"
+                    key="userid"
+                    prop="userid"
+                  />
+                  <el-table-column
+                    label="鍚嶇О"
+                    align="center"
+                    key="userName"
+                    prop="userName"
+                    :show-overflow-tooltip="true"
+                  />
+                  <el-table-column
+                    label="鐗堟湰"
+                    align="center"
+                    key="nickName"
+                    prop="nickName"
+                    :show-overflow-tooltip="true"
+                  />
+
+                  <el-table-column
+                    label="閫傜敤鐤剧梾"
+                    align="center"
+                    key="aphonenumber"
+                    prop="aphonenumber"
+                    width="120"
+                  /><el-table-column
+                    label="鎻忚堪"
+                    align="center"
+                    key="bphonenumber"
+                    prop="bphonenumber"
+                    width="120"
+                  />
+                  <el-table-column
+                    label="鏈�杩戠紪杈�"
+                    align="center"
+                    key="cphonenumber"
+                    prop="cphonenumber"
+                    width="120"
+                  />
+                </el-table>
+                <pagination
+                  v-show="total > 0"
+                  :total="total"
+                  :page.sync="queryParams.pageNum"
+                  :limit.sync="queryParams.pageSize"
+                  @pagination="getList"
+                />
+              </el-collapse-item>
+              <el-collapse-item title="浜屽彿琛ㄦ牸" name="2">
+                <el-table
+                  v-loading="loading"
+                  ref="singtwo"
+                  :data="userListmax"
+                  :border="true"
+                  highlight-current-row
+                  @selection-change="handleSelectiontwo"
+                  @current-change="handleCurrenttwo"
+                >
+                  <el-table-column type="selection" width="50" align="center" />
+                  <el-table-column
+                    label="搴忓彿"
+                    align="center"
+                    key="userids"
+                    prop="userids"
+                  />
+                  <el-table-column
+                    label="鍚嶇О"
+                    align="center"
+                    key="userName"
+                    prop="userName"
+                    :show-overflow-tooltip="true"
+                  />
+                  <el-table-column
+                    label="鐗堟湰"
+                    align="center"
+                    key="nickName"
+                    prop="nickName"
+                    :show-overflow-tooltip="true"
+                  />
+
+                  <el-table-column
+                    label="閫傜敤鐤剧梾"
+                    align="center"
+                    key="aphonenumber"
+                    prop="aphonenumber"
+                    width="120"
+                  /><el-table-column
+                    label="鎻忚堪"
+                    align="center"
+                    key="bphonenumber"
+                    prop="bphonenumber"
+                    width="120"
+                  />
+                  <el-table-column
+                    label="鏈�杩戠紪杈�"
+                    align="center"
+                    key="cphonenumber"
+                    prop="cphonenumber"
+                    width="120"
+                  />
+                </el-table>
+                <pagination
+                  v-show="total > 0"
+                  :total="total"
+                  :page.sync="queryParams.pageNum"
+                  :limit.sync="queryParams.pageSize"
+                  @pagination="getList"
+                />
+              </el-collapse-item>
+            </el-collapse>
+          </el-col>
+        </el-row>
+
+        <!-- 娣诲姞鎴栦慨鏀归厤缃璇濇 -->
+        <el-dialog
+          :title="title"
+          :visible.sync="open"
+          width="900px"
+          append-to-body
+        >
+          <div slot="footer" class="dialog-footer">
+            <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+            <el-button @click="cancel">鍙� 娑�</el-button>
+          </div>
+        </el-dialog>
+      </div>
+    </div>
+    <!-- 鍙充晶鏁版嵁 -->
+    <div class="sidecolumn">
+      <h3>鎿嶄綔</h3>
+      <div>
+        <h5>涓�鍙疯〃</h5>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              plain
+              icon="el-icon-plus"
+              size="medium"
+              @click="handleAdd"
+              v-hasPermi="['system:user:add']"
+              >鏂板</el-button
+            >
+          </el-col>
+
+          <el-col :span="1.5">
+            <el-button
+              type="danger"
+              plain
+              icon="el-icon-delete"
+              size="medium"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['system:user:remove']"
+              >鍒犻櫎</el-button
+            >
+          </el-col>
+        </el-row>
+        <el-row :gutter="10">
+          <el-col :span="1.5">
+            <el-button
+              type="success"
+              plain
+              icon="el-icon-edit"
+              size="medium"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['system:user:remove']"
+              >淇敼</el-button
+            >
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              plain
+              icon="el-icon-share"
+              size="medium"
+              :disabled="single"
+              @click="ViewQuestionnaire"
+              v-hasPermi="['system:user:remove']"
+              >鏌ョ湅</el-button
+            >
+          </el-col>
+        </el-row>
+      </div>
+      <el-divider></el-divider>
+
+      
+      <div>
+        <h5>浜屽彿琛�</h5>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              plain
+              icon="el-icon-plus"
+              size="medium"
+              @click="handleAdd"
+              v-hasPermi="['system:user:add']"
+              >鏂板</el-button
+            >
+          </el-col>
+
+          <el-col :span="1.5">
+            <el-button
+              type="danger"
+              plain
+              icon="el-icon-delete"
+              size="medium"
+              :disabled="multipletwo"
+              @click="handleDelete"
+              v-hasPermi="['system:user:remove']"
+              >鍒犻櫎</el-button
+            >
+          </el-col>
+        </el-row>
+        <el-row :gutter="10">
+          <el-col :span="1.5">
+            <el-button
+              type="success"
+              plain
+              icon="el-icon-edit"
+              size="medium"
+              :disabled="singletwo"
+              @click="handleUpdate"
+              v-hasPermi="['system:user:remove']"
+              >淇敼</el-button
+            >
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              plain
+              icon="el-icon-share"
+              size="medium"
+              :disabled="singletwo"
+              @click="ViewQuestionnaire"
+              v-hasPermi="['system:user:remove']"
+              >鏌ョ湅</el-button
+            >
+          </el-col>
+        </el-row>
+      </div>
+    </div>
+    <!-- 娣诲姞绫诲埆寮规 -->
+    <el-dialog
+      :title="amendtag ? '淇敼绫诲埆' : '鏂板绫诲埆'"
+      width="30%"
+      :visible.sync="dialogFormVisible"
+    >
+      <el-form :model="classifyform">
+        <el-form-item
+          :label="amendtag ? '璇疯緭鍏ユ柊鐨勭被鍒悕绉�' : '璇疯緭鍏ョ被鍒悕绉�'"
+        >
+          <el-input
+            v-model="classifyform.categoryname"
+            autocomplete="off"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogFormVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitsidecolumn">纭� 瀹�</el-button>
+      </div>
+    </el-dialog>
+    <!-- 鍒犻櫎绫诲埆纭妗� -->
+    <el-dialog title="璀﹀憡" :visible.sync="deleteVisible" width="40%">
+      <div style="font-size: 20px; color: rgb(247, 76, 76)">
+        鏄惁纭鍒犻櫎鍒嗙被锛歔<span>{{ deletefenl }}</span
+        >]?
+      </div>
+      <div style="font-size: 20px">
+        姝ゆ搷浣滀細灏嗚绫诲埆涓嬫墍鏈夋ā鍧楄浆绉昏嚦[鏈垎绫籡锛屾槸鍚︾户缁垹闄ゆ鍒嗙被锛�
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="deleteVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="deletefenlei">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listUser, delUser, addUser, updateUser } from "@/api/system/user";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+export default {
+  name: "questionnaire",
+  dicts: ["sys_normal_disable", "sys_user_sex"],
+  components: { Treeselect },
+  data() {
+    return {
+      topactiveName: "", //鎺у埗鍙充晶鏁版嵁椤堕儴tab灞曠ず
+      loading: false, //閬僵灞�
+      Typecontrol: true, //渚ц竟绫诲瀷灞曠ず鎺у埗
+      Sidecontrol: true, //渚ц竟鏍戝睍绀烘帶鍒�
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      singletwo: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      multipletwo: true,
+
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 2,
+      activeNames: ["1", "2"],
+      // 鐢ㄦ埛琛ㄦ牸鏁版嵁
+      userList: [
+        {
+          userid: 1,
+          userName: "涓夊彿",
+          nickName: "1.2.4",
+          aphonenumber: "鍏宠妭鐐庣棁",
+          bphonenumber: "閲嶅害",
+          cphonenumber: "2022-12-12 ",
+        },
+        {
+          userid: 2,
+          userName: "涓�鍙�",
+          nickName: "1.2.4",
+          aphonenumber: "楂樿鍘�",
+          bphonenumber: "涓害",
+          cphonenumber: "2022-12-12 ",
+        },
+      ],
+      userListmax: [
+        {
+          userids: 1,
+          userName: "涓夊彿",
+          nickName: "1.2.4",
+          aphonenumber: "鍏宠妭鐐庣棁",
+          bphonenumber: "閲嶅害",
+          cphonenumber: "2022-12-12 ",
+        },
+        {
+          userids: 2,
+          userName: "涓�鍙�",
+          nickName: "1.2.4",
+          aphonenumber: "楂樿鍘�",
+          bphonenumber: "涓害",
+          cphonenumber: "2022-12-12 ",
+        },
+        {
+          userids: 2,
+          userName: "涓�鍙�",
+          nickName: "1.2.4",
+          aphonenumber: "楂樿鍘�",
+          bphonenumber: "涓害",
+          cphonenumber: "2022-12-12 ",
+        },
+      ],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      // 瑙掕壊閫夐」
+      roleOptions: [],
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      numberlb: 22,
+      numberlbs: 2,
+      sidecolumnform: {}, //娣诲姞绫诲埆琛ㄥ崟
+      sidecolumnval: "", //绫诲埆鎼滅储
+      propss: { multiple: true },
+      idds: "",
+      amendtag: false, //鏄惁淇敼绫诲埆
+      dialogFormVisible: false, //淇敼娣诲姞绫诲埆寮规
+      deleteVisible: false, //鍒嗙被鍒犻櫎寮规
+      deletefenl: "楂樿鍘�", //鍒犻櫎椤�
+      //绫诲埆琛ㄥ崟
+      classifyform: {
+        categoryname: "",
+      },
+      //   澶氶�夊垪琛�
+      optionss: [
+        {
+          value: 1,
+          label: "涓滃崡",
+        },
+        {
+          value: 2,
+          label: "瑗垮寳",
+        },
+        {
+          value: 3,
+          label: "浠ㄤ花浠�",
+        },
+        {
+          value: 4,
+          label: "鍏椋掗",
+        },
+      ],
+      //绫诲埆鍒楄〃
+      editableTabs: [
+        {
+          title: "鍒嗙被涓�",
+          number: "1",
+        },
+        {
+          title: "鍒嗙被浜�",
+          number: "2",
+        },
+        {
+          title: "鍒嗙被涓�",
+          number: "2",
+        },
+        {
+          title: "鍒嗙被鍥�",
+          number: "2",
+        },
+        {
+          title: "鍒嗙被浜�",
+          number: "2",
+        },
+      ],
+      // 鏌ヨ鍙傛暟
+      queryParams: {},
+      currentRow: null, //閫変腑琛屾暟鎹�
+    };
+  },
+  watch: {},
+  created() {
+    this.getList();
+  },
+
+  methods: {
+    /** 鏌ヨ鐢ㄦ埛鍒楄〃 */
+    getList() {
+      //   this.loading = true;
+      listUser().then((response) => {
+        console.log(response);
+        // this.userList = response.data;
+        // this.total = response.total;
+        // this.loading = false;
+        console.log(this.userList);
+      });
+      //   const { rows } = await listUser();
+      //   console.log(rows);
+      //   this.list = rows;
+    },
+    // 涓�鍙疯〃閫変腑琛岃Е鍙�
+    handleCurrentChange(val) {
+      this.currentRow = val;
+      this.single = false;
+      this.multiple = false;
+      //   娓呴櫎闈炲綋鍓嶈〃鍗曢�変腑鐘舵��
+
+      // this.$refs.singtwo.setCurrentRow();
+      console.log(this.currentRow);
+
+      console.log(val);
+    },
+    handleCurrenttwo(val) {
+      this.currentRow = val;
+      this.singletwo = false;
+      this.multipletwo = false;
+      //   娓呴櫎闈炲綋鍓嶈〃鍗曢�変腑鐘舵��
+
+      // this.$refs.singone.setCurrentRow();
+      console.log(this.currentRow);
+      console.log(val);
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    handleSelectiontwo(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.singletwo = selection.length != 1;
+      this.multipletwo = !selection.length;
+    },
+
+    // 娣诲姞銆佷慨鏀圭被鍒�
+    submitsidecolumn() {
+      if (this.amendtag) {
+        this.classifyform.tagcategoryid = this.idds;
+        // toamendtagcategory(this.addDateRange(this.classifyform)).then(
+        //   (response) => {
+        //     console.log(response);
+        //     this.gitclasify();
+        //   }
+        // );
+      } else {
+        // addtagcategory(this.addDateRange(this.classifyform)).then(
+        //   (response) => {
+        //     console.log(response);
+        //     this.gitclasify();
+        //   }
+        // );
+      }
+      this.classifyform = {
+        categoryname: "",
+      };
+      this.idds = "";
+      this.dialogFormVisible = false;
+    },
+    //鍒犻櫎鍒嗙被
+    deletefenlei(row) {
+      if (this.deleteVisible) {
+        // deletetagcategory(this.idds).then((response) => {
+        //   console.log(response);
+        //   this.gitclasify();
+        // });
+        this.deleteVisible = false;
+        this.idds = "";
+      } else {
+        this.deleteVisible = true;
+        this.idds = row.tagcategoryid;
+        this.deletefenl = row.title;
+      }
+    },
+    //鎼滅储绫诲埆
+    sidecolumnss() {},
+    // 鍒囨崲鍏变韩/鏈湴
+    tophandleClick() {},
+    // 淇敼鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {};
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.queryParams.deptId = undefined;
+      this.$refs.tree.setCurrentKey(null);
+      this.handleQuery();
+    },
+
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {},
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate() {},
+    // 鏌ョ湅
+    ViewQuestionnaire() {},
+    /** 鏇存柊/淇敼鎻愪氦鎸夐挳 */
+    submitForm() {},
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal
+        .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
+        .then(function () {
+          return delUser(userIds);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.Questionnairemanagement {
+  display: flex;
+}
+.sidecolumn {
+  width: 300px;
+  min-height: 100vh;
+  text-align: center;
+  //   display: flex;
+  margin-top: 20px;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+
+.sidecolumn-top {
+  display: flex;
+  justify-content: space-between;
+  .top-wj {
+    font-size: 20px;
+  }
+  .top-tj {
+    font-size: 18px;
+
+    color: rgb(0, 89, 255);
+    cursor: pointer;
+  }
+}
+.center-ss {
+  margin-top: 30px;
+  .input-with-select {
+    height: 40px !important;
+  }
+}
+.bottom-fl {
+  margin-top: 30px;
+  display: center !important;
+}
+
+::v-deep.el-tabs--left,
+.el-tabs--right {
+  overflow: hidden;
+  align-items: center;
+  display: flex;
+}
+::v-deep.el-input--medium .el-input__inner {
+  height: 40px !important;
+}
+::v-deep.el-tabs--right .el-tabs__active-bar.is-right {
+  height: 40px;
+  width: 5px;
+  left: 0;
+}
+::v-deep.el-tabs--right .el-tabs__item.is-right {
+  display: block;
+  font-size: 20px;
+}
+.leftvlue {
+  //   display: flex;
+  //   flex: 1;
+  width: 80%;
+  margin-top: 20px;
+  //   margin: 20px;
+  padding: 30px;
+  background: #ffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .mulsz {
+    font-size: 20px;
+  }
+}
+.button-text {
+  color: rgb(70, 204, 238);
+}
+.button-textck {
+  color: rgb(39, 167, 67);
+}
+.button-textxg {
+  color: rgb(35, 81, 233);
+}
+.button-textsc {
+  color: rgb(235, 23, 23);
+}
+</style>
diff --git a/src/views/tool/module/classifytwo.vue b/src/views/tool/module/classifytwo.vue
new file mode 100644
index 0000000..2b02583
--- /dev/null
+++ b/src/views/tool/module/classifytwo.vue
@@ -0,0 +1,177 @@
+<template>
+  <div class="Questionnairemanagement">
+    <!-- 宸︿晶鏍� -->
+    <div class="sidecolumn">
+      <div style="height: 400px">
+        <el-steps direction="vertical" :active="Editprogress">
+          <el-step title="绗竴姝�"></el-step>
+          <el-step title="绗簩姝�"></el-step>
+          <el-step
+            title="绗笁姝�"
+            description="杩欐槸涓�娈靛緢闀垮緢闀垮緢闀跨殑鎻忚堪鎬ф枃瀛�"
+          ></el-step>
+          <el-step
+            title="绗洓閮�"
+            description="杩欐槸涓�娈靛緢闀垮緢闀垮緢闀跨殑鎻忚堪鎬ф枃瀛�"
+          ></el-step>
+        </el-steps>
+      </div>
+    </div>
+    <!-- 鍙充晶鏁版嵁 -->
+    <div class="leftvlue">
+      <!-- 鍩烘湰淇℃伅 -->
+      <div v-if="Editprogress == 1">
+        <div class="leftvlue-jbxx">绗竴閮ㄥ垎</div>
+        <el-button type="success" @click="submitForm('ruleForm')"
+          >涓嬩竴姝�</el-button
+        >
+        <el-button @click="resetForm('ruleForm')">閲嶇疆</el-button>
+      </div>
+      <!-- 闂嵎璁剧疆 -->
+      <div v-if="Editprogress == 2">
+        <div class="leftvlue-jbxx">绗簩閮ㄥ垎</div>
+        <el-button type="success" @click="submitForm('ruleForm')"
+          >涓嬩竴姝�</el-button
+        >
+        <el-button type="primary" @click="laststep()">涓婁竴姝�</el-button>
+        <el-button @click="resetForm('ruleForm')">閲嶇疆</el-button>
+      </div>
+      <!-- 闂嵎棰勮 -->
+      <div v-if="Editprogress == 3">
+        <div class="leftvlue-jbxx">绗笁閮ㄥ垎</div>
+        <el-button type="success" @click="submitForm('ruleForm')"
+          >涓嬩竴姝�</el-button
+        >
+        <el-button type="primary" @click="laststep()">涓婁竴姝�</el-button>
+        <!-- <el-button @click="resetForm('ruleForm')">閲嶇疆</el-button> -->
+      </div>
+      <!-- 缁撴灉鍙嶉 -->
+      <div v-if="Editprogress == 4">
+        <div class="leftvlue-jbxx">绗洓閮ㄥ垎</div>
+        <el-button type="success" @click="submitForm('ruleForm')"
+          >绔嬪嵆鍒涘缓</el-button
+        >
+        <el-button type="primary" @click="laststep()">涓婁竴姝�</el-button>
+        <el-button @click="resetForm('ruleForm')">閲嶇疆</el-button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      Editprogress: 1, //缂栬緫杩涘害
+      loading: false, // 閬僵灞�
+    };
+  },
+
+  created() {},
+
+  methods: {
+    // 涓嬩竴姝�
+    submitForm(formName) {
+      if (this.Editprogress <= 3) {
+        return this.Editprogress++;
+      }
+      // 鎻愪氦
+      // this.$refs[formName].validate((valid, object) => {
+      //   if (valid) {
+      //     alert("submit!");
+      //   } else {
+      //     console.log("error submit!!", object);
+      //     return false;
+      //   }
+      // });
+    },
+    // 涓婁竴姝�
+    laststep() {
+      this.Editprogress--;
+    },
+    // 鎻愪氦琛ㄥ崟
+    resetForm(formName) {
+      this.$refs[formName].resetFields();
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.Questionnairemanagement {
+  display: flex;
+}
+.sidecolumn {
+  width: 300px;
+  min-height: 100vh;
+  text-align: center;
+  //   display: flex;
+  //   margin-top: 20px;
+  margin: 20px;
+  margin-bottom: 0;
+  padding: 30px;
+  background: #edf1f7;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+.leftvlue {
+  //   display: flex;
+  //   flex: 1;
+  width: 80%;
+  margin-top: 20px;
+  //   margin: 20px;
+  padding: 30px;
+  background: #ffff;
+  border: 1px solid #dcdfe6;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+  .leftvlue-jbxx {
+    margin-bottom: 50px;
+    font-size: 20px;
+    span {
+      position: absolute;
+      right: 80px;
+    }
+  }
+}
+::v-deep .addtopic-input {
+  input {
+    background: #02a7f0;
+    color: #edf1f7;
+    width: 150px;
+  }
+}
+::v-deep.el-step.is-vertical .el-step__title {
+  font-size: 25px;
+}
+::v-deep.el-input--medium {
+  font-size: 24px !important;
+}
+::v-deep.ruleFormaa.el-select {
+  display: inline-block;
+  position: relative;
+  width: 700px;
+}
+.el-select__tags {
+  font-size: 20px;
+  max-width: 888px !important;
+}
+::v-deep.el-radio__inner {
+  width: 22px;
+  height: 22px;
+}
+// ::v-deep.topic-dev.el-radio__label {
+//   font-size: 24px;
+// }
+::v-deep.el-radio-group {
+  span {
+    font-size: 24px;
+  }
+}
+::v-deep.el-checkbox-group {
+  span {
+    font-size: 24px;
+  }
+}
+</style>
diff --git a/src/websocket/lemon-message-voice.vue b/src/websocket/lemon-message-voice.vue
new file mode 100644
index 0000000..da978a9
--- /dev/null
+++ b/src/websocket/lemon-message-voice.vue
@@ -0,0 +1,31 @@
+<script>
+export default {
+  name: "lemonMessageVoice",
+  inheritAttrs: false,
+  inject: ["IMUI"],
+  render(h) {
+    return h("lemon-message-basic", {
+      class: "lemon-message-voice",
+      props: { ...this.$attrs, avatar: "default-avatar-url" }, // Provide a default value for avatar
+      scopedSlots: {
+        content: (props) => {
+          return h("span", [props.content, "\u00A0馃攬"]);
+        },
+      },
+    });
+  },
+};
+</script>
+<style lang="scss">
+.lemon-message.lemon-message-voice {
+  user-select: none;
+  .lemon-message__content {
+    border: 2px solid #000;
+    font-size: 12px;
+    cursor: pointer;
+    &::before {
+      display: none;
+    }
+  }
+}
+</style>
diff --git a/src/websocket/websocket.js b/src/websocket/websocket.js
index d7090e8..a7e337b 100644
--- a/src/websocket/websocket.js
+++ b/src/websocket/websocket.js
@@ -16,13 +16,13 @@
  * 鍙戣捣websocket杩炴帴
  * @param {Object} agentData 闇�瑕佸悜鍚庡彴浼犻�掔殑鍙傛暟鏁版嵁
  */
-function websocketSend (agentData) {
+export function websocketSend (agentData) {
   // 鍔犲欢杩熸槸涓轰簡灏介噺璁﹚s杩炴帴鐘舵�佸彉涓篛PEN   
   setTimeout(() => { 
     // 娣诲姞鐘舵�佸垽鏂紝褰撲负OPEN鏃讹紝鍙戦�佹秷鎭�
     if (websock.readyState === websock.OPEN) { // websock.OPEN = 1 
       // 鍙戠粰鍚庣鐨勬暟鎹渶瑕佸瓧绗︿覆鍖�
-      websock.send(JSON.stringify(agentData))
+      websock.send(agentData)
       console.log('杩炴帴鎴愬姛');
     }
     if (websock.readyState === websock.CLOSED) { // websock.CLOSED = 3 
diff --git a/vue.config.js b/vue.config.js
index 311eeab..ce7adcf 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -37,6 +37,7 @@
       [process.env.VUE_APP_BASE_API]: {
         target1: `http://192.168.1.4:8080`,
         target: `http://192.168.1.4:8080`,
+        // target: `http://www.hxsoft.com:8080`,
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API]: ''
@@ -129,7 +130,7 @@
           config.optimization.runtimeChunk('single'),
           {
              from: path.resolve(__dirname, './public/robots.txt'), //闃茬埇铏枃浠�
-             to: './' //鍒版牴鐩綍涓�
+             to: '/' //鍒版牴鐩綍涓�
           }
         }
       )

--
Gitblit v1.9.3