WXL (wul)
2026-05-08 f9902f7a3b79d22bde9f199263ac36de26816470
测试完成
已删除2个文件
已修改38个文件
1195 ■■■■■ 文件已修改
src/api/system/config.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/getters.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/user.js 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/index.js 295 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/ruoyi.js 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/Continue/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/OutpatientAgain/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/SpecificDisease/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/Tracking/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/again/index.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/beHospitalized/followUp.vue 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/beHospitalized/publicity.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/complaint/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/discharge/index.vue 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/discharge/outpatientService.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/mzsatisfaction/index.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/outpatient/index.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/record/detailpage/index.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/record/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/record/physical/index.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/technology/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/zbAgain/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/zysatisfaction/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/outsideChainwtnew.vue 383 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/outsideChainxjnew.vue 215 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/medtechnician/Compositeeditdetails.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/patient/hospital.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/patient/profile/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/physical/index.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/propaganda/Missionotice.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/propaganda/QuestionnaireTask.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/propaganda/index.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/propaganda/particty.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/questionnaire/index.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/shadow/index.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/patient/subsequent/index.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vue.config.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
通用 (2).zip 补丁 | 查看 | 原始文档 | blame | 历史
通用.zip 补丁 | 查看 | 原始文档 | blame | 历史
src/api/system/config.js
@@ -28,7 +28,7 @@
// æ–°å¢žå‚数配置
export function addConfig(data) {
  return request({
    url: '/system/config',
    url: '/system/config/add',
    method: 'post',
    data: data
  })
src/main.js
@@ -51,6 +51,7 @@
import {
  parseTime,
  formatTime,
  followupAuthority,
  resetForm,
  addDateRange,
  selectDictLabel,
@@ -111,6 +112,7 @@
Vue.prototype.formatTime = formatTime;
Vue.prototype.daysBetween = daysBetween;
Vue.prototype.resetForm = resetForm;
Vue.prototype.followupAuthority = followupAuthority;
Vue.prototype.addDateRange = addDateRange;
Vue.prototype.selectDictLabel = selectDictLabel;
Vue.prototype.selectDictLabels = selectDictLabels;
src/store/getters.js
@@ -15,6 +15,7 @@
  permissions: (state) => state.user.permissions,
  belongWards: (state) => state.user.belongWards,
  belongDepts: (state) => state.user.belongDepts,
  visitAgain: (state) => state.user.visitAgain,
  satisfactionCategories: (state) => state.user.satisfactionCategories,
  hisUserId: (state) => state.user.hisUserId,
  permission_routes: (state) => state.permission.routes,
src/store/modules/user.js
@@ -1,4 +1,5 @@
import { login, logout, getInfo } from "@/api/login";
import { getConfig, getConfigKey, listConfig } from "@/api/system/config";
import { getToken, setToken, removeToken } from "@/utils/auth";
const user = {
@@ -13,6 +14,7 @@
    belongDepts: [],
    roles: [],
    permissions: [],
    visitAgain: 1, //1开启2不开启再次随访
    satisfactionCategories: {},
    // æœåŠ¡ç±»åž‹
    Serviceauthority: [
@@ -91,6 +93,9 @@
    },
    SET_nickNAME: (state, name) => {
      state.nickName = name;
    },
    SET_visitAgain: (state, visitAgain) => {
      state.visitAgain = visitAgain;
    },
    SET_Id: (state, Id) => {
      state.Id = Id;
@@ -250,7 +255,7 @@
    },
    // èŽ·å–ç”¨æˆ·ä¿¡æ¯
    GetInfo({ commit, state }) {
    GetInfo({ commit, state, dispatch }) {
      return new Promise((resolve, reject) => {
        getInfo()
          .then((res) => {
@@ -271,17 +276,30 @@
            commit("SET_Id", user.userId);
            commit("SET_hisUserId", user.hisUserId);
            commit("SET_satisfactionCategories", user.satisfactionCategories);
            // if (user.userName == "admin") {
            //   commit("SET_leaveldeptcodes", []);
            //   commit("SET_leavehospitaldistrictcodes", []);
            // } else {
            //   commit("SET_leavehospitaldistrictcodes", user.belongWards);
            //   commit("SET_leaveldeptcodes", user.belongDepts);
            // }
            commit("SET_leavehospitaldistrictcodes", user.belongWards);
            commit("SET_leaveldeptcodes", user.belongDepts);
            commit("SET_AVATAR", avatar);
            // æ­£ç¡®è°ƒç”¨æ–¹å¼ï¼šé€šè¿‡ dispatch
            dispatch("GetConfig")
              .then(() => {
                resolve(res);
              })
              .catch((error) => {
                reject(error);
              });
          })
          .catch((error) => {
            reject(error);
          });
      });
    },
    // èŽ·å–å‚æ•°ä¿¡æ¯
    GetConfig({ commit, state }) {
      return new Promise((resolve, reject) => {
        listConfig({ configName: "再次随访" })
          .then((res) => {
            if (res.rows && res.rows.length > 0)
              commit("SET_visitAgain", res.rows[0].configValue);
            resolve(res);
          })
          .catch((error) => {
@@ -289,7 +307,6 @@
          });
      });
    },
    // é€€å‡ºç³»ç»Ÿ
    LogOut({ commit, state }) {
      return new Promise((resolve, reject) => {
src/utils/index.js
@@ -1,18 +1,26 @@
import { parseTime } from './ruoyi'
import { parseTime } from "./ruoyi";
import store from "@/store";
/**
 * è¡¨æ ¼æ—¶é—´æ ¼å¼åŒ–
 */
export function formatDate(cellValue) {
  if (cellValue == null || cellValue == "") return "";
  var date = new Date(cellValue)
  var year = date.getFullYear()
  var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
  var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
  var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
  var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
  var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
  return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
  var date = new Date(cellValue);
  var year = date.getFullYear();
  var month =
    date.getMonth() + 1 < 10
      ? "0" + (date.getMonth() + 1)
      : date.getMonth() + 1;
  var day = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
  var hours = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
  var minutes =
    date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
  var seconds =
    date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
  return (
    year + "-" + month + "-" + day + " " + hours + ":" + minutes + ":" + seconds
  );
}
/**
@@ -21,40 +29,40 @@
 * @returns {string}
 */
export function formatTime(time, option) {
  if (('' + time).length === 10) {
    time = parseInt(time) * 1000
  if (("" + time).length === 10) {
    time = parseInt(time) * 1000;
  } else {
    time = +time
    time = +time;
  }
  const d = new Date(time)
  const now = Date.now()
  const d = new Date(time);
  const now = Date.now();
  const diff = (now - d) / 1000
  const diff = (now - d) / 1000;
  if (diff < 30) {
    return '刚刚'
    return "刚刚";
  } else if (diff < 3600) {
    // less 1 hour
    return Math.ceil(diff / 60) + '分钟前'
    return Math.ceil(diff / 60) + "分钟前";
  } else if (diff < 3600 * 24) {
    return Math.ceil(diff / 3600) + '小时前'
    return Math.ceil(diff / 3600) + "小时前";
  } else if (diff < 3600 * 24 * 2) {
    return '1天前'
    return "1天前";
  }
  if (option) {
    return parseTime(time, option)
    return parseTime(time, option);
  } else {
    return (
      d.getMonth() +
      1 +
      '月' +
      "月" +
      d.getDate() +
      '日' +
      "日" +
      d.getHours() +
      '时' +
      "时" +
      d.getMinutes() +
      '分'
    )
      "分"
    );
  }
}
@@ -63,18 +71,18 @@
 * @returns {Object}
 */
export function getQueryObject(url) {
  url = url == null ? window.location.href : url
  const search = url.substring(url.lastIndexOf('?') + 1)
  const obj = {}
  const reg = /([^?&=]+)=([^?&=]*)/g
  url = url == null ? window.location.href : url;
  const search = url.substring(url.lastIndexOf("?") + 1);
  const obj = {};
  const reg = /([^?&=]+)=([^?&=]*)/g;
  search.replace(reg, (rs, $1, $2) => {
    const name = decodeURIComponent($1)
    let val = decodeURIComponent($2)
    val = String(val)
    obj[name] = val
    return rs
  })
  return obj
    const name = decodeURIComponent($1);
    let val = decodeURIComponent($2);
    val = String(val);
    obj[name] = val;
    return rs;
  });
  return obj;
}
/**
@@ -83,14 +91,14 @@
 */
export function byteLength(str) {
  // returns the byte length of an utf8 string
  let s = str.length
  let s = str.length;
  for (var i = str.length - 1; i >= 0; i--) {
    const code = str.charCodeAt(i)
    if (code > 0x7f && code <= 0x7ff) s++
    else if (code > 0x7ff && code <= 0xffff) s += 2
    if (code >= 0xDC00 && code <= 0xDFFF) i--
    const code = str.charCodeAt(i);
    if (code > 0x7f && code <= 0x7ff) s++;
    else if (code > 0x7ff && code <= 0xffff) s += 2;
    if (code >= 0xdc00 && code <= 0xdfff) i--;
  }
  return s
  return s;
}
/**
@@ -98,13 +106,13 @@
 * @returns {Array}
 */
export function cleanArray(actual) {
  const newArray = []
  const newArray = [];
  for (let i = 0; i < actual.length; i++) {
    if (actual[i]) {
      newArray.push(actual[i])
      newArray.push(actual[i]);
    }
  }
  return newArray
  return newArray;
}
/**
@@ -112,13 +120,13 @@
 * @returns {Array}
 */
export function param(json) {
  if (!json) return ''
  if (!json) return "";
  return cleanArray(
    Object.keys(json).map(key => {
      if (json[key] === undefined) return ''
      return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
    Object.keys(json).map((key) => {
      if (json[key] === undefined) return "";
      return encodeURIComponent(key) + "=" + encodeURIComponent(json[key]);
    })
  ).join('&')
  ).join("&");
}
/**
@@ -126,21 +134,21 @@
 * @returns {Object}
 */
export function param2Obj(url) {
  const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
  const search = decodeURIComponent(url.split("?")[1]).replace(/\+/g, " ");
  if (!search) {
    return {}
    return {};
  }
  const obj = {}
  const searchArr = search.split('&')
  searchArr.forEach(v => {
    const index = v.indexOf('=')
  const obj = {};
  const searchArr = search.split("&");
  searchArr.forEach((v) => {
    const index = v.indexOf("=");
    if (index !== -1) {
      const name = v.substring(0, index)
      const val = v.substring(index + 1, v.length)
      obj[name] = val
      const name = v.substring(0, index);
      const val = v.substring(index + 1, v.length);
      obj[name] = val;
    }
  })
  return obj
  });
  return obj;
}
/**
@@ -148,9 +156,9 @@
 * @returns {string}
 */
export function html2Text(val) {
  const div = document.createElement('div')
  div.innerHTML = val
  return div.textContent || div.innerText
  const div = document.createElement("div");
  div.innerHTML = val;
  return div.textContent || div.innerText;
}
/**
@@ -160,21 +168,21 @@
 * @returns {Object}
 */
export function objectMerge(target, source) {
  if (typeof target !== 'object') {
    target = {}
  if (typeof target !== "object") {
    target = {};
  }
  if (Array.isArray(source)) {
    return source.slice()
    return source.slice();
  }
  Object.keys(source).forEach(property => {
    const sourceProperty = source[property]
    if (typeof sourceProperty === 'object') {
      target[property] = objectMerge(target[property], sourceProperty)
  Object.keys(source).forEach((property) => {
    const sourceProperty = source[property];
    if (typeof sourceProperty === "object") {
      target[property] = objectMerge(target[property], sourceProperty);
    } else {
      target[property] = sourceProperty
      target[property] = sourceProperty;
    }
  })
  return target
  });
  return target;
}
/**
@@ -183,18 +191,18 @@
 */
export function toggleClass(element, className) {
  if (!element || !className) {
    return
    return;
  }
  let classString = element.className
  const nameIndex = classString.indexOf(className)
  let classString = element.className;
  const nameIndex = classString.indexOf(className);
  if (nameIndex === -1) {
    classString += '' + className
    classString += "" + className;
  } else {
    classString =
      classString.substr(0, nameIndex) +
      classString.substr(nameIndex + className.length)
      classString.substr(nameIndex + className.length);
  }
  element.className = classString
  element.className = classString;
}
/**
@@ -202,10 +210,10 @@
 * @returns {Date}
 */
export function getTime(type) {
  if (type === 'start') {
    return new Date().getTime() - 3600 * 1000 * 24 * 90
  if (type === "start") {
    return new Date().getTime() - 3600 * 1000 * 24 * 90;
  } else {
    return new Date(new Date().toDateString())
    return new Date(new Date().toDateString());
  }
}
@@ -216,38 +224,38 @@
 * @return {*}
 */
export function debounce(func, wait, immediate) {
  let timeout, args, context, timestamp, result
  let timeout, args, context, timestamp, result;
  const later = function() {
  const later = function () {
    // æ®ä¸Šä¸€æ¬¡è§¦å‘æ—¶é—´é—´éš”
    const last = +new Date() - timestamp
    const last = +new Date() - timestamp;
    // ä¸Šæ¬¡è¢«åŒ…装函数被调用时间间隔 last å°äºŽè®¾å®šæ—¶é—´é—´éš” wait
    if (last < wait && last > 0) {
      timeout = setTimeout(later, wait - last)
      timeout = setTimeout(later, wait - last);
    } else {
      timeout = null
      timeout = null;
      // å¦‚果设定为immediate===true,因为开始边界已经调用过了此处无需调用
      if (!immediate) {
        result = func.apply(context, args)
        if (!timeout) context = args = null
        result = func.apply(context, args);
        if (!timeout) context = args = null;
      }
    }
  }
  };
  return function(...args) {
    context = this
    timestamp = +new Date()
    const callNow = immediate && !timeout
  return function (...args) {
    context = this;
    timestamp = +new Date();
    const callNow = immediate && !timeout;
    // å¦‚果延时不存在,重新设定延时
    if (!timeout) timeout = setTimeout(later, wait)
    if (!timeout) timeout = setTimeout(later, wait);
    if (callNow) {
      result = func.apply(context, args)
      context = args = null
      result = func.apply(context, args);
      context = args = null;
    }
    return result
  }
    return result;
  };
}
/**
@@ -258,18 +266,18 @@
 * @returns {Object}
 */
export function deepClone(source) {
  if (!source && typeof source !== 'object') {
    throw new Error('error arguments', 'deepClone')
  if (!source && typeof source !== "object") {
    throw new Error("error arguments", "deepClone");
  }
  const targetObj = source.constructor === Array ? [] : {}
  Object.keys(source).forEach(keys => {
    if (source[keys] && typeof source[keys] === 'object') {
      targetObj[keys] = deepClone(source[keys])
  const targetObj = source.constructor === Array ? [] : {};
  Object.keys(source).forEach((keys) => {
    if (source[keys] && typeof source[keys] === "object") {
      targetObj[keys] = deepClone(source[keys]);
    } else {
      targetObj[keys] = source[keys]
      targetObj[keys] = source[keys];
    }
  })
  return targetObj
  });
  return targetObj;
}
/**
@@ -277,16 +285,16 @@
 * @returns {Array}
 */
export function uniqueArr(arr) {
  return Array.from(new Set(arr))
  return Array.from(new Set(arr));
}
/**
 * @returns {string}
 */
export function createUniqueString() {
  const timestamp = +new Date() + ''
  const randomNum = parseInt((1 + Math.random()) * 65536) + ''
  return (+(randomNum + timestamp)).toString(32)
  const timestamp = +new Date() + "";
  const randomNum = parseInt((1 + Math.random()) * 65536) + "";
  return (+(randomNum + timestamp)).toString(32);
}
/**
@@ -296,7 +304,7 @@
 * @returns {boolean}
 */
export function hasClass(ele, cls) {
  return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
  return !!ele.className.match(new RegExp("(\\s|^)" + cls + "(\\s|$)"));
}
/**
@@ -305,7 +313,7 @@
 * @param {string} cls
 */
export function addClass(ele, cls) {
  if (!hasClass(ele, cls)) ele.className += ' ' + cls
  if (!hasClass(ele, cls)) ele.className += " " + cls;
}
/**
@@ -315,76 +323,73 @@
 */
export function removeClass(ele, cls) {
  if (hasClass(ele, cls)) {
    const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
    ele.className = ele.className.replace(reg, ' ')
    const reg = new RegExp("(\\s|^)" + cls + "(\\s|$)");
    ele.className = ele.className.replace(reg, " ");
  }
}
export function makeMap(str, expectsLowerCase) {
  const map = Object.create(null)
  const list = str.split(',')
  const map = Object.create(null);
  const list = str.split(",");
  for (let i = 0; i < list.length; i++) {
    map[list[i]] = true
    map[list[i]] = true;
  }
  return expectsLowerCase
    ? val => map[val.toLowerCase()]
    : val => map[val]
  return expectsLowerCase ? (val) => map[val.toLowerCase()] : (val) => map[val];
}
export const exportDefault = 'export default '
export const exportDefault = "export default ";
export const beautifierConf = {
  html: {
    indent_size: '2',
    indent_char: ' ',
    max_preserve_newlines: '-1',
    indent_size: "2",
    indent_char: " ",
    max_preserve_newlines: "-1",
    preserve_newlines: false,
    keep_array_indentation: false,
    break_chained_methods: false,
    indent_scripts: 'separate',
    brace_style: 'end-expand',
    indent_scripts: "separate",
    brace_style: "end-expand",
    space_before_conditional: true,
    unescape_strings: false,
    jslint_happy: false,
    end_with_newline: true,
    wrap_line_length: '110',
    wrap_line_length: "110",
    indent_inner_html: true,
    comma_first: false,
    e4x: true,
    indent_empty_lines: true
    indent_empty_lines: true,
  },
  js: {
    indent_size: '2',
    indent_char: ' ',
    max_preserve_newlines: '-1',
    indent_size: "2",
    indent_char: " ",
    max_preserve_newlines: "-1",
    preserve_newlines: false,
    keep_array_indentation: false,
    break_chained_methods: false,
    indent_scripts: 'normal',
    brace_style: 'end-expand',
    indent_scripts: "normal",
    brace_style: "end-expand",
    space_before_conditional: true,
    unescape_strings: false,
    jslint_happy: true,
    end_with_newline: true,
    wrap_line_length: '110',
    wrap_line_length: "110",
    indent_inner_html: true,
    comma_first: false,
    e4x: true,
    indent_empty_lines: true
  }
}
    indent_empty_lines: true,
  },
};
// é¦–字母大小
export function titleCase(str) {
  return str.replace(/( |^)[a-z]/g, L => L.toUpperCase())
  return str.replace(/( |^)[a-z]/g, (L) => L.toUpperCase());
}
// ä¸‹åˆ’转驼峰
export function camelCase(str) {
  return str.replace(/_[a-z]/g, str1 => str1.substr(-1).toUpperCase())
  return str.replace(/_[a-z]/g, (str1) => str1.substr(-1).toUpperCase());
}
export function isNumberStr(str) {
  return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str)
  return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str);
}
src/utils/ruoyi.js
@@ -3,6 +3,7 @@
 * Copyright (c) 2019 ruoyi
 */
import dayjs from "dayjs";
import store from "@/store";
// æ—¥æœŸæ ¼å¼åŒ–
export function parseTime(time, pattern) {
@@ -62,6 +63,16 @@
  // è¿”回天数,四舍五入到最接近的整数
  return Math.round(differenceInDays);
}
export function followupAuthority() {
  const depts = store.getters.belongDepts;
  const wards = store.getters.belongWards;
console.log(1);
  return (
    (Array.isArray(depts) && depts.length > 0) ||
    (Array.isArray(wards) && wards.length > 0)
  );
}
// è¿‡æ»¤å™¨
export function formatTime(val) {
  if (val) {
@@ -83,8 +94,8 @@
  let search = params;
  search.params =
    typeof search.params === "object" &&
    search.params !== null &&
    !Array.isArray(search.params)
      search.params !== null &&
      !Array.isArray(search.params)
      ? search.params
      : {};
  dateRange = Array.isArray(dateRange) ? dateRange : [];
src/views/followvisit/Continue/index.vue
@@ -1340,6 +1340,11 @@
      } else {
        this.topqueryParams.deptOrDistrict = 1;
      }
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
@@ -1833,7 +1838,8 @@
            '"的数据项?'
        )
        .then(() => {
          getTaskservelist({
      getTaskservelist({
            patid: row.patid,
            taskid: row.taskid,
          }).then((res) => {
src/views/followvisit/OutpatientAgain/index.vue
@@ -1178,6 +1178,11 @@
      } else {
        this.topqueryParams.deptOrDistrict = 1;
      }
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
@@ -1614,7 +1619,8 @@
            '"的数据项?'
        )
        .then(() => {
          getTaskservelist({
      getTaskservelist({
            patid: row.patid,
            taskid: row.taskid,
          }).then((res) => {
src/views/followvisit/SpecificDisease/index.vue
@@ -978,6 +978,11 @@
      }else{
        this.topqueryParams.deptOrDistrict=1;
      }
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
@@ -1317,7 +1322,8 @@
            '"的数据项?'
        )
        .then(() => {
          getTaskservelist({
      getTaskservelist({
            patid: row.patid,
            taskid: row.taskid,
          }).then((res) => {
src/views/followvisit/Tracking/index.vue
@@ -1117,6 +1117,11 @@
      } else {
        this.topqueryParams.deptOrDistrict = 1;
      }
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
@@ -1553,7 +1558,8 @@
            '"的数据项?'
        )
        .then(() => {
          getTaskservelist({
      getTaskservelist({
            patid: row.patid,
            taskid: row.taskid,
          }).then((res) => {
src/views/followvisit/again/index.vue
@@ -1177,6 +1177,12 @@
      } else {
        this.topqueryParams.deptOrDistrict = 1;
      }
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
@@ -1613,7 +1619,8 @@
            '"的数据项?'
        )
        .then(() => {
          getTaskservelist({
      getTaskservelist({
            patid: row.patid,
            taskid: row.taskid,
          }).then((res) => {
src/views/followvisit/beHospitalized/followUp.vue
@@ -347,11 +347,11 @@
              type="text"
              @click="
                gettoken360(
                    scope.row.sfzh,
                    scope.row.drcode,
                    scope.row.drname,
                    scope.row.patid
                  )
                  scope.row.sfzh,
                  scope.row.drcode,
                  scope.row.drname,
                  scope.row.patid
                )
              "
              ><span class="button-textsc">{{
                scope.row.sendname
@@ -411,9 +411,7 @@
                >
              </div>
              <div v-if="scope.row.sendstate == 7">
                <el-tag type="danger" :disable-transitions="false"
                  >超时</el-tag
                >
                <el-tag type="danger" :disable-transitions="false">超时</el-tag>
              </div>
            </el-tooltip>
          </template>
@@ -1087,7 +1085,7 @@
  addserviceSubtask,
  query360PatInfo,
  addsatisfaction,
  query360PatInfonh
  query360PatInfonh,
} from "@/api/AiCentre/index";
import { alterpatient, particularpatient } from "@/api/patient/homepage";
import Treeselect from "@riophae/vue-treeselect";
@@ -1256,7 +1254,7 @@
          value: 8,
          label: "应随访日期(倒序)",
        },
         {
        {
          value: 9,
          label: "按照患者排序",
        },
@@ -1308,7 +1306,7 @@
          value: 6,
          label: "已完成",
        },
         {
        {
          value: 7,
          label: "超时",
        },
@@ -1486,6 +1484,12 @@
        this.topqueryParams.deptOrDistrict = 2;
      } else {
        this.topqueryParams.deptOrDistrict = 1;
      }
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
@@ -2004,7 +2008,8 @@
            '"的数据项?'
        )
        .then(() => {
          getTaskservelist({
      getTaskservelist({
            patid: row.patid,
            taskid: row.taskid,
          }).then((res) => {
@@ -2070,7 +2075,7 @@
        {
          ...this.topqueryParams,
        },
        `user_${new Date().getTime()}.xlsx`,
        `user_${new Date().getTime()}.xlsx`
      );
    },
    // å¼‚常列渲染
src/views/followvisit/beHospitalized/publicity.vue
@@ -857,6 +857,11 @@
        this.topqueryParams.deptOrDistrict = 1;
      }
      console.log(55);
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.userList.forEach((item) => {
src/views/followvisit/complaint/index.vue
@@ -1269,6 +1269,11 @@
      } else {
        this.topqueryParams.deptOrDistrict = 1;
      }
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
@@ -1741,7 +1746,8 @@
            '"的数据项?'
        )
        .then(() => {
          getTaskservelist({
      getTaskservelist({
            patid: row.patid,
            taskid: row.taskid,
          }).then((res) => {
src/views/followvisit/discharge/index.vue
@@ -346,7 +346,12 @@
              size="medium"
              type="text"
              @click="
                gettoken360(scope.row.sfzh, scope.row.drcode, scope.row.drname,scope.row.patid)
                gettoken360(
                  scope.row.sfzh,
                  scope.row.drcode,
                  scope.row.drname,
                  scope.row.patid
                )
              "
              ><span class="button-textsc">{{
                scope.row.sendname
@@ -406,9 +411,7 @@
                >
              </div>
              <div v-if="scope.row.sendstate == 7">
                <el-tag type="danger" :disable-transitions="false"
                  >超时</el-tag
                >
                <el-tag type="danger" :disable-transitions="false">超时</el-tag>
              </div>
            </el-tooltip>
          </template>
@@ -1082,7 +1085,7 @@
  addserviceSubtask,
  query360PatInfo,
  addsatisfaction,
  query360PatInfonh
  query360PatInfonh,
} from "@/api/AiCentre/index";
import { alterpatient, particularpatient } from "@/api/patient/homepage";
import Treeselect from "@riophae/vue-treeselect";
@@ -1251,7 +1254,7 @@
          value: 8,
          label: "应随访日期(倒序)",
        },
         {
        {
          value: 9,
          label: "按照患者排序",
        },
@@ -1303,7 +1306,7 @@
          value: 6,
          label: "已完成",
        },
         {
        {
          value: 7,
          label: "超时",
        },
@@ -1482,6 +1485,11 @@
      } else {
        this.topqueryParams.deptOrDistrict = 1;
      }
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
@@ -1833,8 +1841,8 @@
    },
    //患者360跳转
    gettoken360(sfzh, drcode, drname, id) {
     const orgname = localStorage.getItem("orgname");
       if (orgname == "南华大学附属第一医院") {
      const orgname = localStorage.getItem("orgname");
      if (orgname == "南华大学附属第一医院") {
        query360PatInfonh(id).then((res) => {
          if (res.url) {
            window.open(res.url, "_blank");
@@ -2060,7 +2068,7 @@
    handleExport() {
      const originalPageNum = this.topqueryParams.pageNum;
      const originalPageSize = this.topqueryParams.pageSize;
this.topqueryParams.pageNum = null;
      this.topqueryParams.pageNum = null;
      this.topqueryParams.pageSize = null;
      this.download(
        "smartor/serviceSubtask/patItemExport",
@@ -2072,7 +2080,7 @@
        // å¯¼å‡ºåŽæ¢å¤åˆ†é¡µå‚æ•°
        this.topqueryParams.pageNum = originalPageNum;
        this.topqueryParams.pageSize = originalPageSize;
        this.getList()
        this.getList();
      });
    },
    // å¼‚常列渲染
src/views/followvisit/discharge/outpatientService.vue
@@ -1162,6 +1162,11 @@
      } else {
        this.topqueryParams.deptOrDistrict = 1;
      }
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
@@ -1587,7 +1592,8 @@
            '"的数据项?'
        )
        .then(() => {
          getTaskservelist({
      getTaskservelist({
            patid: row.patid,
            taskid: row.taskid,
          }).then((res) => {
src/views/followvisit/mzsatisfaction/index.vue
@@ -1313,6 +1313,11 @@
      } else {
        this.topqueryParams.deptOrDistrict = 1;
      }
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
src/views/followvisit/outpatient/index.vue
@@ -875,6 +875,11 @@
      this.loading = true;
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
src/views/followvisit/record/detailpage/index.vue
@@ -77,7 +77,7 @@
                    scope.row.sfzh,
                    scope.row.drcode,
                    scope.row.drname,
                    scope.row.patid,
                    scope.row.patid
                  )
                "
                ><span class="button-textsc">{{
@@ -577,7 +577,7 @@
                  type="primary"
                  round
                  @click="sendAgain"
                  v-if="form.isVisitAgain != 2"
                  v-if="(form.isVisitAgain != 2) & (visitAgain == 2)"
                >
                  å†æ¬¡éšè®¿
                </el-button>
@@ -1167,6 +1167,7 @@
import CallButton from "@/components/CallButton";
import MergeAndModify from "./MergeAndModify.vue";
import CallCenterLs from "@/components/CallCenterLs";
import store from "@/store";
export default {
  components: {
    CallButton,
@@ -1255,6 +1256,7 @@
      }, 300);
    };
    return {
      visitAgain: 1,
      userid: "",
      currentPhoneNumber: "",
      callType: "", // ç”¨äºŽåŒºåˆ†æ˜¯å“ªä¸ªç”µè¯
@@ -1572,6 +1574,9 @@
    this.Voicetype = this.$route.query.Voicetype;
    this.visitCount = this.$route.query.visitCount;
    this.serviceType = this.$route.query.serviceType;
    this.visitAgain = store.getters.visitAgain;
    console.log(store.getters.visitAgain);
    this.orgname = localStorage.getItem("orgname");
    if (this.orgname == "省立同德翠苑院区") {
@@ -1947,7 +1952,7 @@
          this.Editsingletasksonyic(this.serviceStates);
          const orgName = localStorage.getItem("orgname");
          if (this.form.isVisitAgain != 1 || orgName == "丽水市中医院") {
          if (this.form.isVisitAgain != 1 || orgName == "丽水市中医院"||this.visitAgain==1) {
            this.Torouter();
            return;
          }
@@ -2144,7 +2149,7 @@
      const orgName = localStorage.getItem("orgname");
      console.log(orgName, "orgName");
      if (this.form.isVisitAgain != 1 || orgName == "丽水市中医院") {
      if (this.form.isVisitAgain != 1 || orgName == "丽水市中医院"||this.visitAgain==1) {
        this.Torouter();
        return;
      }
@@ -2215,6 +2220,9 @@
          this.selectedTag = this.form.excep;
          const targetDate = new Date(this.form.visitTime); // ç›®æ ‡æ—¥æœŸ
          const now = new Date(); // å½“前时间
          console.log(now,'当前时间');
          console.log(targetDate,'目标日期');
          if (now < targetDate && this.form.sendstate == 2) {
            this.$confirm("当前服务未到发送时间请谨慎修改", "提示", {
              confirmButtonText: "确定",
src/views/followvisit/record/index.vue
@@ -1096,6 +1096,11 @@
      } else {
        this.topqueryParams.deptOrDistrict = 1;
      }
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
@@ -1528,7 +1533,8 @@
            '"的数据项?'
        )
        .then(() => {
          getTaskservelist({
      getTaskservelist({
            patid: row.patid,
            taskid: row.taskid,
          }).then((res) => {
src/views/followvisit/record/physical/index.vue
@@ -703,14 +703,7 @@
            this.$modal.msgWarning("360查询无结果");
          }
        });
        return;
      } else if (
        orgname == "第一人民医院湖滨院区" ||
        orgname == "第一人民医院吴山院区"
      ) {
        let url = `http://192.200.81.189:9100/blj/view?BINGRENID=${id}&YONGHUID=DBA`;
        window.open(url, "_blank");
        return;
        return
      }
      this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh;
src/views/followvisit/technology/index.vue
@@ -991,6 +991,11 @@
      }else{
        this.topqueryParams.deptOrDistrict=1;
      }
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
@@ -1392,7 +1397,8 @@
            '"的数据项?'
        )
        .then(() => {
          getTaskservelist({
      getTaskservelist({
            patid: row.patid,
            taskid: row.taskid,
          }).then((res) => {
src/views/followvisit/zbAgain/index.vue
@@ -1168,6 +1168,11 @@
      } else {
        this.topqueryParams.deptOrDistrict = 1;
      }
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
@@ -1604,7 +1609,8 @@
            '"的数据项?'
        )
        .then(() => {
          getTaskservelist({
      getTaskservelist({
            patid: row.patid,
            taskid: row.taskid,
          }).then((res) => {
src/views/followvisit/zysatisfaction/index.vue
@@ -1272,6 +1272,11 @@
      } else {
        this.topqueryParams.deptOrDistrict = 1;
      }
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
@@ -1744,7 +1749,8 @@
            '"的数据项?'
        )
        .then(() => {
          getTaskservelist({
      getTaskservelist({
            patid: row.patid,
            taskid: row.taskid,
          }).then((res) => {
src/views/outsideChainwtnew.vue
@@ -1,160 +1,177 @@
<template>
  <div class="questionnaire-optimized">
    <div class="content-wrapper" v-if="!accomplish">
      <div class="questionnaire-container">
        <!-- é—®å·æ ‡é¢˜åŒºåŸŸ -->
        <div class="questionnaire-header">
          <h1 class="questionnaire-title">
            {{ taskname ? taskname : "问卷" }}
          </h1>
          <div class="questionnaire-description">
            {{
              kcb
                ? kcb
                : "亲爱的患者-家属,我们是医院的医护人员,为了更好地了解您的康复情况,请您抽一点宝贵时间,完成这份随访问卷。"
            }}
          </div>
        </div>
        <el-divider class="custom-divider"></el-divider>
        <!-- é—®å·é¢˜ç›®åŒºåŸŸ -->
        <div class="questions-section">
          <div
            class="question-item"
            v-for="(item, index) in visibleQuestions"
            :key="item.id"
            :class="{
              'has-warning':
                item.prompt &&
                item.scriptResult &&
                (item.scriptType !== 2 || item.scriptResult.length > 0),
            }"
          >
            <!-- é¢˜ç›®é¢˜å¹² -->
            <div class="question-stem">
              <span class="question-number"
                >{{ getVisibleQuestionIndex(index) }}.</span
              >
              <span class="question-text">{{ item.scriptContent }}</span>
              <span class="question-type-tag">
                {{
                  item.scriptType === 1
                    ? "[单选]"
                    : item.scriptType === 2
                    ? "[多选]"
                    : "[问答]"
                }}
              </span>
            </div>
            <!-- å•选题目 -->
            <div
              class="question-options"
              v-if="item.scriptType == 1 && !item.ishide"
            >
              <el-radio-group class="options-group" v-model="item.scriptResult">
                <el-radio
                  v-for="(
                    option, optionIndex
                  ) in item.svyTaskTemplateTargetoptions"
                  :key="optionIndex"
                  :label="option.optioncontent"
                  :class="{
                    'abnormal-option':
                      option.isabnormal &&
                      item.scriptResult == option.optioncontent,
                  }"
                  @click.native.prevent="
                    handleRadioToggle(
                      item,
                      index,
                      item.svyTaskTemplateTargetoptions,
                      option.optioncontent
                    )
                  "
                  class="option-radio"
                >
                  <span class="option-text">{{ option.optioncontent }}</span>
                </el-radio>
              </el-radio-group>
            </div>
            <!-- å¤šé€‰é¢˜ç›® -->
            <div class="question-options" v-if="item.scriptType == 2">
              <el-checkbox-group
                class="options-group"
                v-model="item.scriptResult"
              >
                <el-checkbox
                  v-for="(
                    option, optionIndex
                  ) in item.svyTaskTemplateTargetoptions"
                  :key="optionIndex"
                  :label="option.optioncontent"
                  :class="{
                    'abnormal-option': option.isabnormal,
                  }"
                  @change="$forceUpdate()"
                  class="option-checkbox"
                >
                  <span class="option-text">{{ option.optioncontent }}</span>
                </el-checkbox>
              </el-checkbox-group>
            </div>
            <!-- å¡«ç©ºé¢˜ç›® -->
            <div class="question-input" v-if="item.scriptType == 4">
              <el-input
                type="textarea"
                :rows="3"
                placeholder="请输入您的回答"
                v-model="item.scriptResult"
                clearable
                class="answer-textarea"
              ></el-input>
            </div>
            <!-- æç¤ºä¿¡æ¯ -->
            <div
              class="question-warning"
              v-show="
                item.prompt &&
                item.scriptResult &&
                (item.scriptType !== 2 || item.scriptResult.length > 0)
              "
            >
              <el-alert
                :title="item.prompt"
                type="warning"
                :closable="false"
                class="warning-alert"
              ></el-alert>
            </div>
          </div>
        </div>
        <!-- æäº¤æŒ‰é’® -->
        <div class="submit-section">
          <el-button type="primary" @click="cache(true)" class="submit-button">
            æäº¤é—®å·
          </el-button>
        </div>
    <div v-if="loading" class="loading-container">
      <div class="loading-content">
        <i class="el-icon-loading loading-icon"></i>
        <div class="loading-text">问卷加载中,请稍候...</div>
      </div>
    </div>
    <!-- å®Œæˆé¡µé¢ -->
    <div class="completion-page" v-else>
      <div class="completion-content">
        <div class="completion-icon">✓</div>
        <h2 class="completion-title">感谢您的配合!</h2>
        <p class="completion-message">
          {{
            jsy
              ? jsy
              : "生活上要劳逸结合,注意休息和营养,适当锻炼,戒烟限酒,保持心情舒畅,定期复诊。那本次回访就到这里,祝您身体健康!"
          }}
        </p>
    <!-- æ­£å¸¸å†…容 -->
    <div v-else>
      <div class="content-wrapper" v-if="!accomplish">
        <div class="questionnaire-container">
          <!-- é—®å·æ ‡é¢˜åŒºåŸŸ -->
          <div class="questionnaire-header">
            <h1 class="questionnaire-title">
              {{ taskname ? taskname : "问卷" }}
            </h1>
            <div class="questionnaire-description">
              {{
                kcb
                  ? kcb
                  : "亲爱的患者-家属,我们是医院的医护人员,为了更好地了解您的康复情况,请您抽一点宝贵时间,完成这份随访问卷。"
              }}
            </div>
          </div>
          <el-divider class="custom-divider"></el-divider>
          <!-- é—®å·é¢˜ç›®åŒºåŸŸ -->
          <div class="questions-section">
            <div
              class="question-item"
              v-for="(item, index) in visibleQuestions"
              :key="item.id"
              :class="{
                'has-warning':
                  item.prompt &&
                  item.scriptResult &&
                  (item.scriptType !== 2 || item.scriptResult.length > 0),
              }"
            >
              <!-- é¢˜ç›®é¢˜å¹² -->
              <div class="question-stem">
                <span class="question-number"
                  >{{ getVisibleQuestionIndex(index) }}.</span
                >
                <span class="question-text">{{ item.scriptContent }}</span>
                <span class="question-type-tag">
                  {{
                    item.scriptType === 1
                      ? "[单选]"
                      : item.scriptType === 2
                      ? "[多选]"
                      : "[问答]"
                  }}
                </span>
              </div>
              <!-- å•选题目 -->
              <div
                class="question-options"
                v-if="item.scriptType == 1 && !item.ishide"
              >
                <el-radio-group
                  class="options-group"
                  v-model="item.scriptResult"
                >
                  <el-radio
                    v-for="(
                      option, optionIndex
                    ) in item.svyTaskTemplateTargetoptions"
                    :key="optionIndex"
                    :label="option.optioncontent"
                    :class="{
                      'abnormal-option':
                        option.isabnormal &&
                        item.scriptResult == option.optioncontent,
                    }"
                    @click.native.prevent="
                      handleRadioToggle(
                        item,
                        index,
                        item.svyTaskTemplateTargetoptions,
                        option.optioncontent
                      )
                    "
                    class="option-radio"
                  >
                    <span class="option-text">{{ option.optioncontent }}</span>
                  </el-radio>
                </el-radio-group>
              </div>
              <!-- å¤šé€‰é¢˜ç›® -->
              <div class="question-options" v-if="item.scriptType == 2">
                <el-checkbox-group
                  class="options-group"
                  v-model="item.scriptResult"
                >
                  <el-checkbox
                    v-for="(
                      option, optionIndex
                    ) in item.svyTaskTemplateTargetoptions"
                    :key="optionIndex"
                    :label="option.optioncontent"
                    :class="{
                      'abnormal-option': option.isabnormal,
                    }"
                    @change="$forceUpdate()"
                    class="option-checkbox"
                  >
                    <span class="option-text">{{ option.optioncontent }}</span>
                  </el-checkbox>
                </el-checkbox-group>
              </div>
              <!-- å¡«ç©ºé¢˜ç›® -->
              <div class="question-input" v-if="item.scriptType == 4">
                <el-input
                  type="textarea"
                  :rows="3"
                  placeholder="请输入您的回答"
                  v-model="item.scriptResult"
                  clearable
                  class="answer-textarea"
                ></el-input>
              </div>
              <!-- æç¤ºä¿¡æ¯ -->
              <div
                class="question-warning"
                v-show="
                  item.prompt &&
                  item.scriptResult &&
                  (item.scriptType !== 2 || item.scriptResult.length > 0)
                "
              >
                <el-alert
                  :title="item.prompt"
                  type="warning"
                  :closable="false"
                  class="warning-alert"
                ></el-alert>
              </div>
            </div>
          </div>
          <!-- æäº¤æŒ‰é’® -->
          <div class="submit-section">
            <el-button
              type="primary"
              @click="cache(true)"
              class="submit-button"
            >
              æäº¤é—®å·
            </el-button>
          </div>
        </div>
      </div>
      <!-- å®Œæˆé¡µé¢ -->
      <div class="completion-page" v-else>
        <div class="completion-content">
          <div class="completion-icon">✓</div>
          <h2 class="completion-title">感谢您的配合!</h2>
          <p class="completion-message">
            {{
              jsy
                ? jsy
                : "生活上要劳逸结合,注意休息和营养,适当锻炼,戒烟限酒,保持心情舒畅,定期复诊。那本次回访就到这里,祝您身体健康!"
            }}
          </p>
        </div>
      </div>
    </div>
  </div>
@@ -172,6 +189,7 @@
export default {
  data() {
    return {
      loading: true,
      taskid: 355,
      patid: 265823,
      kcb: "",
@@ -179,7 +197,7 @@
      isabnormal: 0,
      taskname: "",
      questionList: [],
      param6:null,
      param6: null,
      jsy: null,
      dialogVisible: false,
      Endornot: true,
@@ -233,7 +251,6 @@
            res.data.param5
          );
          this.param6 = res.data.param6;
        }
      });
    },
@@ -253,6 +270,8 @@
      this.taskid = decodeURIComponent(param1);
      this.patid = decodeURIComponent(param2);
      this.taskname = decodeURIComponent(param3);
      this.loading = true;
      // let taskid =
      //   "OFp7tn/B6x7IzKJetvGWHdSWBj7msRlnlj6am9dyuHTH6sEt4uBbVCUXs5kcF/e4O2W6vqHf2Bz9K3/evbYDmw==";
      // let patid =
@@ -262,8 +281,8 @@
      // let taskids = this.encrypt(this.taskid);
      // let patids = this.encrypt(this.patid);
      // å…ˆå–缓存
      getCachequestionnaire({ param1: this.taskid, param2: this.patid }).then(
        (res) => {
      getCachequestionnaire({ param1: this.taskid, param2: this.patid })
        .then((res) => {
          if (res.code == 200) {
            this.questionList = res.data.result;
            this.accomplish = res.data.submit;
@@ -275,6 +294,8 @@
                  item.scriptResult = item.scriptResult.split("&");
                }
              });
              this.loading = false;
              return;
            } else {
              this.getExternalfollowup();
@@ -282,13 +303,13 @@
          } else {
            this.getExternalfollowup();
          }
        }
      );
        })
        .finally(() => {});
    },
    // èŽ·å–æ•°æ®
    getExternalfollowup() {
      getExternalfollowup({ param1: this.taskid, param2: this.patid }).then(
        (res) => {
      getExternalfollowup({ param1: this.taskid, param2: this.patid })
        .then((res) => {
          if (res.code == 200) {
            this.questionList = res.data.script;
            this.jsy = res.data.jsy;
@@ -300,9 +321,12 @@
                item.scriptResult = [];
              }
            });
            this.loading = false;
          }
        }
      );
        })
        .finally(() => {
          this.loading = false;
        });
    },
    // åŠ å¯†å‡½æ•°
    encrypt(txt) {
@@ -851,4 +875,39 @@
    font-size: 60px;
  }
}
.loading-container {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 70vh;
}
.loading-content {
  text-align: center;
  padding: 40px;
  background: #fff;
  border-radius: 8px;
  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
}
.loading-icon {
  font-size: 40px;
  color: #409eff;
  margin-bottom: 15px;
  animation: rotating 2s linear infinite;
}
.loading-text {
  font-size: 16px;
  color: #606266;
}
@keyframes rotating {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}
</style>
src/views/outsideChainxjnew.vue
@@ -1,52 +1,49 @@
<template>
  <div class="questionnaire">
    <!-- <div class="CONTENT">
      <div class="title">景宁人民医院医护知识宣教</div>
      <div class="preview-left">
        <div v-html="richText"></div>
    <!-- åŠ è½½çŠ¶æ€ -->
    <div v-if="loading" class="loading-container">
      <div class="loading-content">
        <i class="el-icon-loading loading-icon"></i>
        <div class="loading-text">宣教内容加载中,请稍候...</div>
      </div>
    </div>
    </div> -->
    <div class="CONTENT">
      <div class="preview-left">
        <div class="toptitle">
          <div class="title">
            {{ taskname ? taskname : "医护知识宣教" }}
    <!-- æ­£å¸¸å†…容 -->
    <div v-else>
      <div class="CONTENT">
        <div class="preview-left">
          <div class="toptitle">
            <div class="title">
              {{ taskname ? taskname : "医护知识宣教" }}
            </div>
            <div style="font-size: 22px; margin-bottom: 20px; line-height: 1.5">
              {{
                kcb
                  ? kcb
                  : "亲爱的患者-家属,我们是医护人员,为了更好地了解您的康复情况,请您抽一点宝贵时间,观看这份宣教资讯。"
              }}
              <!-- äº²çˆ±çš„æ‚£è€…/家属您好,为了更好的了解您出院后的康复情况,给您适当及时的健康指导,请您抽一点宝贵时间,完成这份出院随访问卷调查。 -->
            </div>
          </div>
          <div style="font-size: 22px; margin-bottom: 20px; line-height: 1.5">
          <el-divider></el-divider>
          <div v-html="richText"></div>
          <div
            style="
              text-align: center;
              padding-top: 50px;
              font-size: 24px;
              color: #175997;
              font-weight: 600;
              margin-bottom: 10px;
            "
          >
            {{
              kcb
                ? kcb
                : "亲爱的患者-家属,我们是医护人员,为了更好地了解您的康复情况,请您抽一点宝贵时间,观看这份宣教资讯。"
              jsy
                ? jsy
                : "生活上要劳逸结合,注意休息和营养,适当锻炼,戒烟限酒,保持心情舒畅,定期复诊。那本次宣教内容就到这里,祝您身体健康!"
            }}
            <!-- äº²çˆ±çš„æ‚£è€…/家属您好,为了更好的了解您出院后的康复情况,给您适当及时的健康指导,请您抽一点宝贵时间,完成这份出院随访问卷调查。 -->
          </div>
        </div>
        <el-divider></el-divider>
        <div v-html="richText"></div>
        <div
          style="
            text-align: center;
            padding-top: 50px;
            font-size: 24px;
            color: #175997;
            font-weight: 600;
            margin-bottom: 10px;
          "
        >
          {{
            jsy
              ? jsy
              : "生活上要劳逸结合,注意休息和营养,适当锻炼,戒烟限酒,保持心情舒畅,定期复诊。那本次宣教内容就到这里,祝您身体健康!"
          }}
        </div>
        <!-- <div style="font-size: 20px">
          {{
            jsy
              ? jsy
              : "生活上要劳逸结合,注意休息和营养,适当锻炼,戒烟限酒,保持心情舒畅,定期复诊。那本次宣教内容就到这里,祝您身体健康!"
          }}
        </div> -->
      </div>
    </div>
  </div>
@@ -83,6 +80,7 @@
      taskname: "",
      kcb: "",
      jsy: "",
      loading: true, // æ–°å¢žï¼šåŠ è½½çŠ¶æ€
    };
  },
@@ -92,69 +90,62 @@
  methods: {
    // è§£æžurlid
    geturlinfo() {
      // let url = window.location.href;
      this.loading = true; // å¼€å§‹åŠ è½½
      let url = this.$route.query.p;
      // let url = 'http://218.108.11.22:8093/sf/003';
      // let urlid = this.extractLastSegmentFromUrl(url);
      geturlinfo(url).then((res) => {
        if (res.code == 200) {
          this.getQuestionnaire(
            res.data.param1,
            res.data.param2,
            res.data.param3,
            res.data.param5
          );
        }
      });
      geturlinfo(url)
        .then((res) => {
          if (res.code == 200) {
            this.getQuestionnaire(
              res.data.param1,
              res.data.param2,
              res.data.param3,
              res.data.param5
            );
          } else {
            this.loading = false; // èŽ·å–URL信息失败时关闭加载
          }
        })
        .catch(() => {
          this.loading = false; // å‡ºé”™æ—¶å…³é—­åŠ è½½
        });
    },
    //     extractLastSegmentFromUrl(url) {
    //     // æ‰¾åˆ°æœ€åŽä¸€ä¸ª'/'的位置
    //     const lastSlashIndex = url.lastIndexOf('/');
    //     // å¦‚果找到了'/',截取其后的所有字符
    //     if (lastSlashIndex !== -1) {
    //         return url.substring(lastSlashIndex + 1);
    //     }
    //     // å¦‚果没有找到'/',返回空字符串
    //     return '';
    // },
    // èŽ·å–æ•°æ®
    getQuestionnaire(param1, param2, param3) {
      this.taskid = decodeURIComponent(param1);
      this.patid = decodeURIComponent(param2);
      this.taskname = decodeURIComponent(param3);
      // // let taskid =
      // //   "OFp7tn/B6x7IzKJetvGWHdSWBj7msRlnlj6am9dyuHTH6sEt4uBbVCUXs5kcF/e4O2W6vqHf2Bz9K3/evbYDmw==";
      // // let patid =
      // //   "CVk0j8O86AeCqhV5WPsBBYDg9fec0wDoDlP9imYK4wDBNIkxywZzMJEGlPagOxnq6qr2WYZo0U8MUGWRGnq8ZA==";
      // this.taskid = this.decrypt(taskid);
      // this.patid = this.decrypt(patid);
      // // this.$modal.msgSuccess("用户id为" + this.patid);
      // // this.$modal.msgSuccess("任务id为" + this.taskid);
      // let taskids = this.encrypt(this.taskid);
      // let patids = this.encrypt(this.patid);
      getExternalfollowup({ param1: this.taskid, param2: this.patid }).then(
        (res) => {
      getExternalfollowup({ param1: this.taskid, param2: this.patid })
        .then((res) => {
          if (res.code == 200) {
            this.url = res.data.script[0].richText;
            this.jsy = res.data.jsy;
            this.kcb = res.data.kcb;
            // ä¸´æ—¶èŽ·å–æ•°æ®
            // èŽ·å–å¯Œæ–‡æœ¬å†…å®¹
            axios
              .get(this.url)
              .then((response) => {
                console.log(response.data, "数据"); // è¾“出获取到的文件内容
                console.log(response.data, "数据");
                this.richText = response.data;
                this.richText = this.addStyleToImages(this.richText);
                this.loading = false; // æ•°æ®åŠ è½½å®Œæˆ
              })
              .catch((error) => {
                console.error("Failed to fetch file:", error);
                this.loading = false; // èŽ·å–å†…å®¹å¤±è´¥æ—¶å…³é—­åŠ è½½
              });
          } else {
            this.loading = false; // API返回错误时关闭加载
          }
        }
      );
        })
        .catch(() => {
          this.loading = false; // API调用失败时关闭加载
        });
    },
    addStyleToImages(html) {
      if (!html) return html;
@@ -231,6 +222,7 @@
  min-height: 100vh;
  margin: 0;
  padding: 0;
  .CONTENT {
    padding-top: 15px;
    padding-bottom: 15px;
@@ -243,16 +235,15 @@
    }
  }
}
.preview-left {
  margin: 10px;
  margin-bottom: 60px;
  background-color: #fff;
  border-radius: 5px;
  //   margin: 20px;
  padding: 10px;
  padding-bottom: 100px;
  height: 100%;
  // 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);
@@ -264,4 +255,66 @@
    }
  }
}
/* æ–°å¢žåŠ è½½æ ·å¼ */
.loading-container {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: rgba(255, 255, 255, 0.9);
  display: flex;
  justify-content: center;
  align-items: center;
  z-index: 9999;
}
.loading-content {
  text-align: center;
  padding: 40px 60px;
  background: #fff;
  border-radius: 8px;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
  border: 1px solid #e4e7ed;
}
.loading-icon {
  font-size: 40px;
  color: #3769f3;
  margin-bottom: 20px;
  animation: loading-rotate 1.5s linear infinite;
  display: block;
}
.loading-text {
  font-size: 18px;
  color: #606266;
  font-weight: 500;
  margin-top: 10px;
}
@keyframes loading-rotate {
  0% {
    transform: rotate(0deg);
  }
  100% {
    transform: rotate(360deg);
  }
}
/* å“åº”式设计 */
@media (max-width: 768px) {
  .loading-content {
    padding: 30px 40px;
  }
  .loading-icon {
    font-size: 32px;
  }
  .loading-text {
    font-size: 16px;
  }
}
</style>
src/views/patient/medtechnician/Compositeeditdetails.vue
@@ -120,7 +120,8 @@
                icon="el-icon-plus"
                v-if="!Whetherall"
                type="primary"
                @click="getTaskservelist()"
                @click="
      getTaskservelist()"
                >添加任务流程</el-button
              >
            </div>
@@ -653,7 +654,8 @@
      });
    },
    // æ–°å¢žä»»åŠ¡
    getTaskservelist() {
      getTaskservelist() {
      this.serviceVisible = true;
    },
    // å¯¼å…¥æ‚£è€…
src/views/patient/patient/hospital.vue
@@ -47,7 +47,7 @@
          </el-form-item>
          <el-form-item label="科室名称" prop="inhospno">
            <el-input
              v-model="queryParams.deptname"
              v-model="queryParams.leaveldeptname"
              placeholder="请输入科室名称"
              clearable
              style="width: 250px"
@@ -262,8 +262,8 @@
          <el-table-column
            label="科室"
            align="center"
            key="deptname"
            prop="deptname"
            key="leaveldeptname"
            prop="leaveldeptname"
            width="120"
          />
          <el-table-column
@@ -402,7 +402,7 @@
                width="120"
                align="center"
              />
              <el-table-column prop="deptname" label="科室" align="center" />
              <el-table-column prop="leaveldeptname" label="科室" align="center" />
              <el-table-column
                prop="leavehospitaldistrictname"
                label="病区"
src/views/patient/patient/profile/index.vue
@@ -1243,6 +1243,7 @@
    },
    // æŸ¥è¯¢æœåŠ¡è®°å½•
    handleClickfw() {
      getTaskservelist({
        patid: this.id,
      }).then((res) => {
src/views/patient/physical/index.vue
@@ -875,6 +875,11 @@
      this.loading = true;
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
src/views/patient/propaganda/Missionotice.vue
@@ -458,6 +458,11 @@
        this.topqueryParams.deptOrDistrict=1;
      }
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows;
        this.total = response.total;
src/views/patient/propaganda/QuestionnaireTask.vue
@@ -1523,6 +1523,9 @@
        this.form.icd10code = this.diagglist
          .map((item) => item.icdcode)
          .join(",");
          this.form.icd10name = this.diagglist
          .map((item) => item.icdname)
          .join(",");
        Editsingletask(this.form).then((res) => {
          if (res.code == 200) {
            if (this.form.taskid) {
src/views/patient/propaganda/index.vue
@@ -857,6 +857,11 @@
        this.topqueryParams.deptOrDistrict = 1;
      }
      console.log(55);
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.userList.forEach((item) => {
src/views/patient/propaganda/particty.vue
@@ -1556,6 +1556,9 @@
        this.form.icd10code = this.diagglist
          .map((item) => item.icdcode)
          .join(",");
        this.form.icd10name = this.diagglist
          .map((item) => item.icdname)
          .join(",");
        Editsingletask(this.form).then((res) => {
          if (res.code == 200) {
            if (this.form.taskid) {
src/views/patient/questionnaire/index.vue
@@ -875,6 +875,11 @@
      }else{
        this.topqueryParams.deptOrDistrict=1;
      }
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
src/views/patient/shadow/index.vue
@@ -875,6 +875,11 @@
      }else{
        this.topqueryParams.deptOrDistrict=1;
      }
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
src/views/patient/subsequent/index.vue
@@ -875,6 +875,11 @@
      this.loading = true;
      if (!this.followupAuthority()) {
        this.$message.warning("未配置科室/病区相关权限不可查询");
        return Promise.reject(new Error("无权限查询"));
      }
      getTaskservelist(this.topqueryParams).then((response) => {
        this.userList = response.rows[0].serviceSubtaskList;
        this.total = response.total;
vue.config.js
@@ -40,10 +40,10 @@
        // target: `http://192.168.100.10:8094`,//省立同德
        // target: `http://192.168.100.10:8095`,//新华
        // target: `http://192.168.100.10:8098`,//市一
        target:`http://localhost:8095`,
        // target:`http://localhost:8095`,
        // target:`http://35z1t16164.qicp.vip`,
        // target: `http://192.168.100.172:8095`,
        // target: `http://192.168.100.10:8083`,
        target: `http://192.168.100.10:8083`,//南华
        // target: `http://192.168.191.181:8095`,
        changeOrigin: true,
        pathRewrite: {
ͨÓà (2).zip
Binary files differ
ͨÓÃ.zip
Binary files differ