WXL
2024-12-23 ae117f01461f05a0bf249e6f63b636f4222ec8d7
测试完成
已删除4个文件
已添加1个文件
已修改15个文件
1793 ■■■■■ 文件已修改
dist (2).zip 补丁 | 查看 | 原始文档 | blame | 历史
dist (3).zip 补丁 | 查看 | 原始文档 | blame | 历史
dist.zip 补丁 | 查看 | 原始文档 | blame | 历史
external.zip 补丁 | 查看 | 原始文档 | blame | 历史
interior.zip 补丁 | 查看 | 原始文档 | blame | 历史
src/api/AiCentre/external.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/request.js 239 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/knowledge/education/index copy.vue 1239 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/knowledge/education/index.vue 238 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/outsideChain.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/outsideChainxj.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/outsideChainxjnew.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/patient/behospitalized.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/patient/hospital.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/patient/outpatient.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/propaganda/QuestionnaireTask.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/propaganda/particty.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/repositoryai/templateku/configurat/index.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/sfstatistics/percentage/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dist (2).zip
Binary files differ
dist (3).zip
Binary files differ
dist.zip
Binary files differ
external.zip
Binary files differ
interior.zip
Binary files differ
src/api/AiCentre/external.js
@@ -3,7 +3,7 @@
// å¤–链获取随访
export function getExternalfollowup(data) {
  return request({
    url: "/servicetask/getScriptInfoByCondition",
    url: "/smartor/servicetask/getScriptInfoByCondition",
    // url: "/servicetask/getScriptInfoByCondition",
    method: "post",
    data: data
@@ -17,20 +17,12 @@
    params: {param:id}
  });
}
// æäº¤ã€éšè®¿
export function SetsaveQuestionAnswer(data) {
  return request({
    // url: "/ivrtaskcalldetail/saveQuestionAnswer",
    url: "/serviceSubtask/saveQuestionAnswer",
    method: "post",
    data: data
  });
}
// ç¼“存问卷
export function Cachequestionnaire(data) {
  return request({
    url: "/subtaskAnswer/saveQuestionCache",
    url: "/smartor/subtaskAnswer/saveQuestionCache",
    method: "post",
    data: data
  });
@@ -38,7 +30,7 @@
// æ‹¿ç¼“存问卷
export function getCachequestionnaire(data) {
  return request({
    url: "/subtaskAnswer/getQuestionCache",
    url: "/smartor/subtaskAnswer/getQuestionCache",
    method: "post",
    data: data
  });
@@ -46,13 +38,13 @@
// æäº¤é—®å·
export function Submitaquestionnaire(data) {
  return request({
    url: "/subtaskAnswer/saveQuestionAnswer",
    url: "/smartor/subtaskAnswer/saveQuestionAnswer",
    method: "post",
    data: data
  });
}
// æäº¤é—®å·
// æäº¤é—®å·(内)
export function getsearchrResult(data) {
  return request({
    url: "/subtaskAnswer/selectPatQuestionResult",
src/utils/request.js
@@ -1,109 +1,140 @@
import axios from 'axios'
import { Notification, MessageBox, Message, Loading } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import axios from "axios";
import { Notification, MessageBox, Message, Loading } from "element-ui";
import store from "@/store";
import { getToken } from "@/utils/auth";
import errorCode from "@/utils/errorCode";
import { tansParams, blobValidate } from "@/utils/ruoyi";
import cache from '@/plugins/cache'
import { saveAs } from 'file-saver'
import cache from "@/plugins/cache";
import { saveAs } from "file-saver";
let downloadLoadingInstance;
// æ˜¯å¦æ˜¾ç¤ºé‡æ–°ç™»å½•
export let isRelogin = { show: false };
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";
// åˆ›å»ºaxios实例
const service = axios.create({
  // axios中请求配置有baseURL选项,表示请求URL公共部分
  baseURL: process.env.VUE_APP_BASE_API,
  // è¶…æ—¶
  timeout: 10000
})
  timeout: 10000,
});
// request拦截器
service.interceptors.request.use(config => {
  // æ˜¯å¦éœ€è¦è®¾ç½® token
  const isToken = (config.headers || {}).isToken === false
  // æ˜¯å¦éœ€è¦é˜²æ­¢æ•°æ®é‡å¤æäº¤
  const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
  if (getToken() && !isToken) {
    config.headers['Authorization'] = 'Bearer ' + getToken() // è®©æ¯ä¸ªè¯·æ±‚携带自定义token è¯·æ ¹æ®å®žé™…情况自行修改
  }
  // get请求映射params参数
  if (config.method === 'get' && config.params) {
    let url = config.url + '?' + tansParams(config.params);
    url = url.slice(0, -1);
    config.params = {};
    config.url = url;
  }
  if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
    const requestObj = {
      url: config.url,
      data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
      time: new Date().getTime()
service.interceptors.request.use(
  (config) => {
    // æ˜¯å¦éœ€è¦è®¾ç½® token
    const isToken = (config.headers || {}).isToken === false;
    // æ˜¯å¦éœ€è¦é˜²æ­¢æ•°æ®é‡å¤æäº¤
    const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
    if (getToken() && !isToken) {
      config.headers["Authorization"] = "Bearer " + getToken(); // è®©æ¯ä¸ªè¯·æ±‚携带自定义token è¯·æ ¹æ®å®žé™…情况自行修改
    }
    const sessionObj = cache.session.getJSON('sessionObj')
    if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
      cache.session.setJSON('sessionObj', requestObj)
    } else {
      const s_url = sessionObj.url;                  // è¯·æ±‚地址
      const s_data = sessionObj.data;                // è¯·æ±‚数据
      const s_time = sessionObj.time;                // è¯·æ±‚æ—¶é—´
      const interval = 1;                         // é—´é𔿗¶é—´(ms),小于此时间视为重复提交
      if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
        const message = '数据正在处理,请勿重复提交';
        console.warn(`[${s_url}]: ` + message)
        return Promise.reject(message)
        // return Promise.reject(new Error(message))
    // get请求映射params参数
    if (config.method === "get" && config.params) {
      let url = config.url + "?" + tansParams(config.params);
      url = url.slice(0, -1);
      config.params = {};
      config.url = url;
    }
    if (
      !isRepeatSubmit &&
      (config.method === "post" || config.method === "put")
    ) {
      const requestObj = {
        url: config.url,
        data:
          typeof config.data === "object"
            ? JSON.stringify(config.data)
            : config.data,
        time: new Date().getTime(),
      };
      const sessionObj = cache.session.getJSON("sessionObj");
      if (
        sessionObj === undefined ||
        sessionObj === null ||
        sessionObj === ""
      ) {
        cache.session.setJSON("sessionObj", requestObj);
      } else {
        cache.session.setJSON('sessionObj', requestObj)
        const s_url = sessionObj.url; // è¯·æ±‚地址
        const s_data = sessionObj.data; // è¯·æ±‚数据
        const s_time = sessionObj.time; // è¯·æ±‚æ—¶é—´
        const interval = 1; // é—´é𔿗¶é—´(ms),小于此时间视为重复提交
        if (
          s_data === requestObj.data &&
          requestObj.time - s_time < interval &&
          s_url === requestObj.url
        ) {
          const message = "数据正在处理,请勿重复提交";
          console.warn(`[${s_url}]: ` + message);
          return Promise.reject(message);
          // return Promise.reject(new Error(message))
        } else {
          cache.session.setJSON("sessionObj", requestObj);
        }
      }
    }
    return config;
  },
  (error) => {
    console.log(error);
    Promise.reject(error);
  }
  return config
}, error => {
    console.log(error)
    Promise.reject(error)
})
);
// å“åº”拦截器
service.interceptors.response.use(res => {
service.interceptors.response.use(
  (res) => {
    // æœªè®¾ç½®çŠ¶æ€ç åˆ™é»˜è®¤æˆåŠŸçŠ¶æ€
    const code = res.data.code || 200;
    // èŽ·å–é”™è¯¯ä¿¡æ¯
    const msg = errorCode[code] || res.data.msg || errorCode['default']
    const msg = errorCode[code] || res.data.msg || errorCode["default"];
    // äºŒè¿›åˆ¶æ•°æ®åˆ™ç›´æŽ¥è¿”回
    if(res.request.responseType ===  'blob' || res.request.responseType ===  'arraybuffer'){
      return res.data
    if (
      res.request.responseType === "blob" ||
      res.request.responseType === "arraybuffer"
    ) {
      return res.data;
    }
    if (code === 401) {
      if (!isRelogin.show) {
        isRelogin.show = true;
        MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
          isRelogin.show = false;
          store.dispatch('LogOut').then(() => {
            location.href = '/index';
        MessageBox.confirm(
          "登录状态已过期,您可以继续留在该页面,或者重新登录",
          "系统提示",
          {
            confirmButtonText: "重新登录",
            cancelButtonText: "取消",
            type: "warning",
          }
        )
          .then(() => {
            isRelogin.show = false;
            store.dispatch("LogOut").then(() => {
              location.href = "/index";
            });
          })
      }).catch(() => {
        isRelogin.show = false;
      });
    }
      return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
          .catch(() => {
            isRelogin.show = false;
          });
      }
      return Promise.reject("无效的会话,或者会话已过期,请重新登录。");
    } else if (code === 500) {
      Message({ message: msg, type: 'error' })
      return Promise.reject(new Error(msg))
      Message({ message: msg, type: "error" });
      return Promise.reject(new Error(msg));
    } else if (code === 601) {
      Message({ message: msg, type: 'warning' })
      return Promise.reject('error')
      Message({ message: msg, type: "warning" });
      return Promise.reject("error");
    } else if (code !== 200) {
      Notification.error({ title: msg })
      return Promise.reject('error')
      Notification.error({ title: msg });
      return Promise.reject("error");
    } else {
      return res.data
      return res.data;
    }
  },
  error => {
    console.log('err' + error)
  (error) => {
    console.log("err" + error);
    let { message } = error;
    if (message == "Network Error") {
      message = "后端接口连接异常";
@@ -112,36 +143,48 @@
    } else if (message.includes("Request failed with status code")) {
      message = "系统接口" + message.substr(message.length - 3) + "异常";
    }
    Message({ message: message, type: 'error', duration: 5 * 1000 })
    return Promise.reject(error)
    Message({ message: message, type: "error", duration: 5 * 1000 });
    return Promise.reject(error);
  }
)
);
// é€šç”¨ä¸‹è½½æ–¹æ³•
export function download(url, params, filename, config) {
  downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", })
  return service.post(url, params, {
    transformRequest: [(params) => { return tansParams(params) }],
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    responseType: 'blob',
    ...config
  }).then(async (data) => {
    const isLogin = await blobValidate(data);
    if (isLogin) {
      const blob = new Blob([data])
      saveAs(blob, filename)
    } else {
      const resText = await data.text();
      const rspObj = JSON.parse(resText);
      const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
      Message.error(errMsg);
    }
    downloadLoadingInstance.close();
  }).catch((r) => {
    console.error(r)
    Message.error('下载文件出现错误,请联系管理员!')
    downloadLoadingInstance.close();
  })
  downloadLoadingInstance = Loading.service({
    text: "正在下载数据,请稍候",
    spinner: "el-icon-loading",
    background: "rgba(0, 0, 0, 0.7)",
  });
  return service
    .post(url, params, {
      transformRequest: [
        (params) => {
          return tansParams(params);
        },
      ],
      headers: { "Content-Type": "application/x-www-form-urlencoded" },
      responseType: "blob",
      ...config,
    })
    .then(async (data) => {
      const isLogin = await blobValidate(data);
      if (isLogin) {
        const blob = new Blob([data]);
        saveAs(blob, filename);
      } else {
        const resText = await data.text();
        const rspObj = JSON.parse(resText);
        const errMsg =
          errorCode[rspObj.code] || rspObj.msg || errorCode["default"];
        Message.error(errMsg);
      }
      downloadLoadingInstance.close();
    })
    .catch((r) => {
      console.error(r);
      Message.error("下载文件出现错误,请联系管理员!");
      downloadLoadingInstance.close();
    });
}
export default service
export default service;
src/views/knowledge/education/index copy.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1239 @@
<template>
  <div class="educationmanagement">
    <!-- å·¦ä¾§æ  -->
    <div class="sidecolumn">
      <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-input>
      </div>
      <div class="head-container" style="margin-top: 20px">
        <el-tree
          :data="deptOptions"
          :props="defaultProps"
          :expand-on-click-node="false"
          :filter-node-method="filterNode"
          ref="tree"
          node-key="id"
          default-expand-all
          highlight-current
          @node-click="handleNodeClick"
        >
          <span class="custom-tree-node" slot-scope="{ node, data }">
            <span>{{ node.label }}</span>
            <span v-if="data.id > 0">
              <el-button
                type="text"
                icon="el-icon-delete"
                circle
                size="mini"
                @click="() => remove(node, data)"
              >
              </el-button>
            </span>
            <span v-if="data.id > 0">
              <el-button
                type="text"
                circle
                size="mini"
                @click="() => altertag(node, data)"
                ><span class="button-textxg"
                  ><i class="el-icon-edit-outline"></i
                ></span>
              </el-button>
            </span>
          </span>
        </el-tree>
      </div>
    </div>
    <!-- å³ä¾§æ•°æ® -->
    <div class="leftvlue">
      <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="preachname">
                <el-input
                  v-model="queryParams.preachname"
                  placeholder="请输入"
                  clearable
                  style="width: 200px"
                  @keyup.enter.native="handleQuery"
                />
              </el-form-item>
              <el-form-item label="适用院区" prop="region">
                <el-select
                  v-model="campus"
                  size="medium"
                  multiple
                  filterable
                  placeholder="请选择分类"
                >
                  <el-option
                    v-for="item in courtyardlist"
                    :key="item.label"
                    :label="item.label"
                    :value="item.label"
                  >
                  </el-option>
                </el-select>
              </el-form-item>
              <el-form-item label="通知内容" prop="userName">
                <el-input
                  v-model="queryParams.preachcontent"
                  placeholder="请输入"
                  clearable
                  style="width: 200px"
                  @keyup.enter.native="handleQuery"
                />
              </el-form-item>
              <el-form-item label="可用状态" prop="classify">
                <el-select
                  v-model="queryParams.isavailable"
                  placeholder="请选择"
                >
                  <el-option
                    v-for="(item, index) in qyoptions"
                    :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="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-button
                  type="success"
                  plain
                  icon="el-icon-data-line"
                  size="medium"
                  @click="statistics"
                  >统计分析</el-button
                >
              </el-col>
              <!-- <el-col :span="1.5"> </el-col> -->
            </el-row>
            <el-table
              v-loading="loading"
              :data="userList"
              border
              @selection-change="handleSelectionChange"
            >
              <el-table-column type="selection" width="50" align="center" />
              <el-table-column
                label="序号"
                fixed
                align="center"
                key="id"
                prop="id"
              />
              <el-table-column
                label="标题"
                fixed
                align="center"
                width="150"
                key="preachname"
                prop="preachname"
                :show-overflow-tooltip="true"
              />
              <el-table-column
                label="版本"
                align="center"
                key="version"
                prop="version"
                :show-overflow-tooltip="true"
              />
              <el-table-column
                label="主要内容"
                align="center"
                width="260"
                key="preachcontent"
                prop="preachcontent"
                :show-overflow-tooltip="true"
              />
              <el-table-column
                label="适用疾病"
                align="center"
                key="aphonenumber"
                prop="aphonenumber"
                width="120"
              >
                <template slot-scope="scope">
                  <el-button
                    size="medium"
                    type="text"
                    @click="illnessUpdate(scope.row)"
                    v-hasPermi="['system:user:edit']"
                    ><span class="button-textxg"
                      ><i class="el-icon-date"></i>详情</span
                    ></el-button
                  >
                </template>
              </el-table-column>
              <el-table-column
                label="标签"
                align="center"
                key="labelInfo"
                prop="labelInfo"
                width="160"
                :show-overflow-tooltip="true"
              >
                <template slot-scope="scope">
                  <div v-if="scope.row.labelInfo">
                    <span v-for="item in scope.row.labelInfo.split(',')"
                      >{{ item }}、
                    </span>
                  </div>
                  <div v-else>
                    <span>无</span>
                  </div>
                </template>
              </el-table-column>
              <el-table-column
                label="适用方式"
                align="center"
                key="suitway"
                prop="suitway"
                width="120"
              >
                <template slot-scope="scope">
                  <div v-if="scope.row.suitway">
                    <span v-for="item in scope.row.suitway.split(',')"
                      >{{ item }}、
                    </span>
                  </div>
                  <div v-else>
                    <span>无</span>
                  </div>
                </template>
              </el-table-column>
              <el-table-column
                label="内容形式"
                align="center"
                key="preachform"
                prop="preachform"
                width="120"
              >
                <template slot-scope="scope">
                  <dict-tag
                    :options="editabshape"
                    :value="scope.row.preachform"
                  />
                </template>
              </el-table-column>
              <el-table-column
                label="最近修改"
                align="center"
                key="updateTime"
                prop="updateTime"
                width="120"
              />
              <el-table-column
                label="是否可用"
                align="center"
                key="isavailable"
                prop="isavailable"
                width="120"
              >
                <template slot-scope="scope">
                  <dict-tag :options="usable" :value="scope.row.isavailable" />
                </template>
              </el-table-column>
              <el-table-column
                label="操作"
                fixed="right"
                align="center"
                width="300"
                class-name="small-padding fixed-width"
              >
                <template slot-scope="scope">
                  <!-- <el-button
                    size="medium"
                    type="text"
                    @click="goQRCode(scope.row)"
                    v-hasPermi="['system:user:edit']"
                  >
                    <span class="button-text"
                      ><i class="el-icon-edit"></i>二维码</span
                    ></el-button
                  > -->
                  <el-button
                    size="medium"
                    type="text"
                    @click="Vieweducation(scope.row)"
                    v-hasPermi="['system:user:edit']"
                    ><span class="button-textck"
                      ><i class="el-icon-edit"></i>预览</span
                    ></el-button
                  >
                  <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-edit"></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 title="新增类别" width="30%" :visible.sync="dialogFormVisible">
      <div style="text-align: center; margin-bottom: 20px">
        <el-radio-group v-model="radio">
          <el-radio-button label="主分类"></el-radio-button>
          <el-radio-button label="子分类"></el-radio-button>
        </el-radio-group>
      </div>
      <el-divider></el-divider>
      <el-form :model="classifyform">
        <el-form-item label="请选择问题大类" v-if="radio == '子分类'">
          <el-select v-model="classifyform.pid" placeholder="请选择">
            <el-option
              v-for="item in deptOptions"
              :key="item.id"
              :label="item.assortname"
              :value="item.id"
            >
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="请输入类别名称">
          <el-input
            v-model="classifyform.assortname"
            autocomplete="off"
          ></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="getDeptTree()">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="submitsidecolumn">ç¡® å®š</el-button>
      </div>
    </el-dialog>
    <!-- ç–¾ç—…弹框 -->
    <el-dialog title="指标疾病" :visible.sync="illnessVisible" width="50%">
      <div>
        <div class="xinz-infs">
          <el-tag
            :key="item.icd10name"
            type="warning"
            v-for="item in illnesslist"
            closable
            :disable-transitions="false"
            @close="handleCloseillness(item)"
          >
            {{ item.icd10name }}
          </el-tag>
          <el-select
            v-model="inputValue"
            v-if="inputVisible"
            @change="illnessConfirm"
            :remote-method="remoteMethod"
            filterable
            remote
            allow-create
            default-first-option
            placeholder="请选择/查询"
            :loading="loading"
          >
            <el-option
              v-for="item in optionsillness"
              :key="item.icdid"
              :label="item.icdname"
              :value="item.icdid"
            >
            </el-option>
          </el-select>
          <el-button
            v-else
            class="button-new-tag"
            size="small"
            @click="showInput"
            >+ æ–°å¢žç–¾ç—…</el-button
          >
        </div>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="illnessVisible = false">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="confirmillness">ç¡® å®š</el-button>
      </span>
    </el-dialog>
    <!-- äºŒç»´ç å±•示弹框 -->
    <el-dialog width="30%" :visible.sync="goQRCodeVisible">
      <div class="qrcode-dialo">
        <div class="qrcode-text">
          {{ nameeducation }}<span>{{ haoeducation }}</span>
        </div>
        <div class="qrcode-img"></div>
      </div>
    </el-dialog>
    <el-dialog title="模板预览" :visible.sync="previewtf" width="60%">
      <div class="preview-left">
        <!-- å•选 -->
        <div v-html="htmlRichText"></div>
      </div>
      <!-- <span slot="footer" class="dialog-footer">
        <el-button @click="previewGo">前往模板详情修改</el-button>
        <el-button type="primary" @click="previewFn">确认使用</el-button>
      </span> --> </el-dialog
    >\
    <!-- ç»Ÿè®¡å›¾è¡¨ -->
    <el-dialog title="管饲宣教统计" :visible.sync="statisticson">
      <div class="grid-content bg-purple" style="min-height: 300px">
        <div class="title">
          å®£æ•™ç»Ÿè®¡
          <span class="el-icon-s-unfold moreIcon"></span>
        </div>
        <div class="cooperate">
          <!-- åˆä½œåŒºåŸŸ -->
          <div class="pieChart" id="pieCharts"></div>
        </div>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import {
  getheLibraryAssort,
  delheLibraryAssort,
  addheLibraryAssort,
  editheLibraryAssort,
  addtargetillness,
  getlibrarylist,
  dellibraryinfo,
  compilelibrary,
  getlibraryinfo,
  getillnesslist,
  illnesslistget,
  getillness,
  deltargetillness,
} from "@/api/AiCentre/index";
import { listDept } from "@/api/system/dept";
import { getToken } from "@/utils/auth";
import store from "@/store";
import axios from "axios";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
  name: "education",
  dicts: ["sys_normal_disable", "sys_user_sex"],
  components: { Treeselect },
  data() {
    return {
      topactiveName: "Local", //顶部选择
      // é®ç½©å±‚
      loading: false,
      // é€‰ä¸­æ•°ç»„
      ids: [],
      // éžå•个禁用
      single: true,
      // éžå¤šä¸ªç¦ç”¨
      multiple: true,
      // æ˜¾ç¤ºæœç´¢æ¡ä»¶
      showSearch: true,
      // æ€»æ¡æ•°
      total: 0,
      nameeducation: "",
      haoeducation: "",
      statisticson: false,
      indexid: null,
      inputValue: "",
      htmlRichText: "",
      radio: "主分类",
      inputVisible: false,
      previewtf: false,
      illnessVisible: false, //指标疾病弹框
      deptOptions: [],
      courtyardlist: [],
      optionsillness: [],
      illnesslistapi: [],
      illnesslist: [],
      campus: [],
      defaultProps: {
        children: "heLibraryAssortList",
        label: "assortname",
      },
      // ç”¨æˆ·è¡¨æ ¼æ•°æ®
      userList: [
        {
          userid: 1,
          userName: "三号宣教",
          nickName: "1.2.4",
          aphonenumber: "关节炎症",
          bphonenumber: "很棒",
          cphonenumber: "2022-12-12",
        },
      ],
      // å¼¹å‡ºå±‚标题
      title: "",
      // æ˜¯å¦æ˜¾ç¤ºå¼¹å‡ºå±‚
      open: false,
      // æ—¥æœŸèŒƒå›´
      dateRange: [],
      // å²—位选项
      postOptions: [],
      // è§’色选项
      roleOptions: [],
      // è¡¨å•参数
      form: {},
      numberlb: 22,
      numberlbs: 2,
      sidecolumnform: {}, //添加类别表单
      goQRCodeVisible: false, //二维码弹框
      sidecolumnval: "", //类别搜索
      propss: { multiple: true },
      idds: "",
      amendtag: false, //是否修改类别
      dialogFormVisible: false, //修改添加类别弹框
      deleteVisible: false, //分类删除弹框
      deletefenl: "高血压", //删除项
      classifyform: {
        categoryname: "",
      }, //类别表单
      optionss: [],
      mode: [],
      qyoptions: [],
      languagelist: [],
      editabshape: [],
      usable: [],
      precedencetype: [],
      xjxsoptions: [],
      deptList: [],
      props: { multiple: true, value: "deptId", label: "deptName" },
      //类别列表
      editableTabs: [],
      // æŸ¥è¯¢å‚æ•°
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        isavailable: "",
      },
    };
  },
  watch: {},
  created() {
    this.getList();
    this.getDeptTree();
    this.mode = store.getters.mode;
    this.languagelist = store.getters.languagelist;
    this.usable = store.getters.usable;
    this.precedencetype = store.getters.precedencetype;
    this.editabshape = store.getters.editabshape;
    this.qyoptions = store.getters.usable;
    this.courtyardlist = store.getters.courtyardlist;
  },
  methods: {
    /** æŸ¥è¯¢å®£æ•™åˆ—表 */
    getList() {
      this.loading = true;
      getlibrarylist(this.queryParams).then((response) => {
        console.log(response);
        this.userList = response.rows;
        this.total = response.total;
        this.loading = false;
      });
      listDept(this.queryParams).then((response) => {
        this.deptList = this.handleTree(response.data, "deptId");
      });
    },
    // å–消按钮
    cancel() {
      this.open = false;
      this.reset();
    },
    goQRCode(row) {
      this.goQRCodeVisible = true;
      this.nameeducation = row.userName;
      this.haoeducation = row.nickName;
    },
    // åˆä½œå•†ç‚¹ä½æ±‡æ€»ç»Ÿè®¡é¥¼çж图
    async getnodeCollect() {
      // const res = await getnodeCollect();
      // this.nodeCollect = res.data;
      // this.nodeCollect = [
      //   { name: "门诊随访", value: 1232 },
      //   { name: "出院随访", value: 342 },
      // ];
      this.myPieChart();
    },
    // é¥¼çж图
    myPieChart() {
      // åŸºäºŽå‡†å¤‡å¥½çš„dom,初始化echarts实例
      var echarts = require("echarts");
      var mypPieCharts = echarts.init(document.getElementById("pieCharts"));
      this.mypPieCharts = mypPieCharts;
      // æŒ‡å®šå›¾è¡¨çš„配置项和数据
      Â  Â  Â  var optionPie = {
  tooltip: {
  Â  trigger: "item",
  Â  formatter: "{a} <br/>{b} : {c} ({d}%)"
  },
  legend: {
  Â  orient: 'vertical',
  Â  left: 'left',
  Â  data: ['一号', '二号', '三号', '四号', '五号']
  },
  xAxis: [
  Â  {
  Â  Â  type: 'category',
  Â  Â  data: ['一号', '二号', '三号', '四号', '五号'],
  Â  Â  axisLabel: {
  Â  Â  Â  formatter: '{value}'
  Â  Â  }
  Â  }
  ],
  yAxis: [
  Â  {
  Â  Â  type: 'value'
  Â  }
  ],
  series: [
  Â  {
  Â  Â  name: '查看次数',
  Â  Â  type: 'bar',
  Â  Â  data: [55, 45, 128, 43, 38],
  Â  Â  label: {
  Â  Â  Â  show: true,
  Â  Â  Â  position: 'insideRight'
  Â  Â  }
  Â  },
  Â  {
  Â  Â  name: '查看次数比率',
  Â  Â  type: 'pie',
  Â  Â  radius: '30%',
  Â  Â  center: ['75%', '50%'], // è°ƒæ•´ä½ç½®ä»¥é¿å…ä¸ŽæŸ±çŠ¶å›¾é‡å 
  Â  Â  data: [
  Â  Â  Â  {value: 55, name: '一号'},
  Â  Â  Â  {value: 45, name: '二号'},
  Â  Â  Â  {value: 128, name: '三号'},
  Â  Â  Â  {value: 43, name: '四号'},
  Â  Â  Â  {value: 38, name: '五号'}
  Â  Â  ],
  Â  Â  emphasis: {
  Â  Â  Â  focus: 'self'
  Â  Â  },
  Â  Â  itemStyle: {
  Â  Â  Â  borderRadius: 10,
  Â  Â  Â  borderColor: '#fff',
  Â  Â  Â  borderWidth: 2
  Â  Â  },
  Â  Â  label: {
  Â  Â  Â  formatter: '{b}: {d}%'
  Â  Â  }
  Â  }
  ]
};
      mypPieCharts.on("updateAxisPointer", function (event) {
        const xAxisInfo = event.axesInfo[0];
        if (xAxisInfo) {
          const dimension = xAxisInfo.value + 1;
          mypPieCharts.setOption({
            series: {
              id: "pie",
              label: {
                formatter: "{b}: {@[" + dimension + "]} ",
              },
              encode: {
                value: dimension,
                tooltip: dimension,
              },
            },
          });
        }
      });
      // ä½¿ç”¨åˆšæŒ‡å®šçš„配置项和数据显示图表。
      mypPieCharts.setOption(optionPie);
    },
    // è¡¨å•重置
    reset() {
      this.form = {};
      this.resetForm("form");
    },
    /** æœç´¢æŒ‰é’®æ“ä½œ */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.queryParams.campus = this.campus.join(",");
      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.id);
      this.single = selection.length != 1;
      this.multiple = !selection.length;
    },
    /** æ–°å¢žæŒ‰é’®æ“ä½œ */
    handleAdd() {
      this.$router.push({
        path: "/knowledge/educationinfo/",
      });
    },
    /** ä¿®æ”¹æŒ‰é’®æ“ä½œ */
    handleUpdate(row) {
      this.$router.push({
        path: "/knowledge/educationinfo/",
        query: { id: row.id },
      });
    },
    // æŸ¥çœ‹å®£æ•™
    Vieweducation(row) {
      this.htmlRichText = null;
      this.previewtf = true;
      axios
        .get(row.htmlRichText)
        .then((response) => {
          console.log(response.data, "数据"); // è¾“出获取到的文件内容
          this.htmlRichText = response.data;
          this.htmlRichText = this.addStyleToImages(this.htmlRichText);
        })
        .catch((error) => {
          this.$modal.msgError("获取富文本失败");
          console.error("Failed to fetch file:", error);
        });
    },
    addStyleToImages(html) {
      return html.replace(
        /<img([^>]*)style=(['"])(?:(?!\2).)*\2([^>]*)>/g,
        '<img$1style="width:100%;height:auto;"$3>'
      );
    },
    /** åˆ é™¤æŒ‰é’®æ“ä½œ */
    handleDelete(row) {
      const userIds = row.id || this.ids;
      this.$modal
        .confirm('是否确认删除用户编号为"' + userIds + '"的数据项?')
        .then(function () {
          return dellibraryinfo(userIds);
        })
        .then(() => {
          this.getList();
          this.$modal.msgSuccess("删除成功");
        })
        .catch(() => {});
    },
    // æ‰“开统计图表
    statistics() {
      this.statisticson=true;
      this.$nextTick(function () {
      this.getnodeCollect();
    });
    },
    // åˆ†ç±»æ ‘-----------------------------------------
    // ä¿®æ”¹åˆ†ç±»å¼¹æ¡†
    popoveramend(tagcategoryid) {
      this.idds = tagcategoryid;
      this.amendtag = true;
      this.dialogFormVisible = true;
    },
    // æŸ¥è¯¢æ ‘
    getDeptTree() {
      getheLibraryAssort({}).then((res) => {
        this.deptOptions = res.rows;
        this.dialogFormVisible = false;
      });
    },
    // æ·»åŠ ç±»åˆ«æ ‘
    submitsidecolumn() {
      if (this.classifyform.id) {
        editheLibraryAssort(this.classifyform).then((res) => {
          this.getDeptTree();
          this.$modal.msgSuccess("修改成功");
          this.classifyform = {};
          this.dialogFormVisible = false;
        });
        return;
      }
      let calssvalue = {};
      if (
        this.classifyform.pid &&
        this.classifyform.assortname &&
        this.radio == "子分类"
      ) {
        const index = this.deptOptions.findIndex(
          (obj) => obj.id == this.classifyform.pid
        );
        calssvalue = this.deptOptions[index];
        calssvalue.heLibraryAssortList.push(this.classifyform);
      } else if (this.radio == "主分类" && this.classifyform.assortname) {
        this.classifyform.pid = null;
        this.classifyform.heLibraryAssortList = [];
      } else {
        return this.$modal.msgError("请填写完整信息");
      }
      this.classifyform.hetype = 1;
      addheLibraryAssort(this.classifyform).then((res) => {
        this.getDeptTree();
        this.$modal.msgSuccess("新增成功");
        this.classifyform = {};
        this.dialogFormVisible = false;
      });
    },
    remove(a, b) {
      if (b.pid) {
        this.$modal
          .confirm('是否确认删除分类项为"' + b.assortname + '"的数据项?')
          .then(function () {
            return delheLibraryAssort(b.id);
          })
          .then(() => {
            this.getDeptTree();
            this.$modal.msgSuccess("删除成功");
          })
          .catch(() => {});
      } else {
        this.$modal
          .confirm(
            '是否确认删除一级分类"' +
              b.assortname +
              '"?删除后其下分类将归类‘未分类’'
          )
          .then(() => {
            return delheLibraryAssort(b.id);
          })
          .then(() => {
            this.getDeptTree();
            this.$modal.msgSuccess("删除成功");
          })
          .catch(() => {});
      }
    },
    altertag(a, b) {
      this.dialogFormVisible = true;
      if (!b.pid) {
        this.radio = "主分类";
      } else {
        this.radio = "子分类";
      }
      this.classifyform = b;
      this.dialogFormVisible = true;
    },
    // ç­›é€‰èŠ‚ç‚¹
    filterNode(value, data) {
      if (!value) return true;
      return data.assortname.indexOf(value) !== -1;
    },
    handleNodeClick(data) {
      this.queryParams.assortid = data.id;
      this.getList();
    },
    // ç–¾ç—…-----------------------
    illnessUpdate(row) {
      this.illnessVisible = true;
      this.indexid = row.id;
      this.illnesslistapi = [];
      const illnessqueryParams = {
        pageNum: 1,
        pageSize: 100,
      };
      getillnesslist(illnessqueryParams).then((response) => {
        console.log(response);
        this.optionsillness = response.rows;
      });
      getillness({ outid: row.id, type: 6 }).then((res) => {
        this.illnesslist = res.rows;
        console.log(res);
      });
    },
    handleCloseillness(tag) {
      this.illnesslist.splice(this.illnesslist.indexOf(tag), 1);
      if (tag.id) {
        this.illnesslistapi.push(tag.id);
      }
    },
    remoteMethod(value) {
      console.log(value);
      const illnessqueryParams = {
        pageNum: 1,
        pageSize: 100,
        icdname: value,
      };
      this.loading = true;
      setTimeout(() => {
        this.loading = false;
        getillnesslist(illnessqueryParams).then((response) => {
          this.optionsillness = response.rows;
        });
      }, 200);
    },
    illnessConfirm(item) {
      let opeavalue = {};
      let tagname = this.inputValue;
      illnesslistget(item).then((res) => {
        opeavalue = res.data;
        opeavalue.outid = this.indexid;
        opeavalue.type = 6;
        opeavalue.icd10id = opeavalue.icdid;
        opeavalue.icd10name = opeavalue.icdname;
        opeavalue.icd10code = opeavalue.icdcode;
        if (tagname) {
          this.illnesslist.push(opeavalue);
        }
      });
      console.log(this.illnesslist);
      this.inputVisible = false;
      this.inputValue = "";
    },
    confirmillness() {
      this.illnesslist.forEach((item, index) => {
        if (!item.id) {
          addtargetillness(item).then((res) => {});
        }
      });
      if (this.illnesslistapi.length) {
        deltargetillness(this.illnesslistapi.join(",")).then((res) => {});
      }
      this.illnessVisible = false;
      this.$modal.msgSuccess("编辑成功");
    },
    showInput() {
      this.inputVisible = true;
    },
  },
};
</script>
<style lang="scss" scoped>
.educationmanagement {
  display: flex;
}
.sidecolumn {
  width: 300px;
  min-height: 100vh;
  text-align: center;
  //   display: flex;
  margin-top: 20px;
  margin: 20px;
  padding: 30px;
  background: #fff;
  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;
  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;
  }
}
.xinz-infs {
  font-size: 18px;
  overflow: hidden;
  text-overflow: ellipsis;
  line-height: 48px;
  .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;
  }
}
.bg-purple {
  background: #fff;
}
.grid-content {
  min-height: 36px;
  border-radius: 20px;
  padding: 0 10px;
}
.title {
  -webkit-box-align: center;
  -ms-flex-align: center;
  align-items: center;
  -webkit-box-flex: 1;
  -ms-flex: 1;
  flex: 1;
  font-size: 16px;
  font-family: PingFangSC-Semibold, PingFang SC;
  font-weight: 600;
  color: #333;
  padding-top: 17px;
  padding-bottom: -4px;
  span {
    margin-left: 10px;
    font-size: 12px;
    font-family: PingFangSC-Regular, PingFang SC;
    font-weight: 400;
    color: #999;
  }
}
.moreIcon {
  font-size: 22px !important;
  margin-left: 400px !important;
  color: #5f84ff !important;
  cursor: pointer;
}
.cooperate {
  width: 100%;
  height: 280px;
  margin-top: 25px;
  display: flex;
  .pieChart {
    flex: 1;
  }
  .Points {
    width: 154px;
    height: 230px;
    text-align: center;
    padding: 20px 0;
    background: linear-gradient(135deg, transparent, #f8f8f9 0) 0 0,
      linear-gradient(-135deg, transparent 12px, #f8f8f9 0) 100% 0,
      linear-gradient(-45deg, transparent, #f8f8f9 0) 100% 100%,
      linear-gradient(45deg, transparent 12px, #f8f8f9 0) 0 100%;
    background-size: 50% 50%;
    background-repeat: no-repeat;
    p {
      height: 33px;
      margin-bottom: 10px;
      font-size: 24px;
      font-family: PingFangSC-Semibold, PingFang SC;
      font-weight: 600;
      color: #072074;
      line-height: 33px;
    }
    span {
      height: 17px;
      margin-top: 6px;
      font-size: 12px;
      font-family: PingFangSC-Regular, PingFang SC;
      font-weight: 400;
      color: #000412;
      line-height: 17px;
    }
  }
}
::v-deep .el-tree-node__content {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
  -ms-flex-align: center;
  align-items: center;
  height: 46px;
  font-size: 20px;
  cursor: pointer;
}
::v-deep .el-tree {
  position: relative;
  cursor: default;
  border-radius: 5px;
  background: #eff8fe;
  color: #606266;
  border: 1px solid #bbe1fa;
  // 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
  .el-tree--highlight-current
  .el-tree-node.is-current
  > .el-tree-node__content {
  background-color: #7799fb;
  color: #fff;
}
::v-deep .el-button--mini.is-circle {
  padding: 7px;
  margin: 0;
  color: red;
}
.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>
src/views/knowledge/education/index.vue
@@ -161,6 +161,16 @@
                  >删除</el-button
                >
              </el-col>
              <el-col :span="1.5">
                <el-button
                  type="success"
                  plain
                  icon="el-icon-data-line"
                  size="medium"
                  @click="statistics"
                  >统计分析</el-button
                >
              </el-col>
              <!-- <el-col :span="1.5"> </el-col> -->
            </el-row>
@@ -452,7 +462,20 @@
      <!-- <span slot="footer" class="dialog-footer">
        <el-button @click="previewGo">前往模板详情修改</el-button>
        <el-button type="primary" @click="previewFn">确认使用</el-button>
      </span> -->
      </span> --> </el-dialog
    >\
    <!-- ç»Ÿè®¡å›¾è¡¨ -->
    <el-dialog width="80%" title="管饲宣教统计" :visible.sync="statisticson">
      <div class="grid-content bg-purple" style="min-height: 300px">
        <div class="title">
          å®£æ•™ç»Ÿè®¡
          <span class="el-icon-s-unfold moreIcon"></span>
        </div>
        <div class="cooperate">
          <!-- åˆä½œåŒºåŸŸ -->
          <div class="pieChart" id="pieCharts"></div>
        </div>
      </div>
    </el-dialog>
  </div>
</template>
@@ -471,6 +494,7 @@
  getillnesslist,
  illnesslistget,
  getillness,
  deltargetillness,
} from "@/api/AiCentre/index";
import { listDept } from "@/api/system/dept";
import { getToken } from "@/utils/auth";
@@ -499,6 +523,7 @@
      total: 0,
      nameeducation: "",
      haoeducation: "",
      statisticson: false,
      indexid: null,
      inputValue: "",
      htmlRichText: "",
@@ -563,7 +588,9 @@
      xjxsoptions: [],
      deptList: [],
      props: { multiple: true, value: "deptId", label: "deptName" },
      Collarr: [],
      Collarrname: [],
      Collarrvalue: [],
      //类别列表
      editableTabs: [],
      // æŸ¥è¯¢å‚æ•°
@@ -611,6 +638,113 @@
      this.goQRCodeVisible = true;
      this.nameeducation = row.userName;
      this.haoeducation = row.nickName;
    },
    // åˆä½œå•†ç‚¹ä½æ±‡æ€»ç»Ÿè®¡é¥¼çж图
    async getnodeCollect() {
      // const res = await getnodeCollect();
      // this.nodeCollect = res.data;
      // this.nodeCollect = [
      //   { name: "门诊随访", value: 1232 },
      //   { name: "出院随访", value: 342 },
      // ];
      this.myPieChart();
    },
    // é¥¼çж图
    myPieChart() {
      // åŸºäºŽå‡†å¤‡å¥½çš„dom,初始化echarts实例
      var echarts = require("echarts");
      var mypPieCharts = echarts.init(document.getElementById("pieCharts"));
      this.mypPieCharts = mypPieCharts;
      // æŒ‡å®šå›¾è¡¨çš„配置项和数据
      var optionPie = {
        tooltip: {
          trigger: "item",
          formatter: "{a} <br/>{b} : {c} ({d}%)",
        },
        legend: {
          left: "left",
          orient: "horizontal", // å›¾ä¾‹é¡¹æ°´å¹³æŽ’列
          top: "top", // å›¾ä¾‹æ”¾ç½®åœ¨é¡¶éƒ¨
          data: this.Collarrname,
        },
        toolbox: {
          feature: {
            magicType: {
              type: ["stack"],
            },
            dataView: {},
          },
        },
        xAxis: [
          {
            type: "category",
            data: this.Collarrname,
            axisLabel: {
              formatter: "{value}",
            },
          },
        ],
        grid: { top: "30%", left: "10%", right: "40%", bottom: "10%" },
        yAxis: [
          {
            type: "value",
          },
        ],
        series: [
          {
            name: "查看次数",
            type: "bar",
            data: this.Collarrvalue,
            seriesLayoutBy: "row",
            smooth: true,
            label: {
              show: true,
              position: "inside",
            },
            emphasis: { focus: "series" },
          },
          {
            name: "查看次数比率",
            type: "pie",
            radius: "30%",
            radius: ["40%", "70%"],
            center: ["80%", "60%"],
            data: this.Collarr,
            emphasis: {
              focus: "self",
            },
            itemStyle: {
              borderRadius: 10,
              borderColor: "#fff",
              borderWidth: 2,
            },
            label: {
              formatter: "{b}: {d}%",
            },
          },
        ],
      };
      mypPieCharts.on("updateAxisPointer", function (event) {
        const xAxisInfo = event.axesInfo[0];
        if (xAxisInfo) {
          const dimension = xAxisInfo.value + 1;
          mypPieCharts.setOption({
            series: {
              id: "pie",
              label: {
                formatter: "{b}: {@[" + dimension + "]} ",
              },
              encode: {
                value: dimension,
                tooltip: dimension,
              },
            },
          });
        }
      });
      // ä½¿ç”¨åˆšæŒ‡å®šçš„配置项和数据显示图表。
      mypPieCharts.setOption(optionPie);
    },
    // è¡¨å•重置
    reset() {
@@ -686,6 +820,29 @@
          this.$modal.msgSuccess("删除成功");
        })
        .catch(() => {});
    },
    // æ‰“开统计图表
    statistics() {
      //取数据
      let obj = { assortid: 13, isavailable: "", pageNum: 1, pageSize: 10 };
      getlibrarylist(obj).then((response) => {
        console.log(response.rows, "response.rows");
        response.rows.forEach((item) => {
          this.Collarr.push({ name: item.preachname, value: item.watchCount });
        });
        this.Collarrname = this.Collarr.map((item) => item.name);
        // æå– value å±žæ€§åˆ°ä¸€ä¸ªæ–°æ•°ç»„
        this.Collarrvalue = this.Collarr.map((item) =>
          parseInt(item.value, 10)
        );
        this.statisticson = true;
        this.$nextTick(function () {
          this.getnodeCollect();
        });
        this.total = response.total;
        this.loading = false;
      });
    },
    // åˆ†ç±»æ ‘-----------------------------------------
@@ -980,6 +1137,83 @@
    vertical-align: bottom;
  }
}
.bg-purple {
  background: #fff;
}
.grid-content {
  min-height: 36px;
  border-radius: 20px;
  padding: 0 10px;
}
.title {
  -webkit-box-align: center;
  -ms-flex-align: center;
  align-items: center;
  -webkit-box-flex: 1;
  -ms-flex: 1;
  flex: 1;
  font-size: 16px;
  font-family: PingFangSC-Semibold, PingFang SC;
  font-weight: 600;
  color: #333;
  padding-top: 17px;
  padding-bottom: -4px;
  span {
    margin-left: 10px;
    font-size: 12px;
    font-family: PingFangSC-Regular, PingFang SC;
    font-weight: 400;
    color: #999;
  }
}
.moreIcon {
  font-size: 22px !important;
  margin-left: 400px !important;
  color: #5f84ff !important;
  cursor: pointer;
}
.cooperate {
  width: 100%;
  height: 280px;
  margin-top: 25px;
  display: flex;
  .pieChart {
    flex: 1;
  }
  .Points {
    width: 154px;
    height: 230px;
    text-align: center;
    padding: 20px 0;
    background: linear-gradient(135deg, transparent, #f8f8f9 0) 0 0,
      linear-gradient(-135deg, transparent 12px, #f8f8f9 0) 100% 0,
      linear-gradient(-45deg, transparent, #f8f8f9 0) 100% 100%,
      linear-gradient(45deg, transparent 12px, #f8f8f9 0) 0 100%;
    background-size: 50% 50%;
    background-repeat: no-repeat;
    p {
      height: 33px;
      margin-bottom: 10px;
      font-size: 24px;
      font-family: PingFangSC-Semibold, PingFang SC;
      font-weight: 600;
      color: #072074;
      line-height: 33px;
    }
    span {
      height: 17px;
      margin-top: 6px;
      font-size: 12px;
      font-family: PingFangSC-Regular, PingFang SC;
      font-weight: 400;
      color: #000412;
      line-height: 17px;
    }
  }
}
::v-deep .el-tree-node__content {
  display: -webkit-box;
  display: -ms-flexbox;
src/views/login.vue
@@ -36,7 +36,8 @@
          />
        </el-input>
      </el-form-item>
      <el-form-item prop="guid">
      <!-- ä¸½===================æ°´ -->
      <!-- <el-form-item prop="guid">
        <el-select style="width: 100%;" v-model="loginForm.guid"  placeholder="请选择院区">
          <el-option
            v-for="item in options"
@@ -47,7 +48,7 @@
          </el-option>
          <i slot="prefix" class="el-icon-mobile"></i>
        </el-select>
      </el-form-item>
      </el-form-item> -->
      <!-- <el-form-item prop="code" v-if="captchaEnabled">
        <el-input
          v-model="loginForm.code"
@@ -115,10 +116,9 @@
        guid:'',
      },
      options: [
        { value: "1", label: "中医大二院" },
        { value: "2", label: "中医大三院" },
        { value: "3", label: "中医大四院" },
        { value: "4", label: "中医大五院" },],
        { value: "1", label: "景宁畲族自治县人民医院" },
        { value: "2", label: "丽水市中医院" },
       ],
      loginRules: {
        username: [
          { required: true, trigger: "blur", message: "请输入您的账号" },
@@ -126,7 +126,7 @@
        password: [
          { required: true, trigger: "blur", message: "请输入您的密码" },
        ],
        guid: [{ required: true, trigger: "blur", message: "请选择院区" }],
        // guid: [{ required: true, trigger: "blur", message: "请选择院区" }],
      },
      loading: false,
      // éªŒè¯ç å¼€å…³
src/views/outsideChain.vue
@@ -77,7 +77,7 @@
<script>
import {
  getExternalfollowup,
  SetsaveQuestionAnswer,
  Submitaquestionnaire,
} from "@/api/AiCentre/index";
import JSEncrypt from "jsencrypt";
export default {
@@ -174,7 +174,7 @@
      });
      console.log(form, "form");
      SetsaveQuestionAnswer(form).then((res) => {
      Submitaquestionnaire(form).then((res) => {
        if (res.code == 200) {
          this.$modal.msgSuccess("提交成功");
        }
src/views/outsideChainxj.vue
@@ -52,7 +52,7 @@
<script>
import {
  getExternalfollowup,
  SetsaveQuestionAnswer,
  Submitaquestionnaire,
} from "@/api/AiCentre/index";
import { getToken } from "@/utils/auth";
import axios from "axios";
@@ -165,7 +165,7 @@
      });
      console.log(form, "form");
      SetsaveQuestionAnswer(form).then((res) => {
      Submitaquestionnaire(form).then((res) => {
        if (res.code == 200) {
          this.$modal.msgSuccess("提交成功");
        }
src/views/outsideChainxjnew.vue
@@ -52,7 +52,7 @@
<script>
import {
  getExternalfollowup,
  SetsaveQuestionAnswer,
  Submitaquestionnaire,
  geturlinfo
} from "@/api/AiCentre/index";
import { getToken } from "@/utils/auth";
@@ -189,7 +189,7 @@
      });
      console.log(form, "form");
      SetsaveQuestionAnswer(form).then((res) => {
      Submitaquestionnaire(form).then((res) => {
        if (res.code == 200) {
          this.$modal.msgSuccess("提交成功");
        }
src/views/patient/patient/behospitalized.vue
@@ -74,7 +74,7 @@
        </el-form>
        <el-row :gutter="10" class="mb8">
          <el-col :span="1.5">
          <!-- <el-col :span="1.5">
            <el-button
              type="primary"
              plain
@@ -84,8 +84,8 @@
              v-hasPermi="['system:user:add']"
              >新增</el-button
            >
          </el-col>
          <el-col :span="1.5">
          </el-col> -->
          <!-- <el-col :span="1.5">
            <el-button
              type="success"
              plain
@@ -96,7 +96,7 @@
              v-hasPermi="['system:user:edit']"
              >修改</el-button
            >
          </el-col>
          </el-col> -->
          <el-col :span="1.5">
            <el-button
              type="danger"
src/views/patient/patient/hospital.vue
@@ -77,7 +77,7 @@
        </el-form>
        <el-row :gutter="10" class="mb8">
          <el-col :span="1.5">
          <!-- <el-col :span="1.5">
            <el-button
              type="primary"
              plain
@@ -87,8 +87,8 @@
              v-hasPermi="['system:user:add']"
              >新增</el-button
            >
          </el-col>
          <el-col :span="1.5">
          </el-col> -->
          <!-- <el-col :span="1.5">
            <el-button
              type="success"
              plain
@@ -99,7 +99,7 @@
              v-hasPermi="['system:user:edit']"
              >修改</el-button
            >
          </el-col>
          </el-col> -->
          <el-col :span="1.5">
            <el-button
              type="danger"
src/views/patient/patient/outpatient.vue
@@ -71,7 +71,7 @@
        </el-form>
        <el-row :gutter="10" class="mb8">
          <el-col :span="1.5">
          <!-- <el-col :span="1.5">
            <el-button
              type="primary"
              plain
@@ -93,7 +93,7 @@
              v-hasPermi="['system:user:edit']"
              >修改</el-button
            >
          </el-col>
          </el-col> -->
          <el-col :span="1.5">
            <el-button
              type="danger"
src/views/patient/propaganda/QuestionnaireTask.vue
@@ -1252,6 +1252,8 @@
            value: "5",
            label: "微信公众号",
          },
        { label: "微信小程序", value: 6 },
        ];
      } else if (this.form.serviceType == 6) {
        this.checkboxlist = [
src/views/patient/propaganda/particty.vue
@@ -1861,6 +1861,7 @@
    neWaddfn() {
      this.id = null;
      this.form.taskName = "";
      this.form.sendState = null;
      this.form.taskid = null;
      this.overallCase = [];
      this.form.patTaskRelevances = [];
src/views/repositoryai/templateku/configurat/index.vue
@@ -1626,6 +1626,7 @@
    this.auxiliary();
    this.getDeptTree();
    this.mode = store.getters.mode;
    console.log(this.mode,'this.mode');
    this.usable = store.getters.usable;
    this.required = store.getters.required;
    this.valuetype = store.getters.valuetype;
@@ -1702,8 +1703,9 @@
            console.log(2211);
            this.ruleForm = res.data;
            if (this.ruleForm.deptNames)
              // this.tempDetpRelevanceslist = JSON.parse(this.ruleForm.deptNames);
            console.log(this.ruleForm.suitway,'suitway');
            this.ruleForm.suitway = this.ruleForm.suitway.split(",");
            console.log(this.ruleForm.suitway,'suitway');
            if (this.ruleForm.campus)
              this.ruleForm.campus = this.ruleForm.campus.split(",");
            this.ruleForm.submoduleID = this.ruleForm.submoduleID.split(",");
src/views/sfstatistics/percentage/index.vue
@@ -292,7 +292,7 @@
                prop="tagdescription"
              >
              </el-table-column> -->
              <el-table-column
              <!-- <el-table-column
                label="短信发送次数"
                align="center"
                width="120"
@@ -315,7 +315,7 @@
                key="dxsfwcl"
                prop="dxsfwcl"
              >
              </el-table-column>
              </el-table-column> -->
              <!-- <el-table-column
                label="人工随访次数"
                align="center"