WXL (wul)
14 小时以前 6dec47874e2bde0962540fb33817965752d55874
测试完成
已修改8个文件
已添加4个文件
29176 ■■■■■ 文件已修改
dist.zip 补丁 | 查看 | 原始文档 | blame | 历史
lishui.zip 补丁 | 查看 | 原始文档 | blame | 历史
package.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/demotel.html 203 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/jssip-3.10.0.js 28403 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/AiCentre/questionnaire.js 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/modules/user.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/discharge/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/record/detailpage/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/sfstatistics/ProblemStatistics/index.vue 536 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/sfstatistics/percentage/satisfaction.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
vue.config.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dist.zip
Binary files differ
lishui.zip
Binary files differ
package.json
@@ -1,7 +1,7 @@
{
  "name": "ruoyi",
  "version": "3.8.5",
  "description": "景宁人民医院智慧随访平台",
  "description": "丽水人民医院智慧随访平台",
  "author": "杭新",
  "license": "MIT",
  "scripts": {
public/demotel.html
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,203 @@
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>SIP电话Demo</title>
    <meta http-equiv="Pragma" content="no-cache">
    <meta http-equiv="Expires" content="-1">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="cache-control" content="no-store">
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <script language="javascript" type="text/javascript" src="./jssip-3.10.0.js"></script>
</head>
<body style="background-color:darkgray;">
    <table border="1" cellspacing="0" bordercolor="gray" style="width:auto;">
        <tr>
            <td style="text-align:center;width:120px;">
                <span> æœåŠ¡å™¨åœ°å€:</span>
            </td>
            <td style="text-align: center; width: 250px;">
                <input id="tbServer" type="text" style="width:200px;text-align:left;" value="192.168.1.96" />
            </td>
        </tr>
        <tr>
            <td style="text-align:center;width:120px;">
                <span> åˆ†æœºå·:</span>
            </td>
            <td style="text-align: center; width: 250px;">
                <input id="tbExtension" type="text" style="width:200px;text-align:left;" value="8005" />
            </td>
        </tr>
        <tr>
            <td style="text-align:center;width:120px;">
                <span> å¯†ç :</span>
            </td>
            <td style="text-align: center; width: 250px;">
                <input id="tbPassword" type="text" style="width:200px;text-align:left;" value="8005" />
            </td>
        </tr>
        <tr>
            <td style="text-align:center;width:120px;" colspan="2">
                <button onclick="f_register()">注册</button>
            </td>
        </tr>
        <tr>
            <td style="text-align:center;width:120px;">
                <span> å‘¼å«å·ç :</span>
            </td>
            <td style="text-align: center; width: 250px;">
                <input id="tbPhoneNo" type="text" style="width:200px;text-align:left;" value="013958077789" />
            </td>
        </tr>
        <tr>
            <td style="text-align:center;width:120px;" colspan="2">
                <button onclick="f_makecall()">软外拨</button>
                <button onclick="f_hangup()">挂断</button>
            </td>
        </tr>
    </table>
    <script type="text/javascript">
        var cur_session = undefined;
        var ua = null;
        String.prototype.Right = function (i) {
            return this.slice(this.length - i, this.length);
        };
        Date.prototype.Format = function (fmt) { //author: meizz
            var o = {
                "M+": this.getMonth() + 1, //月份
                "d+": this.getDate(), //日
                "h+": this.getHours(), //小时
                "m+": this.getMinutes(), //分
                "s+": this.getSeconds(), //秒
                "q+": Math.floor((this.getMonth() + 3) / 3), //季度
                "S": ('00' + this.getMilliseconds()).Right(3)    //毫秒
            };
            if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
            for (var k in o)
                if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
            return fmt;
        };
        function logger_info(message, ...optionalParams) {
            console.log("[" + new Date().Format("yyyy-MM-dd hh:mm:ss.S") + "]" + message, optionalParams);
        }
        function f_register() {
            var server = document.getElementById('tbServer').value;
            var username = document.getElementById('tbExtension').value;
            var passwd = document.getElementById('tbPassword').value;
            var uristr = 'sip:' + username;
            if (uristr.indexOf('@') < 1)
                uristr = uristr + '@' + server;
            //
            logger_info(`开始注册到服务器:${server},分机号:${username}...`);
            var socket = new JsSIP.WebSocketInterface('wss://' + server +':7443');
            var configuration = {
                sockets: [socket],
                uri: uristr,
                password: passwd,
                display_name: username,
                iceServers: [
                    { urls: '' }
                ]
            };
            ua = new JsSIP.UA(configuration);
            ua.on('registered', function (e) { logger_info("注册成功。", e); });
            ua.on('unregistered', function (e) { logger_info('取消注册。', e); });
            ua.on('registrationFailed', function (e) { logger_info('注册失败的。', e); });
            ua.on('newRTCSession', function (e) {
                logger_info('newRTCSession', e);
                //
                cur_session = e.session;
                cur_session.on("accepted", function (e) { logger_info("呼叫已接通。", e); });
                cur_session.on("ended", function (e) { logger_info("呼叫结束。", e); });
                cur_session.oniceconnectionstatechange = function () {
                    if (cur_session.connection.iceConnectionState === 'completed') {
                        // èŽ·å–æœ¬åœ°SDP
                        const localSdp = cur_session.connection.localDescription;
                        // ä¿®æ”¹SDP(这里以修改音频编解码器优先级为例)
                        const sdp = localSdp.sdp;
                        const modifiedSdp = sdp.replace(/m=audio (\d+) RTP\/AVP (\d+) (.*)/g, (match, port, payloadTypes, formats) => {
                            // å‡è®¾æˆ‘们想将PCMU编解码器的优先级提高
                            const preferredPayloadType = '0'; // PCMU的payload type
                            const preferredFormat = formats.split(' ').find(format => format.startsWith(preferredPayloadType));
                            if (preferredFormat) {
                                const newFormats = formats.split(' ').filter(format => format !== preferredFormat).concat(preferredFormat);
                                return `m=audio ${port} RTP/AVP ${newFormats.join(' ')}`;
                            }
                            return match;
                        });
                        // åˆ›å»ºæ–°çš„RTCSessionDescription对象
                        const newDescription = new RTCSessionDescription({
                            type: localSdp.type,
                            sdp: modifiedSdp
                        });
                        // è®¾ç½®ä¿®æ”¹åŽçš„SDP
                        cur_session.connection.setLocalDescription(newDescription).catch(error => {
                            logger_info('Failed to set local description:', error);
                        });
                    }
                }
                //
                if (e.originator == "remote")
                    e.session.answer();
            });
            ua.start();
        }
        function f_hangup() {
            if (cur_session != undefined) {
                cur_session.terminate();
                cur_session = undefined;
            }
        }
        function f_makecall() {
            if (ua == undefined)
                return;
            //
            var eventHandlers = {
                'progress': function (e) {
                    logger_info('call is in progress', e);
                },
                'failed': function (e) {
                    logger_info('call failed with cause: ', e);
                },
                'ended': function (e) {
                    logger_info('呼叫结束,挂机原因: ', e);
                },
                'confirmed': function (e) {
                    logger_info('call confirmed', e);
                }
            };
            var options = {
                'eventHandlers': eventHandlers,
                'mediaConstraints': { 'audio': true, 'video': false },
                sessionTimersExpires: 1800
            };
            var server = document.getElementById('tbServer').value;
            var phone = document.getElementById('tbPhoneNo').value;
            logger_info("开始呼叫号码:", phone);
            cur_session = ua.call('sip:' + phone + '@' + server, options);
        }
    </script>
</body>
</html>
public/jssip-3.10.0.js
¶Ô±ÈÐÂÎļþ
ÎļþÌ«´ó
src/api/AiCentre/questionnaire.js
@@ -30,7 +30,14 @@
      data: data,
    });
  }
// æŸ¥è¯¢é—®é¢˜ç»Ÿè®¡
export function compileissuestatistics(data) {
    return request({
      url: "/smartor/svytemplatescript/countPatByScript",
      method: "post",
      data: data,
    });
  }
  // æ–°å¢žé—®å·é—®é¢˜åˆ†ç±»
  export function addissueclassify(data) {
src/store/modules/user.js
@@ -200,6 +200,13 @@
              localStorage.setItem("YongHuID", "1497875635748474880");
              localStorage.setItem("YongHuXM", "SYZYY");
            }
             else if (orgid == "47231077933110211A1101") {
              localStorage.setItem("orgname", "莲都区人民医院");
              localStorage.setItem("ZuHuID", "1429338802177000011");
              localStorage.setItem("deptCode", "");
              localStorage.setItem("YongHuID", "1512710152715767808");
              localStorage.setItem("YongHuXM", "LDRMYY");
            }
            resolve();
          })
          .catch((error) => {
src/views/followvisit/discharge/index.vue
@@ -1387,7 +1387,7 @@
          this.getEndOfDay()
        );
      } else {
        this.topqueryParams.endSendDateTime = null;
        // this.topqueryParams.endSendDateTime = null;
      }
      // æŽ¥å—异常跳转
      if (this.errtype) {
src/views/followvisit/record/detailpage/index.vue
@@ -1017,14 +1017,14 @@
            </el-form-item>
          </el-col>
        </el-row>
        <el-form-item label="随访方式" prop="resource">
        <el-form-item label="随访类型" prop="resource">
          <el-radio-group v-model="form.resource">
            <el-radio label="1">本病区随访</el-radio>
            <el-radio label="2">随访中心随访</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item label="随访记录">
        <el-form-item label="随访记录" :required="form.resource == '2'">
          <el-input type="textarea" v-model="form.remark"></el-input>
        </el-form-item>
      </el-form>
@@ -2378,6 +2378,10 @@
            this.$message.error("随访时间不能小于当前时间");
            return false;
          }
          if (this.form.resource == "2" && !this.form.remark) {
            this.$message.error("当前选择为随访中心随访需输入随访记录");
            return false;
          }
          this.form.remark =
            this.form.remark + "【" + this.getCurrentTime() + "】";
          let form = structuredClone(this.form);
src/views/sfstatistics/ProblemStatistics/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,536 @@
<template>
  <div class="indexanalysis">
    <div class="analysis-top">
      <div class="title-top">查询条件</div>
      <div class="value">
        <el-form ref="form" :model="queryParams" label-width="120px">
          <el-form-item label="选择问题名称">
            <el-select
              ref="questionSelect"
              remote
              :remote-method="remoteMethod"
              default-first-option
              v-model="selectedTargets"
              @change="handleTargetChange"
              @keyup.enter.native="handleEnterSearch"
              filterable
              multiple
              collapse-tags
              reserve-keyword
              :loading="searchLoading"
              placeholder="请输入问题名称搜索,按回车确认"
            >
              <el-option
                v-for="item in targetList"
                :key="item.id"
                :label="item.scriptContent || item.targetname"
                :value="item.id"
              >
                <span>{{ item.scriptContent || item.targetname }}</span>
                <span style="float: right; color: #8492a6; font-size: 13px">
                  ID: {{ item.id }}
                </span>
              </el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="已选题目">
            <div class="selected-ids">
              {{ selectedContentsText }}
            </div>
          </el-form-item>
        </el-form>
      </div>
    </div>
    <div class="formindex">
      <el-table
        v-loading="loading"
        :data="processedTableData"
        :span-method="objectSpanMethod"
        border
        :summary-method="getSummaries"
        show-summary
        style="width: 100%"
        empty-text="请选择要统计的题目"
      >
        <el-table-column prop="targetname" label="问题名称" width="200">
          <template slot-scope="scope">
            <div class="target-name-cell">
              {{ scope.row.targetname }}
            </div>
          </template>
        </el-table-column>
        <el-table-column prop="targetShowCount" label="问题出现次数" width="120">
          <template slot-scope="scope">
            {{ scope.row.targetShowCount }}次
          </template>
        </el-table-column>
        <el-table-column prop="completedPercentage" label="题目完成度" width="120">
          <template slot-scope="scope">
            {{ formatPercentage(scope.row.completedPercentage) }}
          </template>
        </el-table-column>
        <el-table-column prop="matchedtext" label="选项内容" width="150">
          <template slot-scope="scope">
            {{ scope.row.matchedtext || '-' }}
          </template>
        </el-table-column>
        <el-table-column prop="count" label="选中次数" width="100">
          <template slot-scope="scope">
            {{ scope.row.count }}次
          </template>
        </el-table-column>
        <el-table-column prop="percentage" label="占比" width="100">
          <template slot-scope="scope">
            <span>{{ formatPercentage(scope.row.percentage) }}</span>
          </template>
        </el-table-column>
        <el-table-column label="进度条" min-width="200">
          <template slot-scope="scope">
            <el-progress
              :percentage="Number(scope.row.percentage) * 100"
              :show-text="false"
              :color="customColors"
            />
            <span class="progress-text">{{ formatPercentage(scope.row.percentage) }}</span>
          </template>
        </el-table-column>
      </el-table>
    </div>
  </div>
</template>
<script>
import { getissuelist, compileissuestatistics } from "@/api/AiCentre/index";
export default {
  name: "indexanalysis",
  data() {
    return {
      targetList: [],
      selectedTargets: [], // å­˜å‚¨é€‰ä¸­çš„题目ID
      tableData: [],
      processedTableData: [],
      loading: false,
      searchLoading: false,
      queryParams: {
        pageNum: 1,
        pageSize: 66,
        scriptContent: '',
      },
      customColors: [
        { color: '#f56c6c', percentage: 20 },
        { color: '#e6a23c', percentage: 40 },
        { color: '#5cb87a', percentage: 60 },
        { color: '#1989fa', percentage: 80 },
        { color: '#6f7ad3', percentage: 100 }
      ],
      spanArr: [],
      searchTimer: null,
      currentSearchQuery: '', // å½“前搜索关键词
    };
  },
  computed: {
    // è®¡ç®—选中的问题内容文本
    selectedContentsText() {
      if (this.selectedTargets.length === 0) {
        return '未选择任何题目';
      }
      // æ ¹æ®é€‰ä¸­çš„ID获取对应的scriptContent
      const selectedContents = this.selectedTargets.map(id => {
        const target = this.targetList.find(item => item.id === id);
        return target ? (target.scriptContent || target.targetname || `题目${id}`) : `题目${id}`;
      });
      return selectedContents.join('; ');
    },
    // èŽ·å–é€‰ä¸­é¡¹çš„å†…å®¹æ•°ç»„ï¼ˆç”¨äºŽæ˜¾ç¤ºï¼‰
    selectedContents() {
      return this.selectedTargets.map(id => {
        const target = this.targetList.find(item => item.id === id);
        return target ? (target.scriptContent || target.targetname) : `题目${id}`;
      });
    }
  },
  watch: {
    processedTableData: {
      handler(newVal) {
        if (newVal && newVal.length > 0) {
          this.getSpanArr(newVal);
        } else {
          this.spanArr = [];
        }
      },
      immediate: true,
      deep: true
    }
  },
  created() {
    this.getList();
  },
  methods: {
    // æŸ¥è¯¢é—®å·åˆ—表
    async getList() {
      this.loading = true;
      try {
        const response = await getissuelist(this.queryParams);
        this.targetList = response.rows || [];
      } catch (error) {
        console.error('获取题目列表失败:', error);
        this.$message.error('获取题目列表失败');
      } finally {
        this.loading = false;
      }
    },
    // å›žè½¦é”®æœç´¢å¤„理[6,8](@ref)
    handleEnterSearch(event) {
      const inputElement = event.target;
      const searchQuery = inputElement.value.trim();
        this.currentSearchQuery = searchQuery;
        this.executeSearch(searchQuery);
        // é˜²æ­¢é»˜è®¤è¡Œä¸º
        event.preventDefault();
        event.stopPropagation();
    },
    // è¿œç¨‹æœç´¢æ–¹æ³•(带防抖)
    remoteMethod(query) {
      if (this.searchTimer) {
        clearTimeout(this.searchTimer);
      }
      this.searchTimer = setTimeout(() => {
        this.currentSearchQuery = query;
        this.executeSearch(query);
      }, 300);
    },
    // æ‰§è¡Œæœç´¢
    async executeSearch(query) {
      if (query === '') {
        this.queryParams.scriptContent = '';
        await this.getList();
        return;
      }
      this.searchLoading = true;
      try {
        const searchParams = {
          pageNum: 1,
          pageSize: 50,
          scriptType: "1",
          scriptContent: query
        };
        const response = await getissuelist(searchParams);
        this.targetList = response.rows || [];
        if (this.targetList.length === 0) {
          this.$message.info(`未找到包含"${query}"的问题`);
        }
      } catch (error) {
        console.error('搜索题目失败:', error);
        this.$message.error('搜索服务异常,请稍后重试');
        this.targetList = [];
      } finally {
        this.searchLoading = false;
      }
    },
    // å¤šé€‰é¢˜ç›®æ”¹å˜å¤„理
    handleTargetChange(selectedIds) {
      if (selectedIds && selectedIds.length > 0) {
        this.Labelstatistics(selectedIds.join(','));
      } else {
        this.processedTableData = [];
        this.spanArr = [];
      }
    },
    // èŽ·å–ç»Ÿè®¡ä¿¡æ¯
    async Labelstatistics(scriptIds) {
      if (!scriptIds) {
        this.processedTableData = [];
        this.spanArr = [];
        return;
      }
      this.loading = true;
      try {
        const response = await compileissuestatistics({ scriptids: scriptIds });
        this.tableData = response.data || [];
        this.processTableData();
      } catch (error) {
        console.error('获取统计信息失败:', error);
        this.$message.error('获取统计信息失败');
        this.processedTableData = [];
        this.spanArr = [];
      } finally {
        this.loading = false;
      }
    },
    // å¤„理表格数据
    processTableData() {
      if (!this.tableData || Object.keys(this.tableData).length === 0) {
        this.processedTableData = [];
        return;
      }
      const processedData = [];
      Object.keys(this.tableData).forEach(scriptId => {
        const questionData = this.tableData[scriptId];
        if (questionData && questionData.details) {
          const targetName = questionData.scriptContent || `题目${scriptId}`;
          const targetShowCount = questionData.allQuantity || 0;
          const completedPercentage = questionData.completedPercentage || "0";
          questionData.details.forEach(detail => {
            if (detail.optionText) {
              processedData.push({
                scriptid: scriptId,
                targetname: targetName,
                targetShowCount: targetShowCount,
                matchedtext: detail.optionText,
                count: detail.chosenQuantity || 0,
                percentage: detail.chosenPercentage || "0",
                completedPercentage: completedPercentage,
                allQuantity: questionData.allQuantity || 0,
                completedQuantity: questionData.completedQuantity || 0
              });
            }
          });
          if (questionData.details.length === 0) {
            processedData.push({
              scriptid: scriptId,
              targetname: targetName,
              targetShowCount: targetShowCount,
              matchedtext: '-',
              count: 0,
              percentage: "0",
              completedPercentage: completedPercentage,
              allQuantity: questionData.allQuantity || 0,
              completedQuantity: questionData.completedQuantity || 0
            });
          }
        }
      });
      this.processedTableData = processedData;
    },
    // ç”Ÿæˆåˆå¹¶ä¿¡æ¯æ•°ç»„
    getSpanArr(data) {
      this.spanArr = [];
      if (!data || data.length === 0) return;
      for (let i = 0; i < data.length; i++) {
        if (i === 0) {
          this.spanArr.push(1);
          this.pos = 0;
        } else {
          if (data[i].scriptid === data[i - 1].scriptid) {
            this.spanArr[this.pos] += 1;
            this.spanArr.push(0);
          } else {
            this.spanArr.push(1);
            this.pos = i;
          }
        }
      }
    },
    // å•元格合并方法
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      if (columnIndex === 0 || columnIndex === 1 || columnIndex === 2) {
        if (this.spanArr.length > rowIndex) {
          const rowspan = this.spanArr[rowIndex];
          const colspan = rowspan > 0 ? 1 : 0;
          return {
            rowspan: rowspan,
            colspan: colspan
          };
        }
      }
    },
    // æ ¼å¼åŒ–百分比显示
    formatPercentage(value) {
      const numValue = Number(value);
      return isNaN(numValue) ? '0%' : `${(numValue * 100).toFixed(2)}%`;
    },
    // è¡¨æ ¼åˆè®¡è¡Œè®¡ç®—
    getSummaries(param) {
      const { columns, data } = param;
      const sums = [];
      columns.forEach((column, index) => {
        if (index === 0) {
          sums[index] = '合计';
          return;
        }
        if (data.length === 0) {
          sums[index] = '-';
          return;
        }
        switch (column.property) {
          case 'targetShowCount':
            const totalQuestions = new Set(data.map(item => item.scriptid)).size;
            sums[index] = `${totalQuestions}个题目`;
            break;
          case 'count':
            const values = data.map(item => Number(item.count));
            const totalCount = values.reduce((prev, curr) => prev + curr, 0);
            sums[index] = `${totalCount}次`;
            break;
          case 'percentage':
            const percentages = data.map(item => Number(item.percentage));
            const validPercentages = percentages.filter(p => !isNaN(p));
            if (validPercentages.length > 0) {
              const avgPercentage = validPercentages.reduce((a, b) => a + b, 0) / validPercentages.length;
              sums[index] = `${(avgPercentage * 100).toFixed(2)}%`;
            } else {
              sums[index] = '0%';
            }
            break;
          case 'completedPercentage':
            const completedPercentages = data.map(item => Number(item.completedPercentage));
            const validCompleted = completedPercentages.filter(p => !isNaN(p));
            if (validCompleted.length > 0) {
              const avgCompleted = validCompleted.reduce((a, b) => a + b, 0) / validCompleted.length;
              sums[index] = `${(avgCompleted * 100).toFixed(2)}%`;
            } else {
              sums[index] = '0%';
            }
            break;
          default:
            sums[index] = '-';
            break;
        }
      });
      return sums;
    }
  },
  beforeDestroy() {
    if (this.searchTimer) {
      clearTimeout(this.searchTimer);
    }
  }
};
</script>
<style lang="scss" scoped>
.analysis-top {
  border: 1px solid #dcdfe6;
  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 0 6px 0 rgba(0, 0, 0, 0.04);
  margin: 15px;
  .title-top {
    background-color: #6784f2;
    color: #fff;
    padding: 10px 20px;
    font-size: 20px;
    font-weight: 500;
    margin-bottom: 20px;
  }
  .value {
    padding: 0 20px 20px;
  }
}
.formindex {
  margin: 0 15px;
  border: 1px solid #dcdfe6;
  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 0 6px 0 rgba(0, 0, 0, 0.04);
  padding: 20px;
}
.selected-ids {
  padding: 8px 12px;
  background-color: #f5f7fa;
  border-radius: 4px;
  border: 1px solid #e4e7ed;
  min-height: 36px;
  word-break: break-all;
  line-height: 1.5;
}
.target-name-cell {
  font-weight: 600;
  color: #409eff;
}
.progress-text {
  margin-left: 10px;
  font-size: 12px;
  color: #909399;
}
::v-deep .el-progress-bar {
  padding-right: 0;
  margin-right: 0;
}
::v-deep .el-select {
  width: 100%;
}
::v-deep .el-table {
  .cell {
    word-break: break-word;
  }
  .el-table__body tr:hover > td.el-table__cell {
    background-color: #f5f7fa;
  }
  .el-table__body .el-table__cell {
    vertical-align: top;
  }
}
.merged-cell {
  background-color: #f0f9ff;
  font-weight: 600;
}
::v-deep .el-select__tags {
  .el-tag {
    max-width: 200px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    .el-tag__close {
      margin-left: 4px;
    }
  }
}
</style>
src/views/sfstatistics/percentage/satisfaction.vue
@@ -528,7 +528,7 @@
              <el-table :data="item.details" style="width: 100%">
                <el-table-column prop="optionText" label="问题选项">
                </el-table-column>
                <el-table-column prop="completedQuantity" label="选择人数">
                <el-table-column prop="chosenQuantity" label="选择人数">
                </el-table-column>
                <el-table-column prop="chosenPercentage" label="比例">
                   <template slot-scope="scope">
vue.config.js
@@ -36,10 +36,10 @@
      // detail: https://cli.vuejs.org/config/#devserver-proxy
      [process.env.VUE_APP_BASE_API]: {
        // target: `https://www.health-y.cn/lssf`,
        // target: `http://192.168.100.10:8096`,
        target: `http://192.168.100.10:8096`,
        // target: `http://192.168.100.10:8094`,//省立同德
        // target: `http://192.168.100.10:8095`,//新华
        target:`http://localhost:8095`,
        // target:`http://localhost:8095`,
        // target:`http://35z1t16164.qicp.vip`,
        // target: `http://192.168.100.111:8095`,
        // target: `http://192.168.101.166:8093`,