已重命名1个文件
已修改31个文件
已添加8个文件
| | |
| | | <router-view /> |
| | | <theme-picker /> |
| | | <!-- <Assistant v-if="routertf" /> --> |
| | | <Assistant |
| | | v-if="Assvite" |
| | | :initial-position="{ x: 50, y: 200 }" |
| | | :auto-hide="false" |
| | | :hide-delay="3000" |
| | | primary-color="#1890ff" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | name: "App", |
| | | components: { |
| | | ThemePicker, |
| | | Assistant: () => import("./components/Assistant"), //弿¥ç»ä»¶å è½½æ¹å¼ |
| | | Assistant: () => import("./components/Assistant"), |
| | | }, |
| | | data() { |
| | | return { |
| | | routers: window.location.href, |
| | | routertf: true, |
| | | Assvite: true, |
| | | }; |
| | | }, |
| | | created() { |
| | | var startIndex = this.routers.indexOf("param5=") + "param5=".length; // æ¾å°ç¬¬ä¸ä¸ªå符çä½ç½® |
| | | this.routertf = JSON.parse(this.routers.substring(startIndex)); // æªåä» 'param5=' ä¹åçå
容 |
| | | // åå§å夿 |
| | | this.checkAndUpdateAssvite(); |
| | | }, |
| | | watch: { |
| | | // çå¬è·¯ç±åå |
| | | '$route'(to, from) { |
| | | this.checkAndUpdateAssvite(); |
| | | } |
| | | }, |
| | | methods: { |
| | | checkAndUpdateAssvite() { |
| | | const isLoginPage = window.location.pathname.includes("/login"); |
| | | this.Assvite = !isLoginPage; |
| | | console.log('å½åè·¯ç±:', this.$route.path, 'æ¯å¦ç»å½é¡µ:', isLoginPage, 'æ¾ç¤ºæ¬æµ®ç:', this.Assvite); |
| | | } |
| | | }, |
| | | metaInfo() { |
| | | return { |
| | |
| | | import request from "@/utils/request"; |
| | | |
| | | |
| | | // æ¥è¯¢é¨è¯çç
人次åäººæ° |
| | | export function getEChartsPatMedOuthospCount(data) { |
| | | return request({ |
| | |
| | | return request({ |
| | | url: "/sms/send", |
| | | method: "post", |
| | | data: data |
| | | data: data, |
| | | }); |
| | | } |
| | | // åéçä¿¡ |
| | | export function getCurrentUserServiceSubtaskCount(data) { |
| | | return request({ |
| | | url: "/smartor/serviceSubtask/getCurrentUserServiceSubtaskCount", |
| | | method: "post", |
| | | data: data, |
| | | }); |
| | | } |
| | |
| | | <template> |
| | | <div |
| | | ref="floatDrag" |
| | | class="float-position" |
| | | id="float-box" |
| | | :style="{ |
| | | left: left + 'px', |
| | | top: top + 'px', |
| | | right: right + 'px !important', |
| | | zIndex: zIndex, |
| | | ref="floatBall" |
| | | class="float-ball" |
| | | :class="{ |
| | | 'float-ball-hidden': isHidden && !isHovering, |
| | | 'float-ball-expanded': isExpanded, |
| | | }" |
| | | @touchmove.prevent |
| | | @mousemove.prevent |
| | | @mousedown="mouseDown" |
| | | @mouseup="mouseUp" |
| | | :style="{ |
| | | left: position.x + 'px', |
| | | top: position.y + 'px', |
| | | '--primary-color': primaryColor, |
| | | '--hover-color': hoverColor, |
| | | }" |
| | | @mouseenter="handleMouseEnter" |
| | | @mouseleave="handleMouseLeave" |
| | | > |
| | | <div class="drag"> |
| | | <svg |
| | | t="1682058484158" |
| | | class="icon" |
| | | viewBox="0 0 1024 1024" |
| | | version="1.1" |
| | | xmlns="http://www.w3.org/2000/svg" |
| | | p-id="2023" |
| | | width="32" |
| | | height="32" |
| | | > |
| | | <path |
| | | d="M556.297 172.715a42.407 42.407 0 0 1 42.426 42.398l0.837 267.69c-0.118 1.703 0.63 2.737 1.408 2.737 0.63 0 1.29-0.699 1.506-2.284l37.74-208.953c3.732-20.672 21.844-36.166 42.162-36.166a40.074 40.074 0 0 1 7.136 0.64c23.064 4.164 38.391 27.562 34.217 50.587l-33.656 244.529c0 2.559 0.483 4.478 1.32 4.478 0.58 0 1.328-0.935 2.175-3.218l50.144-134.063c6.27-17.65 23.034-29.403 40.793-29.403A39.798 39.798 0 0 1 797.892 374c22.08 7.875 33.626 33.41 25.78 55.47l-87.904 287.191c-0.453 1.585-0.984 3.16-1.437 4.725l-0.187 0.591v0.128a187.031 187.031 0 0 1-177.847 129.1c-53.156 0-108.42-18.752-150.472-51-45.419-27.336-190.968-183.783-190.968-183.783-22.09-22.07-18.792-55.882 3.297-77.962 11.537-11.537 25.919-17.6 40.173-17.6 13.033 0 25.967 5.05 36.51 15.592l63.138 63.157c8.603 8.594 18.132 12.699 26.922 12.699a26.952 26.952 0 0 0 20.88-9.893c7.658-9.037 4.635-36.914 2.49-54.594l-31.668-260.259c-2.825-23.26 13.781-45.724 37.003-48.549a40.497 40.497 0 0 1 4.853-0.295c21.282 0 39.749 16.98 42.387 38.597l34.926 204.425c0.905 2.54 2.342 4.036 3.602 4.036s2.353-1.496 2.58-4.922l11.88-265.741a42.417 42.417 0 0 1 42.467-42.398m0-70.875a113.36 113.36 0 0 0-104.344 69.153c-0.246 0.57-0.482 1.152-0.718 1.732a111.234 111.234 0 0 0-90.022 10.976 113.597 113.597 0 0 0-32.415 29.207 115.23 115.23 0 0 0-19.067 38.489 113.843 113.843 0 0 0-3.465 44.68l21.36 175.77a120.842 120.842 0 0 0-69.3-21.863c-33.468 0-65.549 13.614-90.286 38.332-23.212 23.202-36.993 53.363-38.863 84.952a120.92 120.92 0 0 0 34.502 92.216c5.532 5.906 39.64 42.407 79.203 82.412 74.586 75.422 105.328 99.648 122.702 110.771 53.973 40.36 123.254 63.414 190.674 63.414A257.906 257.906 0 0 0 801.14 745.1c0.247-0.709 0.483-1.417 0.7-2.136l0.117-0.374a178.56 178.56 0 0 0 1.723-5.64l87.413-285.578a113.203 113.203 0 0 0 5.729-42.86 115.585 115.585 0 0 0-35.772-77.135 111.431 111.431 0 0 0-67.45-30.19l0.148-0.985a113.676 113.676 0 0 0-1.201-43.155 115.408 115.408 0 0 0-16.872-39.523 113.774 113.774 0 0 0-30.703-30.968 111.077 111.077 0 0 0-84.981-17.06 113.203 113.203 0 0 0-103.694-67.656z" |
| | | fill="#ffffff" |
| | | p-id="2024" |
| | | ></path> |
| | | </svg> |
| | | </div> |
| | | <div class="content" id="content" @click="handelFlex"> |
| | | <!-- <img src="../../../../assets/image/alarm.png" alt="" /> --> |
| | | <div class="label"> |
| | | <div v-if="flag">å±å¼</div> |
| | | <div v-else>æ¶èµ·</div> |
| | | </div> |
| | | <div class="item-container"> |
| | | <div |
| | | v-for="(item, index) in powerList" |
| | | :key="index" |
| | | @click.stop="activeHandle(index,item.url)" |
| | | <!-- 主çä½ --> |
| | | <div |
| | | class="ball-main" |
| | | :class="{ 'ball-main-expanded': isExpanded }" |
| | | @click="toggleExpand" |
| | | @mousedown="startDrag" |
| | | @touchstart="startDrag" |
| | | > |
| | | <!-- æå ç¶æå¾æ --> |
| | | <div v-if="!isExpanded" class="ball-icon"> |
| | | <svg |
| | | class="fold-icon" |
| | | viewBox="0 0 24 24" |
| | | fill="none" |
| | | stroke="currentColor" |
| | | stroke-width="2" |
| | | > |
| | | <path d="M4 6h16M4 12h16M4 18h16" /> |
| | | </svg> |
| | | </div> |
| | | |
| | | <!-- å±å¼ç¶æå
³éæé® --> |
| | | <div v-else class="close-btn" @click.stop="toggleExpand"> |
| | | <svg |
| | | class="close-icon" |
| | | viewBox="0 0 24 24" |
| | | fill="none" |
| | | stroke="currentColor" |
| | | stroke-width="2" |
| | | > |
| | | <path d="M6 18L18 6M6 6l12 12" /> |
| | | </svg> |
| | | </div> |
| | | |
| | | <!-- è§æ æç¤ºï¼ææªè¯»æ°æ¶æ¾ç¤ºï¼ --> |
| | | <div v-if="totalUnread > 0" class="ball-badge"> |
| | | {{ totalUnread > 99 ? "99+" : totalUnread }} |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- å±å¼çå
容颿¿ --> |
| | | <transition name="ball-expand"> |
| | | <div v-if="isExpanded" class="ball-content"> |
| | | <div class="content-header"> |
| | | <h3>é访工ä½å°</h3> |
| | | <div class="update-time">æ´æ°äº {{ updateTime }}</div> |
| | | </div> |
| | | |
| | | <div class="stats-grid"> |
| | | <div |
| | | :class="activeIndex == index ? 'active power-item' : 'power-item'" |
| | | v-for="(item, index) in statsItems" |
| | | :key="index" |
| | | class="stat-item" |
| | | :class="{ 'stat-item-highlight': item.highlight }" |
| | | @click="handleItemClick(item)" |
| | | > |
| | | <img :src="item.path" alt="" style="width: 26px" /> |
| | | <div class="stat-icon"> |
| | | <svg |
| | | v-if="item.icon === 'IconUsers'" |
| | | viewBox="0 0 24 24" |
| | | fill="none" |
| | | stroke="currentColor" |
| | | stroke-width="2" |
| | | > |
| | | <path |
| | | d="M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197m13-7.157a4 4 0 11-8 0 4 4 0 018 0z" |
| | | /> |
| | | </svg> |
| | | <svg |
| | | v-else-if="item.icon === 'IconAlertCircle'" |
| | | viewBox="0 0 24 24" |
| | | fill="none" |
| | | stroke="currentColor" |
| | | stroke-width="2" |
| | | > |
| | | <path d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" /> |
| | | </svg> |
| | | <svg |
| | | v-else-if="item.icon === 'IconTask'" |
| | | viewBox="0 0 24 24" |
| | | fill="none" |
| | | stroke="currentColor" |
| | | stroke-width="2" |
| | | > |
| | | <path |
| | | d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" |
| | | /> |
| | | </svg> |
| | | </div> |
| | | <div class="stat-info"> |
| | | <div class="stat-label">{{ item.label }}</div> |
| | | <div class="stat-value">{{ item.value }}</div> |
| | | <div |
| | | v-if="item.trend" |
| | | class="stat-trend" |
| | | :class="'trend-' + item.trend.type" |
| | | > |
| | | <span class="trend-arrow">{{ item.trend.arrow }}</span> |
| | | <span class="trend-value">{{ item.trend.value }}</span> |
| | | </div> |
| | | </div> |
| | | <div v-if="item.unread > 0" class="stat-badge"> |
| | | {{ item.unread > 99 ? "99+" : item.unread }} |
| | | </div> |
| | | </div> |
| | | <div :class="activeIndex == index ? 'active-des des' : 'des'"> |
| | | {{ item.label }} |
| | | </div> |
| | | |
| | | <div class="quick-actions"> |
| | | <div |
| | | v-for="(action, index) in quickActions" |
| | | :key="index" |
| | | class="action-item" |
| | | @click="handleActionClick(action)" |
| | | > |
| | | <div class="action-icon"> |
| | | <svg |
| | | v-if="action.icon === 'IconMessageCircle'" |
| | | viewBox="0 0 24 24" |
| | | fill="none" |
| | | stroke="currentColor" |
| | | stroke-width="2" |
| | | > |
| | | <path |
| | | d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" |
| | | /> |
| | | </svg> |
| | | <svg |
| | | v-else-if="action.icon === 'IconPhone'" |
| | | viewBox="0 0 24 24" |
| | | fill="none" |
| | | stroke="currentColor" |
| | | stroke-width="2" |
| | | > |
| | | <path |
| | | d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z" |
| | | /> |
| | | </svg> |
| | | </div> |
| | | <div class="action-label">{{ action.label }}</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </transition> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { getCurrentUserServiceSubtaskCount } from "@/api/AiCentre/index"; |
| | | export default { |
| | | name: "DragBall", |
| | | name: "FloatBall", |
| | | |
| | | props: { |
| | | distanceRight: { |
| | | type: Number, |
| | | default: 36, |
| | | // åå§ä½ç½® |
| | | initialPosition: { |
| | | type: Object, |
| | | default: () => ({ x: 20, y: 100 }), |
| | | }, |
| | | distanceBottom: { |
| | | type: Number, |
| | | default: 600, |
| | | }, |
| | | isScrollHidden: { |
| | | type: Boolean, |
| | | default: false, |
| | | }, |
| | | isCanDraggable: { |
| | | // æ¯å¦èªå¨éè |
| | | autoHide: { |
| | | type: Boolean, |
| | | default: true, |
| | | }, |
| | | zIndex: { |
| | | // éèå»¶è¿ï¼æ¯«ç§ï¼ |
| | | hideDelay: { |
| | | type: Number, |
| | | default: 50, |
| | | default: 2000, |
| | | }, |
| | | value: { |
| | | // 主é¢é¢è² |
| | | primaryColor: { |
| | | type: String, |
| | | default: "æ¬æµ®çï¼", |
| | | default: "#4f46e5", |
| | | }, |
| | | // æ¬åé¢è² |
| | | hoverColor: { |
| | | type: String, |
| | | default: "#4338ca", |
| | | }, |
| | | // æ°æ®æºï¼å¯ä»å¤é¨ä¼ å
¥ï¼ |
| | | statsData: { |
| | | type: Object, |
| | | default: null, |
| | | }, |
| | | }, |
| | | |
| | | data() { |
| | | return { |
| | | clientWidth: null, |
| | | clientHeight: null, |
| | | left: null, |
| | | top: null, |
| | | right: null, |
| | | timer: null, |
| | | currentTop: 0, |
| | | mousedownX: 0, |
| | | mousedownY: 0, |
| | | isExpanded: false, |
| | | isHovering: false, |
| | | isHidden: false, |
| | | isDragging: false, |
| | | position: { ...this.initialPosition }, |
| | | dragStart: { x: 0, y: 0 }, |
| | | hideTimer: null, |
| | | updateTime: "", |
| | | roles: null, |
| | | // ç»è®¡æ°æ® |
| | | statsItems: [ |
| | | { |
| | | id: "pending", |
| | | label: "å¾
é访", |
| | | value: "0", |
| | | unread: 0, |
| | | urltype: 2, |
| | | icon: "IconUsers", |
| | | url: "/followvisit/discharge", |
| | | trend: { type: "up", arrow: "", value: "" }, |
| | | highlight: true, |
| | | }, |
| | | { |
| | | id: "failed", |
| | | label: "é访失败", |
| | | value: "0", |
| | | unread: 0, |
| | | urltype: 3, |
| | | icon: "IconAlertCircle", |
| | | url: "/followvisit/discharge", |
| | | trend: { type: "down", arrow: "", value: "" }, |
| | | }, |
| | | { |
| | | id: "abnormal", |
| | | label: "ä»»å¡å¼å¸¸", |
| | | value: "0", |
| | | unread: 0, |
| | | urltype: 4, |
| | | icon: "IconAlertCircle", |
| | | url: "/followvisit/discharge", |
| | | trend: { type: "up", arrow: "", value: "" }, |
| | | }, |
| | | { |
| | | id: "myTasks", |
| | | label: "æçä»»å¡", |
| | | value: "0", |
| | | unread: 0, |
| | | urltype: 5, |
| | | icon: "IconTask", |
| | | url: "/followvisit/discharge", |
| | | trend: { type: "stable", arrow: "", value: "" }, |
| | | }, |
| | | ], |
| | | |
| | | flag: true, // æ§å¶æ¬æµ®æ¡æ¯å¦å±å¼ |
| | | box: "", // æ¬æµ®ççdom |
| | | activeIndex: 0, //é«äº®æ¾ç¤º |
| | | powerList: [ |
| | | // å¿«æ·æä½ |
| | | quickActions: [ |
| | | { |
| | | path: require("@/assets/images/huanzheliebiao.png"), |
| | | url:'/patient/patient/', |
| | | label: "æ£è
", |
| | | id: "sms", |
| | | label: "å建é®å·ä»»å¡", |
| | | icon: "IconMessageCircle", |
| | | url: "/followvisit/QuestionnaireTask?type=2&serviceType=2", |
| | | }, |
| | | { |
| | | path: require("@/assets/images/fwwu.png"), |
| | | url:'/followvisit/tasklist/', |
| | | label: "ä»»å¡", |
| | | id: "call", |
| | | label: "å建è¯é³ä»»å¡", |
| | | icon: "IconPhone", |
| | | url: "/followvisit/particty?type=1&serviceType=2", |
| | | }, |
| | | { |
| | | path: require("@/assets/images/duanxinjilu.png"), |
| | | url:'', |
| | | label: "çä¿¡", |
| | | }, |
| | | { |
| | | path: require("@/assets/images/dianhua.png"), |
| | | url:'', |
| | | label: "çµè¯", |
| | | }, |
| | | { |
| | | path: require("@/assets/images/zxlt.png"), |
| | | url:'', |
| | | label: "å¨çº¿è天", |
| | | }, |
| | | // { |
| | | // id: 'chat', |
| | | // label: 'å¨çº¿è天', |
| | | // icon: 'IconMessageCircle', |
| | | // url: '/chat' |
| | | // } |
| | | ], |
| | | }; |
| | | }, |
| | | created() { |
| | | this.clientWidth = document.documentElement.clientWidth; |
| | | this.clientHeight = document.documentElement.clientHeight; |
| | | |
| | | computed: { |
| | | totalUnread() { |
| | | return this.statsItems.reduce((sum, item) => sum + item.unread, 0); |
| | | }, |
| | | }, |
| | | |
| | | mounted() { |
| | | this.isCanDraggable && |
| | | this.$nextTick(() => { |
| | | this.floatDrag = this.$refs.floatDrag; |
| | | // è·åå
ç´ ä½ç½®å±æ§ |
| | | this.floatDragDom = this.floatDrag.getBoundingClientRect(); |
| | | // 设置åå§ä½ç½® |
| | | this.left = this.clientWidth - this.floatDragDom.width - this.distanceRight; |
| | | // this.right = 0; |
| | | this.top = |
| | | this.clientHeight - this.floatDragDom.height - this.distanceBottom; |
| | | this.initDraggable(); |
| | | }); |
| | | // this.isScrollHidden && window.addEventListener('scroll', this.handleScroll); |
| | | this.roles = this.$store.state.user.roles; |
| | | this.loadPosition(); |
| | | |
| | | if (this.autoHide) { |
| | | this.startAutoHide(); |
| | | } |
| | | |
| | | // ç¹å»å¤é¨å
³é |
| | | document.addEventListener("click", this.handleClickOutside); |
| | | |
| | | // çªå£å¤§å°ååæ¶éæ°å®ä½ |
| | | window.addEventListener("resize", this.handleResize); |
| | | |
| | | this.box = document.getElementById("float-box"); |
| | | }, |
| | | beforeUnmount() { |
| | | window.removeEventListener("scroll", this.handleScroll); |
| | | |
| | | beforeDestroy() { |
| | | document.removeEventListener("click", this.handleClickOutside); |
| | | window.removeEventListener("resize", this.handleResize); |
| | | clearTimeout(this.hideTimer); |
| | | }, |
| | | methods: { |
| | | // ä¼¸ç¼©æ¬æµ®ç |
| | | handelFlex() { |
| | | if (this.flag) { |
| | | this.buffer(this.box, "height", 600); |
| | | } else { |
| | | this.buffer(this.box, "height", 70); |
| | | } |
| | | this.flag = !this.flag; |
| | | console.log("æ¯å¦å±å¼", this.flag); |
| | | }, |
| | | // ç¹å»åªä¸ªpower |
| | | activeHandle(index,url) { |
| | | //ææä»¬èªå®ä¹ç䏿 èµå¼ |
| | | this.activeIndex = index; |
| | | this.$router.push({ |
| | | path: url, |
| | | }) |
| | | console.log("HHHH", index); |
| | | }, |
| | | // è·åè¦æ¹å徿 ·å¼å±æ§ |
| | | getStyleAttr(obj, attr) { |
| | | if (obj.currentStyle) { |
| | | // IE å opera |
| | | return obj.currentStyle[attr]; |
| | | } else { |
| | | return window.getComputedStyle(obj, null)[attr]; |
| | | } |
| | | }, |
| | | // å¨ç»å½æ° |
| | | buffer(eleObj, attr, target) { |
| | | // setIntervalæ¹å¼å¼å¯å¨ç» |
| | | //å
æ¸
å设 |
| | | // clearInterval(eleObj.timer); |
| | | // let speed = 0 |
| | | // let begin = 0 |
| | | // //è®¾ç½®å®æ¶å¨ |
| | | // eleObj.timer = setInterval(() => { |
| | | // //è·åå¨ç»å±æ§çåå§å¼ |
| | | // begin = parseInt(this.getStyleAttr(eleObj, attr)); |
| | | // speed = (target - begin) * 0.2; |
| | | // speed = target > begin ? Math.ceil(speed) : Math.floor(speed); |
| | | // eleObj.style[attr] = begin + speed + "px"; |
| | | // if (begin === target) { |
| | | // clearInterval(eleObj.timer); |
| | | // } |
| | | // }, 20); |
| | | // cancelAnimationFrameå¼å¯å¨ç» |
| | | // å
æ¸
å设 |
| | | cancelAnimationFrame(eleObj.timer); |
| | | let speed = 0; |
| | | let begin = 0; |
| | | let _this = this; |
| | | eleObj.timer = requestAnimationFrame(function fn() { |
| | | begin = parseInt(_this.getStyleAttr(eleObj, attr)); |
| | | // å¨ç»é度 |
| | | speed = (target - begin) * 0.9; |
| | | speed = target > begin ? Math.ceil(speed) : Math.floor(speed); |
| | | eleObj.style[attr] = begin + speed + "px"; |
| | | eleObj.timer = requestAnimationFrame(fn); |
| | | if (begin === target) { |
| | | cancelAnimationFrame(eleObj.timer); |
| | | } |
| | | }); |
| | | }, |
| | | /** |
| | | * çªå£resizeçå¬ |
| | | */ |
| | | handleResize() { |
| | | // this.clientWidth = document.documentElement.clientWidth; |
| | | // this.clientHeight = document.documentElement.clientHeight; |
| | | // console.log(window.innerWidth); |
| | | // console.log(document.documentElement.clientWidth); |
| | | |
| | | this.checkDraggablePosition(); |
| | | }, |
| | | /** |
| | | * åå§ådraggable |
| | | */ |
| | | initDraggable() { |
| | | this.floatDrag.addEventListener("touchstart", this.toucheStart); |
| | | this.floatDrag.addEventListener("touchmove", (e) => this.touchMove(e)); |
| | | this.floatDrag.addEventListener("touchend", this.touchEnd); |
| | | }, |
| | | mouseDown(e) { |
| | | const event = e || window.event; |
| | | this.mousedownX = event.screenX; |
| | | this.mousedownY = event.screenY; |
| | | const that = this; |
| | | let floatDragWidth = this.floatDragDom.width / 2; |
| | | let floatDragHeight = this.floatDragDom.height / 2; |
| | | if (event.preventDefault) { |
| | | event.preventDefault(); |
| | | methods: { |
| | | toggleExpand() { |
| | | this.isExpanded = !this.isExpanded; |
| | | if (this.isExpanded) { |
| | | this.isHidden = false; |
| | | clearTimeout(this.hideTimer); |
| | | this.updateStats(); |
| | | } |
| | | this.canClick = false; |
| | | this.floatDrag.style.transition = "none"; |
| | | document.onmousemove = function (e) { |
| | | var event = e || window.event; |
| | | that.left = event.clientX - floatDragWidth; |
| | | that.top = event.clientY - floatDragHeight; |
| | | if (that.left < 0) that.left = 0; |
| | | if (that.top < 0) that.top = 0; |
| | | // é¼ æ ç§»åºå¯è§åºååç»æé®è¿å |
| | | if ( |
| | | event.clientY < 0 || |
| | | event.clientY > Number(this.clientHeight) || |
| | | event.clientX > Number(this.clientWidth) || |
| | | event.clientX < 0 |
| | | ) { |
| | | this.right = 0; |
| | | this.top = |
| | | this.clientHeight - this.floatDragDom.height - this.distanceBottom; |
| | | document.onmousemove = null; |
| | | this.floatDrag.style.transition = "all 0.3s"; |
| | | return; |
| | | }, |
| | | |
| | | handleMouseEnter() { |
| | | this.isHovering = true; |
| | | if (this.autoHide) { |
| | | clearTimeout(this.hideTimer); |
| | | this.isHidden = false; |
| | | } |
| | | }, |
| | | |
| | | handleMouseLeave() { |
| | | this.isHovering = false; |
| | | if (this.autoHide && !this.isExpanded) { |
| | | this.startAutoHide(); |
| | | } |
| | | }, |
| | | |
| | | startAutoHide() { |
| | | this.hideTimer = setTimeout(() => { |
| | | if (!this.isExpanded && !this.isHovering) { |
| | | this.isHidden = true; |
| | | } |
| | | if ( |
| | | that.left >= |
| | | document.documentElement.clientWidth - floatDragWidth * 2 |
| | | ) { |
| | | that.left = document.documentElement.clientWidth - floatDragWidth * 2; |
| | | }, this.hideDelay); |
| | | }, |
| | | |
| | | startDrag(e) { |
| | | e.preventDefault(); |
| | | e.stopPropagation(); |
| | | this.isDragging = true; |
| | | |
| | | const clientX = e.type.includes("touch") |
| | | ? e.touches[0].clientX |
| | | : e.clientX; |
| | | const clientY = e.type.includes("touch") |
| | | ? e.touches[0].clientY |
| | | : e.clientY; |
| | | |
| | | this.dragStart = { |
| | | x: clientX - this.position.x, |
| | | y: clientY - this.position.y, |
| | | }; |
| | | |
| | | const onMove = (moveEvent) => { |
| | | if (!this.isDragging) return; |
| | | |
| | | const moveX = moveEvent.type.includes("touch") |
| | | ? moveEvent.touches[0].clientX |
| | | : moveEvent.clientX; |
| | | const moveY = moveEvent.type.includes("touch") |
| | | ? moveEvent.touches[0].clientY |
| | | : moveEvent.clientY; |
| | | |
| | | const newX = moveX - this.dragStart.x; |
| | | const newY = moveY - this.dragStart.y; |
| | | |
| | | // è¾¹çæ£æ¥ |
| | | const maxX = window.innerWidth - 60; |
| | | const maxY = window.innerHeight - 60; |
| | | |
| | | this.position.x = Math.max(0, Math.min(newX, maxX)); |
| | | this.position.y = Math.max(0, Math.min(newY, maxY)); |
| | | }; |
| | | |
| | | const onEnd = () => { |
| | | this.isDragging = false; |
| | | document.removeEventListener("mousemove", onMove); |
| | | document.removeEventListener("mouseup", onEnd); |
| | | document.removeEventListener("touchmove", onMove); |
| | | document.removeEventListener("touchend", onEnd); |
| | | |
| | | // 妿é è¿è¾¹ç¼ï¼èªå¨å¸é |
| | | if (this.position.x < 20) { |
| | | this.position.x = 0; |
| | | } else if (this.position.x > window.innerWidth - 80) { |
| | | this.position.x = window.innerWidth - 60; |
| | | } |
| | | if (that.top >= that.clientHeight - floatDragHeight * 2) { |
| | | that.top = that.clientHeight - floatDragHeight * 2; |
| | | |
| | | // ä¿åä½ç½®å°æ¬å°åå¨ |
| | | try { |
| | | localStorage.setItem( |
| | | "floatBallPosition", |
| | | JSON.stringify(this.position) |
| | | ); |
| | | } catch (e) { |
| | | console.error("ä¿åä½ç½®å¤±è´¥:", e); |
| | | } |
| | | }; |
| | | |
| | | document.addEventListener("mousemove", onMove); |
| | | document.addEventListener("mouseup", onEnd); |
| | | document.addEventListener("touchmove", onMove, { passive: false }); |
| | | document.addEventListener("touchend", onEnd); |
| | | }, |
| | | mouseUp(e) { |
| | | const event = e || window.event; |
| | | //å¤æåªæ¯å纯çç¹å»ï¼æ²¡æææ½ |
| | | |
| | | handleItemClick(item) { |
| | | if (item.url) { |
| | | console.log(item.url, "item.url"); |
| | | |
| | | // this.$router.push(item.url); |
| | | this.$router.replace({ |
| | | path: item.url, |
| | | query: { |
| | | errtype: item.urltype, |
| | | }, |
| | | }); |
| | | this.toggleExpand(); |
| | | } |
| | | }, |
| | | |
| | | handleActionClick(action) { |
| | | console.log(this.roles, "this.roles"); |
| | | if ( |
| | | this.mousedownY == event.screenY && |
| | | this.mousedownX == event.screenX |
| | | action.url && |
| | | (this.roles.includes("admin") || this.roles.includes("sysadmin")) |
| | | ) { |
| | | this.$emit("handlepaly"); |
| | | } |
| | | document.onmousemove = null; |
| | | this.checkDraggablePosition(); |
| | | this.floatDrag.style.transition = "all 0.3s"; |
| | | }, |
| | | toucheStart() { |
| | | this.canClick = false; |
| | | this.floatDrag.style.transition = "none"; |
| | | }, |
| | | touchMove(e) { |
| | | this.canClick = true; |
| | | if (e.targetTouches.length === 1) { |
| | | // åææå¨ |
| | | let touch = event.targetTouches[0]; |
| | | this.left = touch.clientX - this.floatDragDom.width / 2; |
| | | this.top = touch.clientY - this.floatDragDom.height / 2; |
| | | } |
| | | }, |
| | | touchEnd() { |
| | | if (!this.canClick) return; // è§£å³ç¹å»äºä»¶åtouchäºä»¶å²çªçé®é¢ |
| | | this.floatDrag.style.transition = "all 0.3s"; |
| | | this.checkDraggablePosition(); |
| | | }, |
| | | /** |
| | | * 夿å
ç´ æ¾ç¤ºä½ç½® |
| | | * å¨çªå£æ¹ååmove endæ¶è°ç¨ |
| | | */ |
| | | checkDraggablePosition() { |
| | | this.clientWidth = document.documentElement.clientWidth; |
| | | this.clientHeight = document.documentElement.clientHeight; |
| | | if (this.left + this.floatDragDom.width / 2 >= this.clientWidth / 2) { |
| | | // 夿ä½ç½®æ¯å¾å·¦å¾å³æ»å¨ |
| | | this.left = this.clientWidth - this.floatDragDom.width; |
| | | this.$router.replace(action.url); |
| | | this.toggleExpand(); |
| | | } else { |
| | | this.left = 0; |
| | | this.$modal.msgError("é管çåç¨æ·ææ åå»ºä»»å¡æé"); |
| | | } |
| | | if (this.top < 0) { |
| | | // 夿æ¯å¦è¶
åºå±å¹ä¸æ²¿ |
| | | this.top = 0; |
| | | }, |
| | | |
| | | async updateStats() { |
| | | try { |
| | | // è¿éå¯ä»¥æ¿æ¢ä¸ºå®é
ç API è°ç¨ |
| | | // const response = await this.$api.getFollowupStats() |
| | | // this.statsItems = response.data |
| | | |
| | | // æ¨¡ææ°æ®æ´æ° |
| | | const mockData = { |
| | | pending: { |
| | | value: "128", |
| | | unread: null, |
| | | trend: { type: "up", arrow: "â", value: "5" }, |
| | | }, |
| | | failed: { |
| | | value: "24", |
| | | unread: null, |
| | | trend: { type: "down", arrow: "â", value: "2" }, |
| | | }, |
| | | abnormal: { |
| | | value: "8", |
| | | unread: null, |
| | | trend: { type: "up", arrow: "â", value: "3" }, |
| | | }, |
| | | myTasks: { |
| | | value: "156", |
| | | unread: null, |
| | | trend: { type: "stable", arrow: "â", value: "0" }, |
| | | }, |
| | | }; |
| | | const response = await getCurrentUserServiceSubtaskCount(); |
| | | mockData.pending.value = response.pendingVisitCount; |
| | | mockData.failed.value = response.failedVisitCount; |
| | | mockData.abnormal.value = response.abnormalVisitCount; |
| | | mockData.myTasks.value = response.allVisitCount; |
| | | this.statsItems = this.statsItems.map((item) => { |
| | | const data = mockData[item.id] || {}; |
| | | return { |
| | | ...item, |
| | | value: data.value || item.value, |
| | | unread: data.unread || item.unread, |
| | | trend: data.trend || item.trend, |
| | | }; |
| | | }); |
| | | |
| | | // æ´æ°æ¶é´ |
| | | const now = new Date(); |
| | | this.updateTime = `${now.getHours().toString().padStart(2, "0")}:${now |
| | | .getMinutes() |
| | | .toString() |
| | | .padStart(2, "0")}`; |
| | | } catch (error) { |
| | | console.error("æ´æ°ç»è®¡æ°æ®å¤±è´¥:", error); |
| | | } |
| | | if (this.top + this.floatDragDom.height >= this.clientHeight) { |
| | | // 夿æ¯å¦è¶
åºå±å¹ä¸æ²¿ |
| | | this.top = this.clientHeight - this.floatDragDom.height; |
| | | }, |
| | | |
| | | loadPosition() { |
| | | try { |
| | | const savedPosition = localStorage.getItem("floatBallPosition"); |
| | | if (savedPosition) { |
| | | const parsed = JSON.parse(savedPosition); |
| | | this.position = parsed; |
| | | } |
| | | } catch (e) { |
| | | console.error("å è½½ä½ç½®å¤±è´¥:", e); |
| | | } |
| | | }, |
| | | |
| | | handleClickOutside(e) { |
| | | if ( |
| | | this.isExpanded && |
| | | this.$refs.floatBall && |
| | | !this.$refs.floatBall.contains(e.target) |
| | | ) { |
| | | this.toggleExpand(); |
| | | } |
| | | }, |
| | | |
| | | handleResize() { |
| | | const maxX = window.innerWidth - 60; |
| | | const maxY = window.innerHeight - 60; |
| | | |
| | | this.position.x = Math.min(this.position.x, maxX); |
| | | this.position.y = Math.min(this.position.y, maxY); |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | | <style> |
| | | html, |
| | | body { |
| | | overflow: hidden; |
| | | } |
| | | </style> |
| | | <style scoped lang="scss"> |
| | | .float-position { |
| | | |
| | | <style scoped> |
| | | .float-ball { |
| | | position: fixed; |
| | | z-index: 10003 !important; |
| | | left: 0; |
| | | top: 20%; |
| | | width: 70px; |
| | | height: 70px; |
| | | border-radius: 32px; |
| | | z-index: 9999; |
| | | transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); |
| | | pointer-events: auto; |
| | | } |
| | | |
| | | .float-ball-hidden { |
| | | opacity: 0.3; |
| | | transform: translateX(10px); |
| | | } |
| | | |
| | | .float-ball-hidden:hover { |
| | | opacity: 1; |
| | | transform: translateX(0); |
| | | } |
| | | |
| | | .ball-main { |
| | | width: 60px; |
| | | height: 60px; |
| | | border-radius: 50%; |
| | | background: linear-gradient(135deg, var(--primary-color), #7c3aed); |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | cursor: move; |
| | | box-shadow: 0 4px 20px rgba(79, 70, 229, 0.3); |
| | | transition: all 0.3s ease; |
| | | position: relative; |
| | | z-index: 10000; |
| | | } |
| | | |
| | | .ball-main:hover { |
| | | background: linear-gradient(135deg, var(--hover-color), #6d28d9); |
| | | box-shadow: 0 6px 25px rgba(79, 70, 229, 0.4); |
| | | transform: scale(1.05); |
| | | } |
| | | |
| | | .ball-main-expanded { |
| | | background: linear-gradient(135deg, #6366f1, #8b5cf6); |
| | | } |
| | | |
| | | .ball-icon { |
| | | width: 24px; |
| | | height: 24px; |
| | | color: white; |
| | | } |
| | | |
| | | .fold-icon { |
| | | width: 100%; |
| | | height: 100%; |
| | | } |
| | | |
| | | .close-btn { |
| | | width: 24px; |
| | | height: 24px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | cursor: pointer; |
| | | overflow: hidden; |
| | | user-select: none; |
| | | color: white; |
| | | transition: transform 0.2s ease; |
| | | } |
| | | |
| | | display: block; |
| | | background: black; |
| | | background: -webkit-radial-gradient(100px 100px, circle, #5788FE, #292929); |
| | | // background: -moz-radial-gradient(100px 100px, circle, #35a1a1, #000);Firefox æµè§å¨çå®ç° |
| | | // background: radial-gradient(100px 100px, circle, #35a1a1, #000);æ å HTML5 屿§ |
| | | margin: 0; |
| | | .drag { |
| | | width: 70px; |
| | | height: 35px; |
| | | // background: #f2e96a; |
| | | text-align: center; |
| | | line-height: 35px; |
| | | border-bottom: 1px solid #fff; |
| | | .close-btn:hover { |
| | | transform: rotate(90deg); |
| | | } |
| | | |
| | | .close-icon { |
| | | width: 20px; |
| | | height: 20px; |
| | | } |
| | | |
| | | .ball-badge { |
| | | position: absolute; |
| | | top: -5px; |
| | | right: -5px; |
| | | min-width: 20px; |
| | | height: 20px; |
| | | padding: 0 6px; |
| | | background: #ef4444; |
| | | color: white; |
| | | font-size: 12px; |
| | | font-weight: 600; |
| | | border-radius: 10px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | border: 2px solid white; |
| | | animation: pulse 2s infinite; |
| | | } |
| | | |
| | | @keyframes pulse { |
| | | 0%, |
| | | 100% { |
| | | transform: scale(1); |
| | | } |
| | | .content { |
| | | width: 70px; |
| | | height: 35px; |
| | | // background: #716af2; |
| | | .label { |
| | | width: 70px; |
| | | height: 35px; |
| | | text-align: center; |
| | | line-height: 35px; |
| | | color: white; |
| | | } |
| | | .label:hover { |
| | | color: rgb(19, 217, 243); |
| | | transition: all 0.5; |
| | | } |
| | | |
| | | .item-container { |
| | | margin-top: 10px; |
| | | width: 70px; |
| | | height: 500px; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | flex-direction: column; |
| | | |
| | | .power-item { |
| | | width: 40px; |
| | | height: 40px; |
| | | border-radius: 50%; |
| | | background-color: #f1f7ff; |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | flex-direction: column; |
| | | } |
| | | .des { |
| | | width: 40px; |
| | | text-align: center; |
| | | margin-bottom: 5px; |
| | | font-size: 10px; |
| | | color: #fff; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .close { |
| | | width: 20px; |
| | | height: 20px; |
| | | border-radius: 50%; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | color: #fff; |
| | | background: rgba(0, 0, 0, 0.6); |
| | | position: absolute; |
| | | right: -10px; |
| | | top: -12px; |
| | | cursor: pointer; |
| | | 50% { |
| | | transform: scale(1.1); |
| | | } |
| | | } |
| | | |
| | | .cart { |
| | | border-radius: 50%; |
| | | width: 5em; |
| | | height: 5em; |
| | | .ball-content { |
| | | position: absolute; |
| | | top: 70px; |
| | | left: 0; |
| | | width: 320px; |
| | | background: white; |
| | | border-radius: 16px; |
| | | box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1); |
| | | overflow: hidden; |
| | | z-index: 9999; |
| | | } |
| | | |
| | | .ball-expand-enter-active, |
| | | .ball-expand-leave-active { |
| | | transition: all 0.3s ease; |
| | | } |
| | | |
| | | .ball-expand-enter, |
| | | .ball-expand-leave-to { |
| | | opacity: 0; |
| | | transform: translateY(-10px); |
| | | } |
| | | |
| | | .content-header { |
| | | padding: 20px 20px 16px; |
| | | background: linear-gradient(135deg, var(--primary-color), #7c3aed); |
| | | color: white; |
| | | } |
| | | |
| | | .content-header h3 { |
| | | margin: 0 0 8px 0; |
| | | font-size: 18px; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .update-time { |
| | | font-size: 12px; |
| | | opacity: 0.9; |
| | | } |
| | | |
| | | .stats-grid { |
| | | padding: 16px; |
| | | display: grid; |
| | | grid-template-columns: 1fr 1fr; |
| | | gap: 12px; |
| | | } |
| | | |
| | | .stat-item { |
| | | padding: 16px; |
| | | background: #f8fafc; |
| | | border-radius: 12px; |
| | | cursor: pointer; |
| | | transition: all 0.2s ease; |
| | | position: relative; |
| | | border: 2px solid transparent; |
| | | } |
| | | |
| | | .stat-item:hover { |
| | | background: #f1f5f9; |
| | | border-color: #e2e8f0; |
| | | transform: translateY(-2px); |
| | | } |
| | | |
| | | .stat-item-highlight { |
| | | border-color: var(--primary-color); |
| | | background: linear-gradient(to bottom right, #f0f9ff, #f8fafc); |
| | | } |
| | | |
| | | .stat-icon { |
| | | width: 32px; |
| | | height: 32px; |
| | | background: white; |
| | | border-radius: 8px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | margin-bottom: 12px; |
| | | color: var(--primary-color); |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); |
| | | } |
| | | |
| | | .stat-icon svg { |
| | | width: 18px; |
| | | height: 18px; |
| | | } |
| | | |
| | | .stat-label { |
| | | font-size: 12px; |
| | | color: #64748b; |
| | | margin-bottom: 4px; |
| | | } |
| | | |
| | | .stat-value { |
| | | font-size: 20px; |
| | | font-weight: 700; |
| | | color: #1e293b; |
| | | margin-bottom: 4px; |
| | | } |
| | | |
| | | .stat-trend { |
| | | font-size: 11px; |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 2px; |
| | | } |
| | | |
| | | .trend-up { |
| | | color: #10b981; |
| | | } |
| | | |
| | | .trend-down { |
| | | color: #ef4444; |
| | | } |
| | | |
| | | .trend-stable { |
| | | color: #64748b; |
| | | } |
| | | |
| | | .trend-arrow { |
| | | font-size: 10px; |
| | | } |
| | | |
| | | .stat-badge { |
| | | position: absolute; |
| | | top: 12px; |
| | | right: 12px; |
| | | min-width: 18px; |
| | | height: 18px; |
| | | padding: 0 4px; |
| | | background: #ef4444; |
| | | color: white; |
| | | font-size: 10px; |
| | | font-weight: 600; |
| | | border-radius: 9px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .header-notice { |
| | | display: inline-block; |
| | | transition: all 0.3s; |
| | | |
| | | span { |
| | | vertical-align: initial; |
| | | } |
| | | |
| | | .notice-badge { |
| | | color: inherit; |
| | | |
| | | .header-notice-icon { |
| | | font-size: 16px; |
| | | padding: 4px; |
| | | } |
| | | } |
| | | .quick-actions { |
| | | padding: 12px 20px 20px; |
| | | border-top: 1px solid #f1f5f9; |
| | | display: flex; |
| | | gap: 12px; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .drag-ball .drag-content { |
| | | overflow-wrap: break-word; |
| | | font-size: 14px; |
| | | color: #fff; |
| | | letter-spacing: 2px; |
| | | .action-item { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | gap: 8px; |
| | | cursor: pointer; |
| | | padding: 12px; |
| | | border-radius: 8px; |
| | | transition: all 0.2s ease; |
| | | flex: 1; |
| | | } |
| | | |
| | | .active { |
| | | background-color: #f9f1db !important; |
| | | .action-item:hover { |
| | | background: #f8fafc; |
| | | } |
| | | .active-des { |
| | | color: #71dcfa !important; |
| | | font-size: 20px !important; |
| | | font-weight: 500 !important; |
| | | |
| | | .action-icon { |
| | | width: 24px; |
| | | height: 24px; |
| | | color: var(--primary-color); |
| | | } |
| | | |
| | | .action-icon svg { |
| | | width: 20px; |
| | | height: 20px; |
| | | } |
| | | |
| | | .action-label { |
| | | font-size: 12px; |
| | | color: #475569; |
| | | font-weight: 500; |
| | | } |
| | | </style> |
| | |
| | | } else if (orgid == "47231077933110211A1101") { |
| | | localStorage.setItem("orgname", "è²é½åºäººæ°å»é¢"); |
| | | localStorage.setItem("ZuHuID", "1429338802177000011"); |
| | | localStorage.setItem("deptCode", ""); |
| | | localStorage.setItem("deptCode", "01020901"); |
| | | localStorage.setItem("YongHuID", "1512710152715767808"); |
| | | localStorage.setItem("YongHuXM", "LDRMYY"); |
| | | } else if (orgid == "1" && campusid == 1) { |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="Questionnairemanagement"> |
| | | <div class="leftvlue"> |
| | | <div class="leftvlue-bg"> |
| | | <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="98px" |
| | | > |
| | | <el-form-item label="ç»è®¡ç±»å" prop="userName"> |
| | | <el-select |
| | | v-model="queryParams.statisticaltype" |
| | | placeholder="è¯·éæ©ç»è®¡ç±»å" |
| | | > |
| | | <el-option |
| | | v-for="item in Statisticallist" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | <el-select |
| | | style="margin-left: 10px" |
| | | v-if="queryParams.statisticaltype == 1" |
| | | v-model="queryParams.leavehospitaldistrictcodes" |
| | | size="medium" |
| | | multiple |
| | | filterable |
| | | placeholder="è¯·éæ©ç
åº" |
| | | > |
| | | <el-option |
| | | v-for="item in flatArrayhospit" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | <el-select |
| | | v-else-if="queryParams.statisticaltype == 2" |
| | | v-model="queryParams.deptcodes" |
| | | size="medium" |
| | | multiple |
| | | filterable |
| | | placeholder="è¯·éæ©ç§å®¤" |
| | | > |
| | | <el-option |
| | | v-for="item in flatArraydept" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="æå¡ç±»å" prop="userName"> |
| | | <el-select |
| | | v-model="queryParams.serviceType" |
| | | multiple |
| | | placeholder="è¯·éæ©" |
| | | > |
| | | <el-option |
| | | v-for="item in options" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item |
| | | label-width="200" |
| | | label="é访æ¶é´èå´" |
| | | prop="userName" |
| | | > |
| | | <el-date-picker |
| | | v-model="queryParams.dateRange" |
| | | value-format="yyyy-MM-dd" |
| | | type="daterange" |
| | | range-separator="è³" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | > |
| | | </el-date-picker> |
| | | </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-col :span="19"> |
| | | <el-button |
| | | type="warning" |
| | | plain |
| | | icon="el-icon-download" |
| | | size="medium" |
| | | @click="handleExport" |
| | | >导åº</el-button |
| | | > |
| | | <el-button |
| | | type="primary" |
| | | plain |
| | | icon="el-icon-data-line" |
| | | size="medium" |
| | | @click="showChartDialog" |
| | | >ç»è®¡è¶å¿å¾</el-button |
| | | > |
| | | </el-col> |
| | | </el-form> |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="userList" |
| | | :border="true" |
| | | @selection-change="handleSelectionChange" |
| | | :row-key="getRowKey" |
| | | :expand-row-keys="expands" |
| | | > |
| | | <el-table-column |
| | | label="åºé¢ç
åº" |
| | | align="center" |
| | | sortable |
| | | key="leavehospitaldistrictname" |
| | | prop="leavehospitaldistrictname" |
| | | :show-overflow-tooltip="true" |
| | | /> |
| | | <el-table-column |
| | | label="ç§å®¤" |
| | | align="center" |
| | | key="deptname" |
| | | prop="deptname" |
| | | :show-overflow-tooltip="true" |
| | | /> |
| | | <el-table-column |
| | | label="åºé¢äººæ¬¡" |
| | | align="center" |
| | | key="dischargeCount" |
| | | prop="dischargeCount" |
| | | > |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="æ éé访人次" |
| | | align="center" |
| | | key="nonFollowUp" |
| | | prop="nonFollowUp" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="åºé访人次" |
| | | align="center" |
| | | key="followUpNeeded" |
| | | prop="followUpNeeded" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="é访ç" |
| | | align="center" |
| | | key="followUpRate" |
| | | prop="followUpRate" |
| | | > |
| | | <!-- <template slot-scope="scope"> |
| | | <span |
| | | >{{ |
| | | (Number(scope.row.followUpRate) * 100).toFixed(2) |
| | | }}%</span |
| | | > |
| | | </template> --> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="åæ¶ç" |
| | | align="center" |
| | | key="rate" |
| | | prop="rate" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click="Seedetails(scope.row)" |
| | | ><span class="button-zx" |
| | | >{{ (Number(scope.row.rate) * 100).toFixed(2) }}%</span |
| | | ></el-button |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="满æåº¦é¢ç®æ»é" |
| | | align="center" |
| | | key="joyAllCount" |
| | | prop="joyAllCount" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="满æåº¦å¡«æ¥é" |
| | | align="center" |
| | | key="joyCount" |
| | | prop="joyCount" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="宿æ¯ç" |
| | | align="center" |
| | | key="joyTotal" |
| | | prop="joyTotal" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span class="button-zx" |
| | | >{{ (Number(scope.row.joyTotal) * 100).toFixed(2) }}%</span |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æä½" |
| | | align="center" |
| | | fixed="right" |
| | | width="300" |
| | | class-name="small-padding fixed-width" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click="getinfo(scope.row)" |
| | | ><span class="button-zx" |
| | | ><i class="el-icon-s-order"></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> |
| | | </div> |
| | | <!-- ç»è®¡è¶å¿å¾å¼¹çª --> |
| | | <el-dialog |
| | | title="é访ç»è®¡è¶å¿å¾" |
| | | :visible.sync="chartDialogVisible" |
| | | width="80%" |
| | | :close-on-click-modal="false" |
| | | > |
| | | <div class="chart-container"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <div class="chart-title">éè®¿ç¶æåå¸</div> |
| | | <div id="pieChart" style="width: 100%; height: 400px"></div> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <div class="chart-title">é访è¶å¿åæ</div> |
| | | <div id="barLineChart" style="width: 100%; height: 400px"></div> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | </el-dialog> |
| | | <el-dialog |
| | | title="æªåæ¶é访æ£è
æå¡" |
| | | :visible.sync="SeedetailsVisible" |
| | | v-loading="Seedloading" |
| | | width="70%" |
| | | :close-on-click-modal="false" |
| | | > |
| | | <div class="examine-jic"> |
| | | <div class="jic-value"> |
| | | <el-row :gutter="20"> |
| | | <!--ç¨æ·æ°æ®--> |
| | | <el-form |
| | | :model="patientqueryParams" |
| | | ref="queryForm" |
| | | size="small" |
| | | :inline="true" |
| | | label-width="98px" |
| | | > |
| | | <el-form-item label="æ£è
ï¼"> |
| | | <el-input |
| | | v-model="patientqueryParams.name" |
| | | @keyup.enter.native="handleQuery" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="æ£è
è¯æï¼"> |
| | | <el-input |
| | | v-model="patientqueryParams.leavediagname" |
| | | @keyup.enter.native="handleQuery" |
| | | ></el-input> |
| | | </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-table :data="logsheetlist" style="width: 100%"> |
| | | <el-table-column |
| | | prop="sendname" |
| | | align="center" |
| | | label="å§å" |
| | | width="100" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="taskName" |
| | | align="center" |
| | | width="200" |
| | | show-overflow-tooltip |
| | | label="ä»»å¡åç§°" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="sendstate" |
| | | align="center" |
| | | width="200" |
| | | label="ä»»å¡ç¶æ" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <div v-if="scope.row.sendstate == 1"> |
| | | <el-tag type="primary" :disable-transitions="false" |
| | | >表åå·²é¢å</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 2"> |
| | | <el-tag type="primary" :disable-transitions="false" |
| | | >å¾
é访</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 3"> |
| | | <el-tag type="success" :disable-transitions="false" |
| | | >表åå·²åé</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 4"> |
| | | <el-tag type="info" :disable-transitions="false" |
| | | >䏿§è¡</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 5"> |
| | | <el-tag type="danger" :disable-transitions="false" |
| | | >åé失败</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 6"> |
| | | <el-tag type="success" :disable-transitions="false" |
| | | >已宿</el-tag |
| | | > |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="visitTime" |
| | | align="center" |
| | | label="åºé访æ¶é´" |
| | | width="200" |
| | | show-overflow-tooltip |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="finishtime" |
| | | align="center" |
| | | label="éè®¿å®ææ¶é´" |
| | | width="200" |
| | | show-overflow-tooltip |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="åºé¢æ¥æ" |
| | | width="200" |
| | | align="center" |
| | | key="endtime" |
| | | prop="endtime" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatTime(scope.row.endtime) }}</span> |
| | | </template></el-table-column |
| | | > |
| | | <el-table-column |
| | | label="责任æ¤å£«" |
| | | width="120" |
| | | align="center" |
| | | key="nurseName" |
| | | prop="nurseName" |
| | | /> |
| | | <el-table-column |
| | | label="主治å»ç" |
| | | width="120" |
| | | align="center" |
| | | key="drname" |
| | | prop="drname" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="ç»æç¶æ" |
| | | align="center" |
| | | key="excep" |
| | | prop="excep" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_yujing" |
| | | :value="scope.row.excep" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="å¤çæè§" |
| | | align="center" |
| | | key="suggest" |
| | | prop="suggest" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_suggest" |
| | | :value="scope.row.suggest" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | prop="templatename" |
| | | align="center" |
| | | label="æå¡æ¨¡æ¿" |
| | | width="200" |
| | | show-overflow-tooltip |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="remark" |
| | | align="center" |
| | | label="æå¡è®°å½" |
| | | width="200" |
| | | show-overflow-tooltip |
| | | > |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | prop="bankcardno" |
| | | align="center" |
| | | label="å¼å«ç¶æ" |
| | | width="210" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æä½" |
| | | fixed="right" |
| | | align="center" |
| | | width="200" |
| | | class-name="small-padding fixed-width" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="medium" |
| | | type="text" |
| | | @click="SeedetailsgGo(scope.row)" |
| | | ><span class="button-zx" |
| | | ><i class="el-icon-s-order"></i>æ¥ç</span |
| | | ></el-button |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-row> |
| | | <pagination |
| | | v-show="patienttotal > 0 && this.patientqueryParams.allhosp != 6" |
| | | :total="patienttotal" |
| | | :page.sync="patientqueryParams.pn" |
| | | :limit.sync="patientqueryParams.ps" |
| | | @pagination="Seedetails" |
| | | /> |
| | | </div> |
| | | </div> |
| | | </el-dialog> |
| | | <!-- åç§å®¤ç»è®¡è¯¦æ
--> |
| | | <el-dialog :visible.sync="topicVisible" width="45%"> |
| | | <div class="topicdia"> |
| | | <div class="top-text"> |
| | | {{ topicvalue.name }}<span>满æåº¦ææ 详æ
</span> |
| | | </div> |
| | | <div style="overflow-x: hidden; overflow-y: auto; max-height: 65vh"> |
| | | <div |
| | | class="ttaabbcc" |
| | | v-for="(item, index) in topiclist" |
| | | :key="item.name" |
| | | > |
| | | <div class="describe"> |
| | | 第{{ index }}é¢ï¼ {{ item.scriptContent }}?<span |
| | | >[{{ item.scriptType == 1 ? "åéé¢" : "å¤éé¢" }}]</span |
| | | > |
| | | </div> |
| | | <div> |
| | | <el-table :data="item.details" style="width: 100%"> |
| | | <el-table-column prop="optionText" label="é®é¢é项"> |
| | | </el-table-column> |
| | | <el-table-column prop="chosenQuantity" label="éæ©äººæ°"> |
| | | </el-table-column> |
| | | <el-table-column prop="chosenPercentage" label="æ¯ä¾"> |
| | | <template slot-scope="scope"> |
| | | <span class="button-zx" |
| | | >{{ |
| | | (Number(scope.row.chosenPercentage) * 100).toFixed(2) |
| | | }}%</span |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="topicVisible = false">å
³ é</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { |
| | | toamendtag, |
| | | addapitag, |
| | | deletetag, |
| | | changetagcategory, |
| | | } from "@/api/system/label"; |
| | | import store from "@/store"; |
| | | import { |
| | | getSfStatisticsJoy, |
| | | getSfStatisticsJoyInfo, |
| | | selectTimelyRate, |
| | | } from "@/api/system/user"; |
| | | import ExcelJS from "exceljs"; |
| | | import { saveAs } from "file-saver"; |
| | | import Treeselect from "@riophae/vue-treeselect"; |
| | | import "@riophae/vue-treeselect/dist/vue-treeselect.css"; |
| | | const shortcuts = [ |
| | | { |
| | | text: "ä»å¤©", |
| | | onClick(picker) { |
| | | picker.$emit("pick", new Date()); |
| | | }, |
| | | }, |
| | | { |
| | | text: "æ¨å¤©", |
| | | onClick(picker) { |
| | | const date = new Date(); |
| | | date.setTime(date.getTime() - 3600 * 1000 * 24); |
| | | picker.$emit("pick", date); |
| | | }, |
| | | }, |
| | | { |
| | | text: "ä¸å¨å", |
| | | onClick(picker) { |
| | | const date = new Date(); |
| | | date.setTime(date.getTime() - 3600 * 1000 * 24 * 7); |
| | | picker.$emit("pick", date); |
| | | }, |
| | | }, |
| | | ]; |
| | | export default { |
| | | name: "Percentage", |
| | | dicts: ["sys_normal_disable", "sys_user_sex"], |
| | | components: { Treeselect }, |
| | | data() { |
| | | return { |
| | | topactiveName: "Local", //é¡¶é¨éæ© |
| | | activeName: "first", //ä¾§è¾¹éæ© |
| | | expands: [], |
| | | // é®ç½©å± |
| | | loading: false, |
| | | Seedloading: false, |
| | | chartDialogVisible: false, |
| | | pieChart: null, |
| | | barLineChart: null, |
| | | // é䏿°ç» |
| | | ids: [], |
| | | // éå个ç¦ç¨ |
| | | single: true, |
| | | // éå¤ä¸ªç¦ç¨ |
| | | multiple: true, |
| | | // æ¾ç¤ºæç´¢æ¡ä»¶ |
| | | showSearch: true, |
| | | idds: "", //åç±»id |
| | | // æ»æ¡æ° |
| | | total: 0, |
| | | flatArrayhospit: [], |
| | | flatArraydept: [], |
| | | patienttotal: 0, |
| | | logsheetlist: [], |
| | | Statisticallist: [ |
| | | { |
| | | label: "ç
åºç»è®¡", |
| | | value: 1, |
| | | }, |
| | | { |
| | | label: "ç§å®¤ç»è®¡", |
| | | value: 2, |
| | | }, |
| | | ], |
| | | patientqueryParams: { |
| | | pn: 1, |
| | | ps: 10, |
| | | }, |
| | | topiclist: [ |
| | | { |
| | | name: "æ¨ç身ä½åº·å¤æ
åµå¦ä½", |
| | | number: 1, |
| | | type: 1, |
| | | }, |
| | | { |
| | | name: "æ¨ç饮飿
åµå¦ä½", |
| | | number: 2, |
| | | type: 2, |
| | | }, |
| | | { |
| | | name: "æ¨çæ¢å¤æ
åµå¦ä½", |
| | | number: 3, |
| | | type: 1, |
| | | }, |
| | | ], |
| | | tableData: [ |
| | | { |
| | | date: "好", |
| | | name: 12, |
| | | address: "50%", |
| | | }, |
| | | { |
| | | date: "ä¸è¬", |
| | | name: 2, |
| | | address: "6.2%", |
| | | }, |
| | | { |
| | | date: "å·®", |
| | | name: 0, |
| | | address: "0%", |
| | | }, |
| | | ], |
| | | amendtag: false, //æ¯å¦ä¿®æ¹ç±»å« |
| | | lstamendtag: false, //æ¯å¦ä¿®æ¹æ ç¾ |
| | | scavisible: false, //å é¤å¼¹æ¡ |
| | | deleteVisible: false, //åç±»å é¤å¼¹æ¡ |
| | | deletefenl: "é«è¡å", //å é¤é¡¹ |
| | | //ä¿®æ¹æ·»å æ ç¾å¼¹æ¡æ°æ® |
| | | tagform: { |
| | | isupload: "", |
| | | tagname: "", |
| | | tagcategoryid: "", |
| | | tagdescription: "", |
| | | }, |
| | | classifyform: { |
| | | categoryname: "", |
| | | }, |
| | | // æ ç¾è¡¨æ ¼æ°æ® |
| | | userList: [], |
| | | // å¼¹åºå±æ é¢ |
| | | title: "", |
| | | // æ¯å¦æ¾ç¤ºå¼¹åºå± |
| | | open: false, |
| | | // æ¥æèå´ |
| | | dateRange: [], |
| | | // å²ä½é项 |
| | | postOptions: [], |
| | | // è§è²é项 |
| | | roleOptions: [], |
| | | // å卿æç§å®¤ä»£ç |
| | | allDeptCodes: [], |
| | | // å卿æç
åºä»£ç |
| | | allWardCodes: [], |
| | | // 表ååæ° |
| | | form: {}, |
| | | forms: { |
| | | name: "", |
| | | }, |
| | | numberlb: 22, |
| | | dialogFormVisible: false, //æ·»å ãä¿®æ¹ç±»å«å¼¹æ¡ |
| | | lstamendtagVisible: false, //æ·»å ãä¿®æ¹æ ç¾å¼¹æ¡ |
| | | goQRCodeVisible: false, //äºç»´ç å¼¹æ¡ |
| | | topicVisible: false, //æ§å¶åé¢å¼¹æ¡ |
| | | topicvalue: { |
| | | name: "骨ç§é访模æ¿", |
| | | number: 222, |
| | | }, |
| | | sidecolumnval: "", //ç±»å«æç´¢ |
| | | propss: { multiple: true }, |
| | | SeedetailsVisible: false, |
| | | options: store.getters.tasktypes, |
| | | pickerOptions: { |
| | | disabledDate(time) { |
| | | return time.getTime() < Date.now() - 3600 * 1000 * 24; |
| | | }, |
| | | shortcuts: shortcuts, |
| | | }, |
| | | pickerOptionsa: { |
| | | disabledDate(time) { |
| | | return time.getTime() > Date.now(); |
| | | }, |
| | | shortcuts: shortcuts, |
| | | }, |
| | | // æ¥è¯¢æ ç¾åè¡¨åæ° |
| | | queryParams: { |
| | | serviceType: [2], |
| | | dateRange: [], |
| | | statisticaltype: 1, |
| | | leavehospitaldistrictcodes: ["all"], // é»è®¤éä¸å
¨é¨ç
åº |
| | | deptcodes: [], // é»è®¤éä¸å
¨é¨ç§å®¤ |
| | | }, |
| | | // åä¿¡æ¯ |
| | | columns: [ |
| | | { key: 0, label: `æ ç¾ç¼å·`, visible: true }, |
| | | { key: 1, label: `æ ç¾åç§°`, visible: true }, |
| | | { key: 2, label: `æ ç¾æµç§°`, visible: true }, |
| | | { key: 3, label: `é¨é¨`, visible: true }, |
| | | { key: 4, label: `ææºå·ç `, visible: true }, |
| | | { key: 5, label: `ç¶æ`, visible: true }, |
| | | { key: 6, label: `å建æ¶é´`, visible: true }, |
| | | ], |
| | | }; |
| | | }, |
| | | watch: {}, |
| | | created() { |
| | | this.getDeptTree(); |
| | | this.getList(); |
| | | }, |
| | | |
| | | methods: { |
| | | /** æ¥è¯¢æ ç¾å表 */ |
| | | getList() { |
| | | // å¤çæ¥è¯¢åæ° |
| | | const params = { |
| | | configKey: "joyCount", |
| | | ...this.queryParams, |
| | | // 妿鿩äº"å
¨é¨"ï¼åä¼ ææç
åº/ç§å®¤ä»£ç |
| | | leavehospitaldistrictcodes: |
| | | this.queryParams.leavehospitaldistrictcodes.includes("all") |
| | | ? this.allWardCodes |
| | | : this.queryParams.leavehospitaldistrictcodes, |
| | | deptcodes: this.queryParams.deptcodes.includes("all") |
| | | ? this.allDeptCodes |
| | | : this.queryParams.deptcodes, |
| | | }; |
| | | this.loading = true; |
| | | |
| | | // ç§»é¤å¯è½åå¨ç"all"å¼ |
| | | delete params.leavehospitaldistrictcodes.all; |
| | | delete params.deptcodes.all; |
| | | getSfStatisticsJoy(params).then((response) => { |
| | | this.loading = false; |
| | | |
| | | this.total = response.total; |
| | | this.userList = response.data; |
| | | }); |
| | | }, |
| | | getRowKey(row) { |
| | | return row.statisticaltype === 1 |
| | | ? row.leavehospitaldistrictcode |
| | | : row.deptcode; |
| | | }, |
| | | /** ä¿®æ¹æ ç¾ */ |
| | | handleUpdate(row) { |
| | | console.log(row, "ä¿®æ¹æ ç¾"); |
| | | this.lstamendtagVisible = true; |
| | | this.lstamendtag = true; |
| | | this.tagform = { |
| | | isupload: row.isupload, |
| | | tagname: row.tagname, |
| | | tagcategoryid: row.tagcategoryid, |
| | | tagdescription: row.tagdescription, |
| | | tagid: row.tagid, |
| | | }; |
| | | }, |
| | | // è·åç§å®¤æ |
| | | getDeptTree() { |
| | | // ç§å®¤å表 |
| | | this.flatArraydept = store.getters.belongDepts.map((dept) => { |
| | | return { |
| | | label: dept.deptName, |
| | | value: dept.deptCode, |
| | | }; |
| | | }); |
| | | // å卿æç§å®¤ä»£ç |
| | | this.allDeptCodes = store.getters.belongDepts.map( |
| | | (dept) => dept.deptCode |
| | | ); |
| | | |
| | | // ç
åºå表 |
| | | this.flatArrayhospit = store.getters.belongWards.map((ward) => { |
| | | return { |
| | | label: ward.districtName, |
| | | value: ward.districtCode, |
| | | }; |
| | | }); |
| | | |
| | | // å卿æç
åºä»£ç |
| | | this.allWardCodes = store.getters.belongWards.map( |
| | | (ward) => ward.districtCode |
| | | ); |
| | | this.flatArraydept.push({ label: "å
¨é¨", value: "all" }); |
| | | this.flatArrayhospit.push({ label: "å
¨é¨", value: "all" }); |
| | | }, |
| | | flattenArray(multiArray) { |
| | | let result = []; |
| | | |
| | | // éå½å½æ°ï¼ç¨äºå°å¤çº§æ°ç»è½¬æ¢ä¸ºä¸ç»´æ°ç»ï¼åªå
嫿åºå±çå
ç´ |
| | | function flatten(element) { |
| | | // 妿å½åå
ç´ æåå
ç´ ï¼ç»§ç»éå½ |
| | | if (element.children && element.children.length > 0) { |
| | | element.children.forEach((child) => flatten(child)); |
| | | } else { |
| | | // å
éå
ç´ ä»¥é¿å
ä¿®æ¹åå§æ°æ® |
| | | let item = JSON.parse(JSON.stringify(element)); |
| | | result.push(item); // å°æåºå±çå
ç´ æ·»å å°ç»ææ°ç» |
| | | } |
| | | } |
| | | |
| | | // ä»é¡¶å±å
ç´ å¼å§éå½ |
| | | multiArray.forEach((element) => flatten(element)); |
| | | return result; // è¿ååªå
嫿åºå±å
ç´ çä¸ç»´æ°ç» |
| | | }, |
| | | addladeltag() { |
| | | this.lstamendtagVisible = true; |
| | | this.lstamendtag = false; |
| | | this.tagform = { |
| | | isupload: "", |
| | | tagname: "", |
| | | tagcategoryid: "", |
| | | tagdescription: "", |
| | | tagid: "", |
| | | }; |
| | | }, |
| | | Seedetails(row) { |
| | | this.SeedetailsVisible = true; |
| | | this.Seedloading = true; |
| | | this.patientqueryParams.starttime = this.parseTime( |
| | | this.queryParams.dateRange[0] |
| | | ); |
| | | this.patientqueryParams.endtime = this.parseTime( |
| | | this.queryParams.dateRange[1] |
| | | ); |
| | | this.patientqueryParams.deptcode = row.deptcode; |
| | | selectTimelyRate(this.patientqueryParams).then((response) => { |
| | | this.logsheetlist = response.data.detail; |
| | | this.patienttotal = response.data.total; |
| | | this.Seedloading = false; |
| | | }); |
| | | }, |
| | | SeedetailsgGo(row) { |
| | | this.SeedetailsVisible = false; |
| | | let type = ""; |
| | | if (row.preachformson && row.preachformson.includes("3")) { |
| | | type = 1; |
| | | } |
| | | setTimeout(() => { |
| | | this.$router.push({ |
| | | path: "/followvisit/record/detailpage/", |
| | | query: { |
| | | taskid: row.taskid, |
| | | patid: row.patid, |
| | | id: row.id, |
| | | Voicetype: type, |
| | | // visitCount: this.topqueryParams.visitCount, |
| | | }, |
| | | }); |
| | | }, 300); |
| | | }, |
| | | // è°èµ·è¯¦æ
|
| | | getinfo(row) { |
| | | this.topicVisible = true; |
| | | // å¤çæ¥è¯¢åæ° |
| | | const params = { |
| | | configKey: "joyCount", |
| | | ...this.queryParams, |
| | | }; |
| | | if (this.queryParams.statisticaltype == 1) { |
| | | this.topicvalue.name = row.leavehospitaldistrictname; |
| | | |
| | | params.leavehospitaldistrictcodes = [row.leavehospitaldistrictcode]; |
| | | } else { |
| | | this.topicvalue.name = row.deptname; |
| | | |
| | | params.deptcodes = [row.deptcode]; |
| | | } |
| | | |
| | | // ç§»é¤å¯è½åå¨ç"all"å¼ |
| | | delete params.leavehospitaldistrictcodes.all; |
| | | delete params.deptcodes.all; |
| | | getSfStatisticsJoyInfo(params).then((response) => { |
| | | console.log(response); |
| | | this.topiclist = response.data; |
| | | }); |
| | | }, |
| | | // æ·»å /ä¿®æ¹æ ç¾ |
| | | Maintenancetag() { |
| | | if (this.lstamendtag) { |
| | | toamendtag(this.addDateRange(this.tagform)).then((response) => { |
| | | console.log(response); |
| | | this.getList(); |
| | | }); |
| | | } else { |
| | | addapitag(this.addDateRange(this.tagform)).then((response) => { |
| | | console.log(response); |
| | | this.getList(); |
| | | }); |
| | | } |
| | | this.tagform = { |
| | | isupload: "", |
| | | tagname: "", |
| | | tagcategoryid: "", |
| | | tagdescription: "", |
| | | tagid: "", |
| | | }; |
| | | }, |
| | | routerErr(row) { |
| | | console.log(row, "跳转å¼å¸¸"); |
| | | this.$router.push({ |
| | | path: "/followvisit/discharge", |
| | | query: { |
| | | errtype: 1, |
| | | leavehospitaldistrictcode: row.leavehospitaldistrictcode, |
| | | }, |
| | | }); |
| | | }, |
| | | |
| | | // 表åéç½® |
| | | reset() { |
| | | this.form = { |
| | | userId: undefined, |
| | | deptId: undefined, |
| | | userName: undefined, |
| | | nickName: undefined, |
| | | password: undefined, |
| | | phonenumber: undefined, |
| | | email: undefined, |
| | | sex: undefined, |
| | | status: "0", |
| | | remark: undefined, |
| | | postIds: [], |
| | | roleIds: [], |
| | | }; |
| | | this.resetForm("form"); |
| | | }, |
| | | // æ ç¾ç¶æä¿®æ¹ |
| | | handleStatusChange(row) { |
| | | console.log(row.isupload); |
| | | let text = row.isupload === "0" ? "å¯ç¨" : "åç¨"; |
| | | this.$modal |
| | | .confirm('确认è¦"' + text + '""' + row.tagname + '"æ ç¾åï¼') |
| | | .then(function () { |
| | | return changetagcategory(row.tagid, row.isupload); |
| | | }) |
| | | .then(() => { |
| | | this.$modal.msgSuccess(text + "æå"); |
| | | }) |
| | | .catch(function () { |
| | | row.isupload = row.isupload === "0" ? "1" : "0"; |
| | | }); |
| | | }, |
| | | /** æç´¢æé®æä½ */ |
| | | handleQuery() { |
| | | this.queryParams.pageNum = 1; |
| | | if (!this.queryParams.dateRange) this.queryParams.dateRange = []; |
| | | if (this.queryParams.statisticaltype == 1) { |
| | | this.queryParams.deptcodes = []; |
| | | } else if (this.queryParams.statisticaltype == 2) { |
| | | this.queryParams.leavehospitaldistrictcodes = []; |
| | | } |
| | | console.log(this.queryParams.dateRange); |
| | | |
| | | this.queryParams.startTime = this.parseTime( |
| | | this.queryParams.dateRange[0] |
| | | ); |
| | | this.queryParams.endTime = this.parseTime(this.queryParams.dateRange[1]); |
| | | this.getList(); |
| | | }, |
| | | /** éç½®æé®æä½ */ |
| | | resetQuery() { |
| | | this.queryParams.dateRange = []; |
| | | this.queryParams.leavehospitaldistrictcodes = []; |
| | | this.handleQuery(); |
| | | }, |
| | | // å¤éæ¡é䏿°æ® |
| | | handleSelectionChange(selection) { |
| | | this.ids = selection.map((item) => item.tagid); |
| | | this.single = selection.length != 1; |
| | | this.multiple = !selection.length; |
| | | }, |
| | | |
| | | /** å é¤æé®æä½ */ |
| | | handleDelete(row) { |
| | | console.log(row, "å é¤å¼¹çª"); |
| | | const tagids = row.tagid || this.ids; |
| | | console.log(tagids); |
| | | const tagname = row.tagname; |
| | | this.$modal |
| | | .confirm( |
| | | tagname |
| | | ? 'æ¯å¦ç¡®è®¤å 餿 ç¾å称为"' + tagname + '"çæ°æ®é¡¹ï¼' |
| | | : "æ¯å¦ç¡®è®¤å é¤éä¸çæ°æ®é¡¹ï¼" |
| | | ) |
| | | .then(function () { |
| | | return deletetag(tagids); |
| | | }) |
| | | .then(() => { |
| | | this.getList(); |
| | | this.$modal.msgSuccess("å 餿å"); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | /** å¯¼åºæé®æä½ */ |
| | | /** å¯¼åºæé®æä½ */ |
| | | async handleExport() { |
| | | try { |
| | | // è·åå¹¶æ ¼å¼åæ¥æèå´ |
| | | let dateRangeString = ""; |
| | | let sheetNameSuffix = ""; |
| | | |
| | | // æ£æ¥æ¯å¦åå¨éä¸çæ¥æèå´ |
| | | if ( |
| | | this.queryParams.dateRange && |
| | | this.queryParams.dateRange.length === 2 |
| | | ) { |
| | | const startDateStr = this.queryParams.dateRange[0]; // å¼å§æ¥æï¼æ ¼å¼ "yyyy-MM-dd" |
| | | const endDateStr = this.queryParams.dateRange[1]; // ç»ææ¥æ |
| | | |
| | | // ç´æ¥ä½¿ç¨æ¥æé¨åï¼å·²ç»æ¯ yyyy-MM-dd æ ¼å¼ï¼ |
| | | const startDateFormatted = startDateStr; |
| | | const endDateFormatted = endDateStr; |
| | | |
| | | // æå»ºæ¥æèå´å符串 |
| | | dateRangeString = `${startDateFormatted}è³${endDateFormatted}`; |
| | | sheetNameSuffix = `${startDateFormatted}è³${endDateFormatted}`; |
| | | } else { |
| | | // å¦ææ²¡æéæ©æ¥æèå´ï¼å使ç¨å½åæä»½ä½ä¸ºå¤éæ¹æ¡ |
| | | const now = new Date(); |
| | | const currentMonth = now.getMonth() + 1; |
| | | dateRangeString = `${currentMonth}æ`; |
| | | sheetNameSuffix = `${currentMonth}æ`; |
| | | } |
| | | |
| | | // æå»ºæä»¶ååå·¥ä½è¡¨å |
| | | const excelName = `满æåº¦ç»è®¡è¡¨_${dateRangeString}.xlsx`; |
| | | const worksheetName = `满æåº¦ç»è®¡_${sheetNameSuffix}`; |
| | | |
| | | // å建工ä½ç°¿åå·¥ä½è¡¨ |
| | | const workbook = new ExcelJS.Workbook(); |
| | | const worksheet = workbook.addWorksheet(worksheetName); |
| | | |
| | | // å®ä¹æ ·å¼ |
| | | const titleStyle = { |
| | | font: { |
| | | name: "微软é
é»", |
| | | size: 16, |
| | | bold: true, |
| | | color: { argb: "FF000000" }, |
| | | }, |
| | | fill: { |
| | | type: "pattern", |
| | | pattern: "solid", |
| | | fgColor: { argb: "FFE6F3FF" }, |
| | | }, |
| | | alignment: { |
| | | vertical: "middle", |
| | | horizontal: "center", |
| | | wrapText: true, |
| | | }, |
| | | border: { |
| | | top: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | left: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | bottom: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | right: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | }, |
| | | }; |
| | | |
| | | const headerStyle = { |
| | | font: { |
| | | name: "微软é
é»", |
| | | size: 11, |
| | | bold: true, |
| | | color: { argb: "FF000000" }, |
| | | }, |
| | | fill: { |
| | | type: "pattern", |
| | | pattern: "solid", |
| | | fgColor: { argb: "FFF5F7FA" }, |
| | | }, |
| | | alignment: { |
| | | vertical: "middle", |
| | | horizontal: "center", |
| | | wrapText: true, |
| | | }, |
| | | border: { |
| | | top: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | left: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | bottom: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | right: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | }, |
| | | }; |
| | | |
| | | const cellStyle = { |
| | | font: { |
| | | name: "å®ä½", |
| | | size: 10, |
| | | color: { argb: "FF000000" }, |
| | | }, |
| | | alignment: { |
| | | vertical: "middle", |
| | | horizontal: "center", |
| | | }, |
| | | border: { |
| | | top: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | left: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | bottom: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | right: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | }, |
| | | }; |
| | | |
| | | // æ·»å æ»æ é¢ |
| | | worksheet.mergeCells(1, 1, 1, 10); |
| | | const titleCell = worksheet.getCell(1, 1); |
| | | titleCell.value = `满æåº¦ç»è®¡è¡¨ï¼${sheetNameSuffix}ï¼`; |
| | | titleCell.style = titleStyle; |
| | | worksheet.getRow(1).height = 35; |
| | | |
| | | // æ·»å 表头 |
| | | const headers = [ |
| | | "åºé¢ç
åº", |
| | | "ç§å®¤", |
| | | "åºé¢äººæ¬¡", |
| | | "æ éé访人次", |
| | | "åºé访人次", |
| | | "é访ç", |
| | | "åæ¶ç", |
| | | "满æåº¦é¢ç®æ»é", |
| | | "满æåº¦å¡«æ¥é", |
| | | "宿æ¯ç", |
| | | ]; |
| | | |
| | | const headerRow = worksheet.addRow(headers); |
| | | headerRow.eachCell((cell) => { |
| | | cell.style = headerStyle; |
| | | }); |
| | | headerRow.height = 25; |
| | | |
| | | // æ·»å æ°æ®è¡ |
| | | this.userList.forEach((item) => { |
| | | const dataRow = worksheet.addRow([ |
| | | item.leavehospitaldistrictname || "", |
| | | item.deptname || "", |
| | | item.dischargeCount || 0, |
| | | item.nonFollowUp || 0, |
| | | item.followUpNeeded || 0, |
| | | item.followUpRate || "0%", |
| | | item.rate ? (Number(item.rate) * 100).toFixed(2) + "%" : "0%", |
| | | item.joyAllCount || 0, |
| | | item.joyCount || 0, |
| | | item.joyTotal |
| | | ? (Number(item.joyTotal) * 100).toFixed(2) + "%" |
| | | : "0%", |
| | | ]); |
| | | |
| | | dataRow.eachCell((cell) => { |
| | | cell.style = cellStyle; |
| | | }); |
| | | dataRow.height = 22; |
| | | }); |
| | | |
| | | // 设置å宽 |
| | | worksheet.columns = [ |
| | | { width: 20 }, // åºé¢ç
åº |
| | | { width: 15 }, // ç§å®¤ |
| | | { width: 12 }, // åºé¢äººæ¬¡ |
| | | { width: 12 }, // æ éé访人次 |
| | | { width: 12 }, // åºé访人次 |
| | | { width: 12 }, // é访ç |
| | | { width: 12 }, // åæ¶ç |
| | | { width: 15 }, // 满æåº¦é¢ç®æ»é |
| | | { width: 15 }, // 满æåº¦å¡«æ¥é |
| | | { width: 12 }, // 宿æ¯ç |
| | | ]; |
| | | |
| | | // çæå¹¶ä¸è½½æä»¶ |
| | | const buffer = await workbook.xlsx.writeBuffer(); |
| | | const blob = new Blob([buffer], { |
| | | type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", |
| | | }); |
| | | |
| | | // 使ç¨FileSaver.jsä¿åæä»¶[2,3](@ref) |
| | | saveAs(blob, excelName); |
| | | |
| | | this.$message.success("å¯¼åºæå"); |
| | | } catch (error) { |
| | | console.error("导åºå¤±è´¥:", error); |
| | | this.$message.error(`导åºå¤±è´¥: ${error.message}`); |
| | | } |
| | | }, |
| | | // æ¾ç¤ºå¾è¡¨å¼¹çª |
| | | |
| | | showChartDialog() { |
| | | this.chartDialogVisible = true; |
| | | this.$nextTick(() => { |
| | | this.initPieChart(); |
| | | this.initBarLineChart(); |
| | | }); |
| | | }, |
| | | // å¨methodsä¸ä¿®æ¹ç»è®¡æ¹æ³ |
| | | showChartDialog() { |
| | | this.chartDialogVisible = true; |
| | | this.$nextTick(() => { |
| | | console.log(this.userList, "this.userList"); |
| | | |
| | | this.initCharts(); |
| | | }); |
| | | }, |
| | | |
| | | // æ°å¢åå§åå¾è¡¨æ¹æ³ |
| | | initCharts() { |
| | | this.initPieChart(); |
| | | this.initBarLineChart(); |
| | | }, |
| | | |
| | | // åå§åé¥¼å¾ |
| | | initPieChart() { |
| | | const echarts = require("echarts"); |
| | | const pieDom = document.getElementById("pieChart"); |
| | | if (!pieDom) return; |
| | | |
| | | if (this.pieChart) { |
| | | this.pieChart.dispose(); |
| | | } |
| | | |
| | | this.pieChart = echarts.init(pieDom); |
| | | |
| | | // 计ç®é¥¼å¾æ°æ® |
| | | const followUpData = { |
| | | pending: 0, |
| | | success: 0, |
| | | fail: 0, |
| | | }; |
| | | |
| | | this.userList.forEach((item) => { |
| | | followUpData.pending += item.pendingFollowUp || 0; |
| | | followUpData.success += item.followUpSuccess || 0; |
| | | followUpData.fail += item.followUpFail || 0; |
| | | }); |
| | | |
| | | // ä½¿ç¨æ´ç¾è§çé¢è²æ¹æ¡ |
| | | const pieOption = { |
| | | title: { |
| | | text: "éè®¿ç¶æåå¸", |
| | | left: "center", |
| | | textStyle: { |
| | | color: "#333", |
| | | fontSize: 16, |
| | | }, |
| | | }, |
| | | tooltip: { |
| | | trigger: "item", |
| | | formatter: "{a} <br/>{b}: {c} ({d}%)", |
| | | }, |
| | | legend: { |
| | | orient: "vertical", |
| | | left: "left", |
| | | data: ["å¾
é访", "é访æå", "é访失败"], |
| | | textStyle: { |
| | | color: "#666", |
| | | }, |
| | | }, |
| | | color: ["#FF9D4D", "#36B37E", "#FF5C5C"], // æ°çé
è²æ¹æ¡ |
| | | series: [ |
| | | { |
| | | name: "éè®¿ç¶æ", |
| | | type: "pie", |
| | | radius: ["40%", "70%"], |
| | | avoidLabelOverlap: true, |
| | | itemStyle: { |
| | | borderRadius: 10, |
| | | borderColor: "#fff", |
| | | borderWidth: 2, |
| | | }, |
| | | label: { |
| | | show: true, |
| | | formatter: "{b}: {c} ({d}%)", |
| | | color: "#333", |
| | | }, |
| | | emphasis: { |
| | | label: { |
| | | show: true, |
| | | fontSize: "18", |
| | | fontWeight: "bold", |
| | | }, |
| | | itemStyle: { |
| | | shadowBlur: 10, |
| | | shadowOffsetX: 0, |
| | | shadowColor: "rgba(0, 0, 0, 0.5)", |
| | | }, |
| | | }, |
| | | data: [ |
| | | { |
| | | value: followUpData.pending, |
| | | name: "å¾
é访", |
| | | }, |
| | | { |
| | | value: followUpData.success, |
| | | name: "é访æå", |
| | | }, |
| | | { |
| | | value: followUpData.fail, |
| | | name: "é访失败", |
| | | }, |
| | | ], |
| | | }, |
| | | ], |
| | | }; |
| | | |
| | | this.pieChart.setOption(pieOption); |
| | | window.addEventListener("resize", this.resizePieChart); |
| | | }, |
| | | |
| | | // åå§åæ±ç¶æçº¿å¾ |
| | | initBarLineChart() { |
| | | const echarts = require("echarts"); |
| | | const barDom = document.getElementById("barLineChart"); |
| | | if (!barDom) return; |
| | | |
| | | if (this.barLineChart) { |
| | | this.barLineChart.dispose(); |
| | | } |
| | | |
| | | this.barLineChart = echarts.init(barDom); |
| | | |
| | | // å夿°æ® |
| | | const categories = this.userList.map( |
| | | (item) => item.leavehospitaldistrictname || item.deptname |
| | | ); |
| | | |
| | | const dischargeData = this.userList.map( |
| | | (item) => item.dischargeCount || 0 |
| | | ); |
| | | const followUpData = this.userList.map( |
| | | (item) => item.followUpNeeded || 0 |
| | | ); |
| | | |
| | | // æ°å¢ä¸¤æ¡æçº¿æ°æ® |
| | | const followUpRateData = this.userList.map((item) => { |
| | | if (!item.followUpRate) return 0; |
| | | // 廿ç¾åå·å¹¶è½¬ä¸ºæ°å |
| | | const rateStr = String(item.followUpRate).replace("%", ""); |
| | | return parseFloat(rateStr) || 0; |
| | | }); |
| | | |
| | | const timelyRateData = this.userList.map((item) => |
| | | item.rate ? (Number(item.rate) * 100).toFixed(2) : 0 |
| | | ); |
| | | |
| | | const option = { |
| | | title: { |
| | | text: "ç§å®¤/ç
åºé访è¶å¿", |
| | | left: "center", |
| | | textStyle: { |
| | | color: "#333", |
| | | fontSize: 16, |
| | | }, |
| | | }, |
| | | tooltip: { |
| | | trigger: "axis", |
| | | axisPointer: { |
| | | type: "cross", |
| | | crossStyle: { |
| | | color: "#999", |
| | | }, |
| | | }, |
| | | }, |
| | | legend: { |
| | | data: ["åºé¢äººæ¬¡", "åºé访人次", "é访ç(%)", "åæ¶ç(%)"], |
| | | top: "bottom", |
| | | textStyle: { |
| | | color: "#666", |
| | | }, |
| | | }, |
| | | color: ["#5470C6", "#91CC75", "#EE6666", "#9A60B4"], // æ°å¢ç´«è²ç¨äºåæ¶ç |
| | | xAxis: { |
| | | type: "category", |
| | | data: categories, |
| | | axisLabel: { |
| | | interval: 0, |
| | | rotate: 30, |
| | | color: "#666", |
| | | }, |
| | | axisLine: { |
| | | lineStyle: { |
| | | color: "#ddd", |
| | | }, |
| | | }, |
| | | }, |
| | | yAxis: [ |
| | | { |
| | | type: "value", |
| | | name: "人次", |
| | | min: 0, |
| | | axisLabel: { |
| | | color: "#666", |
| | | }, |
| | | axisLine: { |
| | | lineStyle: { |
| | | color: "#ddd", |
| | | }, |
| | | }, |
| | | splitLine: { |
| | | lineStyle: { |
| | | color: "#f0f0f0", |
| | | }, |
| | | }, |
| | | }, |
| | | { |
| | | type: "value", |
| | | name: "ç¾åæ¯(%)", |
| | | min: 0, |
| | | max: 100, |
| | | axisLabel: { |
| | | color: "#666", |
| | | formatter: "{value}%", |
| | | }, |
| | | axisLine: { |
| | | lineStyle: { |
| | | color: "#ddd", |
| | | }, |
| | | }, |
| | | splitLine: { |
| | | show: false, |
| | | }, |
| | | }, |
| | | ], |
| | | series: [ |
| | | { |
| | | name: "åºé¢äººæ¬¡", |
| | | type: "bar", |
| | | barWidth: "25%", |
| | | data: dischargeData, |
| | | itemStyle: { |
| | | borderRadius: [4, 4, 0, 0], |
| | | }, |
| | | }, |
| | | { |
| | | name: "åºé访人次", |
| | | type: "bar", |
| | | barWidth: "25%", |
| | | data: followUpData, |
| | | itemStyle: { |
| | | borderRadius: [4, 4, 0, 0], |
| | | }, |
| | | }, |
| | | { |
| | | name: "é访ç(%)", |
| | | type: "line", |
| | | yAxisIndex: 1, |
| | | data: followUpRateData, |
| | | symbolSize: 8, |
| | | lineStyle: { |
| | | width: 3, |
| | | }, |
| | | markLine: { |
| | | silent: true, |
| | | data: [ |
| | | { |
| | | yAxis: 80, |
| | | lineStyle: { |
| | | color: "#EE6666", |
| | | type: "dashed", |
| | | }, |
| | | // label: { |
| | | // position: 'end', |
| | | // formatter: 'ç®æ 80%' |
| | | // } |
| | | }, |
| | | ], |
| | | }, |
| | | }, |
| | | { |
| | | name: "åæ¶ç(%)", |
| | | type: "line", |
| | | yAxisIndex: 1, |
| | | data: timelyRateData, |
| | | symbolSize: 8, |
| | | lineStyle: { |
| | | width: 3, |
| | | type: "dotted", // 使ç¨è线åºå |
| | | }, |
| | | markLine: { |
| | | silent: true, |
| | | data: [ |
| | | { |
| | | yAxis: 90, |
| | | lineStyle: { |
| | | color: "#9A60B4", |
| | | type: "dashed", |
| | | }, |
| | | // label: { |
| | | // position: 'end', |
| | | // formatter: 'ç®æ 90%' |
| | | // } |
| | | }, |
| | | ], |
| | | }, |
| | | }, |
| | | ], |
| | | grid: { |
| | | top: "15%", |
| | | left: "3%", |
| | | right: "4%", |
| | | bottom: "15%", |
| | | containLabel: true, |
| | | }, |
| | | }; |
| | | |
| | | this.barLineChart.setOption(option); |
| | | window.addEventListener("resize", this.resizeBarLineChart); |
| | | }, |
| | | |
| | | // å¾è¡¨ååºå¼è°æ´æ¹æ³ |
| | | resizePieChart() { |
| | | if (this.pieChart) { |
| | | this.pieChart.resize(); |
| | | } |
| | | }, |
| | | |
| | | resizeBarLineChart() { |
| | | if (this.barLineChart) { |
| | | this.barLineChart.resize(); |
| | | } |
| | | }, |
| | | |
| | | // å¨ç»ä»¶éæ¯æ¶æ¸
ç |
| | | beforeDestroy() { |
| | | // ç§»é¤äºä»¶çå¬ |
| | | window.removeEventListener("resize", this.resizePieChart); |
| | | window.removeEventListener("resize", this.resizeBarLineChart); |
| | | |
| | | // 鿝å¾è¡¨å®ä¾ |
| | | if (this.pieChart) { |
| | | this.pieChart.dispose(); |
| | | this.pieChart = null; |
| | | } |
| | | if (this.barLineChart) { |
| | | this.barLineChart.dispose(); |
| | | this.barLineChart = null; |
| | | } |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .sidecolumn { |
| | | width: 180px; |
| | | min-height: 100vh; |
| | | text-align: center; |
| | | // display: flex; |
| | | margin-top: 20px; |
| | | margin: 20px; |
| | | padding: 30px; |
| | | background: #edf1f7; |
| | | border: 1px solid #dcdfe6; |
| | | -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), |
| | | 0 0 6px 0 rgba(0, 0, 0, 0.04); |
| | | .sidecolumn-top { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | .top-wj { |
| | | font-size: 20px; |
| | | } |
| | | .top-tj { |
| | | font-size: 18px; |
| | | |
| | | color: rgb(0, 89, 255); |
| | | cursor: pointer; |
| | | } |
| | | } |
| | | .center-ss { |
| | | margin-top: 30px; |
| | | .input-with-select { |
| | | height: 40px !important; |
| | | } |
| | | } |
| | | .bottom-fl { |
| | | margin-top: 30px; |
| | | display: center !important; |
| | | } |
| | | } |
| | | .qrcode-dialo { |
| | | text-align: center; |
| | | // display: flex; |
| | | margin: 20px; |
| | | padding: 30px; |
| | | background: #edf1f7; |
| | | border: 1px solid #dcdfe6; |
| | | -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), |
| | | 0 0 6px 0 rgba(0, 0, 0, 0.04); |
| | | .qrcode-text { |
| | | font-size: 20px; |
| | | span { |
| | | margin-left: 20px; |
| | | } |
| | | } |
| | | .qrcode-img { |
| | | width: 300px; |
| | | height: 400px; |
| | | } |
| | | } |
| | | .topicdia { |
| | | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, |
| | | "Helvetica Neue", Arial, sans-serif; |
| | | color: #333; /* 主æåè² */ |
| | | } |
| | | |
| | | /* 头鍿 颿 ·å¼ */ |
| | | .top-text { |
| | | font-size: 18px; |
| | | font-weight: 600; |
| | | padding-bottom: 16px; |
| | | margin-bottom: 20px; |
| | | border-bottom: 1px solid #e8e8e8; /* 纤ç»çåé线 */ |
| | | color: #1f2d3d; /* æ·±è²æ é¢ */ |
| | | } |
| | | .top-text span { |
| | | font-size: 14px; |
| | | font-weight: normal; |
| | | color: #666; /* 坿 é¢é¢è²ç¨æµ
*/ |
| | | margin-left: 10px; |
| | | } |
| | | |
| | | /* é¢ç®å®¹å¨æ ·å¼ */ |
| | | .ttaabbcc { |
| | | background: #fafafa; /* é常æµ
çç°è²èæ¯ */ |
| | | border-radius: 6px; |
| | | padding: 16px; |
| | | margin-bottom: 20px; |
| | | border-left: 4px solid #4794c5; /* 左侧è£
é¥°è²æ¡ï¼å¢å 屿¬¡æ */ |
| | | } |
| | | |
| | | /* é¢ç®æè¿°æ ·å¼ */ |
| | | .describe { |
| | | font-size: 15px; |
| | | line-height: 1.6; |
| | | margin-bottom: 12px; |
| | | color: #1f2d3d; |
| | | } |
| | | .describe span { |
| | | font-size: 13px; |
| | | color: #999; /* é¢åæç¤ºä¿¡æ¯é¢è²æ´æµ
*/ |
| | | font-style: italic; |
| | | margin-left: 8px; |
| | | } |
| | | |
| | | /* è¡¨æ ¼æ´ä½æ ·å¼è°æ´ */ |
| | | .ttaabbcc .el-table { |
| | | border-radius: 4px; |
| | | overflow: hidden; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | /* è¡¨å¤´æ ·å¼ */ |
| | | .ttaabbcc .el-table th { |
| | | background-color: #f1f5f9; /* æµ
èè²è¡¨å¤´èæ¯ */ |
| | | color: #333; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | /* åå
æ ¼æ ·å¼ */ |
| | | .ttaabbcc .el-table td { |
| | | border-bottom: 1px solid #f0f0f0; /* 纤ç»çè¡åé线 */ |
| | | padding: 12px 0; |
| | | } |
| | | |
| | | /* æ¯ä¾æ°æ®æ ·å¼ */ |
| | | .button-zx { |
| | | color: #4794c5; /* 使ç¨ä¸ä¸»é¢å¼åºçèè² */ |
| | | font-weight: 500; |
| | | } |
| | | ::v-deep.el-tabs--left, |
| | | .el-tabs--right { |
| | | overflow: hidden; |
| | | align-items: center; |
| | | display: flex; |
| | | } |
| | | ::v-deep.el-input--medium .el-input__inner { |
| | | height: 40px !important; |
| | | } |
| | | ::v-deep.el-tabs--right .el-tabs__active-bar.is-right { |
| | | height: 40px; |
| | | width: 5px; |
| | | left: 0; |
| | | } |
| | | ::v-deep.el-tabs--right .el-tabs__item.is-right { |
| | | display: block; |
| | | text-align: left; |
| | | font-size: 20px; |
| | | } |
| | | |
| | | .leftvlue { |
| | | // display: flex; |
| | | // flex: 1; |
| | | // width: 80%; |
| | | // margin-top: 20px; |
| | | margin: 20px; |
| | | padding: 30px; |
| | | background: #ffff; |
| | | border: 1px solid #dcdfe6; |
| | | -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), |
| | | 0 0 6px 0 rgba(0, 0, 0, 0.04); |
| | | .mulsz { |
| | | font-size: 20px; |
| | | } |
| | | } |
| | | /* ä½¿è¡ææåæé */ |
| | | .el-table__row { |
| | | cursor: pointer; |
| | | } |
| | | /* å
å±å»çè¡¨æ ¼æ ·å¼ */ |
| | | .inner-table { |
| | | // è¡¨å¤´èæ¯è² |
| | | ::v-deep .el-table__header-wrapper { |
| | | background-color: #f0f7ff !important; |
| | | |
| | | th { |
| | | background-color: #f0f7ff !important; |
| | | } |
| | | } |
| | | |
| | | // è¡¨æ ¼è¡èæ¯è² |
| | | ::v-deep .el-table__body-wrapper { |
| | | tr { |
| | | background-color: #f9fbfe !important; |
| | | |
| | | &:hover { |
| | | background-color: #e6f1ff !important; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // è¾¹æ¡é¢è² |
| | | ::v-deep .el-table--border { |
| | | border-color: #d9e8ff !important; |
| | | |
| | | td, |
| | | th { |
| | | border-color: #d9e8ff !important; |
| | | } |
| | | } |
| | | |
| | | // æé©¬çº¹ææ |
| | | ::v-deep .el-table--striped .el-table__body tr.el-table__row--striped td { |
| | | background-color: #f5f9ff !important; |
| | | } |
| | | } |
| | | /* å±å¼è¡æ ·å¼ */ |
| | | .el-table__expanded-cell { |
| | | padding: 10px 0 !important; |
| | | background: #f8f8f8; |
| | | } |
| | | .document { |
| | | width: 100px; |
| | | height: 50px; |
| | | } |
| | | .documentf { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | } |
| | | .button-text { |
| | | color: rgb(70, 204, 238); |
| | | } |
| | | .button-textck { |
| | | color: rgb(39, 167, 67); |
| | | } |
| | | .button-textxg { |
| | | color: rgb(35, 81, 233); |
| | | } |
| | | .button-textsc { |
| | | color: rgb(235, 23, 23); |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="satisfaction-exception-config"> |
| | | <!-- 页颿 é¢ --> |
| | | <div class="page-header"> |
| | | <div class="header-content"> |
| | | <h2 class="page-title">满æåº¦é¢ç®å¼å¸¸å¤çé
ç½®</h2> |
| | | <p class="page-description"> |
| | | 为满æåº¦é¢ç®é
置责任ç§å®¤åæ¥å¤ç§å®¤ï¼ä¼åå¼å¸¸å馿µç¨ |
| | | </p> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- æç´¢åºå --> |
| | | <div class="search-card"> |
| | | <el-card shadow="never" class="search-container"> |
| | | <el-form :model="queryParams" :inline="true" size="medium"> |
| | | <el-form-item label="é®é¢ä¸»é¢"> |
| | | <el-input |
| | | v-model="queryParams.scriptTopic" |
| | | placeholder="请è¾å
¥é®é¢ä¸»é¢" |
| | | clearable |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="é®é¢å
容"> |
| | | <el-input |
| | | v-model="queryParams.scriptContent" |
| | | placeholder="请è¾å
¥é®é¢å
容" |
| | | clearable |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="æ¯å¦å¯ç¨"> |
| | | <el-select |
| | | v-model="queryParams.isavailable" |
| | | placeholder="è¯·éæ©" |
| | | clearable |
| | | > |
| | | <el-option |
| | | v-for="item in qyoptions" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | @click="handleQuery" |
| | | > |
| | | æç´¢ |
| | | </el-button> |
| | | <el-button icon="el-icon-refresh" @click="resetQuery"> |
| | | éç½® |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-card> |
| | | </div> |
| | | |
| | | <!-- é
ç½®å表 --> |
| | | <div class="config-content"> |
| | | <!-- æ¹éæä½æ --> |
| | | <div v-if="questionList.length > 0" class="batch-actions-card"> |
| | | <el-card shadow="never"> |
| | | <div class="batch-actions"> |
| | | <el-button |
| | | type="success" |
| | | icon="el-icon-check" |
| | | :loading="batchSaving" |
| | | :disabled="!hasChanges || batchSaving" |
| | | @click="handleBatchSave" |
| | | size="medium" |
| | | > |
| | | {{ batchSaving ? "æ¹éä¿åä¸..." : "æ¹éä¿åé
ç½®" }} |
| | | </el-button> |
| | | <span v-if="changedCount > 0" class="change-count"> |
| | | æ {{ changedCount }} 项é
ç½®éè¦ä¿å |
| | | </span> |
| | | <div class="total-count">å
± {{ total }} æ¡è®°å½</div> |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | |
| | | <div v-if="loading" class="loading-wrapper"> |
| | | <div class="loading-spinner"> |
| | | <i class="el-icon-loading"></i> |
| | | <span>å è½½ä¸...</span> |
| | | </div> |
| | | </div> |
| | | |
| | | <div v-else-if="questionList.length === 0" class="empty-wrapper"> |
| | | <el-empty description="ææ æ»¡æåº¦é¢ç®æ°æ®"> |
| | | <el-button type="primary" @click="getQuestionList" |
| | | >å·æ°æ°æ®</el-button |
| | | > |
| | | </el-empty> |
| | | </div> |
| | | |
| | | <!-- ä¸è¡ä¸è¡çå¡çå表 --> |
| | | <div v-else class="question-list"> |
| | | <div |
| | | v-for="(question, index) in questionList" |
| | | :key="question.id" |
| | | class="question-item" |
| | | > |
| | | <el-card |
| | | shadow="hover" |
| | | class="question-card" |
| | | :class="{ 'has-changes': question.hasChanges }" |
| | | > |
| | | <!-- å¡çå¤´é¨ --> |
| | | <div class="card-header"> |
| | | <div class="header-left"> |
| | | <div class="question-index"> |
| | | <span class="index-number">{{ index + 1 }}</span> |
| | | <div class="index-line"></div> |
| | | </div> |
| | | <div class="question-basic-info"> |
| | | <div class="question-title-section"> |
| | | <h3 class="question-topic" :title="question.scriptTopic"> |
| | | {{ question.scriptTopic || "æ 主é¢" }} |
| | | </h3> |
| | | <div class="question-tags"> |
| | | <el-tag |
| | | :type="question.isavailable == 1 ? 'danger' : 'success'" |
| | | size="small" |
| | | > |
| | | {{ question.isavailable == 1 ? "ä¸å¯ç¨" : "å¯ç¨" }} |
| | | </el-tag> |
| | | <dict-tag |
| | | :options="askvaluetype" |
| | | :value="question.scriptType" |
| | | size="small" |
| | | /> |
| | | <el-tag |
| | | v-if="question.targetname" |
| | | size="small" |
| | | type="info" |
| | | > |
| | | {{ question.targetname }} |
| | | </el-tag> |
| | | </div> |
| | | </div> |
| | | <div class="question-content-section"> |
| | | <span class="content-label">é¢ç®å
容ï¼</span> |
| | | <span class="content-text">{{ |
| | | question.scriptContent |
| | | }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="header-right"> |
| | | <el-button |
| | | type="text" |
| | | icon="el-icon-view" |
| | | @click="previewQuestion(question)" |
| | | size="small" |
| | | > |
| | | é¢è§ |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- å¼å¸¸å¤çé
ç½® --> |
| | | <div class="config-section"> |
| | | <div class="config-title"> |
| | | <i class="el-icon-setting"></i> |
| | | <span>å¼å¸¸å¤çé
ç½®</span> |
| | | </div> |
| | | |
| | | <el-form |
| | | :model="question.exceptionConfig" |
| | | :rules="configRules" |
| | | ref="configForm" |
| | | label-width="100px" |
| | | size="small" |
| | | class="config-form" |
| | | > |
| | | <div class="config-fields"> |
| | | <!-- 责任ç§å®¤ --> |
| | | <div class="config-field"> |
| | | <el-form-item |
| | | label="责任ç§å®¤" |
| | | prop="responsibilityDept" |
| | | class="config-item" |
| | | > |
| | | <el-select |
| | | v-model="question.exceptionConfig.responsibilityDept" |
| | | placeholder="è¯·éæ©è´£ä»»ç§å®¤" |
| | | filterable |
| | | clearable |
| | | style="width: 100%" |
| | | @change="handleConfigChange(question)" |
| | | > |
| | | <el-option |
| | | v-for="dept in deptOptions" |
| | | :key="dept.id" |
| | | :label="dept.name" |
| | | :value="dept.id" |
| | | /> |
| | | </el-select> |
| | | <div class="config-tip">è´è´£å¤ç该é¢ç®åé¦çç§å®¤</div> |
| | | </el-form-item> |
| | | </div> |
| | | |
| | | <!-- æ¥å¤ç§å®¤ --> |
| | | <div class="config-field"> |
| | | <el-form-item |
| | | label="æ¥å¤ç§å®¤" |
| | | prop="reportDept" |
| | | class="config-item" |
| | | > |
| | | <el-select |
| | | v-model="question.exceptionConfig.reportDept" |
| | | placeholder="è¯·éæ©æ¥å¤ç§å®¤" |
| | | filterable |
| | | clearable |
| | | multiple |
| | | collapse-tags |
| | | style="width: 100%" |
| | | @change="handleConfigChange(question)" |
| | | > |
| | | <el-option |
| | | v-for="dept in deptOptions" |
| | | :key="dept.id" |
| | | :label="dept.name" |
| | | :value="dept.id" |
| | | /> |
| | | </el-select> |
| | | <div class="config-tip"> |
| | | éè¦æ¥æ¶å¼å¸¸åé¦çç§å®¤ï¼å¯å¤é |
| | | </div> |
| | | </el-form-item> |
| | | </div> |
| | | |
| | | <!-- éç¥æ¹å¼ --> |
| | | <div class="config-field"> |
| | | <el-form-item |
| | | label="éç¥æ¹å¼" |
| | | prop="notifyTypes" |
| | | class="config-item" |
| | | > |
| | | <el-checkbox-group |
| | | v-model="question.exceptionConfig.notifyTypes" |
| | | @change="handleConfigChange(question)" |
| | | > |
| | | <el-checkbox label="system">ç³»ç»æ¶æ¯</el-checkbox> |
| | | <el-checkbox label="sms">çä¿¡</el-checkbox> |
| | | <el-checkbox label="email">é®ä»¶</el-checkbox> |
| | | <el-checkbox label="wechat">ä¼ä¸å¾®ä¿¡</el-checkbox> |
| | | </el-checkbox-group> |
| | | </el-form-item> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- é
ç½®ç¶æåæä½æé® --> |
| | | <div class="config-footer"> |
| | | <div v-if="question.saveStatus" class="save-status"> |
| | | <el-alert |
| | | :type="question.saveStatus.type" |
| | | :title="question.saveStatus.message" |
| | | :closable="false" |
| | | show-icon |
| | | :effect=" |
| | | question.saveStatus.type === 'success' |
| | | ? 'dark' |
| | | : 'light' |
| | | " |
| | | size="small" |
| | | /> |
| | | </div> |
| | | |
| | | <div class="config-actions"> |
| | | <el-button |
| | | type="primary" |
| | | :loading="question.saving" |
| | | :disabled="!question.hasChanges" |
| | | @click="saveSingleConfig(question)" |
| | | size="small" |
| | | icon="el-icon-check" |
| | | > |
| | | {{ question.saving ? "ä¿åä¸..." : "ä¿åé
ç½®" }} |
| | | </el-button> |
| | | <el-button |
| | | v-if="question.hasChanges" |
| | | type="text" |
| | | @click="resetSingleConfig(question)" |
| | | size="small" |
| | | > |
| | | éç½® |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | </el-form> |
| | | </div> |
| | | </el-card> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- å页 --> |
| | | <div v-if="questionList.length > 0" class="pagination-wrapper"> |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" |
| | | @pagination="getQuestionList" |
| | | /> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- é¢ç®é¢è§å¯¹è¯æ¡ --> |
| | | <el-dialog |
| | | title="é¢ç®é¢è§" |
| | | :visible.sync="previewVisible" |
| | | width="600px" |
| | | center |
| | | > |
| | | <div v-if="currentPreview" class="preview-wrapper"> |
| | | <div class="preview-header"> |
| | | <h4>{{ currentPreview.scriptTopic || "æ 主é¢" }}</h4> |
| | | <div class="preview-tags"> |
| | | <dict-tag |
| | | :options="askvaluetype" |
| | | :value="currentPreview.scriptType" |
| | | size="small" |
| | | /> |
| | | <el-tag |
| | | :type="currentPreview.isavailable === 1 ? 'success' : 'danger'" |
| | | size="small" |
| | | > |
| | | {{ currentPreview.isavailable === 1 ? "å¯ç¨" : "ä¸å¯ç¨" }} |
| | | </el-tag> |
| | | <el-tag v-if="currentPreview.targetname" size="small" type="info"> |
| | | {{ currentPreview.targetname }} |
| | | </el-tag> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="preview-content"> |
| | | <p class="preview-question">{{ currentPreview.scriptContent }}</p> |
| | | |
| | | <div |
| | | v-if=" |
| | | currentPreview.scriptType != 3 && currentPreview.scriptType != 4 |
| | | " |
| | | class="preview-options" |
| | | > |
| | | <el-radio-group v-model="previewAnswer"> |
| | | <el-radio |
| | | v-for="(option, idx) in currentPreview.svyLibScriptOptions || |
| | | []" |
| | | :key="idx" |
| | | :label="option.optioncontent" |
| | | class="option-item" |
| | | > |
| | | {{ option.optioncontent }} |
| | | </el-radio> |
| | | </el-radio-group> |
| | | </div> |
| | | |
| | | <div v-else class="preview-textarea"> |
| | | <el-input |
| | | type="textarea" |
| | | placeholder="请è¾å
¥åç" |
| | | v-model="previewAnswer" |
| | | :rows="4" |
| | | /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="previewVisible = false">å
³é</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | |
| | | <!-- ä¿åæåæç¤º --> |
| | | <el-dialog |
| | | title="ä¿åæå" |
| | | :visible.sync="saveSuccessVisible" |
| | | width="400px" |
| | | center |
| | | > |
| | | <div class="success-content"> |
| | | <i class="el-icon-success success-icon"></i> |
| | | <p class="success-text">é
置已æåä¿åï¼</p> |
| | | </div> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="saveSuccessVisible = false" |
| | | >ç¡®å®</el-button |
| | | > |
| | | </span> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { |
| | | getissuelist, |
| | | compileissue, |
| | | getissueclassify, |
| | | } from "@/api/AiCentre/index"; |
| | | import store from "@/store"; |
| | | import Pagination from "@/components/Pagination"; |
| | | |
| | | export default { |
| | | name: "SatisfactionExceptionConfig", |
| | | components: { Pagination }, |
| | | data() { |
| | | return { |
| | | // æ¥è¯¢åæ° |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | scriptTopic: "", |
| | | scriptContent: "", |
| | | targetname: "", |
| | | isavailable: "", |
| | | categoryids: "404,405,406", // åºå®æ¥è¯¢æ»¡æåº¦ç±»å |
| | | }, |
| | | |
| | | // æ°æ®å表 |
| | | questionList: [], |
| | | total: 0, |
| | | loading: false, |
| | | batchSaving: false, |
| | | |
| | | // åå
¸æ°æ® |
| | | askvaluetype: store.getters.askvaluetype || [], |
| | | qyoptions: store.getters.usable || [], |
| | | mode: store.getters.mode || [], |
| | | languagelist: store.getters.languagelist || [], |
| | | |
| | | // ç§å®¤é项 |
| | | deptOptions: [], |
| | | |
| | | // é¢è§ç¸å
³ |
| | | previewVisible: false, |
| | | currentPreview: null, |
| | | previewAnswer: "", |
| | | |
| | | // ä¿åç¸å
³ |
| | | saveSuccessVisible: false, |
| | | hasChanges: false, |
| | | changedCount: 0, |
| | | |
| | | // 表åéªè¯è§å |
| | | configRules: { |
| | | responsibilityDept: [ |
| | | { required: true, message: "è¯·éæ©è´£ä»»ç§å®¤", trigger: "change" }, |
| | | ], |
| | | reportDept: [ |
| | | { |
| | | required: true, |
| | | message: "è¯·éæ©è³å°ä¸ä¸ªæ¥å¤ç§å®¤", |
| | | trigger: "change", |
| | | }, |
| | | { |
| | | validator: (rule, value, callback) => { |
| | | if (!value || value.length === 0) { |
| | | callback(new Error("è¯·éæ©è³å°ä¸ä¸ªæ¥å¤ç§å®¤")); |
| | | } else { |
| | | callback(); |
| | | } |
| | | }, |
| | | trigger: "change", |
| | | }, |
| | | ], |
| | | notifyTypes: [ |
| | | { |
| | | validator: (rule, value, callback) => { |
| | | if (!value || value.length === 0) { |
| | | callback(new Error("请è³å°éæ©ä¸ç§éç¥æ¹å¼")); |
| | | } else { |
| | | callback(); |
| | | } |
| | | }, |
| | | trigger: "change", |
| | | }, |
| | | ], |
| | | }, |
| | | }; |
| | | }, |
| | | created() { |
| | | this.getDeptOptions(); |
| | | this.getQuestionList(); |
| | | }, |
| | | methods: { |
| | | /** æ¥è¯¢ç§å®¤å表 */ |
| | | getDeptOptions() { |
| | | getissueclassify({}) |
| | | .then((res) => { |
| | | if (res.code === 200) { |
| | | this.deptOptions = res.rows || []; |
| | | } |
| | | }) |
| | | .catch((error) => { |
| | | console.error("è·åç§å®¤å表失败:", error); |
| | | this.$message.error("è·åç§å®¤å表失败"); |
| | | }); |
| | | }, |
| | | |
| | | /** æ¥è¯¢æ»¡æåº¦é¢ç®å表 */ |
| | | getQuestionList() { |
| | | this.loading = true; |
| | | this.questionList = []; |
| | | |
| | | getissuelist(this.queryParams) |
| | | .then((res) => { |
| | | this.loading = false; |
| | | if (res.code === 200) { |
| | | this.questionList = (res.rows || []).map((item) => { |
| | | // è§£æå¼å¸¸å¤çé
ç½® |
| | | let exceptionConfig = { |
| | | responsibilityDept: "", |
| | | reportDept: [], |
| | | notifyTypes: ["system"], |
| | | }; |
| | | |
| | | try { |
| | | if (item.otherdata) { |
| | | const otherData = JSON.parse(item.otherdata); |
| | | if (otherData.exceptionConfig) { |
| | | exceptionConfig = { |
| | | ...exceptionConfig, |
| | | ...otherData.exceptionConfig, |
| | | }; |
| | | } |
| | | } |
| | | } catch (error) { |
| | | console.warn("è§£æå¼å¸¸é
置失败:", error); |
| | | } |
| | | |
| | | return { |
| | | ...item, |
| | | originalConfig: JSON.parse(JSON.stringify(exceptionConfig)), |
| | | exceptionConfig: exceptionConfig, |
| | | hasChanges: false, |
| | | saving: false, |
| | | saveStatus: null, |
| | | }; |
| | | }); |
| | | |
| | | this.total = res.total || 0; |
| | | this.updateChangedStatus(); |
| | | } else { |
| | | this.$message.error(res.msg || "è·åæ°æ®å¤±è´¥"); |
| | | } |
| | | }) |
| | | .catch((error) => { |
| | | this.loading = false; |
| | | console.error("æ¥è¯¢å¤±è´¥:", error); |
| | | this.$message.error("è·åæ°æ®å¤±è´¥"); |
| | | }); |
| | | }, |
| | | |
| | | /** é
ç½®åæ´å¤ç */ |
| | | handleConfigChange(question) { |
| | | this.$nextTick(() => { |
| | | const index = this.questionList.findIndex((q) => q.id === question.id); |
| | | if (index !== -1) { |
| | | const formRef = this.$refs.configForm && this.$refs.configForm[index]; |
| | | if (formRef) { |
| | | formRef.validate((valid) => { |
| | | if (valid) { |
| | | question.hasChanges = !this.isConfigEqual( |
| | | question.exceptionConfig, |
| | | question.originalConfig |
| | | ); |
| | | this.updateChangedStatus(); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | /** æ¯è¾é
ç½®æ¯å¦æ¹å */ |
| | | isConfigEqual(config1, config2) { |
| | | if (!config1 || !config2) return false; |
| | | |
| | | const report1 = [...(config1.reportDept || [])].sort().join(","); |
| | | const report2 = [...(config2.reportDept || [])].sort().join(","); |
| | | const notify1 = [...(config1.notifyTypes || [])].sort().join(","); |
| | | const notify2 = [...(config2.notifyTypes || [])].sort().join(","); |
| | | |
| | | return ( |
| | | config1.responsibilityDept === config2.responsibilityDept && |
| | | report1 === report2 && |
| | | notify1 === notify2 |
| | | ); |
| | | }, |
| | | |
| | | /** æ´æ°åæ´ç¶æ */ |
| | | updateChangedStatus() { |
| | | const changedItems = this.questionList.filter((q) => q.hasChanges); |
| | | this.changedCount = changedItems.length; |
| | | this.hasChanges = changedItems.length > 0; |
| | | }, |
| | | |
| | | /** ä¿åå个é¢ç®é
ç½® */ |
| | | async saveSingleConfig(question) { |
| | | if (!question.hasChanges) return; |
| | | |
| | | const index = this.questionList.findIndex((q) => q.id === question.id); |
| | | if (index === -1) return; |
| | | |
| | | const formRef = this.$refs.configForm && this.$refs.configForm[index]; |
| | | if (!formRef) return; |
| | | |
| | | const valid = await formRef.validate(); |
| | | if (!valid) { |
| | | this.$message.warning("请å
宿å¿
填项"); |
| | | return; |
| | | } |
| | | |
| | | question.saving = true; |
| | | question.saveStatus = null; |
| | | |
| | | try { |
| | | // æå»ºä¿åæ°æ® |
| | | const saveData = { |
| | | id: question.id, |
| | | isoperation: 2, // ä¿®æ¹æä½ |
| | | ...question, |
| | | }; |
| | | |
| | | // å°å¼å¸¸é
ç½®ä¿åå° otherdata |
| | | const otherData = JSON.parse(question.otherdata || "{}"); |
| | | otherData.exceptionConfig = question.exceptionConfig; |
| | | saveData.otherdata = JSON.stringify(otherData); |
| | | |
| | | // ç§»é¤ä¸éè¦çåæ®µ |
| | | delete saveData.originalConfig; |
| | | delete saveData.hasChanges; |
| | | delete saveData.saving; |
| | | delete saveData.saveStatus; |
| | | delete saveData.exceptionConfig; |
| | | |
| | | const response = await compileissue(saveData); |
| | | |
| | | if (response.code === 200) { |
| | | // æ´æ°åå§é
ç½® |
| | | question.originalConfig = JSON.parse( |
| | | JSON.stringify(question.exceptionConfig) |
| | | ); |
| | | question.hasChanges = false; |
| | | question.saveStatus = { |
| | | type: "success", |
| | | message: "é
ç½®ä¿åæå", |
| | | }; |
| | | |
| | | this.updateChangedStatus(); |
| | | this.$message.success("é
ç½®ä¿åæå"); |
| | | |
| | | // 5ç§åæ¸
餿åæç¤º |
| | | setTimeout(() => { |
| | | question.saveStatus = null; |
| | | }, 5000); |
| | | } else { |
| | | question.saveStatus = { |
| | | type: "error", |
| | | message: response.msg || "ä¿å失败", |
| | | }; |
| | | this.$message.error(response.msg || "ä¿å失败"); |
| | | } |
| | | } catch (error) { |
| | | console.error("ä¿å失败:", error); |
| | | question.saveStatus = { |
| | | type: "error", |
| | | message: "ä¿å失败ï¼è¯·ç¨åéè¯", |
| | | }; |
| | | this.$message.error("ä¿å失败ï¼è¯·ç¨åéè¯"); |
| | | } finally { |
| | | question.saving = false; |
| | | } |
| | | }, |
| | | |
| | | /** éç½®å个é¢ç®é
ç½® */ |
| | | resetSingleConfig(question) { |
| | | this.$confirm("ç¡®å®è¦éç½®å½åé¢ç®çé
ç½®åï¼", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | question.exceptionConfig = JSON.parse( |
| | | JSON.stringify(question.originalConfig) |
| | | ); |
| | | question.hasChanges = false; |
| | | question.saveStatus = null; |
| | | this.updateChangedStatus(); |
| | | this.$message.success("é
置已éç½®"); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | |
| | | /** æ¹éä¿åé
ç½® */ |
| | | async handleBatchSave() { |
| | | if (!this.hasChanges || this.batchSaving) return; |
| | | |
| | | this.$confirm("ç¡®å®è¦ä¿åææä¿®æ¹è¿çé
ç½®åï¼", "æ¹éä¿å", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(async () => { |
| | | this.batchSaving = true; |
| | | |
| | | const changedQuestions = this.questionList.filter( |
| | | (q) => q.hasChanges |
| | | ); |
| | | const results = []; |
| | | |
| | | for (const question of changedQuestions) { |
| | | try { |
| | | await this.saveSingleConfig(question); |
| | | results.push({ |
| | | id: question.id, |
| | | success: |
| | | !question.hasChanges && |
| | | question.saveStatus?.type === "success", |
| | | }); |
| | | } catch (error) { |
| | | results.push({ |
| | | id: question.id, |
| | | success: false, |
| | | }); |
| | | } |
| | | } |
| | | |
| | | this.batchSaving = false; |
| | | |
| | | const successCount = results.filter((r) => r.success).length; |
| | | const failCount = results.length - successCount; |
| | | |
| | | if (failCount === 0) { |
| | | this.saveSuccessVisible = true; |
| | | this.$message.success(`æåä¿å ${successCount} 个é
ç½®`); |
| | | } else { |
| | | this.$message.warning( |
| | | `æåä¿å ${successCount} 个ï¼å¤±è´¥ ${failCount} 个` |
| | | ); |
| | | } |
| | | }) |
| | | .catch(() => { |
| | | this.batchSaving = false; |
| | | }); |
| | | }, |
| | | |
| | | /** é¢è§é¢ç® */ |
| | | previewQuestion(question) { |
| | | this.currentPreview = { ...question }; |
| | | this.previewAnswer = ""; |
| | | this.previewVisible = true; |
| | | }, |
| | | |
| | | /** æç´¢ */ |
| | | handleQuery() { |
| | | this.queryParams.pageNum = 1; |
| | | this.getQuestionList(); |
| | | }, |
| | | |
| | | /** éç½®æç´¢ */ |
| | | resetQuery() { |
| | | this.queryParams = { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | scriptTopic: "", |
| | | scriptContent: "", |
| | | targetname: "", |
| | | isavailable: "", |
| | | categoryids: "404,405,406", |
| | | }; |
| | | this.getQuestionList(); |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .satisfaction-exception-config { |
| | | min-height: 100%; |
| | | background-color: #f5f7fa; |
| | | padding: 20px; |
| | | |
| | | .page-header { |
| | | margin-bottom: 20px; |
| | | padding: 20px; |
| | | background: linear-gradient(135deg, #409eff 0%, #66b1ff 100%); |
| | | border-radius: 8px; |
| | | color: white; |
| | | |
| | | .header-content { |
| | | .page-title { |
| | | margin: 0 0 8px 0; |
| | | font-size: 20px; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .page-description { |
| | | margin: 0; |
| | | opacity: 0.9; |
| | | font-size: 14px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .search-card { |
| | | margin-bottom: 20px; |
| | | |
| | | .search-container { |
| | | border-radius: 8px; |
| | | |
| | | .el-form { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 16px; |
| | | align-items: center; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .config-content { |
| | | .batch-actions-card { |
| | | margin-bottom: 20px; |
| | | |
| | | .batch-actions { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 20px; |
| | | padding: 8px 0; |
| | | |
| | | .change-count { |
| | | color: #e6a23c; |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .total-count { |
| | | margin-left: auto; |
| | | color: #909399; |
| | | font-size: 14px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .loading-wrapper { |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | min-height: 400px; |
| | | |
| | | .loading-spinner { |
| | | text-align: center; |
| | | color: #409eff; |
| | | |
| | | i { |
| | | font-size: 24px; |
| | | margin-right: 8px; |
| | | } |
| | | |
| | | span { |
| | | font-size: 16px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .empty-wrapper { |
| | | min-height: 400px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .question-list { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 16px; |
| | | } |
| | | |
| | | .question-item { |
| | | .question-card { |
| | | border-radius: 8px; |
| | | border: 1px solid #ebeef5; |
| | | transition: all 0.3s ease; |
| | | |
| | | &.has-changes { |
| | | border-color: #409eff; |
| | | box-shadow: 0 2px 12px 0 rgba(64, 158, 255, 0.1); |
| | | } |
| | | |
| | | &:hover { |
| | | box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); |
| | | } |
| | | |
| | | .card-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: flex-start; |
| | | margin-bottom: 20px; |
| | | padding-bottom: 20px; |
| | | border-bottom: 1px solid #f0f0f0; |
| | | |
| | | .header-left { |
| | | display: flex; |
| | | gap: 20px; |
| | | flex: 1; |
| | | |
| | | .question-index { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | min-width: 40px; |
| | | |
| | | .index-number { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | width: 32px; |
| | | height: 32px; |
| | | background: #409eff; |
| | | color: white; |
| | | border-radius: 50%; |
| | | font-size: 14px; |
| | | font-weight: 600; |
| | | margin-bottom: 8px; |
| | | } |
| | | |
| | | .index-line { |
| | | width: 2px; |
| | | height: 100%; |
| | | background: #e0e0e0; |
| | | border-radius: 1px; |
| | | } |
| | | } |
| | | |
| | | .question-basic-info { |
| | | flex: 1; |
| | | |
| | | .question-title-section { |
| | | margin-bottom: 12px; |
| | | |
| | | .question-topic { |
| | | margin: 0 0 8px 0; |
| | | font-size: 16px; |
| | | font-weight: 600; |
| | | color: #303133; |
| | | line-height: 1.4; |
| | | } |
| | | |
| | | .question-tags { |
| | | display: flex; |
| | | gap: 8px; |
| | | flex-wrap: wrap; |
| | | } |
| | | } |
| | | |
| | | .question-content-section { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | gap: 8px; |
| | | |
| | | .content-label { |
| | | color: #606266; |
| | | font-size: 13px; |
| | | font-weight: 500; |
| | | min-width: 80px; |
| | | } |
| | | |
| | | .content-text { |
| | | color: #303133; |
| | | font-size: 13px; |
| | | line-height: 1.6; |
| | | flex: 1; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .header-right { |
| | | flex-shrink: 0; |
| | | } |
| | | } |
| | | |
| | | .config-section { |
| | | .config-title { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 8px; |
| | | margin-bottom: 20px; |
| | | padding: 8px 12px; |
| | | background: #f8f9fa; |
| | | border-radius: 4px; |
| | | |
| | | i { |
| | | color: #409eff; |
| | | font-size: 16px; |
| | | } |
| | | |
| | | span { |
| | | color: #303133; |
| | | font-weight: 600; |
| | | font-size: 14px; |
| | | } |
| | | } |
| | | |
| | | .config-form { |
| | | .config-fields { |
| | | display: grid; |
| | | grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); |
| | | gap: 20px; |
| | | margin-bottom: 20px; |
| | | |
| | | .config-field { |
| | | .config-item { |
| | | margin-bottom: 0; |
| | | |
| | | :deep(.el-form-item__label) { |
| | | font-weight: 500; |
| | | color: #606266; |
| | | padding-right: 12px; |
| | | } |
| | | |
| | | .config-tip { |
| | | font-size: 12px; |
| | | color: #909399; |
| | | margin-top: 4px; |
| | | line-height: 1.4; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .config-footer { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | padding-top: 20px; |
| | | border-top: 1px dashed #dcdfe6; |
| | | |
| | | .save-status { |
| | | flex: 1; |
| | | margin-right: 20px; |
| | | |
| | | .el-alert { |
| | | padding: 8px 16px; |
| | | border-radius: 4px; |
| | | } |
| | | } |
| | | |
| | | .config-actions { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 12px; |
| | | flex-shrink: 0; |
| | | |
| | | .el-button { |
| | | min-width: 100px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .pagination-wrapper { |
| | | margin-top: 20px; |
| | | padding: 20px; |
| | | background: white; |
| | | border-radius: 8px; |
| | | display: flex; |
| | | justify-content: center; |
| | | } |
| | | } |
| | | |
| | | .preview-wrapper { |
| | | .preview-header { |
| | | margin-bottom: 20px; |
| | | |
| | | h4 { |
| | | margin: 0 0 12px 0; |
| | | color: #303133; |
| | | font-size: 18px; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .preview-tags { |
| | | display: flex; |
| | | gap: 8px; |
| | | flex-wrap: wrap; |
| | | } |
| | | } |
| | | |
| | | .preview-content { |
| | | .preview-question { |
| | | margin-bottom: 20px; |
| | | padding: 16px; |
| | | background: #f8f9fa; |
| | | border-radius: 4px; |
| | | color: #606266; |
| | | line-height: 1.6; |
| | | } |
| | | |
| | | .preview-options { |
| | | .option-item { |
| | | display: block; |
| | | margin-bottom: 12px; |
| | | padding: 12px; |
| | | border-radius: 4px; |
| | | border: 1px solid #ebeef5; |
| | | transition: all 0.3s; |
| | | |
| | | &:hover { |
| | | background: #f5f7fa; |
| | | border-color: #409eff; |
| | | } |
| | | |
| | | &:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .preview-textarea { |
| | | .el-textarea__inner { |
| | | resize: none; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .success-content { |
| | | text-align: center; |
| | | padding: 20px 0; |
| | | |
| | | .success-icon { |
| | | color: #67c23a; |
| | | font-size: 48px; |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .success-text { |
| | | font-size: 16px; |
| | | color: #606266; |
| | | margin: 0; |
| | | } |
| | | } |
| | | } |
| | | |
| | | @media (max-width: 768px) { |
| | | .satisfaction-exception-config { |
| | | padding: 12px; |
| | | |
| | | .page-header { |
| | | padding: 16px; |
| | | margin-bottom: 16px; |
| | | } |
| | | |
| | | .search-card { |
| | | margin-bottom: 16px; |
| | | } |
| | | |
| | | .config-content { |
| | | .batch-actions-card { |
| | | margin-bottom: 16px; |
| | | } |
| | | |
| | | .question-item { |
| | | .question-card { |
| | | .card-header { |
| | | flex-direction: column; |
| | | gap: 12px; |
| | | |
| | | .header-left { |
| | | flex-direction: column; |
| | | gap: 12px; |
| | | |
| | | .question-index { |
| | | flex-direction: row; |
| | | align-items: center; |
| | | min-width: auto; |
| | | |
| | | .index-number { |
| | | margin-bottom: 0; |
| | | margin-right: 12px; |
| | | } |
| | | |
| | | .index-line { |
| | | width: 100%; |
| | | height: 2px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .config-section { |
| | | .config-form { |
| | | .config-fields { |
| | | grid-template-columns: 1fr; |
| | | gap: 16px; |
| | | } |
| | | |
| | | .config-footer { |
| | | flex-direction: column; |
| | | align-items: stretch; |
| | | gap: 12px; |
| | | |
| | | .save-status { |
| | | margin-right: 0; |
| | | margin-bottom: 8px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | | |
| | | <style lang="scss"> |
| | | .config-form { |
| | | .el-checkbox-group { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 12px; |
| | | } |
| | | |
| | | .el-checkbox { |
| | | margin: 0; |
| | | } |
| | | } |
| | | |
| | | .option-item { |
| | | .el-radio__label { |
| | | display: block; |
| | | padding-left: 8px; |
| | | } |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="Questionnairemanagement"> |
| | | <!-- ä¸ä¾§æ --> |
| | | <div class="sidecolumn"> |
| | | <div> |
| | | <el-steps simple :active="Editprogress"> |
| | | <el-step |
| | | icon="el-icon-edit" |
| | | title="åºç¡ä¿¡æ¯" |
| | | description="éæ©å®£ææ¨¡æ¿ãå½¢å¼çåºç¡ä¿¡æ¯" |
| | | ></el-step> |
| | | <el-step |
| | | icon="el-icon-user" |
| | | title="宣æå¯¹è±¡" |
| | | description="卿¬é¨éæ©å®£æç
人" |
| | | ></el-step> |
| | | </el-steps> |
| | | </div> |
| | | </div> |
| | | <!-- ä¸ä¾§æ°æ® --> |
| | | <div class="leftvlue" style="margin: 0 20px"> |
| | | <!-- åºæ¬ä¿¡æ¯ --> |
| | | <div v-if="Editprogress == 1"> |
| | | <el-alert |
| | | title="éæ©å®£ææ¨¡æ¿ãå½¢å¼çåºç¡ä¿¡æ¯" |
| | | type="success" |
| | | effect="dark" |
| | | > |
| | | </el-alert> |
| | | <div class="leftvlue-jbxx"> |
| | | <!-- åºç¡ä¿¡æ¯ --> |
| | | <div class="examine-jic"> |
| | | <div class="headline"> |
| | | <div>åºç¡ä¿¡æ¯</div> |
| | | </div> |
| | | <div class="jic-value"> |
| | | <el-form ref="form" :model="form" label-width="105px"> |
| | | <el-form-item label="åéæ¶é´ï¼" v-if="currenttype != 2"> |
| | | <el-date-picker |
| | | v-model="form.name" |
| | | type="date" |
| | | placeholder="éæ©æ¥æ" |
| | | > |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="åéæ¶é´æ®µï¼" v-if="currenttype != 2"> |
| | | <el-checkbox-group v-model="checkList"> |
| | | <el-checkbox label="ä¸åï¼8:30-11:30ï¼"></el-checkbox> |
| | | <el-checkbox label="ä¸åï¼14:30-16:30ï¼"></el-checkbox> |
| | | <el-checkbox label="å¤é´ï¼18:30-20:30ï¼"></el-checkbox> |
| | | </el-checkbox-group> |
| | | </el-form-item> |
| | | <el-form-item label="æå¡å½¢å¼"> |
| | | <el-checkbox-group v-model="checkList"> |
| | | <el-checkbox |
| | | v-for="(item, index) in checkboxlist" |
| | | :key="index" |
| | | :label="item" |
| | | ></el-checkbox> |
| | | </el-checkbox-group> |
| | | </el-form-item> |
| | | <el-form-item label="ç»ç»å½¢å¼"> |
| | | <el-radio-group v-model="form.radio"> |
| | | <el-radio :label="3">å人</el-radio> |
| | | <el-radio :label="6">å¤äºº</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="è¯é³æ¨¡æ¿" prop="region"> |
| | | <el-select v-model="form.region" placeholder="è¯·éæ©æ¨¡æ¿"> |
| | | <el-option label="ä¸å·æ¨¡æ¿" value="shanghai"></el-option> |
| | | <el-option label="äºå·æ¨¡æ¿" value="beijing"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | </div> |
| | | <div class="examine-jic"> |
| | | <div class="headline"> |
| | | <div>{{ title }}</div> |
| | | </div> |
| | | <div class="examine-jic"> |
| | | <div class="jic-value"> |
| | | <el-row :gutter="20"> |
| | | <!--ç¨æ·æ°æ®--> |
| | | |
| | | <el-form |
| | | :model="topqueryParams" |
| | | ref="queryForm" |
| | | size="small" |
| | | :inline="true" |
| | | v-show="showSearch" |
| | | label-width="98px" |
| | | > |
| | | <el-form-item label="æ§è¡ç¶æ" prop="status"> |
| | | <el-select |
| | | v-model="topqueryParams.topic" |
| | | placeholder="è¯·éæ©" |
| | | > |
| | | <el-option |
| | | v-for="item in taskoptions" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item |
| | | label="ç§å®¤åç§°" |
| | | v-if="currenttype == 1 || currenttype == 3" |
| | | > |
| | | <el-input |
| | | v-model="topqueryParams.name" |
| | | ></el-input> </el-form-item |
| | | ><el-form-item label="ç
åºåç§°" v-if="currenttype == 2"> |
| | | <el-input v-model="topqueryParams.name"></el-input> |
| | | </el-form-item> |
| | | <el-form-item |
| | | label="æ£è
å§å" |
| | | v-if="currenttype == 1 || currenttype == 2" |
| | | > |
| | | <el-input v-model="topqueryParams.name"></el-input> |
| | | </el-form-item> |
| | | <el-form-item |
| | | label="主治å»ç" |
| | | v-if="currenttype == 1 || currenttype == 2" |
| | | > |
| | | <el-input v-model="topqueryParams.name"></el-input> |
| | | </el-form-item> |
| | | <el-form-item |
| | | label="ç®¡åºæ¤å£«" |
| | | v-if="currenttype == 1 || currenttype == 2" |
| | | > |
| | | <el-input v-model="topqueryParams.name"></el-input> |
| | | </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> |
| | | <!-- 鿩任å¡å表 --> |
| | | <SFtable |
| | | @handleUpdate="handleUpdate" |
| | | @handleSelectionChange="handleSelectionChange" |
| | | :currentList="userList" |
| | | :tableLabel="tableLabelxj" |
| | | :controlsc="false" |
| | | :multiplechoice="false" |
| | | /> |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | :page.sync="topqueryParams.pageNum" |
| | | :limit.sync="topqueryParams.pageSize" |
| | | @pagination="getList" |
| | | /> |
| | | </el-row> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <el-button type="success" @click="submitForm('ruleForm')">{{ |
| | | quote ? "ç«å³å建" : "ä»»å¡è¯¦æ
设置" |
| | | }}</el-button> |
| | | <el-button @click="resetForm('ruleForm')">éç½®</el-button> |
| | | </div> |
| | | |
| | | <!-- ä»»å¡è¯¦æ
--> |
| | | <div v-if="Editprogress == 2"> |
| | | <el-alert title="卿¬é¶æ®µéæ©ç
人" type="success" effect="dark"> |
| | | </el-alert> |
| | | <div class="leftvlue-jbxx"> |
| | | <div class="examine-jic"> |
| | | <div class="headline"> |
| | | <div>æ£è
å表</div> |
| | | </div> |
| | | <div class="examine-jic"> |
| | | <div class="jic-value"> |
| | | <el-row :gutter="20"> |
| | | <!--ç¨æ·æ°æ®--> |
| | | <el-form |
| | | :model="topqueryParams" |
| | | ref="queryForm" |
| | | size="small" |
| | | :inline="true" |
| | | v-show="showSearch" |
| | | label-width="98px" |
| | | > |
| | | <el-form-item label="æ£è
åç§°"> |
| | | <el-input v-model="topqueryParams.name"></el-input> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="æ£è
èå´" prop="status"> |
| | | <el-select |
| | | v-model="topqueryParams.searchscope" |
| | | placeholder="è¯·éæ©" |
| | | > |
| | | <el-option |
| | | v-for="item in source" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="æ£è
ç¶æ" prop="status"> |
| | | <el-select |
| | | v-model="topqueryParams.topic" |
| | | placeholder="è¯·éæ©" |
| | | > |
| | | <el-option |
| | | v-for="item in topicoptions" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="éè®¿ç»æ" prop="status"> |
| | | <el-select |
| | | v-model="topqueryParams.topic" |
| | | placeholder="è¯·éæ©" |
| | | > |
| | | <el-option |
| | | v-for="item in topicoptions" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="æ£è
çµè¯"> |
| | | <el-input v-model="topqueryParams.name"></el-input> |
| | | </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-button |
| | | icon="el-icon-upload2" |
| | | size="medium" |
| | | type="warning" |
| | | >å½åæ£è
ä¸é®åé</el-button |
| | | > |
| | | </el-form-item> |
| | | </el-form> |
| | | <el-divider></el-divider> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-select |
| | | v-model="tasktopic" |
| | | placeholder="è¯·éæ©æ°å¢ç±»å" |
| | | > |
| | | <el-option |
| | | v-for="item in taskoptions" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | type="primary" |
| | | plain |
| | | icon="el-icon-plus" |
| | | size="medium" |
| | | :disabled="!tasktopic" |
| | | @click="handleAddpatient" |
| | | >æ°å¢</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-col :span="1.5"> </el-col> --> |
| | | </el-row> |
| | | <!-- é䏿£è
å表 --> |
| | | <SFtable |
| | | @handleUpdate="handleUpdate" |
| | | @handleSelectionChange="handleSelectionChange" |
| | | :currentList="sonuserList" |
| | | :tableLabel="tableLabelhz" |
| | | :controlxz="false" |
| | | /> |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | :page.sync="topqueryParams.pageNum" |
| | | :limit.sync="topqueryParams.pageSize" |
| | | @pagination="getList" |
| | | /> |
| | | </el-row> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <el-button type="primary" @click="laststep()">ä¸ä¸æ¥</el-button> |
| | | <el-button type="success" @click="submitForm('ruleForm')" |
| | | >ç«å³å建</el-button |
| | | > |
| | | <el-button @click="resetForm('ruleForm')">éç½®</el-button> |
| | | </div> |
| | | </div> |
| | | <!-- æ·»å æ£è
--> |
| | | <el-dialog |
| | | title="éæ©æ£è
" |
| | | :visible.sync="dialogVisiblepatient" |
| | | width="70%" |
| | | :before-close="handleClosehz" |
| | | > |
| | | <div class="examine-jic"> |
| | | <div class="jic-value"> |
| | | <el-row :gutter="20"> |
| | | <!--ç¨æ·æ°æ®--> |
| | | <el-form |
| | | :model="patientqueryParams" |
| | | ref="queryForm" |
| | | size="small" |
| | | :inline="true" |
| | | v-show="showSearch" |
| | | label-width="98px" |
| | | > |
| | | <el-form-item label="æ£è
åç§°ï¼"> |
| | | <el-input v-model="patientqueryParams.name"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="æ£è
èå´" prop="status"> |
| | | <el-select |
| | | v-model="patientqueryParams.topic" |
| | | placeholder="è¯·éæ©" |
| | | > |
| | | <el-option |
| | | v-for="item in topicoptions" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="åºé¢ç§å®¤" prop="status"> |
| | | <el-select |
| | | v-model="patientqueryParams.topic" |
| | | placeholder="è¯·éæ©" |
| | | > |
| | | <el-option |
| | | v-for="item in topicoptions" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="åºé¢ç
åº" prop="status"> |
| | | <el-select |
| | | v-model="patientqueryParams.topic" |
| | | placeholder="è¯·éæ©" |
| | | > |
| | | <el-option |
| | | v-for="item in topicoptions" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </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> |
| | | <!-- éæ©æ£è
å表 --> |
| | | <SFtable |
| | | @handleUpdate="handleUpdate" |
| | | @handleSelectionChange="handleSelectionChange" |
| | | :currentList="patientuserList" |
| | | :tableLabel="tableLabelhz" |
| | | :controlsc="false" |
| | | /> |
| | | </el-row> |
| | | <pagination |
| | | v-show="patienttotal > 0" |
| | | :total="patienttotal" |
| | | :page.sync="patientqueryParams.pageNum" |
| | | :limit.sync="patientqueryParams.pageSize" |
| | | @pagination="handleAddpatient" |
| | | /> |
| | | </div> |
| | | </div> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="dialogVisiblepatient = false">å æ¶</el-button> |
| | | <el-button type="primary" @click="AddDispatchpatients" |
| | | >ç¡®å®æ·»å </el-button |
| | | > |
| | | </span> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { messagelistpatient } from "@/api/patient/homepage"; |
| | | import SFtable from "@/components/SFtable"; //è¡¨æ ¼ç»ä»¶ |
| | | |
| | | export default { |
| | | name: "ServiceDetails", |
| | | data() { |
| | | return { |
| | | title: "宣æå
容å表", |
| | | currenttype: 1, //1宣æ2é¨è¯3åºé¢4å¤è¯5使£6é®å· |
| | | Editprogress: 1, //ç¼è¾è¿åº¦ |
| | | loading: false, // é®ç½©å± |
| | | patientloading: false, // é®ç½©å± |
| | | dialogVisiblepatient: false, //æ·»å æ£è
å¼¹æ¡ |
| | | checkboxlist: [], |
| | | tableLabel: [], |
| | | // æ£è
表å |
| | | tableLabelhz: [ |
| | | { label: "æ£è
åç§°", width: "", prop: "name" }, |
| | | { label: "æ§å«", width: "", prop: "sex" }, |
| | | { label: "å¹´é¾", width: "", prop: "age" }, |
| | | { label: "å°±è¯ç§å®¤", width: "", prop: "impTemplate" }, |
| | | { label: "å
¥é¢æ¥æ", width: "", prop: "create_time" }, |
| | | { label: "å建人", width: "", prop: "update_by" }, |
| | | ], |
| | | tableLabelxj: [ |
| | | { label: "é¨è¯ç¼å·", width: "", prop: "name" }, |
| | | { label: "å§å", width: "", prop: "name" }, |
| | | { label: "å¹´é¾", width: "", prop: "age" }, |
| | | { label: "èç³»çµè¯", width: "", prop: "telcode" }, |
| | | { label: "å°±è¯ç§å®¤", width: "", prop: "impTemplate" }, |
| | | { label: "è¯æ", width: "", prop: "name" }, |
| | | { label: "åºé¢æ¶é´", width: "", prop: "name" }, |
| | | { label: "åèµ·æ¶é´", width: "", prop: "create_time" }, |
| | | { label: "ç¶æ", width: "", prop: "sex" }, |
| | | { label: "é夿¬¡æ°", width: "", prop: "update_by" }, |
| | | { label: "任塿¥æº", width: "", prop: "update_by" }, |
| | | { label: "å建人", width: "", prop: "update_by" }, |
| | | ], |
| | | tableLabelmz: [ |
| | | { label: "é¨è¯ç¼å·", width: "", prop: "name" }, |
| | | { label: "å§å", width: "", prop: "name" }, |
| | | { label: "å¹´é¾", width: "", prop: "age" }, |
| | | { label: "èç³»çµè¯", width: "", prop: "telcode" }, |
| | | { label: "å°±è¯ç§å®¤", width: "", prop: "impTemplate" }, |
| | | { label: "è¯æ", width: "", prop: "name" }, |
| | | { label: "åºé¢æ¶é´", width: "", prop: "name" }, |
| | | { label: "åèµ·æ¶é´", width: "", prop: "create_time" }, |
| | | { label: "ç¶æ", width: "", prop: "sex" }, |
| | | { label: "é夿¬¡æ°", width: "", prop: "update_by" }, |
| | | { label: "任塿¥æº", width: "", prop: "update_by" }, |
| | | { label: "å建人", width: "", prop: "update_by" }, |
| | | ], |
| | | tableLabelcy: [ |
| | | { label: "åå·¥ç¼å·", width: "", prop: "name" }, |
| | | { label: "å§å", width: "", prop: "name" }, |
| | | { label: "å¹´é¾", width: "", prop: "age" }, |
| | | { label: "èç³»çµè¯", width: "", prop: "telcode" }, |
| | | { label: "æå¨ç§å®¤", width: "", prop: "impTemplate" }, |
| | | { label: "宿æ¶é´", width: "", prop: "finishtime" }, |
| | | { label: "ç¶æ", width: "", prop: "sex" }, |
| | | { label: "é夿¬¡æ°", width: "", prop: "update_by" }, |
| | | { label: "任塿¥æº", width: "", prop: "update_by" }, |
| | | { label: "å建人", width: "", prop: "update_by" }, |
| | | ], |
| | | |
| | | topqueryParams: { |
| | | pageNum: 1, // |
| | | pageSize: 10, |
| | | searchscope:2, |
| | | }, |
| | | checkList: [], |
| | | deliverytopqueryParams: { |
| | | pageNum: 1, // |
| | | pageSize: 10, |
| | | }, |
| | | patientqueryParams: { |
| | | pageNum: 1, // |
| | | pageSize: 10, |
| | | }, |
| | | topicoptions: [], |
| | | showSearch: true, // |
| | | total: 0, // |
| | | sontotal: 0, // |
| | | patienttotal: 0, // |
| | | // é䏿°ç» |
| | | ids: [], |
| | | // éå个ç¦ç¨ |
| | | single: true, |
| | | // éå¤ä¸ªç¦ç¨ |
| | | multiple: true, |
| | | // ç¨æ·è¡¨æ ¼æ°æ® |
| | | userList: [], //模æ¿å表 |
| | | patientuserList: [], //éæ©æ£è
å表 |
| | | sonuserList: [], //é䏿£è
å表 |
| | | tasktopic: null, //æ°å¢ç±»å |
| | | form: { |
| | | name: "", |
| | | region: "", |
| | | date1: "", |
| | | date2: "", |
| | | delivery: false, |
| | | type: [], |
| | | resource: "", |
| | | desc: "", |
| | | }, |
| | | source: [ |
| | | { |
| | | value: 0, |
| | | label: "æå±æ£è
", |
| | | }, |
| | | { |
| | | value: 1, |
| | | label: "ç§å®¤æ£è
", |
| | | }, |
| | | { |
| | | value: 2, |
| | | label: "ç
åºæ£è
", |
| | | }, |
| | | ], |
| | | options: [ |
| | | { |
| | | value: "é项1", |
| | | label: "é»éç³", |
| | | }, |
| | | { |
| | | value: "é项2", |
| | | label: "åç®å¥¶", |
| | | }, |
| | | { |
| | | value: "é项5", |
| | | label: "å京ç¤é¸", |
| | | }, |
| | | ], |
| | | taskoptions: [ |
| | | { |
| | | value: "1", |
| | | label: "éç¥", |
| | | }, |
| | | { |
| | | value: "2", |
| | | label: "é访", |
| | | }, |
| | | { |
| | | value: "3", |
| | | label: "é®å·", |
| | | }, |
| | | { |
| | | value: "4", |
| | | label: "宣æ", |
| | | }, |
| | | ], |
| | | quote: false, |
| | | }; |
| | | }, |
| | | components: { SFtable }, |
| | | |
| | | created() { |
| | | this.Addsubtask(); |
| | | this.Getsubtask(); |
| | | this.Acquisitiontype(); |
| | | }, |
| | | |
| | | methods: { |
| | | // è·åå½åç±»å |
| | | Acquisitiontype() { |
| | | this.currenttype = this.$route.query.type; |
| | | console.log(this.currenttype); |
| | | if (this.currenttype == 1) { |
| | | this.title = "é¨è¯ç
人任å¡"; |
| | | this.tableLabel = this.tableLabelxj; |
| | | this.checkboxlist = [ |
| | | "å½é¢", |
| | | "å¤åªä½", |
| | | "纸质", |
| | | "çµè¯", |
| | | "çä¿¡", |
| | | "微信å
¬ä¼å·", |
| | | "微信å°ç¨åº", |
| | | "éé", |
| | | ]; |
| | | } else if (this.currenttype == 2) { |
| | | this.title = "åºé¢ç
人任å¡"; |
| | | this.tableLabel = this.tableLabelmz; |
| | | this.checkboxlist = ["å½é¢", "纸质", "çµè¯", "çä¿¡", "微信å
¬ä¼å·"]; |
| | | } else if (this.currenttype == 3) { |
| | | this.title = "å»å¡äººåä»»å¡"; |
| | | this.tableLabel = this.tableLabelcy; |
| | | this.checkboxlist = ["å½é¢", "纸质", "çµè¯", "çä¿¡", "微信å
¬ä¼å·"]; |
| | | } |
| | | }, |
| | | // ä¸ä¸æ¥ |
| | | submitForm(formName) { |
| | | if (this.Editprogress <= 3) { |
| | | return this.Editprogress++; |
| | | } |
| | | // æäº¤ |
| | | // this.$refs[formName].validate((valid, object) => { |
| | | // if (valid) { |
| | | // alert("submit!"); |
| | | // } else { |
| | | // console.log("error submit!!", object); |
| | | // return false; |
| | | // } |
| | | // }); |
| | | }, |
| | | // åä»»å¡äºçº§å¼¹æ¡ |
| | | handleAddpatient(row) { |
| | | console.log(row, "åç»ä»¶æ°æ®"); |
| | | messagelistpatient(this.patientqueryParams).then((response) => { |
| | | console.log(response); |
| | | this.patientuserList = response.rows; |
| | | this.patienttotal = response.total; |
| | | this.loading = false; |
| | | }); |
| | | this.dialogVisiblepatient = true; |
| | | }, |
| | | handleUpdate() {}, |
| | | handleDelete() {}, |
| | | handleExport() {}, |
| | | // å¤éæ¡é䏿°æ® |
| | | handleSelectionChange(selection) { |
| | | this.ids = null; |
| | | this.ids = selection.map((item) => item.patid).join(","); |
| | | // let result = this.ids.join(","); |
| | | this.multiple = !selection.length; |
| | | console.log(this.ids); |
| | | }, |
| | | getList() {}, |
| | | handleQuery() {}, |
| | | resetQuery() {}, |
| | | handleClosehz() { |
| | | this.dialogVisiblepatient = false; |
| | | }, |
| | | // ä¸ä¸æ¥ |
| | | laststep() { |
| | | this.Editprogress--; |
| | | }, |
| | | // æäº¤è¡¨å |
| | | resetForm(formName) { |
| | | this.$refs[formName].resetFields(); |
| | | }, |
| | | // é¢è§æ¨¡æ¿ |
| | | PreviewTemplate() {}, |
| | | Acknowledgereference() { |
| | | this.quote = true; |
| | | }, |
| | | // æ°å¢åä»»å¡ |
| | | Addsubtask() { |
| | | this.topqueryParams.pguid = 2; |
| | | // addsvr_prjtask(this.topqueryParams).then((res) => { |
| | | // console.log(res); |
| | | // }); |
| | | }, |
| | | // æ°å¢æ´¾éæ£è
|
| | | AddDispatchpatients() { |
| | | let objictpint = {}; |
| | | objictpint.patientes = this.ids; |
| | | objictpint.pguid = 2; |
| | | // Addpatienttask(objictpint).then((res) => { |
| | | // console.log(res); |
| | | // }); |
| | | this.dialogVisiblepatient = false; |
| | | }, |
| | | |
| | | // æ¥è¯¢åä»»å¡å表 |
| | | Getsubtask() { |
| | | this.topqueryParams.pguid = 2; |
| | | console.log(this.topqueryParams); |
| | | messagelistpatient(this.topqueryParams).then((res) => { |
| | | this.userList = res.rows; |
| | | this.total = res.total; |
| | | console.log(this.userList); |
| | | }); |
| | | }, |
| | | /** æ¥è¯¢æ£è
å表 */ |
| | | }, |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .Questionnairemanagement { |
| | | } |
| | | .leftvlue-jbxx { |
| | | margin-top: 10px; |
| | | } |
| | | .sidecolumn { |
| | | width: 100%; |
| | | // min-height: 12vh; |
| | | margin: 20px; |
| | | margin-bottom: 0; |
| | | padding: 20px; |
| | | background: #edf1f7; |
| | | border: 1px solid #dcdfe6; |
| | | -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), |
| | | 0 0 6px 0 rgba(0, 0, 0, 0.04); |
| | | } |
| | | .leftvlue { |
| | | // display: flex; |
| | | // flex: 1; |
| | | width: 100%; |
| | | margin-top: 20px; |
| | | // margin: 20px; |
| | | padding: 30px; |
| | | background: #ffff; |
| | | border: 1px solid #dcdfe6; |
| | | -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), |
| | | 0 0 6px 0 rgba(0, 0, 0, 0.04); |
| | | } |
| | | .examine-jic { |
| | | .headline { |
| | | font-size: 24px; |
| | | border-left: 5px solid #41a1be; |
| | | padding-left: 5px; |
| | | margin-bottom: 10px; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | .Add-details { |
| | | font-size: 18px; |
| | | color: #02a7f0; |
| | | cursor: pointer; |
| | | } |
| | | } |
| | | .jic-value { |
| | | font-size: 20px; |
| | | border-top: 1px solid #a7abac; |
| | | padding: 10px; |
| | | margin-bottom: 10px; |
| | | .details-jic { |
| | | padding: 10px 15px; |
| | | border: 1px solid #dcdfe6; |
| | | -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), |
| | | 0 0 6px 0 rgba(0, 0, 0, 0.04); |
| | | .details-title { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | margin-bottom: 10px; |
| | | div:nth-child(2) { |
| | | color: #02a7f0; |
| | | cursor: pointer; |
| | | } |
| | | } |
| | | .details-renw { |
| | | background: #e4ebfc; |
| | | padding: 15px 5px; |
| | | border-radius: 5px; |
| | | margin-bottom: 20px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | // .leftvlue-jbxx { |
| | | // margin-bottom: 50px; |
| | | // font-size: 20px; |
| | | // span { |
| | | // position: absolute; |
| | | // right: 80px; |
| | | // } |
| | | // .demo-cascader { |
| | | // margin-right: 20px; |
| | | // } |
| | | // .PreviewTemplate { |
| | | // color: #02a7f0; |
| | | // cursor: pointer; |
| | | // font-size: 20px; |
| | | // margin: 0 20px; |
| | | // } |
| | | // } |
| | | .jic-value { |
| | | font-size: 20px; |
| | | border-top: 1px solid #a7abac; |
| | | padding: 10px; |
| | | margin-bottom: 10px; |
| | | .details-jic { |
| | | padding: 10px 15px; |
| | | border: 1px solid #dcdfe6; |
| | | -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), |
| | | 0 0 6px 0 rgba(0, 0, 0, 0.04); |
| | | .details-title { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | margin-bottom: 10px; |
| | | div:nth-child(2) { |
| | | color: #02a7f0; |
| | | cursor: pointer; |
| | | } |
| | | } |
| | | .details-renw { |
| | | background: #e4ebfc; |
| | | padding: 15px 5px; |
| | | border-radius: 5px; |
| | | margin-bottom: 20px; |
| | | } |
| | | } |
| | | } |
| | | ::v-deep .addtopic-input { |
| | | input { |
| | | background: #02a7f0; |
| | | color: #edf1f7; |
| | | width: 150px; |
| | | } |
| | | } |
| | | ::v-deep.el-step.is-vertical .el-step__title { |
| | | font-size: 25px; |
| | | } |
| | | ::v-deep.el-row { |
| | | margin-bottom: 10px; |
| | | } |
| | | // ::v-deep.el-input--medium { |
| | | // font-size: 24px !important; |
| | | // } |
| | | ::v-deep.ruleFormaa.el-select { |
| | | display: inline-block; |
| | | position: relative; |
| | | width: 700px; |
| | | } |
| | | .el-select__tags { |
| | | font-size: 20px; |
| | | max-width: 888px !important; |
| | | } |
| | | ::v-deep.el-radio__inner { |
| | | width: 22px; |
| | | height: 22px; |
| | | } |
| | | // ::v-deep.topic-dev.el-radio__label { |
| | | // font-size: 24px; |
| | | // } |
| | | ::v-deep.el-radio-group { |
| | | span { |
| | | font-size: 24px; |
| | | } |
| | | } |
| | | ::v-deep.el-checkbox-group { |
| | | span { |
| | | font-size: 24px; |
| | | } |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="followup-statistics"> |
| | | <div class="query-section"> |
| | | <el-form |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | size="medium" |
| | | :inline="true" |
| | | label-width="100px" |
| | | class="query-form" |
| | | > |
| | | <el-form-item label="ç»è®¡ç±»å" prop="statisticaltype"> |
| | | <el-select |
| | | v-model="queryParams.statisticaltype" |
| | | placeholder="è¯·éæ©ç»è®¡ç±»å" |
| | | clearable |
| | | @change="handleStatisticalTypeChange" |
| | | > |
| | | <el-option |
| | | v-for="item in Statisticallist" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <!-- ç
åºéæ© --> |
| | | <el-form-item |
| | | v-if="queryParams.statisticaltype == 1" |
| | | label="ç
åº" |
| | | prop="leavehospitaldistrictcodes" |
| | | > |
| | | <el-select |
| | | v-model="queryParams.leavehospitaldistrictcodes" |
| | | placeholder="è¯·éæ©ç
åº" |
| | | multiple |
| | | collapse-tags |
| | | filterable |
| | | clearable |
| | | style="width: 300px" |
| | | > |
| | | <el-option |
| | | v-for="item in flatArrayhospit" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <!-- ç§å®¤éæ© --> |
| | | <el-form-item |
| | | v-if="queryParams.statisticaltype == 2" |
| | | label="ç§å®¤" |
| | | prop="deptcodes" |
| | | > |
| | | <el-select |
| | | v-model="queryParams.deptcodes" |
| | | placeholder="è¯·éæ©ç§å®¤" |
| | | multiple |
| | | collapse-tags |
| | | filterable |
| | | clearable |
| | | style="width: 300px" |
| | | > |
| | | <el-option |
| | | v-for="item in flatArraydept" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="æå¡ç±»å" prop="serviceType"> |
| | | <el-select |
| | | v-model="queryParams.serviceType" |
| | | placeholder="è¯·éæ©æå¡ç±»å" |
| | | multiple |
| | | collapse-tags |
| | | clearable |
| | | style="width: 300px" |
| | | > |
| | | <el-option |
| | | v-for="item in options" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="é访æ¶é´" prop="dateRange"> |
| | | <el-date-picker |
| | | v-model="queryParams.dateRange" |
| | | type="daterange" |
| | | range-separator="è³" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | value-format="yyyy-MM-dd" |
| | | :picker-options="pickerOptions" |
| | | style="width: 380px" |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | @click="handleQuery" |
| | | :loading="loading" |
| | | > |
| | | æç´¢ |
| | | </el-button> |
| | | <el-button icon="el-icon-refresh" @click="resetQuery"> |
| | | éç½® |
| | | </el-button> |
| | | <el-button |
| | | type="warning" |
| | | icon="el-icon-download" |
| | | @click="handleExport" |
| | | :disabled="!userList.length" |
| | | > |
| | | å¯¼åº |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | |
| | | <div class="table-section"> |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="userList" |
| | | :border="true" |
| | | style="width: 100%" |
| | | @selection-change="handleSelectionChange" |
| | | :row-key="getRowKey" |
| | | > |
| | | <!-- ç
åºå --> |
| | | <el-table-column |
| | | v-if="queryParams.statisticaltype == 1" |
| | | label="åºé¢ç
åº" |
| | | align="center" |
| | | key="leavehospitaldistrictname" |
| | | prop="leavehospitaldistrictname" |
| | | :show-overflow-tooltip="true" |
| | | min-width="120" |
| | | /> |
| | | |
| | | <!-- ç§å®¤å --> |
| | | <el-table-column |
| | | v-if="queryParams.statisticaltype == 2" |
| | | label="ç§å®¤" |
| | | align="center" |
| | | key="deptname" |
| | | prop="deptname" |
| | | :show-overflow-tooltip="true" |
| | | min-width="120" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="åºé¢äººæ¬¡" |
| | | align="center" |
| | | key="dischargeCount" |
| | | prop="dischargeCount" |
| | | min-width="100" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="æ éé访人次" |
| | | align="center" |
| | | key="nonFollowUp" |
| | | prop="nonFollowUp" |
| | | min-width="120" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="åºé访人次" |
| | | align="center" |
| | | key="followUpNeeded" |
| | | prop="followUpNeeded" |
| | | min-width="120" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="é访ç" |
| | | align="center" |
| | | key="followUpRate" |
| | | prop="followUpRate" |
| | | min-width="100" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span v-if="scope.row.followUpRate !== null && scope.row.followUpRate !== undefined"> |
| | | {{ formatPercent(scope.row.followUpRate) }} |
| | | </span> |
| | | <span v-else>-</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="åæ¶ç" |
| | | align="center" |
| | | key="rate" |
| | | prop="rate" |
| | | min-width="100" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | v-if="scope.row.rate !== null && scope.row.rate !== undefined" |
| | | type="text" |
| | | @click="handleSeedetails(scope.row)" |
| | | > |
| | | {{ formatPercent(scope.row.rate) }} |
| | | </el-button> |
| | | <span v-else style="color: #909399">-</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="满æåº¦é¢ç®æ»é" |
| | | align="center" |
| | | key="joyAllCount" |
| | | prop="joyAllCount" |
| | | min-width="140" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="满æåº¦å¡«æ¥é" |
| | | align="center" |
| | | key="joyCount" |
| | | prop="joyCount" |
| | | min-width="120" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="宿æ¯ç" |
| | | align="center" |
| | | key="joyTotal" |
| | | prop="joyTotal" |
| | | min-width="100" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span v-if="scope.row.joyTotal !== null && scope.row.joyTotal !== undefined"> |
| | | {{ formatPercent(scope.row.joyTotal) }} |
| | | </span> |
| | | <span v-else>-</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="æä½" |
| | | align="center" |
| | | fixed="right" |
| | | width="120" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | type="text" |
| | | @click="getinfo(scope.row)" |
| | | > |
| | | <i class="el-icon-s-order" style="margin-right: 4px"></i> |
| | | æ¥ç详æ
|
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | |
| | | <!-- å页 --> |
| | | <div class="pagination-section" v-if="total > 0"> |
| | | <el-pagination |
| | | background |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | :current-page="queryParams.pageNum" |
| | | :page-size="queryParams.pageSize" |
| | | :page-sizes="[10, 20, 30, 50]" |
| | | :total="total" |
| | | @size-change="handleSizeChange" |
| | | @current-change="handlePageChange" |
| | | /> |
| | | </div> |
| | | |
| | | <!-- æªåæ¶é访详æ
å¯¹è¯æ¡ --> |
| | | <el-dialog |
| | | title="æªåæ¶é访æ£è
æå¡" |
| | | :visible.sync="SeedetailsVisible" |
| | | width="80%" |
| | | :close-on-click-modal="false" |
| | | > |
| | | <SeedetailsDialog |
| | | v-if="SeedetailsVisible" |
| | | :row-data="currentRow" |
| | | :query-params="queryParams" |
| | | @close="SeedetailsVisible = false" |
| | | /> |
| | | </el-dialog> |
| | | |
| | | <!-- 满æåº¦è¯¦æ
å¯¹è¯æ¡ --> |
| | | <el-dialog |
| | | :visible.sync="topicVisible" |
| | | width="60%" |
| | | :close-on-click-modal="false" |
| | | > |
| | | <template #title> |
| | | <div style="display: flex; align-items: center;"> |
| | | <i class="el-icon-s-data" style="margin-right: 8px; color: #409EFF;"></i> |
| | | <span>{{ topicvalue.name }}</span> |
| | | <span style="margin-left: 10px; color: #666; font-size: 14px;">满æåº¦ææ 详æ
</span> |
| | | </div> |
| | | </template> |
| | | <topic-dialog |
| | | v-if="topicVisible" |
| | | :row-data="currentRow" |
| | | :query-params="queryParams" |
| | | @close="topicVisible = false" |
| | | /> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { getSfStatisticsJoy, getSfStatisticsJoyInfo, selectTimelyRate } from "@/api/system/user"; |
| | | import ExcelJS from "exceljs"; |
| | | import { saveAs } from "file-saver"; |
| | | import SeedetailsDialog from './components/SeedetailsDialog.vue'; |
| | | import TopicDialog from './components/TopicDialog.vue'; |
| | | |
| | | export default { |
| | | name: 'FollowupStatistics', |
| | | components: { |
| | | SeedetailsDialog, |
| | | TopicDialog |
| | | }, |
| | | data() { |
| | | return { |
| | | // æ¥è¯¢åæ° |
| | | queryParams: { |
| | | statisticaltype: 1, |
| | | leavehospitaldistrictcodes: [], |
| | | deptcodes: [], |
| | | serviceType: [2], |
| | | dateRange: [], |
| | | pageNum: 1, |
| | | pageSize: 20 |
| | | }, |
| | | |
| | | // ç»è®¡ç±»åå表 |
| | | Statisticallist: [ |
| | | { label: "ç
åºç»è®¡", value: 1 }, |
| | | { label: "ç§å®¤ç»è®¡", value: 2 } |
| | | ], |
| | | |
| | | // ç
åºå表 |
| | | flatArrayhospit: [], |
| | | |
| | | // ç§å®¤å表 |
| | | flatArraydept: [], |
| | | |
| | | // æå¡ç±»åé项 |
| | | options: [], |
| | | |
| | | // è¡¨æ ¼æ°æ® |
| | | userList: [], |
| | | |
| | | // æ»æ¡æ° |
| | | total: 0, |
| | | |
| | | // å è½½ç¶æ |
| | | loading: false, |
| | | |
| | | // éä¸çè¡ |
| | | ids: [], |
| | | single: true, |
| | | multiple: true, |
| | | |
| | | // å½åæä½çè¡ |
| | | currentRow: null, |
| | | |
| | | // å¯¹è¯æ¡æ¾ç¤ºæ§å¶ |
| | | SeedetailsVisible: false, |
| | | topicVisible: false, |
| | | |
| | | // 满æåº¦è¯¦æ
æ°æ® |
| | | topiclist: [], |
| | | topicvalue: { |
| | | name: '' |
| | | }, |
| | | |
| | | // æ¥æéæ©å¨é项 |
| | | pickerOptions: { |
| | | shortcuts: [ |
| | | { |
| | | text: 'æè¿ä¸å¨', |
| | | onClick(picker) { |
| | | const end = new Date(); |
| | | const start = new Date(); |
| | | start.setTime(start.getTime() - 3600 * 1000 * 24 * 7); |
| | | picker.$emit('pick', [start, end]); |
| | | } |
| | | }, |
| | | { |
| | | text: 'æè¿ä¸ä¸ªæ', |
| | | onClick(picker) { |
| | | const end = new Date(); |
| | | const start = new Date(); |
| | | start.setTime(start.getTime() - 3600 * 1000 * 24 * 30); |
| | | picker.$emit('pick', [start, end]); |
| | | } |
| | | }, |
| | | { |
| | | text: 'æè¿ä¸ä¸ªæ', |
| | | onClick(picker) { |
| | | const end = new Date(); |
| | | const start = new Date(); |
| | | start.setTime(start.getTime() - 3600 * 1000 * 24 * 90); |
| | | picker.$emit('pick', [start, end]); |
| | | } |
| | | } |
| | | ], |
| | | disabledDate(time) { |
| | | return time.getTime() > Date.now(); |
| | | } |
| | | } |
| | | }; |
| | | }, |
| | | |
| | | created() { |
| | | this.initData(); |
| | | }, |
| | | |
| | | methods: { |
| | | // åå§åæ°æ® |
| | | async initData() { |
| | | await this.getDeptTree(); |
| | | await this.getList(); |
| | | }, |
| | | |
| | | // è·åç§å®¤æ |
| | | getDeptTree() { |
| | | // è·åæå¡ç±»å |
| | | this.options = this.$store.getters.tasktypes || []; |
| | | |
| | | // è·åç§å®¤å表 |
| | | this.flatArraydept = (this.$store.getters.belongDepts || []).map((dept) => { |
| | | return { |
| | | label: dept.deptName, |
| | | value: dept.deptCode |
| | | }; |
| | | }); |
| | | |
| | | // è·åç
åºå表 |
| | | this.flatArrayhospit = (this.$store.getters.belongWards || []).map((ward) => { |
| | | return { |
| | | label: ward.districtName, |
| | | value: ward.districtCode |
| | | }; |
| | | }); |
| | | |
| | | // æ·»å å
¨é¨é项 |
| | | this.flatArraydept.push({ label: "å
¨é¨", value: "all" }); |
| | | this.flatArrayhospit.push({ label: "å
¨é¨", value: "all" }); |
| | | }, |
| | | |
| | | // è·åç»è®¡å表 |
| | | async getList() { |
| | | this.loading = true; |
| | | try { |
| | | // å¤çæ¥è¯¢åæ° |
| | | const params = { |
| | | configKey: "joyCount", |
| | | ...this.queryParams |
| | | }; |
| | | |
| | | // å¤çæ¥æèå´ |
| | | if (this.queryParams.dateRange && this.queryParams.dateRange.length === 2) { |
| | | params.startTime = this.queryParams.dateRange[0]; |
| | | params.endTime = this.queryParams.dateRange[1]; |
| | | } |
| | | |
| | | // å¤çç
åº/ç§å®¤éæ© |
| | | if (params.statisticaltype == 1) { |
| | | // ç
åºç»è®¡ |
| | | if (params.leavehospitaldistrictcodes.includes("all")) { |
| | | // 妿鿩äº"å
¨é¨"ï¼åç§»é¤"all"å¼ |
| | | params.leavehospitaldistrictcodes = params.leavehospitaldistrictcodes.filter(item => item !== "all"); |
| | | // 妿éè¦ä¼ ææç
åºä»£ç ï¼å¯ä»¥ä»storeä¸è·å |
| | | params.leavehospitaldistrictcodes = (this.$store.getters.belongWards || []).map(ward => ward.districtCode); |
| | | } |
| | | } else if (params.statisticaltype == 2) { |
| | | // ç§å®¤ç»è®¡ |
| | | if (params.deptcodes.includes("all")) { |
| | | // 妿鿩äº"å
¨é¨"ï¼åç§»é¤"all"å¼ |
| | | params.deptcodes = params.deptcodes.filter(item => item !== "all"); |
| | | // 妿éè¦ä¼ ææç§å®¤ä»£ç ï¼å¯ä»¥ä»storeä¸è·å |
| | | params.deptcodes = (this.$store.getters.belongDepts || []).map(dept => dept.deptCode); |
| | | } |
| | | } |
| | | |
| | | const response = await getSfStatisticsJoy(params); |
| | | this.userList = response.data || []; |
| | | this.total = response.total || 0; |
| | | } catch (error) { |
| | | console.error('è·åç»è®¡å表失败:', error); |
| | | this.$message.error('è·åæ°æ®å¤±è´¥'); |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | }, |
| | | |
| | | // å¤çç»è®¡ç±»ååå |
| | | handleStatisticalTypeChange(value) { |
| | | if (value === 1) { |
| | | this.queryParams.deptcodes = []; |
| | | } else { |
| | | this.queryParams.leavehospitaldistrictcodes = []; |
| | | } |
| | | this.queryParams.pageNum = 1; |
| | | this.getList(); |
| | | }, |
| | | |
| | | // å¤çæ¥è¯¢ |
| | | handleQuery() { |
| | | this.queryParams.pageNum = 1; |
| | | this.getList(); |
| | | }, |
| | | |
| | | // éç½®æ¥è¯¢ |
| | | resetQuery() { |
| | | this.queryParams = { |
| | | statisticaltype: 1, |
| | | leavehospitaldistrictcodes: [], |
| | | deptcodes: [], |
| | | serviceType: [2], |
| | | dateRange: [], |
| | | pageNum: 1, |
| | | pageSize: 20 |
| | | }; |
| | | this.getList(); |
| | | }, |
| | | |
| | | // å¤çå页大å°åå |
| | | handleSizeChange(size) { |
| | | this.queryParams.pageSize = size; |
| | | this.queryParams.pageNum = 1; |
| | | this.getList(); |
| | | }, |
| | | |
| | | // å¤ç页ç åå |
| | | handlePageChange(page) { |
| | | this.queryParams.pageNum = page; |
| | | this.getList(); |
| | | }, |
| | | |
| | | // å¤çè¡éæ© |
| | | handleSelectionChange(selection) { |
| | | this.ids = selection.map(item => item.id); |
| | | this.single = selection.length !== 1; |
| | | this.multiple = !selection.length; |
| | | }, |
| | | |
| | | // è·åè¡key |
| | | getRowKey(row) { |
| | | return row.statisticaltype === 1 |
| | | ? row.leavehospitaldistrictcode |
| | | : row.deptcode; |
| | | }, |
| | | |
| | | // æ ¼å¼åç¾åæ¯ |
| | | formatPercent(value) { |
| | | if (value === null || value === undefined) return '-'; |
| | | const num = parseFloat(value); |
| | | if (isNaN(num)) return '-'; |
| | | return `${(num * 100).toFixed(2)}%`; |
| | | }, |
| | | |
| | | // æ¥çæªåæ¶é访详æ
|
| | | handleSeedetails(row) { |
| | | this.currentRow = row; |
| | | this.SeedetailsVisible = true; |
| | | }, |
| | | |
| | | // æ¥ç满æåº¦è¯¦æ
|
| | | async getinfo(row) { |
| | | this.currentRow = row; |
| | | this.topicVisible = true; |
| | | |
| | | try { |
| | | // å¤çæ¥è¯¢åæ° |
| | | const params = { |
| | | configKey: "joyCount", |
| | | ...this.queryParams |
| | | }; |
| | | |
| | | // å¤çæ¥æèå´ |
| | | if (this.queryParams.dateRange && this.queryParams.dateRange.length === 2) { |
| | | params.startTime = this.queryParams.dateRange[0]; |
| | | params.endTime = this.queryParams.dateRange[1]; |
| | | } |
| | | |
| | | if (this.queryParams.statisticaltype == 1) { |
| | | this.topicvalue.name = row.leavehospitaldistrictname; |
| | | params.leavehospitaldistrictcodes = [row.leavehospitaldistrictcode]; |
| | | } else { |
| | | this.topicvalue.name = row.deptname; |
| | | params.deptcodes = [row.deptcode]; |
| | | } |
| | | |
| | | const response = await getSfStatisticsJoyInfo(params); |
| | | this.topiclist = response.data || []; |
| | | } catch (error) { |
| | | console.error('è·å满æåº¦è¯¦æ
失败:', error); |
| | | this.$message.error('è·å详æ
失败'); |
| | | } |
| | | }, |
| | | |
| | | // å¯¼åºæ°æ® |
| | | async handleExport() { |
| | | if (!this.userList.length) { |
| | | this.$message.warning('æ²¡ææ°æ®å¯å¯¼åº'); |
| | | return; |
| | | } |
| | | |
| | | try { |
| | | this.loading = true; |
| | | |
| | | // æå»ºæ¥æèå´å符串 |
| | | let dateRangeString = ""; |
| | | let sheetNameSuffix = ""; |
| | | |
| | | if (this.queryParams.dateRange && this.queryParams.dateRange.length === 2) { |
| | | const startDateFormatted = this.queryParams.dateRange[0]; |
| | | const endDateFormatted = this.queryParams.dateRange[1]; |
| | | dateRangeString = `${startDateFormatted}è³${endDateFormatted}`; |
| | | sheetNameSuffix = `${startDateFormatted}è³${endDateFormatted}`; |
| | | } else { |
| | | const now = new Date(); |
| | | const currentMonth = now.getMonth() + 1; |
| | | dateRangeString = `${currentMonth}æ`; |
| | | sheetNameSuffix = `${currentMonth}æ`; |
| | | } |
| | | |
| | | const excelName = `é访ç»è®¡è¡¨_${dateRangeString}.xlsx`; |
| | | const worksheetName = `é访ç»è®¡_${sheetNameSuffix}`; |
| | | |
| | | // å建Excelå·¥ä½ç°¿ |
| | | const workbook = new ExcelJS.Workbook(); |
| | | const worksheet = workbook.addWorksheet(worksheetName); |
| | | |
| | | // å®ä¹æ ·å¼ |
| | | const titleStyle = { |
| | | font: { name: "微软é
é»", size: 16, bold: true }, |
| | | fill: { type: "pattern", pattern: "solid", fgColor: { argb: "FFE6F3FF" } }, |
| | | alignment: { vertical: "middle", horizontal: "center" }, |
| | | border: { |
| | | top: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | left: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | bottom: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | right: { style: "thin", color: { argb: "FFD0D0D0" } } |
| | | } |
| | | }; |
| | | |
| | | const headerStyle = { |
| | | font: { name: "微软é
é»", size: 11, bold: true }, |
| | | fill: { type: "pattern", pattern: "solid", fgColor: { argb: "FFF5F7FA" } }, |
| | | alignment: { vertical: "middle", horizontal: "center" }, |
| | | border: { |
| | | top: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | left: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | bottom: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | right: { style: "thin", color: { argb: "FFD0D0D0" } } |
| | | } |
| | | }; |
| | | |
| | | const cellStyle = { |
| | | font: { name: "å®ä½", size: 10 }, |
| | | alignment: { vertical: "middle", horizontal: "center" }, |
| | | border: { |
| | | top: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | left: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | bottom: { style: "thin", color: { argb: "FFD0D0D0" } }, |
| | | right: { style: "thin", color: { argb: "FFD0D0D0" } } |
| | | } |
| | | }; |
| | | |
| | | // æ·»å æ»æ é¢ |
| | | worksheet.mergeCells(1, 1, 1, 10); |
| | | const titleCell = worksheet.getCell(1, 1); |
| | | titleCell.value = `é访ç»è®¡è¡¨ï¼${sheetNameSuffix}ï¼`; |
| | | titleCell.style = titleStyle; |
| | | worksheet.getRow(1).height = 35; |
| | | |
| | | // æ·»å 表头 |
| | | const headers = [ |
| | | this.queryParams.statisticaltype == 1 ? "åºé¢ç
åº" : "ç§å®¤", |
| | | "åºé¢äººæ¬¡", |
| | | "æ éé访人次", |
| | | "åºé访人次", |
| | | "é访ç", |
| | | "åæ¶ç", |
| | | "满æåº¦é¢ç®æ»é", |
| | | "满æåº¦å¡«æ¥é", |
| | | "宿æ¯ç" |
| | | ]; |
| | | |
| | | const headerRow = worksheet.addRow(headers); |
| | | headerRow.eachCell((cell) => { |
| | | cell.style = headerStyle; |
| | | }); |
| | | headerRow.height = 25; |
| | | |
| | | // æ·»å æ°æ®è¡ |
| | | this.userList.forEach((item) => { |
| | | const dataRow = worksheet.addRow([ |
| | | this.queryParams.statisticaltype == 1 ? item.leavehospitaldistrictname : item.deptname, |
| | | item.dischargeCount || 0, |
| | | item.nonFollowUp || 0, |
| | | item.followUpNeeded || 0, |
| | | item.followUpRate || "0%", |
| | | item.rate ? this.formatPercent(item.rate) : "0%", |
| | | item.joyAllCount || 0, |
| | | item.joyCount || 0, |
| | | item.joyTotal ? this.formatPercent(item.joyTotal) : "0%" |
| | | ]); |
| | | |
| | | dataRow.eachCell((cell) => { |
| | | cell.style = cellStyle; |
| | | }); |
| | | dataRow.height = 22; |
| | | }); |
| | | |
| | | // 设置å宽 |
| | | worksheet.columns = [ |
| | | { width: 20 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 12 }, |
| | | { width: 15 }, |
| | | { width: 15 }, |
| | | { width: 12 } |
| | | ]; |
| | | |
| | | // çæå¹¶ä¸è½½æä»¶ |
| | | const buffer = await workbook.xlsx.writeBuffer(); |
| | | const blob = new Blob([buffer], { |
| | | type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" |
| | | }); |
| | | |
| | | saveAs(blob, excelName); |
| | | this.$message.success("å¯¼åºæå"); |
| | | } catch (error) { |
| | | console.error("导åºå¤±è´¥:", error); |
| | | this.$message.error(`导åºå¤±è´¥: ${error.message}`); |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .followup-statistics { |
| | | .query-section { |
| | | background: #fff; |
| | | padding: 20px; |
| | | border-radius: 4px; |
| | | margin-bottom: 20px; |
| | | |
| | | .query-form { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | |
| | | ::v-deep .el-form-item { |
| | | margin-bottom: 20px; |
| | | |
| | | &:not(:last-child) { |
| | | margin-right: 20px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .table-section { |
| | | background: #fff; |
| | | padding: 20px; |
| | | border-radius: 4px; |
| | | margin-bottom: 20px; |
| | | |
| | | ::v-deep .el-table { |
| | | th { |
| | | background-color: #f8f9fa; |
| | | font-weight: 600; |
| | | color: #333; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .pagination-section { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | background: #fff; |
| | | padding: 20px; |
| | | border-radius: 4px; |
| | | } |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="satisfaction-statistics"> |
| | | <div class="query-section"> |
| | | <el-form |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | size="medium" |
| | | :inline="true" |
| | | label-width="100px" |
| | | class="query-form" |
| | | > |
| | | <el-form-item label="æ£è
æ¥æº" prop="patientSource"> |
| | | <el-select |
| | | v-model="queryParams.patientSource" |
| | | placeholder="è¯·éæ©æ£è
æ¥æº" |
| | | clearable |
| | | style="width: 200px" |
| | | > |
| | | <el-option |
| | | v-for="source in patientSourceList" |
| | | :key="source.value" |
| | | :label="source.label" |
| | | :value="source.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="ç§å®¤" prop="deptCode"> |
| | | <el-select |
| | | v-model="queryParams.deptCode" |
| | | placeholder="è¯·éæ©ç§å®¤" |
| | | clearable |
| | | filterable |
| | | style="width: 200px" |
| | | > |
| | | <el-option |
| | | v-for="dept in deptList" |
| | | :key="dept.value" |
| | | :label="dept.label" |
| | | :value="dept.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="ç
åº" prop="wardCode"> |
| | | <el-select |
| | | v-model="queryParams.wardCode" |
| | | placeholder="è¯·éæ©ç
åº" |
| | | clearable |
| | | filterable |
| | | style="width: 200px" |
| | | > |
| | | <el-option |
| | | v-for="ward in wardList" |
| | | :key="ward.value" |
| | | :label="ward.label" |
| | | :value="ward.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="ç»è®¡æ¶é´" prop="dateRange"> |
| | | <el-date-picker |
| | | v-model="queryParams.dateRange" |
| | | type="daterange" |
| | | range-separator="è³" |
| | | start-placeholder="å¼å§æ¥æ" |
| | | end-placeholder="ç»ææ¥æ" |
| | | value-format="yyyy-MM-dd" |
| | | :picker-options="pickerOptions" |
| | | style="width: 380px" |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | @click="handleSearch" |
| | | :loading="loading" |
| | | > |
| | | æ¥è¯¢ |
| | | </el-button> |
| | | <el-button icon="el-icon-refresh" @click="handleReset"> |
| | | éç½® |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | |
| | | <!-- 满æåº¦åç±»ç»è®¡å¾è¡¨ --> |
| | | <div class="chart-section"> |
| | | <div class="chart-container"> |
| | | <div class="chart-title">满æåº¦ç±»åç»è®¡</div> |
| | | <div id="satisfactionBarChart" style="width: 100%; height: 400px"></div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- é¢ç®æç»è¡¨æ ¼ --> |
| | | <div class="detail-table-section"> |
| | | <div class="section-title">é¢ç®æç»ç»è®¡</div> |
| | | |
| | | <el-table |
| | | v-loading="detailLoading" |
| | | :data="questionDetailData" |
| | | :border="true" |
| | | style="width: 100%" |
| | | row-class-name="question-row" |
| | | > |
| | | <el-table-column |
| | | type="expand" |
| | | width="60" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <div class="option-detail"> |
| | | <el-table |
| | | :data="row.options" |
| | | :border="true" |
| | | style="width: 100%" |
| | | class="inner-table" |
| | | > |
| | | <el-table-column |
| | | label="é项" |
| | | prop="optionText" |
| | | align="center" |
| | | min-width="200" |
| | | /> |
| | | <el-table-column |
| | | label="éæ©äººæ°" |
| | | prop="chosenQuantity" |
| | | align="center" |
| | | min-width="120" |
| | | /> |
| | | <el-table-column |
| | | label="éæ©æ¯ä¾" |
| | | prop="chosenPercentage" |
| | | align="center" |
| | | min-width="120" |
| | | > |
| | | <template slot-scope="{ row: option }"> |
| | | {{ formatPercent(option.chosenPercentage) }} |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="åºå·" |
| | | type="index" |
| | | align="center" |
| | | width="60" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="é¢ç®" |
| | | prop="scriptContent" |
| | | align="center" |
| | | min-width="300" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <span>{{ row.scriptContent }}?</span> |
| | | <el-tag |
| | | :type="row.scriptType === 1 ? 'primary' : 'success'" |
| | | size="mini" |
| | | style="margin-left: 5px" |
| | | > |
| | | {{ row.scriptType === 1 ? 'åéé¢' : 'å¤éé¢' }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="å¹³åå¾å" |
| | | prop="averageScore" |
| | | align="center" |
| | | width="120" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <span class="score-text">{{ row.averageScore.toFixed(1) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="æé«å¾å" |
| | | prop="maxScore" |
| | | align="center" |
| | | width="120" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <span class="score-text">{{ row.maxScore.toFixed(1) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="æä½å¾å" |
| | | prop="minScore" |
| | | align="center" |
| | | width="120" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <span class="score-text">{{ row.minScore.toFixed(1) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="çé¢äººæ°" |
| | | prop="answerCount" |
| | | align="center" |
| | | width="100" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="æªçé¢äººæ°" |
| | | prop="unanswerCount" |
| | | align="center" |
| | | width="100" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | {{ row.totalCount - row.answerCount }} |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="çé¢ç" |
| | | prop="answerRate" |
| | | align="center" |
| | | width="100" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | {{ formatPercent(row.answerCount / row.totalCount) }} |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- 综åå¾åè¡ --> |
| | | <div class="summary-row"> |
| | | <div class="summary-content"> |
| | | <div class="summary-item"> |
| | | <span class="label">综åå¾åï¼</span> |
| | | <span class="value">{{ totalScore.toFixed(1) }}</span> |
| | | </div> |
| | | <div class="summary-item"> |
| | | <span class="label">æ»çé¢äººæ°ï¼</span> |
| | | <span class="value">{{ totalAnswerCount }}</span> |
| | | </div> |
| | | <div class="summary-item"> |
| | | <span class="label">æ»çé¢çï¼</span> |
| | | <span class="value">{{ formatPercent(totalAnswerRate) }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- å页 --> |
| | | <div class="pagination-section" v-if="questionDetailData.length > 0"> |
| | | <el-pagination |
| | | background |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | :current-page="detailQueryParams.pageNum" |
| | | :page-size="detailQueryParams.pageSize" |
| | | :page-sizes="[10, 20, 30]" |
| | | :total="detailTotal" |
| | | @size-change="handleDetailSizeChange" |
| | | @current-change="handleDetailPageChange" |
| | | /> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | name: 'SatisfactionStatistics', |
| | | data() { |
| | | return { |
| | | // æ¥è¯¢åæ° |
| | | queryParams: { |
| | | patientSource: '', |
| | | deptCode: '', |
| | | wardCode: '', |
| | | dateRange: [] |
| | | }, |
| | | |
| | | // æ£è
æ¥æºé项 |
| | | patientSourceList: [ |
| | | { value: '1', label: 'é¨è¯' }, |
| | | { value: '2', label: 'ä½é¢' }, |
| | | { value: '3', label: 'æ¥è¯' }, |
| | | { value: '4', label: '使£' } |
| | | ], |
| | | |
| | | // ç§å®¤å表 |
| | | deptList: [], |
| | | |
| | | // ç
åºå表 |
| | | wardList: [], |
| | | |
| | | // å¾è¡¨å®ä¾ |
| | | barChart: null, |
| | | |
| | | // å è½½ç¶æ |
| | | loading: false, |
| | | detailLoading: false, |
| | | |
| | | // é¢ç®æç»æ°æ® |
| | | questionDetailData: [], |
| | | |
| | | // é¢ç®æç»æ¥è¯¢åæ° |
| | | detailQueryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10 |
| | | }, |
| | | |
| | | // é¢ç®æç»æ»æ° |
| | | detailTotal: 0, |
| | | |
| | | // 综åå¾å |
| | | totalScore: 0, |
| | | totalAnswerCount: 0, |
| | | totalAnswerRate: 0, |
| | | |
| | | // æ¥æéæ©å¨é项 |
| | | pickerOptions: { |
| | | shortcuts: [ |
| | | { |
| | | text: 'æè¿ä¸å¨', |
| | | onClick(picker) { |
| | | const end = new Date(); |
| | | const start = new Date(); |
| | | start.setTime(start.getTime() - 3600 * 1000 * 24 * 7); |
| | | picker.$emit('pick', [start, end]); |
| | | } |
| | | }, |
| | | { |
| | | text: 'æè¿ä¸ä¸ªæ', |
| | | onClick(picker) { |
| | | const end = new Date(); |
| | | const start = new Date(); |
| | | start.setTime(start.getTime() - 3600 * 1000 * 24 * 30); |
| | | picker.$emit('pick', [start, end]); |
| | | } |
| | | }, |
| | | { |
| | | text: 'æè¿ä¸ä¸ªæ', |
| | | onClick(picker) { |
| | | const end = new Date(); |
| | | const start = new Date(); |
| | | start.setTime(start.getTime() - 3600 * 1000 * 24 * 90); |
| | | picker.$emit('pick', [start, end]); |
| | | } |
| | | } |
| | | ], |
| | | disabledDate(time) { |
| | | return time.getTime() > Date.now(); |
| | | } |
| | | }, |
| | | |
| | | // Mockæ°æ® - 满æåº¦åç±» |
| | | mockSatisfactionCategories: ['æå¡æåº¦', 'ææ¯æ°´å¹³', 'ç¯å¢è®¾æ½', 'æ²éææ', 'çå¾
æ¶é´', 'æ¶è´¹åçæ§'], |
| | | // Mockæ°æ® - 满æåº¦ç±»å |
| | | mockSatisfactionTypes: [ |
| | | { name: 'é常满æ', value: 85, color: '#36B37E' }, |
| | | { name: '满æ', value: 72, color: '#4CAF50' }, |
| | | { name: 'ä¸è¬', value: 60, color: '#FF9D4D' }, |
| | | { name: '䏿»¡æ', value: 15, color: '#FF5C5C' }, |
| | | { name: 'é叏䏿»¡æ', value: 5, color: '#F44336' } |
| | | ] |
| | | }; |
| | | }, |
| | | |
| | | mounted() { |
| | | this.initData(); |
| | | this.initChart(); |
| | | }, |
| | | |
| | | beforeDestroy() { |
| | | if (this.barChart) { |
| | | this.barChart.dispose(); |
| | | this.barChart = null; |
| | | } |
| | | }, |
| | | |
| | | methods: { |
| | | // åå§åæ°æ® |
| | | async initData() { |
| | | await this.getDeptList(); |
| | | await this.getWardList(); |
| | | await this.loadData(); |
| | | }, |
| | | |
| | | // è·åç§å®¤å表 |
| | | getDeptList() { |
| | | // 模æAPIè°ç¨è·åç§å®¤å表 |
| | | return new Promise((resolve) => { |
| | | setTimeout(() => { |
| | | this.deptList = [ |
| | | { value: 'dept001', label: 'å¿è¡ç®¡å
ç§' }, |
| | | { value: 'dept002', label: 'ç¥ç»å
ç§' }, |
| | | { value: 'dept003', label: 'æ®å¤ç§' }, |
| | | { value: 'dept004', label: '骨ç§' }, |
| | | { value: 'dept005', label: 'å¦äº§ç§' }, |
| | | { value: 'dept006', label: 'å¿ç§' } |
| | | ]; |
| | | resolve(); |
| | | }, 100); |
| | | }); |
| | | }, |
| | | |
| | | // è·åç
åºå表 |
| | | getWardList() { |
| | | // 模æAPIè°ç¨è·åç
åºå表 |
| | | return new Promise((resolve) => { |
| | | setTimeout(() => { |
| | | this.wardList = [ |
| | | { value: 'ward001', label: 'å
ç§ä¸ç
åº' }, |
| | | { value: 'ward002', label: 'å
ç§äºç
åº' }, |
| | | { value: 'ward003', label: 'å¤ç§ä¸ç
åº' }, |
| | | { value: 'ward004', label: 'å¤ç§äºç
åº' }, |
| | | { value: 'ward005', label: 'å¦äº§ç§ç
åº' }, |
| | | { value: 'ward006', label: 'å¿ç§ç
åº' } |
| | | ]; |
| | | resolve(); |
| | | }, 100); |
| | | }); |
| | | }, |
| | | |
| | | // å è½½æ°æ® |
| | | async loadData() { |
| | | await Promise.all([ |
| | | this.loadChartData(), |
| | | this.loadQuestionDetailData() |
| | | ]); |
| | | }, |
| | | |
| | | // å è½½å¾è¡¨æ°æ® |
| | | loadChartData() { |
| | | this.loading = true; |
| | | return new Promise((resolve) => { |
| | | setTimeout(() => { |
| | | this.renderChart(this.generateChartData()); |
| | | this.loading = false; |
| | | resolve(); |
| | | }, 500); |
| | | }); |
| | | }, |
| | | |
| | | // å è½½é¢ç®æç»æ°æ® |
| | | loadQuestionDetailData() { |
| | | this.detailLoading = true; |
| | | return new Promise((resolve) => { |
| | | setTimeout(() => { |
| | | const mockData = this.generateMockQuestionDetail(); |
| | | this.questionDetailData = mockData.list; |
| | | this.detailTotal = mockData.total; |
| | | |
| | | // 计ç®ç»¼åå¾å |
| | | this.calculateSummary(mockData); |
| | | this.detailLoading = false; |
| | | resolve(); |
| | | }, 500); |
| | | }); |
| | | }, |
| | | |
| | | // 计ç®ç»¼åå¾å |
| | | calculateSummary(data) { |
| | | let totalScore = 0; |
| | | let totalAnswerCount = 0; |
| | | let totalCount = 0; |
| | | |
| | | data.list.forEach(item => { |
| | | totalScore += item.averageScore; |
| | | totalAnswerCount += item.answerCount; |
| | | totalCount += item.totalCount; |
| | | }); |
| | | |
| | | this.totalScore = data.list.length > 0 ? totalScore / data.list.length : 0; |
| | | this.totalAnswerCount = totalAnswerCount; |
| | | this.totalAnswerRate = totalCount > 0 ? totalAnswerCount / totalCount : 0; |
| | | }, |
| | | |
| | | // åå§åå¾è¡¨ |
| | | initChart() { |
| | | const echarts = require('echarts'); |
| | | const chartDom = document.getElementById('satisfactionBarChart'); |
| | | if (!chartDom) return; |
| | | |
| | | this.barChart = echarts.init(chartDom); |
| | | |
| | | // çå¬çªå£åå |
| | | window.addEventListener('resize', this.handleChartResize); |
| | | }, |
| | | |
| | | // çæå¾è¡¨æ°æ® |
| | | generateChartData() { |
| | | const categories = this.mockSatisfactionCategories; |
| | | const series = this.mockSatisfactionTypes.map(type => ({ |
| | | name: type.name, |
| | | type: 'bar', |
| | | barWidth: 25, |
| | | stack: '满æåº¦', |
| | | data: categories.map(() => Math.floor(Math.random() * 20) + 10), // éæºæ°æ® |
| | | itemStyle: { |
| | | color: type.color |
| | | } |
| | | })); |
| | | |
| | | return { |
| | | categories, |
| | | legend: this.mockSatisfactionTypes.map(type => type.name), |
| | | series |
| | | }; |
| | | }, |
| | | |
| | | // 渲æå¾è¡¨ |
| | | renderChart(chartData) { |
| | | if (!this.barChart) return; |
| | | |
| | | const option = { |
| | | title: { |
| | | text: '满æåº¦ç±»åç»è®¡', |
| | | left: 'center', |
| | | textStyle: { |
| | | fontSize: 16, |
| | | fontWeight: 'normal', |
| | | color: '#333' |
| | | } |
| | | }, |
| | | tooltip: { |
| | | trigger: 'axis', |
| | | axisPointer: { |
| | | type: 'shadow' |
| | | }, |
| | | formatter: (params) => { |
| | | let result = `<div style="margin-bottom: 5px; font-weight: bold;">${params[0].name}</div>`; |
| | | let total = 0; |
| | | |
| | | params.forEach(param => { |
| | | result += `<div style="margin: 2px 0;"> |
| | | <span style="display:inline-block;width:10px;height:10px;border-radius:50%;background:${param.color};margin-right:5px;"></span> |
| | | ${param.seriesName}: <strong>${param.value}%</strong> |
| | | </div>`; |
| | | total += param.value; |
| | | }); |
| | | |
| | | result += `<div style="margin-top: 5px; padding-top: 5px; border-top: 1px solid #eee;"> |
| | | <strong>æ»è®¡: ${total}%</strong> |
| | | </div>`; |
| | | return result; |
| | | } |
| | | }, |
| | | legend: { |
| | | data: chartData.legend, |
| | | top: 20, |
| | | textStyle: { |
| | | fontSize: 12, |
| | | color: '#666' |
| | | } |
| | | }, |
| | | grid: { |
| | | left: '3%', |
| | | right: '4%', |
| | | bottom: '3%', |
| | | top: 80, |
| | | containLabel: true |
| | | }, |
| | | xAxis: { |
| | | type: 'category', |
| | | data: chartData.categories, |
| | | axisLabel: { |
| | | interval: 0, |
| | | rotate: 0, |
| | | fontSize: 12, |
| | | color: '#666' |
| | | }, |
| | | axisLine: { |
| | | lineStyle: { |
| | | color: '#DCDFE6' |
| | | } |
| | | }, |
| | | axisTick: { |
| | | alignWithLabel: true |
| | | } |
| | | }, |
| | | yAxis: { |
| | | type: 'value', |
| | | name: 'ç¾åæ¯ (%)', |
| | | min: 0, |
| | | max: 100, |
| | | axisLabel: { |
| | | formatter: '{value}%', |
| | | color: '#666' |
| | | }, |
| | | axisLine: { |
| | | lineStyle: { |
| | | color: '#DCDFE6' |
| | | } |
| | | }, |
| | | splitLine: { |
| | | lineStyle: { |
| | | type: 'dashed', |
| | | color: '#E4E7ED' |
| | | } |
| | | } |
| | | }, |
| | | series: chartData.series |
| | | }; |
| | | |
| | | this.barChart.setOption(option); |
| | | }, |
| | | |
| | | // çæMocké¢ç®è¯¦æ
æ°æ® |
| | | generateMockQuestionDetail() { |
| | | const questions = [ |
| | | { |
| | | scriptContent: 'æ¨å¯¹å»æ¤äººåçæå¡æåº¦æ¯å¦æ»¡æ', |
| | | scriptType: 1, // 1: åéé¢, 2: å¤éé¢ |
| | | totalCount: 156, |
| | | answerCount: 145, |
| | | averageScore: 4.5, |
| | | maxScore: 5, |
| | | minScore: 3, |
| | | options: [ |
| | | { optionText: 'é常满æ', chosenQuantity: 89, chosenPercentage: 0.61 }, |
| | | { optionText: '满æ', chosenQuantity: 45, chosenPercentage: 0.31 }, |
| | | { optionText: 'ä¸è¬', chosenQuantity: 8, chosenPercentage: 0.06 }, |
| | | { optionText: '䏿»¡æ', chosenQuantity: 2, chosenPercentage: 0.01 }, |
| | | { optionText: 'é叏䏿»¡æ', chosenQuantity: 1, chosenPercentage: 0.01 } |
| | | ] |
| | | }, |
| | | { |
| | | scriptContent: 'æ¨å¯¹å»ççè¯çæ°´å¹³åææ¯è½åè¯ä»·å¦ä½', |
| | | scriptType: 1, |
| | | totalCount: 156, |
| | | answerCount: 142, |
| | | averageScore: 4.7, |
| | | maxScore: 5, |
| | | minScore: 3, |
| | | options: [ |
| | | { optionText: 'é常ä¸ä¸', chosenQuantity: 95, chosenPercentage: 0.67 }, |
| | | { optionText: 'æ¯è¾ä¸ä¸', chosenQuantity: 40, chosenPercentage: 0.28 }, |
| | | { optionText: 'ä¸è¬', chosenQuantity: 5, chosenPercentage: 0.04 }, |
| | | { optionText: 'ä¸å¤ä¸ä¸', chosenQuantity: 2, chosenPercentage: 0.01 }, |
| | | { optionText: 'é常ä¸ä¸ä¸', chosenQuantity: 0, chosenPercentage: 0 } |
| | | ] |
| | | }, |
| | | { |
| | | scriptContent: 'æ¨å¯¹å»é¢çç¯å¢åå«çç¶åµæ¯å¦æ»¡æ', |
| | | scriptType: 1, |
| | | totalCount: 156, |
| | | answerCount: 138, |
| | | averageScore: 4.3, |
| | | maxScore: 5, |
| | | minScore: 2, |
| | | options: [ |
| | | { optionText: 'é常满æ', chosenQuantity: 75, chosenPercentage: 0.54 }, |
| | | { optionText: '满æ', chosenQuantity: 50, chosenPercentage: 0.36 }, |
| | | { optionText: 'ä¸è¬', chosenQuantity: 10, chosenPercentage: 0.07 }, |
| | | { optionText: '䏿»¡æ', chosenQuantity: 3, chosenPercentage: 0.02 }, |
| | | { optionText: 'é叏䏿»¡æ', chosenQuantity: 0, chosenPercentage: 0 } |
| | | ] |
| | | }, |
| | | { |
| | | scriptContent: 'æ¨è®¤ä¸ºå»æ¤äººå䏿¨çæ²éæ¯å¦å
å', |
| | | scriptType: 1, |
| | | totalCount: 156, |
| | | answerCount: 140, |
| | | averageScore: 4.6, |
| | | maxScore: 5, |
| | | minScore: 3, |
| | | options: [ |
| | | { optionText: 'æ²éé常å
å', chosenQuantity: 85, chosenPercentage: 0.61 }, |
| | | { optionText: 'æ²éæ¯è¾å
å', chosenQuantity: 45, chosenPercentage: 0.32 }, |
| | | { optionText: 'æ²éä¸è¬', chosenQuantity: 8, chosenPercentage: 0.06 }, |
| | | { optionText: 'æ²éä¸å¤å
å', chosenQuantity: 2, chosenPercentage: 0.01 }, |
| | | { optionText: 'æ²éé常ä¸å
å', chosenQuantity: 0, chosenPercentage: 0 } |
| | | ] |
| | | }, |
| | | { |
| | | scriptContent: 'æ¨å¯¹çå¾
å°±è¯åæ²»ççæ¶é´æ¯å¦æ»¡æ', |
| | | scriptType: 1, |
| | | totalCount: 156, |
| | | answerCount: 135, |
| | | averageScore: 4.0, |
| | | maxScore: 5, |
| | | minScore: 1, |
| | | options: [ |
| | | { optionText: 'çå¾
æ¶é´å¾ç', chosenQuantity: 60, chosenPercentage: 0.44 }, |
| | | { optionText: 'çå¾
æ¶é´åç', chosenQuantity: 55, chosenPercentage: 0.41 }, |
| | | { optionText: 'çå¾
æ¶é´è¾é¿', chosenQuantity: 15, chosenPercentage: 0.11 }, |
| | | { optionText: 'çå¾
æ¶é´å¾é¿', chosenQuantity: 5, chosenPercentage: 0.04 }, |
| | | { optionText: 'æ æ³å¿åççå¾
', chosenQuantity: 0, chosenPercentage: 0 } |
| | | ] |
| | | }, |
| | | { |
| | | scriptContent: 'æ¨å¯¹å»é¢æ¶è´¹çéæåº¦ååçæ§è¯ä»·å¦ä½', |
| | | scriptType: 1, |
| | | totalCount: 156, |
| | | answerCount: 130, |
| | | averageScore: 4.2, |
| | | maxScore: 5, |
| | | minScore: 2, |
| | | options: [ |
| | | { optionText: 'é常éæåç', chosenQuantity: 70, chosenPercentage: 0.54 }, |
| | | { optionText: 'æ¯è¾éæåç', chosenQuantity: 45, chosenPercentage: 0.35 }, |
| | | { optionText: 'ä¸è¬', chosenQuantity: 10, chosenPercentage: 0.08 }, |
| | | { optionText: 'ä¸å¤ªéæ', chosenQuantity: 5, chosenPercentage: 0.04 }, |
| | | { optionText: 'é常ä¸éæ', chosenQuantity: 0, chosenPercentage: 0 } |
| | | ] |
| | | }, |
| | | { |
| | | scriptContent: 'æ¨ä¼åäº²åæ¨èæä»¬å»é¢å', |
| | | scriptType: 1, |
| | | totalCount: 156, |
| | | answerCount: 148, |
| | | averageScore: 4.8, |
| | | maxScore: 5, |
| | | minScore: 3, |
| | | options: [ |
| | | { optionText: 'éå¸¸æ¿ææ¨è', chosenQuantity: 100, chosenPercentage: 0.68 }, |
| | | { optionText: 'æ¯è¾æ¿ææ¨è', chosenQuantity: 40, chosenPercentage: 0.27 }, |
| | | { optionText: 'ä¸è¬', chosenQuantity: 6, chosenPercentage: 0.04 }, |
| | | { optionText: 'ä¸å¤ªæ¿ææ¨è', chosenQuantity: 2, chosenPercentage: 0.01 }, |
| | | { optionText: 'ç»å¯¹ä¸ä¼æ¨è', chosenQuantity: 0, chosenPercentage: 0 } |
| | | ] |
| | | }, |
| | | { |
| | | scriptContent: 'æ¨å¯¹ä»¥ä¸åªäºæ¹é¢æ¯è¾æ»¡æï¼å¤éï¼', |
| | | scriptType: 2, // å¤éé¢ |
| | | totalCount: 156, |
| | | answerCount: 150, |
| | | averageScore: 4.4, |
| | | maxScore: 5, |
| | | minScore: 3, |
| | | options: [ |
| | | { optionText: 'å»çææ¯æ°´å¹³', chosenQuantity: 120, chosenPercentage: 0.8 }, |
| | | { optionText: 'æå¡æåº¦', chosenQuantity: 110, chosenPercentage: 0.73 }, |
| | | { optionText: 'ç¯å¢å«ç', chosenQuantity: 90, chosenPercentage: 0.6 }, |
| | | { optionText: 'å»ç设å¤', chosenQuantity: 85, chosenPercentage: 0.57 }, |
| | | { optionText: 'æ¶è´¹éæåº¦', chosenQuantity: 70, chosenPercentage: 0.47 }, |
| | | { optionText: 'çå¾
æ¶é´', chosenQuantity: 60, chosenPercentage: 0.4 } |
| | | ] |
| | | }, |
| | | { |
| | | scriptContent: 'æ¨è®¤ä¸ºå»é¢åªäºæ¹é¢éè¦æ¹è¿ï¼å¤éï¼', |
| | | scriptType: 2, |
| | | totalCount: 156, |
| | | answerCount: 125, |
| | | averageScore: 3.8, |
| | | maxScore: 5, |
| | | minScore: 2, |
| | | options: [ |
| | | { optionText: 'çå¾
æ¶é´è¿é¿', chosenQuantity: 80, chosenPercentage: 0.64 }, |
| | | { optionText: 'å°±è¯æµç¨å¤æ', chosenQuantity: 70, chosenPercentage: 0.56 }, |
| | | { optionText: 'è´¹ç¨è¾é«', chosenQuantity: 60, chosenPercentage: 0.48 }, |
| | | { optionText: 'å车å°é¾', chosenQuantity: 50, chosenPercentage: 0.4 }, |
| | | { optionText: 'æå¼æ è¯ä¸æ¸
', chosenQuantity: 40, chosenPercentage: 0.32 }, |
| | | { optionText: 'ç½ç»é¢çº¦ä¸ä¾¿', chosenQuantity: 30, chosenPercentage: 0.24 } |
| | | ] |
| | | }, |
| | | { |
| | | scriptContent: 'æ¨å¯¹æ¬æ¬¡ä½é¢çæ´ä½ä½éªè¯å', |
| | | scriptType: 1, |
| | | totalCount: 156, |
| | | answerCount: 152, |
| | | averageScore: 4.6, |
| | | maxScore: 5, |
| | | minScore: 3, |
| | | options: [ |
| | | { optionText: '5åï¼é常满æï¼', chosenQuantity: 90, chosenPercentage: 0.59 }, |
| | | { optionText: '4åï¼æ»¡æï¼', chosenQuantity: 50, chosenPercentage: 0.33 }, |
| | | { optionText: '3åï¼ä¸è¬ï¼', chosenQuantity: 10, chosenPercentage: 0.07 }, |
| | | { optionText: '2åï¼ä¸æ»¡æï¼', chosenQuantity: 2, chosenPercentage: 0.01 }, |
| | | { optionText: '1åï¼é叏䏿»¡æï¼', chosenQuantity: 0, chosenPercentage: 0 } |
| | | ] |
| | | } |
| | | ]; |
| | | |
| | | // å页å¤ç |
| | | const startIndex = (this.detailQueryParams.pageNum - 1) * this.detailQueryParams.pageSize; |
| | | const endIndex = startIndex + this.detailQueryParams.pageSize; |
| | | const paginatedData = questions.slice(startIndex, endIndex); |
| | | |
| | | return { |
| | | list: paginatedData, |
| | | total: questions.length |
| | | }; |
| | | }, |
| | | |
| | | // å¤çå¾è¡¨ååºå¼ |
| | | handleChartResize() { |
| | | if (this.barChart) { |
| | | this.barChart.resize(); |
| | | } |
| | | }, |
| | | |
| | | // å¤çæ¥è¯¢ |
| | | handleSearch() { |
| | | this.detailQueryParams.pageNum = 1; |
| | | this.loadData(); |
| | | }, |
| | | |
| | | // å¤çéç½® |
| | | handleReset() { |
| | | this.$refs.queryForm.resetFields(); |
| | | this.queryParams.dateRange = []; |
| | | this.detailQueryParams.pageNum = 1; |
| | | this.loadData(); |
| | | }, |
| | | |
| | | // å¤çæç»å页大å°åå |
| | | handleDetailSizeChange(size) { |
| | | this.detailQueryParams.pageSize = size; |
| | | this.detailQueryParams.pageNum = 1; |
| | | this.loadQuestionDetailData(); |
| | | }, |
| | | |
| | | // å¤çæç»é¡µç åå |
| | | handleDetailPageChange(page) { |
| | | this.detailQueryParams.pageNum = page; |
| | | this.loadQuestionDetailData(); |
| | | }, |
| | | |
| | | // æ ¼å¼åç¾åæ¯ |
| | | formatPercent(value) { |
| | | if (value === null || value === undefined) return '-'; |
| | | const num = parseFloat(value); |
| | | if (isNaN(num)) return '-'; |
| | | return `${(num * 100).toFixed(2)}%`; |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .satisfaction-statistics { |
| | | .query-section { |
| | | background: #fff; |
| | | padding: 20px; |
| | | border-radius: 4px; |
| | | margin-bottom: 20px; |
| | | |
| | | .query-form { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | |
| | | ::v-deep .el-form-item { |
| | | margin-bottom: 20px; |
| | | |
| | | &:not(:last-child) { |
| | | margin-right: 20px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .chart-section { |
| | | background: #fff; |
| | | padding: 20px; |
| | | border-radius: 4px; |
| | | margin-bottom: 20px; |
| | | |
| | | .chart-container { |
| | | width: 100%; |
| | | |
| | | .chart-title { |
| | | font-size: 16px; |
| | | font-weight: 600; |
| | | color: #333; |
| | | margin-bottom: 20px; |
| | | padding-bottom: 10px; |
| | | border-bottom: 1px solid #f0f0f0; |
| | | } |
| | | |
| | | #satisfactionBarChart { |
| | | width: 100%; |
| | | height: 400px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .detail-table-section { |
| | | background: #fff; |
| | | padding: 20px; |
| | | border-radius: 4px; |
| | | |
| | | .section-title { |
| | | font-size: 16px; |
| | | font-weight: 600; |
| | | color: #333; |
| | | margin-bottom: 20px; |
| | | padding-bottom: 10px; |
| | | border-bottom: 1px solid #f0f0f0; |
| | | } |
| | | |
| | | .option-detail { |
| | | padding: 20px; |
| | | background: #f8f9fa; |
| | | border-radius: 4px; |
| | | margin: 10px 0; |
| | | } |
| | | |
| | | ::v-deep .el-table { |
| | | th { |
| | | background-color: #f8f9fa; |
| | | font-weight: 600; |
| | | color: #333; |
| | | } |
| | | |
| | | .question-row { |
| | | td { |
| | | background-color: #fff; |
| | | } |
| | | |
| | | &:hover { |
| | | td { |
| | | background-color: #f5f7fa; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .score-text { |
| | | font-weight: 600; |
| | | color: #1890ff; |
| | | font-size: 16px; |
| | | } |
| | | |
| | | .summary-row { |
| | | margin-top: 20px; |
| | | padding: 20px; |
| | | background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%); |
| | | border-radius: 4px; |
| | | border: 1px solid #dee2e6; |
| | | |
| | | .summary-content { |
| | | display: flex; |
| | | justify-content: space-around; |
| | | align-items: center; |
| | | |
| | | .summary-item { |
| | | text-align: center; |
| | | |
| | | .label { |
| | | font-size: 16px; |
| | | color: #666; |
| | | margin-right: 8px; |
| | | } |
| | | |
| | | .value { |
| | | font-size: 24px; |
| | | font-weight: 600; |
| | | color: #1890ff; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .pagination-section { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | background: #fff; |
| | | padding: 20px; |
| | | border-radius: 4px; |
| | | margin-top: 20px; |
| | | } |
| | | |
| | | // å
å±è¡¨æ ¼æ ·å¼ |
| | | .inner-table { |
| | | ::v-deep .el-table__header-wrapper { |
| | | th { |
| | | background-color: #f0f7ff !important; |
| | | color: #333; |
| | | font-weight: 600; |
| | | } |
| | | } |
| | | |
| | | ::v-deep .el-table__body-wrapper { |
| | | tr { |
| | | background-color: #fff; |
| | | |
| | | &:hover { |
| | | background-color: #f5f7fa; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="seedetails-dialog"> |
| | | <div class="examine-jic"> |
| | | <div class="jic-value"> |
| | | <!-- æ¥è¯¢è¡¨å --> |
| | | <el-form |
| | | :model="patientqueryParams" |
| | | ref="patientQueryForm" |
| | | size="small" |
| | | :inline="true" |
| | | class="detail-query-form" |
| | | > |
| | | <el-form-item label="æ£è
ï¼" prop="name"> |
| | | <el-input |
| | | v-model="patientqueryParams.name" |
| | | placeholder="请è¾å
¥æ£è
å§å" |
| | | clearable |
| | | @keyup.enter.native="handleSearch" |
| | | style="width: 180px" |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="æ£è
è¯æï¼" prop="leavediagname"> |
| | | <el-input |
| | | v-model="patientqueryParams.leavediagname" |
| | | placeholder="请è¾å
¥æ£è
è¯æ" |
| | | clearable |
| | | @keyup.enter.native="handleSearch" |
| | | style="width: 200px" |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | @click="handleSearch" |
| | | :loading="loading" |
| | | > |
| | | æç´¢ |
| | | </el-button> |
| | | <el-button icon="el-icon-refresh" @click="handleReset"> |
| | | éç½® |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <!-- æ£è
åè¡¨è¡¨æ ¼ --> |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="logsheetlist" |
| | | style="width: 100%" |
| | | :border="true" |
| | | class="patient-table" |
| | | > |
| | | <el-table-column |
| | | prop="sendname" |
| | | label="å§å" |
| | | align="center" |
| | | width="100" |
| | | /> |
| | | |
| | | <el-table-column |
| | | prop="taskName" |
| | | label="ä»»å¡åç§°" |
| | | align="center" |
| | | width="200" |
| | | show-overflow-tooltip |
| | | /> |
| | | |
| | | <el-table-column |
| | | prop="sendstate" |
| | | label="ä»»å¡ç¶æ" |
| | | align="center" |
| | | width="120" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <div v-if="row.sendstate == 1"> |
| | | <el-tag type="primary" size="small">表åå·²é¢å</el-tag> |
| | | </div> |
| | | <div v-if="row.sendstate == 2"> |
| | | <el-tag type="primary" size="small">å¾
é访</el-tag> |
| | | </div> |
| | | <div v-if="row.sendstate == 3"> |
| | | <el-tag type="success" size="small">表åå·²åé</el-tag> |
| | | </div> |
| | | <div v-if="row.sendstate == 4"> |
| | | <el-tag type="info" size="small">䏿§è¡</el-tag> |
| | | </div> |
| | | <div v-if="row.sendstate == 5"> |
| | | <el-tag type="danger" size="small">åé失败</el-tag> |
| | | </div> |
| | | <div v-if="row.sendstate == 6"> |
| | | <el-tag type="success" size="small">已宿</el-tag> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | prop="visitTime" |
| | | label="åºé访æ¶é´" |
| | | align="center" |
| | | width="180" |
| | | show-overflow-tooltip |
| | | /> |
| | | |
| | | <el-table-column |
| | | prop="finishtime" |
| | | label="éè®¿å®ææ¶é´" |
| | | align="center" |
| | | width="180" |
| | | show-overflow-tooltip |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <span v-if="row.finishtime">{{ row.finishtime }}</span> |
| | | <span v-else style="color: #f56c6c">æªå®æ</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="åºé¢æ¥æ" |
| | | width="120" |
| | | align="center" |
| | | key="endtime" |
| | | prop="endtime" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <span v-if="row.endtime">{{ formatTime(row.endtime) }}</span> |
| | | <span v-else>-</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="责任æ¤å£«" |
| | | width="120" |
| | | align="center" |
| | | key="nurseName" |
| | | prop="nurseName" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="主治å»ç" |
| | | width="120" |
| | | align="center" |
| | | key="drname" |
| | | prop="drname" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="ç»æç¶æ" |
| | | align="center" |
| | | key="excep" |
| | | prop="excep" |
| | | width="120" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <dict-tag |
| | | :options="dict.type.sys_yujing" |
| | | :value="row.excep" |
| | | size="small" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | label="å¤çæè§" |
| | | align="center" |
| | | key="suggest" |
| | | prop="suggest" |
| | | width="120" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <dict-tag |
| | | :options="dict.type.sys_suggest" |
| | | :value="row.suggest" |
| | | size="small" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | prop="templatename" |
| | | label="æå¡æ¨¡æ¿" |
| | | width="150" |
| | | align="center" |
| | | show-overflow-tooltip |
| | | /> |
| | | |
| | | <el-table-column |
| | | prop="remark" |
| | | label="æå¡è®°å½" |
| | | width="150" |
| | | align="center" |
| | | show-overflow-tooltip |
| | | /> |
| | | |
| | | <el-table-column |
| | | prop="bankcardno" |
| | | label="å¼å«ç¶æ" |
| | | width="120" |
| | | align="center" |
| | | /> |
| | | |
| | | <el-table-column |
| | | label="æä½" |
| | | fixed="right" |
| | | align="center" |
| | | width="100" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <el-button |
| | | type="text" |
| | | size="small" |
| | | @click="handleViewDetail(row)" |
| | | > |
| | | <i class="el-icon-view"></i> æ¥ç |
| | | </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- å页 --> |
| | | <div class="pagination" v-if="patienttotal > 0"> |
| | | <el-pagination |
| | | background |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | :current-page="patientqueryParams.pn" |
| | | :page-size="patientqueryParams.ps" |
| | | :page-sizes="[10, 20, 30]" |
| | | :total="patienttotal" |
| | | @size-change="handleSizeChange" |
| | | @current-change="handlePageChange" |
| | | /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { selectTimelyRate } from "@/api/system/user"; |
| | | |
| | | export default { |
| | | name: 'SeedetailsDialog', |
| | | dicts: ['sys_yujing', 'sys_suggest'], |
| | | props: { |
| | | rowData: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | }, |
| | | queryParams: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | // æ¥è¯¢åæ° |
| | | patientqueryParams: { |
| | | pn: 1, |
| | | ps: 10, |
| | | name: '', |
| | | leavediagname: '' |
| | | }, |
| | | |
| | | // å è½½ç¶æ |
| | | loading: false, |
| | | |
| | | // æ£è
å表 |
| | | logsheetlist: [], |
| | | |
| | | // æ»æ¡æ° |
| | | patienttotal: 0 |
| | | }; |
| | | }, |
| | | |
| | | mounted() { |
| | | this.loadData(); |
| | | }, |
| | | |
| | | methods: { |
| | | // å è½½æ°æ® |
| | | async loadData() { |
| | | this.loading = true; |
| | | try { |
| | | const params = { |
| | | ...this.patientqueryParams, |
| | | deptcode: this.rowData.deptcode || '', |
| | | starttime: this.queryParams.dateRange?.[0] ? this.parseTime(this.queryParams.dateRange[0]) : '', |
| | | endtime: this.queryParams.dateRange?.[1] ? this.parseTime(this.queryParams.dateRange[1]) : '' |
| | | }; |
| | | |
| | | const response = await selectTimelyRate(params); |
| | | this.logsheetlist = response.data?.detail || []; |
| | | this.patienttotal = response.data?.total || 0; |
| | | } catch (error) { |
| | | console.error('è·åæªåæ¶é访详æ
失败:', error); |
| | | this.$message.error('è·åæ°æ®å¤±è´¥'); |
| | | } finally { |
| | | this.loading = false; |
| | | } |
| | | }, |
| | | |
| | | // å¤çæç´¢ |
| | | handleSearch() { |
| | | this.patientqueryParams.pn = 1; |
| | | this.loadData(); |
| | | }, |
| | | |
| | | // å¤çéç½® |
| | | handleReset() { |
| | | this.patientqueryParams = { |
| | | pn: 1, |
| | | ps: 10, |
| | | name: '', |
| | | leavediagname: '' |
| | | }; |
| | | this.loadData(); |
| | | }, |
| | | |
| | | // å¤çå页大å°åå |
| | | handleSizeChange(size) { |
| | | this.patientqueryParams.ps = size; |
| | | this.patientqueryParams.pn = 1; |
| | | this.loadData(); |
| | | }, |
| | | |
| | | // å¤ç页ç åå |
| | | handlePageChange(page) { |
| | | this.patientqueryParams.pn = page; |
| | | this.loadData(); |
| | | }, |
| | | |
| | | // æ ¼å¼åæ¶é´ |
| | | formatTime(time) { |
| | | if (!time) return '-'; |
| | | return time; |
| | | }, |
| | | |
| | | // è§£ææ¶é´ |
| | | parseTime(time) { |
| | | if (!time) return ''; |
| | | return time; |
| | | }, |
| | | |
| | | // æ¥ç详æ
|
| | | handleViewDetail(row) { |
| | | this.$emit('close'); |
| | | |
| | | let type = ""; |
| | | if (row.preachformson && row.preachformson.includes("3")) { |
| | | type = 1; |
| | | } |
| | | |
| | | setTimeout(() => { |
| | | this.$router.push({ |
| | | path: "/followvisit/record/detailpage/", |
| | | query: { |
| | | taskid: row.taskid, |
| | | patid: row.patid, |
| | | id: row.id, |
| | | Voicetype: type |
| | | } |
| | | }); |
| | | }, 300); |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .seedetails-dialog { |
| | | .detail-query-form { |
| | | margin-bottom: 20px; |
| | | padding-bottom: 20px; |
| | | border-bottom: 1px solid #f0f0f0; |
| | | |
| | | ::v-deep .el-form-item { |
| | | margin-bottom: 0; |
| | | margin-right: 20px; |
| | | } |
| | | } |
| | | |
| | | .patient-table { |
| | | margin-bottom: 20px; |
| | | |
| | | ::v-deep .el-table__header-wrapper th { |
| | | background-color: #f8f9fa; |
| | | font-weight: 600; |
| | | color: #333; |
| | | } |
| | | } |
| | | |
| | | .pagination { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | padding-top: 20px; |
| | | border-top: 1px solid #f0f0f0; |
| | | } |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="topic-dialog"> |
| | | <div class="topicdia"> |
| | | <div style="overflow-x: hidden; overflow-y: auto; max-height: 65vh"> |
| | | <div |
| | | v-for="(item, index) in topiclist" |
| | | :key="index" |
| | | class="ttaabbcc" |
| | | > |
| | | <div class="describe"> |
| | | 第{{ index + 1 }}é¢ï¼ {{ item.scriptContent }}? |
| | | <span>[{{ item.scriptType == 1 ? "åéé¢" : "å¤éé¢" }}]</span> |
| | | </div> |
| | | <div> |
| | | <el-table :data="item.details" style="width: 100%"> |
| | | <el-table-column |
| | | prop="optionText" |
| | | label="é®é¢é项" |
| | | align="center" |
| | | min-width="200" |
| | | /> |
| | | <el-table-column |
| | | prop="chosenQuantity" |
| | | label="éæ©äººæ°" |
| | | align="center" |
| | | min-width="120" |
| | | /> |
| | | <el-table-column |
| | | prop="chosenPercentage" |
| | | label="æ¯ä¾" |
| | | align="center" |
| | | min-width="120" |
| | | > |
| | | <template slot-scope="{ row }"> |
| | | <span v-if="row.chosenPercentage !== null && row.chosenPercentage !== undefined"> |
| | | {{ formatPercent(row.chosenPercentage) }} |
| | | </span> |
| | | <span v-else>-</span> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div slot="footer" class="dialog-footer" style="text-align: center; padding-top: 20px;"> |
| | | <el-button @click="handleClose">å
³ é</el-button> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | name: 'TopicDialog', |
| | | props: { |
| | | rowData: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | }, |
| | | queryParams: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | topiclist: [] |
| | | }; |
| | | }, |
| | | |
| | | mounted() { |
| | | this.loadData(); |
| | | }, |
| | | |
| | | methods: { |
| | | // å è½½æ°æ® |
| | | async loadData() { |
| | | try { |
| | | // è¿éä»ç¶ç»ä»¶ä¼ éæ°æ®ï¼ä¸éè¦éæ°è°ç¨API |
| | | this.topiclist = this.$parent.topiclist || []; |
| | | } catch (error) { |
| | | console.error('å è½½é¢ç®è¯¦æ
失败:', error); |
| | | this.$message.error('å è½½é¢ç®è¯¦æ
失败'); |
| | | } |
| | | }, |
| | | |
| | | // æ ¼å¼åç¾åæ¯ |
| | | formatPercent(value) { |
| | | if (value === null || value === undefined) return '-'; |
| | | const num = parseFloat(value); |
| | | if (isNaN(num)) return '-'; |
| | | return `${(num * 100).toFixed(2)}%`; |
| | | }, |
| | | |
| | | // å
³éå¯¹è¯æ¡ |
| | | handleClose() { |
| | | this.$emit('close'); |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .topic-dialog { |
| | | .topicdia { |
| | | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, |
| | | "Helvetica Neue", Arial, sans-serif; |
| | | color: #333; |
| | | } |
| | | |
| | | .ttaabbcc { |
| | | background: #fafafa; |
| | | border-radius: 6px; |
| | | padding: 16px; |
| | | margin-bottom: 20px; |
| | | border-left: 4px solid #4794c5; |
| | | } |
| | | |
| | | .describe { |
| | | font-size: 15px; |
| | | line-height: 1.6; |
| | | margin-bottom: 12px; |
| | | color: #1f2d3d; |
| | | } |
| | | |
| | | .describe span { |
| | | font-size: 13px; |
| | | color: #999; |
| | | font-style: italic; |
| | | margin-left: 8px; |
| | | } |
| | | |
| | | ::v-deep .el-table { |
| | | border-radius: 4px; |
| | | overflow: hidden; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | ::v-deep .el-table th { |
| | | background-color: #f1f5f9; |
| | | color: #333; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | ::v-deep .el-table td { |
| | | border-bottom: 1px solid #f0f0f0; |
| | | padding: 12px 0; |
| | | } |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- StatisticsMain.vue --> |
| | | <template> |
| | | <div class="statistics-main"> |
| | | <el-tabs v-model="activeTab" @tab-click="handleTabChange"> |
| | | <el-tab-pane label="é访ç»è®¡" name="followup"> |
| | | <followup-statistics |
| | | v-if="activeTab === 'followup'" |
| | | ref="followupRef" |
| | | /> |
| | | </el-tab-pane> |
| | | <el-tab-pane label="满æåº¦ç»è®¡" name="satisfaction"> |
| | | <satisfaction-statistics |
| | | v-if="activeTab === 'satisfaction'" |
| | | ref="satisfactionRef" |
| | | /> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import FollowupStatistics from './components/FollowupStatistics.vue'; |
| | | import SatisfactionStatistics from './components/SatisfactionStatistics.vue'; |
| | | |
| | | export default { |
| | | name: 'StatisticsMain', |
| | | components: { |
| | | FollowupStatistics, |
| | | SatisfactionStatistics |
| | | }, |
| | | data() { |
| | | return { |
| | | activeTab: 'followup' |
| | | }; |
| | | }, |
| | | methods: { |
| | | handleTabChange(tab) { |
| | | console.log('忢å°:', tab.name); |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .statistics-main { |
| | | padding: 20px; |
| | | background: #fff; |
| | | min-height: calc(100vh - 84px); |
| | | |
| | | ::v-deep .el-tabs__header { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | ::v-deep .el-tabs__item { |
| | | font-size: 16px; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | ::v-deep .el-tabs__nav-wrap::after { |
| | | height: 1px; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | >åé失败</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 6"> |
| | | <div v-if="scope.row.sendstate == 6"> |
| | | <el-tag type="success" :disable-transitions="false" |
| | | >已宿</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 7"> |
| | | <el-tag type="danger" :disable-transitions="false" |
| | | >è¶
æ¶</el-tag |
| | | > |
| | | </div> |
| | | </el-tooltip> |
| | |
| | | label="åºéè®¿æ¥æ" |
| | | width="200" |
| | | align="center" |
| | | key="longSendTime" |
| | | prop="longSendTime" |
| | | key="visitTime" |
| | | prop="visitTime" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatTime(scope.row.longSendTime) }}</span> |
| | | <span>{{ formatTime(scope.row.visitTime) }}</span> |
| | | </template></el-table-column |
| | | > |
| | | <el-table-column |
| | |
| | | value: 4, |
| | | label: "䏿§è¡", |
| | | }, |
| | | { |
| | | { |
| | | value: 5, |
| | | label: "åé失败", |
| | | }, |
| | |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | sextype: [ |
| | | { |
| | |
| | | label="åºéè®¿æ¥æ" |
| | | width="200" |
| | | align="center" |
| | | key="longSendTime" |
| | | prop="longSendTime" |
| | | key="visitTime" |
| | | prop="visitTime" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatTime(scope.row.longSendTime) }}</span> |
| | | <span>{{ formatTime(scope.row.visitTime) }}</span> |
| | | </template></el-table-column |
| | | > |
| | | <el-table-column |
| | |
| | | value: 4, |
| | | label: "䏿§è¡", |
| | | }, |
| | | { |
| | | { |
| | | value: 5, |
| | | label: "åé失败", |
| | | }, |
| | |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | topicoptionsyj: [ |
| | | { |
| | |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-plus" |
| | | icon="el-icon-plus" |
| | | size="medium" |
| | | @click="handleAdd" |
| | | >æ°å¢</el-button |
| | |
| | | >åé失败</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 6"> |
| | | <div v-if="scope.row.sendstate == 6"> |
| | | <el-tag type="success" :disable-transitions="false" |
| | | >已宿</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 7"> |
| | | <el-tag type="danger" :disable-transitions="false" |
| | | >è¶
æ¶</el-tag |
| | | > |
| | | </div> |
| | | </el-tooltip> |
| | |
| | | label="åºéè®¿æ¥æ" |
| | | width="200" |
| | | align="center" |
| | | key="longSendTime" |
| | | prop="longSendTime" |
| | | key="visitTime" |
| | | prop="visitTime" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatTime(scope.row.longSendTime) }}</span> |
| | | <span>{{ formatTime(scope.row.visitTime) }}</span> |
| | | </template></el-table-column |
| | | > |
| | | <el-table-column |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row > |
| | | <el-row> |
| | | <el-col :span="8"> |
| | | <el-form-item label="è¿æ»¤å»ç" width="100" prop="filterDrname"> |
| | | <el-input |
| | |
| | | visitCount: 2, |
| | | scopetype: [], |
| | | visitDeptCodes: [], |
| | | leaveldeptcodes:[], |
| | | // leaveldeptcodes:[], |
| | | leavehospitaldistrictcodes: [], |
| | | }, |
| | | propss: { multiple: true }, |
| | |
| | | value: 4, |
| | | label: "䏿§è¡", |
| | | }, |
| | | { |
| | | { |
| | | value: 5, |
| | | label: "åé失败", |
| | | }, |
| | | { |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | sextype: [ |
| | |
| | | this.topqueryParams.visitDeptCodes = store.getters.belongDepts.map( |
| | | (obj) => obj.deptCode |
| | | ); |
| | | this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map( |
| | | (obj) => obj.deptCode |
| | | ); |
| | | // this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map( |
| | | // (obj) => obj.deptCode |
| | | // ); |
| | | this.topqueryParams.leavehospitaldistrictcodes = |
| | | store.getters.belongWards.map((obj) => obj.districtCode); |
| | | } |
| | |
| | | this.loading = true; |
| | | if ( |
| | | this.topqueryParams.leavehospitaldistrictcodes[0] && |
| | | this.topqueryParams.visitDeptCodes[0]&&this.topqueryParams.leaveldeptcodes[0] |
| | | this.topqueryParams.visitDeptCodes[0] |
| | | ) { |
| | | this.topqueryParams.deptOrDistrict = 2; |
| | | this.topqueryParams.deptOrDistrict = 4; |
| | | } else { |
| | | this.topqueryParams.deptOrDistrict = 1; |
| | | } |
| | |
| | | }); |
| | | }, |
| | | affiliation() { |
| | | this.topqueryParams.managementDoctorCode= store.getters.hisUserId; |
| | | this.topqueryParams.managementDoctorCode = store.getters.hisUserId; |
| | | |
| | | this.getList(1); |
| | | }, |
| | |
| | | this.topqueryParams.visitDeptCodes = store.getters.belongDepts.map( |
| | | (obj) => obj.deptCode |
| | | ); |
| | | this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map( |
| | | (obj) => obj.deptCode |
| | | ); |
| | | // this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map( |
| | | // (obj) => obj.deptCode |
| | | // ); |
| | | this.topqueryParams.leavehospitaldistrictcodes = |
| | | store.getters.belongWards.map((obj) => obj.districtCode); |
| | | } |
| | |
| | | this.topqueryParams.leavehospitaldistrictcodes, |
| | | sendstates: [2, 3], |
| | | visitDeptCodes: this.topqueryParams.visitDeptCodes, |
| | | leaveldeptcodes: this.topqueryParams.leaveldeptcodes, |
| | | // leaveldeptcodes: this.topqueryParams.leaveldeptcodes, |
| | | }; |
| | | buidegetTasklist(obj).then((response) => { |
| | | this.userList = response.rows[0].serviceSubtaskList; |
| | |
| | | this.topqueryParams.visitDeptCodes = store.getters.belongDepts.map( |
| | | (obj) => obj.deptCode |
| | | ); |
| | | this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map( |
| | | (obj) => obj.deptCode |
| | | ); |
| | | // this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map( |
| | | // (obj) => obj.deptCode |
| | | // ); |
| | | this.topqueryParams.leavehospitaldistrictcodes = |
| | | store.getters.belongWards.map((obj) => obj.districtCode); |
| | | } |
| | |
| | | let code = value.slice(-1)[0]; |
| | | this.topqueryParams.leavehospitaldistrictcodes = []; |
| | | this.topqueryParams.visitDeptCodes = []; |
| | | this.topqueryParams.leaveldeptcodes = []; |
| | | // this.topqueryParams.leaveldeptcodes = []; |
| | | if (type == 1) { |
| | | this.topqueryParams.visitDeptCodes.push(code); |
| | | this.topqueryParams.leaveldeptcodes.push(code); |
| | | // this.topqueryParams.leaveldeptcodes.push(code); |
| | | this.topqueryParams.leavehospitaldistrictcodes = []; |
| | | this.topqueryParams.searchscope = 1; |
| | | } else if (type == 2) { |
| | | this.topqueryParams.leavehospitaldistrictcodes.push(code); |
| | | this.topqueryParams.visitDeptCodes = []; |
| | | this.topqueryParams.leaveldeptcodes = []; |
| | | // this.topqueryParams.leaveldeptcodes = []; |
| | | this.topqueryParams.searchscope = 2; |
| | | } else { |
| | | this.topqueryParams.searchscope = 3; |
| | |
| | | visitCount: 2, |
| | | scopetype: [], |
| | | visitDeptCodes: [], |
| | | leaveldeptcodes:[], |
| | | // leaveldeptcodes:[], |
| | | leavehospitaldistrictcodes: [], |
| | | }; |
| | | this.handleQuery(1); |
| | |
| | | .then((response) => { |
| | | console.log(response); |
| | | }) |
| | | .then(() => { |
| | | .then(() => { |
| | | this.getList(1); |
| | | this.$modal.msgSuccess("æ£è
è¿æ»¤æå"); |
| | | }); |
| | |
| | | }, |
| | | // 跳转详æ
页 |
| | | Seedetails(row) { |
| | | let type = ""; |
| | | let type = ""; |
| | | console.log(row, "rwo"); |
| | | if (row.type == 1) { |
| | | type = 1; |
| | | } |
| | | if (row.type == 1) { |
| | | type = 1; |
| | | } |
| | | this.$router.push({ |
| | | path: "/followvisit/record/detailpage/", |
| | | query: { |
| | |
| | | } |
| | | } |
| | | ::v-deep.leftvlue .el-card__body { |
| | | background: #F2F8FF; |
| | | color: #324A9B; |
| | | background: #f2f8ff; |
| | | color: #324a9b; |
| | | } |
| | | ::v-deep.leftvlue .el-card__body:hover { |
| | | background: #3664D9; |
| | | background: #3664d9; |
| | | color: #fff; |
| | | cursor: pointer; /* é¼ æ æ¬æµ®æ¶å为æå½¢ */ |
| | | } |
| | |
| | | label="åºéè®¿æ¥æ" |
| | | width="200" |
| | | align="center" |
| | | key="longSendTime" |
| | | prop="longSendTime" |
| | | key="visitTime" |
| | | prop="visitTime" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatTime(scope.row.longSendTime) }}</span> |
| | | <span>{{ formatTime(scope.row.visitTime) }}</span> |
| | | </template></el-table-column |
| | | > |
| | | <el-table-column |
| | |
| | | value: 4, |
| | | label: "䏿§è¡", |
| | | }, |
| | | { |
| | | { |
| | | value: 5, |
| | | label: "åé失败", |
| | | }, |
| | |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | topicoptionsyj: [ |
| | | { |
| | |
| | | >åé失败</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 6"> |
| | | <div v-if="scope.row.sendstate == 6"> |
| | | <el-tag type="success" :disable-transitions="false" |
| | | >已宿</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 7"> |
| | | <el-tag type="danger" :disable-transitions="false" |
| | | >è¶
æ¶</el-tag |
| | | > |
| | | </div> |
| | | </el-tooltip> |
| | |
| | | label="åºéè®¿æ¥æ" |
| | | width="200" |
| | | align="center" |
| | | key="longSendTime" |
| | | prop="longSendTime" |
| | | key="visitTime" |
| | | prop="visitTime" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatTime(scope.row.longSendTime) }}</span> |
| | | <span>{{ formatTime(scope.row.visitTime) }}</span> |
| | | </template></el-table-column |
| | | > |
| | | <el-table-column |
| | |
| | | value: 4, |
| | | label: "䏿§è¡", |
| | | }, |
| | | { |
| | | { |
| | | value: 5, |
| | | label: "åé失败", |
| | | }, |
| | |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | sextype: [ |
| | | { |
| | |
| | | >åé失败</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 6"> |
| | | <div v-if="scope.row.sendstate == 6"> |
| | | <el-tag type="success" :disable-transitions="false" |
| | | >已宿</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 7"> |
| | | <el-tag type="danger" :disable-transitions="false" |
| | | >è¶
æ¶</el-tag |
| | | > |
| | | </div> |
| | | </el-tooltip> |
| | |
| | | label="åºéè®¿æ¥æ" |
| | | width="200" |
| | | align="center" |
| | | key="longSendTime" |
| | | prop="longSendTime" |
| | | key="visitTime" |
| | | prop="visitTime" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatTime(scope.row.longSendTime) }}</span> |
| | | <span>{{ formatTime(scope.row.visitTime) }}</span> |
| | | </template></el-table-column |
| | | > |
| | | <el-table-column |
| | |
| | | visitCount: 2, |
| | | scopetype: [], |
| | | visitDeptCodes: [], |
| | | leaveldeptcodes:[], |
| | | // leaveldeptcodes:[], |
| | | leavehospitaldistrictcodes: [], |
| | | }, |
| | | propss: { multiple: true }, |
| | |
| | | value: 4, |
| | | label: "䏿§è¡", |
| | | }, |
| | | { |
| | | { |
| | | value: 5, |
| | | label: "åé失败", |
| | | }, |
| | | { |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | sextype: [ |
| | |
| | | this.topqueryParams.visitDeptCodes = store.getters.belongDepts.map( |
| | | (obj) => obj.deptCode |
| | | ); |
| | | this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map( |
| | | (obj) => obj.deptCode |
| | | ); |
| | | // this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map( |
| | | // (obj) => obj.deptCode |
| | | // ); |
| | | this.topqueryParams.leavehospitaldistrictcodes = |
| | | store.getters.belongWards.map((obj) => obj.districtCode); |
| | | } |
| | |
| | | this.loading = true; |
| | | if ( |
| | | this.topqueryParams.leavehospitaldistrictcodes[0] && |
| | | this.topqueryParams.visitDeptCodes[0]&&this.topqueryParams.leaveldeptcodes[0] |
| | | this.topqueryParams.visitDeptCodes[0] |
| | | ) { |
| | | this.topqueryParams.deptOrDistrict = 2; |
| | | this.topqueryParams.deptOrDistrict = 4; |
| | | } else { |
| | | this.topqueryParams.deptOrDistrict = 1; |
| | | } |
| | |
| | | this.topqueryParams.visitDeptCodes = store.getters.belongDepts.map( |
| | | (obj) => obj.deptCode |
| | | ); |
| | | this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map( |
| | | (obj) => obj.deptCode |
| | | ); |
| | | // this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map( |
| | | // (obj) => obj.deptCode |
| | | // ); |
| | | this.topqueryParams.leavehospitaldistrictcodes = |
| | | store.getters.belongWards.map((obj) => obj.districtCode); |
| | | } |
| | |
| | | this.topqueryParams.leavehospitaldistrictcodes, |
| | | sendstates: [2, 3], |
| | | visitDeptCodes: this.topqueryParams.visitDeptCodes, |
| | | leaveldeptcodes: this.topqueryParams.leaveldeptcodes, |
| | | // leaveldeptcodes: this.topqueryParams.leaveldeptcodes, |
| | | }; |
| | | buidegetTasklist(obj).then((response) => { |
| | | this.userList = response.rows[0].serviceSubtaskList; |
| | |
| | | this.topqueryParams.visitDeptCodes = store.getters.belongDepts.map( |
| | | (obj) => obj.deptCode |
| | | ); |
| | | this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map( |
| | | (obj) => obj.deptCode |
| | | ); |
| | | // this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map( |
| | | // (obj) => obj.deptCode |
| | | // ); |
| | | this.topqueryParams.leavehospitaldistrictcodes = |
| | | store.getters.belongWards.map((obj) => obj.districtCode); |
| | | } |
| | |
| | | let code = value.slice(-1)[0]; |
| | | this.topqueryParams.leavehospitaldistrictcodes = []; |
| | | this.topqueryParams.visitDeptCodes = []; |
| | | this.topqueryParams.leaveldeptcodes = []; |
| | | // this.topqueryParams.leaveldeptcodes = []; |
| | | if (type == 1) { |
| | | this.topqueryParams.visitDeptCodes.push(code); |
| | | this.topqueryParams.leaveldeptcodes.push(code); |
| | | // this.topqueryParams.leaveldeptcodes.push(code); |
| | | this.topqueryParams.leavehospitaldistrictcodes = []; |
| | | this.topqueryParams.searchscope = 1; |
| | | } else if (type == 2) { |
| | | this.topqueryParams.leavehospitaldistrictcodes.push(code); |
| | | this.topqueryParams.visitDeptCodes = []; |
| | | this.topqueryParams.leaveldeptcodes = []; |
| | | // this.topqueryParams.leaveldeptcodes = []; |
| | | this.topqueryParams.searchscope = 2; |
| | | } else { |
| | | this.topqueryParams.searchscope = 3; |
| | |
| | | visitCount: 2, |
| | | scopetype: [], |
| | | visitDeptCodes: [], |
| | | leaveldeptcodes:[], |
| | | // leaveldeptcodes:[], |
| | | leavehospitaldistrictcodes: [], |
| | | }; |
| | | this.handleQuery(1); |
| | |
| | | >åé失败</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 6"> |
| | | <div v-if="scope.row.sendstate == 6"> |
| | | <el-tag type="success" :disable-transitions="false" |
| | | >已宿</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 7"> |
| | | <el-tag type="danger" :disable-transitions="false" |
| | | >è¶
æ¶</el-tag |
| | | > |
| | | </div> |
| | | </el-tooltip> |
| | |
| | | value: 4, |
| | | label: "䏿§è¡", |
| | | }, |
| | | { |
| | | { |
| | | value: 5, |
| | | label: "åé失败", |
| | | }, |
| | |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | sextype: [ |
| | | { |
| | |
| | | >已宿</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 7"> |
| | | <el-tag type="danger" :disable-transitions="false" |
| | | >è¶
æ¶</el-tag |
| | | > |
| | | </div> |
| | | </el-tooltip> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | label="åºéè®¿æ¥æ" |
| | | width="200" |
| | | align="center" |
| | | key="longSendTime" |
| | | prop="longSendTime" |
| | | key="visitTime" |
| | | prop="visitTime" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatTime(scope.row.longSendTime) }}</span> |
| | | <span>{{ formatTime(scope.row.visitTime) }}</span> |
| | | </template></el-table-column |
| | | > |
| | | <!-- å --> |
| | | <el-table-column |
| | | label="主治å»ç" |
| | | width="120" |
| | |
| | | topqueryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | sendstate: 2, |
| | | sendstate: |
| | | localStorage.getItem("orgname") == "çç«åå¾·ç¿ èé¢åº" ? null : 2, |
| | | sort: localStorage.getItem("orgname") == "丽水å¸ä¸å»é¢" ? 8 : 2, //0 åºé¢æ¶é´(æ£åº) 1 åºé¢æ¶é´(ååº) 2 åéæ¶é´(æ£åº) 3 åéæ¶é´(ååº) 7åºéè®¿æ¥æ(ååº) åºéè®¿æ¥æ(æ£åº) |
| | | serviceType: 2, |
| | | searchscope: 3, |
| | |
| | | { |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | sextype: [ |
| | |
| | | rules: {}, |
| | | }; |
| | | }, |
| | | watch: {}, |
| | | watch: { |
| | | // çå¬è·¯ç±åæ°åå |
| | | "$route.query": { |
| | | handler(newQuery, oldQuery) { |
| | | if (newQuery.errtype !== oldQuery.errtype) { |
| | | console.log(22); |
| | | |
| | | this.loadData(); // éæ°å è½½æ°æ® |
| | | } |
| | | }, |
| | | immediate: true, |
| | | }, |
| | | }, |
| | | created() { |
| | | this.serviceState = store.getters.serviceState; |
| | | this.checkboxlist = store.getters.checkboxlist; |
| | | this.errtype = this.$route.query.errtype; |
| | | this.orgname = localStorage.getItem("orgname"); |
| | | this.errtype = this.$route.query.errtype; |
| | | |
| | | this.leavehospitaldistrictcode = |
| | | this.$route.query.leavehospitaldistrictcode; |
| | | this.sourcetype[0].children = store.getters.belongDepts.map((dept) => { |
| | |
| | | value: dept.districtCode, |
| | | }; |
| | | }); |
| | | if (this.errtype) { |
| | | if (this.errtype == 1) { |
| | | this.toleadExport(2); |
| | | } else if (this.errtype == 2) { |
| | | // å¾
é访 |
| | | this.toleadExport(3); |
| | | } else if (this.errtype == 3) { |
| | | // 失败 |
| | | this.toleadExport(4); |
| | | } else if (this.errtype == 4) { |
| | | // å¼å¸¸ |
| | | this.toleadExport(2); |
| | | } else if (this.errtype == 5) { |
| | | // å
¨é¨ |
| | | this.toleadExport(5); |
| | | } else { |
| | | this.getList(1); |
| | | } |
| | |
| | | }); |
| | | }, |
| | | activated() { |
| | | this.getList(1); |
| | | this.errtype = this.$route.query.errtype; |
| | | if (this.errtype == 1) { |
| | | this.toleadExport(2); |
| | | } else if (this.errtype == 2) { |
| | | // å¾
é访 |
| | | this.toleadExport(3); |
| | | } else if (this.errtype == 3) { |
| | | // 失败 |
| | | this.toleadExport(4); |
| | | } else if (this.errtype == 4) { |
| | | // å¼å¸¸ |
| | | this.toleadExport(2); |
| | | } else if (this.errtype == 5) { |
| | | // å
¨é¨ |
| | | this.toleadExport(5); |
| | | } else { |
| | | this.getList(1); |
| | | } |
| | | }, |
| | | methods: { |
| | | /** æ¥è¯¢é访æå¡å表 */ |
| | |
| | | this.topqueryParams.leavehospitaldistrictcodes.push( |
| | | this.leavehospitaldistrictcode |
| | | ); |
| | | console.log(this.topqueryParams.leavehospitaldistrictcodes, "11"); |
| | | } |
| | | this.loading = true; |
| | | if ( |
| | |
| | | this.total = response.total; |
| | | if (refresh) { |
| | | this.cardlist[0].value = |
| | | Number(response.rows[0].wzx) + Number(response.rows[0].ysf); |
| | | Number(response.rows[0].wzx) + |
| | | Number(response.rows[0].ysf) + |
| | | Number(response.rows[0].fssb); |
| | | // this.cardlist[1].value = response.rows[0].wzx; |
| | | this.cardlist[1].value = response.rows[0].ysf; |
| | | this.ycvalue = response.rows[0].yc; |
| | |
| | | }); |
| | | this.total = response.total; |
| | | }); |
| | | }, |
| | | loadData() { |
| | | this.errtype = this.$route.query.errtype; |
| | | if (this.errtype == 1) { |
| | | this.toleadExport(2); |
| | | } else if (this.errtype == 2) { |
| | | // å¾
é访 |
| | | this.toleadExport(3); |
| | | } else if (this.errtype == 3) { |
| | | // 失败 |
| | | this.toleadExport(4); |
| | | } else if (this.errtype == 4) { |
| | | // å¼å¸¸ |
| | | this.toleadExport(2); |
| | | } else if (this.errtype == 5) { |
| | | // å
¨é¨ |
| | | this.toleadExport(5); |
| | | } else { |
| | | this.getList(1); |
| | | } |
| | | }, |
| | | // æ¶é´ |
| | | getEndOfDay() { |
| | |
| | | store.getters.belongWards.map((obj) => obj.districtCode); |
| | | } |
| | | this.topqueryParams.pageNum = 1; |
| | | this.topqueryParams.startOutHospTime = this.dateRange[0]; |
| | | this.topqueryParams.endOutHospTime = this.dateRange[1]; |
| | | this.topqueryParams.startSendDateTime = this.dateRangefs[0]; |
| | | this.topqueryParams.endSendDateTime = this.dateRangefs[1]; |
| | | // 夿æ¯ä¸æ¯å·¥ä½å°å¿«æ·æ¥è¯¢ |
| | | if (this.errtype != 2) { |
| | | this.topqueryParams.startOutHospTime = this.dateRange[0]; |
| | | this.topqueryParams.endOutHospTime = this.dateRange[1]; |
| | | this.topqueryParams.startSendDateTime = this.dateRangefs[0]; |
| | | this.topqueryParams.endSendDateTime = this.dateRangefs[1]; |
| | | } |
| | | this.getList(refresh); |
| | | }, |
| | | // æ£è
èå´å¤ç |
| | |
| | | }, |
| | | // ä¾¿æ·æé® |
| | | toleadExport(too) { |
| | | console.log(too, "too"); |
| | | |
| | | if (too == 1) { |
| | | this.topqueryParams.sendstate = 4; |
| | | this.topqueryParams.excep = null; |
| | | } else if (too == 2) { |
| | | this.topqueryParams.excep = 1; |
| | | this.topqueryParams.sendstate = null; |
| | | } else if (too == 3) { |
| | | this.topqueryParams.endSendDateTime = this.formatDateToYYYYMMDDHHMMSS( |
| | | this.getEndOfDay() |
| | | ); |
| | | console.log(1111, this.topqueryParams.endSendDateTime); |
| | | |
| | | this.topqueryParams.excep = null; |
| | | this.topqueryParams.sendstate = 2; |
| | | this.topqueryParams.scopetype = null; |
| | | } else if (too == 4) { |
| | | this.topqueryParams.excep = null; |
| | | this.topqueryParams.sendstate = 5; |
| | | this.topqueryParams.scopetype = null; |
| | | } else if (too == 5) { |
| | | this.topqueryParams.excep = null; |
| | | this.topqueryParams.sendstate = null; |
| | | this.topqueryParams.scopetype = null; |
| | | } |
| | | this.handleQuery(1); |
| | | }, |
| | |
| | | >åé失败</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 6"> |
| | | <div v-if="scope.row.sendstate == 6"> |
| | | <el-tag type="success" :disable-transitions="false" |
| | | >已宿</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 7"> |
| | | <el-tag type="danger" :disable-transitions="false" |
| | | >è¶
æ¶</el-tag |
| | | > |
| | | </div> |
| | | </el-tooltip> |
| | |
| | | label="åºéè®¿æ¥æ" |
| | | width="200" |
| | | align="center" |
| | | key="longSendTime" |
| | | prop="longSendTime" |
| | | key="visitTime" |
| | | prop="visitTime" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatTime(scope.row.longSendTime) }}</span> |
| | | <span>{{ formatTime(scope.row.visitTime) }}</span> |
| | | </template></el-table-column |
| | | > |
| | | <el-table-column |
| | |
| | | value: 4, |
| | | label: "䏿§è¡", |
| | | }, |
| | | { |
| | | { |
| | | value: 5, |
| | | label: "åé失败", |
| | | }, |
| | |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | sextype: [ |
| | | { |
| | |
| | | >åé失败</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 6"> |
| | | <div v-if="scope.row.sendstate == 6"> |
| | | <el-tag type="success" :disable-transitions="false" |
| | | >已宿</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 7"> |
| | | <el-tag type="danger" :disable-transitions="false" |
| | | >è¶
æ¶</el-tag |
| | | > |
| | | </div> |
| | | </el-tooltip> |
| | |
| | | value: 4, |
| | | label: "䏿§è¡", |
| | | }, |
| | | { |
| | | { |
| | | value: 5, |
| | | label: "åé失败", |
| | | }, |
| | |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | sextype: [ |
| | | { |
| | |
| | | label="åºéè®¿æ¥æ" |
| | | width="200" |
| | | align="center" |
| | | key="longSendTime" |
| | | prop="longSendTime" |
| | | key="visitTime" |
| | | prop="visitTime" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatTime(scope.row.longSendTime) }}</span> |
| | | <span>{{ formatTime(scope.row.visitTime) }}</span> |
| | | </template></el-table-column |
| | | > |
| | | <el-table-column |
| | |
| | | value: 4, |
| | | label: "䏿§è¡", |
| | | }, |
| | | { |
| | | { |
| | | value: 5, |
| | | label: "åé失败", |
| | | }, |
| | |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | topicoptionsyj: [ |
| | | { |
| | |
| | | >已宿</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 7"> |
| | | <el-tag type="danger" :disable-transitions="false" |
| | | >è¶
æ¶</el-tag |
| | | > |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | |
| | | form.finishtime = ""; |
| | | if (form.resource) { |
| | | if (form.resource == 2) { |
| | | form.visitDeptCode = localStorage.getItem("deptCode"); |
| | | form.visitDeptCode = localStorage.getItem("deptCode") |
| | | ? localStorage.getItem("deptCode") |
| | | : form.deptcode; |
| | | form.visitDeptName = "é访ä¸å¿"; |
| | | } else { |
| | | form.visitDeptCode = form.deptcode; |
| | |
| | | label="åºéè®¿æ¥æ" |
| | | width="200" |
| | | align="center" |
| | | key="longSendTime" |
| | | prop="longSendTime" |
| | | key="visitTime" |
| | | prop="visitTime" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatTime(scope.row.longSendTime) }}</span> |
| | | <span>{{ formatTime(scope.row.visitTime) }}</span> |
| | | </template></el-table-column |
| | | > |
| | | <el-table-column |
| | |
| | | value: 4, |
| | | label: "䏿§è¡", |
| | | }, |
| | | { |
| | | { |
| | | value: 5, |
| | | label: "åé失败", |
| | | }, |
| | |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | topicoptionsyj: [ |
| | | { |
| | |
| | | label="åºéè®¿æ¥æ" |
| | | width="200" |
| | | align="center" |
| | | key="longSendTime" |
| | | prop="longSendTime" |
| | | key="visitTime" |
| | | prop="visitTime" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatTime(scope.row.longSendTime) }}</span> |
| | | <span>{{ formatTime(scope.row.visitTime) }}</span> |
| | | </template></el-table-column |
| | | > |
| | | <el-table-column |
| | |
| | | value: 4, |
| | | label: "䏿§è¡", |
| | | }, |
| | | { |
| | | { |
| | | value: 5, |
| | | label: "åé失败", |
| | | }, |
| | |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | topicoptionsyj: [ |
| | | { |
| | |
| | | >åé失败</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 6"> |
| | | <div v-if="scope.row.sendstate == 6"> |
| | | <el-tag type="success" :disable-transitions="false" |
| | | >已宿</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 7"> |
| | | <el-tag type="danger" :disable-transitions="false" |
| | | >è¶
æ¶</el-tag |
| | | > |
| | | </div> |
| | | </el-tooltip> |
| | |
| | | label="åºéè®¿æ¥æ" |
| | | width="200" |
| | | align="center" |
| | | key="longSendTime" |
| | | prop="longSendTime" |
| | | key="visitTime" |
| | | prop="visitTime" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatTime(scope.row.longSendTime) }}</span> |
| | | <span>{{ formatTime(scope.row.visitTime) }}</span> |
| | | </template></el-table-column |
| | | > |
| | | <el-table-column |
| | |
| | | value: 4, |
| | | label: "䏿§è¡", |
| | | }, |
| | | { |
| | | { |
| | | value: 5, |
| | | label: "åé失败", |
| | | }, |
| | |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | sextype: [ |
| | | { |
| | |
| | | >åé失败</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 6"> |
| | | <div v-if="scope.row.sendstate == 6"> |
| | | <el-tag type="success" :disable-transitions="false" |
| | | >已宿</el-tag |
| | | > |
| | | </div> |
| | | <div v-if="scope.row.sendstate == 7"> |
| | | <el-tag type="danger" :disable-transitions="false" |
| | | >è¶
æ¶</el-tag |
| | | > |
| | | </div> |
| | | </el-tooltip> |
| | |
| | | value: 4, |
| | | label: "䏿§è¡", |
| | | }, |
| | | { |
| | | { |
| | | value: 5, |
| | | label: "åé失败", |
| | | }, |
| | |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | sextype: [ |
| | | { |
| | |
| | | /> |
| | | </el-input> |
| | | </el-form-item> |
| | | <!-- 丽===================水 --> |
| | | <!-- å¸ä¸===================ä¸ --> |
| | | <el-form-item prop="medicalCode"> |
| | | <el-select |
| | | style="width: 100%" |
| | |
| | | value: 4, |
| | | label: "䏿§è¡", |
| | | }, |
| | | { |
| | | { |
| | | value: 5, |
| | | label: "åé失败", |
| | | }, |
| | |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | topicoptionsyj: [ |
| | | { |
| | |
| | | label="åºéè®¿æ¥æ" |
| | | width="200" |
| | | align="center" |
| | | key="longSendTime" |
| | | prop="longSendTime" |
| | | key="visitTime" |
| | | prop="visitTime" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatTime(scope.row.longSendTime) }}</span> |
| | | <span>{{ formatTime(scope.row.visitTime) }}</span> |
| | | </template></el-table-column |
| | | > |
| | | <el-table-column |
| | |
| | | value: 4, |
| | | label: "䏿§è¡", |
| | | }, |
| | | { |
| | | { |
| | | value: 5, |
| | | label: "åé失败", |
| | | }, |
| | |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | topicoptionsyj: [ |
| | | { |
| | |
| | | value: 4, |
| | | label: "䏿§è¡", |
| | | }, |
| | | { |
| | | { |
| | | value: 5, |
| | | label: "åé失败", |
| | | }, |
| | |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | topicoptionsyj: [ |
| | | { |
| | |
| | | label="åºéè®¿æ¥æ" |
| | | width="200" |
| | | align="center" |
| | | key="longSendTime" |
| | | prop="longSendTime" |
| | | key="visitTime" |
| | | prop="visitTime" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatTime(scope.row.longSendTime) }}</span> |
| | | <span>{{ formatTime(scope.row.visitTime) }}</span> |
| | | </template></el-table-column |
| | | > |
| | | <el-table-column |
| | |
| | | value: 4, |
| | | label: "䏿§è¡", |
| | | }, |
| | | { |
| | | { |
| | | value: 5, |
| | | label: "åé失败", |
| | | }, |
| | |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | topicoptionsyj: [ |
| | | { |
| | |
| | | label="åºéè®¿æ¥æ" |
| | | width="200" |
| | | align="center" |
| | | key="longSendTime" |
| | | prop="longSendTime" |
| | | key="visitTime" |
| | | prop="visitTime" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatTime(scope.row.longSendTime) }}</span> |
| | | <span>{{ formatTime(scope.row.visitTime) }}</span> |
| | | </template></el-table-column |
| | | > |
| | | <el-table-column |
| | |
| | | value: 4, |
| | | label: "䏿§è¡", |
| | | }, |
| | | { |
| | | { |
| | | value: 5, |
| | | label: "åé失败", |
| | | }, |
| | |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | topicoptionsyj: [ |
| | | { |
| | |
| | | label="åºéè®¿æ¥æ" |
| | | width="200" |
| | | align="center" |
| | | key="longSendTime" |
| | | prop="longSendTime" |
| | | key="visitTime" |
| | | prop="visitTime" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ formatTime(scope.row.longSendTime) }}</span> |
| | | <span>{{ formatTime(scope.row.visitTime) }}</span> |
| | | </template></el-table-column |
| | | > |
| | | <el-table-column |
| | |
| | | value: 4, |
| | | label: "䏿§è¡", |
| | | }, |
| | | { |
| | | { |
| | | value: 5, |
| | | label: "åé失败", |
| | | }, |
| | |
| | | value: 6, |
| | | label: "已宿", |
| | | }, |
| | | { |
| | | value: 7, |
| | | label: "è¶
æ¶", |
| | | }, |
| | | ], |
| | | topicoptionsyj: [ |
| | | { |
| | |
| | | prop="leavehospitaldistrictname" |
| | | width="150" |
| | | :show-overflow-tooltip="true" |
| | | :sort-method="sortChineseNumber" |
| | | /> |
| | | <el-table-column |
| | | label="ç§å®¤" |
| | |
| | | delete params.leavehospitaldistrictcodes.all; |
| | | delete params.deptcodes.all; |
| | | getSfStatistics(params).then((response) => { |
| | | console.log(response); |
| | | this.loading = false; |
| | | |
| | | // this.total = response.total; |
| | | this.userList = this.customSort(response.data); |
| | | }); |
| | | }, |
| | | sortChineseNumber(a, b) { |
| | | // æå䏿æ°å |
| | | const chineseNumbers = [ |
| | | "ä¸", |
| | | "äº", |
| | | "ä¸", |
| | | "å", |
| | | "äº", |
| | | "å
", |
| | | "ä¸", |
| | | "å
«", |
| | | "ä¹", |
| | | "å", |
| | | "åä¸", |
| | | "åäº", |
| | | ]; |
| | | |
| | | // ä»åç¬¦ä¸²ä¸æåç
åºæ°åï¼å¦"åç
åº" -> "å" |
| | | const getNumberFromText = (text) => { |
| | | if (!text) return -1; |
| | | const match = text.match(/^([ä¸äºä¸åäºå
ä¸å
«ä¹å]+)/); |
| | | if (match && match[1]) { |
| | | return chineseNumbers.indexOf(match[1]); |
| | | } |
| | | return -1; |
| | | }; |
| | | |
| | | const numA = getNumberFromText(a); |
| | | const numB = getNumberFromText(b); |
| | | |
| | | if (numA === -1 && numB === -1) return 0; |
| | | if (numA === -1) return 1; // æ æ³è§£æçæ¾å°åé¢ |
| | | if (numB === -1) return -1; // æ æ³è§£æçæ¾å°åé¢ |
| | | |
| | | return numA - numB; |
| | | }, |
| | | // æç´¢å¤ç彿° |
| | | handleSearch() { |
| | | if (!this.searchName.trim()) { |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | import { |
| | | toamendtag, |
| | | addapitag, |
| | | deletetag, |
| | | changetagcategory, |
| | | } from "@/api/system/label"; |
| | | |
| | | import store from "@/store"; |
| | | import { |
| | | getSfStatisticsJoy, |
| | |
| | | ? this.allDeptCodes |
| | | : this.queryParams.deptcodes, |
| | | }; |
| | | this.loading = true; |
| | | |
| | | // ç§»é¤å¯è½åå¨ç"all"å¼ |
| | | delete params.leavehospitaldistrictcodes.all; |
| | | delete params.deptcodes.all; |
| | | getSfStatisticsJoy(params).then((response) => { |
| | | console.log(response); |
| | | this.loading = false; |
| | | |
| | | this.total = response.total; |
| | | this.userList = response.data; |
| | | }); |
| | |
| | | this.topiclist = response.data; |
| | | }); |
| | | }, |
| | | // æ·»å /ä¿®æ¹æ ç¾ |
| | | Maintenancetag() { |
| | | if (this.lstamendtag) { |
| | | toamendtag(this.addDateRange(this.tagform)).then((response) => { |
| | | console.log(response); |
| | | this.getList(); |
| | | }); |
| | | } else { |
| | | addapitag(this.addDateRange(this.tagform)).then((response) => { |
| | | console.log(response); |
| | | this.getList(); |
| | | }); |
| | | } |
| | | this.tagform = { |
| | | isupload: "", |
| | | tagname: "", |
| | | tagcategoryid: "", |
| | | tagdescription: "", |
| | | tagid: "", |
| | | }; |
| | | }, |
| | | routerErr(row) { |
| | | console.log(row, "跳转å¼å¸¸"); |
| | | this.$router.push({ |
| | |
| | | }; |
| | | this.resetForm("form"); |
| | | }, |
| | | // æ ç¾ç¶æä¿®æ¹ |
| | | handleStatusChange(row) { |
| | | console.log(row.isupload); |
| | | let text = row.isupload === "0" ? "å¯ç¨" : "åç¨"; |
| | | this.$modal |
| | | .confirm('确认è¦"' + text + '""' + row.tagname + '"æ ç¾åï¼') |
| | | .then(function () { |
| | | return changetagcategory(row.tagid, row.isupload); |
| | | }) |
| | | .then(() => { |
| | | this.$modal.msgSuccess(text + "æå"); |
| | | }) |
| | | .catch(function () { |
| | | row.isupload = row.isupload === "0" ? "1" : "0"; |
| | | }); |
| | | }, |
| | | |
| | | /** æç´¢æé®æä½ */ |
| | | handleQuery() { |
| | | this.queryParams.pageNum = 1; |
| | |
| | | this.multiple = !selection.length; |
| | | }, |
| | | |
| | | /** å é¤æé®æä½ */ |
| | | handleDelete(row) { |
| | | console.log(row, "å é¤å¼¹çª"); |
| | | const tagids = row.tagid || this.ids; |
| | | console.log(tagids); |
| | | const tagname = row.tagname; |
| | | this.$modal |
| | | .confirm( |
| | | tagname |
| | | ? 'æ¯å¦ç¡®è®¤å 餿 ç¾å称为"' + tagname + '"çæ°æ®é¡¹ï¼' |
| | | : "æ¯å¦ç¡®è®¤å é¤éä¸çæ°æ®é¡¹ï¼" |
| | | ) |
| | | .then(function () { |
| | | return deletetag(tagids); |
| | | }) |
| | | .then(() => { |
| | | this.getList(); |
| | | this.$modal.msgSuccess("å 餿å"); |
| | | }) |
| | | .catch(() => {}); |
| | | }, |
| | | |
| | | /** å¯¼åºæé®æä½ */ |
| | | /** å¯¼åºæé®æä½ */ |
| | | async handleExport() { |
| | |
| | | updateUser(this.form).then((response) => { |
| | | this.$modal.msgSuccess("ä¿®æ¹æå"); |
| | | this.open = false; |
| | | this.adduserdept(); |
| | | // this.adduserdept(); |
| | | }); |
| | | } else { |
| | | addUser(this.form).then((response) => { |
| | |
| | | this.form.userId = response.data; |
| | | console.log("å¼å§å é¨é¨"); |
| | | |
| | | this.adduserdept(); |
| | | // this.adduserdept(); |
| | | }); |
| | | } |
| | | } |
| | |
| | | [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:8094`,//çç«åå¾· |
| | | target: `http://192.168.100.10:8094`,//çç«åå¾· |
| | | // target: `http://192.168.100.10:8095`,//æ°å |
| | | target:`http://localhost:8095`, |
| | | // target:`http://localhost:8095`, |
| | | // target:`http://35z1t16164.qicp.vip`, |
| | | // target: `http://192.168.100.172:8095`, |
| | | // target: `http://192.168.101.166:8093`, |