| | |
| | | <template> |
| | | <div class="Questionnairemanagement"> |
| | | <!-- 左侧栏 --> |
| | | <div class="sidecolumn"> |
| | | <div class="sidecolumn-top"> |
| | | <div class="top-wj">患者范围</div> |
| | | </div> |
| | | <div class="education-statistics"> |
| | | <!-- 搜索区域 --> |
| | | <div class="search-container"> |
| | | <el-form |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | size="small" |
| | | :inline="true" |
| | | label-width="100px" |
| | | > |
| | | <el-form-item label="统计维度" prop="groupType"> |
| | | <el-select |
| | | v-model="queryParams.groupType" |
| | | placeholder="请选择统计维度" |
| | | @change="handleGroupTypeChange" |
| | | style="width: 180px" |
| | | > |
| | | <el-option label="按科室统计" value="1"></el-option> |
| | | <el-option label="按病区统计" value="2"></el-option> |
| | | </el-select> |
| | | <el-select |
| | | style="margin-left: 10px" |
| | | v-if="queryParams.groupType == '2'" |
| | | v-model="queryParams.hospitaldistrictcodes" |
| | | size="medium" |
| | | multiple |
| | | filterable |
| | | placeholder="请选择病区" |
| | | > |
| | | <el-option |
| | | v-for="item in flatArrayhospit" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | /> |
| | | </el-select> |
| | | <el-select |
| | | v-else-if="queryParams.groupType == '1'" |
| | | v-model="queryParams.deptcodes" |
| | | size="medium" |
| | | multiple |
| | | filterable |
| | | placeholder="请选择科室" |
| | | > |
| | | <el-option |
| | | v-for="item in flatArraydept" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <div class="bottom-fl"> |
| | | <el-tabs |
| | | tab-position="right" |
| | | v-model="activeName" |
| | | @tab-click="handleClick" |
| | | > |
| | | <el-tab-pane label="全部" name="first"></el-tab-pane> |
| | | <el-tab-pane label="住院" name="bhospitalized"></el-tab-pane> |
| | | <el-tab-pane label="在院" name="Inhospital"></el-tab-pane> |
| | | <el-tab-pane label="门诊" name="outpatient"></el-tab-pane> |
| | | <el-tab-pane label="体检" name="physical"></el-tab-pane> |
| | | </el-tabs> |
| | | </div> |
| | | <el-form-item label="就诊类型" prop="hospType"> |
| | | <el-select |
| | | v-model="queryParams.hospType" |
| | | placeholder="请选择就诊类型" |
| | | clearable |
| | | style="width: 150px" |
| | | > |
| | | <el-option label="门诊" value="1"></el-option> |
| | | <el-option label="出院" value="2"></el-option> |
| | | <el-option label="专病" value="3"></el-option> |
| | | <el-option label="入院/外部导入" value="4"></el-option> |
| | | <el-option label="体检" value="5"></el-option> |
| | | </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" |
| | | style="width: 280px" |
| | | :picker-options="datePickerOptions" |
| | | > |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="宣教发送时间" prop="visittime"> |
| | | <el-date-picker |
| | | v-model="queryParams.visittime" |
| | | type="date" |
| | | placeholder="选择日期" |
| | | value-format="yyyy-MM-dd" |
| | | style="width: 180px" |
| | | > |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | |
| | | <el-form-item> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | size="medium" |
| | | @click="handleQuery" |
| | | :loading="loading" |
| | | >搜索</el-button |
| | | > |
| | | <el-button icon="el-icon-refresh" size="medium" @click="resetQuery" |
| | | >重置</el-button |
| | | > |
| | | <el-button |
| | | type="warning" |
| | | plain |
| | | icon="el-icon-download" |
| | | size="medium" |
| | | @click="handleExport" |
| | | v-hasPermi="['system:statistics:export']" |
| | | >导出</el-button |
| | | > |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | <!-- 右侧数据 --> |
| | | <div class="leftvlue"> |
| | | <div class="leftvlue-top"> |
| | | <el-tabs v-model="topactiveName" @tab-click="tophandleClick"> |
| | | <el-tab-pane name="Local"> |
| | | <span class="mulsz" slot="label">按出院病区统计 </span> |
| | | </el-tab-pane> |
| | | <el-tab-pane name="sharing"> |
| | | <span class="mulsz" slot="label">按出院科室统计 </span> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </div> |
| | | <div class="leftvlue-bg"> |
| | | <el-row :gutter="20"> |
| | | <!--标签数据--> |
| | | <el-col :span="24" :xs="24"> |
| | | <el-form |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | |
| | | <!-- 统计数据概览 --> |
| | | <div class="summary-cards" v-if="statisticsData.total > 0"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="6"> |
| | | <div class="summary-card"> |
| | | <div class="card-title">发送总量</div> |
| | | <div class="card-value">{{ totalCount }}</div> |
| | | <div class="card-desc">总宣教发送次数</div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <div class="summary-card"> |
| | | <div class="card-title">发送成功量</div> |
| | | <div class="card-value">{{ sendSuccessCount }}</div> |
| | | <div class="card-desc">已成功发送的宣教</div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <div class="summary-card"> |
| | | <div class="card-title">已读量</div> |
| | | <div class="card-value">{{ readCount }}</div> |
| | | <div class="card-desc">患者已阅读的宣教</div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <div class="summary-card"> |
| | | <div class="card-title">平均发送成功率</div> |
| | | <div class="card-value">{{ avgSendSuccessRate }}%</div> |
| | | <div class="card-desc">整体发送成功比例</div> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | |
| | | <!-- 数据表格 --> |
| | | <div class="table-container"> |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="statisticsData.list" |
| | | :border="true" |
| | | style="width: 100%" |
| | | :default-sort="{ prop: 'totalCount', order: 'descending' }" |
| | | @sort-change="handleSortChange" |
| | | > |
| | | <el-table-column prop="groupName" label="分组名称" align="center" fixed> |
| | | <!-- <template slot-scope="scope"> |
| | | <span class="group-name" @click="handleGroupDetail(scope.row)"> |
| | | {{ scope.row.groupName }} |
| | | </span> |
| | | </template> --> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | prop="groupCode" |
| | | label="分组编码" |
| | | align="center" |
| | | ></el-table-column> |
| | | |
| | | <el-table-column |
| | | prop="totalCount" |
| | | label="宣教发送总量" |
| | | align="center" |
| | | sortable="custom" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span class="count-highlight">{{ scope.row.totalCount }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | prop="sendSuccessCount" |
| | | label="发送成功量" |
| | | align="center" |
| | | sortable="custom" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span class="success-count">{{ scope.row.sendSuccessCount }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | prop="readCount" |
| | | label="已读量" |
| | | align="center" |
| | | sortable="custom" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span class="read-count">{{ scope.row.readCount }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | prop="sendSuccessRate" |
| | | label="发送成功率" |
| | | align="center" |
| | | width="200" |
| | | sortable="custom" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-progress |
| | | :percentage="scope.row.sendSuccessRate * 100" |
| | | :stroke-width="8" |
| | | :show-text="false" |
| | | style="width: 80px; margin: 0 auto" |
| | | :color="getRateColor(scope.row.sendSuccessRate)" |
| | | /> |
| | | <span class="rate-text" |
| | | >{{ (scope.row.sendSuccessRate * 100).toFixed(1) }}%</span |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | prop="readRate" |
| | | label="已读率" |
| | | align="center" |
| | | width="200" |
| | | sortable="custom" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-progress |
| | | :percentage="scope.row.readRate * 100" |
| | | :stroke-width="8" |
| | | :show-text="false" |
| | | style="width: 80px; margin: 0 auto" |
| | | :color="getRateColor(scope.row.readRate)" |
| | | /> |
| | | <span class="rate-text" |
| | | >{{ (scope.row.readRate * 100).toFixed(1) }}%</span |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <!-- <el-table-column label="操作" align="center" width="200" fixed="right"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | type="text" |
| | | size="small" |
| | | :inline="true" |
| | | v-show="showSearch" |
| | | label-width="98px" |
| | | @click="handleDetail(scope.row)" |
| | | icon="el-icon-document" |
| | | v-hasPermi="['system:statistics:detail']" |
| | | >详细数据</el-button |
| | | > |
| | | <el-form-item label="医院" prop="userName"> |
| | | <el-select |
| | | v-model="queryParams.value1" |
| | | placeholder="默认是该账号所属医院" |
| | | > |
| | | <el-option |
| | | v-for="item in options" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="出院病区" prop="userName"> |
| | | <el-select v-model="queryParams.value2" placeholder="请选择"> |
| | | <el-option |
| | | v-for="item in options" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="管理方案" prop="userName"> |
| | | <el-select v-model="queryParams.value3" placeholder="请选择"> |
| | | <el-option |
| | | v-for="item in options" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="出院日期" prop="userName"> |
| | | <el-date-picker |
| | | v-model="queryParams.valuetime1" |
| | | align="right" |
| | | type="date" |
| | | placeholder="选择日期" |
| | | :picker-options="pickerOptionsa" |
| | | > |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="计划执行日期" prop="userName"> |
| | | <el-date-picker |
| | | v-model="queryParams.valuetime2" |
| | | align="right" |
| | | type="date" |
| | | placeholder="选择日期" |
| | | :picker-options="pickerOptions" |
| | | > |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="实际完成日期" prop="userName"> |
| | | <el-date-picker |
| | | v-model="queryParams.valuetime2" |
| | | align="right" |
| | | type="date" |
| | | placeholder="选择日期" |
| | | :picker-options="pickerOptions" |
| | | > |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-button |
| | | type="text" |
| | | size="small" |
| | | @click="handleExportGroup(scope.row)" |
| | | icon="el-icon-download" |
| | | v-hasPermi="['system:statistics:export']" |
| | | >导出</el-button |
| | | > |
| | | </template> |
| | | </el-table-column> --> |
| | | </el-table> |
| | | |
| | | <el-form-item> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | size="medium" |
| | | @click="handleQuery" |
| | | >搜索</el-button |
| | | > |
| | | <el-button |
| | | icon="el-icon-refresh" |
| | | size="medium" |
| | | @click="resetQuery" |
| | | >重置</el-button |
| | | > |
| | | </el-form-item> |
| | | </el-form> |
| | | <!-- 分页 --> |
| | | <pagination |
| | | v-show="statisticsData.total > 0" |
| | | :total="statisticsData.total" |
| | | :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" |
| | | @pagination="getList" |
| | | /> |
| | | </div> |
| | | |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | type="primary" |
| | | plain |
| | | icon="el-icon-plus" |
| | | size="medium" |
| | | @click="addladeltag" |
| | | v-hasPermi="['system:user:add']" |
| | | >新增</el-button |
| | | > |
| | | </el-col> |
| | | <!-- 分组详情弹窗 --> |
| | | <el-dialog |
| | | :title="detailTitle" |
| | | :visible.sync="detailVisible" |
| | | width="80%" |
| | | :before-close="handleCloseDetail" |
| | | > |
| | | <div v-loading="detailLoading"> |
| | | <el-row :gutter="20" class="detail-header"> |
| | | <el-col :span="6"> |
| | | <div class="detail-item"> |
| | | <label>分组名称:</label> |
| | | <span>{{ currentGroup.groupName }}</span> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <div class="detail-item"> |
| | | <label>分组编码:</label> |
| | | <span>{{ currentGroup.groupCode }}</span> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <div class="detail-item"> |
| | | <label>发送成功率:</label> |
| | | <span class="rate-highlight" |
| | | >{{ (currentGroup.sendSuccessRate * 100).toFixed(1) }}%</span |
| | | > |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <div class="detail-item"> |
| | | <label>已读率:</label> |
| | | <span class="rate-highlight" |
| | | >{{ (currentGroup.readRate * 100).toFixed(1) }}%</span |
| | | > |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | type="danger" |
| | | plain |
| | | icon="el-icon-delete" |
| | | size="medium" |
| | | :disabled="multiple" |
| | | @click="handleDelete" |
| | | v-hasPermi="['system:user:remove']" |
| | | >删除</el-button |
| | | > |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <div class="documentf"> |
| | | <div class="document"> |
| | | <el-button |
| | | type="warning" |
| | | plain |
| | | icon="el-icon-download" |
| | | size="medium" |
| | | @click="handleExport" |
| | | v-hasPermi="['system:user:export']" |
| | | >导出</el-button |
| | | > |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | |
| | | <!-- <el-col :span="1.5"> </el-col> --> |
| | | </el-row> |
| | | <!-- <right-toolbar |
| | | :showSearch.sync="showSearch" |
| | | @queryTable="getList" |
| | | :columns="columns" |
| | | ></right-toolbar> --> |
| | | <el-tabs v-model="detailActiveTab" class="detail-tabs"> |
| | | <el-tab-pane label="趋势分析" name="trend"> |
| | | <!-- 这里可以放置图表组件 --> |
| | | <div class="chart-placeholder"> |
| | | 趋势图表(可根据需求接入ECharts) |
| | | </div> |
| | | </el-tab-pane> |
| | | <el-tab-pane label="明细数据" name="detail"> |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="userList" |
| | | :border="true" |
| | | @selection-change="handleSelectionChange" |
| | | :data="detailList" |
| | | border |
| | | style="width: 100%; margin-top: 20px" |
| | | > |
| | | <el-table-column type="selection" width="50" align="center" /> |
| | | <el-table-column |
| | | fixed |
| | | label="序号" |
| | | prop="patientName" |
| | | label="患者姓名" |
| | | align="center" |
| | | key="tagid" |
| | | prop="tagid" |
| | | width="50" |
| | | /> |
| | | <el-table-column |
| | | fixed |
| | | label="出院病区" |
| | | align="center" |
| | | key="tagname" |
| | | prop="tagname" |
| | | width="100" |
| | | :show-overflow-tooltip="true" |
| | | /> |
| | | <el-table-column |
| | | label="宣教" |
| | | align="center" |
| | | key="updateTime" |
| | | prop="updateTime" |
| | | > |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="宣教更新日期" |
| | | align="center" |
| | | key="tagdescription" |
| | | prop="tagdescription" |
| | | width="110" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="管理方案" |
| | | align="center" |
| | | key="isupload" |
| | | prop="isupload" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="随访任务数" |
| | | align="center" |
| | | key="tagdescription" |
| | | prop="tagdescription" |
| | | width="100" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="随访完成数" |
| | | align="center" |
| | | key="tagdescription" |
| | | prop="tagdescription" |
| | | width="100" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="随访完成率" |
| | | align="center" |
| | | key="isupload" |
| | | prop="isupload" |
| | | width="100" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="AI外呼次数" |
| | | align="center" |
| | | key="tagdescription" |
| | | prop="tagdescription" |
| | | width="100" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="AI随访完成数" |
| | | align="center" |
| | | key="tagdescription" |
| | | prop="tagdescription" |
| | | width="120" |
| | | > |
| | | </el-table-column> |
| | | ></el-table-column> |
| | | <el-table-column |
| | | label="AI随访完成率" |
| | | prop="patientNo" |
| | | label="患者编号" |
| | | align="center" |
| | | key="tagdescription" |
| | | prop="tagdescription" |
| | | width="120" |
| | | > |
| | | </el-table-column> |
| | | ></el-table-column> |
| | | <el-table-column |
| | | label="微信发送次数" |
| | | prop="sendTime" |
| | | label="发送时间" |
| | | align="center" |
| | | key="tagdescription" |
| | | prop="tagdescription" |
| | | width="180" |
| | | ></el-table-column> |
| | | <el-table-column |
| | | prop="readTime" |
| | | label="阅读时间" |
| | | align="center" |
| | | width="180" |
| | | ></el-table-column> |
| | | <el-table-column |
| | | prop="educationTitle" |
| | | label="宣教标题" |
| | | align="center" |
| | | ></el-table-column> |
| | | <el-table-column |
| | | prop="status" |
| | | label="状态" |
| | | align="center" |
| | | width="100" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="微信随访完成数" |
| | | align="center" |
| | | key="tagdescription" |
| | | prop="tagdescription" |
| | | width="120" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="微信随访完成率" |
| | | align="center" |
| | | key="tagdescription" |
| | | prop="tagdescription" |
| | | width="120" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="短信发送次数" |
| | | align="center" |
| | | key="tagdescription" |
| | | prop="tagdescription" |
| | | width="100" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="短信随访完成数" |
| | | align="center" |
| | | key="tagdescription" |
| | | prop="tagdescription" |
| | | width="120" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="短信随访完成率" |
| | | align="center" |
| | | key="tagdescription" |
| | | prop="tagdescription" |
| | | width="120" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="人工随访次数" |
| | | align="center" |
| | | key="tagdescription" |
| | | prop="tagdescription" |
| | | width="100" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="人工随访完成数" |
| | | align="center" |
| | | key="tagdescription" |
| | | prop="tagdescription" |
| | | width="120" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="人工随访完成率" |
| | | align="center" |
| | | key="tagdescription" |
| | | prop="tagdescription" |
| | | width="120" |
| | | > |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="操作" |
| | | align="center" |
| | | width="300" |
| | | class-name="small-padding fixed-width" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click="handleUpdate(scope.row)" |
| | | v-hasPermi="['system:user:edit']" |
| | | ><span class="button-textxg" |
| | | ><i class="el-icon-s-data"></i>单题统计</span |
| | | ></el-button |
| | | <el-tag |
| | | :type=" |
| | | scope.row.status === '已读' |
| | | ? 'success' |
| | | : scope.row.status === '发送成功' |
| | | ? 'info' |
| | | : 'danger' |
| | | " |
| | | size="small" |
| | | > |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click="handleDelete(scope.row)" |
| | | v-hasPermi="['system:user:remove']" |
| | | ><span class="button-textsc" |
| | | ><i class="el-icon-share"></i>随访结果明细</span |
| | | ></el-button |
| | | > |
| | | {{ scope.row.status }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" |
| | | @pagination="getList" |
| | | /> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | </div> |
| | | <!-- 单题展示弹框 --> |
| | | <el-dialog :visible.sync="topicVisible" width="45%"> |
| | | <div class="topicdia"> |
| | | <div class="top-text">{{ topicvalue.name }}</div> |
| | | <div class="top-mintext">随访完成数{{ topicvalue.number }}</div> |
| | | <div style="overflow-x: hidden; overflow-y: auto; max-height: 65vh"> |
| | | <div class="ttaabbcc" v-for="item in topiclist" :key="item.name"> |
| | | <div class="describe"> |
| | | 第{{ item.number }}题: {{ item.name }}?<span |
| | | >[{{ item.type == 1 ? "单选题" : "多选题" }}]</span |
| | | > |
| | | </div> |
| | | <div> |
| | | <el-table :data="tableData" style="width: 100%"> |
| | | <el-table-column prop="date" label="问题选项"> |
| | | </el-table-column> |
| | | <el-table-column prop="name" label="选择人数"> |
| | | </el-table-column> |
| | | <el-table-column prop="address" label="比例"> </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </div> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="topicVisible = false">关 闭</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | <!-- 结果统计弹框 --> |
| | | <el-dialog title="提示" :visible.sync="consequenceVisible" width="50%"> |
| | | <div class="topicdia"> |
| | | <div class="top-text" style="margin-bottom: 20px">宣教统计结果</div> |
| | | <div> |
| | | <el-table :data="tableData" style="width: 100%"> |
| | | <el-table-column prop="date" label="患者姓名"> </el-table-column> |
| | | <el-table-column prop="namea" label="性别"> </el-table-column> |
| | | <el-table-column prop="namec" label="年龄"> </el-table-column> |
| | | <el-table-column prop="named" label="联系方式"> </el-table-column> |
| | | <el-table-column prop="namee" label="计划执行时间" width="120"> |
| | | </el-table-column> |
| | | <el-table-column prop="namex" label="实际完成时间" width="120"> |
| | | </el-table-column> |
| | | <el-table-column prop="namez" label="完成方式"> </el-table-column> |
| | | <el-table-column prop="nameh" label="宣教"> </el-table-column> |
| | | <el-table-column prop="namej" label="得分"> </el-table-column> |
| | | <!-- 截取几列选项属性名维护数组遍历 --> |
| | | <!-- <el-table-column prop="namet"> |
| | | <template slot="header" slot-scope="scope"> |
| | | <div>{{ scope.row.name }}<span>[单选题]</span></div> |
| | | </template> |
| | | </el-table-column> --> |
| | | </el-table> |
| | | </div> |
| | | </div> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="consequenceVisible = false">取 消</el-button> |
| | | <el-button type="primary" @click="consequenceVisible = false" |
| | | >确 定</el-button |
| | | > |
| | | <el-button @click="detailVisible = false">关 闭</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { |
| | | toamendtag, |
| | | addapitag, |
| | | deletetag, |
| | | changetagcategory, |
| | | listtag, |
| | | } from "@/api/system/label"; |
| | | import { gethelibraryCount } from "@/api/AiCentre/index"; |
| | | |
| | | import Treeselect from "@riophae/vue-treeselect"; |
| | | import "@riophae/vue-treeselect/dist/vue-treeselect.css"; |
| | | export default { |
| | | name: "questionnaire", |
| | | dicts: ["sys_normal_disable", "sys_user_sex"], |
| | | components: { Treeselect }, |
| | | name: "EducationStatistics", |
| | | data() { |
| | | return { |
| | | topactiveName: "Local", //顶部选择 |
| | | activeName: "first", |
| | | // 遮罩层 |
| | | // 查询参数 |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 1000, |
| | | groupType: "1", // 1-科室,2-病区 |
| | | deptcodes: ['all'], // 科室code数组 |
| | | hospitaldistrictcodes: [], // 病区code数组 |
| | | hospType: undefined, // 就诊类型 |
| | | starttime: undefined, // 入院开始时间 |
| | | endtime: undefined, // 入院结束时间 |
| | | visittime: undefined, // 宣教发送时间 |
| | | dateRange: [], // 入院时间范围 |
| | | orderBy: "totalCount", // 排序字段 |
| | | order: "descending", // 排序方式 |
| | | }, |
| | | |
| | | // 统计数据 |
| | | statisticsData: { |
| | | total: 0, |
| | | list: [], |
| | | }, |
| | | |
| | | // 下拉选项 |
| | | flatArraydept: [], |
| | | |
| | | flatArrayhospit: [], |
| | | |
| | | // 加载状态 |
| | | loading: false, |
| | | // 选中数组 |
| | | ids: [], |
| | | // 非单个禁用 |
| | | single: true, |
| | | // 非多个禁用 |
| | | multiple: true, |
| | | // 显示搜索条件 |
| | | showSearch: true, |
| | | idds: "", //分类id |
| | | // 总条数 |
| | | total: 0, |
| | | lstamendtag: false, //是否修改标签 |
| | | topicVisible: false, //控制单题弹框 |
| | | consequenceVisible: false, //控制结果弹框 |
| | | //修改添加标签弹框数据 |
| | | tagform: { |
| | | isupload: "", |
| | | tagname: "", |
| | | tagcategoryid: "", |
| | | tagdescription: "", |
| | | }, |
| | | topicvalue: { |
| | | name: "骨科随访模板", |
| | | number: 222, |
| | | }, |
| | | classifyform: { |
| | | categoryname: "", |
| | | }, |
| | | topiclist: [ |
| | | { |
| | | name: "您的身体康复情况如何", |
| | | number: 1, |
| | | type: 1, |
| | | }, |
| | | { |
| | | name: "您的饮食情况如何", |
| | | number: 2, |
| | | type: 2, |
| | | }, |
| | | { |
| | | name: "您的恢复情况如何", |
| | | number: 3, |
| | | type: 1, |
| | | }, |
| | | ], |
| | | tableData: [ |
| | | { |
| | | date: "好", |
| | | name: 12, |
| | | address: "50%", |
| | | }, |
| | | { |
| | | date: "一般", |
| | | name: 2, |
| | | address: "6.2%", |
| | | }, |
| | | { |
| | | date: "差", |
| | | name: 0, |
| | | address: "0%", |
| | | }, |
| | | ], |
| | | // 标签表格数据 |
| | | userList: [], |
| | | // 弹出层标题 |
| | | title: "", |
| | | // 是否显示弹出层 |
| | | open: false, |
| | | // 日期范围 |
| | | dateRange: [], |
| | | // 岗位选项 |
| | | postOptions: [], |
| | | // 角色选项 |
| | | roleOptions: [], |
| | | // 表单参数 |
| | | form: {}, |
| | | forms: { |
| | | name: "", |
| | | }, |
| | | numberlb: 22, |
| | | dialogFormVisible: false, //添加、修改类别弹框 |
| | | lstamendtagVisible: false, //添加、修改标签弹框 |
| | | goQRCodeVisible: false, //二维码弹框 |
| | | sidecolumnval: "", //类别搜索 |
| | | propss: { multiple: true }, |
| | | topqueryParams: {}, //导出筛选条件 |
| | | options: [ |
| | | { |
| | | value: 1, |
| | | label: "东南", |
| | | }, |
| | | { |
| | | value: 2, |
| | | label: "西北", |
| | | }, |
| | | { |
| | | value: 3, |
| | | label: "仨仨仨", |
| | | }, |
| | | { |
| | | value: 4, |
| | | label: "六飒飒飒", |
| | | }, |
| | | ], |
| | | pickerOptions: { |
| | | disabledDate(time) { |
| | | return time.getTime() < Date.now() - 3600 * 1000 * 24; |
| | | }, |
| | | shortcuts: [ |
| | | { |
| | | text: "今天", |
| | | onClick(picker) { |
| | | picker.$emit("pick", new Date()); |
| | | }, |
| | | }, |
| | | { |
| | | text: "昨天", |
| | | onClick(picker) { |
| | | const date = new Date(); |
| | | date.setTime(date.getTime() - 3600 * 1000 * 24); |
| | | picker.$emit("pick", date); |
| | | }, |
| | | }, |
| | | { |
| | | text: "一周前", |
| | | onClick(picker) { |
| | | const date = new Date(); |
| | | date.setTime(date.getTime() - 3600 * 1000 * 24 * 7); |
| | | picker.$emit("pick", date); |
| | | }, |
| | | }, |
| | | ], |
| | | }, |
| | | pickerOptionsa: { |
| | | detailLoading: false, |
| | | |
| | | // 详情弹窗 |
| | | detailVisible: false, |
| | | detailTitle: "", |
| | | detailActiveTab: "trend", |
| | | currentGroup: {}, |
| | | detailList: [], |
| | | |
| | | // 日期选择器配置 |
| | | datePickerOptions: { |
| | | disabledDate(time) { |
| | | return time.getTime() > Date.now(); |
| | | }, |
| | | shortcuts: [ |
| | | { |
| | | text: "今天", |
| | | text: "最近一周", |
| | | onClick(picker) { |
| | | picker.$emit("pick", new Date()); |
| | | const end = new Date(); |
| | | const start = new Date(); |
| | | start.setTime(start.getTime() - 3600 * 1000 * 24 * 7); |
| | | picker.$emit("pick", [start, end]); |
| | | }, |
| | | }, |
| | | { |
| | | text: "昨天", |
| | | text: "最近一个月", |
| | | onClick(picker) { |
| | | const date = new Date(); |
| | | date.setTime(date.getTime() - 3600 * 1000 * 24); |
| | | picker.$emit("pick", date); |
| | | const end = new Date(); |
| | | const start = new Date(); |
| | | start.setTime(start.getTime() - 3600 * 1000 * 24 * 30); |
| | | picker.$emit("pick", [start, end]); |
| | | }, |
| | | }, |
| | | { |
| | | text: "一周前", |
| | | text: "最近三个月", |
| | | onClick(picker) { |
| | | const date = new Date(); |
| | | date.setTime(date.getTime() - 3600 * 1000 * 24 * 7); |
| | | picker.$emit("pick", date); |
| | | const end = new Date(); |
| | | const start = new Date(); |
| | | start.setTime(start.getTime() - 3600 * 1000 * 24 * 90); |
| | | picker.$emit("pick", [start, end]); |
| | | }, |
| | | }, |
| | | ], |
| | | }, |
| | | // 查询标签列表参数 |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | tagname: undefined, |
| | | tagdescription: undefined, |
| | | }, |
| | | // 列信息 |
| | | columns: [ |
| | | { key: 0, label: `标签编号`, visible: true }, |
| | | { key: 1, label: `标签名称`, visible: true }, |
| | | { key: 2, label: `标签昵称`, visible: true }, |
| | | { key: 3, label: `部门`, visible: true }, |
| | | { key: 4, label: `手机号码`, visible: true }, |
| | | { key: 5, label: `状态`, visible: true }, |
| | | { key: 6, label: `创建时间`, visible: true }, |
| | | ], |
| | | // 表单校验 |
| | | // rules: { |
| | | // userName: [ |
| | | // { required: true, message: "标签名称不能为空", trigger: "blur" }, |
| | | // { |
| | | // min: 2, |
| | | // max: 20, |
| | | // message: "标签名称长度必须介于 2 和 20 之间", |
| | | // trigger: "blur", |
| | | // }, |
| | | // ], |
| | | // nickName: [ |
| | | // { required: true, message: "标签昵称不能为空", trigger: "blur" }, |
| | | // ], |
| | | // password: [ |
| | | // { required: true, message: "标签密码不能为空", trigger: "blur" }, |
| | | // { |
| | | // min: 5, |
| | | // max: 20, |
| | | // message: "标签密码长度必须介于 5 和 20 之间", |
| | | // trigger: "blur", |
| | | // }, |
| | | // ], |
| | | // email: [ |
| | | // { |
| | | // type: "email", |
| | | // message: "请输入正确的邮箱地址", |
| | | // trigger: ["blur", "change"], |
| | | // }, |
| | | // ], |
| | | // phonenumber: [ |
| | | // { |
| | | // pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, |
| | | // message: "请输入正确的手机号码", |
| | | // trigger: "blur", |
| | | // }, |
| | | // ], |
| | | // IDnumber: [ |
| | | // { |
| | | // pattern: |
| | | // /^\d{6}((((((19|20)\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(((19|20)\d{2})(0[13578]|1[02])31)|((19|20)\d{2})02(0[1-9]|1\d|2[0-8])|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))0229))\d{3})|((((\d{2})(0[13-9]|1[012])(0[1-9]|[12]\d|30))|((\d{2})(0[13578]|1[02])31)|((\d{2})02(0[1-9]|1\d|2[0-8]))|(([13579][26]|[2468][048]|0[048])0229))\d{2}))(\d|X|x)$/, |
| | | // message: "请输入正确的身份证号码", |
| | | // trigger: "blur", |
| | | // }, |
| | | // ], |
| | | // }, |
| | | }; |
| | | }, |
| | | watch: {}, |
| | | |
| | | computed: { |
| | | // 计算总发送量 |
| | | totalCount() { |
| | | return this.statisticsData.list.reduce( |
| | | (sum, item) => sum + item.totalCount, |
| | | 0 |
| | | ); |
| | | }, |
| | | |
| | | // 计算总发送成功量 |
| | | sendSuccessCount() { |
| | | return this.statisticsData.list.reduce( |
| | | (sum, item) => sum + item.sendSuccessCount, |
| | | 0 |
| | | ); |
| | | }, |
| | | |
| | | // 计算总已读量 |
| | | readCount() { |
| | | return this.statisticsData.list.reduce( |
| | | (sum, item) => sum + item.readCount, |
| | | 0 |
| | | ); |
| | | }, |
| | | |
| | | // 计算平均发送成功率 |
| | | avgSendSuccessRate() { |
| | | if (this.statisticsData.list.length === 0) return 0; |
| | | const totalRate = this.statisticsData.list.reduce( |
| | | (sum, item) => sum + item.sendSuccessRate, |
| | | 0 |
| | | ); |
| | | return ((totalRate / this.statisticsData.list.length) * 100).toFixed(1); |
| | | }, |
| | | }, |
| | | |
| | | created() { |
| | | this.flatArrayhospit = this.$store.getters.belongWards.map((ward) => { |
| | | return { |
| | | label: ward.districtName, |
| | | value: ward.districtCode, |
| | | }; |
| | | }); |
| | | this.flatArraydept = this.$store.getters.belongDepts.map((dept) => { |
| | | return { |
| | | label: dept.deptName, |
| | | value: dept.deptCode, |
| | | }; |
| | | }); |
| | | console.log(this.flatArrayhospit,'this.flatArrayhospit'); |
| | | |
| | | this.flatArraydept.push({ label: "全部", value: "all" }); |
| | | this.flatArrayhospit.push({ label: "全部", value: "all" }); |
| | | this.getList(); |
| | | this.gitclasify(); |
| | | }, |
| | | |
| | | methods: { |
| | | /** 查询标签列表 */ |
| | | getList() { |
| | | listtag(this.addDateRange(this.queryParams)).then((response) => { |
| | | console.log(response); |
| | | this.total = response.total; |
| | | this.userList = response.rows; |
| | | }); |
| | | }, |
| | | /** 修改标签 */ |
| | | handleUpdate(row) { |
| | | console.log(row, "修改标签"); |
| | | this.lstamendtagVisible = true; |
| | | this.lstamendtag = true; |
| | | this.tagform = { |
| | | isupload: row.isupload, |
| | | tagname: row.tagname, |
| | | tagcategoryid: row.tagcategoryid, |
| | | tagdescription: row.tagdescription, |
| | | tagid: row.tagid, |
| | | }; |
| | | }, |
| | | addladeltag() { |
| | | this.lstamendtagVisible = true; |
| | | this.lstamendtag = false; |
| | | this.tagform = { |
| | | isupload: "", |
| | | tagname: "", |
| | | tagcategoryid: "", |
| | | tagdescription: "", |
| | | tagid: "", |
| | | }; |
| | | }, |
| | | // 添加/修改标签 |
| | | Maintenancetag() { |
| | | if (this.lstamendtag) { |
| | | toamendtag(this.addDateRange(this.tagform)).then((response) => { |
| | | console.log(response); |
| | | this.getList(); |
| | | }); |
| | | } else { |
| | | addapitag(this.addDateRange(this.tagform)).then((response) => { |
| | | console.log(response); |
| | | this.getList(); |
| | | }); |
| | | // 获取统计数据列表 |
| | | async getList() { |
| | | this.loading = true; |
| | | try { |
| | | console.log(this.queryParams.hospitaldistrictcodes); |
| | | |
| | | // 构建请求参数 |
| | | const params = { |
| | | pageNum: this.queryParams.pageNum, |
| | | pageSize: this.queryParams.pageSize, |
| | | hospitaldistrictcodes: |
| | | this.queryParams.hospitaldistrictcodes.includes("all") |
| | | ? this.getAllWardCodes() |
| | | : this.queryParams.hospitaldistrictcodes, |
| | | deptcodes: this.queryParams.deptcodes.includes("all") |
| | | ? this.getAllDeptCodes() |
| | | : this.queryParams.deptcodes, |
| | | }; |
| | | |
| | | // 根据统计维度设置参数 |
| | | if (this.queryParams.groupType == "1") { |
| | | params.hospitaldistrictcodes = []; |
| | | } else if (this.queryParams.groupType == "2") { |
| | | params.deptcodes = []; |
| | | } |
| | | |
| | | // 设置时间参数 |
| | | if ( |
| | | this.queryParams.dateRange && |
| | | this.queryParams.dateRange.length === 2 |
| | | ) { |
| | | params.starttime = this.queryParams.dateRange[0]; |
| | | params.endtime = this.queryParams.dateRange[1]; |
| | | } |
| | | |
| | | // 设置其他参数 |
| | | if (this.queryParams.hospType) { |
| | | params.hospType = this.queryParams.hospType; |
| | | } |
| | | if (this.queryParams.visittime) { |
| | | params.visittime = this.queryParams.visittime; |
| | | } |
| | | |
| | | // 调用接口 |
| | | const response = await gethelibraryCount(params); |
| | | this.statisticsData = { |
| | | total: response.total || 0, |
| | | list: response.list || [], |
| | | }; |
| | | } catch (error) { |
| | | console.error("获取统计数据失败:", error); |
| | | this.$message.error("获取统计数据失败"); |
| | | this.statisticsData = { total: 0, list: [] }; |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | this.tagform = { |
| | | isupload: "", |
| | | tagname: "", |
| | | tagcategoryid: "", |
| | | tagdescription: "", |
| | | tagid: "", |
| | | }; |
| | | }, |
| | | getAllWardCodes() { |
| | | return this.flatArrayhospit |
| | | .filter((item) => item.value !== "all") |
| | | .map((item) => item.value); |
| | | }, |
| | | |
| | | // 表单重置 |
| | | reset() { |
| | | this.form = { |
| | | userId: undefined, |
| | | deptId: undefined, |
| | | userName: undefined, |
| | | nickName: undefined, |
| | | password: undefined, |
| | | phonenumber: undefined, |
| | | email: undefined, |
| | | sex: undefined, |
| | | status: "0", |
| | | remark: undefined, |
| | | postIds: [], |
| | | roleIds: [], |
| | | }; |
| | | this.resetForm("form"); |
| | | getAllDeptCodes() { |
| | | return this.flatArraydept |
| | | .filter((item) => item.value !== "all") |
| | | .map((item) => item.value); |
| | | }, |
| | | //单题弹框 |
| | | handleUpdate() { |
| | | this.topicVisible = true; |
| | | // 统计维度变更 |
| | | handleGroupTypeChange(value) { |
| | | // 切换维度时清空对应的选择 |
| | | if (value === "dept") { |
| | | this.queryParams.hospitaldistrictcodes = []; |
| | | } else if (value === "ward") { |
| | | this.queryParams.deptcodes = []; |
| | | } |
| | | }, |
| | | //结果弹框 |
| | | handleDelete() { |
| | | this.consequenceVisible = true; |
| | | }, |
| | | /** 搜索按钮操作 */ |
| | | |
| | | // 处理搜索 |
| | | handleQuery() { |
| | | this.queryParams.pageNum = 1; |
| | | this.getList(); |
| | | }, |
| | | /** 重置按钮操作 */ |
| | | |
| | | // 重置搜索条件 |
| | | resetQuery() { |
| | | this.dateRange = []; |
| | | this.resetForm("queryForm"); |
| | | this.queryParams.tagname = ""; |
| | | this.$refs.tree.setCurrentKey(null); |
| | | this.handleQuery(); |
| | | }, |
| | | // 多选框选中数据 |
| | | handleSelectionChange(selection) { |
| | | this.ids = selection.map((item) => item.tagid); |
| | | this.single = selection.length != 1; |
| | | this.multiple = !selection.length; |
| | | this.queryParams = { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | groupType: "dept", |
| | | deptcodes: [], |
| | | hospitaldistrictcodes: [], |
| | | hospType: undefined, |
| | | starttime: undefined, |
| | | endtime: undefined, |
| | | visittime: undefined, |
| | | dateRange: [], |
| | | orderBy: "totalCount", |
| | | order: "descending", |
| | | }; |
| | | this.getList(); |
| | | }, |
| | | |
| | | /** 导出按钮操作 */ |
| | | // 表格排序 |
| | | handleSortChange({ column, prop, order }) { |
| | | if (prop) { |
| | | this.queryParams.orderBy = prop; |
| | | this.queryParams.order = order; |
| | | this.getList(); |
| | | } |
| | | }, |
| | | |
| | | // 根据成功率获取进度条颜色 |
| | | getRateColor(rate) { |
| | | const percentage = rate * 100; |
| | | if (percentage >= 90) return "#67C23A"; |
| | | if (percentage >= 80) return "#E6A23C"; |
| | | if (percentage >= 60) return "#409EFF"; |
| | | return "#F56C6C"; |
| | | }, |
| | | |
| | | // 查看分组详情 |
| | | handleGroupDetail(row) { |
| | | this.currentGroup = row; |
| | | this.detailTitle = `${row.groupName} - 宣教统计详情`; |
| | | this.detailActiveTab = "trend"; |
| | | this.detailVisible = true; |
| | | this.loadDetailData(); |
| | | }, |
| | | |
| | | // 加载详情数据 |
| | | async loadDetailData() { |
| | | this.detailLoading = true; |
| | | try { |
| | | // 这里应该调用获取详情的接口 |
| | | // 模拟数据 |
| | | setTimeout(() => { |
| | | this.detailList = [ |
| | | { |
| | | patientName: "张三", |
| | | patientNo: "P202312001", |
| | | sendTime: "2023-12-01 10:30:00", |
| | | readTime: "2023-12-01 14:20:00", |
| | | educationTitle: "骨科术后康复指导", |
| | | status: "已读", |
| | | }, |
| | | { |
| | | patientName: "李四", |
| | | patientNo: "P202312002", |
| | | sendTime: "2023-12-01 11:15:00", |
| | | readTime: "", |
| | | educationTitle: "心血管疾病预防", |
| | | status: "发送成功", |
| | | }, |
| | | { |
| | | patientName: "王五", |
| | | patientNo: "P202312003", |
| | | sendTime: "2023-12-02 09:45:00", |
| | | readTime: "2023-12-02 16:10:00", |
| | | educationTitle: "糖尿病饮食指导", |
| | | status: "已读", |
| | | }, |
| | | ]; |
| | | this.detailLoading = false; |
| | | }, 500); |
| | | } catch (error) { |
| | | console.error("加载详情数据失败:", error); |
| | | this.$message.error("加载详情数据失败"); |
| | | this.detailLoading = false; |
| | | } |
| | | }, |
| | | |
| | | // 查看详情 |
| | | handleDetail(row) { |
| | | this.currentGroup = row; |
| | | this.detailTitle = `${row.groupName} - 明细数据`; |
| | | this.detailActiveTab = "detail"; |
| | | this.detailVisible = true; |
| | | this.loadDetailData(); |
| | | }, |
| | | |
| | | // 导出当前分组数据 |
| | | handleExportGroup(row) { |
| | | this.$confirm(`确定要导出 "${row.groupName}" 的统计数据吗?`, "提示", { |
| | | confirmButtonText: "确定", |
| | | cancelButtonText: "取消", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | // 这里调用导出接口 |
| | | this.$message.success("导出任务已开始,请稍后在下载中心查看"); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | |
| | | // 导出全部数据 |
| | | handleExport() { |
| | | this.download( |
| | | "base/tag/export", |
| | | { |
| | | ...this.topqueryParams, |
| | | }, |
| | | `user_${new Date().getTime()}.xlsx` |
| | | ); |
| | | this.$confirm("确定要导出全部统计数据吗?", "提示", { |
| | | confirmButtonText: "确定", |
| | | cancelButtonText: "取消", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | // 构建导出参数 |
| | | const exportParams = { ...this.queryParams }; |
| | | delete exportParams.pageNum; |
| | | delete exportParams.pageSize; |
| | | |
| | | // 这里调用导出接口 |
| | | this.$message.success("导出任务已开始,请稍后在下载中心查看"); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | |
| | | // 关闭详情弹窗 |
| | | handleCloseDetail(done) { |
| | | this.$confirm("确认关闭?", "提示", { |
| | | confirmButtonText: "确定", |
| | | cancelButtonText: "取消", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | done(); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .Questionnairemanagement { |
| | | display: flex; |
| | | } |
| | | .sidecolumn { |
| | | width: 180px; |
| | | min-height: 100vh; |
| | | text-align: center; |
| | | // display: flex; |
| | | margin-top: 20px; |
| | | margin: 20px; |
| | | padding: 30px; |
| | | background: #edf1f7; |
| | | border: 1px solid #dcdfe6; |
| | | -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), |
| | | 0 0 6px 0 rgba(0, 0, 0, 0.04); |
| | | .sidecolumn-top { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | .top-wj { |
| | | font-size: 20px; |
| | | } |
| | | .top-tj { |
| | | font-size: 18px; |
| | | .education-statistics { |
| | | padding: 20px; |
| | | background: #fff; |
| | | min-height: calc(100vh - 84px); |
| | | |
| | | color: rgb(0, 89, 255); |
| | | cursor: pointer; |
| | | } |
| | | } |
| | | .center-ss { |
| | | margin-top: 30px; |
| | | .input-with-select { |
| | | height: 40px !important; |
| | | } |
| | | } |
| | | .bottom-fl { |
| | | margin-top: 30px; |
| | | display: center !important; |
| | | } |
| | | } |
| | | .topicdia { |
| | | text-align: center; |
| | | margin: 0 20px; |
| | | |
| | | // overflow: scroll; |
| | | |
| | | .top-text { |
| | | font-size: 25px; |
| | | font-weight: 600; |
| | | } |
| | | .top-mintext { |
| | | color: #bdae25; |
| | | font-size: 15px; |
| | | margin: 10px 0; |
| | | } |
| | | .ttaabbcc { |
| | | // background: #edf1f7; |
| | | border: 1px solid #dcdfe6; |
| | | -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), |
| | | 0 0 6px 0 rgba(0, 0, 0, 0.04); |
| | | margin: 15px 0; |
| | | margin-top: 30px; |
| | | padding: 30px; |
| | | } |
| | | .describe { |
| | | text-align: left; |
| | | .search-container { |
| | | background: #f8f9fa; |
| | | padding: 20px; |
| | | border-radius: 8px; |
| | | margin-bottom: 20px; |
| | | span { |
| | | color: rgb(23, 140, 235); |
| | | margin-left: 5px; |
| | | border: 1px solid #ebeef5; |
| | | } |
| | | |
| | | .summary-cards { |
| | | margin-bottom: 20px; |
| | | |
| | | .summary-card { |
| | | background: #fff; |
| | | border-radius: 8px; |
| | | padding: 20px; |
| | | box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); |
| | | text-align: center; |
| | | border: 1px solid #ebeef5; |
| | | transition: all 0.3s ease; |
| | | |
| | | &:hover { |
| | | transform: translateY(-5px); |
| | | box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.15); |
| | | } |
| | | |
| | | .card-title { |
| | | font-size: 14px; |
| | | color: #909399; |
| | | margin-bottom: 10px; |
| | | } |
| | | |
| | | .card-value { |
| | | font-size: 28px; |
| | | font-weight: 600; |
| | | color: #409eff; |
| | | margin-bottom: 5px; |
| | | } |
| | | |
| | | .card-desc { |
| | | font-size: 12px; |
| | | color: #c0c4cc; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | ::v-deep.el-tabs--left, |
| | | .el-tabs--right { |
| | | overflow: hidden; |
| | | align-items: center; |
| | | display: flex; |
| | | } |
| | | ::v-deep.el-input--medium .el-input__inner { |
| | | height: 40px !important; |
| | | } |
| | | ::v-deep.el-tabs--right .el-tabs__active-bar.is-right { |
| | | height: 40px; |
| | | width: 5px; |
| | | left: 0; |
| | | } |
| | | ::v-deep.el-tabs--right .el-tabs__item.is-right { |
| | | display: block; |
| | | text-align: left; |
| | | font-size: 20px; |
| | | } |
| | | |
| | | .leftvlue { |
| | | // display: flex; |
| | | // flex: 1; |
| | | width: 80%; |
| | | margin-top: 20px; |
| | | // margin: 20px; |
| | | padding: 30px; |
| | | background: #ffff; |
| | | border: 1px solid #dcdfe6; |
| | | -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), |
| | | 0 0 6px 0 rgba(0, 0, 0, 0.04); |
| | | .mulsz { |
| | | font-size: 20px; |
| | | .table-container { |
| | | background: #fff; |
| | | border-radius: 8px; |
| | | padding: 20px; |
| | | border: 1px solid #ebeef5; |
| | | |
| | | .group-name { |
| | | color: #409eff; |
| | | cursor: pointer; |
| | | text-decoration: underline; |
| | | transition: color 0.3s; |
| | | |
| | | &:hover { |
| | | color: #66b1ff; |
| | | } |
| | | } |
| | | |
| | | .count-highlight { |
| | | font-weight: 600; |
| | | color: #606266; |
| | | } |
| | | |
| | | .success-count { |
| | | color: #67c23a; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .read-count { |
| | | color: #e6a23c; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .rate-text { |
| | | display: block; |
| | | margin-top: 5px; |
| | | font-size: 12px; |
| | | color: #606266; |
| | | } |
| | | } |
| | | |
| | | .detail-header { |
| | | margin-bottom: 20px; |
| | | padding: 20px; |
| | | background: #f8f9fa; |
| | | border-radius: 8px; |
| | | |
| | | .detail-item { |
| | | label { |
| | | color: #909399; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | span { |
| | | font-size: 16px; |
| | | font-weight: 500; |
| | | color: #303133; |
| | | } |
| | | |
| | | .rate-highlight { |
| | | color: #409eff; |
| | | font-weight: 600; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .detail-tabs { |
| | | margin-top: 20px; |
| | | } |
| | | |
| | | .chart-placeholder { |
| | | height: 300px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | background: #f8f9fa; |
| | | border-radius: 8px; |
| | | color: #909399; |
| | | border: 1px dashed #dcdfe6; |
| | | } |
| | | } |
| | | .document { |
| | | width: 100px; |
| | | height: 50px; |
| | | } |
| | | .documentf { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | } |
| | | .button-text { |
| | | color: rgb(70, 204, 238); |
| | | } |
| | | .button-textck { |
| | | color: rgb(39, 167, 67); |
| | | } |
| | | .button-textxg { |
| | | font-size: 18px; |
| | | color: rgb(35, 81, 233); |
| | | } |
| | | .button-textsc { |
| | | font-size: 18px; |
| | | |
| | | color: rgb(23, 140, 235); |
| | | // 响应式调整 |
| | | @media (max-width: 1200px) { |
| | | .education-statistics { |
| | | padding: 10px; |
| | | } |
| | | |
| | | .summary-cards { |
| | | .el-col { |
| | | margin-bottom: 10px; |
| | | } |
| | | } |
| | | } |
| | | </style> |