src/api/AiCentre/external.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/followvisit/again/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/followvisit/discharge/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/followvisit/discharge/outpatientService.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/followvisit/record/detailpage/MergeAndModify.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/followvisit/record/detailpage/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/followvisit/record/physical/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/followvisit/zbAgain/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/knowledge/questionnaire/compilequer/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/patient/patient/outpatient.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
vue.config.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/AiCentre/external.js
@@ -92,7 +92,7 @@ data: data }); } // æ°å¢æå¡ // 忬¡é访æå¡ export function addserviceSubtask(data) { return request({ url: "/smartor/serviceSubtask/addSubTaskAgain", @@ -100,4 +100,12 @@ data: data }); } // 忬¡é访æå¡ export function addSubtask(data) { return request({ url: "/smartor/serviceSubtask/addSubTask", method: "post", data: data }); } src/views/followvisit/again/index.vue
@@ -1197,8 +1197,9 @@ }); }, affiliation() { this.topqueryParams.drcode = store.getters.hisUserId; this.topqueryParams.nurseId = store.getters.hisUserId; this.topqueryParams.managementDoctor = store.getters.hisUserId; this.getList(1); }, onthatday() { src/views/followvisit/discharge/index.vue
@@ -1408,9 +1408,8 @@ }); }, affiliation() { this.topqueryParams.drcode = store.getters.hisUserId; this.topqueryParams.nurseId = store.getters.hisUserId; this.topqueryParams.managementDoctor = store.getters.name; this.topqueryParams.managementDoctor = store.getters.hisUserId; this.getList(1); }, onthatday() { src/views/followvisit/discharge/outpatientService.vue
@@ -1181,8 +1181,9 @@ }); }, affiliation() { this.topqueryParams.drcode = store.getters.hisUserId; this.topqueryParams.nurseId = store.getters.hisUserId; this.topqueryParams.managementDoctor = store.getters.hisUserId; this.getList(1); }, onthatday() { src/views/followvisit/record/detailpage/MergeAndModify.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,449 @@ <template> <div class="merge-questionnaire-container"> <div class="merge-header"> <h3>åå¹¶ç¼è¾é®å· (å ± {{ services.length }} 个æªå®ææå¡)</h3> <el-tag v-for="service in services" :key="service.id" type="info" style="margin-right: 10px" > {{ service.taskName }} ({{ service.sendname }}) </el-tag> </div> <div class="merge-content"> <div class="question-list"> <div v-for="(question, index) in mergedQuestions" :key="question.uniqueKey" class="question-item" > <!-- é¢ç®å±ç¤º - ä¸ç¶ç»ä»¶ä¿æä¸è´ --> <div :class=" question.isabnormal ? 'scriptTopic-isabnormal' : 'scriptTopic-dev' " > <div class="dev-text"> {{ index + 1 }}ã[{{ getQuestionType(question.scriptType) }}]<span> {{ question.scriptContent }}</span> </div> <!-- åé --> <div class="dev-xx" v-if="question.scriptType == 1"> <el-radio-group v-model="question.mergedResult" @change=" handleOptionChange( $event, index, question.svyLibTemplateTargetoptions, question ) " >11 <el-radio v-for="( option, optIndex ) in question.svyLibTemplateTargetoptions" :key="optIndex" :label="option.optioncontent" :class="option.isabnormal ? 'red-star' : ''" > {{ option.optioncontent }} </el-radio> </el-radio-group> </div> <!-- å¤é --> <div class="dev-xx" v-if="question.scriptType == 2"> <el-checkbox-group v-model="question.mergedResult" @change="updateScore($event, index, question.options, question)" > <el-checkbox v-for="(option, optIndex) in question.options" :key="optIndex" :label="option.optioncontent" :class="option.isabnormal ? 'red-star' : ''" > {{ option.optioncontent }} </el-checkbox> </el-checkbox-group> </div> <!-- 填空 --> <div class="dev-xx" v-if="question.scriptType == 4"> <el-input type="textarea" :rows="2" placeholder="请è¾å ¥çæ¡" v-model="question.mergedResult" clearable /> </div> <!-- éå è¾å ¥æ¡ --> <div v-if="question.showAppendInput" class="append-input-container"> <el-input type="textarea" :rows="2" placeholder="请è¾å ¥å ·ä½ä¿¡æ¯" v-model="question.answerps" clearable /> </div> <!-- æç¤ºä¿¡æ¯ --> <div v-show="question.prompt"> <el-alert :title="question.prompt" type="warning" /> </div> </div> </div> </div> </div> <div class="merge-footer"> <el-button @click="handleCancel">åæ¶</el-button> <el-button type="primary" @click="handleSave" :loading="isSaving" >ä¿åå°ææé®å·</el-button > </div> </div> </template> <script> import { getsearchrResults, serviceSubtaskDetailedit, serviceSubtaskDetailadd, Editsingletaskson, getTaskservelist, alterpatient, } from "@/api/AiCentre/index"; export default { props: { selectedServices: { type: Array, required: true, }, patid: { type: [String, Number], required: true, }, }, data() { return { services: [], mergedQuestions: [], // åå¹¶åçé®é¢æ°æ® isSaving: false, }; }, created() { this.loadServicesData(); }, methods: { getQuestionType(type) { const types = { 1: "åé", 2: "å¤é", 4: "é®ç" }; return types[type] || "æªç¥"; }, async loadServicesData() { this.services = this.selectedServices; const loading = this.$loading({ lock: true, text: "æ£å¨å è½½æªå®æé®å·æ°æ®...", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", }); try { // åªå è½½æªå®æçæå¡é®å·æ°æ® const requests = this.services.map((service) => getsearchrResults({ taskid: service.taskid, patid: this.patid, subId: service.id, isFinish: false, // ç¡®ä¿åªè·åæªå®æçé®å· }) ); const responses = await Promise.all(requests); // åå¹¶ææé®é¢ï¼å»é const allQuestions = []; const questionMap = {}; responses.forEach((response, index) => { if (response.code == 200 && response.data.scriptResult) { response.data.scriptResult.forEach((q) => { const key = `${q.scriptContent}_${q.scriptType}`; if (!questionMap[key]) { questionMap[key] = { ...q, uniqueKey: key, mergedResult: q.scriptType == 2 ? [] : null, originalServices: [], // è®°å½åå§æå¡ID }; allQuestions.push(questionMap[key]); } questionMap[key].originalServices.push(this.services[index].id); }); } }); // åå§ååå¹¶ç»æ this.mergedQuestions = allQuestions.map((q) => ({ ...q, mergedResult: q.scriptType == 2 ? [] : q.scriptResult || null, })); console.log(this.mergedQuestions); } catch (error) { this.$message.error("å è½½é®å·æ°æ®å¤±è´¥: " + error.message); } finally { loading.close(); } }, // å¤çé项åå (ä¸ç¶ç»ä»¶ä¿æä¸è´) handleOptionChange(selectedOption, questionIndex, options, question) { const selectedOptionObj = options.find( (item) => item.optioncontent == selectedOption ); // 设置å¼å¸¸ç¶æ question.isabnormal = !!selectedOptionObj?.isabnormal; // å¤çéå è¾å ¥æ¡æ¾ç¤º question.showAppendInput = selectedOptionObj?.appendflag == 1; if (!question.showAppendInput) { question.answerps = ""; } this.$forceUpdate(); }, // æ´æ°å¤éåæ° (ä¸ç¶ç»ä»¶ä¿æä¸è´) updateScore(selectedValues, questionIndex, options, question) { const abnormalOptions = options.filter((opt) => opt.isabnormal); question.isabnormal = abnormalOptions.some((opt) => selectedValues.includes(opt.optioncontent) ); this.$forceUpdate(); }, handleCancel() { this.$emit("cancel"); }, async handleSave() { this.isSaving = true; try { const saveResults = []; const updateServicePromises = []; // 1. ä¿åææé®å·é®é¢ for (const service of this.services) { const serviceId = service.id; const questionsToSave = this.mergedQuestions .filter((q) => q.originalServices.includes(serviceId)) .map((question) => ({ scriptid: question.id, scriptResultId: question.scriptResultId, scriptType: question.scriptType, questiontext: question.scriptContent, asrtext: question.scriptType == 2 ? question.mergedResult.join("&") : question.mergedResult, answerps: question.answerps || null, isabnormal: question.isabnormal || false, })); // ä¿åé®é¢æ°æ® for (const question of questionsToSave) { const saveData = { taskid: service.taskid, patid: this.patid, subId: serviceId, ...question, }; if (saveData.isabnormal) { saveData.excep = 1; } try { const response = question.scriptResultId ? await serviceSubtaskDetailedit(saveData) : await serviceSubtaskDetailadd(saveData); saveResults.push({ serviceId, success: response.code === 200, message: response.message || (response.code === 200 ? "ä¿åæå" : "ä¿å失败"), }); } catch (error) { saveResults.push({ serviceId, success: false, message: error.message || "ä¿å失败", }); } } // 2. æ´æ°æå¡ç¶æä¸ºå·²å®æ (sendstate = 6) updateServicePromises.push(this.updateServiceStatus(serviceId)); } // çå¾ æææå¡ç¶ææ´æ°å®æ const updateResults = await Promise.all(updateServicePromises); updateResults.forEach((result) => { if (!result.success) { saveResults.push({ serviceId: result.serviceId, success: false, message: result.message || "æå¡ç¶ææ´æ°å¤±è´¥", }); } }); // ç»è®¡ç»æ const successCount = saveResults.filter((r) => r.success).length; const totalCount = saveResults.length; // éç¥ç¶ç»ä»¶ this.$emit("save", { successCount, totalCount, results: saveResults, }); if (successCount === totalCount) { this.$message.success("ææé®å·åæå¡ç¶ææ´æ°æå"); } else { this.$message.warning( `æåä¿å ${successCount} 项ï¼å¤±è´¥ ${totalCount - successCount} 项` ); } } catch (error) { this.$message.error("ä¿åè¿ç¨ä¸åçé误: " + error.message); } finally { this.isSaving = false; } }, // æ°å¢æ¹æ³ï¼æ´æ°æå¡ç¶æ async updateServiceStatus(serviceId) { try { // è·åæå¡å½åæ°æ® const res = await getTaskservelist({ patid: this.patid, subId: serviceId, }); if (res.code === 200) { const serviceData = res.rows[0].serviceSubtaskList.find( (item) => item.id === serviceId ); if (serviceData) { // æ´æ°æå¡ç¶æä¸ºå·²å®æ (sendstate = 6) const updateRes = await Editsingletaskson({ ...serviceData, sendstate: 6, // è®¾ç½®ä¸ºå·²å®æç¶æ remark: "éè¿åå¹¶ç¼è¾å®æ", // å¯éï¼æ·»å 夿³¨ }); return { serviceId, success: updateRes.code === 200, message: updateRes.message || "æå¡ç¶ææ´æ°æå", }; } } return { serviceId, success: false, message: "è·åæå¡æ°æ®å¤±è´¥", }; } catch (error) { return { serviceId, success: false, message: error.message || "æ´æ°æå¡ç¶æå¤±è´¥", }; } }, }, }; </script> <style scoped> .merge-questionnaire-container { display: flex; flex-direction: column; height: 100%; padding: 20px; } .merge-header { margin-bottom: 20px; } .merge-content { flex: 1; overflow-y: auto; } .question-list { padding: 10px; } /* ä¸ç¶ç»ä»¶ä¸è´çé¢ç®æ ·å¼ */ .scriptTopic-dev { margin-bottom: 20px; padding: 15px; border: 1px solid #ebeef5; border-radius: 4px; } .scriptTopic-isabnormal { margin-bottom: 20px; padding: 15px; border: 1px solid #f56c6c; border-radius: 4px; background-color: #fff6f6; } .dev-text { font-size: 16px; margin-bottom: 15px; color: #333; } .dev-xx { margin-left: 20px; } .append-input-container { margin-top: 15px; } .red-star { color: #f56c6c; } .merge-footer { margin-top: 20px; text-align: right; padding-top: 15px; border-top: 1px solid #ebeef5; } </style> src/views/followvisit/record/detailpage/index.vue
@@ -27,6 +27,23 @@ åå¾CDSSæ¥è¯¢ </el-link> </div> <div class="merge-controls" v-if="Whetherall"> <el-button type="primary" @click="toggleMergeMode" :disabled="selectedServices.length < 2" > {{ isMergeMode ? "åæ¶åå¹¶" : "åå¹¶ç¼è¾é®å·" }} </el-button> <el-button v-if="isMergeMode" type="success" @click="openMergeDialog" :disabled="selectedServices.length < 2" > å¼å§åå¹¶ (å·²é {{ selectedServices.length }} 个æå¡) </el-button> </div> </div> <!-- <el-button type="success">é访åçä¿¡</el-button> --> </div> @@ -36,7 +53,14 @@ :data="logsheetlist" :row-class-name="tableRowClassName" style="width: 100%" @selection-change="handleSelectionChange" > <el-table-column type="selection" width="55" :selectable="checkSelectable" v-if="Whetherall" ></el-table-column> <el-table-column prop="sendname" align="center" @@ -213,118 +237,427 @@ </el-table> </div> </div> <div class="Followuserinfos"> <div> <el-form ref="userform" :model="form" :rules="userrules" label-width="120px" > <!-- æ·»å åå¹¶ç¼è¾å¯¹è¯æ¡ --> <el-dialog title="åå¹¶ç¼è¾é®å·" :visible.sync="mergeDialogVisible" width="80%" top="5vh" v-dialogDrag > <MergeAndModify v-if="mergeDialogVisible" :selected-services="selectedServices" :patid="patid" @save="handleMergeSave" @cancel="mergeDialogVisible = false" /> </el-dialog> <div class="action-container"> <div class="call-action"> <div class="call-container"> <!-- <div class="call-header"> <h2>ä¸é®å¼å«åè½</h2> </div> --> <div class="headline"> <div>人工å¤ç</div> <el-row :gutter="20"> <el-col :span="8" ><el-form-item label="èç³»çµè¯"> <el-input placeholder="èç³»çµè¯ç¼ºå¤±" v-model="userform.telcode" > <el-button slot="append" icon="el-icon-phone" @click="handleCall(userform.telcode, 'tel')" :disabled="!isValidPhone(userform.telcode)" ></el-button ></el-input> </el-form-item ></el-col> <el-col :span="8" ><el-form-item label="è系人çµè¯"> <el-input placeholder="è系人çµè¯ç¼ºå¤±" v-model="userform.relativetelcode" > <el-button slot="append" icon="el-icon-phone" @click="handleCall(userform.relativetelcode, 'relative')" :disabled="!isValidPhone(userform.relativetelcode)" ></el-button ></el-input> </el-form-item ></el-col> <el-col :span="8" ><el-form-item label="èç³»äººå ³ç³»"> <el-input placeholder="èç³»äººå ³ç³»ç¼ºå¤±" v-model="userform.relation" ></el-input> </el-form-item ></el-col> </el-row> <div style="margin-left: 30px"> <el-button type="primary" plain @click="Editsingletasksonyic('')" >ä¿åæå¡</el-button > </div> <div>é访å 容</div> </div> <el-row :gutter="20" v-if="callStatus !== 'idle'"> <el-col :span="24"> <el-alert :title="callStatusText" :type="callStatusType" :closable="false" show-icon /> </el-col> </el-row> <div> <el-tabs v-model="activeName" type="border-card"> <el-tab-pane name="wj"> <span class="mulsz" slot="label" ><i class="el-icon-notebook-1"></i> é®å·éè®¿ç»æ</span > <div class="CONTENT"> <div class="title">{{ taskname ? taskname : "é®å·" }}</div> <!-- æææé®ï¼ä» å¨éè¯ä¸æ¾ç¤ºï¼ --> <el-row :gutter="20" v-if="callStatus === 'connected'"> <el-col :span="24" style="text-align: center; margin-top: 10px"> <el-button type="danger" icon="el-icon-phone" @click="endCurrentCall" :loading="isEndingCall" > ææçµè¯ </el-button> </el-col> </el-row> <el-form-item label="é访记å½"> <el-input type="textarea" v-model="form.remark"></el-input> </el-form-item> <div class="preview-left" v-if="!Voicetype"> <div class="topic-dev" v-for="(item, index) in tableDatatop" :key="item.id" > <!-- åé --> <div :class=" item.isabnormal ? 'scriptTopic-isabnormal' : 'scriptTopic-dev' " :key="index" v-if="item.scriptType == 1 && !item.astrict" > <div class="dev-text"> {{ index + 1 }}ã[åé]<span>{{ item.scriptContent }}</span> </div> <div class="dev-xx"> <el-radio-group v-model="item.scriptResult" @change=" handleOptionChange( $event, index, item.svyLibTemplateTargetoptions, item ) " > <el-radio v-for="( items, indexs ) in item.svyLibTemplateTargetoptions" :class="items.isabnormal ? 'red-star' : ''" :key="indexs" :label="items.optioncontent" >{{ items.optioncontent }}</el-radio > </el-radio-group> </div> <div v-if="item.showAppendInput||item.answerps" class="append-input-container" > <el-input type="textarea" :rows="2" placeholder="请è¾å ¥å ·ä½ä¿¡æ¯" v-model="item.answerps" clearable ></el-input> </div> <div v-show="item.prompt"> <el-alert :title="item.prompt" type="warning"> </el-alert> </div> </div> <!-- å¤é --> <div :class=" item.isabnormal ? 'scriptTopic-isabnormal' : 'scriptTopic-dev' " :key="index" v-if="item.scriptType == 2 && !item.astrict" > <div class="dev-text"> {{ index + 1 }}ã[å¤é]<span>{{ item.scriptContent }}</span> </div> <div class="dev-xx"> <el-checkbox-group v-model="item.scriptResult" @change="updateScore($event, index, item)" > <el-checkbox :class="items.isabnormal ? 'red-star' : ''" @change="$forceUpdate()" v-for="( items, indexs ) in item.svyLibTemplateTargetoptions" :key="indexs" :label="items.optioncontent" > {{ items.optioncontent }} </el-checkbox> </el-checkbox-group> </div> <div v-show="item.prompt && item.scriptResult[0]"> <el-alert :title="item.prompt" type="warning"> </el-alert> </div> </div> <!-- 填空 --> <div class="scriptTopic-dev" :key="index" v-if="item.scriptType == 4 && !item.astrict" > <div class="dev-text"> {{ index + 1 }}ã[é®ç]<span>{{ item.scriptContent }}</span> </div> <div class="dev-xx"> <el-input type="textarea" :rows="2" placeholder="请è¾å ¥çæ¡" v-model="item.scriptResult" clearable > </el-input> </div> </div> </div> </div> <el-form-item label="å¤çæè§"> <div> <el-button plain type="warning" @click="Editsingletaskson('1')" >æä¸å¤ç</el-button > <el-button plain type="success" @click="Editsingletaskson('2')" >ç æ 稳å®</el-button > <el-button plain type="primary" @click="Editsingletaskson('3')" >éç¥å°±è¯</el-button > <!-- <el-button type="danger" @click="Editsingletaskson('4')" >失访</el-button > --> <el-button plain type="info" @click="Editsingletaskson('5')" >ä¸å¿é访</el-button > <el-button type="primary" round v-if="this.form.isVisitAgain != 2" @click="sendAgain()" >忬¡é访</el-button > </div> </el-form-item> </el-form> <el-collapse> <el-collapse-item title="æ¥çå½åæ£è ä¿¡æ¯" name="1"> <div class="preview-left" v-else> <div class="topic-dev" v-for="(item, index) in tableDatatop" :key="item.id" > <div v-if="item.targetvalue"> <div class="dev-text"> {{ index + 1 }}ã[åé]<span>{{ item.questiontext }}</span> </div> <div class="dev-xx"> <el-radio-group v-model="item.matchedtext" @change=" handleOptionChange( $event, index, item.ivrTaskScriptTargetoptionList, item ) " > <el-radio v-for="(items, index) in item.scriptResult" :key="items" :label="items" >{{ items }}</el-radio > </el-radio-group> </div> <div v-show="item.prompt"> <el-alert :title="item.prompt" type="warning"> </el-alert> </div> </div> <div class="scriptTopic-dev" :key="index" v-else> <div class="dev-text"> {{ index + 1 }}ã[é®ç]<span>{{ item.questiontext }}</span> </div> <div class="dev-xx"> <el-input type="textarea" :rows="2" placeholder="请è¾å ¥çæ¡" v-model="item.matchedtext" clearable > </el-input> </div> </div> </div> </div> <el-button v-if="Voicetype" type="primary" @click="yuyingetdetail" >ä¿åæå¡è¯¦æ </el-button > <el-button v-else type="primary" @click="getdetail" >ä¿åæå¡è¯¦æ </el-button > </div> </el-tab-pane> <el-tab-pane name="yy"> <span class="mulsz" slot="label" ><i class="el-icon-headset"></i> è¯é³é访详æ </span > <div class="borderdiv"> <div class="title">{{ taskname ? taskname : "é®å·" }}</div> <div style=" display: flex; text-align: center; align-items: center; color: #59a0f0; " > 宿´è¯é³ï¼ <mini-audio :audio-source=" voice ? voice : '@assets/order/example.mp3' " ></mini-audio> </div> <div class="preview-left"> <div v-for="item in voiceDatatop"> <div class="leftside"> <i class="el-icon-phone-outline"></i ><span>{{ item.questiontext }}</span> </div> <div class="offside"> <i class="el-icon-user"></i> <div class="offside-value"> <el-input type="textarea" :autosize="{ minRows: 1 }" v-model="item.asrtext" ></el-input> <div> <mini-audio :audio-source=" item.questionvoice ? item.questionvoice : '@assets/order/example.mp3' " ></mini-audio> </div> </div> </div> </div> </div> <el-button v-if="Voicetype" type="primary" @click="yuyingetdetail" >ä¿åé访详æ </el-button > <el-button v-else type="primary" @click="getdetail" >ä¿åé访详æ </el-button > </div> </el-tab-pane> </el-tabs> </div> </div> </div> <div class="manual-action"> <div class="Followuserinfos"> <div> <el-form ref="userform" :model="form" :rules="userrules" label-width="120px" > <div class="headline"> <div>人工å¤ç</div> <div style="margin: 0 30px"> <el-button type="primary" plain @click="Editsingletasksonyic('')" >ä¿ååºç¡ä¿¡æ¯</el-button > </div> <div> <el-button type="primary" round v-if="this.form.isVisitAgain != 2" @click="sendAgain()" >忬¡é访</el-button > </div> </div> <el-row> <el-col :span="14" ><el-form-item label="èç³»çµè¯"> <el-input placeholder="èç³»çµè¯ç¼ºå¤±" v-model="userform.telcode" > <el-button slot="append" icon="el-icon-phone" @click="handleCall(userform.telcode, 'tel')" :disabled="!isValidPhone(userform.telcode)" ></el-button ></el-input> </el-form-item ></el-col> </el-row> <el-row> <el-col :span="14" ><el-form-item label="è系人çµè¯"> <el-input placeholder="è系人çµè¯ç¼ºå¤±" v-model="userform.relativetelcode" > <el-button slot="append" icon="el-icon-phone" @click=" handleCall(userform.relativetelcode, 'relative') " :disabled="!isValidPhone(userform.relativetelcode)" ></el-button ></el-input> </el-form-item ></el-col> <el-col :span="10" ><el-form-item label="èç³»äººå ³ç³»"> <el-input placeholder="èç³»äººå ³ç³»ç¼ºå¤±" v-model="userform.relation" ></el-input> </el-form-item ></el-col> </el-row> <div class="call-controls"> <CallButton ref="callButton" :phoneNumber="currentPhoneNumber" style="display: none" /> <div v-if="callStatus === 'connected'" class="hangup-btn"> <el-button type="danger" icon="el-icon-phone" @click="endCurrentCall" :loading="isEndingCall" > ææçµè¯ </el-button> </div> <div class="call-status" v-if="callStatus !== 'idle'"> <el-alert :title="callStatusText" :type="callStatusType" :closable="false" show-icon /> </div> </div> <el-form-item label="é访记å½"> <el-input type="textarea" v-model="form.remark"></el-input> </el-form-item> <el-form-item label="å¤çæè§"> <div> <el-button plain type="warning" @click="Editsingletaskson('1')" >æä¸å¤ç</el-button > <el-button plain type="success" @click="Editsingletaskson('2')" >ç æ 稳å®</el-button > <el-button plain type="primary" @click="Editsingletaskson('3')" >éç¥å°±è¯</el-button > <el-button plain type="info" @click="Editsingletaskson('5')" >ä¸å¿é访</el-button > </div> </el-form-item> </el-form> <div class="detailed"> <h3>æ£è æ¡£æ¡ä¿¡æ¯</h3> <el-form ref="userform" :model="userform" label-width="100px"> <el-row :gutter="20"> <el-col :span="12"> @@ -374,261 +707,13 @@ /> </el-form-item ></el-col> </el-row> <!-- <el-row :gutter="20"> <el-col :span="24"> <el-form-item label="æ ç¾" prop="desc"> <div class="xinz-inf"> <el-tag :key="tag.tagname" type="success" v-for="tag in dynamicTags" :disable-transitions="false" > {{ tag.tagname }} </el-tag> </div> </el-form-item> </el-col> </el-row> --> </el-form> </div> </el-collapse-item> </el-collapse> </div> </div> </div> </div> <div> <h2>é访å 容</h2> <CallButton ref="callButton" :phoneNumber="currentPhoneNumber" style="display: none" /> </div> <div> <el-tabs v-model="activeName" type="border-card"> <el-tab-pane name="wj"> <span class="mulsz" slot="label" ><i class="el-icon-notebook-1"></i> é®å·éè®¿ç»æ</span > <div class="CONTENT"> <div class="title">{{ taskname ? taskname : "é®å·" }}</div> <div class="preview-left" v-if="!Voicetype"> <div class="topic-dev" v-for="(item, index) in tableDatatop" :key="item.id" > <!-- åé --> <div :class=" item.isabnormal ? 'scriptTopic-isabnormal' : 'scriptTopic-dev' " :key="index" v-if="item.scriptType == 1 && !item.astrict" > <div class="dev-text"> {{ index + 1 }}ã[åé]<span>{{ item.scriptContent }}</span> </div> <div class="dev-xx"> <el-radio-group v-model="item.scriptResult" @change=" handleOptionChange( $event, index, item.svyLibTemplateTargetoptions ) " > <el-radio v-for="( items, indexs ) in item.svyLibTemplateTargetoptions" :class="items.isabnormal ? 'red-star' : ''" :key="indexs" :label="items.optioncontent" >{{ items.optioncontent }}</el-radio > </el-radio-group> </div> <div v-show="item.prompt"> <el-alert :title="item.prompt" type="warning"> </el-alert> </div> </div> <!-- å¤é --> <div :class=" item.isabnormal ? 'scriptTopic-isabnormal' : 'scriptTopic-dev' " :key="index" v-if="item.scriptType == 2 && !item.astrict" > <div class="dev-text"> {{ index + 1 }}ã[å¤é]<span>{{ item.scriptContent }}</span> </div> <div class="dev-xx"> <el-checkbox-group v-model="item.scriptResult" @change="updateScore($event, index, item)" > <el-checkbox :class="items.isabnormal ? 'red-star' : ''" @change="$forceUpdate()" v-for="( items, indexs ) in item.svyLibTemplateTargetoptions" :key="indexs" :label="items.optioncontent" > {{ items.optioncontent }} </el-checkbox> </el-checkbox-group> </div> <div v-show="item.prompt && item.scriptResult[0]"> <el-alert :title="item.prompt" type="warning"> </el-alert> </div> </div> <!-- 填空 --> <div class="scriptTopic-dev" :key="index" v-if="item.scriptType == 4 && !item.astrict" > <div class="dev-text"> {{ index + 1 }}ã[é®ç]<span>{{ item.scriptContent }}</span> </div> <div class="dev-xx"> <el-input type="textarea" :rows="2" placeholder="请è¾å ¥çæ¡" v-model="item.scriptResult" clearable > </el-input> </div> </div> </div> </div> <div class="preview-left" v-else> <div class="topic-dev" v-for="(item, index) in tableDatatop" :key="item.id" > <div v-if="item.targetvalue"> <div class="dev-text"> {{ index + 1 }}ã[åé]<span>{{ item.questiontext }}</span> </div> <div class="dev-xx"> <el-radio-group v-model="item.matchedtext" @change="handleOptionChange($event, index, item)" > <el-radio v-for="(items, index) in item.scriptResult" :key="items" :label="items" >{{ items }}</el-radio > </el-radio-group> </div> <div v-show="item.prompt"> <el-alert :title="item.prompt" type="warning"> </el-alert> </div> </div> <div class="scriptTopic-dev" :key="index" v-else> <div class="dev-text"> {{ index + 1 }}ã[é®ç]<span>{{ item.questiontext }}</span> </div> <div class="dev-xx"> <el-input type="textarea" :rows="2" placeholder="请è¾å ¥çæ¡" v-model="item.matchedtext" clearable > </el-input> </div> </div> </div> </div> <el-button v-if="Voicetype" type="primary" @click="yuyingetdetail" >ä¿åæå¡è¯¦æ </el-button > <el-button v-else type="primary" @click="getdetail" >ä¿åæå¡è¯¦æ </el-button > </div> </el-tab-pane> <el-tab-pane name="yy"> <span class="mulsz" slot="label" ><i class="el-icon-headset"></i> è¯é³é访详æ </span > <div class="borderdiv"> <div class="title">{{ taskname ? taskname : "é®å·" }}</div> <div style=" display: flex; text-align: center; align-items: center; color: #59a0f0; " > 宿´è¯é³ï¼ <mini-audio :audio-source=" voice ? voice : '@assets/order/example.mp3' " ></mini-audio> </div> <div class="preview-left"> <div v-for="item in voiceDatatop"> <div class="leftside"> <i class="el-icon-phone-outline"></i ><span>{{ item.questiontext }}</span> </div> <div class="offside"> <i class="el-icon-user"></i> <div class="offside-value"> <el-input type="textarea" :autosize="{ minRows: 1 }" v-model="item.asrtext" ></el-input> <div> <mini-audio :audio-source=" item.questionvoice ? item.questionvoice : '@assets/order/example.mp3' " ></mini-audio> </div> </div> </div> </div> </div> <el-button v-if="Voicetype" type="primary" @click="yuyingetdetail" >ä¿åé访详æ </el-button > <el-button v-else type="primary" @click="getdetail" >ä¿åé访详æ </el-button > </div> </el-tab-pane> </el-tabs> </div> <el-dialog title="æ£è 忬¡é访" v-dialogDrags @@ -797,9 +882,11 @@ listcontactinformation, } from "@/api/patient/homepage"; import CallButton from "@/components/CallButton"; import MergeAndModify from "./MergeAndModify.vue"; export default { components: { CallButton, MergeAndModify, }, dicts: ["sys_normal_disable", "sys_user_sex", "sys_yujing", "sys_suggest"], @@ -836,6 +923,9 @@ tableDatatop: [], //é¢ç®è¡¨ voiceDatatop: [], //é¢ç®è¡¨ dynamicTags: [], isMergeMode: false, mergeDialogVisible: false, selectedServices: [], // éä¸çæå¡å表 zcrules: { resource: [ { required: true, message: "è¯·éæ©é访æ¹å¼", trigger: "change" }, @@ -1194,6 +1284,7 @@ scriptid: item.id, excep: excep, questiontext: item.scriptContent, answerps: item.answerps || null, // æ·»å éå ä¿¡æ¯ }; if (item.scriptType == 2 && item.scriptResult[0]) { obj.asrtext = item.scriptResult.join("&"); @@ -1240,7 +1331,7 @@ }) .catch(() => { if (this.form.serviceType == 13) { if (this.visitCount!=1) { if (this.visitCount != 1) { this.$router.push({ path: "/logisticsservice/zbAgain", }); @@ -1250,7 +1341,7 @@ }); } } else if (this.form.serviceType == 2) { if (this.visitCount!=1) { if (this.visitCount != 1) { this.$router.push({ path: "/logisticsservice/again", }); @@ -1267,6 +1358,7 @@ console.error("åçé误ï¼", error); }); }, // çµè¯============================ // éªè¯çµè¯å·ç æ ¼å¼å¹¶è¿åéè¯¯ä¿¡æ¯ validatePhoneNumber(phone) { if (!phone) { @@ -1298,7 +1390,6 @@ }; } }, // 使ç¨ç¤ºä¾ isValidPhone(phone) { return this.validatePhoneNumber(phone).isValid; @@ -1322,7 +1413,6 @@ }); }); }, // å¤çéè¯ç¶æåå handleCallStatusChange(status) { console.log(status, "status"); @@ -1344,7 +1434,6 @@ this.$message.error(`å¼å«å¤±è´¥: ${status.text}`); } }, // ç»æå½åéè¯ endCurrentCall() { if (!this.currentCall) return; @@ -1550,7 +1639,7 @@ }) .catch(() => {}); }, handleOptionChange(a, b, c) { aahandleOptionChange(a, b, c) { const result = c.find((item) => item.optioncontent == a); if (result.nextQuestion == 0) { this.tableDatatop = this.tableDatatop.reduce((acc, item, i) => { @@ -1577,6 +1666,98 @@ } else { this.tableDatatop[b].isabnormal = false; } this.$forceUpdate(); }, // å¨methodsé¨åï¼ä¿®æ¹handleOptionChangeæ¹æ³: handleOptionChange(selectedOption, questionIndex, options, a) { if (document.activeElement) { document.activeElement.blur(); } // æ¾å°è¢«éä¸çé项对象 const selectedOptionObj = options.find( (item) => item.optioncontent == selectedOption ); // å¤çå¼å¸¸ç¶æé«äº® this.tableDatatop[questionIndex].isabnormal = !!selectedOptionObj.isabnormal; // å¤çéå è¾å ¥æ¡æ¾ç¤º this.tableDatatop[questionIndex].showAppendInput = selectedOptionObj.appendflag == 1; console.log(this.tableDatatop); // if (!this.tableDatatop[questionIndex].showAppendInput) { // this.tableDatatop[questionIndex].answerps = ""; // æ¸ é¤éå ä¿¡æ¯ // } // ä¿åå½åé¢ç®ä¹åå·²ç»éèçé¢ç®ç¶æ const previouslyHiddenBeforeCurrent = this.tableDatatop .slice(0, questionIndex) .map((item, index) => (item.astrict ? index : -1)) .filter((index) => index !== -1); // ä¿åä¹åå nextQuestion=0èéèçé¢ç®èå´ const previouslyHiddenByEnd = this.tableDatatop .map((item, index) => (item.hiddenByEnd ? index : -1)) .filter((index) => index !== -1); // 妿branchFlag为1ï¼å¤çé¢ç®è·³è½¬ if (a.branchFlag == 1) { if (selectedOptionObj.nextQuestion == 0) { // ç»æé®ç - éèå颿æé¢ç®å¹¶æ è®° this.tableDatatop = this.tableDatatop.map((item, index) => ({ ...item, astrict: index > questionIndex, hiddenByEnd: index > questionIndex, // æ è®°è¿äºé¢ç®æ¯è¢«ç»æé®çéèç })); } else { // æ£å¸¸è·³è½¬é»è¾ const nextQuestionIndex = selectedOptionObj.nextQuestion - 1; this.tableDatatop = this.tableDatatop.map((item, index) => { // ä¿çå½åé¢ç®ä¹åçéèç¶æ if (index < questionIndex) { return { ...item, astrict: previouslyHiddenBeforeCurrent.includes(index), hiddenByEnd: false, // æ¸ é¤ç»ææ è®° }; } // å½åé¢ç®æ»æ¯å¯è§ if (index === questionIndex) { return { ...item, astrict: 0, hiddenByEnd: false }; } // æ¾ç¤ºç®æ ä¸ä¸é¢ if (index === nextQuestionIndex) { return { ...item, astrict: 0, hiddenByEnd: false }; } // 妿æ¯ä¹åè¢«ç»æé®çéèçé¢ç®ï¼ç°å¨åºè¯¥æ¢å¤æ¾ç¤º if (item.hiddenByEnd) { return { ...item, astrict: 0, hiddenByEnd: false }; } // éèå½åé¢åç®æ é¢ä¹é´çé¢ç® if (index > questionIndex && index < nextQuestionIndex) { return { ...item, astrict: 1, hiddenByEnd: false }; } // å ¶ä»æ åµä¿æåç¶ return item; }); } } else { // å¦ææ²¡æè·³è½¬ï¼åªéç¡®ä¿ä¸ä¸é¢å¯è§ this.tableDatatop = this.tableDatatop.map((item, index) => ({ ...item, astrict: index === questionIndex + 1 ? 0 : item.astrict, hiddenByEnd: index === questionIndex + 1 ? false : item.hiddenByEnd, })); } this.$forceUpdate(); }, overdata() { @@ -1656,69 +1837,205 @@ return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; }, updateScore(a, b, c) {}, // åå¹¶ä¿®æ¹ç¸å ³============================= toggleMergeMode() { this.isMergeMode = !this.isMergeMode; if (!this.isMergeMode) { this.selectedServices = []; } }, handleSelectionChange(selection) { this.selectedServices = selection .filter( (item) => !item.preachformson || !item.preachformson.includes("3") ) .map((item) => ({ id: item.id, taskid: item.taskid, taskName: item.taskName, sendname: item.sendname, })); }, checkSelectable(row, index) { // å½ sendstate 为 6 æ¶ä¸å¯é return row.sendstate !== 6; }, openMergeDialog() { if (this.selectedServices.length < 2) { this.$message.warning("请è³å°éæ©2个é®å·æå¡è¿è¡åå¹¶"); return; } this.mergeDialogVisible = true; }, handleMergeSave(mergedData) { // å¤çåå¹¶ä¿åé»è¾ this.mergeDialogVisible = false; this.isMergeMode = false; this.selectedServices = []; // æ¾ç¤ºä¿åç»æ if (mergedData.successCount == mergedData.totalCount) { this.$message.success(`æåä¿å ${mergedData.successCount} 个é®å·`); } else if (mergedData.successCount > 0) { this.$message.warning( `æåä¿å ${mergedData.successCount} 个é®å·ï¼å¤±è´¥ ${ mergedData.totalCount - mergedData.successCount } 个` ); } else { this.$message.error("ææé®å·ä¿å失败"); } // å·æ°æ°æ® this.getTaskservelist(); }, }, }; </script> <style lang="scss"> <style lang="scss" scoped> .Followupdetailspage { margin: 10px; display: flex; flex-direction: column; gap: 20px; } .action-container { display: flex; gap: 20px; margin: 0 10px 20px 10px; .manual-action { flex: 1; min-width: 0; height: 100%; /* ç¡®ä¿é«åº¦ç»§æ¿ */ } .call-action { width: 60%; min-width: 0; height: 100%; /* ç¡®ä¿é«åº¦ç»§æ¿ */ } } .call-container { padding: 20px; background: #fff; border: 1px solid #dcdfe6; box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 0 6px 0 rgba(0, 0, 0, 0.04); border-radius: 4px; height: 100%; .call-header { margin-bottom: 20px; h2 { font-size: 20px; color: #333; margin: 0; padding-bottom: 10px; border-bottom: 1px solid #eee; } } .call-status { margin-bottom: 20px; } .hangup-btn { text-align: center; margin-top: 20px; } } .merge-controls { background: #f5f7fa; border-radius: 4px; margin-left: 20px; } .Followuserinfo { margin: 20px 10px; margin: 10px 10px 0 10px; align-items: center; 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); box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 0 6px 0 rgba(0, 0, 0, 0.04); .userinfo-text { font-size: 20px; margin-right: 20px; margin-bottom: 10px; } .userinfo-value { color: rgb(15, 139, 211); span { margin-right: 20px; } } } ::v-deep.el-table .warning-row { background: #c4e2ee; } .Followuserinfos { margin: 20px 10px; align-items: center; 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); box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 0 6px 0 rgba(0, 0, 0, 0.04); height: 100%; /* ç¡®ä¿é«åº¦ç»§æ¿ */ min-height: 880px; /* æå°é«åº¦ä¸é访å 容ä¸è´ */ display: flex; flex-direction: column; .userinfo-text { font-size: 20px; margin-right: 20px; margin-bottom: 10px; } .userinfo-value { color: rgb(15, 139, 211); span { margin-right: 20px; } } .el-form { flex: 1; overflow-y: auto; /* å å®¹è¶ è¿é«åº¦æ¶æ¾ç¤ºæ»å¨æ¡ */ max-height: calc(880px - 60px); /* åå»padding */ padding-right: 10px; /* 鲿¢æ»å¨æ¡é®æ¡å 容 */ } } .append-input-container { margin-top: 15px; padding: 10px; background-color: #f5f7fa; border-radius: 4px; border: 1px solid #dcdfe6; } .borderdiv { min-height: 60vh; font-size: 20px; padding: 30px; .title { font-size: 22px; font-weight: bold; margin-bottom: 20px; text-align: center; } .leftside { margin: 30px 0; span { width: 400px; margin-left: 20px; @@ -1728,9 +2045,11 @@ border-radius: 10px; } } .offside { display: flex; flex-direction: row-reverse; .offside-value { padding: 10px; background: rgb(217, 173, 253); @@ -1740,8 +2059,15 @@ } } } .topic-dev[inert] { opacity: 0.5; pointer-events: none; } .CONTENT { padding: 10px; height: 100%; min-height: 660px; /* 设置æå°é«åº¦ */ .title { font-size: 22px; font-weight: bold; @@ -1749,40 +2075,47 @@ text-align: center; } } .preview-left { margin: 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); box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 0 6px 0 rgba(0, 0, 0, 0.04); max-height: 580px; /* 设置æå¤§é«åº¦ */ overflow-y: auto; /* å å®¹è¶ è¿é«åº¦æ¶æ¾ç¤ºæ»å¨æ¡ */ .topic-dev { margin-bottom: 25px; font-size: 20px !important; .dev-text { margin-bottom: 10px; } } } .scriptTopic-isabnormal { color: red; } .detailed { width: 88%; border-radius: 8px; padding: 30px; margin-bottom: 30px; background-color: #ddf0f8; .bg-purple { margin-bottom: 20px; } .spanvalue { display: inline-block; min-width: 200px; border-bottom: 1px solid rgb(172, 172, 172); } } .headline { font-size: 24px; height: 40px; @@ -1790,79 +2123,94 @@ padding-left: 5px; margin-bottom: 10px; display: flex; // justify-content: space-between; .Add-details { font-size: 18px; color: #02a7f0; cursor: pointer; } } .red-star { ::v-deep.el-radio__label { position: relative; padding-right: 10px; /* æ ¹æ®éè¦è°æ´ */ padding-right: 10px; } ::v-deep.el-radio__label::after { content: "*"; color: red; position: absolute; right: -5px; /* æ ¹æ®éè¦è°æ´ */ right: -5px; top: 0; } ::v-deep.el-input-group__textarea { white-space: pre-wrap; /* ä¿æç©ºç½ç¬¦åºåå¹¶æ£å¸¸æ¢è¡ */ word-break: break-all; /* å¨é¿åè¯æURLå°åå é¨è¿è¡æ¢è¡ */ white-space: pre-wrap; word-break: break-all; } ::v-deep.el-checkbox__label { position: relative; padding-right: 10px; /* æ ¹æ®éè¦è°æ´ */ padding-right: 10px; } ::v-deep.el-checkbox__label::after { content: "*"; color: red; position: absolute; right: -5px; /* æ ¹æ®éè¦è°æ´ */ right: -5px; top: 0; } } ::v-deep.offside-value .el-radio__label { color: #fff; } ::v-deep.el-link.el-link--default { color: #02a7f0 !important; } .el-message-box__btns button:nth-child(2) { margin-left: 10px; background-color: #f57676; border-color: #f57676; } .el-icon-phone { transition: all 0.3s; } .el-button[disabled] .el-icon-phone { color: #c0c4cc; } .el-button:not([disabled]) .el-icon-phone { color: #409eff; } .el-button:not([disabled]):hover .el-icon-phone { color: #66b1ff; transform: scale(1.1); } .mulsz { font-size: 25px; margin-top: 20px; } .el-input.is-disabled .el-input__inner { background-color: #fff; /* èæ¯é¢è² */ border-color: #dcdfe6; /* è¾¹æ¡é¢è² */ color: #080808 !important; /* æåé¢è² */ cursor: not-allowed; /* é¼ æ æ ·å¼ */ background-color: #fff; border-color: #dcdfe6; color: #080808 !important; cursor: not-allowed; } .el-textarea.is-disabled .el-textarea__inner { background-color: #fff; /* èæ¯é¢è² */ border-color: #dcdfe6; /* è¾¹æ¡é¢è² */ color: #080808 !important; /* æåé¢è² */ cursor: not-allowed; /* é¼ æ æ ·å¼ */ background-color: #fff; border-color: #dcdfe6; color: #080808 !important; cursor: not-allowed; } </style> src/views/followvisit/record/physical/index.vue
@@ -713,7 +713,6 @@ const queryParams = { pid: Number(this.patid), allhosp: "0", pageNum: 1, }; // æ£è åºç¡ä¿¡æ¯ messagelistpatient(queryParams).then((response) => { src/views/followvisit/zbAgain/index.vue
@@ -1187,8 +1187,8 @@ }); }, affiliation() { this.topqueryParams.drcode = store.getters.hisUserId; this.topqueryParams.nurseId = store.getters.hisUserId; this.topqueryParams.managementDoctor = store.getters.hisUserId; this.getList(1); }, onthatday() { src/views/knowledge/questionnaire/compilequer/index.vue
@@ -262,7 +262,7 @@ <el-option class="ruleFormaa" v-for="item in flatArray" :key="item.deptCode" :key="item.id" :label="item.label" :value="item.deptCode" > @@ -285,7 +285,7 @@ <el-option class="ruleFormaa" v-for="item in flatArray" :key="item.deptCode" :key="item.id" :label="item.label" :value="item.deptCode" > @@ -566,10 +566,10 @@ </el-form-item></el-col > <el-col :span="12" ><el-form-item label="æ¯å¦å¯ç¨"> <el-radio-group v-model="topicobj.isenable"> ><el-form-item label="æ¯å¦éè"> <el-radio-group v-model="topicobj.ishide"> <el-radio v-for="(item, index) in usable" v-for="(item, index) in hides" :label="item.value" >{{ item.label }}</el-radio > @@ -582,8 +582,8 @@ v-if="topicobj.scriptType == 1" > <el-radio-group v-model="topicobj.branchFlag"> <el-radio :label="1">æ¯</el-radio> <el-radio :label="0">å¦</el-radio> <el-radio label="1">æ¯</el-radio> <el-radio label="0">å¦</el-radio> </el-radio-group> </el-form-item> <el-form-item label="éä¸æç¤º" v-if="topicobj.scriptType != 1"> @@ -656,6 +656,12 @@ <el-radio-group v-model="item.isabnormal"> <el-radio :label="1">æ¯</el-radio> <el-radio :label="0">å¦</el-radio> </el-radio-group> </el-form-item> <el-form-item label="æ¯å¦é䏿¶ééå ä¿¡æ¯"> <el-radio-group v-model="item.appendflag"> <el-radio label="1">æ¯</el-radio> <el-radio label="0">å¦</el-radio> </el-radio-group> </el-form-item> </el-row> @@ -749,9 +755,7 @@ > <el-button type="primary" @click="laststep()">ä¸ä¸æ¥</el-button> <el-button type="info" @click="closeFm('ruleForm')">å ³é</el-button> <el-button @click="toExamine('ruleForm')" >ä¿åé®é¢æ°æ®</el-button > <el-button @click="toExamine('ruleForm')">ä¿åé®é¢æ°æ®</el-button> </div> <!-- é®å·é¢è§ --> <div v-if="Editprogress == 3"> @@ -1215,8 +1219,8 @@ style="width: 100px; height: 100px" :src="item.picturePath" :preview-src-list=" item.picturePath ? [item.picturePath] : [] " item.picturePath ? [item.picturePath] : [] " > </el-image> </div> @@ -1299,6 +1303,7 @@ svyTemplateLibScripts: [], tempDetpRelevances: [], svyLibTemplateTagList: [], suitway: [], scoreType: "4", isenable: "0", longTemp: "0", @@ -1404,6 +1409,10 @@ usable: [ { value: "0", label: "å¯ç¨" }, { value: "1", label: "åç¨" }, ], hides: [ { value: 0, label: "æ£å¸¸" }, { value: 1, label: "éè" }, ], longtype: [ { value: "0", label: "æ®éä»»å¡" }, @@ -1622,8 +1631,8 @@ this.confirmillness(); this.putbelongDepts(); this.$modal.closeLoading(); // this.$router.go(-1); window.location.reload(); this.$router.go(-1); // window.location.reload(); }); } else { this.ruleForm.isoperation = 1; @@ -1643,8 +1652,8 @@ // é¢ç®æ ¡éª toExamine() { // éåé¢ç®éå for (let i = 0; i < this.ruleForm.svyTemplateLibScripts.length; i++) { const question = this.ruleForm.svyTemplateLibScripts[i]; for (let i = 0; i < this.ruleForm.svyTemplateLibScripts.length; i++) { const question = this.ruleForm.svyTemplateLibScripts[i]; // 妿 scriptType 为 4ï¼åè·³è¿å½åé¢ç® if (question.scriptType === 4) { @@ -1675,7 +1684,7 @@ // 妿ææé¢ç®é½æ ¡éªéè¿ï¼è¿å true console.log("ææé¢ç®æ ¡éªéè¿ï¼é项åç§°æ éå¤"); this.Departmenttreatment(); this.Departmenttreatment(); }, // ç§å®¤/é¢åºå¤ç src/views/patient/patient/outpatient.vue
@@ -67,16 +67,16 @@ ></el-cascader> </el-form-item> <el-form-item label="å°±è¯æ¥æ"> <el-date-picker v-model="dateRange" style="width: 240px" value-format="yyyy-MM-dd" type="daterange" range-separator="-" start-placeholder="å¼å§æ¥æ" end-placeholder="ç»ææ¥æ" ></el-date-picker> <!-- <el-date-picker <el-date-picker v-model="dateRange" style="width: 240px" value-format="yyyy-MM-dd" type="daterange" range-separator="-" start-placeholder="å¼å§æ¥æ" end-placeholder="ç»ææ¥æ" ></el-date-picker> <!-- <el-date-picker v-model="dateRange" type="datetimerange" value-format="yyyy-MM-dd HH:mm:ss" @@ -85,7 +85,7 @@ :default-time="['12:00:00']" > </el-date-picker> --> </el-form-item> </el-form-item> <el-row> <!-- <el-form-item label=" å°±è¯æ¥æ " prop="admitdate"> <el-date-picker @@ -150,6 +150,18 @@ @click="handleDelete" v-hasPermi="['system:user:remove']" >å é¤</el-button > </el-col> <el-col :span="1.5"> <el-button type="warning" plain icon="el-icon-plus" size="medium" :disabled="multiple" @click="handleBatchAddTask" > æ¹éæ·»å ä»»å¡</el-button > </el-col> <el-col :span="19"> @@ -228,7 +240,13 @@ <el-button size="medium" type="text" @click="gettoken360(scope.row.idcardno,scope.row.drcode,scope.row.drname)" @click=" gettoken360( scope.row.idcardno, scope.row.drcode, scope.row.drname ) " ><span class="button-textsc">{{ scope.row.patname }}</span></el-button @@ -301,7 +319,23 @@ prop="drname" width="120" /> <el-table-column label="æ¯å¦åå¨ä»»å¡" align="center" key="serverState" prop="serverState" width="100" > <template slot-scope="scope"> <span :style="{ color: scope.row.serverState == 1 ? 'green' : 'gray', }" > {{ scope.row.serverState == 1 ? "æ¯" : "æ " }} </span> </template> </el-table-column> <el-table-column label="æä½" fixed="right" @@ -337,7 +371,113 @@ /> </el-col> </el-row> <el-dialog title="æ¹éæ·»å ä»»å¡" :visible.sync="batchTaskVisible" width="90%" append-to-body > <el-row :gutter="20"> <!-- 左侧ï¼é䏿£è å表 --> <el-col :span="12"> <div class="batch-patient-section"> <h4>é䏿£è ï¼{{ selectedPatients.length }}人ï¼</h4> <el-table :data="selectedPatients" border style="width: 100%" size="small" > <el-table-column prop="patname" label="å§å" width="100" /> <el-table-column prop="sex" label="æ§å«" width="80"> <template slot-scope="scope"> {{ scope.row.sex === 1 ? "ç·" : "女" }} </template> </el-table-column> <el-table-column label="å°±è¯æ¶é´" align="center" key="admitdate" prop="admitdate" > <template slot-scope="scope"> <span>{{ formatTime(scope.row.admitdate) }}</span> </template> </el-table-column> <el-table-column prop="outhospno" label="ç æ¡å·" /> <el-table-column prop="deptname" label="ç§å®¤" /> </el-table> </div> </el-col> <!-- å³ä¾§ï¼ä»»å¡å表 --> <el-col :span="12"> <div class="batch-task-section"> <h4>ä»»å¡å表ï¼è¯·éæ©1个任å¡ï¼</h4> <el-table :data="taskList" border style="width: 100%" size="small" @current-change="handleTaskSelectionChange" highlight-current-row > <el-table-column label="ä»»å¡åç§°" fixed align="center" key="taskName" prop="taskName" :show-overflow-tooltip="true" /> <el-table-column label="æå¡é¡¹ç®" align="center" key="templatename" prop="templatename" :show-overflow-tooltip="true" /> <el-table-column label="å建人" align="center" key="createBy" prop="createBy" :show-overflow-tooltip="true" /> <el-table-column label="å建æ¶é´" sortable align="center" prop="createTime" > <template slot-scope="scope"> <span>{{ formatTime(scope.row.createTime) }}</span> </template> </el-table-column> <template #empty> <div class="empty-message"> <i class="el-icon-warning"></i> <span>æ£è ç§å®¤æ å¹é æå¡</span> </div> </template> </el-table> </div> </el-col> </el-row> <!-- åºé¨æé® --> <div slot="footer" class="dialog-footer"> <el-button @click="batchTaskVisible = false">å æ¶</el-button> <el-button type="primary" :loading="batchLoading" @click="submitBatchTask" >å建任å¡</el-button > </div> </el-dialog> <!-- ç¨æ·å¯¼å ¥å¯¹è¯æ¡ --> <el-dialog :title="upload.title" @@ -383,6 +523,7 @@ </div> </el-upload> </div> <!-- å¯¼å ¥æ£æ¥ --> <div class="uploading" v-else-if="dractive == 2"> <el-table :data="uploadingData" style="width: 100%"> @@ -446,7 +587,7 @@ import { getToken } from "@/utils/auth"; import Treeselect from "@riophae/vue-treeselect"; import "@riophae/vue-treeselect/dist/vue-treeselect.css"; import { query360PatInfo } from "@/api/AiCentre/index"; import { query360PatInfo, getTasklist, addSubtask } from "@/api/AiCentre/index"; import store from "@/store"; @@ -509,6 +650,12 @@ Labelchange: false, //ä¿®æ¹æ°å¢å¼¹çª propss: { multiple: true }, optionstag: [], //æ ç¾å表 batchTaskVisible: false, // å¼¹çªå¯è§æ§ selectedPatients: [], // éä¸çæ£è å表 taskList: [], // ä»»å¡å表 selectedTask: null, // éä¸çä»»å¡å表 batchLoading: false, // æ¹éæäº¤å è½½ç¶æ deptcode: "", Patientrange: [ { name: "å ¨é¨", @@ -680,9 +827,9 @@ if (this.dateRange) { this.queryParams.beginTime = this.dateRange[0]; this.queryParams.endTime = this.dateRange[1]; }else{ this.queryParams.beginTime = ''; this.queryParams.endTime = ''; } else { this.queryParams.beginTime = ""; this.queryParams.endTime = ""; } listPatouthosp(this.queryParams).then((response) => { this.userList = response.rows; @@ -737,9 +884,9 @@ this.$modal.msgWarning('360åè½ææªå¼é'); return; // 黿¢åç»ä»£ç æ§è¡ this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh; if (this.postData.XiaoXiTou.ZuHuMC=='丽水å¸ä¸å»é¢') { this.postData.YeWuXX.YongHuXX.YongHuID = '1400398571877961728'; this.postData.YeWuXX.YongHuXX.YongHuXM = 'LSZYY'; if (this.postData.XiaoXiTou.ZuHuMC == "丽水å¸ä¸å»é¢") { this.postData.YeWuXX.YongHuXX.YongHuID = "1400398571877961728"; this.postData.YeWuXX.YongHuXX.YongHuXM = "LSZYY"; } query360PatInfo(this.postData).then((res) => { @@ -798,7 +945,7 @@ leaveldeptcodes: [], leavehospitaldistrictcodes: [], }; this.handleQuery(); this.handleQuery(); }, // å¤éæ¡é䏿°æ® handleSelectionChange(selection) { @@ -915,6 +1062,124 @@ this.upload.open = false; this.dractive = 1; }, /** æ¹éæ·»å 任塿é®ç¹å» */ handleBatchAddTask() { // æ ¡éªæ¯å¦é䏿£è if (this.ids.length === 0) { this.$modal.msgWarning("请è³å°éä¸1忣è "); return; } // æ£æ¥éä¸çæ£è 䏿¯å¦æå·²æä»»å¡ç const hasTaskPatients = this.userList.filter( (item) => this.ids.includes(item.patid) && item.serverState == 1 ); if (hasTaskPatients.length > 0) { const patientNames = hasTaskPatients.map((p) => p.patname).join("ã"); this.$modal.msgError( `éä¸çæ£è ${patientNames} å·²æä»»å¡ï¼æ æ³é夿·»å ` ); return; } // è·åé䏿£è çç§å®¤ä¿¡æ¯ï¼ç¨äºæ ¡éªåä¸ç§å®¤ï¼ const patientDepts = new Set(); let deptcode = ""; this.ids.forEach((patId) => { const patient = this.userList.find((item) => item.patid === patId); if (patient) { patientDepts.add(patient.deptname); deptcode = patient.deptcode; } }); // æ ¡éªæ¯å¦åä¸ç§å®¤ if (patientDepts.size > 1) { this.$modal.msgError("éä¸çæ£è ä¸å±äºåä¸ç§å®¤ï¼æ æ³æ¹éæ·»å ä»»å¡"); return; } // è·åé䏿£è å表 this.selectedPatients = this.userList.filter((item) => this.ids.includes(item.patid) ); // æ¾ç¤ºå¼¹çª this.batchTaskVisible = true; // è·åä»»å¡å表 this.loadTaskList(deptcode); }, /** å 载任å¡å表 */ loadTaskList(deptcode) { this.batchLoading = true; let topqueryParams = { pageNum: 1, pageSize: 10, serviceType: 3, type: 2, deptcode: deptcode, }; getTasklist(topqueryParams).then((response) => { this.taskList = response.rows; this.batchLoading = false; }); }, /** å¤çä»»å¡éæ©åå */ handleTaskSelectionChange(currentRow) { this.selectedTask = currentRow; }, // éåæ¹éæäº¤æ¹æ³ async submitBatchTask() { // æ ¡éªæ¯å¦éä¸ä»»å¡ if (!this.selectedTask) { this.$modal.msgWarning("è¯·éæ©1个任å¡"); return; } this.batchLoading = true; const successPatients = []; const failedPatients = []; try { // éåéä¸çæ£è ï¼é个è°ç¨æ¥å£ for (const patient of this.selectedPatients) { const params = { taskId: this.selectedTask.taskId, taskName: this.selectedTask.taskName, serviceType: this.selectedTask.serviceType, ...patient, age: "", }; try { await addSubtask(params); successPatients.push(patient.patname); } catch (error) { failedPatients.push(patient.patname); } } // æ¾ç¤ºå¤çç»æ let message = `æå为 ${successPatients.length} åæ£è æ·»å ä»»å¡`; if (failedPatients.length > 0) { message += `ï¼${failedPatients.length} åæ£è æ·»å 失败`; } this.$modal.msgSuccess(message); this.batchTaskVisible = false; this.getList(); // å·æ°æ£è å表 } catch (error) { this.$modal.msgError("æ¹éæ·»å ä»»å¡è¿ç¨ä¸åºé"); } finally { this.batchLoading = false; } }, /** æ¹éæ·»å æ£è 任塿¥å£ */ batchAddPatientTask(params) {}, }, }; </script> @@ -965,4 +1230,41 @@ .button-textsc { color: #28cfe6; } .batch-patient-section, .batch-task-section { padding: 15px; border: 1px solid #ebeef5; border-radius: 4px; margin-bottom: 15px; } .el-table--enable-row-hover .el-table__body tr:hover > td { background-color: #f5f7fa; } .el-table__body tr.current-row > td { background-color: #e6f7ff; } /* ç¦ç¨ç¶æä¸æé®æ ·å¼ */ .el-button.is-disabled { cursor: not-allowed; } .batch-patient-section h4, .batch-task-section h4 { margin-top: 0; margin-bottom: 15px; color: #303133; font-size: 16px; } /* è¡¨æ ¼æ ·å¼ä¼å */ .el-table { margin-bottom: 10px; } /* å¼¹çªåºé¨æé®é´è· */ .dialog-footer { text-align: right; padding: 10px 20px 20px; } </style> vue.config.js
@@ -37,7 +37,7 @@ [process.env.VUE_APP_BASE_API]: { // target: `https://www.health-y.cn/lssf`, // target: `http://10.202.20.185:8095`, // target: `http://9.208.2.190:8095`, // target: `http://192.168.100.195:8095`, target:`http://localhost:8095`, // target: `http://192.168.100.193:8095`, // target: `http://192.168.101.166:8093`,