| | |
| | | method: "get", |
| | | }); |
| | | } |
| | | // é®å·å¾®ä¿¡æ¨é |
| | | export function weChatSubTask(Id) { |
| | | return request({ |
| | | url: "/smartor/serviceSubtask/weChatSubTask/" + Id, |
| | | method: "get", |
| | | }); |
| | | } |
| | | // åéçä¿¡ |
| | | export function getCurrentUserServiceSubtaskCount(data) { |
| | | return request({ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from '@/utils/request' |
| | | |
| | | /** |
| | | * ä¸ç§æ¡£æ¡çæé
ç½® |
| | | * ææ¡£ï¼ãä¸ç§æ¡£æ¡çæé
ç½®æ¥å£ææ¡£ã2026-10-19ï¼å
± 3 个æ¥å£ï¼ |
| | | * åºè¡¨ï¼pat_specific_archive_generate_configï¼ä¸ç§æ¡£æ¡çæé
ç½®è¡¨ï¼ |
| | | * |
| | | * éç¨çº¦å®ï¼ |
| | | * 1. ä¸ä¸ªæ¥å£å为 POSTï¼è¯·æ±ä½ Content-Type: application/jsonã |
| | | * 2. deptCodes / icd10Codes 卿°æ®åºä¸å®ä½ä¸å为 Stringï¼è¯·æ±æ¶é¡»ä¼ |
| | | * 转ä¹åç JSON å符串ï¼å¦ "[\"D001\",\"D002\"]"ï¼ï¼ä¸è½ç´æ¥ä¼ JSON æ°ç»ã |
| | | * 3. å表æ¥è¯¢åºå®è¿æ»¤ del_flag = '0'ï¼å·²å é¤é
ç½®ä¸ä¼è¿åã |
| | | * 4. orgid / campusid ç±å端æç»å½ç¨æ·èªå¨æ³¨å
¥ï¼å端ä¸ç¨ä¼ ã |
| | | * 5. æ¶é´èå´çéåªè½éè¿ params.beginTime / params.endTime ä¼ ï¼æ create_time è¿æ»¤ã |
| | | */ |
| | | |
| | | // æ¥è¯¢ä¸ç§æ¡£æ¡çæé
ç½®å表 |
| | | export function listSpecificArchiveGenerateConfig(query) { |
| | | return request({ |
| | | url: '/smartor/specificArchiveGenerateConfig/selectPatSpecificArchiveGenerateConfigList', |
| | | method: 'post', |
| | | data: query |
| | | }) |
| | | } |
| | | |
| | | // æ°å¢æä¿®æ¹ä¸ç§æ¡£æ¡çæé
ç½®ï¼æ id ä¸è®°å½åå¨åæ´æ°ï¼å¦åæ°å¢ï¼ |
| | | export function saveSpecificArchiveGenerateConfig(data) { |
| | | return request({ |
| | | url: '/smartor/specificArchiveGenerateConfig/insertOrUpdatePatSpecificArchiveGenerateConfig', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // æ¹éå é¤ä¸ç§æ¡£æ¡çæé
ç½®ï¼æ id æ°ç»é»è¾å é¤ del_flag = '1'ï¼ |
| | | export function batchDeleteSpecificArchiveGenerateConfig(ids) { |
| | | return request({ |
| | | url: '/smartor/specificArchiveGenerateConfig/batchDelete', |
| | | method: 'post', |
| | | data: Array.isArray(ids) ? ids : String(ids).split(',') |
| | | }) |
| | | } |
| | |
| | | type="primary" |
| | | round |
| | | @click="smsSubTask" |
| | | v-if="orgname != 'çç«åå¾·ç¿ èé¢åº'" |
| | | v-if=" |
| | | orgname != 'çç«åå¾·ç¿ èé¢åº' && |
| | | orgname != '丽水å¸ä¸å»é¢' |
| | | " |
| | | > |
| | | é®å·çä¿¡æ¨é |
| | | </el-button> |
| | | <el-button |
| | | type="primary" |
| | | round |
| | | @click="weChatSubTask" |
| | | v-if="orgname == '丽水å¸ä¸å»é¢'" |
| | | > |
| | | é®å·å¾®ä¿¡æ¨é |
| | | </el-button> |
| | | </span> |
| | | </div> |
| | |
| | | title="æ£è
忬¡é访" |
| | | v-dialogDrags |
| | | :visible.sync="dialogFormVisible" |
| | | width="700px" |
| | | width="900px" |
| | | > |
| | | <el-form ref="zcform" :rules="zcrules" :model="form" label-width="80px"> |
| | | <el-form ref="zcform" :rules="zcrules" :model="form" label-width="120px"> |
| | | <!-- åºç¡æå¡ä¿¡æ¯ - é»è®¤æå --> |
| | | <el-collapse v-model="activeNames" @change="handleCollapseChange"> |
| | | <el-collapse-item title="åºç¡æå¡ä¿¡æ¯" name="basic"> |
| | |
| | | |
| | | <!-- 䏿¬¡éè®¿ä¿¡æ¯ - é»è®¤å±å¼ --> |
| | | <el-collapse-item title="䏿¬¡é访" name="next"> |
| | | <el-form-item label="忬¡é访任å¡"> |
| | | <el-input |
| | | disabled |
| | | v-model="nextTaskName" |
| | | placeholder="忬¡é访任å¡" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="é访æ¹å¼" prop="visitType"> |
| | |
| | | </el-form-item> |
| | | <el-form-item label="é访记å½" :required="form.resource == '2'"> |
| | | <el-input type="textarea" v-model="form.remark"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="å»çå¤çæè§" prop="doctorOpinion"> |
| | | <el-input |
| | | type="textarea" |
| | | v-model="form.doctorOpinion" |
| | | ></el-input> |
| | | </el-form-item> |
| | | </el-collapse-item> |
| | | </el-collapse> |
| | |
| | | query360PatInfonh, |
| | | sendMsg, |
| | | smsSubTask, |
| | | weChatSubTask, |
| | | getconfigKey, |
| | | } from "@/api/AiCentre/index"; |
| | | import { getIvrtask } from "@/api/smartor/ivrtask"; |
| | | import { |
| | | messagelistpatient, |
| | | alterpatient, |
| | |
| | | input: "ä»å¤©èº«ä½è¿ä¸é", |
| | | radio: "2", |
| | | taskname: "", |
| | | nextTaskName: "", |
| | | activeName: "wj", |
| | | voice: "", |
| | | templateid: "", |
| | |
| | | }, |
| | | trigger: "change", |
| | | }, |
| | | ], |
| | | doctorOpinion: [ |
| | | { required: true, message: "请è¾å
¥å»çå¤çæè§", trigger: "blur" }, |
| | | ], |
| | | }, |
| | | userrules: { |
| | |
| | | console.log(err); |
| | | }); |
| | | }, |
| | | weChatSubTask() { |
| | | this.$modal |
| | | .confirm("æ¯å¦åæ£è
éè¿å¾®ä¿¡æ¨éé®å·å
容ï¼") |
| | | .then(() => { |
| | | weChatSubTask(this.id).then((res) => { |
| | | if (String(res.code) === "200") { |
| | | this.$modal.msgSuccess(res.msg || "åéæå"); |
| | | } else { |
| | | this.$modal.msgError(res.message || res.msg || "åé失败"); |
| | | } |
| | | }); |
| | | }) |
| | | .catch((err) => { |
| | | console.log(err); |
| | | }); |
| | | }, |
| | | handleConfirmReplace() { |
| | | // éåææé¢ç®ï¼tableDatatopï¼ |
| | | this.tableDatatop.forEach((item) => { |
| | |
| | | console.log(this.form.templatename, "templatename"); |
| | | |
| | | this.form.remark = this.form.remark || ""; |
| | | this.form.doctorOpinion = this.form.doctorOpinion || ""; |
| | | this.logsheetlist = res.rows[0].serviceSubtaskList; |
| | | this.templateid = this.form.templateid; |
| | | this.selectedTag = this.form.excep; |
| | |
| | | return tag ? tag.description : ""; |
| | | }, |
| | | |
| | | // è·å忬¡é访任å¡ä¿¡æ¯ï¼ä¸æ¬¡é访é¨åå±ç¤ºï¼ |
| | | fetchNextTaskInfo() { |
| | | const taskid = this.form.taskid || this.taskid; |
| | | if (!taskid) { |
| | | this.nextTaskName = ""; |
| | | return; |
| | | } |
| | | getIvrtask(taskid).then((r) => { |
| | | const task = r.data || {}; |
| | | const nextid = task.nexttaskid; |
| | | if (nextid) { |
| | | getIvrtask(nextid).then((r2) => { |
| | | this.nextTaskName = |
| | | (r2.data && r2.data.taskName) || task.nexttaskname || ""; |
| | | }); |
| | | } else { |
| | | this.nextTaskName = task.nexttaskname || ""; |
| | | } |
| | | }); |
| | | }, |
| | | // è°èµ·å次åé |
| | | sendAgain() { |
| | | this.fetchNextTaskInfo(); |
| | | getTaskservelist({ |
| | | patid: this.patid, |
| | | visitCount: 2, |
| | |
| | | margin-top: 20px; |
| | | } |
| | | |
| | | .el-input.is-disabled .el-input__inner { |
| | | ::v-deep .el-input.is-disabled .el-input__inner { |
| | | background-color: #fff; |
| | | border-color: #dcdfe6; |
| | | color: #080808 !important; |
| | | cursor: not-allowed; |
| | | } |
| | | |
| | | .el-textarea.is-disabled .el-textarea__inner { |
| | | ::v-deep .el-textarea.is-disabled .el-textarea__inner { |
| | | background-color: #fff; |
| | | border-color: #dcdfe6; |
| | | color: #080808 !important; |
| | |
| | | // å端ç§é¥ |
| | | privateKey: |
| | | " MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEAtDOpbUQhcEoYy77agRhIHmAzs7H+KHJhN56gTTI9fWq23j77nI055MFV3oQQziIrNUTNaPpEQhZXBpI0+f9K9QIDAQABAkB3n0fcWfrcoMN/FU3VnrnZOEF6CzFNxkgU9P8y36QECWKZ9JhYQkNpKrMC9oXlN3VSaRigV7B+L/I/a0Rs1W+tAiEA4jx7xcXJ4y4BNwAmVHt6NNiEkzIwWnwC/0qsEu8NsOsCIQDL6MMn1D2uznC6OuOWpxDCkBh1JL1NzZTZeH2G+hj7nwIgKGAC9tjFnvWm4dn0/T7MIIJDpsFeP8fCAS2iZ/6hwuECIAS/eLvWr1EAsZNEh8QcQ8GkBU3E+ztyjAK8UX/xFt/VAiBf79/1tDErX4/DChecM8w3c3DhbBcjuE3fHZn7p6/UKg==", |
| | | // 满æåº¦/廿´é¢çé»è®¤é项ï¼ä»
å¨é¢ç®æªå¡«åæ¶çæï¼ |
| | | defaultAnswers: [ |
| | | { keyword: "æ¨å¯¹å»æ¤äººåçæ»¡æåº¦ä¸º", answer: "ä¼" }, |
| | | { keyword: "æ¨å¯¹å»é¢ç¯å¢ã设æ½çæ´ä½ç满æåº¦ä¸º", answer: "ä¼" }, |
| | | { keyword: "æ¯å¦æå»æ¤äººå主å¨ç´¢è¦çº¢å
ã馿æè¡¨æ¬ä¿¡", answer: "æ " }, |
| | | ], |
| | | formData: { |
| | | question1: "", |
| | | question2: "", |
| | |
| | | item.scriptResult = item.scriptResult.split("&"); |
| | | } |
| | | }); |
| | | // é»è®¤å¾é满æåº¦/廿´é¢ï¼å·²ä½ççä¸ä¼è¢«è¦çï¼ |
| | | this.applyDefaultAnswers(this.questionList); |
| | | this.loading = false; |
| | | |
| | | return; |
| | |
| | | item.scriptResult = []; |
| | | } |
| | | }); |
| | | // é»è®¤å¾é满æåº¦/廿´é¢ |
| | | this.applyDefaultAnswers(this.questionList); |
| | | this.loading = false; |
| | | } |
| | | }) |
| | |
| | | this.loading = false; |
| | | }); |
| | | }, |
| | | // ç»æå®é¢ç®è®¾ç½®é»è®¤é项ï¼ä»
卿ªå¡«åæ¶çæï¼ |
| | | applyDefaultAnswers(list) { |
| | | if (!Array.isArray(list)) return; |
| | | list.forEach((item) => { |
| | | if (item.scriptType != 1) return; |
| | | // å·²æçæ¡æ¶ä¸è¦ç |
| | | if ( |
| | | item.scriptResult !== undefined && |
| | | item.scriptResult !== null && |
| | | item.scriptResult !== "" |
| | | ) { |
| | | return; |
| | | } |
| | | const content = (item.scriptContent || "").trim(); |
| | | const matched = this.defaultAnswers.find((d) => |
| | | content.includes(d.keyword) |
| | | ); |
| | | if (!matched) return; |
| | | const option = (item.svyTaskTemplateTargetoptions || []).find( |
| | | (o) => (o.optioncontent || "").trim() === matched.answer |
| | | ); |
| | | if (option) { |
| | | item.scriptResult = option.optioncontent; |
| | | } |
| | | }); |
| | | }, |
| | | // å å¯å½æ° |
| | | encrypt(txt) { |
| | | const encryptor = new JSEncrypt(); |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="generateConfig-management"> |
| | | <div class="main-content"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="24" :xs="24"> |
| | | <!-- æ¥è¯¢æ¡ä»¶ --> |
| | | <el-form |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | size="small" |
| | | :inline="true" |
| | | v-show="showSearch" |
| | | label-width="88px" |
| | | > |
| | | <el-form-item label="é¨é¨ç±»å" prop="deptType"> |
| | | <el-select |
| | | v-model="queryParams.deptType" |
| | | placeholder="è¯·éæ©é¨é¨ç±»å" |
| | | clearable |
| | | style="width: 160px" |
| | | > |
| | | <el-option |
| | | v-for="item in DEPT_TYPE_OPTIONS" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="é¨é¨åç±»" prop="deptCategory"> |
| | | <el-select |
| | | v-model="queryParams.deptCategory" |
| | | placeholder="è¯·éæ©é¨é¨åç±»" |
| | | clearable |
| | | style="width: 160px" |
| | | > |
| | | <el-option |
| | | v-for="item in DEPT_CATEGORY_OPTIONS" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="æ¡£æ¡ç±»å" prop="archiveType"> |
| | | <el-select |
| | | v-model="queryParams.archiveType" |
| | | placeholder="è¯·éæ©æ¡£æ¡ç±»å" |
| | | clearable |
| | | style="width: 160px" |
| | | > |
| | | <el-option |
| | | v-for="item in queryArchiveTypeOptions" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="å建æ¶é´"> |
| | | <el-date-picker |
| | | v-model="dateRange" |
| | | type="daterange" |
| | | value-format="yyyy-MM-dd" |
| | | range-separator="è³" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | style="width: 240px" |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | size="medium" |
| | | @click="handleQuery" |
| | | >æç´¢</el-button |
| | | > |
| | | <el-button |
| | | icon="el-icon-refresh" |
| | | size="medium" |
| | | @click="resetQuery" |
| | | >éç½®</el-button |
| | | > |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <el-divider></el-divider> |
| | | |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | type="primary" |
| | | plain |
| | | icon="el-icon-plus" |
| | | size="medium" |
| | | @click="handleAdd" |
| | | >æ°å¢</el-button |
| | | > |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | type="danger" |
| | | plain |
| | | icon="el-icon-delete" |
| | | size="medium" |
| | | :disabled="multiple" |
| | | @click="handleDelete" |
| | | >å é¤</el-button |
| | | > |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="configList" |
| | | :border="true" |
| | | @selection-change="handleSelectionChange" |
| | | > |
| | | <el-table-column type="selection" width="50" align="center" /> |
| | | |
| | | <el-table-column label="é¨é¨ç±»å" align="center" width="100"> |
| | | <template slot-scope="scope"> |
| | | <el-tag |
| | | :type="scope.row.deptType === '1' ? 'primary' : 'warning'" |
| | | size="small" |
| | | > |
| | | {{ deptTypeLabel(scope.row.deptType) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column label="é¨é¨åç±»" align="center" width="100"> |
| | | <template slot-scope="scope"> |
| | | <el-tag size="small"> |
| | | {{ deptCategoryLabel(scope.row.deptCategory) }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="æ¡£æ¡ç±»å" |
| | | align="center" |
| | | width="140" |
| | | :show-overflow-tooltip="true" |
| | | > |
| | | <template slot-scope="scope"> |
| | | {{ archiveTypeLabel(scope.row) }} |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="ç§å®¤/ç
åº" |
| | | align="center" |
| | | min-width="180" |
| | | :show-overflow-tooltip="true" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span v-if="formatDeptCodes(scope.row)"> |
| | | {{ formatDeptCodes(scope.row) }} |
| | | </span> |
| | | <span v-else style="color: #c0c4cc">â</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="è¯æç¼ç " |
| | | align="center" |
| | | min-width="160" |
| | | :show-overflow-tooltip="true" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span v-if="formatIcd10Codes(scope.row)"> |
| | | {{ formatIcd10Codes(scope.row) }} |
| | | </span> |
| | | <span v-else style="color: #c0c4cc">â</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="夿³¨" |
| | | align="center" |
| | | prop="remark" |
| | | min-width="160" |
| | | :show-overflow-tooltip="true" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="å建æ¶é´" |
| | | align="center" |
| | | prop="createTime" |
| | | width="160" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="æä½" |
| | | fixed="right" |
| | | align="center" |
| | | width="160" |
| | | class-name="small-padding fixed-width" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click="handleUpdate(scope.row)" |
| | | > |
| | | <span class="button-textxg"> |
| | | <i class="el-icon-edit"></i>ä¿®æ¹ |
| | | </span> |
| | | </el-button> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click="handleDelete(scope.row)" |
| | | > |
| | | <span class="button-textsc"> |
| | | <i class="el-icon-delete"></i>å é¤ |
| | | </span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" |
| | | @pagination="getList" |
| | | /> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | |
| | | <!-- æ·»å /ä¿®æ¹é
ç½®å¼¹æ¡ --> |
| | | <el-dialog |
| | | :title="dialogTitle" |
| | | :visible.sync="dialogVisible" |
| | | width="45%" |
| | | :close-on-click-modal="false" |
| | | @close="cancelForm" |
| | | > |
| | | <el-form |
| | | :model="form" |
| | | :rules="rules" |
| | | ref="formRef" |
| | | label-width="100px" |
| | | size="medium" |
| | | > |
| | | <el-form-item label="é¨é¨ç±»å" prop="deptType"> |
| | | <el-radio-group v-model="form.deptType" @change="handleDeptTypeChange"> |
| | | <el-radio |
| | | v-for="item in DEPT_TYPE_OPTIONS" |
| | | :key="item.value" |
| | | :label="item.value" |
| | | > |
| | | {{ item.label }} |
| | | </el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="é¨é¨åç±»" prop="deptCategory"> |
| | | <el-select |
| | | v-model="form.deptCategory" |
| | | placeholder="è¯·éæ©é¨é¨åç±»" |
| | | clearable |
| | | style="width: 100%" |
| | | @change="handleDeptCategoryChange" |
| | | > |
| | | <el-option |
| | | v-for="item in DEPT_CATEGORY_OPTIONS" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="æ¡£æ¡ç±»å" prop="archiveType"> |
| | | <el-select |
| | | v-model="form.archiveType" |
| | | placeholder="请å
éæ©é¨é¨åç±»" |
| | | clearable |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="item in currentArchiveTypeOptions" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="ç§å®¤/ç
åº" prop="deptCodes"> |
| | | <el-select |
| | | v-model="form.deptCodes" |
| | | multiple |
| | | filterable |
| | | clearable |
| | | :placeholder=" |
| | | form.deptType === '2' ? 'è¯·éæ©ç
åº' : 'è¯·éæ©ç§å®¤' |
| | | " |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="item in currentDeptOptions" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | /> |
| | | </el-select> |
| | | <div class="form-tip">ææéé¨é¨ç±»åèªå¨åæ¢ç§å®¤ / ç
åºé项</div> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="è¯æç¼ç " prop="icdList"> |
| | | <div style="margin-bottom: 8px"> |
| | | <el-button type="warning" size="small" @click="openIcdDialog" |
| | | >æ·»å ç¾ç
è¯æ</el-button |
| | | > |
| | | </div> |
| | | <el-tag |
| | | v-for="item in form.icdList" |
| | | :key="item.icdid" |
| | | type="warning" |
| | | closable |
| | | :disable-transitions="false" |
| | | @close="removeIcd(item)" |
| | | > |
| | | {{ item.icdname }} |
| | | </el-tag> |
| | | <div class="form-tip">ä»ç¾ç
è¯æè¡¨ä¸éæ©ï¼æ ICD10 ç¼ç å¹é
æ£è
</div> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input |
| | | v-model="form.remark" |
| | | type="textarea" |
| | | :rows="3" |
| | | placeholder="请è¾å
¥å¤æ³¨" |
| | | maxlength="500" |
| | | show-word-limit |
| | | /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button @click="cancelForm">å æ¶</el-button> |
| | | <el-button type="primary" @click="submitForm" :loading="submitLoading" |
| | | >ç¡® å®</el-button |
| | | > |
| | | </div> |
| | | </el-dialog> |
| | | |
| | | <!-- ç¾ç
è¯æè¡¨éæ©å¼¹æ¡ï¼ä¸ä»»å¡é
ç½®ãéç¨ç¾ç
éæ©ãä¸è´ï¼ --> |
| | | <Optional-Form |
| | | ref="icdDialog" |
| | | :dialogVisiblepatient="icdDialogVisible" |
| | | :overallCase="form.icdList" |
| | | @addoption="icdDialogVisible = false" |
| | | @kkoption="icdDialogVisible = true" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { |
| | | listSpecificArchiveGenerateConfig, |
| | | saveSpecificArchiveGenerateConfig, |
| | | batchDeleteSpecificArchiveGenerateConfig, |
| | | } from "@/api/smartor/specificArchiveGenerateConfig"; |
| | | import { getillnesslist } from "@/api/AiCentre/index"; |
| | | import OptionalForm from "@/components/OptionalForm"; |
| | | |
| | | // é¨é¨ç±»åï¼1 ç§å®¤ï¼2 ç
åº |
| | | const DEPT_TYPE_OPTIONS = [ |
| | | { value: "1", label: "ç§å®¤" }, |
| | | { value: "2", label: "ç
åº" }, |
| | | ]; |
| | | |
| | | // é¨é¨åç±»ï¼1 å¦ç§ï¼2 å¿ç§ |
| | | const DEPT_CATEGORY_OPTIONS = [ |
| | | { value: "1", label: "å¦ç§" }, |
| | | { value: "2", label: "å¿ç§" }, |
| | | ]; |
| | | |
| | | // æ¡£æ¡ç±»åï¼æé¨é¨åç±»åºåï¼å¦ç§ä¸å¿ç§åèªä» 1 å¼å§ç¼å·ï¼ |
| | | const ARCHIVE_TYPE_OPTIONS = { |
| | | "1": [ |
| | | { value: "1", label: "æ©åå
³ç±" }, |
| | | { value: "2", label: "å´ç»ç»æMHI" }, |
| | | ], |
| | | "2": [ |
| | | { value: "1", label: "è¥å
»æ§ç¾ç
" }, |
| | | { value: "2", label: "å¦ä¹ å°é¾" }, |
| | | { value: "3", label: "é«å±å¿ä¸æ¡" }, |
| | | ], |
| | | }; |
| | | |
| | | export default { |
| | | name: "GenerateConfig", |
| | | components: { OptionalForm }, |
| | | data() { |
| | | // ç§å®¤/ç
åºç¼ç ä¸ è¯æç¼ç è³å°å¡«åä¸é¡¹ï¼å¦å该è§åæ æ³å¹é
任使£è
|
| | | const validateDeptOrIcd = (rule, value, callback) => { |
| | | const codes = (this.form.deptCodes || []).length; |
| | | const icd = (this.form.icdList || []).length; |
| | | if (!codes && !icd) { |
| | | callback(new Error("ç§å®¤/ç
åºåè¯æç¼ç è³å°å¡«åä¸é¡¹")); |
| | | } else { |
| | | callback(); |
| | | } |
| | | }; |
| | | |
| | | return { |
| | | // 常é |
| | | DEPT_TYPE_OPTIONS, |
| | | DEPT_CATEGORY_OPTIONS, |
| | | |
| | | // é®ç½©å± |
| | | loading: false, |
| | | // æäº¤æé® loading |
| | | submitLoading: false, |
| | | // é䏿°ç» |
| | | ids: [], |
| | | // éå¤ä¸ªç¦ç¨ |
| | | multiple: true, |
| | | // æ¾ç¤ºæç´¢æ¡ä»¶ |
| | | showSearch: true, |
| | | // æ»æ¡æ° |
| | | total: 0, |
| | | // è¡¨æ ¼æ°æ® |
| | | configList: [], |
| | | // å¼¹æ¡æ é¢ |
| | | dialogTitle: "", |
| | | // å¼¹æ¡å¯è§æ§ |
| | | dialogVisible: false, |
| | | // å建æ¶é´èå´ |
| | | dateRange: [], |
| | | // è¯æç¼ç éæ©å¼¹æ¡ |
| | | icdDialogVisible: false, |
| | | // ICD10 ç¼ç -> åç§°æ å°ï¼ç¨äºåæ¾ä¸å表åç§°å±ç¤ºï¼ |
| | | icdCodeMap: {}, |
| | | // æ¥è¯¢åæ° |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | deptType: "", |
| | | deptCategory: "", |
| | | archiveType: "", |
| | | }, |
| | | // 表å |
| | | form: { |
| | | id: "", |
| | | deptType: "1", |
| | | deptCategory: "", |
| | | archiveType: "", |
| | | deptCodes: [], |
| | | icdList: [], |
| | | remark: "", |
| | | }, |
| | | // è¡¨åæ ¡éª |
| | | rules: { |
| | | deptType: [ |
| | | { required: true, message: "è¯·éæ©é¨é¨ç±»å", trigger: "change" }, |
| | | ], |
| | | deptCategory: [ |
| | | { required: true, message: "è¯·éæ©é¨é¨åç±»", trigger: "change" }, |
| | | ], |
| | | archiveType: [ |
| | | { required: true, message: "è¯·éæ©æ¡£æ¡ç±»å", trigger: "change" }, |
| | | ], |
| | | deptCodes: [{ validator: validateDeptOrIcd, trigger: "change" }], |
| | | icdList: [{ validator: validateDeptOrIcd, trigger: "change" }], |
| | | }, |
| | | }; |
| | | }, |
| | | computed: { |
| | | // ç§å®¤é项ï¼ä» store getters è·åï¼ |
| | | departmentOptions() { |
| | | return (this.$store.getters.belongDepts || []).map((dept) => ({ |
| | | label: dept.deptName, |
| | | value: dept.deptCode, |
| | | })); |
| | | }, |
| | | // ç
åºé项ï¼ä» store getters è·åï¼ |
| | | wardOptions() { |
| | | console.log(this.$store.getters.belongWards); |
| | | |
| | | return (this.$store.getters.belongWards || []).map((ward) => ({ |
| | | label: ward.districtName, |
| | | value: ward.districtCode, |
| | | })); |
| | | }, |
| | | // 表åéæé¨é¨ç±»å忢çç§å®¤/ç
åºé项 |
| | | currentDeptOptions() { |
| | | console.log(this.wardOptions); |
| | | console.log(this.departmentOptions); |
| | | |
| | | return this.form.deptType == "2" ? this.wardOptions : this.departmentOptions; |
| | | }, |
| | | // 表åéæé¨é¨åç±»åæ¢çæ¡£æ¡ç±»åé项 |
| | | currentArchiveTypeOptions() { |
| | | return ARCHIVE_TYPE_OPTIONS[this.form.deptCategory] || []; |
| | | }, |
| | | // æ¥è¯¢æ¡ä»¶éçæ¡£æ¡ç±»åé项ï¼ä¸åºååç±»ï¼å
¨éåå¹¶å»éï¼ |
| | | queryArchiveTypeOptions() { |
| | | const all = Object.keys(ARCHIVE_TYPE_OPTIONS).reduce((acc, k) => { |
| | | return acc.concat(ARCHIVE_TYPE_OPTIONS[k]); |
| | | }, []); |
| | | const seen = {}; |
| | | return all.filter((item) => { |
| | | if (seen[item.value]) return false; |
| | | seen[item.value] = true; |
| | | return true; |
| | | }); |
| | | }, |
| | | }, |
| | | created() { |
| | | this.getList(); |
| | | this.loadIcdList(); |
| | | }, |
| | | methods: { |
| | | /** æ¥è¯¢å表 */ |
| | | getList() { |
| | | this.loading = true; |
| | | const query = { ...this.queryParams }; |
| | | if (this.dateRange && this.dateRange.length === 2) { |
| | | query.params = { |
| | | beginTime: this.dateRange[0], |
| | | endTime: this.dateRange[1], |
| | | }; |
| | | } |
| | | listSpecificArchiveGenerateConfig(query) |
| | | .then((response) => { |
| | | this.configList = response.rows; |
| | | this.total = response.total; |
| | | }) |
| | | .finally(() => { |
| | | this.loading = false; |
| | | }); |
| | | }, |
| | | |
| | | /** æç´¢æé®æä½ */ |
| | | handleQuery() { |
| | | this.queryParams.pageNum = 1; |
| | | this.getList(); |
| | | }, |
| | | |
| | | /** éç½®æé®æä½ */ |
| | | resetQuery() { |
| | | this.resetForm("queryForm"); |
| | | this.dateRange = []; |
| | | this.handleQuery(); |
| | | }, |
| | | |
| | | // å¤éæ¡é䏿°æ® |
| | | handleSelectionChange(selection) { |
| | | this.ids = selection.map((item) => item.id); |
| | | this.multiple = !selection.length; |
| | | }, |
| | | |
| | | /** æ°å¢æé®æä½ */ |
| | | handleAdd() { |
| | | this.resetFormData(); |
| | | this.dialogTitle = "æ°å¢ä¸ç§æ¡£æ¡çæé
ç½®"; |
| | | this.dialogVisible = true; |
| | | }, |
| | | |
| | | /** ä¿®æ¹æé®æä½ */ |
| | | handleUpdate(row) { |
| | | this.resetFormData(); |
| | | this.dialogTitle = "ä¿®æ¹ä¸ç§æ¡£æ¡çæé
ç½®"; |
| | | this.dialogVisible = true; |
| | | this.form = { |
| | | id: row.id, |
| | | deptType: row.deptType || "1", |
| | | deptCategory: row.deptCategory || "", |
| | | archiveType: row.archiveType || "", |
| | | deptCodes: this.parseJsonArray(row.deptCodes), |
| | | icdList: this.resolveIcdCodes(row.icd10Codes), |
| | | remark: row.remark || "", |
| | | }; |
| | | }, |
| | | |
| | | /** é¨é¨ç±»åååï¼åæ¢ç§å®¤/ç
åºéé¡¹ï¼æ¸
空已éç¼ç */ |
| | | handleDeptTypeChange() { |
| | | this.form.deptCodes = []; |
| | | }, |
| | | |
| | | /** é¨é¨åç±»ååï¼åæ¢æ¡£æ¡ç±»åéé¡¹ï¼æ¸
ç©ºå·²éæ¡£æ¡ç±»å */ |
| | | handleDeptCategoryChange() { |
| | | this.form.archiveType = ""; |
| | | }, |
| | | |
| | | /** å è½½ ICD10 åå
¸ï¼ç¨äºè¯æç¼ç åæ¾ä¸å表åç§°å±ç¤º */ |
| | | loadIcdList() { |
| | | getillnesslist({ pageNum: 1, pageSize: 1000 }).then((res) => { |
| | | const map = {}; |
| | | (res.rows || []).forEach((item) => { |
| | | map[item.icdcode] = { |
| | | icdid: item.icdid, |
| | | icdname: item.icdname, |
| | | icdcode: item.icdcode, |
| | | }; |
| | | }); |
| | | this.icdCodeMap = map; |
| | | }); |
| | | }, |
| | | |
| | | /** æå¼ç¾ç
è¯æè¡¨éæ©å¼¹æ¡ */ |
| | | openIcdDialog() { |
| | | this.$refs.icdDialog && this.$refs.icdDialog.handleAddpatient(); |
| | | }, |
| | | |
| | | /** ç§»é¤å·²éè¯æ */ |
| | | removeIcd(item) { |
| | | this.form.icdList = this.form.icdList.filter( |
| | | (d) => d.icdid !== item.icdid |
| | | ); |
| | | }, |
| | | |
| | | /** å端 JSON ç¼ç æ°ç» -> è¯æå¯¹è±¡æ°ç»ï¼ç¨äºåæ¾ï¼ */ |
| | | resolveIcdCodes(val) { |
| | | const codes = this.parseJsonArray(val); |
| | | return codes.map((code) => |
| | | this.icdCodeMap[code] |
| | | ? { ...this.icdCodeMap[code] } |
| | | : { icdid: code, icdname: code, icdcode: code } |
| | | ); |
| | | }, |
| | | |
| | | /** æäº¤è¡¨å */ |
| | | submitForm() { |
| | | this.$refs.formRef.validate((valid) => { |
| | | if (!valid) return; |
| | | this.submitLoading = true; |
| | | const data = { |
| | | id: this.form.id || undefined, |
| | | deptType: this.form.deptType, |
| | | deptCategory: this.form.deptCategory, |
| | | archiveType: this.form.archiveType, |
| | | remark: this.form.remark || "", |
| | | }; |
| | | // åç«¯è¦æ± deptCodes / icd10Codes ä¼ è½¬ä¹åç JSON åç¬¦ä¸²ï¼ |
| | | // 注æï¼æ´æ°æ¶ä¼ null çåæ®µä¸å䏿´æ°ï¼ä¿æåå¼ï¼ï¼ |
| | | // å æ¤æ¸
空æ¶é¡»ä¼ 空 JSON æ°ç» "[]" æè½çæ£æ¸
æã |
| | | data.deptCodes = |
| | | this.form.deptCodes && this.form.deptCodes.length |
| | | ? JSON.stringify(this.form.deptCodes) |
| | | : "[]"; |
| | | data.icd10Codes = |
| | | this.form.icdList && this.form.icdList.length |
| | | ? JSON.stringify(this.form.icdList.map((d) => d.icdcode)) |
| | | : "[]"; |
| | | |
| | | saveSpecificArchiveGenerateConfig(data) |
| | | .then((response) => { |
| | | if (response.code === 200) { |
| | | this.$modal.msgSuccess("æä½æå"); |
| | | this.dialogVisible = false; |
| | | this.getList(); |
| | | } else { |
| | | this.$modal.msgError(response.msg || "æä½å¤±è´¥"); |
| | | } |
| | | }) |
| | | .finally(() => { |
| | | this.submitLoading = false; |
| | | }); |
| | | }); |
| | | }, |
| | | |
| | | /** åæ¶è¡¨å */ |
| | | cancelForm() { |
| | | this.dialogVisible = false; |
| | | this.resetFormData(); |
| | | this.$nextTick(() => { |
| | | if (this.$refs.formRef) { |
| | | this.$refs.formRef.clearValidate(); |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | /** éç½®è¡¨åæ°æ® */ |
| | | resetFormData() { |
| | | this.form = { |
| | | id: "", |
| | | deptType: "1", |
| | | deptCategory: "", |
| | | archiveType: "", |
| | | deptCodes: [], |
| | | icdList: [], |
| | | remark: "", |
| | | }; |
| | | }, |
| | | |
| | | /** å é¤æé®æä½ */ |
| | | handleDelete(row) { |
| | | const ids = row && row.id != null ? [row.id] : this.ids; |
| | | if (!ids.length) return; |
| | | this.$modal |
| | | .confirm("æ¯å¦ç¡®è®¤å é¤éä¸çä¸ç§æ¡£æ¡çæé
ç½®æ°æ®é¡¹ï¼") |
| | | .then(() => { |
| | | return batchDeleteSpecificArchiveGenerateConfig(ids); |
| | | }) |
| | | .then((response) => { |
| | | if (response.code === 200) { |
| | | this.getList(); |
| | | this.$modal.msgSuccess("å 餿å"); |
| | | } else { |
| | | this.$modal.msgError(response.msg || "å é¤å¤±è´¥"); |
| | | } |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | |
| | | /** é¨é¨ç±»å label */ |
| | | deptTypeLabel(val) { |
| | | const item = DEPT_TYPE_OPTIONS.find((o) => o.value === String(val)); |
| | | return item ? item.label : val || "â"; |
| | | }, |
| | | |
| | | /** é¨é¨åç±» label */ |
| | | deptCategoryLabel(val) { |
| | | const item = DEPT_CATEGORY_OPTIONS.find((o) => o.value === String(val)); |
| | | return item ? item.label : val || "â"; |
| | | }, |
| | | |
| | | /** æ¡£æ¡ç±»å labelï¼ä¾èµé¨é¨åç±»ï¼ */ |
| | | archiveTypeLabel(row) { |
| | | const opts = ARCHIVE_TYPE_OPTIONS[String(row.deptCategory)] || []; |
| | | const item = opts.find((o) => o.value === String(row.archiveType)); |
| | | return item ? item.label : row.archiveType || "â"; |
| | | }, |
| | | |
| | | /** ç§å®¤/ç
åºç¼ç -> åç§° */ |
| | | formatDeptCodes(row) { |
| | | const codes = this.parseJsonArray(row.deptCodes); |
| | | if (!codes.length) return ""; |
| | | const source = |
| | | String(row.deptType) === "2" ? this.wardOptions : this.departmentOptions; |
| | | const map = {}; |
| | | source.forEach((o) => (map[o.value] = o.label)); |
| | | return codes.map((c) => map[c] || c).join("ã"); |
| | | }, |
| | | |
| | | /** è¯æç¼ç -> åç§°æ¼æ¥ï¼åå
¸ç¼ºå¤±æ¶åéæ¾ç¤ºç¼ç ï¼ */ |
| | | formatIcd10Codes(row) { |
| | | const codes = this.parseJsonArray(row.icd10Codes); |
| | | return codes |
| | | .map((c) => { |
| | | const item = this.icdCodeMap[c]; |
| | | return item ? item.icdname : c; |
| | | }) |
| | | .join("ã"); |
| | | }, |
| | | |
| | | /** è§£æå端è¿åç JSON å符串ï¼deptCodes / icd10Codesï¼ */ |
| | | parseJsonArray(val) { |
| | | if (!val) return []; |
| | | if (Array.isArray(val)) return val; |
| | | try { |
| | | const arr = JSON.parse(val); |
| | | return Array.isArray(arr) ? arr : []; |
| | | } catch (e) { |
| | | return []; |
| | | } |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .generateConfig-management { |
| | | padding: 20px; |
| | | } |
| | | |
| | | .main-content { |
| | | padding: 30px; |
| | | background: #fff; |
| | | border: 1px solid #dcdfe6; |
| | | -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), |
| | | 0 0 6px 0 rgba(0, 0, 0, 0.04); |
| | | } |
| | | |
| | | .mb8 { |
| | | margin-bottom: 8px; |
| | | } |
| | | |
| | | .form-tip { |
| | | width: 100%; |
| | | font-size: 12px; |
| | | color: #909399; |
| | | line-height: 1.5; |
| | | margin-top: 4px; |
| | | } |
| | | |
| | | .dialog-footer { |
| | | text-align: right; |
| | | } |
| | | |
| | | // æé®æåé¢è² |
| | | .button-textxg { |
| | | color: rgb(35, 81, 233); |
| | | } |
| | | |
| | | .button-textsc { |
| | | color: rgb(235, 23, 23); |
| | | } |
| | | </style> |
| | |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="å»ºæ¡£æ¥æ"> |
| | | <el-date-picker |
| | | v-model="dateRange" |
| | | style="width: 240px" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | type="datetimerange" |
| | | range-separator="-" |
| | | start-placeholder="å¼å§æ¶é´" |
| | | end-placeholder="ç»ææ¶é´" |
| | | :default-time="['00:00:00', '23:59:59']" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | |
| | | <!-- <el-form-item label="æ£è
èå´" prop="tagId"> |
| | | <el-select |
| | |
| | | status: undefined, |
| | | tagIds: undefined, |
| | | telcode: undefined, |
| | | createTime: undefined, |
| | | endTime: undefined, |
| | | }, |
| | | // è¡¨åæ ¡éª |
| | | rules: {}, |
| | |
| | | /** æç´¢æé®æä½ */ |
| | | handleQuery() { |
| | | this.queryParams.pageNum = 1; |
| | | this.queryParams.createTime = this.dateRange[0]; |
| | | this.queryParams.endTime = this.dateRange[1]; |
| | | this.getList(); |
| | | }, |
| | | /** éç½®æé®æä½ */ |
| | | resetQuery() { |
| | | this.dateRange = []; |
| | | (this.queryParams = { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | |
| | | /** æ¥è¯¢æ£è
å表 */ |
| | | getList() { |
| | | this.loading = true; |
| | | listpatient(this.queryParams).then((response) => { |
| | | listpatient(this.buildListQueryParams()).then((response) => { |
| | | console.log(response); |
| | | this.userList = response.rows; |
| | | this.total = response.total; |
| | | this.loading = false; |
| | | }); |
| | | }, |
| | | /** |
| | | * ç»è£
listpatient å
¥åï¼ |
| | | * cry = 0 ä¸ç»å½æºæä¸ºãçç«åå¾·ç¿ èé¢åº / åå大å¦éå±ç¬¬ä¸å»é¢ãæ¶ï¼ |
| | | * ç§å®¤/ç
åºå段 leaveldeptcodesãleavehospitaldistrictcodes 鿢æ |
| | | * deptcodeListãhospitaldistrictcodeListã |
| | | */ |
| | | buildListQueryParams() { |
| | | const params = { ...this.queryParams }; |
| | | const orgname = localStorage.getItem("orgname"); |
| | | const needRename = |
| | | params.cry === 0 && |
| | | (orgname === "çç«åå¾·ç¿ èé¢åº" || |
| | | orgname === "åå大å¦éå±ç¬¬ä¸å»é¢"); |
| | | if (needRename) { |
| | | params.deptcodeList = params.leaveldeptcodes; |
| | | params.hospitaldistrictcodeList = params.leavehospitaldistrictcodes; |
| | | delete params.leaveldeptcodes; |
| | | delete params.leavehospitaldistrictcodes; |
| | | } |
| | | return params; |
| | | }, |
| | | /** è¡¨æ ¼è¡æ ·å¼ */ |
| | | tableRowClassName({ row, rowIndex }) { |
| | | if (rowIndex % 2 === 0) { |
| | |
| | | <el-input |
| | | style="width: 300px" |
| | | :disabled="true" |
| | | v-model="nextTaskName" |
| | | v-model="nexttaskname" |
| | | placeholder="请ç¹å»å³ä¾§éæ©ä»»å¡" |
| | | /> |
| | | <el-button |
| | |
| | | </el-table> |
| | | </el-row> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="examine-jic"> |
| | | <div class="headline"> |
| | | <div>äºæ¬¡é访任å¡é
ç½®</div> |
| | | </div> |
| | | <div class="jic-value"> |
| | | <el-form label-width="125px"> |
| | | <el-form-item label="äºæ¬¡é访任å¡"> |
| | | <el-input |
| | | style="width: 300px" |
| | | :disabled="true" |
| | | v-model="nexttaskname" |
| | | placeholder="请ç¹å»å³ä¾§éæ©ä»»å¡" |
| | | /> |
| | | <el-button |
| | | style="margin-left: 10px" |
| | | type="primary" |
| | | icon="el-icon-edit" |
| | | circle |
| | | @click="openNextTaskDialog" |
| | | ></el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | patTaskRelevances: [], |
| | | nexttaskflag: "0", |
| | | nexttaskid: null, |
| | | nexttaskname: "", |
| | | sendType: 1, |
| | | longTask: 0, |
| | | templatename: "", |
| | |
| | | nextTaskList: [], |
| | | nextTaskTotal: 0, |
| | | nextTaskQuery: { pageNum: 1, pageSize: 10, taskName: "" }, |
| | | nextTaskName: "", |
| | | nexttaskname: "", |
| | | // æ¨¡æ¿æç´¢ |
| | | templateOptions: [], |
| | | templateLoading: false, |
| | |
| | | patTaskRelevances: [], |
| | | nexttaskflag: "0", |
| | | nexttaskid: null, |
| | | nexttaskname: "", |
| | | sendType: 1, |
| | | sendDay: 5, |
| | | templatename: "", |
| | |
| | | this.form = res.data; |
| | | // 忾忬¡é访å
³èä»»å¡ |
| | | if (this.form.nexttaskflag == null) this.form.nexttaskflag = "0"; |
| | | this.nextTaskName = ""; |
| | | this.nexttaskname = ""; |
| | | if (this.form.nexttaskid) { |
| | | getIvrtask(this.form.nexttaskid).then((r) => { |
| | | this.nextTaskName = (r.data && r.data.taskName) || ""; |
| | | this.nexttaskname = (r.data && r.data.taskName) || ""; |
| | | this.form.nexttaskname = (r.data && r.data.taskName) || ""; |
| | | }); |
| | | } |
| | | // 妿è¿åäº serviceTaskScheduleVOï¼è§£ææç»ä¸ç content |
| | |
| | | this.time4 = ""; |
| | | this.form.nexttaskflag = "0"; |
| | | this.form.nexttaskid = null; |
| | | this.nextTaskName = ""; |
| | | this.form.nexttaskname = ""; |
| | | this.nexttaskname = ""; |
| | | // é置任å¡ç» |
| | | this.form.serviceTaskScheduleVO = { |
| | | scheduleStyle: 0, |
| | |
| | | }, |
| | | selectNextTask(row) { |
| | | this.form.nexttaskid = row.taskid; |
| | | this.nextTaskName = row.taskName; |
| | | this.form.nexttaskname = row.taskName; |
| | | this.nexttaskname = row.taskName; |
| | | this.nextTaskDialogVisible = false; |
| | | }, |
| | | |
| | |
| | | <el-input |
| | | style="width: 300px" |
| | | :disabled="true" |
| | | v-model="nextTaskName" |
| | | v-model="nexttaskname" |
| | | placeholder="请ç¹å»å³ä¾§éæ©ä»»å¡" |
| | | /> |
| | | <el-button |
| | |
| | | </el-table> |
| | | </el-row> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="examine-jic"> |
| | | <div class="headline"> |
| | | <div>äºæ¬¡é访任å¡é
ç½®</div> |
| | | </div> |
| | | <div class="jic-value"> |
| | | <el-form label-width="125px"> |
| | | <el-form-item label="äºæ¬¡é访任å¡"> |
| | | <el-input |
| | | style="width: 300px" |
| | | :disabled="true" |
| | | v-model="nexttaskname" |
| | | placeholder="请ç¹å»å³ä¾§éæ©ä»»å¡" |
| | | /> |
| | | <el-button |
| | | style="margin-left: 10px" |
| | | type="primary" |
| | | icon="el-icon-edit" |
| | | circle |
| | | @click="openNextTaskDialog" |
| | | ></el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | patTaskRelevances: [], |
| | | nexttaskflag: "0", |
| | | nexttaskid: null, |
| | | nexttaskname: "", |
| | | sendType: 3, |
| | | longTask: 0, |
| | | templatename: "", |
| | |
| | | nextTaskList: [], |
| | | nextTaskTotal: 0, |
| | | nextTaskQuery: { pageNum: 1, pageSize: 10, taskName: "" }, |
| | | nextTaskName: "", |
| | | nexttaskname: "", |
| | | // æ¨¡æ¿æç´¢ |
| | | templateOptions: [], |
| | | templateLoading: false, |
| | |
| | | patTaskRelevances: [], |
| | | nexttaskflag: "0", |
| | | nexttaskid: null, |
| | | nexttaskname: "", |
| | | sendType: 1, |
| | | sendDay: 5, |
| | | templatename: "", |
| | |
| | | this.form = res.data; |
| | | // 忾忬¡é访å
³èä»»å¡ |
| | | if (this.form.nexttaskflag == null) this.form.nexttaskflag = "0"; |
| | | this.nextTaskName = ""; |
| | | this.nexttaskname = ""; |
| | | if (this.form.nexttaskid) { |
| | | getIvrtask(this.form.nexttaskid).then((r) => { |
| | | this.nextTaskName = (r.data && r.data.taskName) || ""; |
| | | this.nexttaskname = (r.data && r.data.taskName) || ""; |
| | | this.form.nexttaskname = (r.data && r.data.taskName) || ""; |
| | | }); |
| | | } |
| | | // 妿è¿åäº serviceTaskScheduleVOï¼åè§£ææç»ä¸ç content |
| | |
| | | this.time4 = ""; |
| | | this.form.nexttaskflag = "0"; |
| | | this.form.nexttaskid = null; |
| | | this.nextTaskName = ""; |
| | | this.form.nexttaskname = ""; |
| | | this.nexttaskname = ""; |
| | | // é置任å¡ç» |
| | | this.form.serviceTaskScheduleVO = { |
| | | scheduleStyle: 0, |
| | |
| | | }, |
| | | selectNextTask(row) { |
| | | this.form.nexttaskid = row.taskid; |
| | | this.nextTaskName = row.taskName; |
| | | this.form.nexttaskname = row.taskName; |
| | | this.nexttaskname = row.taskName; |
| | | this.nextTaskDialogVisible = false; |
| | | }, |
| | | |
| | |
| | | <el-table-column |
| | | label="åé宿" |
| | | align="center" |
| | | key="manualSuccess" |
| | | prop="manualSuccess" |
| | | key="manual" |
| | | prop="manual" |
| | | :render-header="Tooltipfswc" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'manualSuccessInfo', |
| | | 'manualInfo', |
| | | 'åéå®æäººå·¥é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ scope.row.manualSuccess }}</span> |
| | | <span class="button-zx">{{ scope.row.manual }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æç»å®æ" |
| | | align="center" |
| | | key="manualAgainSuccess" |
| | | prop="manualAgainSuccess" |
| | | key="manualSuccess" |
| | | prop="manualSuccess" |
| | | :render-header="Tooltipzzwc" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'manualAgainSuccessInfo', |
| | | 'manualSuccessInfo', |
| | | 'æç»å®æäººå·¥é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.manualAgainSuccess |
| | | scope.row.manualSuccess |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | |
| | | <el-table-column |
| | | label="åé宿" |
| | | align="center" |
| | | key="voiceSuccess" |
| | | prop="voiceSuccess" |
| | | key="voice" |
| | | prop="voice" |
| | | :render-header="Tooltipfswc" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'voiceSuccessInfo', |
| | | 'voiceInfo', |
| | | 'åé宿è¯é³é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ scope.row.voiceSuccess }}</span> |
| | | <span class="button-zx">{{ scope.row.voice }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æç»å®æ" |
| | | align="center" |
| | | key="voiceAgainSuccess" |
| | | prop="voiceAgainSuccess" |
| | | key="voiceSuccess" |
| | | prop="voiceSuccess" |
| | | :render-header="Tooltipzzwc" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'voiceAgainSuccessInfo', |
| | | 'voiceSuccessInfo', |
| | | 'æç»å®æè¯é³é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.voiceAgainSuccess |
| | | scope.row.voiceSuccess |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | |
| | | <el-table-column |
| | | label="åé宿" |
| | | align="center" |
| | | key="smsSuccess" |
| | | prop="smsSuccess" |
| | | key="sms" |
| | | prop="sms" |
| | | :render-header="Tooltipfswc" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'smsSuccessInfo', |
| | | 'smsInfo', |
| | | 'åé宿çä¿¡é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ scope.row.smsSuccess }}</span> |
| | | <span class="button-zx">{{ scope.row.sms }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æç»å®æ" |
| | | align="center" |
| | | key="smsAgainSuccess" |
| | | prop="smsAgainSuccess" |
| | | key="smsSuccess" |
| | | prop="smsSuccess" |
| | | :render-header="Tooltipzzwc" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'smsAgainSuccessInfo', |
| | | 'smsSuccessInfo', |
| | | 'æç»å®æçä¿¡é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.smsAgainSuccess |
| | | scope.row.smsSuccess |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | |
| | | <el-table-column |
| | | label="åé宿" |
| | | align="center" |
| | | key="weChatSuccess" |
| | | prop="weChatSuccess" |
| | | key="weChat" |
| | | prop="weChat" |
| | | :render-header="Tooltipfswc" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'wechatSuccessInfo', |
| | | 'weChatInfo', |
| | | 'åéå®æå¾®ä¿¡é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ scope.row.weChatSuccess }}</span> |
| | | <span class="button-zx">{{ scope.row.weChat }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æç»å®æ" |
| | | align="center" |
| | | key="weChatAgainSuccess" |
| | | prop="weChatAgainSuccess" |
| | | key="weChatSuccess" |
| | | prop="weChatSuccess" |
| | | :render-header="Tooltipzzwc" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'wechatAgainSuccessInfo', |
| | | 'weChatSuccessInfo', |
| | | 'æç»å®æå¾®ä¿¡é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ |
| | | scope.row.weChatAgainSuccess |
| | | scope.row.weChatSuccess |
| | | }}</span> |
| | | </el-button> |
| | | </template> |
| | |
| | | right: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | }, |
| | | }; |
| | | const titleText = `${serviceTypeName}ç»è®¡è¡¨_${sheetNameSuffix}`; |
| | | // æ·»å æ é¢è¡ |
| | | worksheet.mergeCells(1, 1, 1, 16); |
| | | const titleCell = worksheet.getCell(1, 1); |
| | | titleCell.value = titleText; // 使ç¨å¨ææ é¢ |
| | | titleCell.style = titleStyle; |
| | | worksheet.getRow(1).height = 35; |
| | | // æ¯å¦ä¸ºç®æ å»é¢ï¼äººå·¥/è¯é³/çä¿¡/微信 æ åé宿/æç»å®æ å级å±ç¤ºï¼ |
| | | const graded = this.isTargetHospital; |
| | | |
| | | // 表头 |
| | | const secondRowHeaders = [ |
| | | const baseHeaders = [ |
| | | "", |
| | | "åºé¢ç
åº", |
| | | "ç§å®¤", |
| | | "åºé¢äººæ¬¡", |
| | | "æ éé访人次", |
| | | "åºé访人次", |
| | | ]; |
| | | const coreHeaders = [ |
| | | "éé访", |
| | | "å¾
é访", |
| | | "é访æå", |
| | | "é访失败", |
| | | "æåç", // æ°å¢ |
| | | "é访ç", // åä½ç½®åç§» |
| | | "åæ¶ç", // åæ¶çåç§» |
| | | "人工", |
| | | "è¯é³", // ä¿®æ£ï¼åºè¯¥æ¯è¯é³ |
| | | "çä¿¡", // çä¿¡ |
| | | "微信", // 微信 |
| | | "æåç", |
| | | "é访ç", |
| | | "åæ¶ç", |
| | | ]; |
| | | const methodGroups = this.getMethodColumns(); |
| | | |
| | | secondRowHeaders.forEach((header, index) => { |
| | | const cell = worksheet.getCell(3, index + 1); |
| | | cell.value = header; |
| | | cell.style = headerStyle; |
| | | }); |
| | | const baseCount = baseHeaders.length; // 6 |
| | | const coreCount = coreHeaders.length; // 7 |
| | | const methodLeafCount = methodGroups.reduce( |
| | | (sum, g) => sum + g.fields.length, |
| | | 0 |
| | | ); // 8 æ 4 |
| | | const totalCols = baseCount + coreCount + methodLeafCount; // 21 æ 17 |
| | | const coreStartCol = baseCount + 1; // 7 |
| | | const methodStartCol = baseCount + coreCount + 1; // 14 |
| | | |
| | | // åå¹¶åå
æ ¼ |
| | | for (let i = 1; i <= 6; i++) { |
| | | worksheet.mergeCells(2, i, 3, i); |
| | | const cell = worksheet.getCell(2, i); |
| | | cell.style = headerStyle; |
| | | const titleText = `${serviceTypeName}ç»è®¡è¡¨_${sheetNameSuffix}`; |
| | | // æ·»å æ é¢è¡ |
| | | worksheet.mergeCells(1, 1, 1, totalCols); |
| | | const titleCell = worksheet.getCell(1, 1); |
| | | titleCell.value = titleText; |
| | | titleCell.style = titleStyle; |
| | | worksheet.getRow(1).height = 35; |
| | | |
| | | if (graded) { |
| | | // 表头å 3 è¡ï¼ç¬¬2/3/4è¡ï¼ï¼æ°æ®ä»ç¬¬5è¡å¼å§ |
| | | const headerEndRow = 4; |
| | | |
| | | // 第2è¡ï¼åºç¡å纵ååå¹¶ + é访åç»æ¨ªååå¹¶ |
| | | for (let i = 1; i <= baseCount; i++) { |
| | | worksheet.mergeCells(2, i, headerEndRow, i); |
| | | const cell = worksheet.getCell(2, i); |
| | | cell.value = baseHeaders[i - 1]; |
| | | cell.style = headerStyle; |
| | | } |
| | | worksheet.mergeCells(2, coreStartCol, 2, totalCols); |
| | | worksheet.getCell(2, coreStartCol).value = serviceTypeName; |
| | | worksheet.getCell(2, coreStartCol).style = headerStyle; |
| | | |
| | | // 第3è¡ï¼éè®¿æ ¸å¿å纵ååå¹¶ + é访æ¹å¼åç»æ¨ªååå¹¶ |
| | | for (let k = 0; k < coreCount; k++) { |
| | | const col = coreStartCol + k; |
| | | worksheet.mergeCells(3, col, headerEndRow, col); |
| | | const cell = worksheet.getCell(3, col); |
| | | cell.value = coreHeaders[k]; |
| | | cell.style = headerStyle; |
| | | } |
| | | let mc = methodStartCol; |
| | | methodGroups.forEach((g) => { |
| | | if (g.fields.length > 1) { |
| | | worksheet.mergeCells(3, mc, 3, mc + g.fields.length - 1); |
| | | } |
| | | const cell = worksheet.getCell(3, mc); |
| | | cell.value = g.label; |
| | | cell.style = headerStyle; |
| | | mc += g.fields.length; |
| | | }); |
| | | |
| | | // 第4è¡ï¼é访æ¹å¼ååï¼åé宿/æç»å®æï¼ |
| | | mc = methodStartCol; |
| | | methodGroups.forEach((g) => { |
| | | g.fields.forEach((field, idx) => { |
| | | const cell = worksheet.getCell(4, mc + idx); |
| | | cell.value = g.sub[idx]; |
| | | cell.style = headerStyle; |
| | | }); |
| | | mc += g.fields.length; |
| | | }); |
| | | |
| | | worksheet.getRow(2).height = 28; |
| | | worksheet.getRow(3).height = 24; |
| | | worksheet.getRow(4).height = 24; |
| | | } else { |
| | | // 表头å 2 è¡ï¼ç¬¬2/3è¡ï¼ï¼æ°æ®ä»ç¬¬4è¡å¼å§ |
| | | const headerEndRow = 3; |
| | | |
| | | for (let i = 1; i <= baseCount; i++) { |
| | | worksheet.mergeCells(2, i, headerEndRow, i); |
| | | const cell = worksheet.getCell(2, i); |
| | | cell.value = baseHeaders[i - 1]; |
| | | cell.style = headerStyle; |
| | | } |
| | | worksheet.mergeCells(2, coreStartCol, 2, totalCols); |
| | | worksheet.getCell(2, coreStartCol).value = serviceTypeName; |
| | | worksheet.getCell(2, coreStartCol).style = headerStyle; |
| | | |
| | | // 第3è¡ï¼éè®¿æ ¸å¿å + é访æ¹å¼å |
| | | for (let k = 0; k < coreCount; k++) { |
| | | const cell = worksheet.getCell(3, coreStartCol + k); |
| | | cell.value = coreHeaders[k]; |
| | | cell.style = headerStyle; |
| | | } |
| | | let mc = methodStartCol; |
| | | methodGroups.forEach((g) => { |
| | | const cell = worksheet.getCell(3, mc); |
| | | cell.value = g.label; |
| | | cell.style = headerStyle; |
| | | mc += 1; |
| | | }); |
| | | |
| | | worksheet.getRow(2).height = 28; |
| | | worksheet.getRow(3).height = 25; |
| | | } |
| | | |
| | | worksheet.getCell(2, 1).value = ""; |
| | | worksheet.getCell(2, 2).value = "åºé¢ç
åº"; |
| | | worksheet.getCell(2, 3).value = "ç§å®¤"; |
| | | worksheet.getCell(2, 4).value = "åºé¢äººæ¬¡"; |
| | | worksheet.getCell(2, 5).value = "æ éé访人次"; |
| | | worksheet.getCell(2, 6).value = "åºé访人次"; |
| | | |
| | | worksheet.mergeCells(2, 7, 2, 16); // ä»7åå¹¶å°16ï¼åæ¥æ¯7-15ï¼ |
| | | worksheet.getCell(2, 7).value = serviceTypeName; // æé彿ªå |
| | | worksheet.getCell(2, 7).style = headerStyle; |
| | | |
| | | worksheet.getRow(2).height = 28; |
| | | worksheet.getRow(3).height = 25; |
| | | |
| | | // æ°æ®è¡ |
| | | const dataStartRow = graded ? 5 : 4; |
| | | this.tableData.forEach((item, rowIndex) => { |
| | | const dataRow = worksheet.addRow( |
| | | [ |
| | | "", |
| | | item.leavehospitaldistrictname || "", |
| | | item.deptname || "", |
| | | item.dischargeCount || 0, |
| | | item.nonFollowUp || 0, |
| | | item.followUpNeeded || 0, |
| | | item.needFollowUp || 0, |
| | | item.pendingFollowUp || 0, |
| | | item.followUpSuccess || 0, |
| | | item.followUpFail || 0, |
| | | // æåç - éè¦å¨æè®¡ç® |
| | | this.calculateSuccessRate( |
| | | item.followUpSuccess, |
| | | item.needFollowUp, |
| | | item.pendingFollowUp |
| | | ), |
| | | item.followUpRate || "0%", // é访ç |
| | | item.rate ? (Number(item.rate) * 100).toFixed(2) + "%" : "0%", // åæ¶ç |
| | | item.manual || 0, |
| | | item.voice || 0, // è¯é³ |
| | | item.sms || 0, // çä¿¡ |
| | | item.weChat || 0, // 微信 |
| | | ], |
| | | rowIndex + 4 |
| | | ); |
| | | const rowValues = [ |
| | | "", |
| | | item.leavehospitaldistrictname || "", |
| | | item.deptname || "", |
| | | item.dischargeCount || 0, |
| | | item.nonFollowUp || 0, |
| | | item.followUpNeeded || 0, |
| | | item.needFollowUp || 0, |
| | | item.pendingFollowUp || 0, |
| | | item.followUpSuccess || 0, |
| | | item.followUpFail || 0, |
| | | // æåç - éè¦å¨æè®¡ç® |
| | | this.calculateSuccessRate( |
| | | item.followUpSuccess, |
| | | item.needFollowUp, |
| | | item.pendingFollowUp |
| | | ), |
| | | item.followUpRate || "0%", // é访ç |
| | | item.rate ? (Number(item.rate) * 100).toFixed(2) + "%" : "0%", // åæ¶ç |
| | | ]; |
| | | methodGroups.forEach((g) => { |
| | | g.fields.forEach((field) => { |
| | | rowValues.push(item[field] || 0); |
| | | }); |
| | | }); |
| | | |
| | | const dataRow = worksheet.addRow(rowValues, rowIndex + dataStartRow); |
| | | dataRow.eachCell((cell) => { |
| | | cell.style = cellStyle; |
| | | }); |
| | |
| | | summaryRow.height = 28; |
| | | |
| | | // å宽 |
| | | worksheet.columns = [ |
| | | { width: 8 }, |
| | | { width: 20 }, |
| | | { width: 15 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 10 }, |
| | | { width: 10 }, |
| | | { width: 10 }, |
| | | { width: 10 }, |
| | | { width: 12 }, // æåç |
| | | { width: 12 }, // é访ç |
| | | { width: 12 }, // åæ¶ç |
| | | { width: 8 }, // 人工 |
| | | { width: 8 }, // è¯é³ |
| | | { width: 8 }, // çä¿¡ |
| | | { width: 8 }, // 微信 |
| | | const widths = [8, 20, 15, 12, 12, 12, 10, 10, 10, 10, 12, 12, 12]; |
| | | methodGroups.forEach((g) => { |
| | | g.fields.forEach(() => widths.push(8)); |
| | | }); |
| | | worksheet.columns = widths.map((width) => ({ width })); |
| | | }, |
| | | getMethodColumns() { |
| | | // é访æ¹å¼åé
ç½®ï¼ç®æ å»é¢æâåé宿/æç»å®æâå级å±ç¤º |
| | | if (this.isTargetHospital) { |
| | | return [ |
| | | { label: "人工", fields: ["manual", "manualSuccess"], sub: ["åé宿", "æç»å®æ"] }, |
| | | { label: "è¯é³", fields: ["voice", "voiceSuccess"], sub: ["åé宿", "æç»å®æ"] }, |
| | | { label: "çä¿¡", fields: ["sms", "smsSuccess"], sub: ["åé宿", "æç»å®æ"] }, |
| | | { label: "微信", fields: ["weChat", "weChatSuccess"], sub: ["åé宿", "æç»å®æ"] }, |
| | | ]; |
| | | } |
| | | return [ |
| | | { label: "人工", fields: ["manual"], sub: ["人工"] }, |
| | | { label: "è¯é³", fields: ["voice"], sub: ["è¯é³"] }, |
| | | { label: "çä¿¡", fields: ["sms"], sub: ["çä¿¡"] }, |
| | | { label: "微信", fields: ["weChat"], sub: ["微信"] }, |
| | | ]; |
| | | }, |
| | | |
| | |
| | | "0%", // 10: æåç |
| | | "0%", // 11: é访ç |
| | | "0%", // 12: åæ¶ç |
| | | 0, // 13: manual |
| | | 0, // 14: voice |
| | | 0, // 15: sms |
| | | 0, // 16: weChat |
| | | ]; |
| | | |
| | | const methodFields = this.getMethodColumns().reduce( |
| | | (arr, g) => arr.concat(g.fields), |
| | | [] |
| | | ); |
| | | const methodStartIndex = 13; |
| | | methodFields.forEach(() => summaries.push(0)); |
| | | |
| | | this.tableData.forEach((item) => { |
| | | summaries[3] += Number(item.dischargeCount) || 0; |
| | |
| | | summaries[7] += Number(item.pendingFollowUp) || 0; |
| | | summaries[8] += Number(item.followUpSuccess) || 0; |
| | | summaries[9] += Number(item.followUpFail) || 0; |
| | | summaries[13] += Number(item.manual) || 0; |
| | | summaries[14] += Number(item.voice) || 0; |
| | | summaries[15] += Number(item.sms) || 0; |
| | | summaries[16] += Number(item.weChat) || 0; |
| | | methodFields.forEach((field, i) => { |
| | | summaries[methodStartIndex + i] += Number(item[field]) || 0; |
| | | }); |
| | | }); |
| | | |
| | | // æåçè®¡ç® |
| | |
| | | } |
| | | |
| | | // æ ¼å¼åæ°å |
| | | [3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16].forEach((index) => { |
| | | const numericIndices = [3, 4, 5, 6, 7, 8, 9].concat( |
| | | methodFields.map((_, i) => methodStartIndex + i) |
| | | ); |
| | | numericIndices.forEach((index) => { |
| | | summaries[index] = this.formatNumber(summaries[index]); |
| | | }); |
| | | |
| | |
| | | } |
| | | // åºé¢æ¶é´èå´ |
| | | if (queryParams.hospitalEndTime) { |
| | | this.patientqueryParams.hospitalstarttime = |
| | | this.patientqueryParams.hospitalStartTime = |
| | | queryParams.hospitalStartTime; |
| | | this.patientqueryParams.hospitalendtime = queryParams.hospitalEndTime; |
| | | this.patientqueryParams.hospitalEndTime = queryParams.hospitalEndTime; |
| | | } else { |
| | | this.patientqueryParams.hospitalstarttime = this.parseTime( |
| | | this.patientqueryParams.hospitalStartTime = this.parseTime( |
| | | queryParams.dateRangecy[0] |
| | | ); |
| | | this.patientqueryParams.hospitalendtime = this.parseTime( |
| | | this.patientqueryParams.hospitalEndTime = this.parseTime( |
| | | queryParams.dateRangecy[1] |
| | | ); |
| | | } |
| | |
| | | <el-table-column |
| | | label="åé宿" |
| | | align="center" |
| | | key="manualSuccess" |
| | | prop="manualSuccess" |
| | | key="manualAgain" |
| | | prop="manualAgain" |
| | | :render-header="Tooltipfswc" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'manualSuccessInfo', |
| | | 'manualAgainInfo', |
| | | 'åéå®æäººå·¥é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ scope.row.manualSuccess }}</span> |
| | | <span class="button-zx">{{ scope.row.manualAgain }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | <el-table-column |
| | | label="åé宿" |
| | | align="center" |
| | | key="voiceSuccess" |
| | | prop="voiceSuccess" |
| | | key="voiceAgain" |
| | | prop="voiceAgain" |
| | | :render-header="Tooltipfswc" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'voiceSuccessInfo', |
| | | 'voiceAgainInfo', |
| | | 'åé宿è¯é³é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ scope.row.voiceSuccess }}</span> |
| | | <span class="button-zx">{{ scope.row.voiceAgain }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | <el-table-column |
| | | label="åé宿" |
| | | align="center" |
| | | key="smsSuccess" |
| | | prop="smsSuccess" |
| | | key="smsAgain" |
| | | prop="smsAgain" |
| | | :render-header="Tooltipfswc" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'smsSuccessInfo', |
| | | 'smsAgainInfo', |
| | | 'åé宿çä¿¡é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ scope.row.smsSuccess }}</span> |
| | | <span class="button-zx">{{ scope.row.smsAgain }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | <el-table-column |
| | | label="åé宿" |
| | | align="center" |
| | | key="weChatSuccess" |
| | | prop="weChatSuccess" |
| | | key="weChatAgain" |
| | | prop="weChatAgain" |
| | | :render-header="Tooltipfswc" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | @click=" |
| | | handleViewDetails( |
| | | scope.row, |
| | | 'wechatSuccessInfo', |
| | | 'weChatAgainInfo', |
| | | 'åéå®æå¾®ä¿¡é访å表' |
| | | ) |
| | | " |
| | | > |
| | | <span class="button-zx">{{ scope.row.weChatSuccess }}</span> |
| | | <span class="button-zx">{{ scope.row.weChatAgain }}</span> |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | }, |
| | | }; |
| | | |
| | | const titleText = `忬¡${serviceTypeName}ç»è®¡è¡¨_${sheetNameSuffix}`; |
| | | // æ·»å æ é¢è¡ |
| | | worksheet.mergeCells(1, 1, 1, 16); |
| | | const titleCell = worksheet.getCell(1, 1); |
| | | titleCell.value = titleText; // 使ç¨å¨ææ é¢ |
| | | titleCell.style = titleStyle; |
| | | worksheet.getRow(1).height = 35; |
| | | // æ¯å¦ä¸ºç®æ å»é¢ï¼äººå·¥/è¯é³/çä¿¡/微信 æ åé宿/æç»å®æ å级å±ç¤ºï¼ |
| | | const graded = this.isTargetHospital; |
| | | |
| | | // 表头 |
| | | // 表头éè¦å¢å æåçå |
| | | const secondRowHeaders = [ |
| | | const baseHeaders = [ |
| | | "", |
| | | "åºé¢ç
åº", |
| | | "ç§å®¤", |
| | | "åºé¢äººæ¬¡", |
| | | "æ éé访人次", |
| | | "åºé访人次", |
| | | ]; |
| | | const coreHeaders = [ |
| | | "éé访", |
| | | "å¾
é访", |
| | | "é访æå", |
| | | "é访失败", |
| | | "æåç", // æåçåºè¯¥å¨é访失败åé¢ |
| | | "é访ç", // é访ç卿åçåé¢ |
| | | "人工", |
| | | "è¯é³", // ä¿®æ£ï¼åºè¯¥æ¯è¯é³ï¼ä¸æ¯çä¿¡ |
| | | "çä¿¡", // çä¿¡ |
| | | "微信", // 微信 |
| | | "æåç", |
| | | "é访ç", |
| | | ]; |
| | | const methodGroups = this.getMethodColumns(); |
| | | |
| | | secondRowHeaders.forEach((header, index) => { |
| | | const cell = worksheet.getCell(3, index + 1); |
| | | cell.value = header; |
| | | cell.style = headerStyle; |
| | | }); |
| | | const baseCount = baseHeaders.length; // 6 |
| | | const coreCount = coreHeaders.length; // 6 |
| | | const methodLeafCount = methodGroups.reduce( |
| | | (sum, g) => sum + g.fields.length, |
| | | 0 |
| | | ); // 8 æ 4 |
| | | const totalCols = baseCount + coreCount + methodLeafCount; // 20 æ 16 |
| | | const coreStartCol = baseCount + 1; // 7 |
| | | const methodStartCol = baseCount + coreCount + 1; // 13 |
| | | |
| | | // æ´æ°åå¹¶åå
æ ¼çèå´ |
| | | for (let i = 1; i <= 6; i++) { |
| | | worksheet.mergeCells(2, i, 3, i); |
| | | const cell = worksheet.getCell(2, i); |
| | | cell.style = headerStyle; |
| | | const titleText = `忬¡${serviceTypeName}ç»è®¡è¡¨_${sheetNameSuffix}`; |
| | | // æ·»å æ é¢è¡ |
| | | worksheet.mergeCells(1, 1, 1, totalCols); |
| | | const titleCell = worksheet.getCell(1, 1); |
| | | titleCell.value = titleText; |
| | | titleCell.style = titleStyle; |
| | | worksheet.getRow(1).height = 35; |
| | | |
| | | if (graded) { |
| | | // 表头å 3 è¡ï¼ç¬¬2/3/4è¡ï¼ï¼æ°æ®ä»ç¬¬5è¡å¼å§ |
| | | const headerEndRow = 4; |
| | | |
| | | // 第2è¡ï¼åºç¡å纵ååå¹¶ + é访åç»æ¨ªååå¹¶ |
| | | for (let i = 1; i <= baseCount; i++) { |
| | | worksheet.mergeCells(2, i, headerEndRow, i); |
| | | const cell = worksheet.getCell(2, i); |
| | | cell.value = baseHeaders[i - 1]; |
| | | cell.style = headerStyle; |
| | | } |
| | | worksheet.mergeCells(2, coreStartCol, 2, totalCols); |
| | | worksheet.getCell(2, coreStartCol).value = "忬¡åºé¢é访"; |
| | | worksheet.getCell(2, coreStartCol).style = headerStyle; |
| | | |
| | | // 第3è¡ï¼éè®¿æ ¸å¿å纵ååå¹¶ + é访æ¹å¼åç»æ¨ªååå¹¶ |
| | | for (let k = 0; k < coreCount; k++) { |
| | | const col = coreStartCol + k; |
| | | worksheet.mergeCells(3, col, headerEndRow, col); |
| | | const cell = worksheet.getCell(3, col); |
| | | cell.value = coreHeaders[k]; |
| | | cell.style = headerStyle; |
| | | } |
| | | let mc = methodStartCol; |
| | | methodGroups.forEach((g) => { |
| | | if (g.fields.length > 1) { |
| | | worksheet.mergeCells(3, mc, 3, mc + g.fields.length - 1); |
| | | } |
| | | const cell = worksheet.getCell(3, mc); |
| | | cell.value = g.label; |
| | | cell.style = headerStyle; |
| | | mc += g.fields.length; |
| | | }); |
| | | |
| | | // 第4è¡ï¼é访æ¹å¼ååï¼åé宿/æç»å®æï¼ |
| | | mc = methodStartCol; |
| | | methodGroups.forEach((g) => { |
| | | g.fields.forEach((field, idx) => { |
| | | const cell = worksheet.getCell(4, mc + idx); |
| | | cell.value = g.sub[idx]; |
| | | cell.style = headerStyle; |
| | | }); |
| | | mc += g.fields.length; |
| | | }); |
| | | |
| | | worksheet.getRow(2).height = 28; |
| | | worksheet.getRow(3).height = 24; |
| | | worksheet.getRow(4).height = 24; |
| | | } else { |
| | | // 表头å 2 è¡ï¼ç¬¬2/3è¡ï¼ï¼æ°æ®ä»ç¬¬4è¡å¼å§ |
| | | const headerEndRow = 3; |
| | | |
| | | for (let i = 1; i <= baseCount; i++) { |
| | | worksheet.mergeCells(2, i, headerEndRow, i); |
| | | const cell = worksheet.getCell(2, i); |
| | | cell.value = baseHeaders[i - 1]; |
| | | cell.style = headerStyle; |
| | | } |
| | | worksheet.mergeCells(2, coreStartCol, 2, totalCols); |
| | | worksheet.getCell(2, coreStartCol).value = "忬¡åºé¢é访"; |
| | | worksheet.getCell(2, coreStartCol).style = headerStyle; |
| | | |
| | | // 第3è¡ï¼éè®¿æ ¸å¿å + é访æ¹å¼å |
| | | for (let k = 0; k < coreCount; k++) { |
| | | const cell = worksheet.getCell(3, coreStartCol + k); |
| | | cell.value = coreHeaders[k]; |
| | | cell.style = headerStyle; |
| | | } |
| | | let mc = methodStartCol; |
| | | methodGroups.forEach((g) => { |
| | | const cell = worksheet.getCell(3, mc); |
| | | cell.value = g.label; |
| | | cell.style = headerStyle; |
| | | mc += 1; |
| | | }); |
| | | |
| | | worksheet.getRow(2).height = 28; |
| | | worksheet.getRow(3).height = 25; |
| | | } |
| | | |
| | | worksheet.getCell(2, 1).value = ""; |
| | | worksheet.getCell(2, 2).value = "åºé¢ç
åº"; |
| | | worksheet.getCell(2, 3).value = "ç§å®¤"; |
| | | worksheet.getCell(2, 4).value = "åºé¢äººæ¬¡"; |
| | | worksheet.getCell(2, 5).value = "æ éé访人次"; |
| | | worksheet.getCell(2, 6).value = "åºé访人次"; |
| | | |
| | | // 注æï¼ç±äºå¢å äºæåçåï¼åå¹¶åæ°è¦å¢å |
| | | worksheet.mergeCells(2, 7, 2, 16); // ä»7åå¹¶å°16ï¼åæ¥æ¯7-14ï¼ |
| | | worksheet.getCell(2, 7).value = "忬¡åºé¢é访"; |
| | | worksheet.getCell(2, 7).style = headerStyle; |
| | | |
| | | worksheet.getRow(2).height = 28; |
| | | worksheet.getRow(3).height = 25; |
| | | |
| | | // æ°æ®è¡ |
| | | const dataStartRow = graded ? 5 : 4; |
| | | this.tableData.forEach((item, rowIndex) => { |
| | | const dataRow = worksheet.addRow( |
| | | [ |
| | | "", |
| | | item.leavehospitaldistrictname || "", |
| | | item.deptname || "", |
| | | item.dischargeCount || 0, |
| | | item.nonFollowUp || 0, |
| | | item.followUpNeeded || 0, |
| | | item.needFollowUpAgain || 0, |
| | | item.pendingFollowUpAgain || 0, |
| | | item.followUpSuccessAgain || 0, |
| | | item.followUpFailAgain || 0, |
| | | // æåç - éè¦å¨æè®¡ç® |
| | | this.calculateSuccessRate( |
| | | item.followUpSuccessAgain, |
| | | item.needFollowUpAgain, |
| | | item.pendingFollowUpAgain |
| | | ), |
| | | item.followUpRateAgain || "0%", // é访ç |
| | | item.manualAgain || 0, |
| | | item.voiceAgain || 0, |
| | | item.smsAgain || 0, |
| | | item.weChatAgain || 0, |
| | | ], |
| | | rowIndex + 4 |
| | | ); |
| | | const rowValues = [ |
| | | "", |
| | | item.leavehospitaldistrictname || "", |
| | | item.deptname || "", |
| | | item.dischargeCount || 0, |
| | | item.nonFollowUp || 0, |
| | | item.followUpNeeded || 0, |
| | | item.needFollowUpAgain || 0, |
| | | item.pendingFollowUpAgain || 0, |
| | | item.followUpSuccessAgain || 0, |
| | | item.followUpFailAgain || 0, |
| | | // æåç - éè¦å¨æè®¡ç® |
| | | this.calculateSuccessRate( |
| | | item.followUpSuccessAgain, |
| | | item.needFollowUpAgain, |
| | | item.pendingFollowUpAgain |
| | | ), |
| | | item.followUpRateAgain || "0%", // é访ç |
| | | ]; |
| | | methodGroups.forEach((g) => { |
| | | g.fields.forEach((field) => { |
| | | rowValues.push(item[field] || 0); |
| | | }); |
| | | }); |
| | | |
| | | const dataRow = worksheet.addRow(rowValues, rowIndex + dataStartRow); |
| | | dataRow.eachCell((cell) => { |
| | | cell.style = cellStyle; |
| | | }); |
| | |
| | | summaryRow.height = 28; |
| | | |
| | | // å宽 |
| | | // ä¿®æ£å宽 |
| | | worksheet.columns = [ |
| | | { width: 8 }, |
| | | { width: 20 }, |
| | | { width: 15 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 10 }, |
| | | { width: 10 }, |
| | | { width: 10 }, |
| | | { width: 10 }, |
| | | { width: 12 }, // æåç |
| | | { width: 12 }, // é访ç |
| | | { width: 8 }, // 人工 |
| | | { width: 8 }, // è¯é³ |
| | | { width: 8 }, // çä¿¡ |
| | | { width: 8 }, // 微信 |
| | | const widths = [8, 20, 15, 12, 12, 12, 10, 10, 10, 10, 12, 12]; |
| | | methodGroups.forEach((g) => { |
| | | g.fields.forEach(() => widths.push(8)); |
| | | }); |
| | | worksheet.columns = widths.map((width) => ({ width })); |
| | | }, |
| | | getMethodColumns() { |
| | | // é访æ¹å¼åé
ç½®ï¼ç®æ å»é¢æâåé宿/æç»å®æâå级å±ç¤º |
| | | if (this.isTargetHospital) { |
| | | return [ |
| | | { label: "人工", fields: ["manualAgain", "manualAgainSuccess"], sub: ["åé宿", "æç»å®æ"] }, |
| | | { label: "è¯é³", fields: ["voiceAgain", "voiceAgainSuccess"], sub: ["åé宿", "æç»å®æ"] }, |
| | | { label: "çä¿¡", fields: ["smsAgain", "smsAgainSuccess"], sub: ["åé宿", "æç»å®æ"] }, |
| | | { label: "微信", fields: ["weChatAgain", "weChatAgainSuccess"], sub: ["åé宿", "æç»å®æ"] }, |
| | | ]; |
| | | } |
| | | return [ |
| | | { label: "人工", fields: ["manualAgain"], sub: ["人工"] }, |
| | | { label: "è¯é³", fields: ["voiceAgain"], sub: ["è¯é³"] }, |
| | | { label: "çä¿¡", fields: ["smsAgain"], sub: ["çä¿¡"] }, |
| | | { label: "微信", fields: ["weChatAgain"], sub: ["微信"] }, |
| | | ]; |
| | | }, |
| | | |
| | |
| | | 0, // 9: followUpFailAgain |
| | | "0%", // 10: æåç |
| | | "0%", // 11: é访ç |
| | | 0, // 12: manualAgain |
| | | 0, // 13: voiceAgain |
| | | 0, // 14: smsAgain |
| | | 0, // 15: weChatAgain |
| | | ]; |
| | | |
| | | const methodFields = this.getMethodColumns().reduce( |
| | | (arr, g) => arr.concat(g.fields), |
| | | [] |
| | | ); |
| | | const methodStartIndex = 12; |
| | | methodFields.forEach(() => summaries.push(0)); |
| | | |
| | | this.tableData.forEach((item) => { |
| | | summaries[3] += Number(item.dischargeCount) || 0; |
| | |
| | | summaries[7] += Number(item.pendingFollowUpAgain) || 0; |
| | | summaries[8] += Number(item.followUpSuccessAgain) || 0; |
| | | summaries[9] += Number(item.followUpFailAgain) || 0; |
| | | summaries[12] += Number(item.manualAgain) || 0; |
| | | summaries[13] += Number(item.voiceAgain) || 0; |
| | | summaries[14] += Number(item.smsAgain) || 0; |
| | | summaries[15] += Number(item.weChatAgain) || 0; |
| | | methodFields.forEach((field, i) => { |
| | | summaries[methodStartIndex + i] += Number(item[field]) || 0; |
| | | }); |
| | | }); |
| | | |
| | | // æåçè®¡ç® |
| | |
| | | } |
| | | |
| | | // æ ¼å¼åæ°å |
| | | [3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15].forEach((index) => { |
| | | const numericIndices = [3, 4, 5, 6, 7, 8, 9].concat( |
| | | methodFields.map((_, i) => methodStartIndex + i) |
| | | ); |
| | | numericIndices.forEach((index) => { |
| | | summaries[index] = this.formatNumber(summaries[index]); |
| | | }); |
| | | |
| | |
| | | // detail: https://cli.vuejs.org/config/#devserver-proxy |
| | | [process.env.VUE_APP_BASE_API]: { |
| | | // target: `https://www.health-y.cn/lssf`, |
| | | // target: `http://192.168.100.10:8096`, |
| | | target: `http://192.168.100.10:8096`, |
| | | // target: `http://192.168.100.10:8094`,//çç«åå¾· |
| | | // target: `http://192.168.100.10:8095`,//æ°å |
| | | // target: `http://192.168.100.10:8098`,//å¸ä¸ |
| | | // target:`http://localhost:8095`, |
| | | // target:`http://35z1t16164.qicp.vip`, |
| | | // target: `http://192.168.100.172:8095`, |
| | | target: `http://192.168.100.10:8089`,//åå |
| | | // target: `http://192.168.100.10:8089`,//åå |
| | | // target: `https://9.208.38.93:8092/`, |
| | | changeOrigin: true, |
| | | pathRewrite: { |