hyf 3 yıl önce
ebeveyn
işleme
ed95e76c21

+ 53 - 0
src/api/hos/satisfyRecordApi.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+/**
+ * 获取Checklist分页
+ * @param data
+ * @returns
+ */
+export function getChecklistRecordByPage(data) {
+  return request({
+    url: '/hos/satisfy/record/page',
+    method: 'GET',
+    params: data
+  })
+}
+
+/**
+ * 获取Checklist记录
+ * @param data
+ * @returns
+ */
+export function getChecklistRecordByList(data) {
+  return request({
+    url: '/hos/satisfy/record',
+    method: 'GET',
+    params: data
+  })
+}
+
+/**
+ * 获取Checklist记录
+ * @param data
+ * @returns
+ */
+export function getRecentChecklistRecordByList(data) {
+  return request({
+    url: '/hos/satisfy/record/recent',
+    method: 'GET',
+    params: data
+  })
+}
+
+/**
+ * 获取Checklist记录
+ * @param recordId
+ * @returns
+ */
+export function getChecklistRecordViewById(recordId) {
+  return request({
+    url: '/hos/satisfy/record/view/{recordId}',
+    method: 'GET'
+  })
+}
+

+ 1 - 1
src/assets/custom-theme/index.css

@@ -2939,7 +2939,7 @@
 }
 
 .custom-theme .el-button--mini {
-  padding: 7px 15px;
+  padding: 7px 10px;
   font-size: 12px;
   border-radius: 3px
 }

+ 3 - 3
src/router/modules/csat.js

@@ -41,7 +41,7 @@ const csatRouter = [
     meta: {
       title: '监测数据',
       icon: 'el-icon-c-scale-to-original',
-      permit: 'hos_customer'
+      permit: 'hos_wx_user'
     },
     children: [
       {
@@ -52,9 +52,9 @@ const csatRouter = [
       },
       {
         path: 'index',
-        component: () => import('@/views/hos/data/index'),
+        component: () => import('@/views/hos/record/index'),
         name: 'hos_satisfy_data',
-        meta: { title: '反馈数据', noCache: true, permit: 'hos_satisfy_data' }
+        meta: { title: '评价记录', noCache: true, permit: 'hos_satisfy_data' }
       }
     ]
   },

+ 2 - 2
src/styles/element-ui.scss

@@ -35,7 +35,7 @@
 
 .fixed-width {
   .el-button--mini {
-    padding: 7px 10px;
+    padding: 7px 7px;
     min-width: 60px;
   }
 }
@@ -94,4 +94,4 @@
 }
 .el-menu-item i,.el-submenu__title i{
   color: #fff;
-}
+}

+ 12 - 0
src/utils/index.js

@@ -781,3 +781,15 @@ export function ocAccess(i) {
   ]
   return strs[i]
 }
+
+export function targetType(val) {
+  const strs = [
+    '未知',
+    '风险点',
+    '科室',
+    '设备设施',
+    '人员',
+    '医生'
+  ]
+  return strs[val]
+}

+ 10 - 8
src/views/hos/panorama/components/RecentRecord.vue

@@ -16,15 +16,18 @@
                   <img class="icon-image" src="../images/rank/group.png" alt="">
                 </div>
                 <div class="info">
-                  <div class="positon">
-                    <div class="title">{{ item.checklistTitle }}</div>
+                  <div class="position">
+                    <div class="title">
+                      <span v-if="item.wxName">{{ item.wxName }}</span>
+                      <span v-else>{{ item.accountName }}</span>
+                    </div>
                     <div class="cont">{{ item.recordTime }} </div>
                   </div>
                   <div class="score ">{{ item.score }}分</div>
                   <!-- <div v-if="item.personName"><span style="padding-left:0;color:#c4c1c1;font-size: 10px;">{{ item.personName }}</span></div> -->
                 </div>
               </div>
-              <div class="desc">某某评价内容某某评价内容某某评价内容</div>
+              <div class="desc">{{ item.remark }}</div>
             </div>
           </div>
         </vueSeamlessScroll>
@@ -146,14 +149,14 @@ export default {
                   position: relative;
                   display: flex;
                   align-items: center;
-                  .positon{
+                  .position{
                     flex: 1;
                     .title{
-                      font-size: 18px;
+                      font-size: 16px;
                     }
                     .cont{
                       color: #C1C6C8;
-                      font-size: 16px;
+                      font-size: 14px;
                       padding-top: 12px;
                     }
                   }
@@ -168,7 +171,6 @@ export default {
                       border-radius: 4px;
                       box-sizing: border-box;
                       white-space: nowrap;
-                      font-family: Be Vietnam;
                       border: 0;
                       &.none{
                           background-color: transparent;
@@ -178,7 +180,7 @@ export default {
               }
             }
             .desc{
-              font-size: 14px;
+              font-size: 12px;
               line-height: 16px;
               color: #dbd6d6;
               display: -webkit-box;

+ 67 - 42
src/views/hos/panorama/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="page-container">
     <el-row type="flex" justify="space-between" :gutter="10">
-      <el-col :span="17">
+      <el-col :span="18">
         <div class="evaluate">
           <div class="title">
             <div class="name">年满意度评价</div>
@@ -19,7 +19,7 @@
           <div class="statistics">
             <div class="number">
               <div class="total">
-                <span>评分</span>
+                <span>评分</span>
                 <span class="score">{{ yearOverview.score }}</span>
                 <span class="unit">分</span>
               </div>
@@ -43,6 +43,7 @@
             </div>
           </div>
         </div>
+
         <div class="evaluate month">
           <div class="title">
             <div class="name">月满意度评价</div>
@@ -68,7 +69,7 @@
           <div class="statistics">
             <div class="number">
               <div class="total">
-                <span>评分</span>
+                <span>评分</span>
                 <span class="score">{{ yearOverview.score }}</span>
                 <span class="unit">分</span>
               </div>
@@ -92,6 +93,7 @@
             </div>
           </div>
         </div>
+
         <el-row v-if="false" style="margin-top:10px">
           <el-col class="group-box-month">
             <div class="group-box-head-container"><div class="group-box-head">月满意度评价</div></div>
@@ -104,7 +106,7 @@
                 <div class="panorama-scoreIcon-container">
                   <div class="item">
                     <div class="score small">{{ checklist.score }}</div>
-                    <div class="name">分</div>
+                    <div class="name">分</div>
                   </div>
                   <div class="item">
                     <div class="score small">{{ checklist.targetQty }}</div>
@@ -129,6 +131,7 @@
             </div>
           </el-col>
         </el-row>
+
         <el-row style="margin-top:10px" type="flex" justify="space-between" :gutter="10">
           <el-col :span="12">
             <div class="rank-list">
@@ -158,29 +161,39 @@
           </el-col>
         </el-row>
       </el-col>
-      <el-col :span="7">
+      <el-col :span="6">
         <div class="todayNews">
           <div class="head">
             <div class="item-title">
               <div class="name">今日动态</div>
-              <div class="more" @click="linkTo('/hos/satisfy/news/index')">更多</div>
+              <div class="more" @click="handleMoreAssess('/hos/satisfy/data')">更多</div>
             </div>
             <div class="statistics">
               <div class="item">
                 <img class="icon" src="./images/notice.png" alt="总次数">
                 <div class="cont">
                   <div class="top">
-                    <span class="number">12</span>
+                    <span class="number">{{ todayOverview.recordQty }}</span>
                     <span class="unit">次</span>
                   </div>
                   <div class="name">总次数</div>
                 </div>
               </div>
               <div class="item">
+                <img class="icon" src="./images/notice.png" alt="评分">
+                <div class="cont">
+                  <div class="top">
+                    <span class="number">{{ todayOverview.score }}</span>
+                    <span class="unit">分</span>
+                  </div>
+                  <div class="name">评分</div>
+                </div>
+              </div>
+              <div class="item clearfix">
                 <img class="icon" src="./images/doctor.png" alt="医生">
                 <div class="cont">
                   <div class="top">
-                    <span class="number">12</span>
+                    <span class="number">{{ todayOverview.doctorQty }}</span>
                     <span class="unit">人</span>
                   </div>
                   <div class="name">医生</div>
@@ -190,7 +203,7 @@
                 <img class="icon" src="./images/office.png" alt="科室">
                 <div class="cont">
                   <div class="top">
-                    <span class="number">12</span>
+                    <span class="number">{{ todayOverview.gridQty }}</span>
                     <span class="unit">个</span>
                   </div>
                   <div class="name">科室</div>
@@ -244,12 +257,19 @@ export default {
       conditions: {},
       todayOverview: {
         data: [],
+        day: undefined,
+        targetQty: 0,
+        recordQty: 0,
+        score: 0,
+        doctorQty: 0,
         doctorRank: [],
+        doctorRecordQty: 0,
+        doctorScore: 0,
+        gridQty: 0,
+        gridRecordQty: 0,
+        gridScore: 0,
         gridRank: [],
-        groupName: '',
-        groupRank: [],
-        recordQty: 0,
-        score: 0
+        groupRank: []
       },
       yearOverview: {
         doctorQty: 0,
@@ -270,6 +290,7 @@ export default {
     this.init()
   },
   destroyed() {
+    /*
     if (this.client.connected) {
       try {
         this.client.end(false, () => {
@@ -278,18 +299,20 @@ export default {
       } catch (error) {
         console.log('Disconnect failed', error.toString())
       }
-    }
+    } */
   },
   methods: {
+
     init() {
       const d = new Date()
       this.year = d.getFullYear()
       this.month = d.getMonth() + 1
       this.initYearList()
-      this.monthScoreKeys = this.getmonthScoreKeys()
+      this.monthScoreKeys = this.getMonthScoreKeys()
       this.getData()
       // this.initMqtt()
     },
+
     initYearList() {
       const d = new Date()
       const yearList = []
@@ -298,6 +321,7 @@ export default {
       }
       this.yearList = yearList
     },
+
     initMqtt() {
       const self = this
       const options = {
@@ -322,17 +346,20 @@ export default {
       })
       this.client = client
     },
+
     handleAssessDetail(row) {},
     viewIndexScoreDetail(data) {},
+
     // Get Data
     getData() {
-      this.getyearOverview()
+      this.getYearOverview()
       this.getMonthOverview()
       this.getTodayOverview()
       this.getGridByList()
       this.getDoctorByList()
       this.getGroupByList()
     },
+
     getTodayOverview() {
       todayOverview().then((resp) => {
         const { data } = resp
@@ -343,7 +370,8 @@ export default {
         }
       })
     },
-    getyearOverview() {
+
+    getYearOverview() {
       yearOverview(this.year).then((resp) => {
         const { data } = resp
         if (data) {
@@ -353,6 +381,7 @@ export default {
         }
       })
     },
+
     getMonthOverview() {
       monthOverview(this.year, this.month).then((resp) => {
         const { data } = resp
@@ -365,35 +394,26 @@ export default {
     },
     getGridByList() {
       gridByList(this.conditions).then((resp) => {
-        const { code, msg, data } = resp
-        if (code === 200) {
-          this.gridDataList = data
-        } else {
-          this.$message.error(msg)
-        }
+        const { data } = resp
+        this.gridDataList = data
       })
     },
+
     getGroupByList() {
       groupByList(this.conditions).then((resp) => {
-        const { code, msg, data } = resp
-        if (code === 200) {
-          this.groupDataList = data
-        } else {
-          this.$message.error(msg)
-        }
+        const { data } = resp
+        this.groupDataList = data
       })
     },
+
     getDoctorByList() {
       doctorByList(this.conditions).then((resp) => {
-        const { code, msg, data } = resp
-        if (code === 200) {
-          this.doctorDataList = data
-        } else {
-          this.$message.error(msg)
-        }
+        const { data } = resp
+        this.doctorDataList = data
       })
     },
-    getmonthScoreKeys(date = (new Date()), unit = '') {
+
+    getMonthScoreKeys(date = (new Date()), unit = '') {
       var days = []
       if (typeof (date) === 'string') { // 2022/09
         date = new Date(date)
@@ -406,6 +426,7 @@ export default {
       }
       return days
     },
+
     showYearScore(data) {
       if (Array.isArray(data)) return data
       var arr = []
@@ -414,15 +435,17 @@ export default {
       }
       return arr
     },
+
     handleMoreAssess(url) {
       this.$router.push({
         path: url
       })
     },
+
     formatCheckListValues(data) {
       if (!data) return []
       const enums = {}
-      const len = (this.getmonthScoreKeys(`${this.year}/${this.month}`)).length
+      const len = (this.getMonthScoreKeys(`${this.year}/${this.month}`)).length
       const months = []
       data.forEach(item => { enums[item.day] = item })
       for (let i = 1; i <= len; i++) {
@@ -430,17 +453,21 @@ export default {
       }
       return months
     },
+
     mqttResponse(message) {
       // console.log('message', message.toString())
       this.getData()
     },
+
     changeYear(params) {
-      this.getyearOverview()
+      this.getYearOverview()
     },
+
     changeMonth() {
-      this.monthScoreKeys = this.getmonthScoreKeys(`${this.year}/${this.month}`)
+      this.monthScoreKeys = this.getMonthScoreKeys(`${this.year}/${this.month}`)
       this.getMonthOverview()
     },
+
     linkTo(url) {
       if (url) {
         this.$router.push(url)
@@ -459,7 +486,7 @@ export default {
     height: 242px;
     padding: 20px;
     background-color: #1F3C51;
-    border: 5px 0 0 0;
+    border: 5px;
     border-top: 5px solid rgba(31, 60, 81, 1);
     background: linear-gradient(0deg, #1B3144, #1B3144),linear-gradient(0deg, #1F3C51, #1F3C51);
     &.month{
@@ -472,7 +499,6 @@ export default {
       position: relative;
       margin-top: -8px;
       .name{
-        font-family: Microsoft YaHei UI;
         font-size: 16px;
         font-weight: 700;
         line-height: 16px;
@@ -536,7 +562,6 @@ export default {
         width: 342px;
         .total{
             height: 68px;
-            font-family: Be Vietnam;
             font-size: 14px;
             font-weight: 400;
             line-height: 14px;

+ 223 - 0
src/views/hos/record/components/Details.vue

@@ -0,0 +1,223 @@
+<template>
+  <el-drawer
+    :title="title"
+    :append-to-body="true"
+    :modal="false"
+    :wrapper-closable="false"
+    size="100%"
+    :visible.sync="dialogVisible"
+  >
+    <div class="content-container">
+      <el-row class="counter-wrap">
+        <el-col :span="4" class="left-counter-wrap">
+          <div class="list-group">
+            <div class="list-item">
+              <el-col :span="10">
+                <p class="title">评价人员:</p>
+              </el-col>
+              <el-col :span="14">
+                <p class="count">
+                  <span v-if="viewData.wxId">{{ viewData.wxName }}</span>
+                  <span v-else>{{ viewData.groupName }}-{{ viewData.accountName }}</span>
+                </p>
+              </el-col>
+            </div>
+
+            <div class="list-item">
+              <el-col :span="10">
+                <p class="title">评价目标:</p>
+              </el-col>
+              <el-col :span="14">
+                <p class="count">{{ viewData.targetType | targetTypeFilter }}-{{ viewData.targetTitle }}</p>
+              </el-col>
+            </div>
+
+            <div class="list-item">
+              <el-col :span="10">
+                <p class="title">评价清单:</p>
+              </el-col>
+              <el-col :span="14">
+                <p class="count">{{ viewData.checklistTitle }}</p>
+              </el-col>
+            </div>
+
+            <div class="list-item">
+              <el-col :span="10">
+                <p class="title">评价时间:</p>
+              </el-col>
+              <el-col :span="14">
+                <p class="count">{{ viewData.recordTime }}</p>
+              </el-col>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="20" class="right-counter-wrap">
+          <score-record-view ref="ScoreRecordView" />
+        </el-col>
+      </el-row>
+    </div>
+  </el-drawer>
+</template>
+
+<script>
+import { getChecklistRecordById } from '@/api/system/checklistRecordApi'
+import ScoreRecordView from './ScoreRecord.vue'
+import { targetType } from '@/utils'
+export default {
+  name: 'ChecklistRecordDetails',
+  components: {
+    ScoreRecordView
+  },
+  filters: {
+    targetTypeFilter(val) {
+      return targetType(val)
+    }
+  },
+  data() {
+    return {
+      ops: {
+        bar: {
+          keepShow: false,
+          background: 'rgba(144, 147, 153, 0.4)',
+          onlyShowBarOnScroll: false
+        }
+      },
+      title: '',
+      dialogVisible: false,
+      viewData: {
+        recordId: undefined,
+        targetType: undefined,
+        targetTitle: '',
+        recordTime: undefined
+      },
+      conditions: {
+        recordId: undefined
+      },
+      total: 0
+    }
+  },
+  mounted() {
+  },
+  methods: {
+
+    // 显示巡检任务详情
+    showView(recordId) {
+      this.conditions.recordId = recordId
+      this.dialogVisible = true
+      getChecklistRecordById(recordId).then((resp) => {
+        const { data } = resp
+        this.title = data.targetTitle + '-' + data.checklistTitle
+        this.viewData = data
+        this.getChecklistView()
+      }).catch((error) => {
+        console.log(error)
+      })
+    },
+
+    // 获取清单记录内容
+    getChecklistView() {
+      const { recordId } = this.viewData
+      this.$refs['ScoreRecordView'].showData(recordId)
+    }
+  }
+}
+</script>
+
+<style lang="scss">
+</style>
+<style lang="scss" scoped>
+.content-container {
+  margin: 0 0 15px 15px;
+  height: calc(100vh - 100px);
+
+  .title-bar {
+    border-left: 6px solid #36556B;
+    height: 40px;
+    line-height: 40px;
+    text-indent: 15px;
+    background: #113849;
+    margin-bottom: 15px;
+
+    .page-title {
+      font-size: 18px;
+      font-weight: bold;
+      color: #FFF;
+      margin: 0;
+    }
+  }
+
+  .btn-group {
+    width: 100%;
+    margin-bottom: 15px;
+
+    .send-menu {
+      width: 100%;
+      background: #3D5F76;
+      color: #FFF;
+      border-color: #3D5F76;
+
+      &:hover {
+        background: #283c4c;
+        color: #FFF;
+        border-color: #283c4c;
+      }
+    }
+  }
+
+  .list-group {
+    height: calc(100vh - 85px);
+    background: #193142;
+
+    .sub-title-bar {
+      font-size: 16px;
+      color: #FFF;
+      margin: 0;
+    }
+
+    p {
+      text-align:right;
+      margin: 0;
+      padding: 0;
+    }
+
+    .count {
+      padding: 0;
+      text-align:left;
+      color: #20a0ff;
+    }
+
+    .ck-desc {
+      text-align: left;
+      text-indent: 24px;
+      color: #20a0ff;
+    }
+
+    .list-item {
+      height: 40px;
+      line-height: 40px;
+      color: #FFF;
+      padding: 0 5px;
+      font-size: 13px;
+
+      &.active {
+        color: #08A6DC;
+        position: relative;
+
+        &::after {
+          position: absolute;
+          content: "";
+          width: 0;
+          height: 0;
+          top: calc(50% - 3.5px);
+          right: -3px;
+          border-left: 7px solid transparent;
+          border-right: 7px solid transparent;
+          border-bottom: 7px solid #08A6DC;
+          transform: rotate(270deg);
+        }
+      }
+    }
+  }
+}
+
+</style>

+ 190 - 0
src/views/hos/record/components/RecordList.vue

@@ -0,0 +1,190 @@
+<template>
+  <div class="content-container">
+    <el-table v-loading="listLoading" class="page-table" border :data="dataList" height="calc(100vh - 220px)">
+      <el-table-column type="index" label="序号" header-align="center" align="center" width="80" />
+
+      <el-table-column prop="personName" label="评价人员" header-align="center" align="center" width="180">
+        <template v-slot="{row}">
+          <span v-if="row.wxId"><i class="el-icon-user-solid" />{{ row.wxName }}</span>
+          <span v-else><i class="el-icon-user-solid" />{{ row.accountName }}-{{ row.groupName }}</span>
+        </template>
+      </el-table-column>
+
+      <el-table-column prop="recordTime" label="评价时间" header-align="center" align="center" width="160">
+        <template v-slot="{row}">
+          <span><i class="el-icon-time" /> {{ row.recordTime }}</span>
+        </template>
+      </el-table-column>
+
+      <el-table-column prop="targetTitle" label="评价目标" header-align="center" align="center" width="160">
+        <template v-slot="{row}">
+          <span v-if="row.targetType === 2"><i class="el-icon-place" />{{ row.targetTitle }}</span>
+          <span v-if="row.targetType === 5"><i class="el-icon-s-custom" /> {{ row.targetTitle }}</span>
+        </template>
+      </el-table-column>
+
+      <el-table-column prop="checklistTitle" label="评价清单" header-align="center" align="center" width="160">
+        <template v-slot="{row}">
+          <span v-if="row.checklistTitle"><el-tag type="primary">{{ row.checklistTitle }} </el-tag></span>
+        </template>
+      </el-table-column>
+
+      <el-table-column prop="status" label="评价分值" header-align="center" align="center" width="90">
+        <template v-slot="{row}">
+          <el-tag type="warning">{{ row.score }}</el-tag>
+        </template>
+      </el-table-column>
+
+      <el-table-column prop="checklistTitle" label="备注" header-align="left" align="left">
+        <template v-slot="{row}">
+          <span>{{ row.remark }}</span>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="操作" header-align="center" align="center" width="130">
+        <template v-slot="{row}">
+          <el-button size="mini" type="primary" @click="handleDetails(row)">详情</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <record-details ref="RecordDetails" title="评价详情" />
+
+    <div class="pagination-wrap">
+      <pagination v-show="total>0" :total="total" :page.sync="conditions.page" :limit.sync="conditions.limit" @pagination="getData" />
+    </div>
+  </div>
+</template>
+
+<script>
+import { getChecklistRecordByPage, getChecklistRecordByList } from '@/api/hos/satisfyRecordApi'
+import Pagination from '@/components/Pagination/index.vue'
+import { mapGetters } from 'vuex'
+import RecordDetails from './Details.vue'
+
+export default {
+  name: 'SatisfyRecordList',
+  filters: {},
+  components: { RecordDetails, Pagination },
+  data() {
+    return {
+      dataList: [],
+      total: 0,
+      listLoading: false,
+      downloadLoading: false,
+      title: '',
+      conditions: {
+        page: 1,
+        limit: 10
+      },
+      exportList: [],
+      filename: '',
+      autoWidth: true,
+      bookType: 'xlsx'
+    }
+  },
+  computed: {
+    ...mapGetters([
+      'userData'
+    ])
+  },
+  mounted() {},
+  methods: {
+
+    // 加载数据
+    loadData(params) {
+      this.conditions = { ...this.conditions, ...params }
+      this.getData()
+    },
+
+    // 加载数据
+    getData() {
+      this.listLoading = true
+      getChecklistRecordByPage(this.conditions).then((resp) => {
+        const { data, total } = resp
+        this.listLoading = false
+        this.total = total
+        this.dataList = data
+      }).catch((error) => {
+        console.log(error)
+      })
+    },
+
+    // 导出
+    handleExport() {
+      this.downloadLoading = true
+      getChecklistRecordByList(this.conditions).then((resp) => {
+        const { data } = resp
+        this.exportList = data
+        this.exportExcel()
+      }).catch((error) => {
+        console.log(error)
+      })
+    },
+
+    // 详情
+    handleDetails(data) {
+      const { recordId } = data
+      this.$refs['RecordDetails'].showView(recordId)
+    },
+
+    // 导出EXCEL
+    exportExcel() {
+      import('@/vendor/Export2Excel').then(excel => {
+        const tHeader = ['', '任务类别', '检查时间', '风险点', '风险单元', '危险因素', '检查内容', '检查结果']
+        const filterVal = ['taskTitle', 'taskCatTitle', 'checkTime', 'riskPointTitle', 'hazardTitle', 'riskTitle', 'measureContent', 'checkResult']
+        const list = this.exportList
+        const data = this.formatJson(filterVal, list)
+        excel.export_json_to_excel({
+          header: tHeader,
+          data,
+          filename: this.filename,
+          autoWidth: this.autoWidth,
+          bookType: this.bookType
+        })
+        this.downloadLoading = false
+      })
+    }
+  }
+}
+</script>
+<style lang="scss">
+</style>
+<style lang="scss" scoped>
+.content-container {
+  height: calc(100vh - 145px);
+  border-radius: 5px;
+  margin-right: 0px;
+
+  .el-dropdown {
+    margin: 0 10px;
+  }
+
+  .el-link {
+    color: #FFFFFF;
+  }
+}
+
+.handle-wrap {
+  position: relative;
+  display: flex;
+  justify-content: center;
+  align-content: center;
+  padding: 22px 0;
+  border-radius: 4px;
+
+  .custom-bt {
+    padding: 0 15px;
+    height: 30px;
+    line-height: 30px;
+    border: 0;
+
+    &.el-button--primary {
+      background-color: #346B98;
+    }
+
+    &.el-button--warning {
+      background-color: #F97647;
+    }
+  }
+}
+</style>

+ 238 - 0
src/views/hos/record/components/ScoreRecord.vue

@@ -0,0 +1,238 @@
+<template>
+  <div class="content-container">
+    <el-row class="tool-bar">
+      <el-col :span="4" class="button-group">
+        <div class="page-title">
+          <span> {{ title }} </span>
+        </div>
+      </el-col>
+
+      <el-col :span="20" class="button-group">
+        <div class="right" style="min-width:400px;flex: 1;padding-right: 10px" />
+      </el-col>
+    </el-row>
+
+    <el-row class="content-body" />
+  </div>
+</template>
+
+<script>
+import { getChecklistRecordViewById } from '@/api/hos/hosStatisApi'
+import { checkResult } from '@/utils'
+export default {
+  name: 'ScoreRecord',
+  components: {
+  },
+  filters: {
+    checkResultFilter(val) {
+      return checkResult(val)
+    }
+  },
+  data() {
+    return {
+      ops: {
+        bar: {
+          keepShow: false,
+          background: 'rgba(144, 147, 153, 0.4)',
+          onlyShowBarOnScroll: false
+        }
+      },
+      title: '',
+      dialogVisible: false,
+      viewData: {
+      },
+      conditions: {
+        recordId: undefined
+      },
+      iStatus: 0
+    }
+  },
+  mounted() {},
+  methods: {
+
+    // 显示视图
+    showData(recordId) {
+      this.conditions.recordId = recordId
+      this.dialogVisible = true
+      this.getData()
+    },
+
+    // 初始化数据
+    getData() {
+      const { recordId } = this.conditions
+      getChecklistRecordViewById(recordId).then((resp) => {
+        const { data } = resp
+        this.title = data.checklistTitle
+        this.viewData = data
+      }).catch((error) => {
+        console.log(error)
+      })
+    },
+
+    // 处理
+    handleCheckResult(data) {
+      this.$refs['CheckResult'].showView(data)
+    },
+
+    formSuccess() {
+      this.$emit('formSuccess')
+    },
+
+    resetFormField(formName) {
+      this.$refs[formName].resetFields()
+    }
+  }
+}
+</script>
+
+<style lang="scss">
+</style>
+<style lang="scss" scoped>
+.content-container {
+  margin: 0 0 15px 15px;
+  height: calc(100vh - 100px);
+
+  .title-bar {
+    border-left: 6px solid #36556B;
+    height: 40px;
+    line-height: 40px;
+    text-indent: 15px;
+    background: #113849;
+    margin-bottom: 15px;
+
+    .page-title {
+      font-size: 18px;
+      font-weight: bold;
+      color: #FFF;
+      margin: 0;
+    }
+  }
+
+  .btn-group {
+    width: 100%;
+    padding-right: 15px;
+    text-align: center;
+
+    .send-menu {
+      width: 60%;
+      background: #3D5F76;
+      color: #FFF;
+      border-color: #3D5F76;
+
+      &:hover {
+        background: #283c4c;
+        color: #FFF;
+        border-color: #283c4c;
+      }
+    }
+  }
+
+  .list-group {
+    height: calc(100vh - 85px);
+    background: #193142;
+
+    .sub-title-bar {
+      font-size: 16px;
+      color: #FFF;
+      margin: 0;
+    }
+
+    p {
+      text-align:right;
+      margin: 0;
+      padding: 0;
+    }
+
+    .count {
+      padding: 0;
+      text-align:left;
+      color: #8b8b8b;
+    }
+
+    .ck-desc {
+      text-align: left;
+      text-indent: 24px;
+      color: #8b8b8b;
+    }
+
+    .list-item {
+      height: 40px;
+      line-height: 40px;
+      color: #FFF;
+      padding: 0 5px;
+      font-size: 13px;
+
+      &.active {
+        color: #08A6DC;
+        position: relative;
+
+        &::after {
+          position: absolute;
+          content: "";
+          width: 0;
+          height: 0;
+          top: calc(50% - 3.5px);
+          right: -3px;
+          border-left: 7px solid transparent;
+          border-right: 7px solid transparent;
+          border-bottom: 7px solid #08A6DC;
+          transform: rotate(270deg);
+        }
+      }
+    }
+  }
+
+  .ck-table {
+    color: #FFF;
+    background-color: #0C3444;
+    font-size: 14px;
+    text-indent: initial;
+    border-spacing: 1px;
+    border: #1F3C51 1px solid;
+    padding: 10px 20px;
+    flex: 1;
+    width: 100%;
+    max-width: 100%;
+    .tr-head{
+      padding: 10px 5px;
+    }
+
+    .tr-hazard {
+      font-size: 13px;
+      font-weight: bold;
+      text-indent: 12px;
+      background: #164153;
+      padding: 10px 20px;
+    }
+    .tr-risk {
+      font-size: 12px;
+    }
+    td {
+      box-sizing: border-box;
+      text-overflow: ellipsis;
+      vertical-align: middle;
+      position: relative;
+      padding: 2px 5px;
+      transition: background-color 0.25s ease;
+    }
+
+    .td-sno{ width: 5%; text-align:center; }
+    .td-riskCode{width: 5%; text-align: center; }
+    .td-riskSource{width: 15%; text-align: center; }
+    .td-riskType{width: 5%; text-align: center; }
+    .td-riskLevel{width: 5%; text-align: center; }
+    .td-riskReason{width: 15%; text-align: left; }
+    .td-riskConsequence{width: 10%; text-align: center; }
+    .td-measure{width: 20%; text-align: left; }
+    .td-reference{width: 10%; text-align: left; }
+    .td-checkResult{width: 5%; text-align: left; }
+    .td-action{width: 5%; text-align: left;
+    }
+  }
+  .el-link--inner{
+    color: #08A6DC!important;
+    font-size: 12px!important;
+  }
+}
+
+</style>

+ 167 - 0
src/views/hos/record/index.vue

@@ -0,0 +1,167 @@
+<template>
+  <div class="page-container">
+    <el-row class="tool-bar">
+      <el-col :span="4" class="button-group">
+        <div class="page-title">
+          <span> {{ title }} </span>
+        </div>
+      </el-col>
+
+      <el-col :span="20" class="button-group">
+        <div class="select-search">
+          <span class="search-label">部门:</span>
+          <group-selector v-model="conditions.groupId" />
+        </div>
+
+        <div class="select-search">
+          <span class="search-label">年度:</span>
+          <el-select v-model="conditions.year" filterable placeholder="年份" style="width:120px">
+            <el-option label="2022年" :value="2022" />
+            <el-option label="2023年" :value="2023" />
+            <el-option label="2024年" :value="2024" />
+            <el-option label="2025年" :value="2025" />
+            <el-option label="2026年" :value="2026" />
+            <el-option label="2027年" :value="2027" />
+          </el-select>
+        </div>
+
+        <div class="select-search">
+          <span class="search-label">月份:</span>
+          <el-select v-model="conditions.month" filterable placeholder="月份" style="width:120px" clearable>
+            <el-option label="1月" :value="1" />
+            <el-option label="2月" :value="2" />
+            <el-option label="3月" :value="3" />
+            <el-option label="4月" :value="4" />
+            <el-option label="5月" :value="5" />
+            <el-option label="6月" :value="6" />
+            <el-option label="7月" :value="7" />
+            <el-option label="8月" :value="8" />
+            <el-option label="9月" :value="9" />
+            <el-option label="10月" :value="10" />
+            <el-option label="11月" :value="11" />
+            <el-option label="12月" :value="12" />
+          </el-select>
+        </div>
+
+        <div class="right" style="min-width:400px;flex: 1; padding-right: 10px;">
+          <el-input v-model="conditions.keywords" class="search-input m-right-15" size="mini" placeholder="请输入内容">
+            <el-button slot="append" icon="el-icon-search" size="mini" @click="loadData()" />
+          </el-input>
+          <el-button class="filter-item" type="primary" size="mini" icon="el-icon-document" @click="handleExport">导出</el-button>
+        </div>
+      </el-col>
+    </el-row>
+
+    <el-row class="content-body">
+      <record-list ref="RecordList" />
+    </el-row>
+  </div>
+</template>
+
+<script>
+import RecordList from './components/RecordList.vue'
+import { GroupSelector } from '@/components'
+
+export default {
+  name: 'SatisRecordIndex',
+  components: {
+    GroupSelector,
+    RecordList
+  },
+  data() {
+    return {
+      title: '评价记录',
+      conditions: {
+        keywords: '',
+        day: undefined,
+        startDate: undefined,
+        endDate: undefined,
+        groupId: undefined,
+        year: undefined,
+        month: undefined
+      }
+    }
+  },
+  mounted() {
+    this.loadData()
+  },
+  methods: {
+
+    selectItem(iStatus) {
+      this.conditions.status = iStatus
+      this.loadData()
+    },
+
+    // 操作更新
+    actionUpdate() {
+      this.loadData()
+    },
+
+    // 加载视图
+    loadData() {
+      this.$refs['RecordList'].loadData(this.conditions)
+    },
+
+    // 导出
+    handleExport() {
+
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.page-container {
+  margin: 10px 10px 10px 0;
+  height: calc(100vh - 145px);
+  p {
+    margin: 0;
+    line-height: 2em;
+    padding: 0;
+  }
+  .tool-bar {
+    .page-title {
+      margin-top: 10px;
+      margin-left: 10px;
+      font-weight: bold;
+      font-size: 18px;
+      color: #fff;
+    }
+  }
+  .tool-bar .button-group {
+    overflow: unset;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    flex-wrap: wrap;
+
+    .select-search{
+      margin-left: 20px;
+      display: flex;
+      justify-content: flex-start;
+      align-items: center;
+    }
+
+    .search-label {
+      text-align: right;
+      font-size: 12px;
+      font-weight: 400;
+      color: #FFFFFF;
+      line-height: 1;
+      span {
+        font-size: 20px;
+        font-weight: 400;
+        color: #FFFFFF;
+      }
+    }
+  }
+
+  .content-body {
+    padding-top: 0;
+    margin-top: 0;
+    padding-left: 0!important;
+    margin-left: 0!important;
+  }
+}
+
+</style>

+ 6 - 6
src/views/hos/statis/doctor/index.vue

@@ -54,21 +54,21 @@
         <el-table id="print_view" v-loading="listLoading" border :data="dataList">
           <el-table-column type="index" align="center" label="序号" width="80" />
 
-          <el-table-column prop="year" header-align="center" align="center" width="300" label="人员姓名">
+          <el-table-column prop="groupId" header-align="center" align="center" width="300" label="部门">
             <template v-slot="{row}">
-              <span> {{ row.doctorName }} </span>
+              <span> {{ row.groupName }} </span>
             </template>
           </el-table-column>
 
-          <el-table-column prop="score" header-align="center" align="center" label="总评分">
+          <el-table-column prop="year" header-align="center" align="center" width="300" label="医生">
             <template v-slot="{row}">
-              <span> {{ row.score }} </span>
+              <span> {{ row.doctorName }} </span>
             </template>
           </el-table-column>
 
-          <el-table-column prop="score" header-align="center" align="center" label="评价目标数目">
+          <el-table-column prop="score" header-align="center" align="center" label="评分均值">
             <template v-slot="{row}">
-              <span> {{ row.targetQty }} </span>
+              <span> {{ row.score }} </span>
             </template>
           </el-table-column>
 

+ 9 - 3
src/views/hos/statis/grid/index.vue

@@ -41,8 +41,8 @@
       </div>
 
       <div class="right" style="min-width:400px;flex: 1;">
-        <el-input v-model="conditions.keywords" class="search-input m-right-15" placeholder="请输入内容">
-          <el-button slot="append" icon="el-icon-search" @click="getData()" />
+        <el-input v-model="conditions.keywords" class="search-input m-right-15" size="mini" placeholder="请输入内容">
+          <el-button slot="append" icon="el-icon-search" size="mini" @click="getData()" />
         </el-input>
         <el-button class="filter-item" type="primary" icon="el-icon-document" size="mini" @click="handleExport">导出</el-button>
         <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-printer" size="mini" @click="handlePrint">打印</el-button>
@@ -56,7 +56,13 @@
         <el-table id="print_view" v-loading="listLoading" border :data="dataList">
           <el-table-column type="index" align="center" label="序号" width="80" />
 
-          <el-table-column prop="year" header-align="center" align="center" width="300" label="场所">
+          <el-table-column prop="groupId" header-align="center" align="center" width="300" label="部门">
+            <template v-slot="{row}">
+              <span> {{ row.groupName }} </span>
+            </template>
+          </el-table-column>
+
+          <el-table-column prop="year" header-align="center" align="center" width="300" label="科室">
             <template v-slot="{row}">
               <span> {{ row.gridTitle }} </span>
             </template>

+ 1 - 1
src/views/hos/statis/group/index.vue

@@ -56,7 +56,7 @@
             </template>
           </el-table-column>
 
-          <el-table-column prop="score" header-align="center" align="center" label="评分">
+          <el-table-column prop="score" header-align="center" align="center" label="评分均值">
             <template v-slot="{row}">
               <span> {{ row.score }} </span>
             </template>

+ 1 - 1
src/views/hos/statis/year/index.vue

@@ -44,7 +44,7 @@
             </template>
           </el-table-column>
 
-          <el-table-column prop="score" header-align="center" align="center" label="评分">
+          <el-table-column prop="score" header-align="center" align="center" label="评分均值">
             <template v-slot="{row}">
               <span> {{ row.score }} </span>
             </template>

+ 2 - 2
src/views/system/customer/wx/index.vue

@@ -6,8 +6,8 @@
       </el-col>
 
       <el-col :span="12" class="right">
-        <el-input v-model="conditions.keywords" style="width: 200px;" class="filter-item" prefix-icon="el-icon-search" placeholder="请输入内容" @keyup.enter.native="getData" />
-        <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-search" @click="getData">查询</el-button>
+        <el-input v-model="conditions.keywords" style="width: 200px;" class="filter-item" prefix-icon="el-icon-search" size="mini" placeholder="请输入内容" @keyup.enter.native="getData" />
+        <el-button class="filter-item" style="margin-left: 10px;" type="primary" size="mini" icon="el-icon-search" @click="getData">查询</el-button>
       </el-col>
     </el-row>
 

+ 2 - 2
src/views/system/group/user/UserList.vue

@@ -10,7 +10,7 @@
         <el-input v-model="conditions.keywords" class="search-input m-right-15" placeholder="请输入内容">
           <el-button slot="append" icon="el-icon-search" @click="getData()" />
         </el-input>
-        <el-button type="primary" @click="handleAddUser">新增用户</el-button>
+        <el-button type="primary" icon="el-icon-plus" @click="handleAddUser">新增</el-button>
       </el-col>
     </el-row>
 
@@ -75,7 +75,7 @@
           </template>
         </el-table-column>
 
-        <el-table-column label="操作" header-align="center" align="center" width="210">
+        <el-table-column label="操作" header-align="center" align="center" width="240">
           <template v-slot="{row}">
             <el-button size="mini" @click="handleEditUser(row)">修改</el-button>
             <el-button v-if="row.isFixed !== 1" size="mini" type="danger" @click="handleDeleteUser(row)">删除</el-button>