WXL (wul)
昨天 03348941a9c44e3b9706a3b6c25c8fb5ba25d9d5
测试完成
已重命名1个文件
已修改4个文件
已添加3个文件
已复制2个文件
1907 ■■■■■ 文件已修改
dist (2).zip 补丁 | 查看 | 原始文档 | blame | 历史
dist (3).zip 补丁 | 查看 | 原始文档 | blame | 历史
dist.zip 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Satisfaction/configurationmyd/batch.vue 899 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Satisfaction/configurationmyd/components/DetailsAnomaly.vue 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Satisfaction/configurationmyd/dispose.vue 980 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Satisfaction/sfstatistics/components/visitStatistics.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/followvisit/record/detailpage/index.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/sfstatistics/percentage/index.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dist (2).zip
copy from "\346\214\207\346\240\207\347\273\237\350\256\241\346\225\264\345\220\210\351\241\265\351\200\202\351\205\215\344\270\275\346\260\264\347\234\201\347\253\213\345\220\214\345\276\267.zip" copy to "dist \0502\051.zip" Binary files differ
dist (3).zip
copy from "\346\214\207\346\240\207\347\273\237\350\256\241\346\225\264\345\220\210\351\241\265\351\200\202\351\205\215\344\270\275\346\260\264\347\234\201\347\253\213\345\220\214\345\276\267.zip" copy to "dist \0503\051.zip" Binary files differ
dist.zip
Binary files differ
src/views/Satisfaction/configurationmyd/batch.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,899 @@
<template>
  <div class="batch-process">
    <!-- é¡µé¢æ ‡é¢˜ -->
    <div class="page-header">
      <div class="header-content">
        <h2 class="page-title">异常批量处理</h2>
        <p class="page-description">批量处理选中的异常反馈</p>
        <div class="header-actions">
          <el-button
            type="primary"
            icon="el-icon-check"
            @click="handleBatchSubmit"
            :loading="batchProcessing"
          >
            æ‰¹é‡æäº¤å¤„理
          </el-button>
          <el-button
            type="warning"
            icon="el-icon-back"
            @click="handleGoBack"
          >
            è¿”回异常列表
          </el-button>
        </div>
      </div>
    </div>
    <!-- å¼‚常列表 -->
    <div class="list-section">
      <el-card shadow="never">
        <div class="filter-section">
          <el-form
            :model="filterParams"
            :inline="true"
            size="medium"
            class="filter-form"
          >
            <el-form-item label="负责科室">
              <el-select
                v-model="filterParams.deptId"
                placeholder="请选择科室"
                clearable
                style="width: 200px"
              >
                <el-option
                  v-for="dept in deptList"
                  :key="dept.id"
                  :label="dept.name"
                  :value="dept.id"
                />
              </el-select>
            </el-form-item>
            <el-form-item label="处理状态">
              <el-select
                v-model="filterParams.status"
                placeholder="请选择状态"
                clearable
                style="width: 200px"
              >
                <el-option label="待处理" :value="0" />
                <el-option label="处理中" :value="1" />
                <el-option label="已处理" :value="2" />
              </el-select>
            </el-form-item>
            <el-form-item>
              <el-button
                type="primary"
                icon="el-icon-search"
                @click="handleFilter"
              >
                ç­›é€‰
              </el-button>
              <el-button
                icon="el-icon-refresh"
                @click="handleResetFilter"
              >
                é‡ç½®
              </el-button>
            </el-form-item>
          </el-form>
        </div>
        <el-table
          v-loading="loading"
          :data="exceptionList"
          :border="true"
          style="width: 100%"
          @selection-change="handleSelectionChange"
          class="exception-table"
        >
          <el-table-column
            type="selection"
            width="55"
            align="center"
          />
          <el-table-column
            label="序号"
            type="index"
            width="60"
            align="center"
          />
          <el-table-column
            label="负责科室"
            prop="responsibilityDept"
            width="120"
            align="center"
          >
            <template slot-scope="{ row }">
              <el-tag type="primary">{{ row.responsibilityDept }}</el-tag>
            </template>
          </el-table-column>
          <el-table-column
            label="不满意详情"
            prop="unsatisfactoryDetail"
            min-width="200"
            align="center"
          >
            <template slot-scope="{ row }">
              <div class="detail-content">
                {{ row.unsatisfactoryDetail }}
              </div>
            </template>
          </el-table-column>
          <el-table-column
            label="患者信息"
            width="300"
            align="center"
          >
            <template slot-scope="{ row }">
              <div class="patient-info">
                <div class="patient-item">
                  <span class="label">姓名:</span>
                  <span class="value">{{ row.patientName }}</span>
                </div>
                <div class="patient-item">
                  <span class="label">性别:</span>
                  <span class="value">{{ row.gender === 1 ? '男' : '女' }}</span>
                </div>
                <div class="patient-item">
                  <span class="label">年龄:</span>
                  <span class="value">{{ row.age }}岁</span>
                </div>
                <div class="patient-item">
                  <span class="label">电话:</span>
                  <span class="value">{{ row.phone }}</span>
                </div>
              </div>
            </template>
          </el-table-column>
          <el-table-column
            label="出院信息"
            width="250"
            align="center"
          >
            <template slot-scope="{ row }">
              <div class="discharge-info">
                <div class="info-item">
                  <span class="label">科室:</span>
                  <span class="value">{{ row.dischargeDept }}</span>
                </div>
                <div class="info-item">
                  <span class="label">病区:</span>
                  <span class="value">{{ row.dischargeWard }}</span>
                </div>
                <div class="info-item">
                  <span class="label">填写时间:</span>
                  <span class="value time">{{ row.fillTime }}</span>
                </div>
              </div>
            </template>
          </el-table-column>
          <el-table-column
            label="处理状态"
            prop="processStatus"
            width="100"
            align="center"
          >
            <template slot-scope="{ row }">
              <el-tag
                :type="getStatusTagType(row.processStatus)"
                effect="dark"
              >
                {{ getStatusText(row.processStatus) }}
              </el-tag>
            </template>
          </el-table-column>
          <el-table-column
            label="操作"
            width="180"
            align="center"
            fixed="right"
          >
            <template slot-scope="{ row }">
              <el-button
                type="primary"
                size="small"
                icon="el-icon-view"
                @click="handleViewDetail(row)"
              >
                æŸ¥çœ‹è¯¦æƒ…
              </el-button>
              <el-button
                type="warning"
                size="small"
                icon="el-icon-edit"
                @click="handleProcess(row)"
                :disabled="row.processStatus === 2"
              >
                å¤„理
              </el-button>
            </template>
          </el-table-column>
        </el-table>
        <!-- åˆ†é¡µ -->
        <div class="pagination-section">
          <el-pagination
            background
            layout="total, sizes, prev, pager, next, jumper"
            :current-page="filterParams.pageNum"
            :page-size="filterParams.pageSize"
            :page-sizes="[10, 20, 30, 50]"
            :total="total"
            @size-change="handleSizeChange"
            @current-change="handlePageChange"
          />
        </div>
      </el-card>
    </div>
    <!-- å¤„理对话框 -->
    <el-dialog
      title="处理异常反馈"
      :visible.sync="processDialogVisible"
      width="600px"
      center
    >
      <el-form
        :model="processForm"
        :rules="processRules"
        ref="processForm"
        label-width="100px"
        size="medium"
      >
        <el-form-item label="处理状态" prop="status">
          <el-select
            v-model="processForm.status"
            placeholder="请选择处理状态"
            style="width: 100%"
          >
            <el-option label="处理中" :value="1" />
            <el-option label="已处理" :value="2" />
            <el-option label="已驳回" :value="3" />
          </el-select>
        </el-form-item>
        <el-form-item label="报备科室" prop="reportDepts">
          <el-select
            v-model="processForm.reportDepts"
            placeholder="请选择报备科室"
            multiple
            filterable
            collapse-tags
            style="width: 100%"
          >
            <el-option
              v-for="dept in deptList"
              :key="dept.id"
              :label="dept.name"
              :value="dept.id"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="处理备注" prop="remark">
          <el-input
            v-model="processForm.remark"
            type="textarea"
            :rows="4"
            placeholder="请输入处理备注(最多500字)"
            maxlength="500"
            show-word-limit
          />
        </el-form-item>
        <el-form-item label="附件上传">
          <el-upload
            class="upload-demo"
            action="#"
            :on-preview="handlePreview"
            :on-remove="handleRemove"
            :before-remove="beforeRemove"
            :limit="3"
            :on-exceed="handleExceed"
            :file-list="fileList"
          >
            <el-button size="small" type="primary">点击上传</el-button>
            <div slot="tip" class="el-upload__tip">支持上传图片、文档等附件,单个文件不超过10MB</div>
          </el-upload>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="processDialogVisible = false">取消</el-button>
        <el-button
          type="primary"
          @click="submitProcess"
          :loading="processing"
        >
          æäº¤å¤„理
        </el-button>
      </span>
    </el-dialog>
    <!-- æ‰¹é‡å¤„理对话框 -->
    <el-dialog
      title="批量处理异常反馈"
      :visible.sync="batchDialogVisible"
      width="600px"
      center
    >
      <el-form
        :model="batchProcessForm"
        :rules="processRules"
        ref="batchProcessForm"
        label-width="100px"
        size="medium"
      >
        <el-form-item label="处理状态" prop="status">
          <el-select
            v-model="batchProcessForm.status"
            placeholder="请选择处理状态"
            style="width: 100%"
          >
            <el-option label="处理中" :value="1" />
            <el-option label="已处理" :value="2" />
            <el-option label="已驳回" :value="3" />
          </el-select>
        </el-form-item>
        <el-form-item label="报备科室" prop="reportDepts">
          <el-select
            v-model="batchProcessForm.reportDepts"
            placeholder="请选择报备科室"
            multiple
            filterable
            collapse-tags
            style="width: 100%"
          >
            <el-option
              v-for="dept in deptList"
              :key="dept.id"
              :label="dept.name"
              :value="dept.id"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="处理备注" prop="remark">
          <el-input
            v-model="batchProcessForm.remark"
            type="textarea"
            :rows="4"
            placeholder="请输入处理备注(最多500字)"
            maxlength="500"
            show-word-limit
          />
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="batchDialogVisible = false">取消</el-button>
        <el-button
          type="primary"
          @click="submitBatchProcess"
          :loading="batchProcessing"
        >
          æ‰¹é‡æäº¤
        </el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
export default {
  name: 'BatchProcess',
  data() {
    return {
      // å½“前处理的异常ID
      currentExceptionId: null,
      // æ‰¹é‡é€‰ä¸­çš„异常ID
      selectedExceptionIds: [],
      // è¿‡æ»¤å‚æ•°
      filterParams: {
        deptId: '',
        status: '',
        pageNum: 1,
        pageSize: 10
      },
      // åŠ è½½çŠ¶æ€
      loading: false,
      processing: false,
      batchProcessing: false,
      // ç§‘室列表
      deptList: [
        { id: 1, name: '心血管内科' },
        { id: 2, name: '神经内科' },
        { id: 3, name: '普外科' },
        { id: 4, name: '骨科' },
        { id: 5, name: '妇产科' },
        { id: 6, name: '儿科' },
        { id: 7, name: '急诊科' },
        { id: 8, name: '呼吸内科' },
        { id: 9, name: '消化内科' },
        { id: 10, name: '内分泌科' }
      ],
      // å¼‚常列表数据
      exceptionList: [],
      total: 0,
      // å¤„理对话框
      processDialogVisible: false,
      processForm: {
        status: '',
        reportDepts: [],
        remark: ''
      },
      processRules: {
        status: [
          { required: true, message: '请选择处理状态', trigger: 'change' }
        ],
        remark: [
          { required: true, message: '请输入处理备注', trigger: 'blur' },
          { min: 5, max: 500, message: '备注长度在 5 åˆ° 500 ä¸ªå­—符', trigger: 'blur' }
        ]
      },
      fileList: [],
      // æ‰¹é‡å¤„理对话框
      batchDialogVisible: false,
      batchProcessForm: {
        status: '',
        reportDepts: [],
        remark: ''
      }
    };
  },
  mounted() {
    this.loadExceptionList();
  },
  methods: {
    // åŠ è½½å¼‚å¸¸åˆ—è¡¨
    async loadExceptionList() {
      this.loading = true;
      try {
        // Mock æ•°æ®
        await new Promise(resolve => {
          setTimeout(() => {
            this.exceptionList = [
              {
                id: 1,
                responsibilityDept: '心血管内科',
                unsatisfactoryDetail: '医生查房时间太短,沟通不够充分,对病情解释不够详细',
                patientName: '张先生',
                gender: 1,
                age: 45,
                phone: '138****1234',
                dischargeDept: '心血管内科',
                dischargeWard: '内科一病区',
                fillTime: '2024-01-15 10:30:25',
                processStatus: 0,
                questionnaireId: 1001
              },
              {
                id: 2,
                responsibilityDept: '神经内科',
                unsatisfactoryDetail: '护士打针技术不佳,扎了三次才成功,且态度不够耐心',
                patientName: '李女士',
                gender: 0,
                age: 38,
                phone: '139****5678',
                dischargeDept: '神经内科',
                dischargeWard: '内科二病区',
                fillTime: '2024-01-14 16:20:10',
                processStatus: 0,
                questionnaireId: 1002
              },
              {
                id: 3,
                responsibilityDept: '普外科',
                unsatisfactoryDetail: '术后换药不及时,伤口疼痛时没有及时处理',
                patientName: '王先生',
                gender: 1,
                age: 52,
                phone: '137****9012',
                dischargeDept: '普外科',
                dischargeWard: '外科一病区',
                fillTime: '2024-01-13 09:15:45',
                processStatus: 1,
                questionnaireId: 1003
              },
              {
                id: 4,
                responsibilityDept: '骨科',
                unsatisfactoryDetail: '康复指导不够专业,对恢复过程描述不清楚',
                patientName: '刘女士',
                gender: 0,
                age: 65,
                phone: '136****3456',
                dischargeDept: '骨科',
                dischargeWard: '外科二病区',
                fillTime: '2024-01-12 14:40:30',
                processStatus: 0,
                questionnaireId: 1004
              },
              {
                id: 5,
                responsibilityDept: '妇产科',
                unsatisfactoryDetail: '产前检查排队时间过长,等待期间没有休息座位',
                patientName: '陈女士',
                gender: 0,
                age: 28,
                phone: '135****7890',
                dischargeDept: '妇产科',
                dischargeWard: '妇产科病区',
                fillTime: '2024-01-11 11:25:15',
                processStatus: 2,
                questionnaireId: 1005
              },
              {
                id: 6,
                responsibilityDept: '儿科',
                unsatisfactoryDetail: '儿童用药剂量交代不清晰,用药注意事项没有说明',
                patientName: '赵宝宝',
                gender: 1,
                age: 5,
                phone: '134****1234',
                dischargeDept: '儿科',
                dischargeWard: '儿科病区',
                fillTime: '2024-01-10 15:50:20',
                processStatus: 0,
                questionnaireId: 1006
              },
              {
                id: 7,
                responsibilityDept: '急诊科',
                unsatisfactoryDetail: '急诊等待时间过长,病情没有得到及时评估',
                patientName: '孙先生',
                gender: 1,
                age: 40,
                phone: '133****5678',
                dischargeDept: '急诊科',
                dischargeWard: '急诊病区',
                fillTime: '2024-01-09 10:15:40',
                processStatus: 0,
                questionnaireId: 1007
              },
              {
                id: 8,
                responsibilityDept: '呼吸内科',
                unsatisfactoryDetail: '医生开药较多,费用较高,没有说明必要性',
                patientName: '周女士',
                gender: 0,
                age: 55,
                phone: '132****9012',
                dischargeDept: '呼吸内科',
                dischargeWard: '内科一病区',
                fillTime: '2024-01-08 13:30:55',
                processStatus: 1,
                questionnaireId: 1008
              }
            ];
            this.total = this.exceptionList.length;
            resolve();
          }, 500);
        });
      } finally {
        this.loading = false;
      }
    },
    // èŽ·å–çŠ¶æ€æ ‡ç­¾ç±»åž‹
    getStatusTagType(status) {
      switch (status) {
        case 0: return 'warning'; // å¾…处理
        case 1: return 'primary'; // å¤„理中
        case 2: return 'success'; // å·²å¤„理
        default: return 'info';
      }
    },
    // èŽ·å–çŠ¶æ€æ–‡æœ¬
    getStatusText(status) {
      switch (status) {
        case 0: return '待处理';
        case 1: return '处理中';
        case 2: return '已处理';
        default: return '未知';
      }
    },
    // å¤„理筛选
    handleFilter() {
      this.filterParams.pageNum = 1;
      this.loadExceptionList();
    },
    // é‡ç½®ç­›é€‰
    handleResetFilter() {
      this.filterParams = {
        deptId: '',
        status: '',
        pageNum: 1,
        pageSize: 10
      };
      this.loadExceptionList();
    },
    // å¤„理选择变化
    handleSelectionChange(selection) {
      this.selectedExceptionIds = selection.map(item => item.id);
    },
    // å¤„理批量提交
    handleBatchSubmit() {
      if (this.selectedExceptionIds.length === 0) {
        this.$message.warning('请先选择要处理的异常反馈');
        return;
      }
      this.batchDialogVisible = true;
    },
    // è¿”回异常列表
    handleGoBack() {
      this.$router.push('/satisfaction/exception/list');
    },
    // æŸ¥çœ‹è¯¦æƒ…
    handleViewDetail(row) {
      this.$router.push({
        path: '/satisfaction/exception/detail',
        query: {
          id: row.questionnaireId
        }
      });
    },
    // å¤„理单个异常
    handleProcess(row) {
      this.currentExceptionId = row.id;
      this.processForm = {
        status: row.processStatus === 0 ? 1 : row.processStatus,
        reportDepts: [],
        remark: ''
      };
      this.processDialogVisible = true;
    },
    // æäº¤å¤„理
    async submitProcess() {
      this.$refs.processForm.validate(async (valid) => {
        if (valid) {
          this.processing = true;
          try {
            // Mock API调用
            await new Promise(resolve => setTimeout(resolve, 1000));
            this.$message.success('处理提交成功');
            this.processDialogVisible = false;
            this.loadExceptionList();
          } finally {
            this.processing = false;
          }
        }
      });
    },
    // æäº¤æ‰¹é‡å¤„理
    async submitBatchProcess() {
      this.$refs.batchProcessForm.validate(async (valid) => {
        if (valid) {
          this.batchProcessing = true;
          try {
            // Mock API调用
            await new Promise(resolve => setTimeout(resolve, 1500));
            this.$message.success(`已批量处理 ${this.selectedExceptionIds.length} æ¡å¼‚常反馈`);
            this.batchDialogVisible = false;
            this.selectedExceptionIds = [];
            this.loadExceptionList();
          } finally {
            this.batchProcessing = false;
          }
        }
      });
    },
    // åˆ†é¡µå¤§å°å˜åŒ–
    handleSizeChange(size) {
      this.filterParams.pageSize = size;
      this.filterParams.pageNum = 1;
      this.loadExceptionList();
    },
    // é¡µç å˜åŒ–
    handlePageChange(page) {
      this.filterParams.pageNum = page;
      this.loadExceptionList();
    },
    // æ–‡ä»¶ä¸Šä¼ ç›¸å…³æ–¹æ³•
    handlePreview(file) {
      console.log('预览文件:', file);
    },
    handleRemove(file, fileList) {
      console.log('移除文件:', file, fileList);
    },
    beforeRemove(file) {
      return this.$confirm(`确定移除 ${file.name}?`);
    },
    handleExceed(files, fileList) {
      this.$message.warning(`当前限制选择 3 ä¸ªæ–‡ä»¶ï¼Œæœ¬æ¬¡é€‰æ‹©äº† ${files.length} ä¸ªæ–‡ä»¶ï¼Œå…±é€‰æ‹©äº† ${files.length + fileList.length} ä¸ªæ–‡ä»¶`);
    }
  }
};
</script>
<style lang="scss" scoped>
.batch-process {
  padding: 20px;
  background-color: #f5f7fa;
  min-height: 100vh;
  .page-header {
    margin-bottom: 20px;
    padding: 20px;
    background: linear-gradient(135deg, #5788FE 0%, #66b1ff 100%);
    border-radius: 8px;
    color: white;
    .header-content {
      .page-title {
        margin: 0 0 8px 0;
        font-size: 20px;
        font-weight: 600;
      }
      .page-description {
        margin: 0 0 20px 0;
        opacity: 0.9;
        font-size: 14px;
      }
      .header-actions {
        display: flex;
        gap: 10px;
      }
    }
  }
  .list-section {
    .filter-section {
      margin-bottom: 20px;
      .filter-form {
        display: flex;
        flex-wrap: wrap;
        align-items: center;
        ::v-deep .el-form-item {
          margin-bottom: 0;
          margin-right: 20px;
          &:last-child {
            margin-right: 0;
          }
        }
      }
    }
    .exception-table {
      ::v-deep .el-table__header-wrapper {
        th {
          background-color: #f8f9fa;
          font-weight: 600;
          color: #333;
        }
      }
      .detail-content {
        font-size: 13px;
        color: #606266;
        line-height: 1.5;
        text-align: left;
      }
      .patient-info {
        .patient-item {
          display: flex;
          justify-content: space-between;
          align-items: center;
          margin-bottom: 5px;
          padding: 2px 0;
          .label {
            font-size: 12px;
            color: #606266;
            min-width: 40px;
          }
          .value {
            font-size: 13px;
            color: #333;
            font-weight: 500;
            text-align: right;
            flex: 1;
          }
        }
      }
      .discharge-info {
        .info-item {
          display: flex;
          justify-content: space-between;
          align-items: center;
          margin-bottom: 5px;
          padding: 2px 0;
          .label {
            font-size: 12px;
            color: #606266;
            min-width: 50px;
          }
          .value {
            font-size: 13px;
            color: #333;
            font-weight: 500;
            text-align: right;
            flex: 1;
            &.time {
              font-size: 12px;
              color: #909399;
            }
          }
        }
      }
    }
    .pagination-section {
      display: flex;
      justify-content: center;
      padding: 20px 0 0 0;
    }
  }
}
@media (max-width: 768px) {
  .batch-process {
    padding: 10px;
    .page-header {
      .header-actions {
        flex-direction: column;
        align-items: stretch;
      }
    }
    .list-section {
      .filter-section {
        .filter-form {
          ::v-deep .el-form-item {
            width: 100%;
            margin-right: 0;
            margin-bottom: 10px;
          }
        }
      }
    }
  }
}
</style>
src/views/Satisfaction/configurationmyd/components/DetailsAnomaly.vue
src/views/Satisfaction/configurationmyd/dispose.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,980 @@
<template>
  <div class="exception-list">
    <!-- é¡µé¢æ ‡é¢˜ -->
    <div class="page-header">
      <div class="header-content">
        <h2 class="page-title">满意度异常处理</h2>
        <p class="page-description">监控和处理满意度问卷中的异常反馈</p>
      </div>
    </div>
    <!-- æŸ¥è¯¢æ¡ä»¶åŒºåŸŸ -->
    <div class="search-section">
      <el-card shadow="never">
        <el-form
          :model="queryParams"
          ref="queryForm"
          size="medium"
          :inline="true"
          label-width="120px"
          class="search-form"
        >
          <el-form-item label="满意度模板" prop="templateId">
            <el-select
              v-model="queryParams.templateId"
              placeholder="请选择模板"
              clearable
              style="width: 200px"
            >
              <el-option
                v-for="template in templateList"
                :key="template.id"
                :label="template.name"
                :value="template.id"
              />
            </el-select>
          </el-form-item>
          <el-form-item label="责任科室" prop="deptIds">
            <el-select
              v-model="queryParams.deptIds"
              placeholder="请选择责任科室"
              clearable
              filterable
              multiple
              collapse-tags
              style="width: 300px"
            >
              <el-option
                v-for="dept in deptList"
                :key="dept.id"
                :label="dept.name"
                :value="dept.id"
              />
            </el-select>
          </el-form-item>
          <el-form-item label="统计时间" prop="dateRange">
            <el-date-picker
              v-model="queryParams.dateRange"
              type="daterange"
              range-separator="至"
              start-placeholder="开始日期"
              end-placeholder="结束日期"
              value-format="yyyy-MM-dd"
              :picker-options="pickerOptions"
              style="width: 380px"
            />
          </el-form-item>
          <el-form-item>
            <el-button
              type="primary"
              icon="el-icon-search"
              @click="handleSearch"
              :loading="loading"
            >
              æŸ¥è¯¢
            </el-button>
            <el-button icon="el-icon-refresh" @click="handleReset">
              é‡ç½®
            </el-button>
          </el-form-item>
        </el-form>
      </el-card>
    </div>
    <!-- æ‰¹é‡æ“ä½œ -->
    <div class="batch-section">
      <el-card shadow="never">
        <div class="batch-actions">
          <el-button
            type="primary"
            icon="el-icon-s-operation"
            :disabled="selectedIds.length === 0"
            @click="handleBatchProcess"
          >
            æ‰¹é‡å¤„理 ({{ selectedIds.length }})
          </el-button>
          <el-button
            type="info"
            icon="el-icon-download"
            @click="handleExport"
          >
            å¯¼å‡ºå¼‚常数据
          </el-button>
          <el-button
            type="warning"
            icon="el-icon-refresh-right"
            @click="refreshData"
          >
            åˆ·æ–°æ•°æ®
          </el-button>
        </div>
      </el-card>
    </div>
    <!-- å¼‚常统计概览 -->
    <div class="overview-section">
      <el-row :gutter="20">
        <el-col :span="6">
          <el-card shadow="never" class="stat-card">
            <div class="stat-content">
              <div class="stat-icon" style="background: #f0f9ff;">
                <i class="el-icon-s-claim" style="color: #5788FE;"></i>
              </div>
              <div class="stat-info">
                <div class="stat-title">总异常数量</div>
                <div class="stat-value">{{ overviewData.totalExceptionCount }}</div>
              </div>
            </div>
          </el-card>
        </el-col>
        <el-col :span="6">
          <el-card shadow="never" class="stat-card">
            <div class="stat-content">
              <div class="stat-icon" style="background: #f0f9ff;">
                <i class="el-icon-s-flag" style="color: #E6A23C;"></i>
              </div>
              <div class="stat-info">
                <div class="stat-title">待处理异常</div>
                <div class="stat-value">{{ overviewData.pendingCount }}</div>
              </div>
            </div>
          </el-card>
        </el-col>
        <el-col :span="6">
          <el-card shadow="never" class="stat-card">
            <div class="stat-content">
              <div class="stat-icon" style="background: #f0f9ff;">
                <i class="el-icon-check" style="color: #67C23A;"></i>
              </div>
              <div class="stat-info">
                <div class="stat-title">已处理异常</div>
                <div class="stat-value">{{ overviewData.processedCount }}</div>
              </div>
            </div>
          </el-card>
        </el-col>
        <el-col :span="6">
          <el-card shadow="never" class="stat-card">
            <div class="stat-content">
              <div class="stat-icon" style="background: #f0f9ff;">
                <i class="el-icon-s-order" style="color: #909399;"></i>
              </div>
              <div class="stat-info">
                <div class="stat-title">今日处理数</div>
                <div class="stat-value">{{ overviewData.todayProcessedCount }}</div>
              </div>
            </div>
          </el-card>
        </el-col>
      </el-row>
    </div>
    <!-- å¼‚常列表 -->
    <div class="list-section">
      <el-card shadow="never">
        <el-table
          v-loading="loading"
          :data="exceptionList"
          :border="true"
          style="width: 100%"
          @selection-change="handleSelectionChange"
          class="exception-table"
        >
          <el-table-column
            type="selection"
            width="55"
            align="center"
          />
          <el-table-column
            label="序号"
            type="index"
            width="60"
            align="center"
          />
          <el-table-column
            label="题目内容"
            prop="questionContent"
            min-width="300"
            align="center"
          >
            <template slot-scope="{ row }">
              <div class="question-content">
                <span class="question-text">{{ row.questionContent }}</span>
                <div class="question-tags">
                  <el-tag
                    size="mini"
                    :type="getQuestionTypeTag(row.questionType)"
                  >
                    {{ row.questionType === 1 ? '单选题' : '多选题' }}
                  </el-tag>
                  <el-tag
                    size="mini"
                    type="info"
                  >
                    {{ row.templateName }}
                  </el-tag>
                </div>
              </div>
            </template>
          </el-table-column>
          <el-table-column
            label="负责科室"
            prop="responsibilityDepts"
            width="180"
            align="center"
          >
            <template slot-scope="{ row }">
              <div class="dept-list">
                <el-tag
                  v-for="dept in row.responsibilityDepts"
                  :key="dept.id"
                  size="small"
                  type="primary"
                  class="dept-tag"
                >
                  {{ dept.name }}
                </el-tag>
              </div>
            </template>
          </el-table-column>
          <el-table-column
            label="填写情况"
            width="200"
            align="center"
          >
            <template slot-scope="{ row }">
              <div class="fill-statistics">
                <div class="stat-item">
                  <span class="stat-label">有效填写:</span>
                  <span class="stat-value">{{ row.validFillCount }}</span>
                </div>
                <div class="stat-item">
                  <span class="stat-label">异常填写:</span>
                  <span class="stat-value exception-count">{{ row.exceptionFillCount }}</span>
                </div>
              </div>
            </template>
          </el-table-column>
          <el-table-column
            label="异常任务"
            width="280"
            align="center"
          >
            <template slot-scope="{ row }">
              <div class="exception-tasks">
                <div class="task-category">
                  <div class="task-title">已处理</div>
                  <div class="task-count processed">{{ row.processedCount }}</div>
                </div>
                <div class="task-category">
                  <div class="task-title">待处理</div>
                  <div class="task-count pending">{{ row.pendingCount }}</div>
                </div>
                <div class="task-category">
                  <div class="task-title">异常总数</div>
                  <div class="task-count total">{{ row.totalExceptionCount }}</div>
                </div>
              </div>
            </template>
          </el-table-column>
          <el-table-column
            label="最近处理"
            prop="lastProcessTime"
            width="180"
            align="center"
          >
            <template slot-scope="{ row }">
              <div v-if="row.lastProcessTime" class="last-process">
                <div class="process-time">{{ row.lastProcessTime }}</div>
                <div class="process-user">{{ row.lastProcessUser }}</div>
              </div>
              <span v-else class="no-process">暂无处理记录</span>
            </template>
          </el-table-column>
          <el-table-column
            label="操作"
            width="180"
            align="center"
            fixed="right"
          >
            <template slot-scope="{ row }">
              <!-- <el-button
                type="primary"
                size="small"
                icon="el-icon-view"
                @click="handleViewDetail(row)"
              >
                è¯¦æƒ…
              </el-button> -->
              <el-button
                type="warning"
                size="small"
                icon="el-icon-s-operation"
                @click="handleBatchQuestion(row)"
              >
                æ‰¹é‡å¤„理
              </el-button>
            </template>
          </el-table-column>
        </el-table>
        <!-- åˆ†é¡µ -->
        <div class="pagination-section">
          <el-pagination
            background
            layout="total, sizes, prev, pager, next, jumper"
            :current-page="queryParams.pageNum"
            :page-size="queryParams.pageSize"
            :page-sizes="[10, 20, 30, 50]"
            :total="total"
            @size-change="handleSizeChange"
            @current-change="handlePageChange"
          />
        </div>
      </el-card>
    </div>
  </div>
</template>
<script>
export default {
  name: 'ExceptionList',
  data() {
    return {
      // æŸ¥è¯¢å‚æ•°
      queryParams: {
        templateId: '',
        deptIds: [],
        dateRange: [],
        pageNum: 1,
        pageSize: 10
      },
      // åŠ è½½çŠ¶æ€
      loading: false,
      // é€‰ä¸­çš„ID
      selectedIds: [],
      // æ¨¡æ¿åˆ—表
      templateList: [
        { id: 1, name: '出院满意度问卷' },
        { id: 2, name: '住院满意度问卷' },
        { id: 3, name: '门诊满意度问卷' },
        { id: 4, name: '常用满意度问卷' }
      ],
      // ç§‘室列表
      deptList: [
        { id: 1, name: '心血管内科' },
        { id: 2, name: '神经内科' },
        { id: 3, name: '普外科' },
        { id: 4, name: '骨科' },
        { id: 5, name: '妇产科' },
        { id: 6, name: '儿科' },
        { id: 7, name: '急诊科' },
        { id: 8, name: '呼吸内科' },
        { id: 9, name: '消化内科' },
        { id: 10, name: '内分泌科' },
        { id: 11, name: '肾内科' },
        { id: 12, name: '肿瘤科' }
      ],
      // å¼‚常列表数据
      exceptionList: [],
      total: 0,
      // ç»Ÿè®¡æ¦‚览数据
      overviewData: {
        totalExceptionCount: 0,
        pendingCount: 0,
        processedCount: 0,
        todayProcessedCount: 0
      },
      // æ—¥æœŸé€‰æ‹©å™¨é€‰é¡¹
      pickerOptions: {
        shortcuts: [
          {
            text: '最近一周',
            onClick(picker) {
              const end = new Date();
              const start = new Date();
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
              picker.$emit('pick', [start, end]);
            }
          },
          {
            text: '最近一个月',
            onClick(picker) {
              const end = new Date();
              const start = new Date();
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
              picker.$emit('pick', [start, end]);
            }
          },
          {
            text: '最近三个月',
            onClick(picker) {
              const end = new Date();
              const start = new Date();
              start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
              picker.$emit('pick', [start, end]);
            }
          }
        ],
        disabledDate(time) {
          return time.getTime() > Date.now();
        }
      }
    };
  },
  mounted() {
    this.loadData();
  },
  methods: {
    // åŠ è½½æ•°æ®
    async loadData() {
      this.loading = true;
      try {
        await Promise.all([
          this.loadExceptionList(),
          this.loadOverviewData()
        ]);
      } finally {
        this.loading = false;
      }
    },
    // åŠ è½½å¼‚å¸¸åˆ—è¡¨
    async loadExceptionList() {
      return new Promise((resolve) => {
        setTimeout(() => {
          // Mock æ•°æ®
          this.exceptionList = [
            {
              id: 1,
              questionId: 101,
              questionContent: '您对医护人员的服务态度是否满意?',
              questionType: 1, // 1: å•选题, 2: å¤šé€‰é¢˜
              templateName: '出院满意度问卷',
              responsibilityDepts: [
                { id: 1, name: '心血管内科' },
                { id: 2, name: '神经内科' }
              ],
              validFillCount: 145,
              exceptionFillCount: 8,
              processedCount: 5,
              pendingCount: 3,
              totalExceptionCount: 8,
              lastProcessTime: '2024-01-15 10:30:25',
              lastProcessUser: '张医生'
            },
            {
              id: 2,
              questionId: 102,
              questionContent: '您对医生的诊疗水平和技术能力评价如何?',
              questionType: 1,
              templateName: '住院满意度问卷',
              responsibilityDepts: [
                { id: 3, name: '普外科' },
                { id: 4, name: '骨科' }
              ],
              validFillCount: 120,
              exceptionFillCount: 12,
              processedCount: 8,
              pendingCount: 4,
              totalExceptionCount: 12,
              lastProcessTime: '2024-01-14 16:20:10',
              lastProcessUser: '李护士长'
            },
            {
              id: 3,
              questionId: 103,
              questionContent: '您对医院的环境和卫生状况是否满意?',
              questionType: 1,
              templateName: '门诊满意度问卷',
              responsibilityDepts: [
                { id: 5, name: '妇产科' },
                { id: 6, name: '儿科' },
                { id: 7, name: '急诊科' }
              ],
              validFillCount: 180,
              exceptionFillCount: 15,
              processedCount: 10,
              pendingCount: 5,
              totalExceptionCount: 15,
              lastProcessTime: '2024-01-13 09:15:45',
              lastProcessUser: '王主任'
            },
            {
              id: 4,
              questionId: 104,
              questionContent: '您认为医护人员与您的沟通是否充分?',
              questionType: 1,
              templateName: '常用满意度问卷',
              responsibilityDepts: [
                { id: 8, name: '呼吸内科' },
                { id: 9, name: '消化内科' }
              ],
              validFillCount: 95,
              exceptionFillCount: 6,
              processedCount: 4,
              pendingCount: 2,
              totalExceptionCount: 6,
              lastProcessTime: '2024-01-12 14:40:30',
              lastProcessUser: '赵医生'
            },
            {
              id: 5,
              questionId: 105,
              questionContent: '您对等待就诊和治疗的时间是否满意?',
              questionType: 1,
              templateName: '住院满意度问卷',
              responsibilityDepts: [
                { id: 10, name: '内分泌科' },
                { id: 11, name: '肾内科' }
              ],
              validFillCount: 200,
              exceptionFillCount: 25,
              processedCount: 15,
              pendingCount: 10,
              totalExceptionCount: 25,
              lastProcessTime: '2024-01-11 11:25:15',
              lastProcessUser: '孙护士'
            },
            {
              id: 6,
              questionId: 106,
              questionContent: '您对医院收费的透明度和合理性评价如何?',
              questionType: 1,
              templateName: '门诊满意度问卷',
              responsibilityDepts: [
                { id: 12, name: '肿瘤科' }
              ],
              validFillCount: 160,
              exceptionFillCount: 18,
              processedCount: 12,
              pendingCount: 6,
              totalExceptionCount: 18,
              lastProcessTime: '2024-01-10 15:50:20',
              lastProcessUser: '周医生'
            },
            {
              id: 7,
              questionId: 107,
              questionContent: '您会向亲友推荐我们医院吗?',
              questionType: 1,
              templateName: '出院满意度问卷',
              responsibilityDepts: [
                { id: 1, name: '心血管内科' },
                { id: 8, name: '呼吸内科' }
              ],
              validFillCount: 110,
              exceptionFillCount: 7,
              processedCount: 5,
              pendingCount: 2,
              totalExceptionCount: 7,
              lastProcessTime: '2024-01-09 10:15:40',
              lastProcessUser: '吴主任'
            },
            {
              id: 8,
              questionId: 108,
              questionContent: '您对以下哪些方面比较满意(多选)?',
              questionType: 2,
              templateName: '常用满意度问卷',
              responsibilityDepts: [
                { id: 2, name: '神经内科' },
                { id: 3, name: '普外科' },
                { id: 5, name: '妇产科' }
              ],
              validFillCount: 135,
              exceptionFillCount: 9,
              processedCount: 6,
              pendingCount: 3,
              totalExceptionCount: 9,
              lastProcessTime: '2024-01-08 13:30:55',
              lastProcessUser: '郑医生'
            }
          ];
          this.total = this.exceptionList.length;
          resolve();
        }, 500);
      });
    },
    // åŠ è½½æ¦‚è§ˆæ•°æ®
    async loadOverviewData() {
      return new Promise((resolve) => {
        setTimeout(() => {
          // è®¡ç®—统计数据
          const totalExceptionCount = this.exceptionList.reduce((sum, item) => sum + item.totalExceptionCount, 0);
          const pendingCount = this.exceptionList.reduce((sum, item) => sum + item.pendingCount, 0);
          const processedCount = this.exceptionList.reduce((sum, item) => sum + item.processedCount, 0);
          this.overviewData = {
            totalExceptionCount,
            pendingCount,
            processedCount,
            todayProcessedCount: 8 // ä»Šæ—¥å¤„理数 mock
          };
          resolve();
        }, 300);
      });
    },
    // èŽ·å–é¢˜ç›®ç±»åž‹æ ‡ç­¾æ ·å¼
    getQuestionTypeTag(type) {
      return type === 1 ? 'primary' : 'success';
    },
    // å¤„理查询
    handleSearch() {
      this.queryParams.pageNum = 1;
      this.loadData();
    },
    // å¤„理重置
    handleReset() {
      this.$refs.queryForm.resetFields();
      this.queryParams.dateRange = [];
      this.queryParams.pageNum = 1;
      this.loadData();
    },
    // å¤„理批量处理
    handleBatchProcess() {
      if (this.selectedIds.length === 0) {
        this.$message.warning('请先选择要处理的异常题目');
        return;
      }
      // è·³è½¬åˆ°æ‰¹é‡å¤„理页面
      this.$router.push({
        path: '/satisfaction/exception/batch-process',
        query: {
          questionIds: this.selectedIds.join(',')
        }
      });
    },
    // å¤„理导出
    handleExport() {
      this.$message.success('导出功能开发中...');
    },
    // åˆ·æ–°æ•°æ®
    refreshData() {
      this.loadData();
      this.$message.success('数据已刷新');
    },
    // å¤„理选择变化
    handleSelectionChange(selection) {
      this.selectedIds = selection.map(item => item.questionId);
    },
    // å¤„理查看详情
    handleViewDetail(row) {
      this.$router.push({
        path: '/satisfaction/exception/detail',
        query: {
          id: row.questionId
        }
      });
    },
    // å¤„理单个题目批量处理
    handleBatchQuestion(row) {
      this.$router.push({
        path: '/Intelligentcenter/batch',
        query: {
          questionId: row.questionId
        }
      });
    },
    // å¤„理分页大小变化
    handleSizeChange(size) {
      this.queryParams.pageSize = size;
      this.queryParams.pageNum = 1;
      this.loadExceptionList();
    },
    // å¤„理页码变化
    handlePageChange(page) {
      this.queryParams.pageNum = page;
      this.loadExceptionList();
    }
  }
};
</script>
<style lang="scss" scoped>
.exception-list {
  padding: 20px;
  background-color: #f5f7fa;
  min-height: 100vh;
  .page-header {
    margin-bottom: 20px;
    padding: 20px;
    background: linear-gradient(135deg, #5788FE 0%, #66b1ff 100%);
    border-radius: 8px;
    color: white;
    .header-content {
      .page-title {
        margin: 0 0 8px 0;
        font-size: 20px;
        font-weight: 600;
      }
      .page-description {
        margin: 0;
        opacity: 0.9;
        font-size: 14px;
      }
    }
  }
  .search-section {
    margin-bottom: 20px;
    .search-form {
      display: flex;
      flex-wrap: wrap;
      align-items: center;
      ::v-deep .el-form-item {
        margin-bottom: 0;
        margin-right: 20px;
        &:last-child {
          margin-right: 0;
        }
      }
    }
  }
  .batch-section {
    margin-bottom: 20px;
    .batch-actions {
      display: flex;
      gap: 10px;
      align-items: center;
    }
  }
  .overview-section {
    margin-bottom: 20px;
    .stat-card {
      .stat-content {
        display: flex;
        align-items: center;
        gap: 20px;
        .stat-icon {
          width: 60px;
          height: 60px;
          border-radius: 12px;
          display: flex;
          align-items: center;
          justify-content: center;
          i {
            font-size: 28px;
          }
        }
        .stat-info {
          flex: 1;
          .stat-title {
            font-size: 14px;
            color: #606266;
            margin-bottom: 8px;
          }
          .stat-value {
            font-size: 24px;
            font-weight: 600;
            color: #303133;
          }
        }
      }
    }
  }
  .list-section {
    .exception-table {
      ::v-deep .el-table__header-wrapper {
        th {
          background-color: #f8f9fa;
          font-weight: 600;
          color: #333;
        }
      }
      .question-content {
        .question-text {
          display: block;
          font-size: 14px;
          color: #303133;
          margin-bottom: 8px;
          line-height: 1.5;
        }
        .question-tags {
          display: flex;
          gap: 5px;
          justify-content: center;
        }
      }
      .dept-list {
        display: flex;
        flex-direction: column;
        gap: 5px;
        align-items: center;
        .dept-tag {
          margin: 2px 0;
        }
      }
      .fill-statistics {
        .stat-item {
          display: flex;
          justify-content: space-between;
          align-items: center;
          margin-bottom: 5px;
          padding: 2px 0;
          .stat-label {
            font-size: 12px;
            color: #606266;
          }
          .stat-value {
            font-size: 14px;
            font-weight: 500;
            color: #333;
          }
          .exception-count {
            color: #e6a23c;
            font-weight: 600;
          }
        }
      }
      .exception-tasks {
        display: flex;
        justify-content: space-around;
        align-items: center;
        .task-category {
          text-align: center;
          padding: 5px 8px;
          border-radius: 6px;
          min-width: 70px;
          .task-title {
            font-size: 12px;
            color: #606266;
            margin-bottom: 5px;
          }
          .task-count {
            font-size: 18px;
            font-weight: 600;
            line-height: 1;
            &.processed {
              color: #67c23a;
            }
            &.pending {
              color: #e6a23c;
            }
            &.total {
              color: #5788FE;
            }
          }
        }
      }
      .last-process {
        .process-time {
          font-size: 12px;
          color: #606266;
          margin-bottom: 4px;
        }
        .process-user {
          font-size: 13px;
          color: #5788FE;
          font-weight: 500;
        }
      }
      .no-process {
        color: #909399;
        font-style: italic;
      }
    }
    .pagination-section {
      display: flex;
      justify-content: center;
      padding: 20px 0 0 0;
    }
  }
}
@media (max-width: 768px) {
  .exception-list {
    padding: 10px;
    .search-section {
      .search-form {
        ::v-deep .el-form-item {
          width: 100%;
          margin-right: 0;
          margin-bottom: 10px;
        }
      }
    }
    .overview-section {
      .el-row {
        margin-left: 0;
        margin-right: 0;
        .el-col {
          padding-left: 0;
          padding-right: 0;
          margin-bottom: 10px;
        }
      }
    }
  }
}
</style>
src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue
@@ -199,7 +199,7 @@
                scope.row.followUpRate !== undefined
              "
            >
              {{ formatPercent(scope.row.followUpRate) }}
              {{ scope.row.followUpRate }}
            </span>
            <span v-else>-</span>
          </template>
src/views/Satisfaction/sfstatistics/components/visitStatistics.vue
@@ -199,7 +199,7 @@
                scope.row.followUpRate !== undefined
              "
            >
              {{ formatPercent(scope.row.followUpRate) }}
              {{ scope.row.followUpRate }}
            </span>
            <span v-else>-</span>
          </template>
src/views/followvisit/record/detailpage/index.vue
@@ -129,9 +129,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>
            </template>
          </el-table-column>
@@ -1060,7 +1058,7 @@
                align="right"
                v-model="form.date1"
                class="custom-disabled"
                value-format="yyyy-MM-dd"
                value-format="yyyy-MM-dd hh:mm:ss"
                @change="checkFollowupDate"
              ></el-date-picker>
            </el-form-item>
@@ -2450,7 +2448,7 @@
          this.form.remark =
            this.form.remark + "【" + this.getCurrentTime() + "】";
          let form = structuredClone(this.form);
          form.visitTime = this.formatTime(form.date1);
          form.visitTime = this.parseTime(form.date1);
          form.finishtime = "";
          if (form.resource) {
            if (form.resource == 2) {
src/views/sfstatistics/percentage/index.vue
@@ -1069,7 +1069,7 @@
            :total="patienttotal"
            :page.sync="patientqueryParams.pn"
            :limit.sync="patientqueryParams.ps"
            @pagination="Seedetails"
            @pagination="Seedetailstion"
          />
        </div>
      </div>
@@ -1298,13 +1298,6 @@
              </el-table>
            </div>
          </el-row>
          <pagination
            v-show="patienttotal > 0 && this.patientqueryParams.allhosp != 6"
            :total="patienttotal"
            :page.sync="patientqueryParams.pn"
            :limit.sync="patientqueryParams.ps"
            @pagination="Seedetails"
          />
        </div>
      </div>
    </el-dialog>
@@ -1990,6 +1983,13 @@
        this.Seedloading = false;
      });
    },
    Seedetailstion() {
      selectTimelyRate(this.patientqueryParams).then((response) => {
        this.logsheetlist = response.data.detail;
        this.patienttotal = response.data.total;
        this.Seedloading = false;
      });
    },
    viewDetails(row, title) {
      this.infotitleVisible = true;
      this.infotitle = title;