From 07a41ade45c962e93a9d449ce1be0eec52e66a6a Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期三, 19 三月 2025 10:44:32 +0800
Subject: [PATCH] 内部单不能修改报告

---
 src/components/view/b3-classes.vue |  310 +++++++++++++++++++++++++++++++++-----------------
 1 files changed, 203 insertions(+), 107 deletions(-)

diff --git a/src/components/view/b3-classes.vue b/src/components/view/b3-classes.vue
index 12b8b15..f20bb20 100644
--- a/src/components/view/b3-classes.vue
+++ b/src/components/view/b3-classes.vue
@@ -29,14 +29,14 @@
           </el-option>
         </el-select>
         <el-input v-model="query.userName" placeholder="璇疯緭鍏ヤ汉鍛樺悕绉�" size="small" style="width: 140px;margin: 0 16px;" clearable @keyup.enter.native="refreshTable()"></el-input>
-        <el-select v-model="query.laboratory" placeholder="璇烽�夋嫨瀹為獙瀹�" style="width: 140px;" size="small" clearable @change="refreshTable()">
+        <!-- <el-select v-model="query.laboratory" placeholder="璇烽�夋嫨瀹為獙瀹�" style="width: 140px;" size="small" clearable @change="refreshTable()">
           <el-option
             v-for="item in laboratory"
             :key="item.value"
             :label="item.label"
             :value="item.value">
           </el-option>
-        </el-select>
+        </el-select> -->
       </div>
     </div>
     <div class="search_thing" style="padding-left: 30px;">
@@ -44,13 +44,13 @@
       <el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button>
     </div>
     <div class="search_thing btns" style="padding-left: 30px;">
-      <el-button size="small" type="primary" v-if="downPower" @click="configTime" :loading="downLoading">鏃堕棿閰嶇疆</el-button>
+      <el-button size="small" type="primary" v-if="listPower" @click="configTime" :loading="downLoading">鏃堕棿閰嶇疆</el-button>
       <el-button size="small" type="primary" v-if="downPower" @click="handleDown" :loading="downLoading">瀵� 鍑�</el-button>
       <el-button size="small" type="primary" @click="schedulingVisible = true" v-if="addPower">鎺� 鐝�</el-button>
     </div>
   </div>
   <div class="center" v-loading="pageLoading">
-    <scroll-pagination @load="init" :finishLoding="finishLoding" v-show="query.month&&list.length>0" style="height: 100%;" :key="'123'" :list="list">
+    <!-- <scroll-pagination @load="init" :finishLoding="finishLoding" v-show="query.month&&list.length>0" style="height: 100%;" :key="'123'" :list="list">
       <div class="clearfix">
         <div class="fixed-left">
           <div class="content-title" style="padding-left: 16px;box-sizing: border-box;">
@@ -97,10 +97,101 @@
           </div>
         </div>
       </div>
-    </scroll-pagination>
-    <scroll-pagination @load="initYear" :finishLoding="finishLoding" v-show="!query.month&&yearList.length>0" style="width: 100%;" :key="'111'" :list="yearList">
-      <div class="clearfix year-table">
+    </scroll-pagination> -->
+    <div class="clearfix" style="width: 100%;" v-show="query.month">
       <div class="fixed-left">
+        <div class="content-title" style="padding-left: 16px;box-sizing: border-box;">
+          浜哄憳鍚嶇О
+        </div>
+        <div class="content-user" :class="{hoverType:currentUserIndex==index}" v-for="(item,index) in list" :key="'e'+index" v-on:mouseenter="onMouseEnter(index)"
+        v-on:mouseleave="currentUserIndex=null">
+          <div class="user-pic">{{ item.name.charAt(0) }}</div>
+          <div class="user-info">
+            <p style="font-size: 14px;color: #3A7BFA;line-height: 24px;">{{ item.name }}</p>
+            <p style="color: #999999;font-size: 12px;transform: scale(0.8) translateX(-20px);white-space: nowrap;width: 150px;overflow-x: show;">鏃�:{{ item.day0 }},涓�:{{ item.day1 }},澶�:{{ item.day2 }},浼�:{{ item.day3 }},鍋�:{{ item.day4 }},宸�:{{ item.day6 }}</p>
+            <p style="margin-top: 4px;"><span style="color: #999999;font-size: 12px;display: inline-block;transform: scale(0.8) translateX(-10px);">鍚堣鍑哄嫟: </span><span style="font-size: 16px;
+  color: #FF4902;">{{ query.month?item.monthlyAttendance
+.totalAttendance:item.sidebarAnnualAttendance
+.totalAttendance }}澶�</span></p>
+          </div>
+        </div>
+      </div>
+      <div class="scroll-right">
+        <div class="content">
+          <div class="content-title content-title-right" style="border-bottom: 0;">
+            <div class="content-title-item" v-for="(item,index) in weeks" :key="'b'+index">
+              <span class="month" style="position: absolute;top: 4px;" v-if="item.week=='鍛ㄦ棩'">{{ item.weekNum }}鍛�</span>
+              <p style="height: 26px;position: absolute;bottom: 12px;">
+                <span class="day">{{ item.day }}</span>
+                <span class="week">{{ item.week.charAt(1) }}</span>
+              </p>
+            </div>
+          </div>
+          <div class="content-body" v-for="(item,index) in list" :key="'c'+index"
+          v-on:mouseenter="onMouseEnter(index)"
+        v-on:mouseleave="currentUserIndex=null">
+            <div class="content-body-item" v-for="(m,i) in item.list" :key="'d'+i" :class="{hoverType:currentUserIndex==index}">
+              <el-dropdown trigger="click" placement="bottom" @command="e=>handleCommand(e,m)" :disabled="!upPower" style="width: 100%;height: 100%;cursor: pointer;">
+                  <div class="work-box" :class="{type0:m.shift==='0',type1:m.shift==='1',type2:m.shift==='2',type3:m.shift==='3',type4:m.shift==='4',type5:m.shift==='5',type6:m.shift==='6'}">
+                  <span style="cursor: pointer;" :style="`opacity: ${getShiftByDic(m.shift)=='鏃�'?0:1};`">{{ getShiftByDic(m.shift) }}</span>
+                </div>
+                  <el-dropdown-menu slot="dropdown">
+                    <el-dropdown-item v-for="(n,j) in classType" :key="'h'+j" :command="n.value">{{ n.label }}</el-dropdown-item>
+                  </el-dropdown-menu>
+                </el-dropdown>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="clearfix year-table" style="width: 100%;" v-show="!query.month">
+      <div class="fixed-left">
+      <div class="content-title" style="padding-left: 16px;box-sizing: border-box;">
+          浜哄憳鍚嶇О
+      </div>
+      <div class="content-user" :class="{hoverType:currentUserIndex==index}" v-for="(item,index) in yearList" :key="'e'+index" v-on:mouseenter="onMouseEnter(index)"
+        v-on:mouseleave="currentUserIndex=null">
+          <div class="user-pic">{{ item.name.charAt(0) }}</div>
+          <div class="user-info">
+            <p style="font-size: 14px;color: #3A7BFA;line-height: 24px;">{{ item.name }}</p>
+            <p style="color: #999999;font-size: 12px;transform: scale(0.8) translateX(-20px);white-space: nowrap;width: 150px;overflow-x: show;">鏃�:{{ item.day0 }},涓�:{{ item.day1 }},澶�:{{ item.day2 }},浼�:{{ item.day3 }},鍋�:{{ item.day4 }},宸�:{{ item.day6 }}</p>
+            <p style="margin-top: 4px;"><span style="color: #999999;font-size: 12px;display: inline-block;transform: scale(0.8) translateX(-10px);">鍚堣鍑哄嫟: </span><span style="font-size: 16px;
+  color: #FF4902;">{{ item.work_time }}澶�</span></p>
+          </div>
+        </div>
+      </div>
+      <div class="scroll-right">
+          <div class="content">
+            <div>
+              <div class="content-title content-title-right" style="border-bottom: 0;height: 52px;" :style="`display: grid;
+              grid-template-columns: repeat(${monthList.length}, 1fr);`">
+                <div class="content-title-item" v-for="(item,index) in monthList" :key="'b'+index" style="height: 52px;">
+                  <span class="month">{{ item }}鏈�</span>
+              </div>
+            </div>
+            <div
+            class="content-body"
+            v-for="(item,index) in yearList"
+            :key="'c'+index"
+            v-on:mouseenter="onMouseEnter(index)"
+            v-on:mouseleave="currentUserIndex=null"
+            :style="`display: grid;
+            grid-template-columns: repeat(${monthList.length}, 1fr);`"
+            >
+              <div class="content-body-item" v-for="(m,i) in item.monthList" :key="'d'+i" :class="{hoverType:currentUserIndex==index}">
+                <p style="color:rgb(153, 153, 153);font-size: 12px;">鍚堣鍑哄嫟锛�<span style="font-size: 14px;color:#000">{{ m.totalMonthAttendance }}</span></p>
+                <p style="color:rgb(153, 153, 153);font-size: 12px;">
+                  鏃�:{{ m.day0 }},涓�:{{ m.day1 }},澶�:{{ m.day2 }},浼�:{{ m.day3 }},鍋�:{{ m.day4 }},宸�:{{ m.day6 }}
+                </p>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!-- <scroll-pagination @load="initYear" :finishLoding="finishLoding" v-show="!query.month&&yearList.length>0" style="width: 100%;" :key="'111'" :list="yearList">
+      <div class="clearfix year-table">
+        <div class="fixed-left">
         <div class="content-title" style="padding-left: 16px;box-sizing: border-box;">
             浜哄憳鍚嶇О
         </div>
@@ -144,27 +235,26 @@
         </div>
       </div>
     </div>
-    </scroll-pagination>
-    <span style="color:#909399;font-size:14px;position: absolute;left:50%;top: 50%;transform: translate(-59%,-50%);" v-if="(query.month&&list.length==0)||(!query.month&&yearList.length==0)">鏆傛棤鏁版嵁</span>
+    </scroll-pagination> -->
+    <!-- <span style="color:#909399;font-size:14px;position: absolute;left:50%;top: 50%;transform: translate(-59%,-50%);" v-if="(query.month&&list.length==0)||(!query.month&&yearList.length==0)">鏆傛棤鏁版嵁</span> -->
   </div>
+<el-pagination
+  background
+  @current-change="currentChange"
+  :page-size="pageSize" :current-page="currentPage"
+  layout="total, prev, pager, next, jumper"
+  :total="total" style="margin-top: 10px;text-align: right;margin-right: 30px;">
+</el-pagination>
+
   <el-dialog title="鏃堕棿閰嶇疆" :visible.sync="configTimeVisible" width="620px">
-    <div v-loading="configTimeVisibleLoading" ></div>
-    <div v-if="!configTimeVisibleLoading">
+    <div v-loading="configTimeVisibleLoading" style="min-height: 200px;">
       <div v-for="(item, index) in timeQuery">
-        <div class="form_title">
-          <span>{{`鐝${transFromNumber(index + 1)}`}}</span>
-          <span style="margin-right: 10px">
-          <i class="el-icon-circle-check" v-if="item.isEdit" style="margin-left: 10px; color: #4b79f2" @click="saveEdit(item, index)"></i>
-          <i class="el-icon-edit" v-if="!item.isEdit" style="margin-left: 10px; color: #4b79f2" @click="item.isEdit = true"></i>
-          <i class="el-icon-delete" v-if="!item.isEdit && timeQuery.length > 1" style="margin-left: 10px; color: #FF4902" @click="deleteTime(item, index)"></i>
-        </span>
-        </div>
-        <div class="form">
-          <div style="margin-bottom: 12px">
+        <div class="form" style="display: flex;justify-content: space-between">
+          <div style="margin-bottom: 12px;width: 200px;">
             <span class="form_label">鐝锛�</span>
             <span v-if="!item.isEdit"> {{item.type}} </span>
             <span class="form_input" v-if="item.isEdit">
-            <el-select v-model="item.shift" placeholder="璇烽�夋嫨" style="width: 70%;" clearable size="small">
+            <el-select v-model="item.shift" placeholder="璇烽�夋嫨" style="width: 70%;margin-right: 8px;" clearable size="small">
               <el-option v-for="obj in timeTypeList"
                          :key="obj.value"
                          :label="obj.label"
@@ -173,12 +263,12 @@
             </el-select>
           </span>
           </div>
-          <div>
+          <div style="width: calc(100% - 260px);">
             <span class="form_label">鏃堕棿锛�</span>
-            <span v-if="!item.isEdit"> {{item.time === null ? '' : item.time[0] + '~' + item.time[1]}} </span>
+            <span v-if="!item.isEdit"> {{item.startTime&&item.endTime ? item.startTime + '~' + item.endTime:''}} </span>
             <span class="form_input" v-if="item.isEdit">
-            <el-time-picker
-              style="width: 70%;"
+            <!-- <el-time-picker
+              style="width: 200px;"
               is-range
               size="small"
               v-model="item.time"
@@ -188,12 +278,38 @@
               start-placeholder="寮�濮嬫椂闂�"
               end-placeholder="缁撴潫鏃堕棿"
               placeholder="閫夋嫨鏃堕棿鑼冨洿">
-            </el-time-picker>
+            </el-time-picker> -->
+            <el-time-select
+              placeholder="璧峰鏃堕棿"
+              v-model="item.startTime"
+              size="small"
+              :picker-options="{
+                start: '00:00',
+                step: '00:15',
+                end: '24:00'
+              }" style="width: 120px;">
+            </el-time-select>
+            <el-time-select
+              style="width: 120px;"
+              placeholder="缁撴潫鏃堕棿"
+              v-model="item.endTime"
+              size="small"
+              :picker-options="{
+                start: '00:00',
+                step: '00:15',
+                end: '24:00'
+              }">
+            </el-time-select>
           </span>
           </div>
-          <el-divider></el-divider>
+          <span>
+            <i class="el-icon-circle-check" v-if="item.isEdit" style="margin-left: 10px; color: #4b79f2;cursor: pointer;" @click="saveEdit(item, index)"></i>
+            <i class="el-icon-edit" v-if="!item.isEdit" style="margin-left: 10px; color: #4b79f2;cursor: pointer;" @click="item.isEdit = true"></i>
+            <i class="el-icon-delete" v-if=" timeQuery.length > 1" style="margin-left: 10px; color: #FF4902;cursor: pointer;" @click="deleteTime(item, index)"></i>
+          </span>
         </div>
-        <div @click="addTimeForm" style="color: #4b79f2" v-if="index === timeQuery.length - 1">娣诲姞鏃堕棿閰嶇疆</div>
+        <el-divider></el-divider>
+        <div @click="addTimeForm" style="color: #4b79f2;cursor: pointer;" v-if="index === timeQuery.length - 1">娣诲姞鏃堕棿閰嶇疆</div>
       </div>
       <div @click="addTimeForm" style="color: #4b79f2" v-if="timeQuery.length === 0">娣诲姞鏃堕棿閰嶇疆</div>
     </div>
@@ -329,18 +445,18 @@
       },
       list:[],
       currentPage: 1, // 褰撳墠椤�
-      pageSize: 10, // 涓�椤�10鏉�
-      total: '',
+      pageSize: 6, // 涓�椤�10鏉�
+      total: 0,
       pageLoading: false, // 缁勪欢loading鐨勫睍绀�,榛樿涓簍rue
       finishLoding: false, // 鍔犺浇瀹屾垚锛屾樉绀哄凡缁忔病鏈夋洿澶氫簡
       monthList:[],
       yearList:[],
       downLoading:false,
-      keyMap:{},
       configTimeVisible: false, // 鏃堕棿閰嶇疆寮规
       configTimeVisibleLoading: false, // 鏃堕棿閰嶇疆寮规loading
       timeTypeList: [],
       timeQuery: [],
+      listPower:false,
     }
   },
   watch: {
@@ -379,14 +495,12 @@
       this.monthList.push(i)
     }
     this.monthList.reverse()
-    // this.getPower()
+    this.getPower()
   },
   methods: {
     refresh(){
       this.list = [];
       this.yearList = []
-      this.keyMap = {};
-      this.finishLoding = false;
       this.currentPage = 1
       this.query = {
         userName:'',
@@ -401,14 +515,20 @@
       }
     },
     refreshTable(){
-      this.keyMap = {};
       this.currentPage = 1
-      this.finishLoding = false;
       if(this.query.month){
         this.list = [];
         this.init()
       }else{
         this.yearList = []
+        this.initYear()
+      }
+    },
+    currentChange(num){
+      this.currentPage = num
+      if(this.query.month){
+        this.init()
+      }else{
         this.initYear()
       }
     },
@@ -430,17 +550,7 @@
       return overWan ? getWan(overWan) + "涓�" + getWan(noWan) : getWan(num)
     },
     init(){
-      const key = `_${this.currentPage}`
-      const value = this.keyMap[key]
-      // 濡傛灉value瀛樺湪锛岃〃绀虹紦瀛樻湁鍊硷紝閭d箞闃绘璇锋眰
-      if(value) {
-        return
-      }
-      // value涓嶅瓨鍦紝琛ㄧず绗竴娆¤姹�,璁剧疆鍗犱綅
-      this.keyMap[key] = 'temp'
-      if(this.currentPage==1){
-        this.pageLoading = true
-      }
+      this.pageLoading = true
       let year = this.query.year.getFullYear()
       let month0 = this.query.month?this.query.month:new Date().getMonth()+1
       let month = month0>9?month0:'0'+month0
@@ -453,8 +563,8 @@
         }).then(res => {
           this.pageLoading = false
           if (res.code == 201) return
-          this.total = res.data.total
-          let list = res.data.page.records.map(item=>{
+          this.total = res.data.page.total
+          this.list = res.data.page.records.map(item=>{
             for (let key in item.monthlyAttendance) {
               let type = this.getDayByDic(key)
               if(type!=undefined||type!=null){
@@ -473,33 +583,10 @@
             }
             this.weeks.push(obj)
           })
-          if(list.length==0){
-            this.finishLoding = true;
-          }else{
-            if(list.length<this.pageSize){
-              this.finishLoding = true;
-            }
-            this.list = this.list.concat(list)
-            if(this.total==this.list.length){
-              this.finishLoding = true;
-            }
-            this.currentPage++;
-          }
         })
     },
     initYear(){
-      const key = `_${this.currentPage}`
-      const value = this.keyMap[key]
-      // 濡傛灉value瀛樺湪锛岃〃绀虹紦瀛樻湁鍊硷紝閭d箞闃绘璇锋眰
-      if(value) {
-        return
-      }
-      // value涓嶅瓨鍦紝琛ㄧず绗竴娆¤姹�,璁剧疆鍗犱綅
-      this.keyMap[key] = 'temp'
-      // pageYear
-      if(this.currentPage==1){
-        this.pageLoading = true
-      }
+      this.pageLoading = true
       let year = this.query.year.getFullYear()
       this.$axios.post(this.$api.performanceShift.pageYear, {
         size:this.pageSize,
@@ -511,7 +598,7 @@
           this.pageLoading = false
           if (res.code == 201) return
           this.total = res.data.total
-          let list = res.data.records.map(item=>{
+          this.yearList = res.data.records.map(item=>{
             for (let key in item.year) {
               let type = this.getDayByDic(key)
               if(type!=undefined||type!=null){
@@ -532,18 +619,18 @@
             }
             return item
           });
-          if(list.length==0){
-            this.finishLoding = true;
-          }else{
-            if(list.length<this.pageSize){
-              this.finishLoding = true;
-            }
-            this.yearList = this.yearList.concat(list)
-            if(this.total==this.yearList.length){
-              this.finishLoding = true;
-            }
-            this.currentPage++;
-          }
+          // if(list.length==0){
+          //   this.finishLoding = true;
+          // }else{
+          //   if(list.length<this.pageSize){
+          //     this.finishLoding = true;
+          //   }
+          //   this.yearList = this.yearList.concat(list)
+          //   if(this.total==this.yearList.length){
+          //     this.finishLoding = true;
+          //   }
+          //   this.currentPage++;
+          // }
         })
     },
     getPower() {
@@ -551,20 +638,25 @@
       let add = false
       let up = false
       let down = false
+      let listPower = false
       for (var i = 0; i < power.length; i++) {
-        if (power[i].menuMethod == 'update') {
+        if (power[i].menuMethod == 'performanceShiftUpdate') {
           up = true
         }
         if (power[i].menuMethod == 'delDeviceParameter') {
           down = true
         }
-        if (power[i].menuMethod == 'add') {
+        if (power[i].menuMethod == 'performanceShiftAdd') {
           add = true
+        }
+        if (power[i].menuMethod == 'shiftTimeList') {
+          listPower = true
         }
       }
       this.addPower = add
       this.upPower = up
       this.downPower = down
+      this.listPower = listPower
     },
     onMouseEnter(index){
       this.currentUserIndex = index
@@ -620,11 +712,13 @@
     getTimeList () {
       this.configTimeVisibleLoading = true
       this.$axios.post(this.$api.performanceShift.getList).then(res => {
-        if (res.code === 200) {
+        if (res.code == 201) return
+        if (res.data.length > 0) {
           res.data.forEach(item => {
             item.isEdit = false
-            item.time.push(item.startTime)
-            item.time.push(item.endTime)
+            // item.time = []
+            // item.time.push(item.startTime)
+            // item.time.push(item.endTime)
             const index = this.timeTypeList.findIndex(val => val.value === item.shift)
             if (index > -1) {
               item.type = this.timeTypeList[index].label
@@ -653,6 +747,8 @@
           item.type = this.timeTypeList[index].label
         }
       }
+      delete item.orderBy
+      delete item.time
       const isEmpty = this.isObjectEmpty(item)
       if (isEmpty) {
         this.$message.error('璇峰~鍐欏畬鏁�')
@@ -661,8 +757,8 @@
       let newObj = {}
       let url = ''
       newObj.shift = item.shift
-      newObj.startTime = item.time[0]
-      newObj.endTime = item.time[1]
+      newObj.startTime = item.startTime
+      newObj.endTime = item.endTime
       url = this.$api.performanceShift.shiftAdd
       if (item.id) {
         // 鏈塱d涓轰慨鏀�
@@ -676,21 +772,21 @@
       }).then(res => {
         if (res.code == 201) return
         this.$message.success('鎿嶄綔鎴愬姛')
+        this.getTimeList()
       })
-      this.getTimeList()
     },
     deleteTime (item, index) {
-      this.$axios.post(this.$api.performanceShift.shiftRemove, {
-        id: item.id
-      },{
-        headers: {
-          'Content-Type': 'application/json'
-        }
-      }).then(res => {
-        if (res.code == 201) return
-        this.$message.success('鎿嶄綔鎴愬姛')
-      })
-      this.getTimeList()
+      if(item.id){
+          this.$axios.post(this.$api.performanceShift.shiftRemove, {
+          id: item.id
+        }).then(res => {
+          if (res.code == 201) return
+          this.$message.success('鎿嶄綔鎴愬姛')
+          this.getTimeList()
+        })
+      }else{
+        this.timeQuery.splice(index, 1)
+      }
     },
     isObjectEmpty(obj) {
       return Object.keys(obj).some(key => !obj[key]);
@@ -878,7 +974,7 @@
 }
 .center {
   width: 100%;
-  height: calc(100% - 50px );
+  height: calc(100% - 100px );
   background-color: #fff;
   overflow-y: auto;
   display: flex;

--
Gitblit v1.9.3