347617796@qq.com 2 tahun lalu
induk
melakukan
5db5d46449
59 mengubah file dengan 5670 tambahan dan 368 penghapusan
  1. 2 2
      .env.production
  2. 18 0
      package-lock.json
  3. 2 0
      package.json
  4. 2 1
      public/index.html
  5. 19 3
      src/api/auth.js
  6. 5 5
      src/api/websocket.js
  7. 3 0
      src/assets/css/reset.css
  8. TEMPAT SAMPAH
      src/assets/image/1.png
  9. TEMPAT SAMPAH
      src/assets/image/2.png
  10. TEMPAT SAMPAH
      src/assets/image/3.png
  11. TEMPAT SAMPAH
      src/assets/image/321.jpg
  12. TEMPAT SAMPAH
      src/assets/image/qp.png
  13. TEMPAT SAMPAH
      src/assets/image/quit.png
  14. TEMPAT SAMPAH
      src/assets/image/shuju.jpg
  15. 97 0
      src/components/Review.vue
  16. 85 0
      src/components/ScaleBox.vue
  17. 11 1
      src/components/applicationIntegrationPopup.vue
  18. 12 1
      src/components/bonusPointsPopup.vue
  19. 8 3
      src/components/examinePopup.vue
  20. 0 1
      src/hint.vue
  21. 3 4
      src/home.vue
  22. 5 13
      src/index.vue
  23. 9 0
      src/init.vue
  24. 2 1
      src/main.js
  25. 57 6
      src/router/index.js
  26. 1062 0
      src/screen.vue
  27. 235 22
      src/views/abPoint/apply_list.vue
  28. 58 17
      src/views/abPoint/award_punish.vue
  29. 4 3
      src/views/common/rewardTask.vue
  30. 4 1
      src/views/common/rewardTaskAmend.vue
  31. 3 3
      src/views/common/taskDetailsPopup.vue
  32. 14 3
      src/views/common/temporaryTask.vue
  33. 9 2
      src/views/common/temporaryTaskAmend.vue
  34. 570 0
      src/views/ranking/JfDetail.vue
  35. 2 1
      src/views/ranking/attendance_rating.vue
  36. 8 12
      src/views/ranking/balanceA.vue
  37. 44 11
      src/views/ranking/custom_rank.vue
  38. 106 9
      src/views/ranking/dept_rank.vue
  39. 52 57
      src/views/ranking/individual_statistics.vue
  40. 126 109
      src/views/ranking/integral_event.vue
  41. 900 0
      src/views/ranking/integral_event_two.vue
  42. 2 1
      src/views/ranking/log_rank.vue
  43. 2 2
      src/views/ranking/lotteryTicket_statistics.vue
  44. 18 3
      src/views/ranking/manager_statistics.vue
  45. 2 1
      src/views/ranking/task_rank.vue
  46. 15 2
      src/views/ranking/total_rank.vue
  47. 0 2
      src/views/set/buy.vue
  48. 1 1
      src/views/set/framework.vue
  49. 1 1
      src/views/set/log.vue
  50. 1076 0
      src/views/set/screenSet.vue
  51. 48 3
      src/views/set/systemLayout.vue
  52. 16 38
      src/views/set/voluntarilyPoint.vue
  53. 3 0
      src/views/task/allTask.vue
  54. 3 13
      src/views/task/myExamine.vue
  55. 2 7
      src/views/welfare/conversion.vue
  56. 0 1
      src/views/welfare/flManagement.vue
  57. 4 1
      src/views/workbench/alreadySp.vue
  58. 0 1
      src/views/workbench/approval_batch.vue
  59. 940 0
      src/views/workbench/review.vue

+ 2 - 2
.env.production

@@ -1,6 +1,6 @@
 NODE_ENV="production"
-VUE_APP_BASE_API="https://ding.insys.g107.com/"
+VUE_APP_BASE_API="https://app55493.eapps.dingtalkcloud.com/"
 VUE_APP_APPID="55493"
-VUE_APP_WEBSCOKET="ding.insys.g107.com"
+VUE_APP_WEBSCOKET="app55493.eapps.dingtalkcloud.com"
 
 

+ 18 - 0
package-lock.json

@@ -4063,6 +4063,11 @@
       "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz",
       "integrity": "sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg=="
     },
+    "comutils": {
+      "version": "1.1.19",
+      "resolved": "https://registry.npmjs.org/comutils/-/comutils-1.1.19.tgz",
+      "integrity": "sha512-JxXB67juILiwhdLwOsYyjUqwWEhHdObI0EClOPk+JDtEuTbac59s0pxGpfCBnNNQ5JommifmcMGneW/4Cg7YWw=="
+    },
     "concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz",
@@ -14342,6 +14347,11 @@
       "resolved": "https://registry.nlark.com/vue/download/vue-2.6.12.tgz",
       "integrity": "sha1-9evU+mvShpQD4pqJau1JBEVskSM="
     },
+    "vue-count-to": {
+      "version": "1.0.13",
+      "resolved": "https://registry.npmjs.org/vue-count-to/-/vue-count-to-1.0.13.tgz",
+      "integrity": "sha512-6R4OVBVNtQTlcbXu6SJ8ENR35M2/CdWt3Jmv57jOUM+1ojiFmjVGvZPH8DfHpMDSA+ITs+EW5V6qthADxeyYOQ=="
+    },
     "vue-eslint-parser": {
       "version": "7.6.0",
       "resolved": "https://registry.nlark.com/vue-eslint-parser/download/vue-eslint-parser-7.6.0.tgz",
@@ -14415,6 +14425,14 @@
       "resolved": "https://registry.nlark.com/vue-router/download/vue-router-3.5.1.tgz?cache=0&sync_timestamp=1620899536020&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-router%2Fdownload%2Fvue-router-3.5.1.tgz",
       "integrity": "sha1-7fPPSQeVLR4Fg+B5I3Igxf9utsk="
     },
+    "vue-seamless-scroll": {
+      "version": "1.1.23",
+      "resolved": "https://registry.npmjs.org/vue-seamless-scroll/-/vue-seamless-scroll-1.1.23.tgz",
+      "integrity": "sha512-HBjUub8WwsKJzbFCrwKPDrZn4e+SSbkKgwWtjKtfLwesiFGwSsVxP44/Z6d3kpXy94qIFOiflJH6l0/9pj7SGA==",
+      "requires": {
+        "comutils": "^1.1.9"
+      }
+    },
     "vue-style-loader": {
       "version": "4.1.3",
       "resolved": "https://registry.nlark.com/vue-style-loader/download/vue-style-loader-4.1.3.tgz",

+ 2 - 0
package.json

@@ -26,7 +26,9 @@
     "qrcodejs2": "0.0.2",
     "vconsole": "^3.3.4",
     "vue": "^2.6.11",
+    "vue-count-to": "^1.0.13",
     "vue-router": "^3.2.0",
+    "vue-seamless-scroll": "^1.1.23",
     "vue-virtual-scroll-list": "^2.3.2",
     "vuex": "^3.4.0",
     "vuex-persistedstate": "^4.0.0"

+ 2 - 1
public/index.html

@@ -3,7 +3,8 @@
   <head>
     <meta charset="utf-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <!-- <meta name="viewport" content="width=device-width,initial-scale=1.0"> -->
+	  <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no,viewport-fit=cover">
     <link rel="icon" href="<%= BASE_URL %>favicon.ico">
 <!-- 	<link rel="Bookmark" type="image/x-icon" href="b/img/icon/favicon.ico" />
 	<link rel="icon" type="image/x-icon" href="b/img/icon/favicon.ico" />

+ 19 - 3
src/api/auth.js

@@ -16,7 +16,7 @@ export function generateUUID() {
 // 获取缓存
 export function getCache(key) {
 	return JSON.parse(localStorage.getItem(key))
-}
+}	
 // 设置缓存
 export function setCache(key, data) {
 	localStorage.setItem(key, JSON.stringify(data))
@@ -59,13 +59,13 @@ export function setUserData(data) {
 // 获取积分类型
 export function getTyps(id) {
 	if (id) {
-		var arr = JSON.parse(localStorage.getItem(TypesKey));
+		var arr = JSON.parse(localStorage.getItem(TypesKey))||[{id: 2, name: "A分", code: "AF"},{id: 3, name: "B分", code: "BF"}];
 		var item = arr.filter(element => {
 			return typeof(id) == 'string' ? element.code == id : element.id == id
 		});
 		return item[0]
 	} else {
-		return JSON.parse(localStorage.getItem(TypesKey));
+		return JSON.parse(localStorage.getItem(TypesKey))||[{id: 2, name: "A分", code: "AF"},{id: 3, name: "B分", code: "BF"}];
 	}
 }
 // 获取积分类型名称
@@ -148,4 +148,20 @@ export function _throttle(fn, interval = 500) {
 			fn.apply(th, args);
 		}
 	}
+}
+  //将部门链接在一起
+export function returnDeptName(arr){
+    let data=arr.map(item=>{
+        let str='';
+        item.dept_list.forEach((e,index)=>{
+            if(item.dept_list.length-index>1){
+               str+=e.dept_name+','
+            }else{
+               str+=e.dept_name
+            } 
+        })
+        item.deptName=str
+        return item
+      })
+    return data
 }

+ 5 - 5
src/api/websocket.js

@@ -1,6 +1,6 @@
 
 let wsurl='wss://' + process.env.VUE_APP_WEBSCOKET + '/ws/';
-// let wsurl='wss://ding.insys.g107.com/ws/';
+// let wsurl='ws://rodyking.vicp.io:12358';
 let ws = null
 let weboscket_callback = null
 import {getToken,generateUUID } from '@/api/auth';
@@ -35,10 +35,10 @@ let websocketonerror = () => {
 // 断开链接后报错
 let websocketclose = e => {
 	if(!e.wasClean){//当网络中断时处理
-		Message({
-			message: '网络连接失败,请稍后再试',
-			type: 'error',
-		})
+		// Message({
+		// 	message: '网络连接失败,请稍后再试',
+		// 	type: 'error',
+		// })
 		weboscket_callback({type:'break',msg:'网络连接失败,请稍后再试'})
 		closewebsocket();
 	}

+ 3 - 0
src/assets/css/reset.css

@@ -6,6 +6,9 @@ body, button, input, select, textarea {
 	-webkit-font-smoothing: antialiased;
 	-webkit-tap-highlight-color: transparent;
 }
+ html,body{
+	  height: 100%;
+ }
 h1, h2, h3, h4, h5, h6{ font-size:100%; }
 address, cite, dfn, em, var { font-style:normal; }
 code, kbd, pre, samp { font-family:couriernew, courier, monospace; }

TEMPAT SAMPAH
src/assets/image/1.png


TEMPAT SAMPAH
src/assets/image/2.png


TEMPAT SAMPAH
src/assets/image/3.png


TEMPAT SAMPAH
src/assets/image/321.jpg


TEMPAT SAMPAH
src/assets/image/qp.png


TEMPAT SAMPAH
src/assets/image/quit.png


TEMPAT SAMPAH
src/assets/image/shuju.jpg


+ 97 - 0
src/components/Review.vue

@@ -0,0 +1,97 @@
+<template>
+  <div>
+    <p class="row_title">
+      复核
+      <span class="row_tips fontColorB">由管理员复核确认</span>
+    </p>
+    <div class="examine_steps">
+      <el-steps direction="vertical" :space="50">
+        <el-step v-for="(item, index) in process" :key="index" style="margin-bottom: 5px;">
+          <template slot="icon">
+            <userImage width="36px" height="36px" :id="item.employee_id"  :img_url="item.img_url" :user_name="item.employee_name"></userImage>
+          </template>
+          <template slot="title">
+            <div>
+              <div class="flex-box-ce" style="color: #303133;font-size:14px;margin-top:-2px;">
+                <div class="flex-1">
+                  {{ item.employee_name }}
+                  <span style="margin: 0 5px;">
+                    <span v-if="status==1" style="color:#67C23A;font-size:13px">复核通过</span>
+                    <span v-else-if="status==2" style="color:#F56C6C;font-size:13px">复核不通过</span>
+                    <span v-else>{{ item.remark }}</span>
+                  </span>
+                  <strong style="font-weight: 500;">
+                    <span class="red point" v-show="item.review_point > 0">+{{ item.review_point }}</span>
+                    <span class="green point" v-show="item.review_point < 0">{{ item.review_point }}</span>
+                  </strong>
+                </div>
+                <span class="fontColorF" style="font-size:12px;">{{$moment(returnTime(item.time)).format('YYYY-MM-DD HH:mm:ss')}}</span>
+              </div>
+            </div>
+          </template>
+          <template slot="description" style="">
+			<div class="yellow" >{{item.action_des}}</div>
+            <div class="fontColorB" style="margin: 5px 0;">{{ item.comment }}</div>
+          </template>
+        </el-step>
+      </el-steps>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'Review',
+  props: {
+    process: {
+      type: Array,
+      default: () => {
+        return [];
+      }
+    },
+	status:{
+		type:Number,
+		default:0
+	}
+  },
+  data() {
+    return {};
+  },
+  created() {
+  	// console.log(this.$moment(1655197583000).format('YYYY-MM-DD HH:mm:ss'))
+  },
+  methods: {
+	  returnTime(tim){
+		  return Number(tim+'000');
+	  }
+  }
+};
+</script>
+
+<style scoped="scoped" lang="scss">
+.row_title {
+  position: relative;
+  margin: 0 0 20px 0;
+  padding-top: 12px;
+  font-size: 16px;
+  color: #303133;
+  line-height: 22px;
+}
+.row_title:before {
+  position: absolute;
+  top: 0;
+  content: ' ';
+  width: 100%;
+  border-top: 1px #f8f8f8 solid;
+}
+.el-row {
+  margin-bottom: 10px;
+  font-size: 14px;
+  .el-col-4 {
+    color: #606266;
+  }
+}
+.row_tips{
+	font-size: 12px;
+}
+</style>

+ 85 - 0
src/components/ScaleBox.vue

@@ -0,0 +1,85 @@
+<template>
+  <div
+    class="ScaleBox"
+    ref="ScaleBox"
+    :style="{
+      width: width + 'px',
+      height: height + 'px',
+    }"
+  >
+    <slot></slot>
+  </div>
+</template>
+<script>
+export default {
+  name: "ScaleBox",
+  props: {
+   
+  },
+  data() {
+    return {
+      scale: "",
+      width:1920,
+      height:937
+    };
+  },
+  mounted() {
+    this.setScale();
+    window.addEventListener("resize", this.debounce(this.setScale, 100));
+  },
+  methods: {
+    getScale() {
+      let { width, height } = this;
+      let wh = window.innerHeight / height;
+      let ww = window.innerWidth / width;
+      // console.log(ww < wh ? ww : wh);
+      return ww < wh ? ww : wh;
+    },
+    setScale() {
+      if(window.innerHeight ==1080){
+        this.height = 1080
+      }else{
+        this.height = 937
+
+      }
+      this.scale = this.getScale();
+      if (this.$refs.ScaleBox) {
+        this.$refs.ScaleBox.style.setProperty("--scale", this.scale);
+      }
+    },
+    debounce(fn, delay) {
+      let delays = delay || 500;
+      let timer;
+      return function () {
+        let th = this;
+        let args = arguments;
+        if (timer) {
+          clearTimeout(timer);
+        }
+        timer = setTimeout(function () {
+          timer = null;
+          fn.apply(th, args);
+        }, delays);
+      };
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+#ScaleBox {
+  --scale: 1;
+}
+.ScaleBox {
+  position: absolute;
+  transform: scale(var(--scale)) translate(-50%, -50%);
+  display: flex;
+  background-color: #1f2341;
+  flex-direction: column;
+  transform-origin: 0 0;
+  left: 50%;
+  top: 50%;
+  transition: 0.3s;
+  z-index: 999;
+}
+</style>

+ 11 - 1
src/components/applicationIntegrationPopup.vue

@@ -4,7 +4,7 @@
 		<el-dialog :title="title" :visible.sync="visible" :close-on-click-modal="false" :before-close="closeDialog2" width="600px">
 			<div>
 				<el-form :model="dialogData" ref="dialogData" label-width="80px" v-loading="loading">
-					<div v-for="(item, index) in dialogData.items" :key="index" @click="itemIndex = index">
+					<div v-for="(item, index) in dialogData.items" :key="index" @click="setIndex(index)">
 						<div style="overflow: hidden;" class="flex-box flex-v-ce">
 							<span style="line-height: 36px;" class="flex-1">申请明细({{ index + 1 }})</span>
 							<el-button type="text" v-show="index > 0 || dialogData.items.length > 1" @click="delItem(index)">删除</el-button>
@@ -47,6 +47,7 @@
 								@change="ruleItemChange"
 								:show-all-levels="false"
 								filterable
+								@expand-change="setIndex(index)"
 								clearable
 								:props="{ children: 'child', label: 'name', value: 'id' }"
 							></el-cascader>
@@ -166,6 +167,7 @@
 			<div class="" v-if="!isShowError">
 				<div style="text-align: center;margin-bottom: 10px;" class="red" v-if="isShowError2">{{errorMsg}}</div>
 				<el-progress :text-inside="true" :stroke-width="24" :percentage="percentage"></el-progress>
+				<div class="yellow" style="text-align: center;padding-top: 10px;" v-if="config.event_review_status&&config.event_apply_review">复核开启后,积分需管理员复核后才计入排名和统计</div>
 				<div style="margin-top: 20px;border: 1px solid #f1f1f1;">
 					<div class="flex-box-ce results" style="font-weight: 600;">
 						<div  style="border-right: 1px solid #f1f1f1;width: 50px;">序号</div>
@@ -342,10 +344,12 @@ export default {
 			errorMsg:'服务器繁忙,请稍后再试',
 			breakList:[],
 			isShowBreak:false,
+			config:{},
 		};
 	},
 	components: { EmployeeSelector, uploadOss },
 	async mounted() {
+		this.config=this.$store.state.config;
 		this.user_info = this.$getUserData();
 		var reviewerObj = await this.getLocalVal(this.user_info.id);
 		var res = reviewerObj ? reviewerObj : { id: '', name: '' };
@@ -381,6 +385,12 @@ export default {
 		}
 	},
 	methods: {
+		setIndex(index){
+		  if(index==this.itemIndex){
+		    return false
+		  }
+		  this.itemIndex = index;
+		},
 		// 关闭缓存弹窗
 		colseBreak(){
 			this.isShowBreak = false;

+ 12 - 1
src/components/bonusPointsPopup.vue

@@ -13,7 +13,7 @@
 							</el-col>
 						</el-row>
 					</el-form-item>
-					<div v-for="(item, index) in dialogData.items" :key="index" @click.stop="itemIndex = index">
+					<div v-for="(item, index) in dialogData.items" :key="index" @click.stop="setIndex(index)">
 						<div style="overflow: hidden;">
 							<span style="line-height: 36px;">录入明细({{ index + 1 }})</span>
 							<el-button type="text" class="fr" v-show="index > 0 || dialogData.items.length > 1" @click="delItem(index)">删除</el-button>
@@ -33,6 +33,7 @@
 								:ref="'ruleCascader'+index"
 								:popper-class="'ruleClass'"
 								filterable
+								@expand-change="setIndex(index)"
 								clearable
 								:options="rule_list"
 								@change="ruleChange"
@@ -52,6 +53,7 @@
 								:popper-class="'itemClass'"
 								filterable
 								clearable
+								@expand-change="setIndex(index)"
 								:options="rule_item_list"
 								@change="ruleItemChange"
 								:show-all-levels="false"
@@ -195,6 +197,7 @@
 			<div v-if="!isShowError">
 				<div style="text-align: center;margin-bottom: 10px;" class="red" v-if="isShowError2">{{errorMsg}}</div>
 				<el-progress :text-inside="true" :stroke-width="24" :percentage="percentage"></el-progress>
+				<div class="yellow" style="text-align: center;padding-top: 10px;" v-if="config.event_review_status&&config.event_entry_review">复核开启后,积分需管理员复核后才计入排名和统计</div>
 				<div style="margin-top: 20px;border: 1px solid #f1f1f1;max-height: 500px;overflow-y: auto;" class="scroll-bar">
 					<div class="flex-box-ce results" style="font-weight: 600;">
 						<div style="border-right: 1px solid #f1f1f1;width: 50px;">序号</div>
@@ -385,6 +388,7 @@ export default {
 			errorMsg:'服务器繁忙,请稍后再试',
 			breakList:[],
 			isShowBreak:false,
+			config:{},
 		};
 	},
 	components: { EmployeeSelector, upload },
@@ -424,12 +428,19 @@ export default {
 	},
 	mounted() {
 		var that = this;
+		this.config=this.$store.state.config;
 		this.getUserDetail(function(data) {
 			that.manage_scope = data.manage_scope;
 			that.superior_list = data.superior_list;
 		});
 	},
 	methods: {
+		setIndex(index){
+		  if(index==this.itemIndex){
+		    return false
+		  }
+		  this.itemIndex = index;
+		},
 		// 关闭缓存弹窗
 		colseBreak(){
 			this.isShowBreak = false;

+ 8 - 3
src/components/examinePopup.vue

@@ -304,7 +304,8 @@ export default {
 			employee_not_select: [],
 			manager_selected: { dept: [], employee: [] },
 			show_employee_selector: false,
-			flatteningIntegralRules: {}
+			flatteningIntegralRules: {},
+			config:{}
 		};
 	},
 	props: {
@@ -349,6 +350,7 @@ export default {
 	},
 	components: { EmployeeSelector, Steps },
 	mounted() {
+		this.config=this.$store.state.config;
 		this.getRuleItem();
 		this.getRuleItemTree();
 		this.employee_lists = this.$getUserData().employee_detail.superior_list;
@@ -376,7 +378,6 @@ export default {
 						datas = { ...element };
 					}
 				});
-				console.log(datas);
 				// return
 				// let datas = this.$refs['ruleItem'].getCheckedNodes()[0].data;
 				if (datas.range_type == 1) {
@@ -689,7 +690,11 @@ export default {
 							if (res.data.code == 1) {
 								self.adoptShow = false;
 								self.detail_info.status = 2;
-								self.$message.success(res.data.msg);
+								let msg=res.data.msg;
+								if(this.config.event_review_status){
+									msg+='复核开启后,积分需管理员复核后才计入排名和统计'
+								}
+								self.$message.success(msg);
 								self.adoptClose(); //关闭通过弹窗
 								self.closeDetail(); //关闭抽屉
 								self.$parent.getSpList(); //刷新列表

+ 0 - 1
src/hint.vue

@@ -36,7 +36,6 @@ export default {
 		}else{
 			this.type ='PC';
 		}
-		console.log(data,this.type)
 		if (this.corpId) {
 			this.$nextTick(()=>{
 				this.init();

+ 3 - 4
src/home.vue

@@ -599,12 +599,12 @@ export default {
 		}
 		var url = window.location.href;
 		var rUrl = this.GetRequest(url).url || '';
-		// console.log('url=' + rUrl);
+		console.log(url)
 		this.$nextTick(function() {
 			if (rUrl) {
 				setTimeout(() => {
 					this.$router.push({ path: '/' + rUrl });
-				}, 200);
+				}, 1000);
 			}
 		});
 	},
@@ -645,7 +645,6 @@ export default {
 			var month = now.getMonth() + 1;
 			var date = now.getDate();
 			var day = now.getDay();
-			console.log(date);
 			//判断是否为周日,如果不是的话,就让今天的day-1(例如星期二就是2-1)
 			if (day !== 0) {
 			  n = n + (day - 1);
@@ -1019,12 +1018,12 @@ export default {
 					colors.push('rgb(' + Math.round(Math.random() * 255) + ',' + Math.round(Math.random() * 255) + ',' + Math.round(Math.random() * 255) + ')');
 				}
 			}
-
 			//只显示 N 条标题,多余隐藏,但是饼图不会隐藏
 			let DataLengths = [];
 			let left1 = '45%';
 			let left2 = '45%';
 			let leftBT = '25%';
+			
 			if (chart) {
 				const myChart = this.$echarts.init(chart);
 				var legendData1 = legendDataOne;

+ 5 - 13
src/index.vue

@@ -79,9 +79,9 @@
 					</template>
 				</el-menu>
 			</el-aside>
-			<el-main>
+			<el-main id="main">
 				<router-view />
-				<div class="fontColorF" style="text-align: center;margin: 10px 0;">Copyright © 2021 广东功道云数字科技有限公司 All Rights Reserved</div>
+				<div class="fontColorF" style="text-align: center;margin: 10px 0;">Copyright © 2022 广东功道云数字科技有限公司 All Rights Reserved</div>
 			</el-main>
 		</el-container>
 		<!-- 续费升级 -->
@@ -181,7 +181,6 @@ export default {
 		this.getInform();
 	},
 	mounted() {
-		this.getTypes();
 		this.getInfo();
 		var url = window.location.href;
 		var str = this.GetRequest(url).corpId || '123';
@@ -206,7 +205,6 @@ export default {
 			// 接收消息
 			const getsocketData = e => {  // 创建接收消息函数
 			  const data = e && e.detail.data
-			  console.log(data)
 			}
 			// 注册监听事件
 			window.addEventListener('onmessageWS', getsocketData)
@@ -310,7 +308,7 @@ export default {
 			var routers = this.$router.options.routes[0].children;
 			var routersArr = [];
 			routers.forEach(item => {
-				if (item.meta.groupCode == str) {
+				if (item.meta.groupCode == str&&!item.meta.noShow) {
 					//获取对应模块的路由
 					routersArr.push(item);
 				}
@@ -337,12 +335,6 @@ export default {
 				that.info = res.data.data;
 			});
 		},
-		getTypes() {
-			var that = this;
-			this.$axios('get', '/api/integral/types').then(res => {
-				that.$setTyps(res.data.data.list);
-			});
-		},
 		//获取员工列表
 		getEmployee() {
 			this.$axios('get', '/api/employee/index', { dept_id: 0, page: 1, page_size: 3000,is_official:1 }).then(res => {
@@ -435,12 +427,12 @@ export default {
 	min-width: 1000px;
 }
 .el-main::-webkit-scrollbar {
-	width: 3px;
+	width: 10px;
 	height: 10px;
 	background-color: #fff;
 }
 .el-main::-webkit-scrollbar-thumb {
-	background-color: #d9d9d9;
+	background-color: #ccc;
 }
 .logo-box {
 	width: 180px;

+ 9 - 0
src/init.vue

@@ -32,6 +32,9 @@ export default {
 			dialogFormVisible:false
 		};
 	},
+	created() {
+		this.getTypes();
+	},
 	mounted() {
 		var url = window.location.href;
 		var str = this.GetRequest(url).corpId || '123';
@@ -42,6 +45,12 @@ export default {
 		}
 	},
 	methods: {
+		getTypes() {
+			var that = this;
+			this.$axios('get', '/api/integral/types').then(res => {
+				that.$setTyps(res.data.data.list);
+			});
+		},
 		bundleOfServices(){
 			this.$dd.biz.util.openSlidePanel({
 				url:"https://page.dingtalk.com/wow/dingtalk/act/serviceconversation?wh_biz=tm&showmenu=false&goodsCode=DT_GOODS_881607043109331&corpId="+this.$getCache('corpId')+"&token=5784a3e6b5e025ee891517ea814180f4",

+ 2 - 1
src/main.js

@@ -13,7 +13,7 @@ import service from './api/axios'
 import echarts from 'echarts'
 import NProgress from 'nprogress';
 import 'nprogress/nprogress.css'
-import { getToken, setToken,getUserData,setUserData,getTyps,setTyps,getIsCreator,supremeAuthority,authoritys,getTypsName,generateUUID,getCache,setCache,removeCache} from './api/auth';
+import {returnDeptName, getToken, setToken,getUserData,setUserData,getTyps,setTyps,getIsCreator,supremeAuthority,authoritys,getTypsName,generateUUID,getCache,setCache,removeCache} from './api/auth';
 import * as socketApi from './api/websocket'
 
 // 头像
@@ -44,6 +44,7 @@ Vue.prototype.$generateUUID = generateUUID   //UID 唯一标识
 Vue.prototype.$getCache = getCache
 Vue.prototype.$setCache = setCache
 Vue.prototype.$removeCache = removeCache
+Vue.prototype.$returnDeptName = returnDeptName
 
 Vue.prototype.$http = service;
 var CancelToken = axios.CancelToken;

+ 57 - 6
src/router/index.js

@@ -27,7 +27,7 @@ const routes = [{
 			{
 				path: '/inform',
 				name: '通知',
-				component: () => import( /* webpackChunkName: "award_punish" */'@/inform'),
+				component: () => import( /* webpackChunkName: "award_punish" */ '@/inform'),
 				meta: {
 					icon: 'icon-shezhi_zuzhijiagou',
 					groupCode: 'home',
@@ -36,7 +36,8 @@ const routes = [{
 			{
 				path: '/award_punish',
 				name: '我奖扣的',
-				component: () => import( /* webpackChunkName: "award_punish" */'@/views/abPoint/award_punish.vue'),
+				component: () => import( /* webpackChunkName: "award_punish" */
+					'@/views/abPoint/award_punish.vue'),
 				meta: {
 					icon: 'icon-shezhi_zuzhijiagou',
 					groupCode: 'abPoint',
@@ -111,6 +112,16 @@ const routes = [{
 					groupCode: 'ranking',
 				}
 			},
+			{
+				path: '/JfDetail',
+				name: '积分明细',
+				component: () => import( /* webpackChunkName: "JfDetail" */ '@/views/ranking/JfDetail.vue'),
+				meta: {
+					icon: 'icon-shezhi_zuzhijiagou',
+					groupCode: 'ranking',
+					noShow: true, //不显示在导航里
+				}
+			},
 			{
 				path: '/total_rank',
 				name: '累计B分排名',
@@ -160,6 +171,19 @@ const routes = [{
 					icon: 'icon-shezhi_jifenguize',
 					groupCode: 'ranking',
 					groupName: "统计",
+
+				}
+			},
+			{
+				path: '/integral_event_two',
+				name: '执行明细',
+				component: () => import( /* webpackChunkName: "integral_event_two" */
+					'@/views/ranking/integral_event_two.vue'),
+				meta: {
+					icon: 'icon-shezhi_jifenguize',
+					groupCode: 'ranking',
+					groupName: "统计",
+					noShow: true, //不显示在导航里
 				}
 			},
 			{
@@ -277,6 +301,16 @@ const routes = [{
 					jurisdiction: ['dept_manager', 'employee']
 				}
 			},
+			{
+				path: '/screenSet',
+				name: '大屏配置',
+				component: () => import( /* webpackChunkName: "screenSet" */ '@/views/set/screenSet.vue'),
+				meta: {
+					icon: 'icon-shezhi_xitongpeizhi',
+					groupCode: 'set',
+					jurisdiction: ['dept_manager', 'employee']
+				}
+			},
 			{
 				path: '/systemLayout',
 				name: '系统配置',
@@ -338,10 +372,21 @@ const routes = [{
 					groupCode: 'workbench',
 				}
 			},
+			{
+				path: '/review',
+				name: '复核',
+				component: () => import( /* webpackChunkName: "review" */
+					'@/views/workbench/review.vue'),
+				meta: {
+					icon: 'icon-shezhi_gongdaolbiao',
+					groupCode: 'workbench',
+					jurisdiction: ['dept_manager', 'employee']
+				}
+			},
 			{
 				path: '/flBox',
 				name: '功勋点管理',
-				component: () => import( /* webpackChunkName: "flBox" */'@/views/welfare/flBox.vue'),
+				component: () => import( /* webpackChunkName: "flBox" */ '@/views/welfare/flBox.vue'),
 				meta: {
 					icon: 'icon-shezhi_gongdaolbiao',
 					groupCode: 'welfare',
@@ -350,7 +395,7 @@ const routes = [{
 			{
 				path: '/prize',
 				name: '奖品管理',
-				component: () => import( /* webpackChunkName: "approval_list" */'@/views/welfare/prize.vue'),
+				component: () => import( /* webpackChunkName: "approval_list" */ '@/views/welfare/prize.vue'),
 				meta: {
 					icon: 'icon-shezhi_gongdaolbiao',
 					groupCode: 'welfare',
@@ -359,7 +404,8 @@ const routes = [{
 			{
 				path: '/conversion',
 				name: '兑换管理',
-				component: () => import( /* webpackChunkName: "approval_list" */'@/views/welfare/conversion.vue'),
+				component: () => import( /* webpackChunkName: "approval_list" */
+					'@/views/welfare/conversion.vue'),
 				meta: {
 					icon: 'icon-shezhi_gongdaolbiao',
 					groupCode: 'welfare',
@@ -377,6 +423,11 @@ const routes = [{
 		name: '无权限',
 		component: () => import( /* webpackChunkName: "noAccess" */ '@/noAccess'),
 	},
+	{
+		path: '/screen',
+		name: '数据大屏展示',
+		component: () => import( /* webpackChunkName: "screen" */ '@/screen'),
+	},
 	{
 		path: '/deptRankSwiper',
 		name: '轮播',
@@ -390,7 +441,7 @@ const routes = [{
 	{
 		path: '/dome',
 		name: '虚拟列表',
-		component: () => import( /* webpackChunkName: "hint" */ '@/dome'),
+		component: () => import( /* webpackChunkName: "dome" */ '@/dome'),
 	},
 ]
 

+ 1062 - 0
src/screen.vue

@@ -0,0 +1,1062 @@
+<template>
+	<div style="height: 100%;width: 100%;">
+		<div class="screenBox back" v-if="isPCa">
+			<el-alert v-if="isShowError" :title="errorMsg"  type="error"></el-alert>
+			<div v-if="result.company" style="height: 100%;">
+				<header>
+					<div style="height: 3rem;padding: 0  2rem;font-size: 20px;" class="zhuColor flex-box-ce">
+						<div class="flex-1 flex-box-ce">
+							<img :src="result.company.logo" class="logo" />
+							<div>{{ result.company.name }}</div>
+						</div>
+						<div style="width: 400px;"></div>
+						<div class="flex-1 flex-box-end flex-box-ce">
+							<div>{{ nowTime }}</div>
+							<el-tooltip class="item" effect="dark" content="全屏" placement="bottom">
+								<!-- <i class="el-icon-help" style="cursor: pointer;" @click="fullScreen"></i> -->
+								<img src="./assets/image/qp.png" class="logo" style="width: 24px;height: 24px;margin-left: 10px;cursor: pointer;" @click="fullScreen"/>
+							</el-tooltip>
+							<el-tooltip class="item" effect="dark" content="退出" placement="bottom">
+								<img src="./assets/image/quit.png" class="logo" style="width: 24px;height: 24px;margin-left: 10px;cursor: pointer;" @click="quit"/>
+							</el-tooltip>
+						</div>
+					</div>
+					<div class="zhuColor title" style="width: 400px;margin: 0 auto;height: 20px;text-align: center;">
+						<span>{{ result.title }}</span>
+					</div>
+				</header>
+				<div style="height: 10px;"></div>
+				<div class="flex-box" style="height: calc(100% - 128px);padding: 16px;padding-bottom: 0;">
+					<div class="flex-2 box" id="left">
+						<div class="boxTitle">{{ result.ranking.name }}</div>
+						<div class="ranking" style="border-radius: 8px;margin: 16px;margin-top: 0px;">
+							<template v-if="result.ranking.list.length>0">
+								<div style="margin-bottom: 8px;border-radius: 8px;box-shadow: 0 8px 8px #191E48;margin-top: 16px;">
+									<div v-for="(item, index) in ranking(result.ranking.list, 1)" :key="index" class="flex-box-ce rankingItem">
+										<div class="flex-1 flex-box-ce">
+											<template v-if="item.rank < 4">
+												<div v-if="item.rank == 1" class="index"><img src="./assets/image/1.png" /></div>
+												<div v-if="item.rank == 2" class="index"><img src="./assets/image/2.png" /></div>
+												<div v-if="item.rank == 3" class="index"><img src="./assets/image/3.png" /></div>
+											</template>
+											<userImage :user_name="item.employee.name" :img_url="item.employee.img_url" width="54px" height="54px" style="margin: 0 18px;"></userImage>
+											<div>
+												<div style="font-size: 20px;margin-bottom: 5px;">{{ item.employee.name }}</div>
+												<div class="fontColorT" style="font-size: 14px;" v-if="item.dept_list.length>0">
+													{{item.dept_list[0].dept_name}} <span v-if="item.dept_list.length>1">...</span>
+												</div>
+											</div>
+										</div>
+										<div class="num">{{ item.s_point }}</div>
+									</div>
+								</div>
+								<vue-seamless-scroll :data="result.ranking.list" class="seamless-warp" :style="{height:h1+'px'}" :class-option="classOption">
+									<div v-for="(item, index) in ranking(result.ranking.list, 2)" :key="index" class="flex-box-ce rankingItem">
+										<div class="flex-1 flex-box-ce">
+											<div style="font-size: 20px;width: 36px;text-align: center;">{{ item.rank }}</div>
+											<userImage :user_name="item.employee.name" :img_url="item.employee.img_url" width="54px" height="54px" style="margin: 0 18px;"></userImage>
+											<div>
+												<div style="font-size: 20px;margin-bottom: 5px;">{{ item.employee.name }}</div>
+												<div class="fontColorT" style="font-size: 14px;" v-if="item.dept_list.length>0">
+													{{item.dept_list[0].dept_name}}<span v-if="item.dept_list.length>1">...</span>
+												</div>
+											</div>
+										</div>
+										<div class="num">{{ item.s_point }}</div>
+									</div>
+								</vue-seamless-scroll>
+							</template>
+							<div v-else style="height: 200px;text-align: center;line-height: 200px;color: #fff;">
+								暂无数据
+							</div>
+						</div>
+					</div>
+					<div class="flex-3" style="margin: 0 16px;height: 100%;">
+						<div class="flex-box-ce numBox" style="margin-bottom: 16px;">
+							<div class="flex-1 flex-box-v flex-center-center" style="border-radius: 12px;margin-right: 16px;background-image: linear-gradient(to top, #2537F7 0%, #258CF6 100%);" @click="endVal = 5123">
+								<div style="font-size: 2rem;margin-bottom: 1rem;">今日奖分</div>
+								<div style="font-size: 4.2rem;font-weight: 600;letter-spacing:8px;position: relative;">
+									<countTo :startVal="startVal" separator="" :endVal="result.center.all_add_point" :duration="3000"></countTo>
+								</div>
+							</div>
+							<div class="flex-1 flex-box-v flex-center-center" style="border-radius: 12px;background-image: linear-gradient(to top, #6342E9 0%, #8468F3 100%);">
+								<div style="font-size: 2rem;margin-bottom: 1rem;">今日人次</div>
+								<div style="font-size: 4.2rem;font-weight: 600;letter-spacing:8px">
+									<countTo :startVal="startVal" separator="" :endVal="result.center.count" :duration="3000"></countTo>
+								</div>
+							</div>
+						</div>
+						<div style="background-color: rgba(23, 30, 72, 0.3); border-radius: 8px;position: relative;">
+							<div class="boxTitle" style="margin-bottom: 30px;">积分制运用活跃度</div>
+							<div class="flex-box-ce" style="position: absolute;color:#fff;font-size:16px;right: 20px;top:108px">
+								<span style="height: 2px;width: 30px;background-color: #E6A23C;"></span>
+							基准标尺</div>
+							<div ref="ManagerSAwardChart" class="chart" :style="{height:h2+'px'}"></div>
+						</div>
+					</div>
+					<div class="flex-2 box">
+						<div class="boxTitle">{{ result.event.name }}</div>
+						<div class="ranking">
+							<template v-if="result.event.list.length">
+								<vue-seamless-scroll :data="returnEvent(result.event.list)" class="seamless-warp" style="margin: 16px;" :style="{height:h3+'px'}" :class-option="classOption">
+									<div v-for="(item, index) in returnEvent(result.event.list)" :key="item.id" class="flex-box rankingItem" style="margin-bottom: 10px;background-color: #1B3A70">
+										<div class="main-right flex-1">
+											<div class="context">{{ $moment.unix(item.event_time).format('YYYY-MM-DD') }}-{{ item.remark.customize ? item.remark.customize : item.remark.rule }}</div>
+											<div class="flex-box flex-v-ce">
+												<div class="name flex-1">{{ item.employee.name }}</div>
+												<div class="da" v-if="item.point > 0">+{{ item.point }}  <span style="color: #01EEFE;">{{ item.pt_id == 3 ? 'B分' : 'A分' }}</span></div>
+												<div class="red da" v-else>{{ item.point }}  <span style="color: #01EEFE;">{{ item.pt_id == 3 ? 'B分' : 'A分' }}</span></div>
+											</div>
+										</div>
+									</div>
+								</vue-seamless-scroll>
+							</template>
+							<div v-else style="height: 200px;text-align: center;line-height: 200px;color: #fff;">
+								暂无数据
+							</div>
+						</div>
+					</div>
+				</div>
+				<div  style="text-align: center;padding: 6px 0;font-size: 16px;color: #ccc;">@功道云积分制-提供技术支持</div>
+			</div>
+			<div class="data-all" v-else style="height: 100%;">
+				<i class="el-icon-loading" style="margin-top: 15%;width: 150px;margin-bottom: 10px;color: #fff;font-size: 64px;"></i>
+				<div style="color: #fff;">管理执行难,就用功道云</div>
+			</div>
+			<el-dialog title="输入密码" :visible.sync="isShowCode" width="450px" :show-close="false" :close-on-click-modal="false" :close-on-press-escape="false">
+				<div style="margin: 10px 0;">
+					<el-input style="width: 300px;" v-model="code" placeholder="请输入随机密码"></el-input>
+					<div class="yellow">密码可在系统后台 “访问大屏” 功能中获取</div>
+				</div>
+				<div class="flex-box-end"><el-button type="primary" :disabled="isShowlog" :loading="isShowlog" @click="opneWebSocket()">确定</el-button></div>
+			</el-dialog>
+		</div>
+		<div v-else style="height: 100%;" class="back">
+			<el-alert v-if="isShowError" :title="errorMsg"  type="error"></el-alert>
+			<div v-if="result.company" style="height: 100%;">
+				<header>
+					<div style="height: 2.4rem;padding: 0 1rem;font-size: 14px;" class="zhuColor flex-box-ce">
+						<div class="flex-1 flex-box-ce">
+							<img :src="result.company.logo" class="logo" style="width: 1.4rem;height: 1.4rem;" />
+							<div>{{ result.company.name }}</div>
+						</div>
+						<div style="width: 260px;"></div>
+						<div class="flex-1 flex-box-end flex-box-ce">
+							<div>{{ nowTime }}</div>
+							<el-tooltip class="item" effect="dark" content="全屏" placement="bottom">
+								<img src="./assets/image/qp.png" class="logo" style="width: 24px;height: 24px;margin-left: 10px;cursor: pointer;" @click="fullScreen"/>
+							</el-tooltip>
+							<el-tooltip class="item" effect="dark" content="退出" placement="bottom">
+								<img src="./assets/image/quit.png" class="logo" style="width: 24px;height: 24px;margin-left: 10px;cursor: pointer;" @click="quit"/>
+							</el-tooltip>
+						</div>
+					</div>
+					<div class="zhuColor title2" style="width: 260px;margin: 0 auto;height: 14px;text-align: center;">
+						<span style="font-size: 20px;top: -1rem;">{{ result.title }}</span>
+					</div>
+				</header>
+				<div style="height: 10px;"></div>
+				<div class="flex-box" style="height: calc(100% - 92px);padding: 0 10px;">
+					<div class="flex-2 box" id="left">
+						<div class="boxTitle2">{{ result.ranking.name }}</div>
+						<div class="ranking" style="border-radius: 8px;margin: 10px;">
+							<template v-if="result.ranking.list.length>0">
+								<div style="box-shadow: 0 5px 5px #1d2242;margin-bottom: 5px;border-radius: 8px;">
+									<div v-for="(item, index) in ranking(result.ranking.list, 1)" :key="index" class="flex-box-ce rankingItem">
+										<div class="flex-1 flex-box-ce">
+											<template v-if="item.rank < 4">
+												<div v-if="item.rank == 1" class="index2"><img src="./assets/image/1.png" /></div>
+												<div v-if="item.rank == 2" class="index2"><img src="./assets/image/2.png" /></div>
+												<div v-if="item.rank == 3" class="index2"><img src="./assets/image/3.png" /></div>
+											</template>
+											<userImage :user_name="item.employee.name" :img_url="item.employee.img_url" width="30px" height="30px" style="margin: 0 6px;"></userImage>
+											<div>
+												<div style="font-size: 14px;">{{ item.employee.name }}</div>
+												<div class="fontColorT" style="font-size: 12px;margin-top: 5px;" v-if="item.dept_list.length>0">
+													{{item.dept_list[0].dept_name}} <span v-if="item.dept_list.length>1">...</span>
+												</div>
+											</div>
+										</div>
+										<div class="num" style="font-size: 14px;">{{ item.s_point }}</div>
+									</div>
+								</div>
+								<vue-seamless-scroll :data="result.ranking.list" class="seamless-warp" :style="{height:h4+'px'}" :class-option="classOption">
+									<div v-for="(item, index) in ranking(result.ranking.list, 2)" :key="index" class="flex-box-ce rankingItem">
+										<div class="flex-1 flex-box-ce">
+											<div style="font-size: 14px;width: 1.4rem;text-align: center;">{{ item.rank }}</div>
+											<userImage :user_name="item.employee.name" :img_url="item.employee.img_url" width="30px" height="30px" style="margin: 0 6px;"></userImage>
+											<div>
+												<div style="font-size: 14px;">{{ item.employee.name }}</div>
+												<div class="fontColorT" style="font-size: 12px;margin-top: 5px;" v-if="item.dept_list.length>0">
+													{{item.dept_list[0].dept_name}} <span v-if="item.dept_list.length>1">...</span>
+												</div>
+											</div>
+										</div>
+										<div class="num" style="font-size: 14px;">{{ item.s_point }}</div>
+									</div>
+								</vue-seamless-scroll>
+							</template>
+							<div v-else style="height: 200px;text-align: center;line-height: 200px;color: #fff;">
+								暂无数据
+							</div>
+						</div>
+					</div>
+					<div class="flex-3" style="margin: 0 10px;height: 100%;">
+						<div class="flex-box-ce numBox" style="margin-bottom: 10px">
+							<div class="flex-1 flex-box-v flex-center-center" style="border-radius: 12px;margin-right: 16px;background-image: linear-gradient(to top, #2537F7 0%, #258CF6 100%);height: 5rem;" @click="endVal = 5123">
+								<div style="font-size: 0.9rem;margin-bottom: 0.4rem;">今日奖分</div>
+								<div style="font-size: 2rem;font-weight: 600;letter-spacing:8px;position: relative;">
+									<countTo :startVal="startVal" separator="" :endVal="result.center.all_add_point" :duration="3000"></countTo>
+								</div>
+							</div>
+							<div class="flex-1 flex-box-v flex-center-center" style="border-radius: 12px;background-image: linear-gradient(to top, #6342E9 0%, #8468F3 100%);height: 5rem;">
+								<div style="font-size: 0.9rem;margin-bottom: 0.4rem;">今日人次</div>
+								<div style="font-size: 2rem;font-weight: 600;letter-spacing:8px">
+									<countTo :startVal="startVal" separator="" :endVal="result.center.count" :duration="3000"></countTo>
+								</div>
+							</div>
+						</div>
+						<div style="background-color: rgba(23, 30, 72, 0.3); border-radius: 8px;position: relative;">
+							<div class="boxTitle2" >积分制运用活跃度</div>
+							<div class="flex-box-ce" style="position: absolute;color:#fff;font-size:12px;right: 10px;top:72px">
+								<span style="height: 2px;width: 20px;background-color: #E6A23C;"></span>
+							基准标尺</div>
+							<div ref="ManagerSAwardChart" class="chart" style="position: relative;top: 20px;" :style="{height:h5+'px'}"></div>
+						</div>
+					</div>
+					<div class="flex-2 box">
+						<div class="boxTitle2">{{ result.event.name }}</div>
+						<div class="ranking">
+							<template v-if="result.event.list.length">
+								<vue-seamless-scroll :data="returnEvent(result.event.list)" style="margin: 10px;" class="seamless-warp" :style="{height:h6+'px'}" :class-option="classOption">
+									<div v-for="(item, index) in returnEvent(result.event.list)" :key="item.id" class="flex-box rankingItem" style="margin-bottom: 10px;background-color: #1B3A70">
+										<div class="main-right2 flex-1">
+											<div class="context">{{ $moment.unix(item.event_time).format('YYYY-MM-DD') }}-{{ item.remark.customize ? item.remark.customize : item.remark.rule }}</div>
+											<div class="flex-box flex-v-ce">
+												<div class="name flex-1">{{ item.employee.name }}</div>
+												<div style="font-size: 16px;" v-if="item.point > 0">+{{ item.point }}  <span style="color: #01EEFE;">{{ item.pt_id == 3 ? 'B分' : 'A分' }}</span></div>
+												<div style="font-size: 16px;" class="red " v-else>{{ item.point }}  <span style="color: #01EEFE;">{{ item.pt_id == 3 ? 'B分' : 'A分' }}</span></div>
+											</div>
+										</div>
+									</div>
+								</vue-seamless-scroll>
+							</template>
+							<div v-else style="height: 200px;text-align: center;line-height: 200px;color: #fff;">
+								暂无数据
+							</div>
+						</div>
+					</div>
+				</div>
+				<div  style="text-align: center;padding: 6px 0;font-size: 8px;color:#C0C4CC;">@功道云积分制-提供技术支持</div>
+			</div>
+			<div class="data-all" v-else style="height: 100%;">
+				<i class="el-icon-loading" style="margin-top: 15%;width: 150px;margin-bottom: 10px;color: #fff;font-size: 64px;"></i>
+				<div style="color: #fff;">管理执行难,就用功道云</div>
+			</div>
+			<el-dialog title="输入密码" :visible.sync="isShowCode" width="450px" :show-close="false" :close-on-click-modal="false" :close-on-press-escape="false">
+				<div style="margin: 10px 0;">
+					<el-input style="width: 300px;" v-model="code" placeholder="请输入随机密码"></el-input>
+					<div class="yellow">密码可在系统后台 “访问大屏” 功能中获取</div>
+				</div>
+				<div class="flex-box-end"><el-button type="primary" :disabled="isShowlog" :loading="isShowlog" @click="opneWebSocket()">确定</el-button></div>
+			</el-dialog>
+		</div>
+	</div>
+</template>
+
+<script>
+import vueSeamlessScroll from 'vue-seamless-scroll';
+import ScaleBox from '@/components/ScaleBox.vue';
+import countTo from 'vue-count-to';
+export default {
+	name: 'screen',
+	components: { vueSeamlessScroll, ScaleBox, countTo },
+	data() {
+		return {
+			startVal: 0,
+			endVal: 321,
+			nowTime: '',
+
+			// 长连接结果
+			result: {}, //提交的返回结果集合
+			code: '',
+			isShowCode: false,
+			isDp:false,
+			isShowlog:false,
+			
+			h1:'',
+			h2:'',
+			h3:'',
+			errorMsg:'',
+			isShowError:false,
+			isPCa:true,
+			h4:'',
+			h5:'',
+			h6:'',
+			preview:false,
+		};
+	},
+	computed: {
+		classOption() {
+			return {
+				step: 0.5, // 数值越大速度滚动越快
+				limitMoveNum: 2, // 开始无缝滚动的数据量 this.dataList.length
+				hoverStop: true, // 是否开启鼠标悬停stop
+				direction: 1, // 0向下 1向上 2向左 3向右
+				openWatch: true, // 开启数据实时监控刷新dom
+				singleHeight: 0, // 单步运动停止的高度(默认值0是无缝不停止的滚动) direction => 0/1
+				singleWidth: 0, // 单步运动停止的宽度(默认值0是无缝不停止的滚动) direction => 2/3
+				waitTime: 1000 // 单步运动停止的时间(默认值1000ms)
+			};
+		}
+	},
+	created() {
+		this.isPCa=this.IsPC()
+	},
+	mounted() {
+		if(this.$route.query.preview){
+			this.preview=true;
+			this.isShowCode = true;
+		}else{
+			if (this.$getCache('code')) {
+				this.code = this.$getCache('code');
+				this.opneWebSocket()
+			} else {
+				this.isShowCode = true;
+			}
+		}
+		this.nowTimes();
+		window.addEventListener('resize', this.selfAdaption);
+	},
+	methods: {
+		IsPC() {
+		    var userAgentInfo = navigator.userAgent;
+		    var Agents = ["Android", "iPhone","SymbianOS", "Windows Phone","iPad", "iPod"];
+		    var flag = true;
+		    for (var v = 0; v < Agents.length; v++) {
+		        if (userAgentInfo.indexOf(Agents[v]) > 0) {
+		            flag = false;
+		            break;
+		        }
+		    }
+		    return flag;
+		},
+		quit(){
+			if(!this.preview){
+				this.$removeCache('code');
+			}
+			this.result={};
+			this.code='';
+			this.isShowCode = true;
+			this.$socketApi.closewebsocket()
+		},
+		opneWebSocket() {
+			this.isShowlog=true;
+			this.$socketApi.closewebsocket()
+			if (!this.code) {
+				this.$message.error('请输入密码');
+				this.isShowlog=false;
+				return false;
+			}
+			this.$socketApi.sendData({ type: 'screen', code: this.code }, this.onmessageWS);
+		},
+		onmessageWS(e) {
+			this.isShowlog=false;
+			console.log(e);
+			if (e.type == 'screen') {
+				if (e.code != 1) {
+					this.result={};
+					if(e.code=='-2'||e.code=='-3'){
+						if(!this.isShowCode){
+							this.$alert('密码已被修改或过期,请重新输入密码', '密码错误', {
+							  confirmButtonText: '确定',
+							  callback: action => {
+								this.isShowCode = true;
+							  }
+							});
+						}else{
+							this.$message.error('密码错误');
+						}
+					}
+					if(e.code=='-4'){
+						this.$message.error('窗口链接数量超过限制');
+						this.quit();
+					}
+					
+				} else {
+					if(!this.preview){
+						this.$setCache('code', this.code);
+					}
+					this.isShowCode = false;
+					this.result = e.result.result;
+					this.$nextTick(()=>{
+						this.isPCa? this.ManagerSAwardCharts2():this.ManagerSAwardCharts()
+						this.selfAdaption();
+					})
+					
+				}
+			}
+			// 中途断开
+			if (e.type == 'break'||e.type == 'error') {
+				this.isShowError=true;
+				this.errorMsg=e.msg;
+				setTimeout(()=>{
+					this.isShowError=false;
+				},3000)
+			}
+		},
+		//管理者奖扣统计
+		ManagerSAwardCharts() {
+			//管理着奖扣统计表
+			const chart = this.$refs.ManagerSAwardChart;
+			let ratio_date=this.result.active.list.ratio_date;
+			let ratio_get=this.result.active.list.ratio_get;
+			let ratio_set=this.result.active.list.ratio_set;
+			if (chart) {
+				const myChart = this.$echarts.init(chart);
+				let option = {
+					tooltip: {
+						trigger: 'axis',
+						axisPointer: {
+							type: 'shadow'
+						},
+						formatter: function(a) {
+						  let list = [];
+						  let listItem = '';
+						  for (var i = 0; i < a.length; i++) {
+							list.push(
+							  '<i style="display: inline-block;width: 10px;height: 10px;background: ' +
+								a[i].color +
+								';margin-right: 5px;border-radius: 50%;}"></i><span style=" display:inline-block;">' +
+								a[i].seriesName +
+								'</span>&nbsp:' +
+								a[i].value+'%'
+							);
+						  }
+						  listItem = list.join('<br>');
+						  return '<div class="showBox"><div>' + a[0].name + '</div>' + listItem + '</div>';
+						}
+					},
+					legend: {
+						textStyle: {
+							color: '#fff',
+							fontSize: '12',
+							
+						},
+						left: '0%',
+						// data:['上上周','上周','本周'],
+						data: ratio_date
+					},
+					color: [
+						{
+							type: 'linear',
+							x: 0,
+							y: 0,
+							x2: 0,
+							y2: 1,
+							colorStops: [{ offset: 0, color: '#F8E908' },{ offset: 1, color: '#19286D' }
+							]
+						},
+						{
+							type: 'linear',
+							x: 0,
+							y: 0,
+							x2: 0,
+							y2: 1,
+							colorStops: [{ offset: 0, color: '#00F8FF' }, { offset: 1, color: '#19286D' }]
+						},
+						{
+							type: 'linear',
+							x: 0,
+							y: 0,
+							x2: 0,
+							y2: 1,
+							colorStops: [{ offset: 0, color: '#B117F1' }, { offset: 1, color: '#19286D' }]
+						}
+					],
+					xAxis: {
+						type: 'category',
+						axisLabel: {
+							show: true,
+							textStyle: {
+								color: '#fff',
+								fontSize: '12'
+							}
+						},
+						data: ['获得积分的人员占比', '执行奖扣的管理者占比']
+					},
+					yAxis: {
+						type: 'value',
+						max: 100, //取100为最大刻度
+						axisLabel: {
+							show: true,
+							formatter: '{value}%',
+							textStyle: {
+								color: '#fff'
+							}
+						}
+					},
+
+					series: [
+						{
+							type: 'bar',
+							name: ratio_date[0],
+							stack: 'Total',
+							label: {
+								show: true,
+								position: 'top',
+								color:'#fff',
+								formatter: '{c}%',
+								fontSize: '12'
+							},
+							data: [ratio_get[0], ratio_set[0]]
+						},
+						{
+							type: 'bar',
+							label: {
+								show: true,
+								position: 'top',
+								color:'#fff',
+								formatter: '{c}%',
+								fontSize: '12'
+							},
+							name: ratio_date[1],
+							data: [ratio_get[1], ratio_set[1]]
+						},
+						{
+							type: 'bar',
+							label: {
+								show: true,
+								position: 'top',
+								color:'#fff',
+								formatter: '{c}%',
+								fontSize: '12'
+							},
+							name: ratio_date[2],
+							data: [ratio_get[2], ratio_set[2]],
+						},
+						{
+							type: 'bar',
+							name: '大啊',
+							data: [],
+							markLine: {
+								silent: true,
+								data: [
+									{
+										silent: false, //鼠标悬停事件  true没有,false有
+										lineStyle: {
+											//警戒线的样式  ,虚实  颜色
+											type: 'solid',
+											color: '#E6A23C'
+										},
+										label: {
+											position: 'end',
+											formatter: '标尺',
+											fontSize: '10'
+										},
+										// yAxis: 80
+										yAxis: this.result.active.base_ratio // 警戒线的标注值,可以有多个yAxis,多条警示线   或者采用   {type : 'average', name: '平均值'},type值有  max  min  average,分为最大,最小,平均值
+									}
+								]
+							}
+						},
+					]
+				};
+				myChart.setOption(option);
+			}
+		},
+		//管理者奖扣统计
+		ManagerSAwardCharts2() {
+			//管理着奖扣统计表
+			const chart = this.$refs.ManagerSAwardChart;
+			let ratio_date=this.result.active.list.ratio_date;
+			let ratio_get=this.result.active.list.ratio_get;
+			let ratio_set=this.result.active.list.ratio_set;
+			if (chart) {
+				const myChart = this.$echarts.init(chart);
+				let option = {
+					tooltip: {
+						trigger: 'axis',
+						axisPointer: {
+							type: 'shadow'
+						},
+						formatter: function(a) {
+						  let list = [];
+						  let listItem = '';
+						  for (var i = 0; i < a.length; i++) {
+							list.push(
+							  '<i style="display: inline-block;width: 10px;height: 10px;background: ' +
+								a[i].color +
+								';margin-right: 5px;border-radius: 50%;}"></i><span style=" display:inline-block;">' +
+								a[i].seriesName +
+								'</span>&nbsp:' +
+								a[i].value+'%'
+							);
+						  }
+						  listItem = list.join('<br>');
+						  return '<div class="showBox"><div>' + a[0].name + '</div>' + listItem + '</div>';
+						}
+					},
+					legend: {
+						textStyle: {
+							color: '#fff',
+							fontSize: '16',
+						},
+						left: '3%',
+						// data:['上上周','上周','本周'],
+						data: ratio_date
+					},
+					color: [
+						{
+							type: 'linear',
+							x: 0,
+							y: 0,
+							x2: 0,
+							y2: 1,
+							colorStops: [{ offset: 0, color: '#F8E908' },{ offset: 1, color: '#19286D' }
+							]
+						},
+						{
+							type: 'linear',
+							x: 0,
+							y: 0,
+							x2: 0,
+							y2: 1,
+							colorStops: [{ offset: 0, color: '#00F8FF' }, { offset: 1, color: '#19286D' }]
+						},
+						{
+							type: 'linear',
+							x: 0,
+							y: 0,
+							x2: 0,
+							y2: 1,
+							colorStops: [{ offset: 0, color: '#B117F1' }, { offset: 1, color: '#19286D' }]
+						}
+					],
+					xAxis: {
+						type: 'category',
+						axisLabel: {
+							show: true,
+							textStyle: {
+								color: '#fff',
+								fontSize: '16'
+							}
+						},
+						data: ['获得积分的人员占比', '执行奖扣的管理者占比']
+					},
+					yAxis: {
+						type: 'value',
+						max: 100, //取100为最大刻度
+						axisLabel: {
+							show: true,
+							formatter: '{value}%',
+							textStyle: {
+								color: '#fff'
+							}
+						}
+					},
+		
+					series: [
+						{
+							type: 'bar',
+							name: ratio_date[0],
+							label: {
+								show: true,
+								position: 'top',
+								formatter: '{c}%',
+								color:'#fff',
+								fontSize: '14'
+							},
+							data: [ratio_get[0], ratio_set[0]]
+						},
+						{
+							type: 'bar',
+							name: ratio_date[1],
+							label: {
+								show: true,
+								position: 'top',
+								formatter: '{c}%',
+								color:'#fff',
+								fontSize: '14'
+							},
+							data: [ratio_get[1], ratio_set[1]]
+						},
+						{
+							type: 'bar',
+							name: ratio_date[2],
+							label: {
+								show: true,
+								position: 'top',
+								formatter: '{c}%',
+								color:'#fff',
+								fontSize: '14'
+							},
+							data: [ratio_get[2], ratio_set[2]],
+						},
+						{
+							type: 'bar',
+							name: '大啊',
+							data: [],
+							markLine: {
+								silent: true,
+								data: [
+									{
+										silent: false, //鼠标悬停事件  true没有,false有
+										lineStyle: {
+											//警戒线的样式  ,虚实  颜色
+											type: 'solid',
+											color: '#E6A23C'
+										},
+										label: {
+											position: 'end',
+											formatter: '标尺',
+											fontSize: '14'
+										},
+										// yAxis: 80
+										yAxis: this.result.active.base_ratio // 警戒线的标注值,可以有多个yAxis,多条警示线   或者采用   {type : 'average', name: '平均值'},type值有  max  min  average,分为最大,最小,平均值
+									}
+								]
+							}
+						},
+					]
+				};
+				myChart.setOption(option);
+			}
+		},
+		//echarts自适应
+		selfAdaption() {
+			let height=document.getElementById('left').offsetHeight;
+			this.h1=height-344;
+			this.h2=height-358;
+			this.h3=height-108;
+			this.h4=height-234;
+			this.h5=height-168;
+			this.h6=height-72;
+			this.$nextTick(()=>{
+				var myChart1 = this.$echarts.init(this.$refs.ManagerSAwardChart);
+				myChart1.resize();
+			})
+		},
+		timeFormate(timeStamp) {
+			let year = new Date(timeStamp).getFullYear();
+			let month = new Date(timeStamp).getMonth() + 1 < 10 ? '0' + (new Date(timeStamp).getMonth() + 1) : new Date(timeStamp).getMonth() + 1;
+			let date = new Date(timeStamp).getDate() < 10 ? '0' + new Date(timeStamp).getDate() : new Date(timeStamp).getDate();
+			let hh = new Date(timeStamp).getHours() < 10 ? '0' + new Date(timeStamp).getHours() : new Date(timeStamp).getHours();
+			let mm = new Date(timeStamp).getMinutes() < 10 ? '0' + new Date(timeStamp).getMinutes() : new Date(timeStamp).getMinutes();
+			let ss = new Date(timeStamp).getSeconds() < 10 ? '0' + new Date(timeStamp).getSeconds() : new Date(timeStamp).getSeconds();
+			let week = new Date(timeStamp).getDay();
+			let weeks = ['日', '一', '二', '三', '四', '五', '六'];
+			let getWeek = '星期' + weeks[week];
+			this.nowTime = year + '年' + month + '月' + date + '日' + ' ' + hh + ':' + mm + ':' + ss + ' ' + getWeek;
+		}, // 实时刷新当前时间,格式化
+		nowTimes() {
+			this.timeFormate(new Date());
+			setInterval(this.nowTimes, 1000);
+			this.clear();
+		},
+		clear() {
+			clearInterval(this.nowTimes);
+			this.nowTimes = null;
+		},
+		fullScreen(){
+			if(this.isDp){
+				this.exitScreen();
+				this.isDp=false;
+				return false
+			}
+			this.isDp=true;
+			var el = document.documentElement;
+			var rfs = el.requestFullScreen || el.webkitRequestFullScreen || el.mozRequestFullScreen || el.msRequestFullscreen;      
+				if(typeof rfs != "undefined" && rfs) {
+					rfs.call(el);
+				};
+			  return;
+		},
+		exitScreen(){
+			if (document.exitFullscreen) {  
+				document.exitFullscreen();  
+			}  
+			else if (document.mozCancelFullScreen) {  
+				document.mozCancelFullScreen();  
+			}  
+			else if (document.webkitCancelFullScreen) {  
+				document.webkitCancelFullScreen();  
+			}  
+			else if (document.msExitFullscreen) {  
+				document.msExitFullscreen();  
+			} 
+			if(typeof cfs != "undefined" && cfs) {
+				cfs.call(el);
+			}
+		},
+		returnEvent(list) {
+			return list;
+		},
+		ranking(arr, index) {
+			if (index == 1) {
+				return arr.filter(item => {
+					return item.rank < 4;
+				});
+			} else {
+				return arr.filter(item => {
+					return item.rank >= 4;
+				});
+			}
+		},
+	},
+	beforeDestroy() {
+		window.removeEventListener('resize', this.selfAdaption); //取消echarts自适应
+		this.clear();
+	}
+};
+</script>
+
+<style scoped>
+.back{
+	background-image: url('assets/image/shuju.jpg');
+	background-position: center center;
+	background-size: cover;
+	background-repeat: no-repeat;
+}	
+.da{
+	font-size: 20px;
+	font-weight: 700;
+}	
+.index2 img{
+	width: 1.4rem !important;
+	height: 1.4rem !important;
+}	
+.data-all{
+	text-align: center;
+}	
+ html,body{
+	  height: 100%;
+ }
+.barg {
+	position: absolute;
+}
+.barg div {
+	width: 1.4rem;
+	height: 2.8rem;
+	background-color: #1d2242;
+	margin: 0 1rem;
+	top: ;
+}
+.boxTitle {
+	padding: 0.6rem 1.4rem;
+	color: #fff;
+	font-size: 22px;
+	position: relative;
+	background-color: #16215F;
+	display: inline-block;
+	border-radius: 25px;
+	margin-left: 16px;
+	padding-left: 50px;
+	margin-top: 30px;
+	box-shadow: 2px 0px 2px #ccc;
+}
+.boxTitle::before {
+	content: ' ';
+	position: absolute;
+	height: 18px;
+	width: 18px;
+	background-color: #F8E908;
+	border-radius: 25px;
+	top: 16px;
+	left: 20px;
+}
+.boxTitle::after {
+	content: ' ';
+	position: absolute;
+	height: 3px;
+	width: 150px;
+	background-color: #03F4FD;
+	top: -20px;
+	left: 0px;
+	border-radius: 2px;
+}
+
+.boxTitle2 {
+	padding:0.4rem 0.8rem;
+	color: #fff;
+	font-size: 14px;
+	position: relative;
+	background-color: #16215F;
+	display: inline-block;
+	border-radius: 25px;
+	margin-left: 10px;
+	padding-left: 30px;
+	margin-top: 20px;
+	box-shadow: 2px 0px 2px #ccc;
+}
+.boxTitle2::before {
+	content: ' ';
+	position: absolute;
+	height: 12px;
+	width: 12px;
+	background-color: #F8E908;
+	border-radius: 25px;
+	top: 10px;
+	left: 10px;
+}
+.boxTitle2::after {
+	content: ' ';
+	position: absolute;
+	height: 3px;
+	width: 120px;
+	background-color: #03F4FD;
+	top: -14px;
+	left: 0px;
+	border-radius: 2px;
+}
+.chart {
+	height: 480px;
+}
+.main-right {
+	margin-left: 5px;
+}
+.main-right .name {
+	font-size: 18px;
+	color: #0DD3DB;
+}
+.main-right .context {
+	overflow: hidden;
+	text-overflow: ellipsis;
+	display: -webkit-box;
+	-webkit-line-clamp: 2;
+	-webkit-box-orient: vertical;
+	font-size: 20px;
+	height: 50px;
+	margin-bottom: 6px;
+}
+.main-right2 .date {
+	color: #909399;
+}
+.main-right2 {
+	margin-left: 5px;
+}
+.main-right2 .name {
+	font-size: 14px;
+	color: #0DD3DB;
+}
+.main-right2 .context {
+	overflow: hidden;
+	text-overflow: ellipsis;
+	display: -webkit-box;
+	-webkit-line-clamp: 2;
+	-webkit-box-orient: vertical;
+	height: 40px;
+	font-size: 16px;
+	margin-bottom: 5px;
+}
+.main-right .date {
+	color: #909399;
+}
+.numBox .flex-1 {
+	height: 13rem;
+	text-align: center;
+	color: #fff;
+	padding: 0.8rem;
+}
+.seamless-warp {
+	/* padding: 10px; */
+	overflow: hidden;
+}
+.num {
+	font-size: 24px;
+	font-weight: 700;
+	color: #9ecef8;
+}
+.ranking {
+	/* height: 100%; */
+}
+.rankingItem {
+	color: #fff;
+	border-radius: 8px;
+	padding: 10px;
+}
+.rankingItem img {
+	width: 30px;
+	height: 30px;
+}
+.el-icon-help {
+	font-size: 26px;
+	margin-left: 10px;
+}
+.logo {
+	width: 2.1rem;
+	height: 2.1rem;
+	margin-right: 10px;
+	border-radius: 3px;
+}
+.box {
+	background-color: rgba(23, 30, 72, 0.6);
+	border-radius: 8px;
+	height: 100%;
+}
+.screenBox {
+	width: 100%;
+	height: 100%;
+	min-width: 1000px;
+}
+.zhuColor {
+	background-color: #021D3B;
+	box-shadow: 0px 2px 2px #01EEFE;
+	position: relative;
+	color: #fff;
+}
+.title span {
+	color: #fff;
+	font-size: 1.8rem;
+	font-weight: 550;
+	position: relative;
+	top: -1.8rem;
+}
+.title::after {
+	content: ' ';
+	position: absolute;
+	top: 0px;
+	right: -15px;
+	border-width: 20px 15px;
+	border-style: solid;
+	border-color: transparent transparent #021D3B transparent;
+	transform: rotate(180deg);
+}
+.title::before {
+	content: ' ';
+	position: absolute;
+	top: 0px;
+	left: -15px;
+	border-width: 20px 15px;
+	border-style: solid;
+	transform: rotate(180deg);
+	border-color: transparent transparent #021D3B transparent;
+}
+.title2 span {
+	color: #fff;
+	font-size: 2rem;
+	font-weight: 550;
+	position: relative;
+	top: -2.1rem;
+}
+.title2::after {
+	content: ' ';
+	position: absolute;
+	top: 0px;
+	right: -7px;
+	border-width: 14px 7px;
+	border-style: solid;
+	border-color: transparent transparent #021D3B transparent;
+	transform: rotate(180deg);
+}
+.title2::before {
+	content: ' ';
+	position: absolute;
+	top: 0px;
+	left: -7px;
+	border-width: 14px 7px;
+	border-style: solid;
+	transform: rotate(180deg);
+	border-color: transparent transparent #021D3B transparent;
+}
+</style>

+ 235 - 22
src/views/abPoint/apply_list.vue

@@ -4,16 +4,18 @@
 			<el-tab-pane label="待审批" name="waiting"></el-tab-pane>
 			<el-tab-pane label="申请通过" name="complete"></el-tab-pane>
 			<el-tab-pane label="被驳回" name="refuse"></el-tab-pane>
+			<el-tab-pane label="已复核" name="review"></el-tab-pane>
 		</el-tabs>
 
-		<el-row style="margin-bottom: 15px;">
-			<el-col :span="12"><el-button type="primary" @click="dialogVisible = true">申请积分</el-button></el-col>
-			<el-col :span="6" :offset="6">
-				<el-input v-model="formData.keyword" placeholder="输入申请内容" @keyup.enter.native="searchFun">
-					<el-button slot="append" @click="searchFun" size="medium" icon="el-icon-search"></el-button>
-				</el-input>
-			</el-col>
-		</el-row>
+		<div class="flex-box-ce" style="margin-bottom: 15px;">
+			<div class="flex-1">
+				<el-button type="primary" @click="dialogVisible = true">申请积分</el-button>
+				<span class="yellow" style="padding-left: 10px;" v-if="config.event_review_status&&config.event_apply_review">复核开启后,积分需管理员复核后才计入排名和统计</span>
+			</div>
+			<el-input style="width: 250px;" v-model="formData.keyword" placeholder="输入申请内容" @keyup.enter.native="searchFun">
+				<el-button slot="append" @click="searchFun" size="medium" icon="el-icon-search"></el-button>
+			</el-input>
+		</div>
 
 		<el-table :data="dataList" stripe fit v-loading="table_loading" v-if="tabs == 'complete'" @row-click="openDetail">
 			<el-table-column label="申请内容" prop="remark">
@@ -53,17 +55,12 @@
 			</el-table-column>
 			<el-table-column label="时间" prop="event_time" width="150"></el-table-column>
 			<template slot="empty">
-				<div class="nopoint_box" v-if="!formData.keyword">
-					<div class="noimg"></div>
-					<span class="title">
-						你还没有申请积分 现在
-						<el-button type="text" @click="dialogVisible = true">申请积分</el-button>
+				<template slot-scope="scope">
+					<span :class="{ green: scope.row.review_point < 0, red: scope.row.review_point > 0 }">
+						<span v-show="scope.row.review_point > 0">+</span>
+						{{ scope.row.review_point }} {{ scope.row.pt_id == 3 ? 'B分' : scope.row.pt_id == 2 ? 'A分' : scope.row.pt_id == 1 ? '绩效分' : '' }}
 					</span>
-				</div>
-				<div class="nopoint_box" v-else>
-					<div class="noimg"></div>
-					<span class="title">暂无数据</span>
-				</div>
+				</template>
 			</template>
 		</el-table>
 
@@ -88,6 +85,27 @@
 				</div>
 			</template>
 		</el-table>
+		
+		<el-table :data="dataList" stripe fit v-loading="table_loading" v-show="tabs == 'review'" @row-click="open_detail">
+			<el-table-column label="申请内容" prop="remark">
+				<template slot-scope="scope">
+					{{ scope.row.remark.customize || scope.row.remark.rule }}
+				</template>
+			</el-table-column>
+			<el-table-column label="积分" prop="point" width="120">
+				<template slot-scope="scope">
+					<span :class="{ green: scope.row.point < 0, red: scope.row.point > 0 }">
+						<span v-show="scope.row.point > 0">+</span>
+						{{ scope.row.point }} {{ scope.row.pt_id == 3 ? 'B分' : scope.row.pt_id == 2 ? 'A分' : scope.row.pt_id == 1 ? '绩效分' : '' }}
+					</span>
+				</template>
+			</el-table-column>
+			<el-table-column label="时间" prop="event_time" width="150">
+				<template slot-scope="scope">
+					{{$moment.unix(scope.row.event_time).format('YYYY-MM-DD')}}
+				</template>
+			</el-table-column>
+		</el-table>
 
 		<center style="margin-top: 15px;">
 			<el-pagination
@@ -171,13 +189,144 @@
 				</div>
 			</div>
 		</el-drawer>
-
+		
+		
+		<el-drawer title="事件详情" :visible.sync="detail_popup" ref="drawer" :with-header="false" :width="'500px'" direction="rtl">
+			<div class="drawer_title">事件详情</div>
+			<div class="detail_popup" v-loading="detail_loading" v-if="detail_info2 !== null">
+				<el-row style="padding-bottom:10px;border-bottom:1px #f8f8f8 solid;">
+					<div class="flex-box flex-v-ce">
+						<userImage :user_name="detail_info2.employee_name" :img_url="detail_info2.img_url" width="50px" height="50px" fontSize="1"></userImage>
+						<span style="font-size: 18px;line-height:50px; margin-left:10px;margin-right:4px;">{{ detail_info2.employee_name }}</span>
+						<span class="red point" v-show="detail_info2.point >= 0">+{{ detail_info2.point }} {{ point_name(detail_info2.pt_id) }}</span>
+						<span class="green point" v-show="detail_info2.point < 0">{{ detail_info2.point }} {{ point_name(detail_info2.pt_id) }}</span>
+					</div>
+				</el-row>
+		
+				<el-row v-show="detail_info2.rule_list">
+					<el-col :span="6">任务描述</el-col>
+					<el-col :span="18" v-if="detail_info2.remark">{{ detail_info2.remark && (detail_info2.remark.customize || detail_info2.remark.rule) }}</el-col>
+				</el-row>
+		
+				<el-row v-show="detail_info2.files && detail_info2.files.length > 0">
+					<el-col :span="18" :offset="6">
+						<el-image
+							v-for="(itme, index) in detail_info2.files"
+							:key="index"
+							style="width: 80px; height: 80px;margin: 0 5px;"
+							:src="itme"
+							:preview-src-list="detail_info2.files"
+						></el-image>
+					</el-col>
+				</el-row>
+		
+				<el-row v-show="detail_info2.rule_list">
+					<el-col :span="6">规则分类</el-col>
+					<el-col :span="18">{{ detail_info2.rule_list }}</el-col>
+				</el-row>
+		
+				<el-row v-show="detail_info2.source_type_mark">
+					<el-col :span="6">来源类型</el-col>
+					<el-col :span="18">{{ detail_info2.source_type_mark }}</el-col>
+				</el-row>
+		
+				<el-row v-show="detail_info2.recorder_name">
+					<el-col :span="6">记录人</el-col>
+					<el-col :span="18">{{ detail_info2.recorder_name }}</el-col>
+				</el-row>
+		
+				<el-row v-show="detail_info2.date">
+					<el-col :span="6">事件时间</el-col>
+					<el-col :span="18">{{ detail_info2.date }}</el-col>
+				</el-row>
+		
+				<el-row v-show="detail_info2.complete_task.time">
+					<el-col :span="6">完成时间</el-col>
+					<el-col :span="18">{{ detail_info2.complete_task.time }}</el-col>
+				</el-row>
+		
+				<el-row v-show="detail_info2.complete_task.remark">
+					<el-col :span="6">完成备注</el-col>
+					<el-col :span="18">{{ detail_info2.complete_task.remark }}</el-col>
+				</el-row>
+		
+				<el-row v-show="detail_info2.complete_task && detail_info2.complete_task.files && detail_info2.complete_task.files.length > 0">
+					<el-col :span="18" :offset="6">
+						<el-image
+							v-for="(itme, index) in detail_info2.complete_task.files"
+							:key="index"
+							style="width: 80px; height: 80px;margin: 0 5px;"
+							:src="itme"
+							:preview-src-list="detail_info2.complete_task.files"
+						></el-image>
+					</el-col>
+				</el-row>
+		
+				<div v-show="detail_info2.rule_id">
+					<p class="row_title">规则依据</p>
+					<el-row>
+						<el-col :span="6">规则分类</el-col>
+						<el-col :span="18">{{ detail_info2.rule_list }}</el-col>
+					</el-row>
+					<el-row v-show="detail_info2.remark.rule">
+						<el-col :span="6">积分规则</el-col>
+						<el-col :span="18">{{ detail_info2.remark.rule }}</el-col>
+					</el-row>
+					<el-row>
+						<el-col :span="6">积分</el-col>
+						<el-col :span="18" v-show="detail_info2.rule_item.min_point == detail_info2.rule_item.max_point">{{ detail_info2.rule_item.min_point }}</el-col>
+						<el-col :span="18" v-show="detail_info2.rule_item.min_point != detail_info2.rule_item.max_point">
+							{{ detail_info2.rule_item.min_point }} ~ {{ detail_info2.rule_item.max_point }}
+						</el-col>
+					</el-row>
+				</div>
+				<div v-show="detail_info2.process"><Steps :process="detail_info2.process"></Steps></div>
+				<div v-show="detail_info2.dc_remark.flow"><Review :process="detail_info2.dc_remark.flow" :status="detail_info2.dc_status"></Review></div>
+				<div style="text-align: center;margin-top: 30px;" v-if="detail_info2.source_type == 10 && see_log">
+					<el-button type="primary" size="medium" @click="showLog = true">
+						查看日志详情内容
+						<span style=";padding-left:5px;">»</span>
+					</el-button>
+				</div>
+			</div>
+			<div v-if="!this.$authoritys('employee') && !this.$authoritys('dept_manager')" style="position: absolute; bottom: 20px; display: block; right: 20px;">
+				<el-button @click="detail_popup=false">取消</el-button>
+				<el-button type="danger" @click="del_integral_event(detail_info2)">删除</el-button>
+			</div>
+		</el-drawer>
+		
+		<el-dialog title="查看日志详情" width="600px" :visible.sync="showLog">
+			<div class="title">{{ ding_report.creator_name }}的{{ ding_report.template_name }}</div>
+			<div v-if="ding_report.contents.length > 0">
+				<div class="contents" v-for="(item, index) in ding_report.contents" :key="index">
+					<div class="key">{{ item.key }}</div>
+					<div class="value fontColorF">
+						<span v-if="item.value">{{ item.value }}</span>
+						<span v-else>未填写</span>
+					</div>
+				</div>
+			</div>
+			<div v-if="ding_report.images.length > 0">
+				<div class="key" style="margin-bottom: 20px;">图片</div>
+				<div class="flex-box flex-d-wrap">
+					<el-image
+						v-for="(item, index) in ding_report.images"
+						:key="index"
+						style="width: 100px; height: 100px;margin-right:8px"
+						:src="item"
+						:preview-src-list="ding_report.images"
+					></el-image>
+				</div>
+			</div>
+		</el-dialog>
+		
 		<applicationIntegrationPopup title="申请积分" :isBreak="isBreak" :ruleOnoff="ruleOnoff" :visible.sync="dialogVisible" v-if="dialogVisible"></applicationIntegrationPopup>
 	</div>
 </template>
 
 <script>
 import moment from 'moment';
+import Review from '@/components/Review';
 import EmployeeSelector from '@/components/EmployeeSelector.vue';
 import applicationIntegrationPopup from '@/components/applicationIntegrationPopup';
 import Steps from '@/components/Steps'; 
@@ -209,13 +358,25 @@ export default {
 			userId: '',
 			cx_loading: false,
 			
+			detail_info2: null,
+			detail_popup: false,
+			
 			isBreak:false,//是否打开缓存的未完成奖扣
+			config:false,
+			// 查看日志
+			showLog: false,
+			see_log: 1,
+			ding_report: {
+				contents: [],
+				images: []
+			},
 		};
 	},
 	components: {
 		EmployeeSelector,
 		applicationIntegrationPopup,
-		Steps
+		Steps,
+		Review
 	},
 	watch: {
 		tabs(val) {
@@ -230,6 +391,7 @@ export default {
 	mounted() {
 		this.cheakAx()
 		this.userId = this.$getUserData().id;
+		this.config=this.$store.state.config;
 		this.get_list();
 		setTimeout(() => {
 			let apply_list=this.$getCache('apply_list')
@@ -242,6 +404,52 @@ export default {
 		}, 1000)
 	},
 	methods: {
+		del_integral_event(item) {
+			this.$confirm('删除事件的同时也会撤销积分,确定删除吗?', '提示', {
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type: 'warning'
+			}).then(() => {
+				this.$axios('post', '/api/integral/statistics/integral/destroy', { event_id: item.event_id }).then(res => {
+					if (res.data.code == 1) {
+						this.$message.success(res.data.msg);
+						this.detail_popup = false;
+						this.get_list();
+					} else {
+						this.$message.error(res.data.msg);
+					}
+				});
+			});
+		},
+		point_name(id) {
+			return this.point_types.find(item => {
+				if (item.id == id) {
+					return item.name;
+				}
+			}).name;
+		},
+		open_detail(item) {
+			this.detail_popup = true;
+			let data = {
+				event_id: item.id
+			};
+			this.detail_loading = true;
+			this.$axios('get', '/api/integral/statistics/integral/info', data)
+				.then(res => {
+					if (res.data.code == 1) {
+						this.detail_info2 = res.data.data;
+						var ding_report = res.data.data.remark.ding_report;
+						if (Object.keys(ding_report).length != 0) {
+							this.ding_report = res.data.data.remark.ding_report;
+						}
+					} else {
+						this.$message.error(res.data.data.msg);
+					}
+				})
+				.finally(() => {
+					this.detail_loading = false;
+				});
+		},
 		cheakAx() {
 			this.$axios('get', '/api/integral/site/config')
 				.then(res => {
@@ -294,11 +502,16 @@ export default {
 		},
 		get_list() {
 			this.table_loading = true;
-			this.$axios('get', '/api/integral/review/apply/list', this.formData)
+			let url=this.tabs=='review'? "/api/integral/statistics/event":'/api/integral/review/apply/list'
+			this.$axios('get', url, this.formData)
 				.then(res => {
 					if (res.data.code == 1) {
 						this.dataList = res.data.data.list;
-						this.total = res.data.data.total;
+						if(this.tabs=='review'){
+							this.total = res.data.data.count;
+						}else{
+							this.total = res.data.data.total;
+						}
 					}
 				})
 				.finally(() => {

+ 58 - 17
src/views/abPoint/award_punish.vue

@@ -5,18 +5,19 @@
 			<el-tab-pane label="待审批" name="waiting"></el-tab-pane>
 			<el-tab-pane label="被驳回" name="refuse"></el-tab-pane>
 		</el-tabs>
-		<el-row style="margin-bottom: 15px;">
-			<el-col :span="12">
+		<div class="flex-box-ce" style="margin-bottom: 15px;">
+			<div class="flex-1">
 				<el-button type="primary" @click="point_b">奖扣B分</el-button>
 				<el-button type="primary" @click="point_a" plain>奖扣A分</el-button>
-				<!-- <div class="red">未成功提交列表</div> -->
-			</el-col>
-			<el-col :span="6" :offset="6">
-				<el-input v-model="keyword" placeholder="输入同事姓名/内容" @keyup.enter.native="getData">
-					<el-button slot="append" @click="getData" icon="el-icon-search"></el-button>
-				</el-input>
-			</el-col>
-		</el-row>
+				<span class="yellow" style="padding-left: 10px;" v-if="config.event_review_status&&config.event_entry_review">复核开启后,积分需管理员复核后才计入排名和统计</span>
+			</div>
+			<div class="flex-box-ce">
+				<el-select  v-if="tabs=='success'" v-model="select_employee_id" filterable clearable placeholder="请输入或选择人员" style="width: 200px;margin-right: 10px;">
+					<el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
+				</el-select>
+				<el-input v-model="keyword" style="width: 200px;"  :placeholder="tabs=='success'?'输入内容':'输入员工姓名/事件内容'" ></el-input>
+			</div>
+		</div>
 
 		<el-table v-if="tabs == 'success'" res="table1" :data="dataList" stripe fit v-loading="table_loading" @row-click="open_detail">
 			<el-table-column label="姓名" prop="employee_id" align="left">
@@ -47,7 +48,8 @@
 			
 			<el-table-column label="奖扣时间" width="150">
 				<template slot-scope="scope">
-					{{ cuttString(scope.row.create_time) }}
+					{{scope.row.update_time}}
+					<!-- {{ cuttString(scope.row.create_time) }} -->
 				</template>
 			</el-table-column>
 			<template slot="empty">
@@ -129,9 +131,9 @@
 				  <el-col :span="20">{{ detail_info.source_type_mark }}</el-col>
 				</el-row>
 
-				<el-row :gutter="10" v-show="!detail_info.rule_id">
+				<el-row :gutter="10" v-show="detail_info.recorder_name">
 					<el-col :span="4">记录人</el-col>
-					<el-col :span="20">{{ detail_info.employee_name }}</el-col>
+					<el-col :span="20">{{ detail_info.recorder_name }}</el-col>
 				</el-row>
 
 				<el-row :gutter="10" :v-if="detail_info.files">
@@ -169,6 +171,9 @@
 				<div v-show="detail_info.process">
 					<Steps :process="detail_info.process"></Steps>
 				</div>
+				<template v-if="tabs == 'success'&&detail_info.dc_remark">
+					<div v-show="detail_info.dc_remark.flow"><Review :process="detail_info.dc_remark.flow" :status="detail_info.dc_status"></Review></div>
+				</template>
 				<div class="btn_danger flex-box flex-center-center" v-if="detail_info.process.length==1&&(detail_info.event_type==3||detail_info.event_type==4)">
 				  <el-button type="danger" class="danger" @click="revocation" :loading="cx_loading">撤销</el-button>
 				</div>
@@ -238,6 +243,9 @@
 				<div v-show="detail_info.process">
 					<Steps :process="detail_info.process"></Steps>
 				</div>
+<!-- 				<div v-if="detail_info.dc_remark.flow">
+					<Review :process="detail_info.dc_remark.flow" :status="detail_info.dc_status"></Review>
+				</div> -->
 				<div class="btn_danger flex-box flex-center-center" v-if="detail_info.applyor_id==userId&&detail_info.status==0&&detail_info.source_type==3">
 				  <el-button type="danger" class="danger" @click="revocation2" :loading="cx_loading">撤销</el-button>
 				</div>
@@ -254,6 +262,8 @@
 import EmployeeSelector from '@/components/EmployeeSelector.vue';
 import bonusPointsPopup from '@/components/bonusPointsPopup';
 import Steps from '@/components/Steps'; 
+import { _debounce } from '@/api/auth';
+import Review from '@/components/Review';
 import {getToken } from '@/api/auth';
 export default {
 	data() {
@@ -278,8 +288,11 @@ export default {
 			drawer: false,
 			detail_loading: false,
 			detail_info: {
-				process:[]
+				process:[],
+				dc_remark:{}
 			},
+			select_employee_id: '',
+			employee_map: [],
 			detailShow: false,
 			employee_name: this.$getCache('SET_EMPLOYEE_MAP'),
 			userId:'',
@@ -288,16 +301,23 @@ export default {
 			
 			// 长连接
 			isBreak:false,//是否打开缓存的未完成奖扣
+			
+			config:{},
 		};
 	},
 	components: {
 		EmployeeSelector,
 		bonusPointsPopup,
-		Steps
+		Steps,
+		Review
+	},
+	created() {
+		this.getEmployee();
 	},
 	mounted() {
 		this.cheakAx()
-		this.userId=this.$getUserData().id
+		this.userId=this.$getUserData().id,
+		this.config=this.$store.state.config;
 		this.getData()
 		setTimeout(() => {
 			let award_punish=this.$getCache('award_punish')
@@ -310,6 +330,17 @@ export default {
 		}, 1000)
 	},
 	watch: {
+		select_employee_id(){
+			this.formData.page = 1;
+			this.getData();
+		},
+		keyword: {
+			deep: true,
+			handler: _debounce(function(val) {
+				this.formData.page = 1;
+				this.getData();
+			}, 1000)
+		},
 		tabs(val) {
 			this.dataList = [];
 			this.dataList2 = [];
@@ -317,6 +348,7 @@ export default {
 			this.keyword = '';
 			this.formData.page = 1;
 			this.formData.page_size = 10;
+			
 			this.getData();
 		},
 		refreshData(val) {
@@ -324,6 +356,13 @@ export default {
 		}
 	},
 	methods: {
+		//获取员工列表
+		getEmployee() {
+			this.$axios('get', '/api/employee/index', { dept_id: 0, keywords: '', page: 1, page_size: 3000, is_official: 1 }).then(res => {
+				let list = res.data.data.list;
+				this.employee_map = list;
+			});
+		},
 		cheakAx() {
 			this.$axios('get', '/api/integral/site/config')
 				.then(res => {
@@ -462,7 +501,9 @@ export default {
 					page_size: this.formData.page_size,
 					recorder_id:this.userId,
 					source_type: '1',
-					keyword: this.keyword
+					keyword: this.keyword,
+					employee_ids: this.select_employee_id,
+					order_key:'update_time'
 				};
 			} else if (this.tabs == 'waiting') {
 				data = {

+ 4 - 3
src/views/common/rewardTask.vue

@@ -3,6 +3,7 @@
 		<!-- 悬赏任务弹窗 -->
 		<el-dialog :title="showTitle" :visible.sync="dialogVisible" :close-on-click-modal="false" :before-close="closeDialog" width="600px" top="3%">
 			<div v-loading="forTheTaskLoading">
+				<div class="yellow" style="text-align: center;padding-bottom: 10px;" v-if="config.event_review_status&&config.event_task_review">复核开启后,积分需管理员复核后才计入排名和统计</div>
 				<el-form :model="formData" ref="formData" label-width="80px">
 					<el-form-item
 						label="任务内容"
@@ -385,7 +386,8 @@ export default {
 			dept_not_select: [],
 			dept_employee_list: [],
 			dept_selected: { dept: [], employee: [] },
-			show_employee_selector: false
+			show_employee_selector: false,
+			config:{},
 		};
 	},
 	components: { EmployeeSelector, upload },
@@ -425,13 +427,13 @@ export default {
 		}
 	},
 	mounted() {
+		this.config=this.$store.state.config;
 		this.point_types = this.$getCache('types');
 		this.getDepartment();
 	},
 	methods: {
 		// 规则分类变化关闭dewn
 		ruleChange(value) {
-			console.log(value)
 			const item = this.formData;
 			if (value.length > 0) {
 				item.rule_id = value[value.length - 1];
@@ -506,7 +508,6 @@ export default {
 			this.formData.tree_echo = [],
 			this.reviewer_selected = { dept: [], employee: [] };
 			this.dept_selected = { dept: [], employee: [] };
-			console.log(this.formData)
 		},
 		ahead_timeout(item, arr, codes, code) {
 			if (item) {

+ 4 - 1
src/views/common/rewardTaskAmend.vue

@@ -3,6 +3,7 @@
 		<!-- 悬赏任务弹窗 -->
 		<el-dialog :title="showTitle" :visible.sync="dialogVisible" :close-on-click-modal="false" :before-close="closeDialog" width="600px" top="5%">
 			<div v-loading="forTheTaskLoading">
+				<div class="yellow" style="text-align: center;padding-bottom: 10px;" v-if="config.event_review_status&&config.event_task_review">复核开启后,积分需管理员复核后才计入排名和统计</div>
 				<el-form :model="formData" ref="formData" label-width="80px">
 					<el-form-item
 						label="任务内容"
@@ -344,7 +345,8 @@ export default {
 			chapterArr: [],
 
 			oneruleId: [],
-			echoGather: []
+			echoGather: [],
+			config:{},
 		};
 	},
 	components: { EmployeeSelector, upload },
@@ -419,6 +421,7 @@ export default {
 		}
 	},
 	mounted() {
+		this.config=this.$store.state.config;
 		this.point_types = this.$getCache('types');
 		this.getDepartment();
 	},

+ 3 - 3
src/views/common/taskDetailsPopup.vue

@@ -117,7 +117,7 @@
 					<div class="d_progress">
 						<div class="flex-box ">
 							<div class="flex-1">工作进度({{ workDetailData.progress }}%)</div>
-            				<div class="fontColorF addJf" @click="sliderShow" v-if="workDetailData.employee_id == userId && workDetailData.status==1">+更新进度</div>
+            				<div class="addJf blue" @click="sliderShow" v-if="workDetailData.employee_id == userId && workDetailData.status==1">+更新进度</div>
 						</div>
 						<el-progress :percentage="workDetailData.progress"></el-progress>
 					</div>
@@ -126,7 +126,7 @@
 							<el-tab-pane label="工作记录" name="work">
 								<div class="flex-box">
 									<div class="flex-1"></div>
-									<div class="fontColorF addJf" @click="isOne = true" v-if="workDetailData.employee_id == userId && workDetailData.status < 3 ">+记一条工作记录</div>
+									<div class="addJf blue" @click="isOne = true" v-if="workDetailData.employee_id == userId && workDetailData.status < 3 ">+记一条工作记录</div>
 								</div>
 								<div class="work_box" style="padding-top:10px">
 									<div class="work_item" v-for="(item, index) in text_list" :key="index" style="margin: 0 0 15px 0">
@@ -153,7 +153,7 @@
 										<span v-if="point_total > 0">合计:+{{ point_total }}</span>
 										<span v-else>合计:{{ point_total }}</span>
 									</div>
-            						<div class="fontColorF addJf" @click="isIntegral = true" v-if="keepTheScore">+记分</div>
+            						<div class="addJf blue" @click="isIntegral = true" v-if="keepTheScore">+记分</div>
 								</div>
 								<div class="work_box" style="padding-top:10px">
 									<div class="work_item" v-for="(item, index) in point_list" :key="index" style="margin: 0 0 15px 0">

+ 14 - 3
src/views/common/temporaryTask.vue

@@ -3,6 +3,7 @@
 		<!-- 临时任务弹窗 -->
 		<el-dialog :title="showTitle" :visible.sync="dialogVisible" :close-on-click-modal="false" :before-close="closeDialog" width="600px" top="3%">
 			<div>
+				<div class="yellow" style="text-align: center;padding-bottom: 10px;" v-if="config.event_review_status&&config.event_task_review">复核开启后,积分需管理员复核后才计入排名和统计</div>
 				<el-form :model="formData" ref="formData" label-width="80px" v-loading="taskload">
 					<el-form-item
 						label="任务内容"
@@ -369,7 +370,8 @@ export default {
 				{ name: '29号', value: 29 },
 				{ name: '30号', value: 30 },
 				{ name: '31号', value: 31 }
-			]
+			],
+			config:{},
 		};
 	},
 	components: { EmployeeSelector, upload },
@@ -408,6 +410,7 @@ export default {
 		}
 	},
 	mounted() {
+		this.config=this.$store.state.config;
 		this.point_types = this.$getCache('types');
 	},
 	methods: {
@@ -439,7 +442,6 @@ export default {
 		},
 		// 规则分类变化关闭dewn
 		ruleChange(value) {
-			console.log(value)
 			const item = this.formData;
 			if (value.length > 0) {
 				item.rule_id = value[value.length - 1];
@@ -586,7 +588,11 @@ export default {
 					if (res.data.code == 1) {
 						this.$parent.get_list();
 						this.resetForm('formData');
-						self.$message.success(res.data.msg);
+						let msg=res.data.msg;
+						if(this.config.event_review_status&&this.config.event_task_review){
+							msg+='复核开启后,积分需管理员复核后才计入排名和统计'
+						}
+						self.$message.success(msg);
 					} else {
 						self.$message.error(res.data.msg);
 					}
@@ -627,3 +633,8 @@ export default {
 	}
 };
 </script>
+<style scoped lang="scss">
+	::v-deep .el-dialog__body{
+		padding: 20px;
+	}
+</style>

+ 9 - 2
src/views/common/temporaryTaskAmend.vue

@@ -3,6 +3,7 @@
 		<!-- 临时任务弹窗 -->
 		<el-dialog :title="showTitle" :visible.sync="dialogVisible" :close-on-click-modal="false" :before-close="closeDialog" width="600px" top="5%">
 			<div>
+				<div class="yellow" style="text-align: center;padding-bottom: 10px;" v-if="config.event_review_status&&config.event_task_review">复核开启后,积分需管理员复核后才计入排名和统计</div>
 				<el-form :model="formData" ref="formData" label-width="80px" v-loading="taskload">
 					<el-form-item
 						label="任务内容"
@@ -344,7 +345,8 @@ export default {
 				{ name: '29号', value: 29 },
 				{ name: '30号', value: 30 },
 				{ name: '31号', value: 31 }
-			]
+			],
+			config:{},
 		};
 	},
 	components: { EmployeeSelector, upload },
@@ -363,6 +365,7 @@ export default {
 		},
 	},
 	mounted() {
+		this.config=this.$store.state.config;
 		this.point_types = this.$getCache('types');
 	},
 	methods: {
@@ -578,7 +581,11 @@ export default {
 					if (res.data.code == 1) {
 						this.$parent.get_list();
 						this.resetForm('formData')
-						self.$message.success(res.data.msg);
+						let msg=res.data.msg;
+						if(this.config.event_review_status&&this.config.event_task_review){
+							msg+='复核开启后,积分需管理员复核后才计入排名和统计'
+						}
+						self.$message.success(msg);
 					} else {
 						self.$message.error(res.data.msg);
 					}

+ 570 - 0
src/views/ranking/JfDetail.vue

@@ -0,0 +1,570 @@
+<template>
+	<div>
+		<div class="all padding-20">
+			<header class="flex-box-ce" style="padding-bottom: 20px;">
+				<div style="padding-right: 20px;" class="fh" @click="$router.go(-1)">返回</div>
+				<div>{{ userInfo.name }}的积分明细</div>
+			</header>
+			<div class="flex-box-ce" style="padding: 20px;">
+				<userImage :user_name="userInfo.name" :img_url="userInfo.img_url" width="50px" height="50px"></userImage>
+				<div style="padding-left: 10px;" class="flex-1">
+					<div style="font-weight: 700;font-size: 18px;margin-bottom: 5px;">{{ userInfo.name }}</div>
+					<div class="flex-box-ce fontColorF">
+						<div v-for="(item, index) in userInfo.dept_list" :key="index">{{ item.dept_name }}<span v-if="userInfo.dept_list.length-index>1"> , </span></div>
+					</div>
+				</div>
+				<el-select class="date-picker-width" size="medium" v-model="formData.source_type2" placeholder="全部">
+					<el-option v-for="item in source_type" :key="item.id" :label="item.name" :value="item.id"></el-option>
+				</el-select>
+			</div>
+			<div class="diy-tip1" style="margin-bottom: 10px;">
+				<div v-if="type==1||type==3">分值:<span class="blue">{{point}}</span> (当前明细不包含基础分和工龄分)</div>
+				<div v-if="type==2">总分:<span class="blue">{{point}}</span> (包含基础分<span class="blue">{{base_point}}</span>,工龄分<span class="blue">{{service_point}}</span>)</div>
+			</div>
+			<!-- 表格 -->
+			<div>
+				<el-table :data="list" style="width: 100%;cursor: pointer;" v-loading="loading" @row-click="open_detail">
+					<el-table-column prop="employee_name" label="姓名" align="left" min-width="125px">
+						<template slot-scope="scope">
+							<div class="flex-box">
+								<userImage :user_name="scope.row.employee_name" :img_url="scope.row.employee_img_url" width="50px" height="50px"></userImage>
+								<span style="line-height: 50px; padding-left: 10px;">{{ scope.row.employee_name }}</span>
+							</div>
+						</template>
+					</el-table-column>
+					<el-table-column prop="dept" show-overflow-tooltip label="部门" align="left" min-width="120px"></el-table-column>
+					<el-table-column prop="point" label="积分" align="left" min-width="120px">
+						<template slot-scope="scope">
+							<span :class="scope.row.point < 0 ? 'green' : 'red'">{{ scope.row.point }} {{ point_name(scope.row.pt_id) }}</span>
+						</template>
+					</el-table-column>
+					<el-table-column prop="remark" label="事件内容" align="left" min-width="280px">
+						<template slot-scope="scope">
+							<el-tooltip class="item" effect="dark" placement="top">
+								<div slot="content" style="width: 400px;">{{ scope.row.remark }}</div>
+								<div class="remark">{{ scope.row.remark }}</div>
+							</el-tooltip>
+						</template>
+					</el-table-column>
+					<el-table-column prop="rule_name" show-overflow-tooltip label="规则分类" align="left" min-width="140px"></el-table-column>
+					<el-table-column prop="create_time" label="事件发生时间" align="left" min-width="140px">
+						<template slot-scope="scope">
+							{{ scope.row.event_time }}
+						</template>
+					</el-table-column>
+					<el-table-column prop="source_type" label="来源" align="left" min-width="140px">
+						<template slot-scope="scope">
+							<span v-show="scope.row.source_type == 1">
+								积分奖扣
+								<span v-if="scope.row.recorder_name">({{ scope.row.recorder_name }})</span>
+							</span>
+							<span v-show="scope.row.source_type == 2">任务</span>
+							<span v-show="scope.row.source_type == 3">积分系统分配</span>
+							<span v-show="scope.row.source_type == 4">考勤系统分配</span>
+							<span v-show="scope.row.source_type == 5">
+								积分申请
+								<span v-if="scope.row.applyor_name">({{ scope.row.applyor_name }})</span>
+							</span>
+							<span v-show="scope.row.source_type == 6">绩效任务包</span>
+							<span v-show="scope.row.source_type == 8">积分导入</span>
+							<span v-show="scope.row.source_type == 9">A分转B分</span>
+							<span v-show="scope.row.source_type == 10">钉钉汇报(日志)奖扣分</span>
+							<span v-show="scope.row.source_type > 10">其他</span>
+						</template>
+					</el-table-column>
+					<el-table-column prop="update_time" label="录入时间" align="left" width="140px">
+						<template slot-scope="scope">
+							<!-- {{ cuttString(scope.row.create_time) }} -->
+							{{ scope.row.update_time }}
+						</template>
+					</el-table-column>
+
+					<template slot="empty">
+						<noData></noData>
+					</template>
+				</el-table>
+				<center class="pagination">
+					<el-pagination
+						background
+						@size-change="handleSizeChange"
+						@current-change="handleCurrentChange"
+						:current-page="formData.page"
+						:page-sizes="[10, 20, 50, 100]"
+						layout="total, sizes, prev, pager, next"
+						:page-size="pageLimit"
+						:total="total"
+					></el-pagination>
+				</center>
+			</div>
+		</div>
+		<el-drawer title="事件详情" :visible.sync="detail_popup" ref="drawer" :with-header="false" :width="'500px'" direction="rtl">
+			<div class="drawer_title">事件详情</div>
+			<div class="detail_popup" v-loading="detail_loading" v-if="detail_info !== null">
+				<el-row style="padding-bottom:10px;border-bottom:1px #f8f8f8 solid;">
+					<div class="flex-box flex-v-ce">
+						<userImage :user_name="detail_info.employee_name" width="50px" height="50px" fontSize="1"></userImage>
+						<span style="font-size: 18px;line-height:50px; margin-left:10px;margin-right:4px;">{{ detail_info.employee_name }}</span>
+						<span class="red point" v-show="detail_info.point >= 0">+{{ detail_info.point }} {{ point_name(detail_info.pt_id) }}</span>
+						<span class="green point" v-show="detail_info.point < 0">{{ detail_info.point }} {{ point_name(detail_info.pt_id) }}</span>
+					</div>
+				</el-row>
+
+				<el-row v-show="detail_info.rule_list">
+					<el-col :span="6">任务描述</el-col>
+					<el-col :span="18" v-if="detail_info.remark">{{ detail_info.remark && (detail_info.remark.customize || detail_info.remark.rule) }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.files && detail_info.files.length > 0">
+					<el-col :span="18" :offset="6">
+						<el-image
+							v-for="(itme, index) in detail_info.files"
+							:key="index"
+							style="width: 80px; height: 80px;margin: 0 5px;"
+							:src="itme"
+							:preview-src-list="detail_info.files"
+						></el-image>
+					</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.rule_list">
+					<el-col :span="6">规则分类</el-col>
+					<el-col :span="18">{{ detail_info.rule_list }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.source_type_mark">
+					<el-col :span="6">来源类型</el-col>
+					<el-col :span="18">{{ detail_info.source_type_mark }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.recorder_name">
+					<el-col :span="6">记录人</el-col>
+					<el-col :span="18">{{ detail_info.recorder_name }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.date">
+					<el-col :span="6">事件时间</el-col>
+					<el-col :span="18">{{ detail_info.date }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.complete_task.time">
+					<el-col :span="6">完成时间</el-col>
+					<el-col :span="18">{{ detail_info.complete_task.time }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.complete_task.remark">
+					<el-col :span="6">完成备注</el-col>
+					<el-col :span="18">{{ detail_info.complete_task.remark }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.complete_task && detail_info.complete_task.files && detail_info.complete_task.files.length > 0">
+					<el-col :span="18" :offset="6">
+						<el-image
+							v-for="(itme, index) in detail_info.complete_task.files"
+							:key="index"
+							style="width: 80px; height: 80px;margin: 0 5px;"
+							:src="itme"
+							:preview-src-list="detail_info.complete_task.files"
+						></el-image>
+					</el-col>
+				</el-row>
+
+				<div v-show="detail_info.rule_id">
+					<p class="row_title">规则依据</p>
+					<el-row>
+						<el-col :span="6">规则分类</el-col>
+						<el-col :span="18">{{ detail_info.rule_list }}</el-col>
+					</el-row>
+					<el-row v-show="detail_info.remark.rule">
+						<el-col :span="6">积分规则</el-col>
+						<el-col :span="18">{{ detail_info.remark.rule }}</el-col>
+					</el-row>
+					<el-row>
+						<el-col :span="6">积分</el-col>
+						<el-col :span="18" v-show="detail_info.rule_item.min_point == detail_info.rule_item.max_point">{{ detail_info.rule_item.min_point }}</el-col>
+						<el-col :span="18" v-show="detail_info.rule_item.min_point != detail_info.rule_item.max_point">
+							{{ detail_info.rule_item.min_point }} ~ {{ detail_info.rule_item.max_point }}
+						</el-col>
+					</el-row>
+				</div>
+				<div v-show="detail_info.process"><Steps :process="detail_info.process"></Steps></div>
+				<div v-show="detail_info.dc_remark.flow"><Review :process="detail_info.dc_remark.flow" :status="detail_info.dc_status"></Review></div>
+				<div style="text-align: center;margin-top: 30px;" v-if="detail_info.source_type == 10">
+					<el-button type="primary" size="medium" @click="showLog = true">
+						查看日志详情内容
+						<span style=";padding-left:5px;">»</span>
+					</el-button>
+				</div>
+			</div>
+			<div v-if="!this.$authoritys('employee') && !this.$authoritys('dept_manager')" style="position: absolute; bottom: 20px; display: block; right: 20px;">
+				<el-button @click="detail_popup=false">取消</el-button>
+				<!-- <el-button type="danger" @click="del_integral_event(detail_info)">删除</el-button> -->
+			</div>
+		</el-drawer>
+
+		<el-dialog title="查看日志详情" width="600px" :visible.sync="showLog">
+			<div class="title">{{ ding_report.creator_name }}的{{ ding_report.template_name }}</div>
+			<div v-if="ding_report.contents.length > 0">
+				<div class="contents" v-for="(item, index) in ding_report.contents" :key="index">
+					<div class="key">{{ item.key }}</div>
+					<div class="value fontColorF">
+						<span v-if="item.value">{{ item.value }}</span>
+						<span v-else>未填写</span>
+					</div>
+				</div>
+			</div>
+			<div v-if="ding_report.images.length > 0">
+				<div class="key" style="margin-bottom: 20px;">图片</div>
+				<div class="flex-box flex-d-wrap">
+					<el-image
+						v-for="(item, index) in ding_report.images"
+						:key="index"
+						style="width: 100px; height: 100px;margin-right:8px"
+						:src="item"
+						:preview-src-list="ding_report.images"
+					></el-image>
+				</div>
+			</div>
+		</el-dialog>
+	</div>
+</template>
+<script>
+import Steps from '@/components/Steps';
+import Review from '@/components/Review';
+import toLead from '@/components/toLead';
+export default {
+	name: 'JfDetail',
+	data() {
+		return {
+			userInfo: this.$getUserData(),
+			loading: false,
+			point_types: this.$getTyps(),
+			formData: {
+				page: 1,
+				page_size: 10,
+				dc_status:JSON.stringify([1]),
+				order_key:'create_time',
+				source_type2:0,
+				pt_id:3,
+			},
+			list: [],
+			total: null,
+			detail_info: null,
+			detail_popup: false,
+			detail_loading: false,
+			pageLimit: 10,
+			// 查看日志
+			showLog: false,
+			ding_report: {
+				contents: [],
+				images: []
+			},
+			source_type: [
+				{ id: 0, name: '按最新事件时间排序' },
+				{ id: 1, name: '按积分由高到低排序' },
+				{ id: 2, name: '按积分由低到高排序' },
+			],
+			
+			type:1,//判断那个列表进入  1阶段排名,2累计排名,3自定义排名
+			point:0,
+			base_point:0,//基础分
+			service_point:0 //工龄发
+		};
+	},
+	components: { Steps, toLead,Review },
+	created() {
+		this.type=this.$route.query.type;
+		if(this.$route.query.type==1){
+			let userInfo=JSON.parse(this.$route.query.userInfo);
+			this.point=userInfo.point;
+			this.userInfo={
+				name:userInfo.employee_name,
+				img_url:userInfo.employee_img_url,
+				dept_list:userInfo.dept_list
+			}
+			// console.log(this.$route.query)
+			let parameter=JSON.parse(this.$route.query.parameter);
+			this.formData.dept_ids=parameter.dept_id||0;//部门
+			this.formData.employee_ids=userInfo.employee_id//人员
+			this.formData.rule_id=parameter.rule||0//分类ID
+			this.formData.pt_id=parameter.pt_id//事件类型ID
+			this.formData.start_day = parameter.start_date
+			this.formData.end_day = parameter.end_date
+			
+		}else if(this.$route.query.type==2){
+			let userInfo=JSON.parse(this.$route.query.userInfo);
+			this.point=userInfo.point;
+			this.userInfo={
+				name:userInfo.employee_name,
+				img_url:userInfo.employee_img_url,
+				dept_list:userInfo.dept_list
+			}
+			this.formData.employee_ids=userInfo.employee_id//人员
+			this.getUserInfo(userInfo.employee_id);
+		}else{
+			let userInfo=JSON.parse(this.$route.query.userInfo);
+			console.log(this.$route.query)
+			this.point=userInfo.point;
+			this.userInfo=userInfo
+			this.formData.employee_ids=userInfo.employee_id//人员
+			this.formData.item_id=this.$route.query.items.length>0?this.$route.query.items.toString():0//人员
+			if(this.$route.query.dateType=='1'){
+				this.formData.month=this.$route.query.date//月
+			}else if(this.$route.query.dateType=='2'){//季度
+				this.formData.start_day = this.$route.query.start_date
+				this.formData.end_day = this.$route.query.end_date
+			}else{
+				this.formData.year=this.$route.query.date//年
+			}
+		}
+
+	},
+	mounted() {
+		this.get_integral_list();
+		this.point_types = this.getTypes();
+		document.getElementById('main').scrollTop = 0;
+	},
+	watch: {
+		'formData.source_type2'(val) {
+			this.formData.page = 1;
+			if(val==0){
+				this.formData.order_key='create_time'
+				this.formData.order_type='desc'
+			}
+			if(val==1){
+				this.formData.order_key='point'
+				this.formData.order_type='desc'
+			}
+			if(val==2){
+				this.formData.order_key='point'
+				this.formData.order_type='asc'
+			}
+			this.get_integral_list();
+		},
+		'formData.page'(val, old_val) {
+			
+			this.get_integral_list();
+		},
+	},
+	methods: {
+		getUserInfo(id){
+			this.$axios('get', '/api/employee/detail',{target:id}).then(res => {
+					this.base_point=res.data.data.user.site_config.base_point;//基础分
+					this.service_point=res.data.data.user.point_config.service_point //工龄发
+			})
+		},
+		getTypes() {
+			var arr = this.$getTyps();
+			return arr.filter(function(item) {
+				return item.code != 'JX';
+			});
+		},
+		// end 文件上传
+		handleSizeChange(val) {
+			this.pageLimit = val;
+			this.formData.page_size = this.pageLimit;
+			this.get_integral_list(this.formData);
+		},
+		open_detail(item) {
+			this.detail_popup = true;
+			let data = {
+				event_id: item.id
+			};
+			this.detail_loading = true;
+			this.$axios('get', '/api/integral/statistics/integral/info', data)
+				.then(res => {
+					if (res.data.code == 1) {
+						this.detail_info = res.data.data;
+						var ding_report = res.data.data.remark.ding_report;
+						if (Object.keys(ding_report).length != 0) {
+							this.ding_report = res.data.data.remark.ding_report;
+						}
+					} else {
+						this.$message.error(res.data.data.msg);
+					}
+				})
+				.finally(() => {
+					this.detail_loading = false;
+				});
+		},
+		get_integral_list(data) {
+			this.loading = true;
+			this.$axios('get', '/api/integral/statistics/integral', this.formData)
+				.then(res => {
+					if (res.data.code == 1) {
+						this.list = res.data.data.list;
+						this.total = res.data.data.total;
+					} else {
+						this.$message.error(res.data.data.msg);
+					}
+				})
+				.finally(() => {
+					this.loading = false;
+				});
+		},
+		handleCurrentChange(val) {
+			this.formData.page = val;
+		},
+
+		del_integral_event(item) {
+			this.$confirm('删除事件的同时也会撤销积分,确定删除吗?', '提示', {
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type: 'warning'
+			}).then(() => {
+				this.$axios('post', '/api/integral/statistics/integral/destroy', { event_id: item.event_id }).then(res => {
+					if (res.data.code == 1) {
+						this.$message.success(res.data.msg);
+						this.detail_popup = false;
+						this.get_integral_list(this.formData);
+					} else {
+						this.$message.error(res.data.msg);
+					}
+				});
+			});
+		},
+		point_name(id) {
+			return this.point_types.find(item => {
+				if (item.id == id) {
+					return item.name;
+				}
+			}).name;
+		},
+	}
+};
+</script>
+<style scoped lang="scss">
+.diy-tip1 {
+	margin-bottom: 10px !important;
+	background: #f0f9eb !important;
+	color: #333 !important;
+	border: 1px solid #67c23a !important;
+	padding: 9px !important;
+	min-width: 800px;
+	border-radius: 4px;
+}
+.fh {
+	position: relative;
+	cursor: pointer;
+	padding-right: 40px !important;
+}
+.fh:hover {
+	color: #26a2ff;
+}
+.fh::after {
+	width: 2px;
+	background-color: #ccc;
+	height: 30px;
+	content: ' ';
+	position: absolute;
+	right: 20px;
+	top: -5px;
+}
+.remark {
+	display: -webkit-box;
+	-webkit-box-orient: vertical;
+	-webkit-line-clamp: 2;
+	overflow: hidden;
+}
+.title {
+	text-align: center;
+	font-weight: 700;
+	max-width: 70%;
+	margin: 20px auto;
+	margin-top: 0;
+	font-size: 18px;
+}
+.key {
+	font-weight: 700;
+	font-size: 16px;
+}
+.value {
+	font-size: 14px;
+	margin: 10px 0;
+	margin-bottom: 20px;
+}
+.imgs {
+	width: 80px;
+	height: 80px;
+	margin-right: 5px;
+	margin-bottom: 5px;
+}
+header.el-drawer__header {
+	font-size: 18px;
+	font-family: MicrosoftYaHei;
+	color: #303133;
+	width: 500px;
+	span {
+		:focus {
+			outline: 0;
+		}
+	}
+}
+.display_flex {
+	display: flex;
+}
+.label {
+	line-height: 36px;
+	padding-right: 10px;
+}
+.time_section {
+	.el-range-editor {
+		width: 330px;
+	}
+}
+.pagination {
+	padding: 20px 0;
+}
+.detail_popup {
+	padding: 20px;
+	height: calc(100vh - 140px);
+	overflow: auto;
+	padding-bottom: 100px;
+	.row_title {
+		position: relative;
+		margin: 0 0 20px 0;
+		padding-top: 12px;
+		font-size: 16px;
+		color: #303133;
+		line-height: 22px;
+	}
+	.row_title:before {
+		position: absolute;
+		top: 0;
+		content: ' ';
+		width: 100%;
+		border-top: 1px #f8f8f8 solid;
+	}
+	.el-row {
+		margin-bottom: 10px;
+		font-size: 14px;
+		.el-col-4 {
+			color: #606266;
+		}
+	}
+}
+span.point {
+	font-size: 16px;
+}
+.drawer_title {
+	font-size: 18px;
+	padding: 20px;
+	border-bottom: 1px #efefef solid;
+}
+.row_tips {
+	display: block;
+	color: #909399;
+	font-size: 12px;
+	margin-top: 0px;
+}
+.el-range-editor--medium .el-range-separator {
+	width: 25px;
+}
+.integral_event_box {
+	background-color: #ffffff;
+	padding: 20px;
+	min-height: calc(100vh - 160px);
+}
+.examine_steps ::v-deep .el-step.is-vertical .el-step__title {
+	padding-bottom: 0;
+}
+</style>

+ 2 - 1
src/views/ranking/attendance_rating.vue

@@ -51,6 +51,7 @@
 						</div>
 					</template>
 				</el-table-column>
+				<el-table-column show-overflow-tooltip label="部门" align="left" min-width="120px" prop="deptName"></el-table-column>
 				<el-table-column prop="point" label="B分" align="left">
 					<template slot-scope="scope">
 						<b style="font-size:15px;color:#909399">{{ scope.row.point }}</b>
@@ -380,7 +381,7 @@ export default {
 			this.$axios('post', '/api/ad/rank', data)
 				.then(res => {
 					if (res.data.code == 1) {
-						self.all_integral_list = res.data.data.list;
+						this.all_integral_list =this.$returnDeptName(res.data.data.list);
 						this.total = res.data.data.total;
 					} else {
 						self.$message.error(res.data.data.msg);

+ 8 - 12
src/views/ranking/balanceA.vue

@@ -43,6 +43,7 @@
 			</div>
           </template>
         </el-table-column>
+<el-table-column show-overflow-tooltip label="部门" align="left" min-width="120px" prop="deptName"></el-table-column>
         <el-table-column label="A分余额" prop="balance_a"></el-table-column>
         <template slot="empty">
 			<noData></noData>
@@ -181,22 +182,17 @@ export default {
     },
     // 获取列表
     getList() {
-      let self = this;
-      self.loading = true;
-      self.$axios('get', '/api/integral/site/a/balance', this.formData)
+      this.loading = true;
+      this.$axios('get', '/api/integral/site/a/balance', this.formData)
         .then(res => {
           if (res.data.code == 1) {
-            self.list = res.data.data.list;
-            self.total = res.data.data.total;
+            this.list =this.$returnDeptName(res.data.data.list);
+            this.total = res.data.data.total;
           } else {
-            self.$message.error(res.data.data.msg);
+            this.$message.error(res.data.data.msg);
           }
-        })
-        .catch(e => {
-          self.$message.error(e.data.data.msg);
-        })
-        .finally(() => {
-          self.loading = false;
+        }).finally(() => {
+          this.loading = false;
         });
     },
     // 获取日志列表

+ 44 - 11
src/views/ranking/custom_rank.vue

@@ -19,9 +19,9 @@
 						</div>
 					</div>
 				</div>
-				<el-col :span="18" class="listData" v-loading="table_loading">
-					<el-row style="margin-bottom: 10px;" v-if="groups_list.length != 0">
-						<el-col :span="24" class="groups_name">
+				<div class="listData flex-1" v-loading="table_loading">
+					<div style="margin-bottom: 10px;" v-if="groups_list.length != 0">
+						<div  class="groups_name">
 							<div class="flex-box flex-v-ce margin-bottom">
 								<div class="groupsName">
 									{{ groups_info.name }}
@@ -29,8 +29,8 @@
 								</div>
 								<el-button @click="editGroup" v-if="employeeOrdept" size="medium" style="margin-left:15px;">编辑</el-button>
 							</div>
-						</el-col>
-					</el-row>
+						</div>
+					</div>
 					<el-form :model="params" :inline="true" ref="params">
 						<el-form-item label="月份" label-width="40px" v-if="newGroupForm.date_interval == 1">
 							<el-date-picker v-model="time.month" type="month" :clearable="false" placeholder="请选择月份" value-format="yyyy-MM"></el-date-picker>
@@ -55,8 +55,8 @@
 						></el-alert>
 					</el-form>
 
-					<el-table :data="table_list" style="width: 100%">
-						<el-table-column label="名次" width="80" align="center">
+					<el-table :data="table_list" style="cursor: pointer;" @row-click="open_detail">
+						<el-table-column label="名次" width="80" align="center" >
 							<template slot-scope="scope">
 								<img v-if="scope.row.rank === 1" src="@/assets/image/statistics_NO1.png" alt="" />
 								<img v-if="scope.row.rank === 2" src="@/assets/image/statistics_NO2.png" alt="" />
@@ -72,7 +72,13 @@
 								</div>
 							</template>
 						</el-table-column>
+						<el-table-column show-overflow-tooltip label="部门" align="left" min-width="120px" prop="deptName"></el-table-column>
 						<el-table-column label="B分" align="left" prop="point"></el-table-column>
+						<el-table-column>
+							<template slot-scope="scope">
+								<span  class="blue" style="cursor: pointer;">查看详情</span>
+							</template>
+						</el-table-column>
 						<template slot="empty">
 							<div class="nopoint_box">
 								<div class="noimg noperson"></div>
@@ -80,7 +86,6 @@
 							</div>
 						</template>
 					</el-table>
-
 					<center style="padding: 20px 0;">
 						<el-pagination
 							background
@@ -93,7 +98,7 @@
 							:total="total"
 						></el-pagination>
 					</center>
-				</el-col>
+				</div>
 			</div>
 		</div>
 
@@ -160,7 +165,6 @@
 							:data="treedata"
 							:default-expand-all="defaultExpand"
 							:props="defaultProps"
-							:expand-on-click-node="false"
 							@node-click="handleNodeClick"
 							@check="handleCheckChange"
 						>
@@ -350,6 +354,35 @@ export default {
 	},
 	components: { EmployeeSelector, Season },
 	methods: {
+		open_detail(item) {
+			let data={
+				userInfo:JSON.stringify(item),
+				type:3,
+				items:this.clickItem.items,
+				dateType:this.newGroupForm.date_interval,
+			}
+			if(this.newGroupForm.date_interval=='1'){
+				data.date=this.time.month
+				this.$router.push({path: '/JfDetail',query:data})
+			}
+			if(this.newGroupForm.date_interval=='2'){
+				let date={type:2,year:this.time.quarter.slice(0,4),season:this.time.quarter.slice(4)}
+				this.getDate((res)=>{
+					data.start_date = this.$moment(Number(res.data.start+'000')).format('YYYY-MM-DD')
+					data.end_date = this.$moment(Number(res.data.end+'000')).format('YYYY-MM-DD')
+					this.$router.push({path: '/JfDetail',query:data})
+				},date)
+			}
+			if(this.newGroupForm.date_interval=='3'){
+				data.date=this.time.year
+				this.$router.push({path: '/JfDetail',query:data})
+			}
+		},
+		getDate(func,date) {
+			this.$axios('post', '/api/timestamp', date).then(res => {
+					func(res.data)
+			});
+		},
 		exportExcel() {
 			let months;
 			if (this.newGroupForm.date_interval == '1') {
@@ -835,7 +868,7 @@ export default {
 			self.$axios('get', '/api/integral/statistics/groups/rank', data)
 				.then(res => {
 					if (res.data.code == 1) {
-						self.table_list = res.data.data.list;
+						this.table_list =this.$returnDeptName(res.data.data.list);
 						self.total = res.data.data.total;
 						self.lastUpdateTime = res.data.data.update_time;
 					} else {

+ 106 - 9
src/views/ranking/dept_rank.vue

@@ -97,14 +97,13 @@
 				</el-form-item>
 				<el-form-item>
 					<el-checkbox v-model="sort" size="medium" label="排名由低到高" border></el-checkbox>
-					<el-button type="primary" size="medium" @click="selectBtn" style="margin-left:20px">查询</el-button>
 				</el-form-item>
 				<el-form-item>
 					<el-button type="primary" size="medium" plain @click="dialogVisible = true">导出排名</el-button>
 					<!-- <el-button type="primary"  size="medium" plain @click="byRanking('byRankingData')">轮播排名</el-button> -->
 				</el-form-item>
 			</el-form>
-			<el-table :data="list" style="width: 100%" v-loading="loading">
+			<el-table :data="list" style="width: 100%;cursor: pointer;" v-loading="loading" @row-click="open_detail">
 				<el-table-column label="名次" width="80" align="center">
 					<template slot-scope="scope">
 						<img v-if="scope.row.rank === 1" src="@/assets/image/statistics_NO1.png" alt="" />
@@ -121,7 +120,13 @@
 						</div>
 					</template>
 				</el-table-column>
+				<el-table-column show-overflow-tooltip label="部门" align="left" min-width="120px" prop="deptName"></el-table-column>
 				<el-table-column :label="labelName" align="left" prop="point"></el-table-column>
+				<el-table-column>
+					<template slot-scope="scope">
+						<span  class="blue" style="cursor: pointer;">查看详情</span>
+					</template>
+				</el-table-column>
 				<template slot="empty">
 					<div class="nopoint_box">
 						<div class="noimg noperson"></div>
@@ -386,12 +391,31 @@ export default {
 		};
 	},
 	watch: {
+		'export_from.time_range'(){
+			this.selectBtn();
+		},
+		'export_from.year'(){
+			this.selectBtn();
+		},
+		'export_from.month'(){
+			this.selectBtn();
+		},
+		'formData.pt_id'(){
+			this.selectBtn();
+		},
+		'formData.position'(){
+			this.selectBtn();
+		},
+		'formData.exclusion'(){
+			this.selectBtn();
+		},
 		sort(val) {
 			if (val) {
 				this.formData.sort = 'ASC';
 			} else {
 				this.formData.sort = 'DESC';
 			}
+			this.selectBtn();
 		},
 		dept_name(val) {
 			if (val.length !== 0) {
@@ -401,6 +425,7 @@ export default {
 				//   dept_id.push(val[i][0]);
 				// }
 				// this.formData.dept_id = dept_id;//传入选中的部门ID,是数组
+				this.formData.exclusion=[];
 				this.formData.dept_id = val[val.length - 1];
 			} else {
 				this.formData.dept_id = 0;
@@ -408,6 +433,7 @@ export default {
 			this.$nextTick(() => {
 				this.$refs.dept.dropDownVisible = false;
 				this.getEmployeeList();
+				this.selectBtn();
 			});
 		},
 		'byRankingData.dept_id'(val) {
@@ -427,10 +453,80 @@ export default {
 				this.formData.rule=(val[val.length-1]).toString()
 			}
 			this.$refs.rule_id.dropDownVisible = false;
+			this.selectBtn();
 		}
 	},
 	components: { season },
 	methods: {
+		open_detail(item) {
+			let parameter=JSON.parse(JSON.stringify(this.formData));
+			parameter.time_type=this.time_type
+			let data={
+				userInfo:JSON.stringify(item),
+				type:1,
+			}
+			let date='';
+			switch (this.time_type) {
+				case '1':
+					if(parameter.month){
+						let month=parameter.month.split("-");
+						date={type:3,year:month[0],month:month[1]<10? month[1].slice(1):month[1]}
+					}
+					break;
+				case '2':
+					if(parameter.year){
+						date={type:1,year:parameter.year}
+					}
+					break;
+				case '月份':
+					if(parameter.month){
+						let month2=parameter.month.split("-");
+						date={type:3,year:month2[0],month:month2[1]<10? month2[1].slice(1):month2[1]}
+					}
+					break;
+				case '3':
+					if(parameter.quarter){
+						date={type:2,year:parameter.quarter.slice(0,4),season:parameter.quarter.slice(4)}
+					}
+					break;
+				case '4':
+					if(parameter.time_range&&parameter.time_range.length>0){
+						date=true;
+						parameter.start_date = this.$moment(parameter.time_range[0]).format('YYYY-MM-DD')
+						parameter.end_date = this.$moment(parameter.time_range[1]).format('YYYY-MM-DD')
+					}
+					break;
+				default:
+					break;
+			}
+			if(!date){
+				// let month=moment().format('YYYY-MM').split("-");
+				// date={type:3,year:month[0],month:month[1]<10? month[1].slice(1):month[1]}
+				// this.getDate((res)=>{
+				// 	parameter.start_date = this.$moment(Number(res.data.start+'000')).format('YYYY-MM-DD')
+				// 	parameter.end_date = this.$moment(Number(res.data.end+'000')).format('YYYY-MM-DD')
+					data.parameter=JSON.stringify(parameter);
+					this.$router.push({path: '/JfDetail',query:data})
+				// },date)
+				return false
+			}
+			if(parameter.time_type==4){
+				data.parameter=JSON.stringify(parameter);
+				this.$router.push({path: '/JfDetail',query:data})
+			}else{
+				this.getDate((res)=>{
+					parameter.start_date = this.$moment(Number(res.data.start+'000')).format('YYYY-MM-DD')
+					parameter.end_date = this.$moment(Number(res.data.end+'000')).format('YYYY-MM-DD')
+					data.parameter=JSON.stringify(parameter);
+					this.$router.push({path: '/JfDetail',query:data})
+				},date)
+			}
+		},
+		getDate(func,date) {
+			this.$axios('post', '/api/timestamp', date).then(res => {
+					func(res.data)
+			});
+		},
 		ruleInquiredialog() {
 			this.ruleUtif('derive');
 		},
@@ -545,6 +641,7 @@ export default {
 		// 选择时间
 		export_quarter_confirm(val) {
 			this.export_from.quarter = val;
+			this.selectBtn();
 		},
 		//请求数据
 		get_list(data, bool) {
@@ -577,23 +674,23 @@ export default {
 			if (bool) {
 				data.month = moment().format('YYYY-MM');
 			}
-			let self = this;
-			self.loading = true;
+			this.loading = true;
 			data ? '' : (data = this.formData);
 
 			data.position = data.position == 'manager' ? 'manager' : data.position == 'employee' ? 'employee' : 'all';
-			self.$axios('get', '/api/integral/statistics/ranking', data, 'v2')
+			this.$axios('get', '/api/integral/statistics/ranking', data, 'v2')
 				.then(res => {
 					this.labelName = this.formData.pt_id == 2 ? 'A分' : 'B分';
 					if (res.data.code == 1) {
-						self.list = res.data.data.list;
-						self.total = res.data.data.total;
+						this.list =this.$returnDeptName(res.data.data.list);
+						console.log(this.list)
+						this.total = res.data.data.total;
 					} else {
-						self.$message.error(res.data.data.msg);
+						this.$message.error(res.data.data.msg);
 					}
 				})
 				.finally(() => {
-					self.loading = false;
+					this.loading = false;
 				});
 		},
 		// 获取积分规则

+ 52 - 57
src/views/ranking/individual_statistics.vue

@@ -42,26 +42,21 @@
 						<el-col :span="7" class="userinfo_box">
 							<el-row :gutter="40" style="margin:0;padding:0;">
 								<el-col :span="24" class="user_info" style="display:flex;" v-loading="personnelMessage">
-									<div class="headimg fl" style=" margin: 0 10px 0 20%;">
-										<userImage :img_url="personnel.img_url" :user_name="personnel.name" fontSize="1" width="50px" height="50px"></userImage>
-									</div>
-									<div style="width:100%;">
-										<div
-											style="max-width: 80%;display: inline-block;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;vertical-align: top;margin-left:10%;"
-										>
-											<b style="font-size:16px;">{{ personnel.name }}</b>
+									<div class="flex-box-ce">
+										<div class="headimg fl" style=" margin: 0 10px 0 30px;">
+											<userImage :img_url="personnel.img_url" :user_name="personnel.name" fontSize="1" width="50px" height="50px"></userImage>
 										</div>
-										<div
-											style="max-width: 80%;display:flex;flex-wrap:wrap;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 1;margin-left:10%;"
-										>
+										<div>
+											<b style="font-size:16px;">{{ personnel.name }}</b>
 											<el-popover trigger="hover" placement="top" popper-class="popperSPBOX">
 												<div style="font-size:14px;color:#828282;">{{ dept_list }}</div>
-												<div slot="reference" class="name-wrapper">
+												<div slot="reference" class="name-wrapper" style="width: 200px;">
 													<span style="font-size:14px;color:#828282;">{{ dept_list }}</span>
 												</div>
 											</el-popover>
 										</div>
 									</div>
+
 								</el-col>
 							</el-row>
 						</el-col>
@@ -358,7 +353,7 @@ export default {
 		//不包含自动积分加分项
 		exclusiveMonthChecked() {
 			this.monthlyIntegral();
-		},
+		}
 
 		// select_employee_id(val) {
 		// 	this.formData.employee_id = val;
@@ -367,23 +362,25 @@ export default {
 	},
 	mounted() {
 		window.addEventListener('resize', this.selfAdaption);
-		this.getEmployee().then(res =>{
-			// if (this.$getUserData()) {
-			// 	this.personnel = this.$getUserData();
-			// 	let dept_li = this.personnel.employee_detail.dept_list;
-			// 	let dept_ = '';
-			// 	for (let i in dept_li) {
-			// 		dept_ += dept_li[i].dept_name + ' ';
-			// 	}
-			// 	this.dept_list = dept_;
-			// } else {
-			// 	this.personnelDetails(); //获取人员详情
-			// }
-			this.formData.month = this.$moment().format('YYYY-MM');
-			this.executiveFunction();
-		}).catch((err) =>{
-			console.log(err)
-		});
+		this.getEmployee()
+			.then(res => {
+				// if (this.$getUserData()) {
+				// 	this.personnel = this.$getUserData();
+				// 	let dept_li = this.personnel.employee_detail.dept_list;
+				// 	let dept_ = '';
+				// 	for (let i in dept_li) {
+				// 		dept_ += dept_li[i].dept_name + ' ';
+				// 	}
+				// 	this.dept_list = dept_;
+				// } else {
+				// 	this.personnelDetails(); //获取人员详情
+				// }
+				this.formData.month = this.$moment().format('YYYY-MM');
+				this.executiveFunction();
+			})
+			.catch(err => {
+				console.log(err);
+			});
 		// if(JSON.parse(localStorage.getItem("SET_EMPLOYEE_MAP"))){
 		//   this.employee_map = JSON.parse(localStorage.getItem("SET_EMPLOYEE_MAP"))
 		// }else{
@@ -406,8 +403,7 @@ export default {
 		// }
 	},
 	methods: {
-		selectEmployeeChange(val){
-			console.log(val)
+		selectEmployeeChange(val) {
 			this.formData.employee_id = val;
 			this.executiveFunction(true);
 		},
@@ -417,30 +413,30 @@ export default {
 
 		//获取员工列表
 		getEmployee() {
-			return new Promise((resolve, reject) =>{
+			return new Promise((resolve, reject) => {
 				this.personnelMessage = true;
 				this.$axios('get', '/api/employee/index', { dept_id: 0, keywords: '', page: 1, page_size: 3000, is_official: 1 })
 					.then(res => {
 						let list = res.data.data.list;
-						this.employee_map = list.filter(x => x.is_creator != 1)
-						if(this.employee_map.length == 0){
-							reject('err')
-							return
+						this.employee_map = list.filter(x => x.is_creator != 1);
+						if (this.employee_map.length == 0) {
+							reject('err');
+							return;
 						}
-						if(this.$getUserData().is_creator == 1){
-							this.select_employee_id = this.employee_map[0].id
-							let employee = this.employee_map[0]
-							this.formData.employee_id = employee.id
-							this.personnel = employee
+						if (this.$getUserData().is_creator == 1) {
+							this.select_employee_id = this.employee_map[0].id;
+							let employee = this.employee_map[0];
+							this.formData.employee_id = employee.id;
+							this.personnel = employee;
 							let dept_li = this.personnel.employee_detail.dept_list;
 							let dept_ = '';
 							for (let i in dept_li) {
 								dept_ += dept_li[i].dept_name + ' ';
 							}
 							this.dept_list = dept_;
-						}else{
+						} else {
 							if (this.$getUserData()) {
-								this.select_employee_id = this.$getUserData().name
+								this.select_employee_id = this.$getUserData().name;
 								this.personnel = this.$getUserData();
 								let dept_li = this.personnel.employee_detail.dept_list;
 								let dept_ = '';
@@ -456,14 +452,12 @@ export default {
 						// for(let i in list){
 
 						// }
-
-						
 					})
 					.finally(err => {
 						this.personnelMessage = false;
-						resolve('res')
+						resolve('res');
 					});
-			})
+			});
 		},
 
 		//echarts自适应
@@ -523,15 +517,16 @@ export default {
 				//年
 				params.year = this.formData.year;
 			}
-			let params1 = this.$axios('get', '/api/integral/statistics/', params, 'v2')
-			let params2 = this.$axios('get', '/api/integral/statistics/', { employee_id: this.formData.employee_id, day: this.$moment().format('YYYY-MM-DD')}, 'v2')
-			Promise.all([params1, params2]).then(res => {
-				this.authorityManagerHeaders = res[0].data.data;
-				this.headDayBs = res[1].data.data;
-			})
-			.finally(() => {
-				this.authorityManagerHeaderLoad = false;
-			});
+			let params1 = this.$axios('get', '/api/integral/statistics/', params, 'v2');
+			let params2 = this.$axios('get', '/api/integral/statistics/', { employee_id: this.formData.employee_id, day: this.$moment().format('YYYY-MM-DD') }, 'v2');
+			Promise.all([params1, params2])
+				.then(res => {
+					this.authorityManagerHeaders = res[0].data.data;
+					this.headDayBs = res[1].data.data;
+				})
+				.finally(() => {
+					this.authorityManagerHeaderLoad = false;
+				});
 		},
 
 		//饼图

+ 126 - 109
src/views/ranking/integral_event.vue

@@ -38,7 +38,12 @@
 						<el-option v-for="item in source_type" :key="item.id" :label="item.name" :value="item.id"></el-option>
 					</el-select>
 				</el-form-item>
-				<el-form-item label="时间" style="margin-top: 1px;">
+				<el-form-item label="复核状态">
+					<el-select class="date-picker-width" size="medium" v-model="formData.status"  placeholder="请选择复核状态">
+						<el-option v-for="item in dcArr" :key="item.name" :label="item.name" :value="item.id"></el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="时间">
 					<el-date-picker
 						v-model="time_slot"
 						type="daterange"
@@ -49,25 +54,28 @@
 						end-placeholder="结束日期"
 					></el-date-picker>
 				</el-form-item>
-				<el-form-item style="margin-top: 2px;">
-					<el-input size="medium" v-model="formData.keyword" placeholder="输入同事姓名" max="200" @keyup.enter.native="keyWordSelect" class="persons_name">
-						<el-button size="medium" slot="append" icon="el-icon-search" @click="keyWordSelect"></el-button>
-					</el-input>
+				<el-form-item>
+					<div class="flex-box-ce">
+						<el-select size="medium" v-model="select_employee_id" filterable clearable placeholder="请输入或选择人员" style="width: 250px;margin-right: 10px;">
+							<el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
+						</el-select>
+						<el-input size="medium" v-model="formData.keyword" placeholder="输入关键字查找" max="200" @keyup.enter.native="keyWordSelect">
+							<el-button size="medium" slot="append" icon="el-icon-search" @click="keyWordSelect"></el-button>
+						</el-input>
+					</div>
 				</el-form-item>
 				<el-form-item>
 					<el-button v-if="employeeOrdept" type="success" size="medium" @click="toleadShw = true" plain>导入数据</el-button>
 					<el-button type="primary" size="medium" @click="exportExcel" plain>导出当前数据</el-button>
-					<el-button class="first-element-btn" v-if="employeeOrdept" :disabled="deleteDisabled" @click="deleteInBatches" type="danger">批量删除</el-button>
+					<el-button class="first-element-btn" size="medium" v-if="employeeOrdept" :disabled="deleteDisabled" @click="deleteInBatches" type="danger">批量删除</el-button>
 					<!-- <el-button type="primary" size="medium" plain @click="swiperShow = true">轮播事件</el-button> -->
 				</el-form-item>
 
 				<div class="diy-tip1" style="margin-bottom: 10px;">
-					<div>
-						当前数据:{{total}}条
-					</div>
+					<div>当前数据:{{ total }}条</div>
 				</div>
 			</el-form>
-			
+
 			<!-- 表格 -->
 			<div>
 				<el-table :data="list" style="width: 100%;cursor: pointer;" v-loading="loading" @row-click="open_detail" @selection-change="deleteEvents">
@@ -86,11 +94,11 @@
 							<span :class="scope.row.point < 0 ? 'green' : 'red'">{{ scope.row.point }} {{ point_name(scope.row.pt_id) }}</span>
 						</template>
 					</el-table-column>
-					<el-table-column prop="remark"  label="事件内容" align="left" min-width="280px">
+					<el-table-column prop="remark" label="事件内容" align="left" min-width="280px">
 						<template slot-scope="scope">
 							<el-tooltip class="item" effect="dark" placement="top">
-							  <div slot="content" style="width: 400px;">{{scope.row.remark}}</div>
-							  <div class="remark">{{scope.row.remark}}</div>
+								<div slot="content" style="width: 400px;">{{ scope.row.remark }}</div>
+								<div class="remark">{{ scope.row.remark }}</div>
 							</el-tooltip>
 						</template>
 					</el-table-column>
@@ -102,11 +110,17 @@
 					</el-table-column>
 					<el-table-column prop="source_type" label="来源" align="left" min-width="140px">
 						<template slot-scope="scope">
-							<span v-show="scope.row.source_type == 1">积分奖扣 <span v-if="scope.row.recorder_name">({{scope.row.recorder_name}})</span></span>
+							<span v-show="scope.row.source_type == 1">
+								积分奖扣
+								<span v-if="scope.row.recorder_name">({{ scope.row.recorder_name }})</span>
+							</span>
 							<span v-show="scope.row.source_type == 2">任务</span>
 							<span v-show="scope.row.source_type == 3">积分系统分配</span>
 							<span v-show="scope.row.source_type == 4">考勤系统分配</span>
-							<span v-show="scope.row.source_type == 5">积分申请 <span v-if="scope.row.applyor_name">({{scope.row.applyor_name}})</span></span>
+							<span v-show="scope.row.source_type == 5">
+								积分申请
+								<span v-if="scope.row.applyor_name">({{ scope.row.applyor_name }})</span>
+							</span>
 							<span v-show="scope.row.source_type == 6">绩效任务包</span>
 							<span v-show="scope.row.source_type == 8">积分导入</span>
 							<span v-show="scope.row.source_type == 9">A分转B分</span>
@@ -114,10 +128,10 @@
 							<span v-show="scope.row.source_type > 10">其他</span>
 						</template>
 					</el-table-column>
-					<el-table-column prop="create_time" label="录入时间" align="left" width="140px">
+					<el-table-column prop="update_time" label="录入时间" align="left" width="140px">
 						<template slot-scope="scope">
 							<!-- {{ cuttString(scope.row.create_time) }} -->
-							{{ scope.row.create_time }}
+							{{ scope.row.update_time }}
 						</template>
 					</el-table-column>
 
@@ -144,7 +158,7 @@
 			<div class="detail_popup" v-loading="detail_loading" v-if="detail_info !== null">
 				<el-row style="padding-bottom:10px;border-bottom:1px #f8f8f8 solid;">
 					<div class="flex-box flex-v-ce">
-						<userImage :user_name="detail_info.employee_name" width="50px" height="50px" fontSize="1"></userImage>
+						<userImage :user_name="detail_info.employee_name" :img_url="detail_info.img_url" width="50px" height="50px" fontSize="1"></userImage>
 						<span style="font-size: 18px;line-height:50px; margin-left:10px;margin-right:4px;">{{ detail_info.employee_name }}</span>
 						<span class="red point" v-show="detail_info.point >= 0">+{{ detail_info.point }} {{ point_name(detail_info.pt_id) }}</span>
 						<span class="green point" v-show="detail_info.point < 0">{{ detail_info.point }} {{ point_name(detail_info.pt_id) }}</span>
@@ -173,15 +187,14 @@
 					<el-col :span="18">{{ detail_info.rule_list }}</el-col>
 				</el-row>
 
-
 				<el-row v-show="detail_info.source_type_mark">
 					<el-col :span="6">来源类型</el-col>
 					<el-col :span="18">{{ detail_info.source_type_mark }}</el-col>
 				</el-row>
 
-				<el-row v-show="!detail_info.rule_id">
+				<el-row v-show="detail_info.recorder_name">
 					<el-col :span="6">记录人</el-col>
-					<el-col :span="18">{{ detail_info.employee_name }}</el-col>
+					<el-col :span="18">{{ detail_info.recorder_name }}</el-col>
 				</el-row>
 
 				<el-row v-show="detail_info.date">
@@ -229,18 +242,16 @@
 						</el-col>
 					</el-row>
 				</div>
-				<div v-show="detail_info.process">
-					<Steps :process="detail_info.process"></Steps>
-				</div>
-
-				<div style="text-align: center;margin-top: 30px;" v-if="detail_info.source_type == 10&&see_log">
+				<div v-show="detail_info.process"><Steps :process="detail_info.process"></Steps></div>
+				<div v-show="detail_info.dc_remark.flow"><Review :process="detail_info.dc_remark.flow" :status="detail_info.dc_status"></Review></div>
+				<div style="text-align: center;margin-top: 30px;" v-if="detail_info.source_type == 10 && see_log">
 					<el-button type="primary" size="medium" @click="showLog = true">
 						查看日志详情内容
 						<span style=";padding-left:5px;">»</span>
 					</el-button>
 				</div>
 			</div>
-			<div v-if="!this.$authoritys('employee')&&!this.$authoritys('dept_manager')" style="position: absolute; bottom: 20px; display: block; right: 20px;">
+			<div v-if="!this.$authoritys('employee') && !this.$authoritys('dept_manager')" style="position: absolute; bottom: 20px; display: block; right: 20px;">
 				<el-button @click="close_integral_event">取消</el-button>
 				<el-button type="danger" @click="del_integral_event(detail_info)">删除</el-button>
 			</div>
@@ -271,36 +282,6 @@
 			</div>
 		</el-dialog>
 
-		<!-- 导入数据 -->
-		<!-- <el-dialog title="导入积分事件数据" width="600px" :visible.sync="excelImportShow" :close-on-click-modal="false" :before-close="close_import">
-			<div style="padding:0 50px;">
-				<div class="flex-box flex-v-ce margin-bottom">
-					<div style="margin-right: 10px;">1、下载积分事件模版,批量录入积分事件</div>
-					<el-button size="medium" type="primary" @click="downloadTemplate" plain>下载模板</el-button>
-				</div>
-				<div class="margin-bottom">
-					<el-upload
-						:limit="1"
-						:headers="ATOKEN"
-						ref="upload"
-						:action="action"
-						:on-remove="handleRemove"
-						:on-success="handlePictureCardPrediv"
-						:file-list="fileList"
-						:before-upload="beforeFilesUpload"
-					>
-						<p>
-							2、上传积分事件数据Excel表
-							<el-button style="margin-left: 10px;" size="medium" type="primary" plain>选择文件</el-button>
-						</p>
-					</el-upload>
-				</div>
-			</div>
-			<div slot="footer" class="dialog-footer">
-				<el-button @click="close_import" size="medium">取 消</el-button>
-			</div>
-		</el-dialog> -->
-
 		<el-dialog title="导入错误信息" :visible.sync="importErrorInfoShow" width="30%">
 			<div>
 				<el-table :data="error_list" border stripe>
@@ -364,8 +345,8 @@
 	</div>
 </template>
 <script>
-
 import Steps from '@/components/Steps';
+import Review from '@/components/Review';
 import toLead from '@/components/toLead';
 export default {
 	data() {
@@ -383,7 +364,10 @@ export default {
 			dept_tree: [],
 			formData: {
 				page: 1,
-				page_size: 10
+				page_size: 10,
+				status:1,
+				dc_status:JSON.stringify([1]),
+				order_key:'update_time'
 			},
 			time_slot: null,
 			rule_trees: [],
@@ -401,11 +385,12 @@ export default {
 			importErrorInfoShow: false,
 			fileList: [],
 			employeeOrdept: !this.$authoritys('employee') && !this.$authoritys('dept_manager'),
-
+			select_employee_id: '',
+			employee_map: [],
 			selectionID: [], //删除的事件ID
 			// 查看日志
 			showLog: false,
-			see_log:1,
+			see_log: 1,
 			ding_report: {
 				contents: [],
 				images: []
@@ -415,34 +400,41 @@ export default {
 			nowIndex: 1,
 			toleadResult: {},
 			deriveNum: 0,
-			
+
 			source_type: [
-				{id: 0,name: '全部'},
-				{id: 1,name: '积分奖扣'},
-				{id: 2,name: '任务'},
-				{id: 3,name: '积分系统分配'},
-				{id: 4,name: '考勤系统分配'},
-				{id: 5,name: '积分申请'},
+				{ id: 0, name: '全部' },
+				{ id: 1, name: '积分奖扣' },
+				{ id: 2, name: '任务' },
+				{ id: 3, name: '积分系统分配' },
+				{ id: 4, name: '考勤系统分配' },
+				{ id: 5, name: '积分申请' },
 				// {id: 6,name: '绩效任务包'},
-				{id: 8,name: '积分导入'},
-				{id: 9,name: 'A分转B分'},
-				{id: 10,name: '钉钉汇报(日志)奖扣分'},
+				{ id: 8, name: '积分导入' },
+				{ id: 9, name: 'A分转B分' },
+				{ id: 10, name: '钉钉汇报(日志)奖扣分' }
+			],
+			dcArr: [
+				{ id: 1, name: '复核通过' },
+				{ id: 0, name: '待复核' },
+				{ id: 2, name: '复核不通过' },
 			]
 		};
 	},
-	components: {Steps, toLead },
+	components: { Steps, toLead,Review },
+	created() {
+		this.getEmployee();
+	},
 	mounted() {
-		this.deriveRestrict()
+		this.deriveRestrict();
 		this.getDepartment();
 		this.get_rule_trees();
 		this.get_integral_list(this.formData);
-		this.see_log=this.$store.state.config.see_log;
-		console.log(this.see_log)
+		this.see_log = this.$store.state.config.see_log;
 		this.point_types = this.getTypes();
 	},
 	watch: {
-		toleadShw(val){
-			if(val) this.nowIndex = 1
+		toleadShw(val) {
+			if (val) this.nowIndex = 1;
 		},
 		selectionID() {
 			if (this.selectionID.length == 0) {
@@ -461,9 +453,26 @@ export default {
 			val == 0 ? delete this.formData.source_type : '';
 			this.get_integral_list(this.formData);
 		},
+		'formData.status'(val) {
+			this.formData.dc_status=JSON.stringify([val]);
+			// if(val==0){
+			// 	this.formData.dc_status=JSON.stringify([1,2]);
+			// }else if(val==1){
+			// 	this.formData.dc_status=JSON.stringify([1]);
+			// }else{
+			// 	this.formData.dc_status=JSON.stringify([2]);
+			// }
+			this.formData.page = 1;
+			this.get_integral_list(this.formData);
+		},
 		'formData.page'(val, old_val) {
 			this.get_integral_list(this.formData);
 		},
+		select_employee_id(val) {
+		  this.formData.page = 1;
+		  this.formData.employee_ids = val;
+		  this.get_integral_list(this.formData);
+		},
 		time_slot(val, old_val) {
 			this.formData.page = 1;
 			if (val !== null) {
@@ -489,14 +498,20 @@ export default {
 		}
 	},
 	methods: {
-		deriveRestrict(){
-			this.deriveNum = 0
-			this.$axios('GET', '/api/site/info')
-				.then(res => {
-					if (res.data.code == 1) {
-						this.deriveNum = Number(res.data.data.export_max_num)
-					}
-				})
+		//获取员工列表
+		getEmployee() {
+			this.$axios('get', '/api/employee/index', { dept_id: 0, keywords: '', page: 1, page_size: 3000, is_official: 1 }).then(res => {
+				let list = res.data.data.list;
+				this.employee_map = list;
+			});
+		},
+		deriveRestrict() {
+			this.deriveNum = 0;
+			this.$axios('GET', '/api/site/info').then(res => {
+				if (res.data.code == 1) {
+					this.deriveNum = Number(res.data.data.export_max_num);
+				}
+			});
 		},
 		getTypes() {
 			var arr = this.$getTyps();
@@ -549,22 +564,22 @@ export default {
 					}, 3000);
 				});
 		},
-		tealConfirm(){
+		tealConfirm() {
 			this.keyWordSelect();
 		},
-		handleOnthecross(event, file, fileList){
-			this.nowIndex = 2
+		handleOnthecross(event, file, fileList) {
+			this.nowIndex = 2;
 		},
 		handlePictureCardPrediv(response) {
-			if(response.code == 1){
-				response.data.id = 1
-			}else{
-				response.data.id = 0
-				response.data.name = response.msg
+			if (response.code == 1) {
+				response.data.id = 1;
+			} else {
+				response.data.id = 0;
+				response.data.name = response.msg;
 			}
-			this.toleadResult = response.data
-			this.nowIndex = 3
-			return
+			this.toleadResult = response.data;
+			this.nowIndex = 3;
+			return;
 			// this.nowIndex = 3
 			if (response.code == 1) {
 				if (response.data.error.length > 0) {
@@ -588,8 +603,7 @@ export default {
 					this.keyWordSelect();
 					this.close_import();
 				}
-			}else{
-
+			} else {
 				this.$message.error({ message: response.msg });
 			}
 		},
@@ -599,17 +613,17 @@ export default {
 			const $ext_name = file.name.split('.')[len];
 			if ($ext_list.indexOf($ext_name) != -1) {
 			} else {
-				this.toleadResult.id = 0
-				this.toleadResult.name = '文件格式上传错误,仅支持上传xlsx,xls)'
-				this.nowIndex = 3
+				this.toleadResult.id = 0;
+				this.toleadResult.name = '文件格式上传错误,仅支持上传xlsx,xls)';
+				this.nowIndex = 3;
 				// this.$message.warning('文件格式上传错误,仅支持上传xlsx,xls)');
 				return false;
 			}
 		},
 		exportExcel() {
-			if(this.deriveNum > 0 && this.total >= this.deriveNum){
-				this.$message.warning('当前数据已超出'+ this.deriveNum +'条,请拆分时间段分批导出');
-				return
+			if (this.deriveNum > 0 && this.total >= this.deriveNum) {
+				this.$message.warning('当前数据已超出' + this.deriveNum + '条,请拆分时间段分批导出');
+				return;
 			}
 			window.open(
 				process.env.VUE_APP_BASE_API +
@@ -617,14 +631,17 @@ export default {
 					this.$getUserData().id +
 					'&page=' +
 					this.formData.page +
-					'&page_size=' +
+					'&page_size=' +	
 					this.formData.page_size +
+					'&order_key=update_time'+
+					(this.formData.employee_ids ? '&employee_ids=' + this.formData.employee_ids : '') +
 					(this.formData.rule_id ? '&rule_id=' + this.formData.rule_id : '') +
 					(this.formData.pt_id ? '&pt_id=' + this.formData.pt_id : '') +
 					(this.formData.dept_ids ? '&dept_ids=' + this.formData.dept_ids : '') +
 					(this.formData.source_type ? '&source_type=' + this.formData.source_type : '') +
 					(this.formData.start_day ? '&start_day=' + this.formData.start_day : '') +
 					(this.formData.end_day ? '&end_day=' + this.formData.end_day : '') +
+					(this.formData.dc_status ? '&dc_status=' + this.formData.dc_status : '') +
 					(this.formData.keyword ? '&keyword=' + this.formData.keyword : ''),
 				'_blank'
 			);
@@ -799,12 +816,12 @@ export default {
 };
 </script>
 <style scoped lang="scss">
-.remark{
+.remark {
 	display: -webkit-box;
 	-webkit-box-orient: vertical;
 	-webkit-line-clamp: 2;
 	overflow: hidden;
-}	
+}
 .title {
 	text-align: center;
 	font-weight: 700;
@@ -858,7 +875,7 @@ header.el-drawer__header {
 	padding: 20px;
 	height: calc(100vh - 140px);
 	overflow: auto;
-    padding-bottom: 100px;
+	padding-bottom: 100px;
 	.row_title {
 		position: relative;
 		margin: 0 0 20px 0;
@@ -913,7 +930,7 @@ span.point {
 	background: #f0f9eb !important;
 	color: #67c23a !important;
 	border: 1px solid #67c23a !important;
-	padding:9px !important;
+	padding: 9px !important;
 	min-width: 800px;
 	border-radius: 4px;
 }

+ 900 - 0
src/views/ranking/integral_event_two.vue

@@ -0,0 +1,900 @@
+<template>
+	<div>
+		<div class="all padding-20">
+			<header class="flex-box-ce" style="padding-bottom: 20px;">
+				<div style="padding-right: 20px;" class="fh" @click="$router.go(-1)">返回</div>
+				<div>{{parameter.name}}的奖扣执行明细</div>
+			</header>
+			<el-form ref="form" :inline="true" label-width="80px">
+				<el-form-item label="事件来源">
+					<el-select class="date-picker-width" size="medium" v-model="formData.source_type" clearable placeholder="全部">
+						<el-option v-for="item in source_type" :key="item.id" :label="item.name" :value="item.id"></el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item>
+					<div class="flex-box-ce">
+						<el-select size="medium" v-model="select_employee_id" filterable clearable placeholder="请输入或选择人员" style="width: 250px;margin-right: 10px;">
+							<el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
+						</el-select>
+						<el-input size="medium" v-model="formData.keyword" placeholder="输入关键字查找" max="200" @keyup.enter.native="keyWordSelect">
+							<el-button size="medium" slot="append" icon="el-icon-search" @click="keyWordSelect"></el-button>
+						</el-input>
+					</div>
+				</el-form-item>
+				<el-form-item>
+					<el-button type="primary" size="medium" @click="exportExcel" plain>导出全部事件</el-button>
+					<!-- <el-button class="first-element-btn" size="medium" v-if="employeeOrdept" :disabled="deleteDisabled" @click="deleteInBatches" type="danger">批量删除</el-button> -->
+				</el-form-item>
+			  <el-alert v-if="str" :title="'此列表受【数据查看权限】控制,当前权限:'+str" type="info"></el-alert>
+			</el-form>
+
+			<!-- 表格 -->
+			<div>
+				<el-table :data="list" style="width: 100%;cursor: pointer;" v-loading="loading" @row-click="open_detail" @selection-change="deleteEvents">
+					<el-table-column v-if="employeeOrdept" type="selection" width="55"></el-table-column>
+					<el-table-column prop="employee_name" label="姓名" align="left" min-width="125px">
+						<template slot-scope="scope">
+							<div class="flex-box">
+								<userImage :user_name="scope.row.employee_name" :img_url="scope.row.employee_img_url" width="50px" height="50px"></userImage>
+								<span style="line-height: 50px; padding-left: 10px;">{{ scope.row.employee_name }}</span>
+							</div>
+						</template>
+					</el-table-column>
+					<el-table-column prop="dept" show-overflow-tooltip label="部门" align="left" min-width="120px"></el-table-column>
+					<el-table-column prop="point" label="积分" align="left" min-width="120px">
+						<template slot-scope="scope">
+							<span :class="scope.row.point < 0 ? 'green' : 'red'">{{ scope.row.point }} {{ point_name(scope.row.pt_id) }}</span>
+						</template>
+					</el-table-column>
+					<el-table-column prop="remark" label="事件内容" align="left" min-width="280px">
+						<template slot-scope="scope">
+							<el-tooltip class="item" effect="dark" placement="top">
+								<div slot="content" style="width: 400px;">{{ scope.row.remark }}</div>
+								<div class="remark">{{ scope.row.remark }}</div>
+							</el-tooltip>
+						</template>
+					</el-table-column>
+					<el-table-column prop="rule_name" show-overflow-tooltip label="规则分类" align="left" min-width="140px"></el-table-column>
+					<el-table-column prop="create_time" label="事件发生时间" align="left" min-width="140px">
+						<template slot-scope="scope">
+							{{ scope.row.event_time }}
+						</template>
+					</el-table-column>
+					<el-table-column prop="source_type" label="来源" align="left" min-width="140px">
+						<template slot-scope="scope">
+							<span v-show="scope.row.source_type == 1">
+								积分奖扣
+								<span v-if="scope.row.recorder_name">({{ scope.row.recorder_name }})</span>
+							</span>
+							<span v-show="scope.row.source_type == 2">任务</span>
+							<span v-show="scope.row.source_type == 3">积分系统分配</span>
+							<span v-show="scope.row.source_type == 4">考勤系统分配</span>
+							<span v-show="scope.row.source_type == 5">
+								积分申请
+								<span v-if="scope.row.applyor_name">({{ scope.row.applyor_name }})</span>
+							</span>
+							<span v-show="scope.row.source_type == 6">绩效任务包</span>
+							<span v-show="scope.row.source_type == 8">积分导入</span>
+							<span v-show="scope.row.source_type == 9">A分转B分</span>
+							<span v-show="scope.row.source_type == 10">钉钉汇报(日志)奖扣分</span>
+							<span v-show="scope.row.source_type > 10">其他</span>
+						</template>
+					</el-table-column>
+					<el-table-column prop="update_time" label="录入时间" align="left" width="140px">
+						<template slot-scope="scope">
+							<!-- {{ cuttString(scope.row.create_time) }} -->
+							{{ scope.row.update_time }}
+						</template>
+					</el-table-column>
+
+					<template slot="empty">
+						<noData></noData>
+					</template>
+				</el-table>
+				<center class="pagination">
+					<el-pagination
+						background
+						@size-change="handleSizeChange"
+						@current-change="handleCurrentChange"
+						:current-page="formData.page"
+						:page-sizes="[10, 20, 50, 100]"
+						layout="total, sizes, prev, pager, next"
+						:page-size="pageLimit"
+						:total="total"
+					></el-pagination>
+				</center>
+			</div>
+		</div>
+		<el-drawer title="事件详情" :visible.sync="detail_popup" ref="drawer" :with-header="false" :width="'500px'" direction="rtl">
+			<div class="drawer_title">事件详情</div>
+			<div class="detail_popup" v-loading="detail_loading" v-if="detail_info !== null">
+				<el-row style="padding-bottom:10px;border-bottom:1px #f8f8f8 solid;">
+					<div class="flex-box flex-v-ce">
+						<userImage :user_name="detail_info.employee_name" width="50px" height="50px" fontSize="1"></userImage>
+						<span style="font-size: 18px;line-height:50px; margin-left:10px;margin-right:4px;">{{ detail_info.employee_name }}</span>
+						<span class="red point" v-show="detail_info.point >= 0">+{{ detail_info.point }} {{ point_name(detail_info.pt_id) }}</span>
+						<span class="green point" v-show="detail_info.point < 0">{{ detail_info.point }} {{ point_name(detail_info.pt_id) }}</span>
+					</div>
+				</el-row>
+
+				<el-row v-show="detail_info.rule_list">
+					<el-col :span="6">任务描述</el-col>
+					<el-col :span="18" v-if="detail_info.remark">{{ detail_info.remark && (detail_info.remark.customize || detail_info.remark.rule) }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.files && detail_info.files.length > 0">
+					<el-col :span="18" :offset="6">
+						<el-image
+							v-for="(itme, index) in detail_info.files"
+							:key="index"
+							style="width: 80px; height: 80px;margin: 0 5px;"
+							:src="itme"
+							:preview-src-list="detail_info.files"
+						></el-image>
+					</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.rule_list">
+					<el-col :span="6">规则分类</el-col>
+					<el-col :span="18">{{ detail_info.rule_list }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.source_type_mark">
+					<el-col :span="6">来源类型</el-col>
+					<el-col :span="18">{{ detail_info.source_type_mark }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.recorder_name">
+					<el-col :span="6">记录人</el-col>
+					<el-col :span="18">{{ detail_info.recorder_name }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.date">
+					<el-col :span="6">事件时间</el-col>
+					<el-col :span="18">{{ detail_info.date }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.complete_task.time">
+					<el-col :span="6">完成时间</el-col>
+					<el-col :span="18">{{ detail_info.complete_task.time }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.complete_task.remark">
+					<el-col :span="6">完成备注</el-col>
+					<el-col :span="18">{{ detail_info.complete_task.remark }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.complete_task && detail_info.complete_task.files && detail_info.complete_task.files.length > 0">
+					<el-col :span="18" :offset="6">
+						<el-image
+							v-for="(itme, index) in detail_info.complete_task.files"
+							:key="index"
+							style="width: 80px; height: 80px;margin: 0 5px;"
+							:src="itme"
+							:preview-src-list="detail_info.complete_task.files"
+						></el-image>
+					</el-col>
+				</el-row>
+
+				<div v-show="detail_info.rule_id">
+					<p class="row_title">规则依据</p>
+					<el-row>
+						<el-col :span="6">规则分类</el-col>
+						<el-col :span="18">{{ detail_info.rule_list }}</el-col>
+					</el-row>
+					<el-row v-show="detail_info.remark.rule">
+						<el-col :span="6">积分规则</el-col>
+						<el-col :span="18">{{ detail_info.remark.rule }}</el-col>
+					</el-row>
+					<el-row>
+						<el-col :span="6">积分</el-col>
+						<el-col :span="18" v-show="detail_info.rule_item.min_point == detail_info.rule_item.max_point">{{ detail_info.rule_item.min_point }}</el-col>
+						<el-col :span="18" v-show="detail_info.rule_item.min_point != detail_info.rule_item.max_point">
+							{{ detail_info.rule_item.min_point }} ~ {{ detail_info.rule_item.max_point }}
+						</el-col>
+					</el-row>
+				</div>
+				<div v-show="detail_info.process"><Steps :process="detail_info.process"></Steps></div>
+				<div v-show="detail_info.dc_remark.flow"><Review :process="detail_info.dc_remark.flow" :status="detail_info.dc_status"></Review></div>
+				<div style="text-align: center;margin-top: 30px;" v-if="detail_info.source_type == 10 && see_log">
+					<el-button type="primary" size="medium" @click="showLog = true">
+						查看日志详情内容
+						<span style=";padding-left:5px;">»</span>
+					</el-button>
+				</div>
+			</div>
+			<div v-if="!this.$authoritys('employee') && !this.$authoritys('dept_manager')" style="position: absolute; bottom: 20px; display: block; right: 20px;">
+				<el-button @click="close_integral_event">取消</el-button>
+				<el-button type="danger" @click="del_integral_event(detail_info)">删除</el-button>
+			</div>
+		</el-drawer>
+
+		<el-dialog title="查看日志详情" width="600px" :visible.sync="showLog">
+			<div class="title">{{ ding_report.creator_name }}的{{ ding_report.template_name }}</div>
+			<div v-if="ding_report.contents.length > 0">
+				<div class="contents" v-for="(item, index) in ding_report.contents" :key="index">
+					<div class="key">{{ item.key }}</div>
+					<div class="value fontColorF">
+						<span v-if="item.value">{{ item.value }}</span>
+						<span v-else>未填写</span>
+					</div>
+				</div>
+			</div>
+			<div v-if="ding_report.images.length > 0">
+				<div class="key" style="margin-bottom: 20px;">图片</div>
+				<div class="flex-box flex-d-wrap">
+					<el-image
+						v-for="(item, index) in ding_report.images"
+						:key="index"
+						style="width: 100px; height: 100px;margin-right:8px"
+						:src="item"
+						:preview-src-list="ding_report.images"
+					></el-image>
+				</div>
+			</div>
+		</el-dialog>
+
+		<el-dialog title="导入错误信息" :visible.sync="importErrorInfoShow" width="30%">
+			<div>
+				<el-table :data="error_list" border stripe>
+					<el-table-column prop="name" label="错误信息">
+						<template slot-scope="scope">
+							{{ scope.row }}
+						</template>
+					</el-table-column>
+				</el-table>
+			</div>
+			<span slot="footer"><el-button type="primary" size="medium" @click="importErrorInfoShow = false">确 定</el-button></span>
+		</el-dialog>
+
+		<el-dialog title="轮播事件" :visible.sync="swiperShow" width="500px">
+			<div>
+				<el-row>
+					<el-col :span="5" style="line-height: 36px;">仅展示最新的</el-col>
+					<el-col :span="6">
+						<el-select v-model="page_size" placeholder="请选择">
+							<el-option v-for="item in swiperPageList" :key="item.value" :label="item.value" :value="item.value"></el-option>
+						</el-select>
+					</el-col>
+					<el-col :span="6" style="line-height: 36px;">条积分事件来轮播</el-col>
+				</el-row>
+			</div>
+			<span slot="footer">
+				<el-button size="medium" @click="swiperShow = false" style="margin-right: 10px;">取 消</el-button>
+				<router-link :to="{ path: '/deptRankSwiper?' + '&page=1&page_size=' + this.page_size + '&type=1' }" target="_blank">
+					<el-button size="medium" type="primary">开始轮播</el-button>
+				</router-link>
+			</span>
+		</el-dialog>
+		<toLead :visible.sync="toleadShw" :nowIndex.sync="nowIndex" :tolead="toleadResult" @confirm="tealConfirm" :export_type="'integral_event'" :dstyle="'height:130px;'">
+			<template slot="1">
+				<div v-if="nowIndex == 1">
+					<div class="flex-box flex-v-ce margin-bottom">
+						<div style="margin-right: 10px;">1、下载积分事件模版,批量录入积分事件</div>
+						<el-button size="medium" type="primary" @click="downloadTemplate" plain>下载模板</el-button>
+					</div>
+					<div class="margin-bottom">
+						<el-upload
+							:limit="1"
+							:headers="ATOKEN"
+							ref="upload"
+							:action="action"
+							:on-remove="handleRemove"
+							:on-success="handlePictureCardPrediv"
+							:file-list="fileList"
+							:before-upload="beforeFilesUpload"
+							:on-progress="handleOnthecross"
+						>
+							<p>
+								2、上传积分事件数据Excel表
+								<el-button style="margin-left: 10px;" size="medium" type="primary" plain>选择文件</el-button>
+							</p>
+						</el-upload>
+					</div>
+				</div>
+			</template>
+		</toLead>
+	</div>
+</template>
+<script>
+import Steps from '@/components/Steps';
+import Review from '@/components/Review';
+import toLead from '@/components/toLead';
+export default {
+	data() {
+		return {
+			parameter:{},
+			deleteDisabled: true,
+			action: process.env.VUE_APP_BASE_API + 'api/integral/import',
+			ATOKEN: { 'A-TOKEN': this.$getToken(), Accept: 'application/vnd.test.v2+json' },
+
+			loading: false,
+			swiperShow: false,
+			swiperPageList: [{ value: '10' }, { value: '30' }, { value: '50' }],
+			page_size: 10,
+			point_types: this.$getTyps(),
+			dept_name: [],
+			dept_tree: [],
+			formData: {
+				page: 1,
+				page_size: 10,
+				month:'',
+				pt_id:3,
+				dc_status:JSON.stringify([1]),
+				order_key:'update_time'
+			},
+			time_slot: null,
+			rule_trees: [],
+			props: { checkStrictly: true, value: 'id', label: 'name', children: 'child' },
+			rule: [],
+			list: [],
+			total: null,
+			detail_info: null,
+			detail_popup: false,
+			detail_loading: false,
+			pageLimit: 10,
+			excelImportShow: false,
+			update_btn: false,
+			error_list: [],
+			importErrorInfoShow: false,
+			fileList: [],
+			employeeOrdept: !this.$authoritys('employee') && !this.$authoritys('dept_manager'),
+			select_employee_id: '',
+			employee_map: [],
+			selectionID: [], //删除的事件ID
+			// 查看日志
+			showLog: false,
+			see_log: 1,
+			ding_report: {
+				contents: [],
+				images: []
+			},
+			//导入相关
+			toleadShw: false,
+			nowIndex: 1,
+			toleadResult: {},
+			deriveNum: 0,
+			str:'',
+			source_type: [
+				{ id: 0, name: '全部' },
+				{ id: 1, name: '积分奖扣' },
+				{ id: 2, name: '任务' },
+				{ id: 3, name: '积分系统分配' },
+				{ id: 4, name: '考勤系统分配' },
+				{ id: 5, name: '积分申请' },
+				// {id: 6,name: '绩效任务包'},
+				{ id: 8, name: '积分导入' },
+				{ id: 9, name: 'A分转B分' },
+				{ id: 10, name: '钉钉汇报(日志)奖扣分' }
+			]
+		};
+	},
+	components: { Steps, toLead,Review },
+	created() {
+		this.parameter=JSON.parse(this.$route.query.data);
+		this.formData.month=this.parameter.date;
+		this.formData.recorder_id=this.parameter.id;
+		this.getEmployee();
+		this.getDataAccess();
+		
+		document.getElementById('main').scrollTop = 0;
+	},
+	mounted() {
+		this.deriveRestrict();
+		this.getDepartment();
+		this.get_rule_trees();
+		this.get_integral_list(this.formData);
+		this.see_log = this.$store.state.config.see_log;
+		this.point_types = this.getTypes();
+	},
+	watch: {
+		toleadShw(val) {
+			if (val) this.nowIndex = 1;
+		},
+		selectionID() {
+			if (this.selectionID.length == 0) {
+				this.deleteDisabled = true;
+			} else {
+				this.deleteDisabled = false;
+			}
+		},
+		'formData.pt_id'(val, old_val) {
+			this.formData.page = 1;
+			!val ? delete this.formData.pt_id : '';
+			this.get_integral_list(this.formData);
+		},
+		'formData.source_type'(val) {
+			this.formData.page = 1;
+			val == 0 ? delete this.formData.source_type : '';
+			this.get_integral_list(this.formData);
+		},
+		'formData.page'(val, old_val) {
+			this.get_integral_list(this.formData);
+		},
+		select_employee_id(val) {
+		  this.formData.page = 1;
+		  this.formData.employee_ids = val;
+		  this.get_integral_list(this.formData);
+		},
+		time_slot(val, old_val) {
+			this.formData.page = 1;
+			if (val !== null) {
+				this.formData.start_day = val[0];
+				this.formData.end_day = val[1];
+			} else {
+				delete this.formData.start_day;
+				delete this.formData.end_day;
+			}
+			this.get_integral_list(this.formData);
+		},
+		dept_name(val, old_val) {
+			this.formData.page = 1;
+			if (val.length !== 0) {
+				this.formData.dept_ids = val[val.length - 1];
+			} else {
+				this.formData.dept_ids = 0;
+			}
+			this.$nextTick(() => {
+				this.$refs.dept.dropDownVisible = false;
+				this.get_integral_list(this.formData);
+			});
+		}
+	},
+	methods: {
+		// 获取数据范围权限
+		getDataAccess(id) {
+			this.$axios('get', '/api/integral/statistics/range_level').then(res => {
+				let resData = res.data.data;
+				if(resData==1){
+					this.str='仅查看自己的数据'
+				}else if(resData==2){
+					this.str='查看自己以及管理范围内用户的数据'
+				}else if(resData==3){
+					this.str='查看全员数据'
+				}
+				
+			})
+		},
+		//获取员工列表
+		getEmployee() {
+			this.$axios('get', '/api/employee/index', { dept_id: 0, keywords: '', page: 1, page_size: 3000, is_official: 1 }).then(res => {
+				let list = res.data.data.list;
+				this.employee_map = list;
+			});
+		},
+		deriveRestrict() {
+			this.deriveNum = 0;
+			this.$axios('GET', '/api/site/info').then(res => {
+				if (res.data.code == 1) {
+					this.deriveNum = Number(res.data.data.export_max_num);
+				}
+			});
+		},
+		getTypes() {
+			var arr = this.$getTyps();
+			return arr.filter(function(item) {
+				return item.code != 'JX';
+			});
+		},
+		handleRemove(file, fileList) {
+			// if (fileList !== null && fileList.length != 0) {
+			// 	this.import_btn_show = true;
+			// } else {
+			// 	this.import_btn_show = false;
+			// }
+		},
+		// 导入相关
+		close_import() {
+			this.excelImportShow = false;
+			this.$refs.upload.clearFiles();
+		},
+		// keyword
+		keyWordSelect() {
+			this.formData.page = 1;
+			this.get_integral_list(this.formData);
+		},
+		downloadTemplate() {
+			window.open(process.env.VUE_APP_BASE_API + 'api/download/integral/template');
+		},
+		uploadFile() {
+			let params = {};
+			params.file = this.file;
+			this.update_btn = true;
+			this.$axios('post', '/api/integral/import', params, 'v2')
+				.then(res => {
+					if (res.data.code == 1) {
+						if (res.data.data.error.length == 0) {
+							this.$message({ type: 'success', message: '导入成功' });
+							this.excelImportShow = false;
+						} else {
+							this.$message({ type: 'error', message: '导入错误' });
+							this.error_list = res.data.data.error;
+							this.importErrorInfoShow = true;
+						}
+					} else {
+						this.$message({ type: 'error', message: res.data.msg });
+					}
+				})
+				.finally(() => {
+					setTimeout(() => {
+						this.update_btn = false;
+					}, 3000);
+				});
+		},
+		tealConfirm() {
+			this.keyWordSelect();
+		},
+		handleOnthecross(event, file, fileList) {
+			this.nowIndex = 2;
+		},
+		handlePictureCardPrediv(response) {
+			if (response.code == 1) {
+				response.data.id = 1;
+			} else {
+				response.data.id = 0;
+				response.data.name = response.msg;
+			}
+			this.toleadResult = response.data;
+			this.nowIndex = 3;
+			return;
+			// this.nowIndex = 3
+			if (response.code == 1) {
+				if (response.data.error.length > 0) {
+					var htmls = response.data.error;
+					var str = "<div class='red'></div>";
+					htmls.forEach(item => {
+						str += `<div>${item}</div>`;
+					});
+					// this.close_import();
+					this.$notify.error({
+						title: '导入错误',
+						dangerouslyUseHTMLString: true,
+						message: str,
+						duration: 0,
+						offset: 50,
+						customClass: 'notifyBox'
+					});
+				} else {
+					this.file = response.data;
+					this.$message.success({ message: response.msg });
+					this.keyWordSelect();
+					this.close_import();
+				}
+			} else {
+				this.$message.error({ message: response.msg });
+			}
+		},
+		beforeFilesUpload(file) {
+			const $ext_list = ['xlsx', 'xls'];
+			let len = file.name.split('.').length - 1;
+			const $ext_name = file.name.split('.')[len];
+			if ($ext_list.indexOf($ext_name) != -1) {
+			} else {
+				this.toleadResult.id = 0;
+				this.toleadResult.name = '文件格式上传错误,仅支持上传xlsx,xls)';
+				this.nowIndex = 3;
+				// this.$message.warning('文件格式上传错误,仅支持上传xlsx,xls)');
+				return false;
+			}
+		},
+		exportExcel() {
+			if (this.deriveNum > 0 && this.total >= this.deriveNum) {
+				this.$message.warning('当前数据已超出' + this.deriveNum + '条,请拆分时间段分批导出');
+				return;
+			}
+			window.open(
+				process.env.VUE_APP_BASE_API +
+					'api/download/integral?employee_id=' +this.$getUserData().id +
+					'&page=' +this.formData.page +'&page_size=' +this.formData.page_size +'&pt_id=3'+'&dc_status=[1]'+
+					'&recorder_id=' +this.parameter.id +'&month=' +this.parameter.date +'&order_key=update_time'+
+					(this.formData.source_type ? '&source_type=' + this.formData.source_type : '') +
+					(this.formData.keyword ? '&keyword=' + this.formData.keyword : ''),
+				'_blank'
+			);
+		},
+		// end 文件上传
+		handleSizeChange(val) {
+			this.pageLimit = val;
+			this.formData.page_size = this.pageLimit;
+			this.get_integral_list(this.formData);
+		},
+		cuttString(data) {
+			return data.substring(5);
+		},
+		deleteInBatches() {
+			if (this.selectionID.length < 1) {
+				return false;
+			}
+			this.$confirm('此操作将永久删除选中的积分事件, 确认要删除吗?', '批量删除事件', {
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type: 'warning'
+			})
+				.then(() => {
+					this.loading = true;
+					this.$axios('POST', '/api/integral/statistics/integral/many', { event_ids: this.selectionID })
+						.then(res => {
+							if (res.data.code == 1) {
+								this.$message({
+									message: res.data.msg,
+									type: 'success'
+								});
+								if (this.selectionID.length == this.list.length) {
+									if (this.formData.page > 1) {
+										this.formData.page = this.formData.page - 1;
+									}
+								}
+								this.get_integral_list(this.formData);
+							} else {
+								this.$message.error(res.data.msg);
+							}
+						})
+						.finally(() => {
+							this.loading = false;
+						});
+				})
+				.catch(() => {});
+		},
+		deleteEvents(selection) {
+			let listId = [];
+			selection.forEach(item => {
+				listId.push(item.id);
+			});
+			this.selectionID = listId;
+		},
+		open_detail(item) {
+			this.detail_popup = true;
+			let data = {
+				event_id: item.id
+			};
+			this.detail_loading = true;
+			this.$axios('get', '/api/integral/statistics/integral/info', data)
+				.then(res => {
+					if (res.data.code == 1) {
+						this.detail_info = res.data.data;
+						var ding_report = res.data.data.remark.ding_report;
+						if (Object.keys(ding_report).length != 0) {
+							this.ding_report = res.data.data.remark.ding_report;
+						}
+					} else {
+						this.$message.error(res.data.data.msg);
+					}
+				})
+				.finally(() => {
+					this.detail_loading = false;
+				});
+		},
+		//获取部门
+		getDepartment() {
+			this.$axios('get', '/api/department/tree').then(res => {
+				this.dept_tree = this.getTreeData(res.data.data.list);
+			});
+		},
+		//获取规则
+		get_rule_trees() {
+			this.$axios('get', '/api/integral/rule/trees').then(res => {
+				this.rule_trees = this.getRuleTreeData(res.data.data.rule_tree);
+			});
+		},
+		get_integral_list(data) {
+			this.loading = true;
+			this.$axios('get', '/api/integral/statistics/integral', data)
+				.then(res => {
+					if (res.data.code == 1) {
+						this.list = res.data.data.list;
+						this.total = res.data.data.total;
+					} else {
+						this.$message.error(res.data.data.msg);
+					}
+				})
+				.finally(() => {
+					this.loading = false;
+				});
+		},
+		handleCurrentChange(val) {
+			this.formData.page = val;
+		},
+		rule_null(val) {
+			if (val.length == 0) {
+				this.formData.rule_id = 0;
+			} else {
+				this.formData.rule_id = this.rule[this.rule.length - 1];
+			}
+			this.$nextTick(() => {
+				this.$refs.rule.dropDownVisible = false;
+				this.get_integral_list(this.formData);
+			});
+		},
+		del_integral_event(item) {
+			this.$confirm('删除事件的同时也会撤销积分,确定删除吗?', '提示', {
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type: 'warning'
+			}).then(() => {
+				this.$axios('post', '/api/integral/statistics/integral/destroy', { event_id: item.event_id }).then(res => {
+					if (res.data.code == 1) {
+						this.$message.success(res.data.msg);
+						this.detail_popup = false;
+						this.get_integral_list(this.formData);
+					} else {
+						this.$message.error(res.data.msg);
+					}
+				});
+			});
+		},
+		close_integral_event() {
+			this.detail_popup = false;
+		},
+		point_name(id) {
+			return this.point_types.find(item => {
+				if (item.id == id) {
+					return item.name;
+				}
+			}).name;
+		},
+		// 递归判断列表,把最后的children设为undefined
+		getTreeData(data) {
+			for (var i = 0; i < data.length; i++) {
+				if (data[i]._child.length < 1) {
+					// children若为空数组,则将children设为undefined
+					data[i]._child = undefined;
+				} else {
+					// children若不为空数组,则继续 递归调用 本方法
+					this.getTreeData(data[i]._child);
+				}
+			}
+			return data;
+		},
+		// 规则递归 children
+		getRuleTreeData(data) {
+			for (var i = 0; i < data.length; i++) {
+				if (data[i].child.length < 1) {
+					// children若为空数组,则将children设为undefined
+					data[i].child = undefined;
+				} else {
+					// children若不为空数组,则继续 递归调用 本方法
+					this.getRuleTreeData(data[i].child);
+				}
+			}
+			return data;
+		}
+	}
+};
+</script>
+<style scoped lang="scss">
+.fh{
+	position: relative;
+	cursor: pointer;
+	padding-right: 40px !important;
+}
+.fh:hover{
+	color: #26a2ff;
+}
+.fh::after{
+	width: 2px;
+	background-color: #ccc;
+	height: 30px;
+	content: " ";
+	position: absolute;
+	right: 20px;
+	top: -5px;
+}
+.remark {
+	display: -webkit-box;
+	-webkit-box-orient: vertical;
+	-webkit-line-clamp: 2;
+	overflow: hidden;
+}
+.title {
+	text-align: center;
+	font-weight: 700;
+	max-width: 70%;
+	margin: 20px auto;
+	margin-top: 0;
+	font-size: 18px;
+}
+.key {
+	font-weight: 700;
+	font-size: 16px;
+}
+.value {
+	font-size: 14px;
+	margin: 10px 0;
+	margin-bottom: 20px;
+}
+.imgs {
+	width: 80px;
+	height: 80px;
+	margin-right: 5px;
+	margin-bottom: 5px;
+}
+header.el-drawer__header {
+	font-size: 18px;
+	font-family: MicrosoftYaHei;
+	color: #303133;
+	width: 500px;
+	span {
+		:focus {
+			outline: 0;
+		}
+	}
+}
+.display_flex {
+	display: flex;
+}
+.label {
+	line-height: 36px;
+	padding-right: 10px;
+}
+.time_section {
+	.el-range-editor {
+		width: 330px;
+	}
+}
+.pagination {
+	padding: 20px 0;
+}
+.detail_popup {
+	padding: 20px;
+	height: calc(100vh - 140px);
+	overflow: auto;
+	padding-bottom: 100px;
+	.row_title {
+		position: relative;
+		margin: 0 0 20px 0;
+		padding-top: 12px;
+		font-size: 16px;
+		color: #303133;
+		line-height: 22px;
+	}
+	.row_title:before {
+		position: absolute;
+		top: 0;
+		content: ' ';
+		width: 100%;
+		border-top: 1px #f8f8f8 solid;
+	}
+	.el-row {
+		margin-bottom: 10px;
+		font-size: 14px;
+		.el-col-4 {
+			color: #606266;
+		}
+	}
+}
+span.point {
+	font-size: 16px;
+}
+.drawer_title {
+	font-size: 18px;
+	padding: 20px;
+	border-bottom: 1px #efefef solid;
+}
+.row_tips {
+	display: block;
+	color: #909399;
+	font-size: 12px;
+	margin-top: 0px;
+}
+.el-range-editor--medium .el-range-separator {
+	width: 25px;
+}
+.integral_event_box {
+	background-color: #ffffff;
+	padding: 20px;
+	min-height: calc(100vh - 160px);
+}
+.examine_steps ::v-deep .el-step.is-vertical .el-step__title {
+	padding-bottom: 0;
+}
+
+.diy-tip1 {
+	margin-bottom: 10px !important;
+	background: #f0f9eb !important;
+	color: #67c23a !important;
+	border: 1px solid #67c23a !important;
+	padding: 9px !important;
+	min-width: 800px;
+	border-radius: 4px;
+}
+</style>

+ 2 - 1
src/views/ranking/log_rank.vue

@@ -105,6 +105,7 @@
 						</div>
 					</template>
 				</el-table-column>
+				<el-table-column show-overflow-tooltip label="部门" align="left" min-width="120px" prop="deptName"></el-table-column>
 				<el-table-column prop="point" label="日志分" align="left">
 					<template slot-scope="scope">
 						<b style="font-size:15px;color:#909399">{{ scope.row.point }}</b>
@@ -448,7 +449,7 @@ export default {
 			this.loading = true;
 			this.$axios('get', '/api/integral/statistics/ranking', data, 'v2')
 				.then(res => {
-					this.list = res.data.data.list;
+					this.list =this.$returnDeptName(res.data.data.list);
 					this.total = res.data.data.total;
 				})
 				.finally(() => {

+ 2 - 2
src/views/ranking/lotteryTicket_statistics.vue

@@ -70,11 +70,11 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column prop="performance" label="部门" align="left">
+<!--          <el-table-column prop="performance" label="部门" align="left">
             <template slot-scope="scope">
               <span>{{ scope.row.dept_name }}</span>
             </template>
-          </el-table-column>
+          </el-table-column> -->
           <el-table-column prop="a" label="奖票数量" align="left">
             <template slot-scope="scope">
               <span>{{ scope.row.ticketNumber }}</span>

+ 18 - 3
src/views/ranking/manager_statistics.vue

@@ -37,7 +37,7 @@
 						</el-form-item>
 
 						<!-- 搜索框 -->
-						<el-form-item style="margin-top: 2px;">
+						<el-form-item>
 							<el-input
 								v-model="condition.keyword"
 								placeholder="输入同事姓名"
@@ -61,7 +61,7 @@
 					<div class="flex-box-end">
 						<span class="yellow">*管理者奖扣任务均为B分,对A分不做要求*</span>
 					</div>
-					<el-table :data="last" style="width: 100%" v-loading="loading">
+					<el-table :data="last" style="width: 100%;cursor: pointer;" v-loading="loading"  @row-click="openDetail">
 						<el-table-column label="管理者">
 							<template slot-scope="scope">
 								<div class="flex-box flex-v-ce">
@@ -70,6 +70,7 @@
 								</div>
 							</template>
 						</el-table-column>
+						<el-table-column label="部门" align="left" prop="dept" show-overflow-tooltip></el-table-column>
 						<el-table-column label="奖分" prop="scope_count">
 							<template slot-scope="scope">
 								<b>{{ scope.row.reward.point }}&nbsp;</b>
@@ -109,6 +110,11 @@
 								<span class="span_h">人次目标 {{ scope.row.exec.target }}人次</span>
 							</template>
 						</el-table-column>
+						<el-table-column>
+							<template slot-scope="scope">
+								<span  class="blue" style="cursor: pointer;" @click="openDetail(scope.row)">查看奖扣明细</span>
+							</template>
+						</el-table-column>
 						<template slot="empty">
 							<div class="nopoint_box">
 								<div class="noimg noperson"></div>
@@ -170,6 +176,7 @@
 								</div>
 							</template>
 						</el-table-column>
+						<el-table-column show-overflow-tooltip label="部门" align="left" min-width="120px" prop="deptName"></el-table-column>
 						<el-table-column label="管理范围(人)" prop="scope_count"></el-table-column>
 						<el-table-column label="人均奖分(次)" prop="reward_count"></el-table-column>
 						<el-table-column label="人均扣分(次)" prop="deduct_count"></el-table-column>
@@ -319,6 +326,14 @@ export default {
 		}
 	},
 	methods: {
+		openDetail(e){
+			let data={
+				date:this.condition.month,
+				id:e.id,
+				name:e.name
+			}
+			this.$router.push({path:'/integral_event_two',query:{data:JSON.stringify(data)}})
+		},
 		//情况
 		get_last() {
 			this.loading = true;
@@ -391,7 +406,7 @@ export default {
 			this.$axios('get', '/api/integral/statistics/prize/list', this.formData, 'v3')
 				.then(res => {
 					if (res.data.code == 1) {
-						this.list = res.data.data.list;
+						this.list =this.$returnDeptName(res.data.data.list);
 						this.total = res.data.data.total;
 					} else {
 						this.$message.error(res.data.data.msg);

+ 2 - 1
src/views/ranking/task_rank.vue

@@ -105,6 +105,7 @@
 						</div>
 					</template>
 				</el-table-column>
+				<el-table-column show-overflow-tooltip label="部门" align="left" min-width="120px" prop="deptName"></el-table-column>
 				<el-table-column prop="point" label="任务分" align="left">
 					<template slot-scope="scope">
 						<b style="font-size:15px;color:#909399">{{ scope.row.point }}</b>
@@ -454,7 +455,7 @@ export default {
 			this.loading = true;
 			this.$axios('get', '/api/integral/statistics/ranking', data, 'v2')
 				.then(res => {
-					this.list = res.data.data.list;
+					this.list =this.$returnDeptName(res.data.data.list);
 					this.total = res.data.data.total;
 				})
 				.finally(() => {

+ 15 - 2
src/views/ranking/total_rank.vue

@@ -25,7 +25,7 @@
 				</el-form-item>
 			</el-form>
 
-			<el-table :data="list" style="width: 100%" v-loading="loading">
+			<el-table :data="list" style="width: 100%;cursor: pointer;" v-loading="loading" @row-click="open_detail">
 				<el-table-column label="名次" width="80" align="center">
 					<template slot-scope="scope">
 						<img v-if="scope.row.rank === 1" src="@/assets/image/statistics_NO1.png" alt="" />
@@ -42,7 +42,13 @@
 						</div>
 					</template>
 				</el-table-column>
+				<el-table-column show-overflow-tooltip label="部门" align="left" min-width="120px" prop="deptName"></el-table-column>
 				<el-table-column label="B分" align="left" prop="point"></el-table-column>
+				<el-table-column>
+					<template slot-scope="scope">
+						<span  class="blue" style="cursor: pointer;">查看详情</span>
+					</template>
+				</el-table-column>
 				<template slot="empty">
 					<div class="nopoint_box">
 						<div class="noimg noperson"></div>
@@ -164,6 +170,13 @@ export default {
 		}
 	},
 	methods: {
+		open_detail(item) {
+			let data={
+				userInfo:JSON.stringify(item),
+				type:2
+			}
+			this.$router.push({path: '/JfDetail',query:data})
+		},
 		exportExcel() {
 			//人员
 			this.Dc_Data.DC_position =this.Dc_Data.DC_position == 'manager' ? 'manager' : this.Dc_Data.DC_position == 'employee' ? 'employee' : this.Dc_Data.DC_position == '全部' ? 'all' : 'all';
@@ -220,7 +233,7 @@ export default {
 			this.loading = true;
 			this.$axios('get','/api/integral/statistics/ranking', this.formData,'v2').then(res => {
 					if (res.data.code == 1) {
-						this.list = res.data.data.list;
+						this.list =this.$returnDeptName(res.data.data.list);
 						this.total = res.data.data.total;
 					} else {
 						this.$message.error(res.data.data.msg);

+ 0 - 2
src/views/set/buy.vue

@@ -29,8 +29,6 @@ export default {
 	mounted() {
 		let s={'name':'喜喜',age:'18'}
 		let arr=Object.create(s);
-		// arr.name='喜喜2';
-		console.log(s,arr)
 	},
 	methods: {
 		init() {

+ 1 - 1
src/views/set/framework.vue

@@ -73,7 +73,7 @@
 						<el-table-column label="部门">
 							<template slot-scope="scope">
 								<div class="flex-box flex-v-ce bms">
-									<div v-for="(item, index) in scope.row.employee_detail.dept_list" :key="index">{{ item.dept_name }}</div>
+									<div v-for="(item, index) in scope.row.employee_detail.dept_list" :key="index">{{ item.dept_name }}<span v-if="scope.row.employee_detail.dept_list.length-index>1">,</span></div>
 								</div>
 							</template>
 						</el-table-column>

+ 1 - 1
src/views/set/log.vue

@@ -8,7 +8,7 @@
 					<br />
 					2、日志名称必须与“钉钉日志模板名称”一致,否则奖分不会生效
 					<br />
-					3、日志支持每月、每周、每汇报,可自行根据需要设置“日志积分规则
+					3、日志支持每月、每周、每汇报,可自行根据需要设置“日志积分规则
 				</div>
 				<div class="flex-box-end" style="margin-top: 20px;">
 					<el-button  v-if="$authoritys() != 'dept_manager' && $authoritys() != 'employee'" plain @click="isShowLog = true">刷新汇报记录</el-button>

+ 1076 - 0
src/views/set/screenSet.vue

@@ -0,0 +1,1076 @@
+<template>
+	<div class="all-box">
+		<div class="all" style="padding: 20px;">
+			<div class="flex-box-ce" style="padding: 30px 10px;">
+				<div class="flex-1">
+					<div style="font-size: 24px;font-weight: 700;margin-bottom: 5px;">数据大屏 
+					  <el-popover
+					    placement="bottom-start"
+					    title="使用须知"
+					    width="500"
+					    trigger="hover"
+					    content="这是一段内容,这是一段内容,这是一段内容,这是一段内容。">
+						<div>
+							<div style="padding: 10px 0;font-weight: 700;">如何显示大屏数据:</div>
+							<p>1.会议平板访问:在平板中输入大屏访问链接,密码验证后可直接访问</p>
+							<p>2.电脑投屏到其他设备:在电脑的浏览器上访问链接,投屏到大屏设备中</p>
+							<div style="padding: 10px 0;font-weight: 700">其他须知:</div>
+							<p>1.创建大屏名称和备注可用于区分不同区域或场景下的大屏,最多创建10个大屏</p>
+							<p>2.每个大屏仅支持3个窗口同时访问,每打开一个窗口都会占用访问数,请避免打开多余窗口</p>
+							<p>3.链接复制到其他设备,请用浏览器输入并打开访问链接,首次进入需输入密码</p>
+							<p>4.更换设置可直接操作保存,更换后刷新页面或稍候5分钟即可</p>
+							<p>5.如需切换其他大屏,请点击大屏右上角退出登录,重新输入其他大屏的密码即可</p>
+							<p>6.分享链接的密码重置后,对应的大屏需重新输入密码验证</p>
+							<p>7.本机上每次打开链接都需要密码</p>
+						</div>
+						<span style="font-size:12px;cursor: pointer;" class="blue" slot="reference">使用须知</span>
+					  </el-popover>
+					</div>
+					<div style="font-size: 14px;" class="fontColorB">积分可视化数据大屏,直观展现积分排名、积分快讯、运作情况,支持电脑投屏、会议平板直接访问。</div>
+				</div>
+				<el-button type="primary" @click="isPz = true">
+					创建数据大屏
+					<i class="el-icon-setting el-icon--right"></i>
+				</el-button>
+			</div>
+			<el-alert title="每个链接仅支持3个窗口同时在线访问,超出后无法获取数据" type="warning"></el-alert>
+			<el-table ref="multipleTable" :data="list" tooltip-effect="dark" align="center" v-loading="loading">
+				<el-table-column label="大屏名称" prop="name"></el-table-column>
+				<el-table-column label="备注" min-width="300" prop="remark"></el-table-column>
+				<el-table-column label="操作">
+					<template slot-scope="scope">
+						<div class="flex-box-ce">
+							<div @click.stop="openSet(scope.row)" style="margin-right: 10px;"><span class="lookQrcode blue">设置</span></div>
+							<!-- <div @click.stop="preview(scope.row,1)" style="margin-right: 10px;"><span class="lookQrcode green">预览</span></div> -->
+							<div @click.stop="preview(scope.row,2)" style="margin-right: 10px;"><span class="lookQrcode green">访问大屏</span></div>
+							<div @click.stop="compile(scope.row)" style="margin-right: 10px;"><span class="lookQrcode">编辑</span></div>
+							<div @click.stop="deleteSet(scope.row)"><span class="lookQrcode red">删除</span></div>
+						</div>
+					</template>
+				</el-table-column>
+				<template slot="empty">
+					<noData :isSolt="true">
+						<div>
+							您当前没有数据大屏配置,去添加
+							<span style="cursor: pointer;margin-left: 10px;" @click="isPz = true" class="blue">添加</span>
+						</div>
+					</noData>
+				</template>
+			</el-table>
+		</div>
+		<el-dialog :title="isCompile? '编辑数据大屏':'创建数据大屏'" :visible.sync="isPz" width="500px" class="dialog">
+			<el-form label-width="80px" :model="formData" ref="setForm" class="form">
+				<el-form-item
+					label="名称"
+					prop="name"
+					:rules="[{ required: true, message: '请输入名称', trigger: 'blur' }, { min: 2, max: 20, message: '长度在 2 到 20 个字符', trigger: 'blur' }]"
+				>
+					<el-input maxlength="20" show-word-limit v-model="formData.name" placeholder="请输入名称"></el-input>
+				</el-form-item>
+				<el-form-item
+					label="备注"
+					prop="remark"
+					:rules="[{ required: true, message: '请输入备注', trigger: 'blur' }, { min: 2, max: 100, message: '长度在 2 到 100 个字符', trigger: 'blur' }]"
+				>
+					<el-input type="textarea" placeholder="请输入备注" :rows="4" maxlength="100" show-word-limit v-model="formData.remark"></el-input>
+				</el-form-item>
+			</el-form>
+			<div class="flex-box-end">
+				<el-button @click="isPz = false">取消</el-button>
+				<el-button type="primary" :loading="setLoading" :disabled="setLoading" @click="saveFirst('setForm')">确定</el-button>
+			</div>
+		</el-dialog>
+		<el-dialog title="分享" :visible.sync="isPreview" width="500px" class="dialog">
+			<div>
+				<div>本机以外的其他设备可以通过链接访问数据大屏</div>
+				<div class="flex-box-ce" style="margin: 10px 0;">
+					<el-input style="width: 300px;" v-model="previewUrl" id="" disabled placeholder="链接"></el-input>
+					<div class="blue" style="padding-left: 10px;cursor: pointer;" @click="copy('1')">复制大屏链接</div>
+				</div>
+				<div class="flex-box-ce">
+					<el-input style="width: 300px;" v-model="code" placeholder="随机密码" disabled>
+						<el-button slot="append" @click="refresh">刷新</el-button>
+					</el-input>
+					<div class="blue" style="padding-left: 10px;cursor: pointer;" @click="copy('2')">复制密码</div>
+				</div>
+				<div class="fontColorB" style="font-size: 12px;margin-bottom: 10px;">刷新后原有的密码将失效</div>
+				<div class="yellow">每个链接仅支持3个窗口同时在线访问,超出后无法获取数据</div>
+			</div>
+			<div class="flex-box-end" style="margin: 10px 0;">
+				<el-button @click="preview({},1)" type="primary" plain>打开大屏</el-button>
+				<div class="flex-1"></div>
+				<el-button @click="isPreview = false" type="">关 闭</el-button>
+			</div>
+		</el-dialog>
+
+		<el-dialog title="设置" :visible.sync="dialogVisible" width="1000px" class="dialog">
+			<div class="flex-box">
+				<div class="flex-4" style="padding-top: 50px;">
+					<div  style="color: #222;font-weight: 700;font-size: 16px;padding-left: 8px;">点击下面模块,快速定位到设置项
+						<el-popover
+							    placement="bottom-start"
+							    title="示例"
+							    width="500"
+							    trigger="hover">
+								<div>
+									<img  src="@/assets/image/321.jpg" style="width: 100%;"/>
+								</div>
+								<span style="font-size:14px;cursor: pointer;" class="blue" slot="reference">示例</span>
+							  </el-popover>
+					 </div>
+					<div class="flex-box-ce">
+						<div class="flex-1">
+							<div class="border1" @click="activeQie('2')" :class="activeBor == '2' ? 'activeBor' : ''" style="height: 40px;line-height: 40px;">组织名称和logo设置</div>
+							<div class="border1" @click="activeQie('3')" :class="activeBor == '3' ? 'activeBor' : ''" style="height: 300px;line-height: 300px;">排行榜设置</div>
+						</div>
+						<div class="flex-1">
+							<div class="border1" @click="activeQie('1')" :class="activeBor == '1' ? 'activeBor' : ''" style="height: 40px;line-height: 40px;">标题设置</div>
+							<div class="border1" @click="activeQie('4')" :class="activeBor == '4' ? 'activeBor' : ''" style="height: 80px;line-height: 80px;">今日积分数据设置</div>
+							<div class="border1" @click="activeQie('5')" :class="activeBor == '5' ? 'activeBor' : ''" style="height: 212px;line-height: 212px;">活跃度设置</div>
+						</div>
+						<div class="flex-1">
+							<div class="" style="height: 44px;"></div>
+							<div class="border1" @click="activeQie('6')" :class="activeBor == '6' ? 'activeBor' : ''" style="height: 300px;line-height: 300px;">积分快讯设置</div>
+						</div>
+					</div>
+				</div>
+				<div class="flex-3 scroll-bar" id="scroll" style="height: 500px;overflow-y: scroll;margin-left: 10px;" @scroll="myFunction">
+					<el-form label-width="80px" :model="config" ref="setForm" class="form">
+						<div class="kuai">
+							<div class="formTitle">标题设置</div>
+							<div class="formBox">
+								<el-form-item label="标题名称">
+									<el-input class="width250" maxlength="10" show-word-limit v-model.trim="config.title" placeholder="请输入名称"></el-input>
+								</el-form-item>
+							</div>
+						</div>
+						<div class="kuai">
+							<div class="formTitle">组织名称和logo设置</div>
+							<div class="formBox">
+								<el-form-item label="组织名称">
+									<el-input class="width250" maxlength="10" show-word-limit v-model.trim="config.company.name" placeholder="请输入名称"></el-input>
+								</el-form-item>
+								<el-form-item label="logo">
+									<upload
+										:headers="Xtoken"
+										class="avatar-uploader"
+										action="https://integralsys.oss-cn-shenzhen.aliyuncs.com"
+										:show-file-list="false"
+										:multiple="false"
+										:limit="100"
+										accept="image/jpeg,image/png"
+										:on-success="handleFilesSuccess"
+										:before-upload="beforeUpload"
+									>
+										<img v-if="config.company.logo" :src="config.company.logo" class="avatar" />
+										<i v-else class="el-icon-plus avatar-uploader-icon"></i>
+									</upload>
+									<div class="yellow" style="font-size: 12px;">比例为1:1,最大不超过5M</div>
+								</el-form-item>
+							</div>
+						</div>
+						<div class="kuai">
+							<div class="formTitle">排行榜设置</div>
+							<div class="formBox">
+								<el-form-item label="名称">
+									<el-input class="width250" maxlength="10" show-word-limit v-model.trim="config.ranking.name" placeholder="请输入名称"></el-input>
+								</el-form-item>
+								<el-form-item label="时间">
+									<el-select class="width250" v-model="config.ranking.condition.date" placeholder="请选择积分类型">
+										<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option>
+									</el-select>
+									<el-date-picker
+										class="width250"
+										v-if="config.ranking.condition.date == 1"
+										v-model="config.ranking.condition.time"
+										type="daterange"
+										value-format="timestamp"
+										@change="setTime"
+										range-separator="至"
+										start-placeholder="开始日期"
+										end-placeholder="结束日期"
+									></el-date-picker>
+								</el-form-item>
+								<el-form-item label="部门">
+									<el-cascader
+										v-model="config.ranking.condition.deptArr"
+										:options="dept_tree"
+										:props="{ multiple : true,checkStrictly: true, value: 'id', label: 'name', children: '_child' }"
+										class="width250"
+										ref="dept1"
+										filterable
+										collapse-tags
+										placeholder="全部部门"
+										clearable
+									></el-cascader>
+								</el-form-item>
+								<el-form-item label="人员">
+									<el-select class="width250" v-model="config.ranking.condition.position" placeholder="请选择人员范围">
+										<el-option v-for="item in roleOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
+									</el-select>
+								</el-form-item>
+								<el-form-item label="类型">
+									<el-select class="width250" v-model="config.ranking.condition.point_id" placeholder="请选择积分类型">
+										<el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value" v-if="item.value != 1"></el-option>
+									</el-select>
+								</el-form-item>
+								<el-form-item label="排除">
+									<el-input class="width250" auto-complete="off" v-model="config.ranking.condition.employeeName" placeholder="请选择排除对象"></el-input>
+									<div @click="noPersonnelListTips" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
+								</el-form-item>
+							</div>
+						</div>
+
+						<div class="kuai">
+							<div class="formTitle">今日积分数据设置</div>
+							<div class="formBox">
+								<el-form-item label="部门">
+									<el-cascader
+										v-model="config.center.deptArr"
+										:options="dept_tree"
+										:props="{ multiple : true,checkStrictly: true, value: 'id', label: 'name', children: '_child' }"
+										ref="dept2"
+										class="width250"
+										filterable
+										collapse-tags
+										placeholder="全部部门"
+										clearable
+									></el-cascader>
+								</el-form-item>
+							</div>
+						</div>
+						<div class="kuai">
+							<div class="formTitle">活跃度设置
+							  <el-tooltip effect="dark" placement="top">
+							    <template slot="content">
+									获得积分人员占比=获得积分的人数/参与积分的总人数</br>
+									执行奖扣管理人员占比=有执行奖扣的人/总管理者人数</br>
+									基准标尺为执行下限,要求活跃度在标尺之上执行才算执行到位
+							    </template>
+							    <i class="el-icon-warning"></i>
+							  </el-tooltip>
+							</div>
+							<div class="formBox">
+<!-- 								<div style="color: #333;font-weight: 700;margin-bottom: 10px;">占比说明 </div>
+								<div class="fontColorF" style="line-height: 23px;margin-bottom: 10px;">获得积分人员占比=获得积分的人数/参与积分的总人数</br>执行奖扣管理人员占比=有执行奖扣的人/总管理者人数</br>基准标尺为执行下限,要求活跃度在标尺之上执行才算执行到位</div> -->
+								<el-form-item label="部门">
+									<el-cascader
+										v-model="config.active.deptArr"
+										:options="dept_tree"
+										:props="{ multiple : true,checkStrictly : true, value: 'id', label: 'name', children: '_child' }"
+										ref="dept3"
+										class="width250"
+										filterable
+										collapse-tags
+										placeholder="全部部门"
+										clearable
+									></el-cascader>
+								</el-form-item>
+								<el-form-item label="时间范围">
+									<el-select class="width250" v-model="config.active.type" placeholder="请选择时间范围">
+										<el-option key="1" label="近三天" :value="1"></el-option>
+										<el-option key="2" label="近三周" :value="2"></el-option>
+									</el-select>
+								</el-form-item>
+								<el-form-item label="标尺">
+									<el-input class="width250"  @input="config.active.base_ratio=config.active.base_ratio.replace(/^(0+)|[^\d]+/g,'')" v-model="config.active.base_ratio" placeholder="请输入标尺">
+										<template slot="append">
+											%
+										</template>
+									</el-input>
+								</el-form-item>
+							</div>
+						</div>
+						<div class="kuai">
+							<div class="formTitle">积分快讯设置</div>
+							<div class="formBox">
+								<div style="color: #333;font-weight: 700;margin-bottom: 10px;">显示最新产生的100条积分事件</div>
+								<el-form-item label="名称">
+									<el-input class="width250" maxlength="10" show-word-limit v-model.trim="config.event.name" placeholder="请输入名称"></el-input>
+								</el-form-item>
+								<el-form-item label="来源">
+									<el-select class="width250" multiple v-model="config.event.source_type" placeholder="请选择来源">
+										<el-option v-for="item in sourceOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
+									</el-select>
+								</el-form-item>
+								<el-form-item label="部门">
+									<el-cascader
+										v-model="config.event.deptArr"
+										:options="dept_tree"
+										:props="{ multiple : true,checkStrictly: true, value: 'id', label: 'name', children: '_child' }"
+										ref="dept4"
+										class="width250"
+										filterable
+										collapse-tags
+										placeholder="全部部门"
+										clearable
+									></el-cascader>
+								</el-form-item>
+								<el-form-item label="类型">
+									<el-select class="width250" v-model="config.event.ptId" placeholder="请选择积分类型">
+										<el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
+									</el-select>
+								</el-form-item>
+							</div>
+						</div>
+					</el-form>
+				</div>
+			</div>
+			<div class="flex-box-end" style="padding-top: 10px;">
+				<el-button @click="dialogVisible = false">取消</el-button>
+				<el-button type="primary" :loading="setLoading" :disabled="setLoading" @click="submit()">确定</el-button>
+			</div>
+			<el-dialog title="选择人员" width="640px" :visible.sync="show_employee_selector" append-to-body>
+				<EmployeeSelector
+					v-if="show_employee_selector"
+					ref="members"
+					:isChecKedAll="false"
+					:user_no_select="false"
+					:max="30"
+					:selected="employee_selected"
+					@confirm="move_employee_confirm"
+				/>
+				<span slot="footer" class="dialog-footer">
+					<el-button @click="show_employee_selector = false">取 消</el-button>
+					<el-button type="primary" @click="submitMembers()">保 存</el-button>
+				</span>
+			</el-dialog>
+		</el-dialog>
+		
+	</div>
+</template>
+
+<script>
+import upload from '@/components/upload';
+import EmployeeSelector from '@/components/EmployeeSelector.vue';
+export default {
+	name: 'screenSet',
+	components: { upload, EmployeeSelector },
+	data() {
+		return {
+			Xtoken: { 'X-Token': this.$getToken() },
+			loading: false,
+			setLoading: false,
+			ding_enable: true,
+			list: [],
+			dialogVisible: false,
+			isPz: false,
+			dept_tree: [], //部门列表
+			options: [
+				{
+					value: -5,
+					label: '本年'
+				},
+				{
+					value: -4,
+					label: '本季'
+				},
+				{
+					value: -3,
+					label: '本月'
+				},
+				{
+					value: -2,
+					label: '本周'
+				},
+				{
+					value: -1,
+					label: '本天'
+				},
+				{
+					value: 1,
+					label: '自定义时间区间'
+				}
+			],
+			roleOptions: [
+				{
+					value: 'all',
+					label: '全部'
+				},
+				{
+					value: 'manager',
+					label: '管理员'
+				},
+				{
+					value: 'employee',
+					label: '员工'
+				}
+			],
+			sourceOptions: [
+				{
+					value: 1,
+					label: '积分录入'
+				},
+				{
+					value: 2,
+					label: '任务'
+				},
+				{
+					value: 3,
+					label: '积分系统分配'
+				},
+				{
+					value: 4,
+					label: '考勤系统分配'
+				},
+				{
+					value: 5,
+					label: '积分申请'
+				},
+				// {
+				// 	value: 6,
+				// 	label: '绩效任务包'
+				// },
+				{
+					value: 8,
+					label: '积分导入'
+				},
+				{
+					value: 9,
+					label: 'A分转B分'
+				},
+				{
+					value: 10,
+					label: '钉钉报告直接奖励'
+				}
+			],
+			typeOptions: [
+				{
+					value: 1,
+					label: '全部'
+				},
+				{
+					value: 2,
+					label: 'A分'
+				},
+				{
+					value: 3,
+					label: 'B分'
+				}
+			],
+			activeBor: '1',
+			isShowName: false,
+			nameVal: '',
+			employeeName: '',
+			employee_selected: { dept: [], employee: [] },
+			show_employee_selector: false,
+			isCompile:false,//是否编辑
+			
+			isPreview: false,
+			previewUrl:'',
+			code:'',
+			selectItem:{},
+			formData: {
+				// id:'',//修改与删除时,必传 不传则为新增
+				name: '', //不是删除则必填 配置名称 1-20个字符
+				remark: '', //备注信息 最多20个字符 默认空
+				del: 0, //是否为删除操作 1 是 其他否 默认0
+				remake_code: 0 //是否重新生成校验码 1 是 默认0
+			},
+			defaultConfig: {
+				//配置格式 不是删除则必填
+				company: {
+					name: this.$getUserData().company_info.name.slice(0, 10), //不超过十个字 公司名截断
+					logo: 'https://integralsys.oss-cn-shenzhen.aliyuncs.com/intesys/dd/17/2022/07/01/CaBis82ryBYbncxc3nehiSXkiwDbhbwi.png' //公司logo
+				},
+				title: '积分数据大屏', //不超过十个字
+				ranking: {
+					//从阶段排名拿数据
+					name: '排行榜', //不超过十个字
+					condition: {
+						//筛选条件,
+						time: [],
+						date: -3,
+						start_date: -3, //结束时间
+						end_date: -3, //开始时间
+						deptArr: [],
+						dept: [], //限定部门ID列表  空全公司
+			
+						point_id: 3, //2AF   3BF,
+						position: 'all', //manager  all//员工 管理员  全部
+						employeeName: '',
+						exclusion: [] ,//不参与排名,
+						employee:[],
+					}
+				},
+				center: {
+					deptArr: [],
+					dept: [] //部门ID列表  空全公司
+				},
+				active: {
+					base_ratio: 60, //基准比例
+					deptArr: [],
+					dept: [], //部门ID列表  空全公司
+					type: 1
+				},
+				event: {
+					name: '积分快讯', //排行榜名称
+					source_type: [1, 2, 5], //来源ID列表 1积分录入 2任务 3积分系统分配 4考勤系统分配 5积分申请 6绩效任务包	8积分导入 9A分转B分 10钉钉报告直接奖励
+					deptArr: [],
+					dept: [], //部门ID列表  空全公司
+					point_id: [2, 3], //积分类型  2AF 3BF
+					ptId: 1
+				}
+			},
+			config: {
+				//配置格式 不是删除则必填
+				company: {
+					name: this.$getUserData().company_info.name.slice(0, 10), //不超过十个字 公司名截断
+					logo: 'https://integralsys.oss-cn-shenzhen.aliyuncs.com/intesys/dd/17/2022/07/01/CaBis82ryBYbncxc3nehiSXkiwDbhbwi.png' //公司logo
+				},
+				title: '积分数据大屏', //不超过十个字
+				ranking: {
+					//从阶段排名拿数据
+					name: '排行榜', //不超过十个字
+					condition: {
+						//筛选条件,
+						time: [],
+						date: -3,
+						start_date: -3, //结束时间
+						end_date: -3, //开始时间
+						deptArr: [],
+						dept: [], //限定部门ID列表  空全公司
+
+						point_id: 3, //2AF   3BF,
+						position: 'all', //manager  all//员工 管理员  全部
+						employeeName: '',
+						exclusion: [] ,//不参与排名,
+						employee:[],
+					}
+				},
+				center: {
+					deptArr: [],
+					dept: [] //部门ID列表  空全公司
+				},
+				active: {
+					base_ratio: 60, //基准比例
+					deptArr: [],
+					dept: [], //部门ID列表  空全公司
+					type: 1
+				},
+				event: {
+					name: '积分快讯', //排行榜名称
+					source_type: [1, 2, 5], //来源ID列表 1积分录入 2任务 3积分系统分配 4考勤系统分配 5积分申请 6绩效任务包	8积分导入 9A分转B分 10钉钉报告直接奖励
+					deptArr: [],
+					dept: [], //部门ID列表  空全公司
+					point_id: [2, 3], //积分类型  2AF 3BF
+					ptId: 1
+				}
+			}
+		};
+	},
+	watch: {
+		'config.event.ptId'(val) {
+			if (val == 1) {
+				this.config.event.point_id = [2, 3];
+			} else {
+				this.config.event.point_id = [val];
+			}
+		},
+		'config.event.deptArr'(val) {
+			if(val.length>0){
+				let dept_id = [];
+				for (var i in val) {
+				  dept_id.push(val[i][val[i].length-1]);
+				}
+				this.config.event.dept = dept_id;
+			}else{
+				this.config.event.dept=[];
+			}
+			this.closeDept()
+		},
+		'config.active.deptArr'(val) {
+			if(val.length>0){
+				let dept_id = [];
+				for (var i in val) {
+				  dept_id.push(val[i][val[i].length-1]);
+				}
+				this.config.active.dept = dept_id;
+			}else{
+				this.config.active.dept=[];
+			}
+			this.closeDept()
+		},
+		'config.center.deptArr'(val) {
+			if(val.length>0){
+				let dept_id = [];
+				for (var i in val) {
+				  dept_id.push(val[i][val[i].length-1]);
+				}
+				this.config.center.dept = dept_id;
+			}else{
+				this.config.center.dept=[];
+			}
+			this.closeDept()
+		},
+		'config.ranking.condition.deptArr'(val) {
+			if(val.length>0){
+				let dept_id = [];
+				for (var i in val) {
+				  dept_id.push(val[i][val[i].length-1]);
+				}
+				this.config.ranking.condition.dept = dept_id;
+			}else{
+				this.config.ranking.condition.dept=[];
+			}
+			this.closeDept()
+		},
+		'config.ranking.condition.date'(val){
+			if(val!=1){
+				this.config.ranking.condition.start_date= val; //结束时间
+				this.config.ranking.condition.end_date= val; //结束时间
+			}else{
+				this.config.ranking.condition.start_date= ''; //结束时间
+				this.config.ranking.condition.end_date= ''; //结束时间
+			}
+		},
+		isPz(val) {
+			if (!val) {
+				this.formData={
+					// id:'',//修改与删除时,必传 不传则为新增
+					name: '', //不是删除则必填 配置名称 1-20个字符
+					remark: '', //备注信息 最多20个字符 默认空
+					del: 0, //是否为删除操作 1 是 其他否 默认0
+					remake_code: 0 //是否重新生成校验码 1 是 默认0
+				}
+				this.isCompile=false;//是否编辑	
+			}
+		},
+		dialogVisible(val) {
+			if (!val) {
+				// this.activeBor='1';
+			}else{
+				setTimeout(()=>{
+					document.getElementById('scroll').scrollTop = 0;
+				},200)
+			}
+		}
+	},
+	mounted() {
+		this.getList();
+		this.getDepartment();
+	},
+	methods: {
+	  setTime(val){
+			if(val&&val.length>0){
+				this.config.ranking.condition.start_date= val[0]; //结束时间
+				this.config.ranking.condition.end_date= val[1]+86399000; //结束时间
+			}else{
+				this.config.ranking.condition.start_date= ''; //结束时间
+				this.config.ranking.condition.end_date= ''; //结束时间
+			}
+		},
+		//编辑
+	   compile(item){
+		   this.isCompile=true;//是否编辑	
+		   // this.selectItem=item;
+		   this.isPz=true;//是否编辑	
+		   this.formData={
+				id:item.id,//修改与删除时,必传 不传则为新增
+				name: item.name, //不是删除则必填 配置名称 1-20个字符
+				remark: item.remark, //备注信息 最多20个字符 默认空
+				del: 0, //是否为删除操作 1 是 其他否 默认0
+				remake_code: 0 ,//是否重新生成校验码 1 是 默认0
+				config:JSON.stringify(item.config)
+		   }
+	   },
+	   copy (index) {
+		  //创建input标签
+		  var input = document.createElement('input')
+		  //将input的值设置为需要复制的内容
+		  input.value =index==1? this.previewUrl:this.code;
+		  //添加input标签
+		  document.body.appendChild(input)
+		  //选中input标签
+		  input.select()
+		  //执行复制
+		  document.execCommand('copy')
+		  //成功提示信息
+		  this.$message.success('已复制')
+		  //移除input标签
+		  document.body.removeChild(input)
+		},
+	   refresh(){
+		   this.$confirm('刷新后原有密码将会失效,确定要刷新吗?', '提示', {
+		   	confirmButtonText: '确定',
+		   	cancelButtonText: '取消',
+		   	type: 'warning'
+		   }).then(() => {
+				let data={
+					id:this.selectItem.id,
+					name: this.selectItem.name, //不是删除则必填 配置名称 1-20个字符
+					remark: this.selectItem.remark, //备注信息 最多20个字符 默认空
+					del: 0, //是否为删除操作 1 是 其他否 默认0
+					remake_code: 1 ,//是否重新生成校验码 1 是 默认0
+					config:JSON.stringify(this.selectItem.config)
+				}
+				this.$axios('post', '/api/integral/site/edit_screen', data).then(res => {
+					if (res.data.code == 1) {
+						this.code=res.data.data.code
+						this.getList();
+					}
+				})
+		   });
+		   
+		},
+		preview(item,index){
+			// this.previewUrl='http://localhost:8080/#/screen';
+			this.previewUrl=process.env.VUE_APP_BASE_API+'/pc/#/screen';
+			if (process.env.NODE_ENV === 'development') {
+				this.previewUrl=process.env.VUE_APP_BASE_API+'#/screen';
+			}
+			if(index==1){
+				window.open(this.previewUrl+'?preview=1', '_blank');
+			}else{
+				this.selectItem=item;
+				this.code=item.code;
+				this.isPreview=true;
+			}
+		},
+		submitMembers() {
+			this.$refs.members.confirm(); //调用组件的confirm();
+		},
+		//获取部门
+		getDepartment() {
+			this.$axios('get', '/api/department/tree').then(res => {
+				this.dept_tree = this.getTreeData(res.data.data.list);
+			});
+		},
+		// 递归判断列表,把最后的children设为undefined
+		getTreeData(data) {
+			for (var i = 0; i < data.length; i++) {
+				if (data[i]._child.length < 1) {
+					// children若为空数组,则将children设为undefined
+					data[i]._child = undefined;
+				} else {
+					// children若不为空数组,则继续 递归调用 本方法
+					this.getTreeData(data[i]._child);
+				}
+			}
+			return data;
+		},
+		// 附件上传
+		beforeUpload(file) {
+			const isJPG = /^image\/(jpeg|png|jpg)$/.test(file.type);
+			const isLt2M = file.size / 1024 / 1024 < 5;
+			if (!isJPG) {
+				this.$message.error('上传图只能是 JPEG,PNG,JPG 格式!');
+			}
+			if (!isLt2M) {
+				this.$message.error('上传图片大小不能超过 5MB!');
+			}
+			return isJPG && isLt2M;
+		},
+		handleFilesSuccess(response, file, fileList) {
+			this.config.company.logo=response.url
+		},
+		saveFirst(fromName) {
+			this.$refs[fromName].validate(valid => {
+				if (valid) {
+					let formData = this.formData;
+					if(!this.isCompile){
+						formData.config = JSON.stringify(this.defaultConfig);
+					}
+					this.$axios('post', '/api/integral/site/edit_screen', formData).then(res => {
+						this.$message.success(this.isCompile?'已编辑':'已添加');
+						
+					}).finally(() => {
+						this.isPz=false;
+						this.getList();	
+					});
+				}
+			});
+		},
+		deleteSet(e) {
+			this.$confirm('确定要删除吗?', '提示', {
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type: 'warning'
+			}).then(() => {
+				this.$axios('POST', '/api/integral/site/edit_screen', { id: e.id,del:1 }).then(res => {
+					if (res.data.code == 1) {
+						this.$message.success('删除成功');
+						this.getList();
+					}
+				});
+			});
+		},
+		submit(fromName) {
+			if (!this.config.title) {
+				this.$message.error('请输入标题');
+				return false;
+			}
+			if (!this.config.company.name) {
+				this.$message.error('请输入组织名称和logo设置 “名称”');
+				return false;
+			}
+			if (!this.config.ranking.name) {
+				this.$message.error('请输入排行榜设置 “名称”');
+				return false;
+			}
+			if (!this.config.event.name) {
+				this.$message.error('请输入积分快讯设置 “名称”');
+				return false;
+			}
+			if (this.config.active.base_ratio>100) {
+				this.$message.error('活跃度设置设置 “标尺” 不能超过100');
+				return false;
+			}
+			if (!this.config.active.base_ratio) {
+				this.$message.error('活跃度设置设置 “标尺” 不能为空,请输入1~100');
+				return false;
+			}
+			if(this.config.ranking.condition.date == 1&&!this.config.ranking.condition.start_date){
+				if(this.config.ranking.condition.time.length!=0){
+					let time=this.config.ranking.condition.time
+					this.config.ranking.condition.start_date= time[0]; //结束时间
+					this.config.ranking.condition.end_date= time[1]+86399000; //结束时间
+				}else{
+					this.$message.error('请选择排行榜设置 “时间”');
+					return false;
+				}
+			}
+			if (this.config.event.source_type.length==0) {
+				this.$message.error('请输入积分快讯设置 “来源” 至少选择一项');
+				return false;
+			}
+			let data={
+				id:this.selectItem.id,
+				name: this.selectItem.name, //不是删除则必填 配置名称 1-20个字符
+				remark: this.selectItem.remark, //备注信息 最多20个字符 默认空
+				del: 0, //是否为删除操作 1 是 其他否 默认0
+				remake_code: 0 ,//是否重新生成校验码 1 是 默认0
+				config:JSON.stringify(this.config)
+			}
+			this.$axios('post', '/api/integral/site/edit_screen', data).then(res => {
+				if (res.data.code == 1) {
+					this.$message.success("保存成功");
+					this.getList();
+				}
+			}).finally(() => {
+				this.dialogVisible = false;
+				this.setLoading = false;
+			});
+			
+		},
+		openSet(item) {
+			this.config=item.config;
+			this.selectItem=item;
+			this.employee_selected.employee=item.config.ranking.condition.employee;
+			this.dialogVisible = true;
+		},
+		getList() {
+			this.loading = true;
+			this.$axios('get', '/api/integral/site/screen')
+				.then(res => {
+					this.list = res.data.data.list;
+				})
+				.finally(err => {
+					this.loading = false;
+				});
+		},
+		closeDept(){
+			// this.$nextTick(() => {
+			// 	this.$refs.dept1.dropDownVisible = false;
+			// 	this.$refs.dept2.dropDownVisible = false;
+			// 	this.$refs.dept3.dropDownVisible = false;
+			// 	this.$refs.dept4.dropDownVisible = false;
+			// });
+		},
+		// 选择录入对象
+		move_employee_confirm(data) {
+			this.employee_selected = { dept: [], employee: [] };
+			this.config.ranking.condition.employeeName = '';
+			if (data.employee !== null && data.employee.length != 0) {
+				let exclusion = [];
+				this.employee_selected = data;
+				this.config.ranking.condition.employee=data.employee
+				data.employee.forEach(element => {
+					this.config.ranking.condition.employeeName += element.name + ',';
+					exclusion.push(element.id);
+				});
+				this.config.ranking.condition.exclusion = exclusion;
+			} else {
+				this.config.ranking.condition.exclusion = [];
+				this.config.ranking.condition.employee=[];
+			}
+			this.show_employee_selector = false;
+		},
+		noPersonnelListTips() {
+			this.show_employee_selector = true;
+		},
+		myFunction(e) {
+			let scrollTop = document.getElementById('scroll').scrollTop;
+			if (this.config.ranking.condition.date == 1) {
+				if (scrollTop < 85) {
+					this.activeBor = '1';
+				} else if (scrollTop > 85 && scrollTop < 355) {
+					this.activeBor = '2';
+				} else if (scrollTop >= 355 && scrollTop < 800) {
+					this.activeBor = '3';
+				} else if (scrollTop >= 800 && scrollTop < 900) {
+					this.activeBor = '4';
+				} else if (scrollTop >= 900 && scrollTop < 960) {
+					this.activeBor = '5';
+				} else if (scrollTop >= 960) {
+					this.activeBor = '6';
+				}
+			} else {
+				if (scrollTop < 85) {
+					this.activeBor = '1';
+				} else if (scrollTop >= 85 && scrollTop < 355) {
+					this.activeBor = '2';
+				} else if (scrollTop >= 355 && scrollTop < 760) {
+					this.activeBor = '3';
+				} else if (scrollTop >= 760 && scrollTop < 860) {
+					this.activeBor = '4';
+				} else if (scrollTop >= 860 && scrollTop < 900) {
+					this.activeBor = '5';
+				} else if (scrollTop >= 900) {
+					this.activeBor = '6';
+				}
+			}
+		},
+		activeQie(index) {
+			if (this.config.ranking.condition.date == 1) {
+				if (index == '1') {
+					document.getElementById('scroll').scrollTop = 0;
+				} else if (index == '2') {
+					document.getElementById('scroll').scrollTop = 87;
+				} else if (index == 3) {
+					document.getElementById('scroll').scrollTop = 357;
+				} else if (index == 4) {
+					document.getElementById('scroll').scrollTop = 802;
+				} else if (index == 5) {
+					document.getElementById('scroll').scrollTop = 902;
+				} else if (index == 6) {
+					document.getElementById('scroll').scrollTop = 1078;
+				}
+			} else {
+				if (index == 1) {
+					document.getElementById('scroll').scrollTop = 0;
+				} else if (index == 2) {
+					document.getElementById('scroll').scrollTop = 87;
+				} else if (index == 3) {
+					document.getElementById('scroll').scrollTop = 357;
+				} else if (index == 4) {
+					document.getElementById('scroll').scrollTop = 762;
+				} else if (index == 5) {
+					document.getElementById('scroll').scrollTop = 862;
+				} else if (index == 6) {
+					document.getElementById('scroll').scrollTop = 1038;
+				}
+			}
+		},
+	}
+	
+};
+</script>
+<style scoped lang="scss">
+.activeBor {
+	// background-color: #;
+	color: #2490fd;
+	border: 1px solid #2490fd !important;
+	box-shadow: 0 0 3px #2490fd;
+}
+.border1 {
+	border: 1px solid #ccc;
+	border-radius: 3px;
+	margin: 5px;
+	text-align: center;
+	cursor: pointer;
+}
+.avatar-uploader ::v-deep .el-upload {
+	border: 1px dashed #d9d9d9;
+	border-radius: 6px;
+	cursor: pointer;
+	position: relative;
+	overflow: hidden;
+}
+.avatar-uploader ::v-deep .el-upload:hover {
+	border-color: #409eff;
+}
+.avatar-uploader-icon {
+	font-size: 28px;
+	color: #8c939d;
+	width: 100px;
+	height: 100px;
+	line-height: 100px;
+	text-align: center;
+}
+.avatar {
+	width: 100px;
+	height: 100px;
+	display: block;
+}
+.dialog ::v-deep .el-dialog__body {
+	padding: 20px;
+}
+.width250 {
+	width: 250px;
+}
+.kuai {
+	margin-bottom: 30px;
+}
+.kuai .formBox {
+	padding-left: 20px;
+}
+.form ::v-deep .el-form-item {
+	margin-bottom: 20px;
+}
+.form ::v-deep .el-form-item__label {
+	color: #777777;
+}
+.formTitle {
+	font-size: 16px;
+	font-weight: 700;
+	margin-bottom: 10px;
+	color: #222;
+}
+.diy-tip1 {
+	margin-bottom: 10px !important;
+	background: #f0f9eb !important;
+	color: #333 !important;
+	border: 1px solid #67c23a !important;
+	padding: 9px !important;
+	min-width: 800px;
+	border-radius: 4px;
+}
+.el-dialog__body {
+	position: relative;
+	top: -20px;
+}
+.widthInput {
+	width: 150px;
+}
+.title {
+	margin: 10px 0;
+	margin-top: 0;
+	font-size: 14px;
+	font-weight: 700;
+	padding-left: 13px;
+}
+.initia_title {
+	font-size: 20px;
+	color: rgba(48, 49, 51, 1);
+	font-family: PingFangSC-Regular;
+}
+.initia_title_1 {
+	color: #e6a23c;
+	font-size: 14px;
+	margin-top: 10px;
+}
+.lookQrcode {
+	color: #606266;
+	cursor: pointer;
+	transition: all 0.3s;
+	font-weight: 700;
+}
+.lookQrcode:hover {
+	color: #2490fd;
+}
+.name {
+	max-width: 200px;
+	margin-right: 10px;
+}
+</style>

+ 48 - 3
src/views/set/systemLayout.vue

@@ -11,6 +11,22 @@
 					</p>
 					<div style="margin-top:5px;" class="fontColorF"><span>指定规则的审批或奖扣分,均可直接通过</span></div>
 				</div>
+				
+				<div class="integralApproval">
+					<b>积分复核<el-switch style="margin-left:30px;" :active-value="1" :inactive-value="0" v-model="event_review_status"></el-switch></b>
+					<div style="margin-top:5px;line-height: 30px;"  v-if="event_review_status">
+						<div>开启后,以下来源的积分需要在<span class="yellow">复核通过</span>后才计入排名和统计</div>
+						<div>哪些来源的积分需要复核(至少选择一项)</div>
+						<div class="flex-box-ce">
+						  <el-checkbox v-model="event_apply_review" label="积分申请" border size="small"></el-checkbox>
+						  <el-checkbox v-model="event_entry_review" label="积分奖扣" border size="small"></el-checkbox>
+						  <el-checkbox v-model="event_task_review" label="任务" border size="small"></el-checkbox>
+						</div>
+						<div>积分管理员、公司管理员、创始人均可操作复核</div>
+						<el-checkbox v-model="event_review_point">允许复核人调整分值</el-checkbox>
+					</div>
+				</div>
+				
 				<div class="integralApproval">
 					<b>
 						福利模块
@@ -57,12 +73,12 @@
 				</div>
 				<div class="integralApproval">
 					<b>
-						管理者审批计入奖扣分任务
+						管理者审批计入奖扣分目标
 						<el-switch style="margin-left:30px;" v-model="task_review"></el-switch>
 					</b>
 					<div style="margin-top:5px;" class="fontColorF">
-						<div>系统默认的管理者奖扣任务只包含管理者主动给员工奖扣的积分;</div>
-						<div>开启后,审批员工申请的积分和任务也会记入Ta的奖扣分任务内</div>
+						<div>系统默认的管理者奖扣目标只包含管理者主动给员工奖扣的积分;</div>
+						<div>开启后,审批员工申请的积分和任务也会记入Ta的奖扣分目标内</div>
 					</div>
 				</div>
 				<!-- <el-button type="primary" class="save pop-up" @click="saveFirst('first')">保存</el-button> -->
@@ -185,6 +201,13 @@ export default {
 				page: 1,
 				page_size: 10
 			},
+			
+			// 复核相关
+			event_review_status:1,//是否开启复核 1 开启 0或其他 不开启
+			event_task_review:1,//审批是否开启复核 1 开启 0或其他不开启
+			event_apply_review:1,//任务积分是否开启复核 1 开启 0或其他不开启
+			event_entry_review:1,//录入积分,是否开启复核 1 开启 0或其他不开启
+			event_review_point:1,//复核积分,是否允许修改分值 1 可以 0或其他不可以
 		};
 	},
 	mounted() {
@@ -234,6 +257,20 @@ export default {
 					}
 				}
 				this.isApB ? (data.a2b = this.pointNum) : (data.a2b = 0);
+				data.event_review_status=this.event_review_status;//是否开启复核 1 开启 0或其他 不开启
+				data.event_task_review=this.event_task_review? 1 : 0;//审批是否开启复核 1 开启 0或其他不开启
+				data.event_apply_review=this.event_apply_review? 1 : 0;//任务积分是否开启复核 1 开启 0或其他不开启
+				data.event_entry_review=this.event_entry_review? 1 : 0;//录入积分,是否开启复核 1 开启 0或其他不开启
+				data.event_review_point=this.event_review_point? 1 : 0;//复核积分,是否允许修改分值 1 可以 0或其他不可以
+				if(this.event_review_status&&!data.event_task_review&&!data.event_apply_review&&!data.event_entry_review){
+					this.$message({
+						message: '复核来源至少选择一项',
+						type: 'error'
+					});
+					return;
+				}
+				
+				
 			} else {
 				data.report_integral_daily = this.individualPoints ? 1 : 0;
 				this.individualPoints ? (data.report_integral_daily_a = this.checked ? 1 : 0) : '';
@@ -273,6 +310,14 @@ export default {
 						this.isApB = data.a2b == 0 ? false : true;
 						this.task_review = data.task_review == 1 ? true : false;
 						this.pointNum = data.a2b;
+						
+						this.event_review_status=data.event_review_status;//是否开启复核 1 开启 0或其他 不开启
+						this.event_task_review=data.event_task_review== 1 ? true : false;//审批是否开启复核 1 开启 0或其他不开启
+						this.event_apply_review=data.event_apply_review== 1 ? true : false;//任务积分是否开启复核 1 开启 0或其他不开启
+						this.event_entry_review=data.event_entry_review== 1 ? true : false;//录入积分,是否开启复核 1 开启 0或其他不开启
+						this.event_review_point=data.event_review_point== 1 ? true : false;//复核积分,是否允许修改分值 1 可以 0或其他不可以
+						
+						
 					} else {
 						this.individualPoints = data.report_integral_daily == 1 ? true : false;
 						this.checked = this.individualPoints ? (data.report_integral_daily_a == 1 ? true : false) : false;

+ 16 - 38
src/views/set/voluntarilyPoint.vue

@@ -66,7 +66,8 @@
 								<el-button size="small" type="primary" @click="add_employee_show = true">添加人员</el-button>
 								<el-button size="small" type="primary" plain @click="toleadShw = true">导入自动积分</el-button>
 							</div>
-							<div>
+							<el-button size="small" type="primary" plain @click="openR">执行当前周期加分</el-button>
+							<div style="padding-left: 10px;">
 								<el-select size="small" v-model="employee_id" filterable clearable placeholder="请输入或选择人员">
 									<el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
 								</el-select>
@@ -218,43 +219,6 @@
 				</el-form>
 			</el-dialog>
 
-			<!-- 导入规则 -->
-			<!-- <el-dialog title="导入自动积分" :visible.sync="import_rules_show" width="500px" @before-close="close_import">
-			  <el-row>
-			    <el-col :span="12">
-			      <div style="text-align: center;line-height: 34px;">
-			        <p>1、导出模板,填写好规则</p>
-			        <p><img src="../../assets/image/rules_mould.png" alt="" /></p>
-			        <p>规则表</p>
-			        <p>
-			          <a target="_blank" :href="publicBASE_API + '/api/download/point_auto'"><el-button type="primary" >下载模板</el-button></a>
-			        </p>
-			      </div>
-			    </el-col>
-			    <el-col :span="12">
-			      <div style="text-align: center;line-height: 34px;">
-			        <p>2、上传填好的规则表</p>
-			        <p><img src="../../assets/image/rules_mould1.png" alt="" /></p>
-			        <p>仅支持xls、xlsx格式文件</p>
-			        <el-upload
-			          class="upload-demo"
-			          :headers="ATOKEN"
-			          :data="{ type: 'auto_integral' }"
-			          ref="upload"
-			          :limit="1"
-					  :action="action"
-			          :on-remove="handleRemove"
-			          :on-success="handleSuccess"
-			          :before-upload="beforeFilesUpload"
-			          :file-list="fileList"
-			        >
-			          <el-button slot="trigger" type="primary">选取文件</el-button>
-			        </el-upload>
-			      </div>
-			    </el-col>
-			  </el-row>
-			</el-dialog> -->
-
 			<toLead :visible.sync="toleadShw" :nowIndex.sync="nowIndex" :tolead="toleadResult" @confirm="tealConfirm" :export_type="'auto_point'" :dstyle="'padding: 40px 80px;'">
 				<template slot="1">
 					<el-row v-if="nowIndex == 1">
@@ -321,6 +285,7 @@ export default {
 			add_employee_form: {
 				employee_ids: []
 			},
+			ids:[],
 
 			isShowAdd: false,
 			del_arr: {
@@ -409,6 +374,10 @@ export default {
 				{
 					name: '每月1号自动加分',
 					value: 3
+				},
+				{
+					name: '每年1月1号自动加分',
+					value: 4
 				}
 			],
 			action: process.env.VUE_APP_BASE_API + 'api/integral/auto/import',
@@ -455,6 +424,11 @@ export default {
 		this.get_role_lists(true);
 	},
 	methods: {
+		openR(){
+			this.$axios('post', '/api/integral/auto/manual', { ids: JSON.stringify(this.ids), date:this.$moment().format('YYYYMMDD') }).then(res => {
+				this.$message({ type: 'success', message: '加分执行中,请稍后到【积分事件】中查看'});
+			}).finally(err => {});
+		},
 		//获取员工列表
 		getEmployee() {
 			this.$axios('get', '/api/employee/index', { dept_id: 0, keywords: '', page: 1, page_size: 3000, is_official: 1 })
@@ -789,6 +763,10 @@ export default {
 				.then(res => {
 					if (res.data.code == 1) {
 						self.table_list = res.data.data.list || [];
+						this.ids=self.table_list.map(item=>{
+							return item.id
+						})
+						
 						self.total = res.data.data.total;
 					} else {
 						self.$message.error(res.data.msg);

+ 3 - 0
src/views/task/allTask.vue

@@ -40,6 +40,7 @@
 			</el-form>
 
 			<div>
+				<div class="yellow" style="padding-left: 10px;" v-if="config.event_review_status&&config.event_task_review">复核开启后,积分需管理员复核后才计入排名和统计</div>
 				<el-table :data="list" ref="elTable" style="width: 100%" v-loading="loading"  @sort-change="sortChange">
 					<el-table-column label="执行人" prop="employee_id">
 					  <template slot-scope="scope">
@@ -171,6 +172,7 @@ export default {
 			// 审批相关
 			detail_id:0,
 			detailShow:false,
+			config:{},
 		};
 	},
 	components: { taskDetailsPopup,examinePopup },
@@ -214,6 +216,7 @@ export default {
 		this.getEmployee()
 	},
 	mounted() {
+		this.config=this.$store.state.config;
 		this.get_list();
 		this.point_type = this.getPointType();
 	},

+ 3 - 13
src/views/task/myExamine.vue

@@ -29,6 +29,7 @@
 			</el-form>
 
 			<div>
+				<div class="yellow" style="padding-left: 10px;" v-if="config.event_review_status">复核开启后,积分需管理员复核后才计入排名和统计</div>
 				<el-table :data="list" style="width: 100%" v-loading="loading">
 					<el-table-column label="执行人" prop="employee_id">
 					  <template slot-scope="scope">
@@ -51,22 +52,9 @@
 							<span class="green" v-else>
 								{{ scope.row.point_config.base_point }} {{ scope.row.pt_name }}
 							</span>
-<!-- 							<span class="red" v-if="scope.row.point_config.review_point!=0">
-								+{{ scope.row.point_config.review_point }} {{ scope.row.pt_name }}
-							</span>
-							<span class="red" v-else>
-								+{{ scope.row.point_config.base_point }} {{ scope.row.pt_name }}
-							</span> -->
 						</template>
 					</el-table-column>
 					<el-table-column label="截止时间" prop="expire_time"></el-table-column>
-<!-- 					<el-table-column label="状态" prop="review_status" v-if="formData.status=='complete'">
-						<template slot-scope="scope">
-							  <div class="yellow" v-if="scope.row.review_status == 0">待处理</div>
-							  <div class="green" v-if="scope.row.review_status ==1">已通过</div>
-							  <div class="red" v-if="scope.row.review_status == 2">已驳回</div>
-						</template>
-					</el-table-column> -->
 					<el-table-column label="操作" prop="owner_id">
 						<template slot-scope="scope">
 							<el-link type="primary" :underline="false" @click.stop="openDetail(scope.row)" class="blue">查看任务</el-link>
@@ -141,6 +129,7 @@ export default {
 			// 审批相关
 			detail_id:0,
 			detailShow:false,
+			config:{},
 		};
 	},
 	components: { taskDetailsPopup,examinePopup },
@@ -175,6 +164,7 @@ export default {
 	},
 	mounted() {
 		this.getSpList();
+		this.config=this.$store.state.config;
 		this.point_type = this.getPointType();
 	},
 	methods: {

+ 2 - 7
src/views/welfare/conversion.vue

@@ -38,6 +38,7 @@
 				</el-form>
 				<div style="margin-bottom: 10px;">
 					<el-button type="primary" size="medium" @click="grants" style="margin-right: 10px;">批量发放</el-button>
+					<el-button type="primary" size="medium" plain @click="exportExcel">导出</el-button>
 				</div>
 			</div>
 			<el-table :data="list" style="width: 100%;cursor: pointer;" v-loading="loading" @row-click="openDetail" @selection-change="handleSelectionChange">
@@ -524,13 +525,7 @@ export default {
 				});
 		},
 		exportExcel() {
-			let url=`${process.env.VUE_APP_BASE_API}/api/download/shop/exchange/list?page=1&download_employee_id=${this.$getUserData().id}&page_size=8000&start_time=${this.time_range[0]}&end_time=${this.time_range[1]}`;
-			if(this.formData.employee_id){
-				url=url+'&employee_id='+this.formData.employee_id
-			}
-			if (this.formData.status === 0 || this.formData.status === 1 || this.formData.status === 2) {
-				url=url+'&status='+this.formData.status
-			}
+			let url=`${process.env.VUE_APP_BASE_API}/api/download/shop/achievement/exchange/list?page=1&download_employee_id=${this.$getUserData().id}&page_size=8000&self_only=2&start_time=${this.time_range[0]}&end_time=${this.time_range[1]}`;
 			window.open(url,'_blank');
 		},
 		//分页

+ 0 - 1
src/views/welfare/flManagement.vue

@@ -692,7 +692,6 @@ export default {
 					{name:'兑换奖品',num:data.consume},
 					{name:'被回收',num:data.take_back}
 				]
-				console.log(res.data.data.count)
 				this.DetailList =data.list;
 				this.count =data.count;
 			}).finally(()=>{

+ 4 - 1
src/views/workbench/alreadySp.vue

@@ -18,6 +18,7 @@
 				<el-form-item style="margin-left: 10px;"><el-input v-model="formData.keyword" placeholder="请输入审批内容" clearable></el-input></el-form-item>
 			</el-form>
 			<div>
+				<div class="yellow" style="padding-left: 10px;" v-if="config.event_review_status">复核开启后,积分需管理员复核后才计入排名和统计</div>
 				<el-table :data="list" style="cursor: pointer;" v-loading="loading" class="listTable" @row-click="openDetail">
 					<el-table-column label="审批标题" prop="task_name">
 						<template slot-scope="scope">
@@ -104,7 +105,8 @@ export default {
 			detailShow: false,
 			detail_id: null,
 			employee_map: this.$getCache("userList"),
-			sourceList: [{ name: '全部', id: '0' }, { name: '积分任务', id: '1' }, { name: '积分申请', id: '2' }, { name: '积分录入', id: '3' }]
+			sourceList: [{ name: '全部', id: '0' }, { name: '积分任务', id: '1' }, { name: '积分申请', id: '2' }, { name: '积分录入', id: '3' }],
+			config:{},
 		};
 	},
 	watch: {
@@ -134,6 +136,7 @@ export default {
 	components: { examinePopup },
 	mounted() {
 		this.getSpList();
+		this.config=this.$store.state.config;
 		this.point_types = this.getPointTypes();
 	},
 	methods: {

+ 0 - 1
src/views/workbench/approval_batch.vue

@@ -286,7 +286,6 @@ export default {
 		onmessageWS(e){
 			if(e.type=='review'){
 				let item=this.selectionItems[this.resultIndex];
-				// console.log(item);
 				let result=e.result;
 				result.name=item.employee_name
 				result.remark=item.remark

+ 940 - 0
src/views/workbench/review.vue

@@ -0,0 +1,940 @@
+<template>
+	<div>
+		<div class="all padding-20">
+			<el-tabs v-model="active">
+				<el-tab-pane label="待复核" name="review"></el-tab-pane>
+				<el-tab-pane label="已复核" name="noreview"></el-tab-pane>
+			</el-tabs>
+			<el-form ref="form" :inline="true" label-width="80px">
+				<el-form-item label="规则分类">
+					<el-cascader
+						class="date-picker-width"
+						v-model="rule"
+						:options="rule_trees"
+						:props="props"
+						@change="rule_null"
+						size="medium"
+						ref="rule"
+						clearable
+						placeholder="全部规则分类"
+					></el-cascader>
+				</el-form-item>
+				<el-form-item label="积分类型">
+					<el-select class="date-picker-width" size="medium" v-model="formData.pt_id" clearable placeholder="请选择积分类型">
+						<el-option v-for="item in getTypes()" :key="item.name" :label="item.name" :value="item.id"></el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="部门">
+					<el-cascader
+						size="medium"
+						class="date-picker-width"
+						v-model="dept_name"
+						:options="dept_tree"
+						:props="{ checkStrictly: true, value: 'id', label: 'name', children: '_child' }"
+						ref="dept"
+						clearable
+						filterable
+						placeholder="全公司"
+					></el-cascader>
+				</el-form-item>
+				<el-form-item label="事件来源">
+					<el-select class="date-picker-width" size="medium" v-model="formData.source_type" clearable placeholder="全部">
+						<el-option v-for="item in source_type" :key="item.id" :label="item.name" :value="item.id"></el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="复核状态" v-if="active=='noreview'">
+					<el-select class="date-picker-width" size="medium" v-model="dc_status"  placeholder="全部">
+						<el-option v-for="item in reviewArr" :key="item.id" :label="item.name" :value="item.id"></el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="时间">
+					<el-date-picker
+						v-model="time_slot"
+						type="daterange"
+						size="medium"
+						value-format="yyyy-MM-dd"
+						range-separator="至"
+						start-placeholder="开始日期"
+						end-placeholder="结束日期"
+					></el-date-picker>
+				</el-form-item>
+				<el-form-item>
+					<div class="flex-box-ce">
+						<el-select size="medium" v-model="select_employee_id" filterable clearable placeholder="请输入或选择人员" style="width: 250px;margin-right: 10px;">
+							<el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
+						</el-select>
+						<el-input size="medium" v-model="formData.keyword" placeholder="输入关键字查找" style="width: 250px;" @keyup.enter.native="keyWordSelect">
+							<el-button size="medium" slot="append" icon="el-icon-search" @click="keyWordSelect"></el-button>
+						</el-input>
+					</div>
+				</el-form-item>
+				<el-form-item v-if="active=='review'">
+					<el-button class="first-element-btn" size="medium" :disabled="deleteDisabled" @click="deleteInBatches" type="primary">批量复核通过</el-button>
+				</el-form-item>
+			</el-form>
+			<!-- 表格 -->
+			<div>
+				<el-table :data="list" style="width: 100%;cursor: pointer;" v-loading="loading" @row-click="open_detail" @selection-change="deleteEvents">
+					<el-table-column v-if="active=='review'" type="selection" width="55"></el-table-column>
+					<el-table-column prop="employee_name" label="姓名" align="left" min-width="125px">
+						<template slot-scope="scope">
+							<div class="flex-box">
+								<userImage :user_name="scope.row.employee_name" :img_url="scope.row.employee_img_url" width="50px" height="50px"></userImage>
+								<span style="line-height: 50px; padding-left: 10px;">{{ scope.row.employee_name }}</span>
+							</div>
+						</template>
+					</el-table-column>
+					<el-table-column prop="dept" show-overflow-tooltip label="部门" align="left" min-width="120px"></el-table-column>
+					<el-table-column prop="point" label="积分" align="left" min-width="120px">
+						<template slot-scope="scope">
+							<span :class="scope.row.point < 0 ? 'green' : 'red'">{{ scope.row.point }} {{ point_name(scope.row.pt_id) }}</span>
+						</template>
+					</el-table-column>
+					<el-table-column prop="remark" label="事件内容" align="left" min-width="280px">
+						<template slot-scope="scope">
+							<el-tooltip class="item" effect="dark" placement="top">
+								<div slot="content" style="width: 400px;">{{ scope.row.remark }}</div>
+								<div class="remark">{{ scope.row.remark }}</div>
+							</el-tooltip>
+						</template>
+					</el-table-column>
+					<!-- <el-table-column prop="rule_name" show-overflow-tooltip label="规则分类" align="left" min-width="140px"></el-table-column> -->
+					<el-table-column prop="create_time" label="事件发生时间" align="left" min-width="140px">
+						<template slot-scope="scope">
+							{{ scope.row.event_time }}
+						</template>
+					</el-table-column>
+					<el-table-column prop="source_type" label="来源" align="left" min-width="140px">
+						<template slot-scope="scope">
+							<span v-show="scope.row.source_type == 1">
+								积分奖扣
+								<span v-if="scope.row.recorder_name">({{ scope.row.recorder_name }})</span>
+							</span>
+							<span v-show="scope.row.source_type == 2">任务</span>
+							<span v-show="scope.row.source_type == 3">积分系统分配</span>
+							<span v-show="scope.row.source_type == 4">考勤系统分配</span>
+							<span v-show="scope.row.source_type == 5">
+								积分申请
+								<span v-if="scope.row.applyor_name">({{ scope.row.applyor_name }})</span>
+							</span>
+							<span v-show="scope.row.source_type == 6">绩效任务包</span>
+							<span v-show="scope.row.source_type == 8">积分导入</span>
+							<span v-show="scope.row.source_type == 9">A分转B分</span>
+							<span v-show="scope.row.source_type == 10">钉钉汇报(日志)奖扣分</span>
+							<span v-show="scope.row.source_type > 10">其他</span>
+						</template>
+					</el-table-column>
+					<el-table-column prop="create_time" label="操作" min-width="140px" v-if="active=='review'">
+						<template slot-scope="scope">
+							<el-link :underline="false" type="primary" :disabled="setLoading" @click.stop="pass(scope.row)">通过</el-link>
+							<el-link :underline="false" type="danger" :disabled="setLoading" style="padding: 0 10px;" @click.stop="noPass(scope.row)">不通过</el-link>
+							<el-dropdown  @command="setGrade(scope.row)" v-if="event_review_point==1">
+							  <i class="el-icon-more"></i>
+							  <el-dropdown-menu slot="dropdown">
+							    <el-dropdown-item>调整分数</el-dropdown-item>
+							  </el-dropdown-menu>
+							</el-dropdown>
+						</template>
+					</el-table-column>
+					<el-table-column prop="create_time" label="状态" min-width="140px" v-else>
+						<template slot-scope="scope">
+							<span class="green" v-if="scope.row.dc_status==1">通过</span>
+							<span class="red" v-if="scope.row.dc_status==2">不通过</span>
+						</template>
+					</el-table-column>
+					<template slot="empty">
+						<noData></noData>
+					</template>
+				</el-table>
+				<center class="pagination">
+					<el-pagination
+						background
+						@size-change="handleSizeChange"
+						@current-change="handleCurrentChange"
+						:current-page="formData.page"
+						:page-sizes="[10, 20, 50, 100]"
+						layout="total, sizes, prev, pager, next"
+						:page-size="pageLimit"
+						:total="total"
+					></el-pagination>
+				</center>
+			</div>
+		</div>
+		<!-- 不通过 -->
+		<el-dialog title="填写理由" width="480px" top="15vh" :visible.sync="isNo" :close-on-click-modal="false">
+			<el-form ref="newForm" label-width="110px">
+				<el-form-item label="不通过原因" prop="content">
+					<el-input v-model="comment" placeholder="请输入不通过原因" type="textarea" rows="4" maxlength="50" show-word-limit></el-input>
+				</el-form-item>
+			</el-form>
+			<div slot="footer" class="dialog-footer flex-box-end">
+				<el-button @click="isNo = false">取 消</el-button>
+				<el-button type="primary"  @click="saveNo()">确 定</el-button>
+			</div>
+		</el-dialog>
+		
+		<!-- 调整分数 -->
+		<el-dialog title="调整分数" width="480px" top="15vh" :visible.sync="isPrizeShow" :close-on-click-modal="false">
+			<el-form ref="newForm" :rules="rules" :model="newForm" label-width="110px">
+				<el-form-item label="分数" prop="point">
+					<el-input v-model="newForm.point" placeholder="请输入分数" auto-complete="off" @input="newForm.point=newForm.point.replace(/[^(\-)0-9]/g,'')"></el-input>
+				</el-form-item>
+				<el-form-item label="调整原因" prop="comment">
+					<el-input v-model="newForm.comment" placeholder="请输入调整原因" type="textarea" rows="4" maxlength="50" show-word-limit></el-input>
+				</el-form-item>
+			</el-form>
+			<div slot="footer" class="dialog-footer flex-box-end">
+				<el-button @click="isPrizeShow = false">取 消</el-button>
+				<el-button type="primary"  @click="subGroupForm('newForm')">确定并通过</el-button>
+			</div>
+		</el-dialog>
+		
+		<el-drawer title="事件详情" :visible.sync="detail_popup" ref="drawer" :with-header="false" :width="'500px'" direction="rtl">
+			<div class="drawer_title">事件详情</div>
+			<div class="detail_popup" v-loading="detail_loading" v-if="detail_info !== null">
+				<el-row style="padding-bottom:10px;border-bottom:1px #f8f8f8 solid;">
+					<div class="flex-box flex-v-ce">
+						<userImage :user_name="detail_info.employee_name" width="50px" height="50px" fontSize="1"></userImage>
+						<span style="font-size: 18px;line-height:50px; margin-left:10px;margin-right:4px;">{{ detail_info.employee_name }}</span>
+						<span class="red point" v-show="detail_info.point >= 0">+{{ detail_info.point }} {{ point_name(detail_info.pt_id) }}</span>
+						<span class="green point" v-show="detail_info.point < 0">{{ detail_info.point }} {{ point_name(detail_info.pt_id) }}</span>
+					</div>
+				</el-row>
+
+				<el-row v-show="detail_info.rule_list">
+					<el-col :span="6">任务描述</el-col>
+					<el-col :span="18" v-if="detail_info.remark">{{ detail_info.remark && (detail_info.remark.customize || detail_info.remark.rule) }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.files && detail_info.files.length > 0">
+					<el-col :span="18" :offset="6">
+						<el-image
+							v-for="(itme, index) in detail_info.files"
+							:key="index"
+							style="width: 80px; height: 80px;margin: 0 5px;"
+							:src="itme"
+							:preview-src-list="detail_info.files"
+						></el-image>
+					</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.rule_list">
+					<el-col :span="6">规则分类</el-col>
+					<el-col :span="18">{{ detail_info.rule_list }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.source_type_mark">
+					<el-col :span="6">来源类型</el-col>
+					<el-col :span="18">{{ detail_info.source_type_mark }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.recorder_name">
+					<el-col :span="6">记录人</el-col>
+					<el-col :span="18">{{ detail_info.recorder_name }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.date">
+					<el-col :span="6">事件时间</el-col>
+					<el-col :span="18">{{ detail_info.date }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.complete_task.time">
+					<el-col :span="6">完成时间</el-col>
+					<el-col :span="18">{{ detail_info.complete_task.time }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.complete_task.remark">
+					<el-col :span="6">完成备注</el-col>
+					<el-col :span="18">{{ detail_info.complete_task.remark }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.complete_task && detail_info.complete_task.files && detail_info.complete_task.files.length > 0">
+					<el-col :span="18" :offset="6">
+						<el-image
+							v-for="(itme, index) in detail_info.complete_task.files"
+							:key="index"
+							style="width: 80px; height: 80px;margin: 0 5px;"
+							:src="itme"
+							:preview-src-list="detail_info.complete_task.files"
+						></el-image>
+					</el-col>
+				</el-row>
+
+				<div v-show="detail_info.rule_id">
+					<p class="row_title">规则依据</p>
+					<el-row>
+						<el-col :span="6">规则分类</el-col>
+						<el-col :span="18">{{ detail_info.rule_list }}</el-col>
+					</el-row>
+					<el-row v-show="detail_info.remark.rule">
+						<el-col :span="6">积分规则</el-col>
+						<el-col :span="18">{{ detail_info.remark.rule }}</el-col>
+					</el-row>
+					<el-row>
+						<el-col :span="6">积分</el-col>
+						<el-col :span="18" v-show="detail_info.rule_item.min_point == detail_info.rule_item.max_point">{{ detail_info.rule_item.min_point }}</el-col>
+						<el-col :span="18" v-show="detail_info.rule_item.min_point != detail_info.rule_item.max_point">
+							{{ detail_info.rule_item.min_point }} ~ {{ detail_info.rule_item.max_point }}
+						</el-col>
+					</el-row>
+				</div>
+				<div v-show="detail_info.process"><Steps :process="detail_info.process"></Steps></div>
+				<div v-show="detail_info.dc_remark.flow"><Review :process="detail_info.dc_remark.flow" :status="detail_info.dc_status"></Review></div>
+				<div style="text-align: center;margin-top: 30px;" v-if="detail_info.source_type == 10 && see_log">
+					<el-button type="primary" size="medium" @click="showLog = true">
+						查看日志详情内容
+						<span style=";padding-left:5px;">»</span>
+					</el-button>
+				</div>
+			</div>
+			<div v-if="!this.$authoritys('employee') && !this.$authoritys('dept_manager')" style="position: absolute; bottom: 20px; display: block; right: 20px;">
+				<el-button @click="close_integral_event">取消</el-button>
+				<el-button type="danger" @click="del_integral_event(detail_info)">删除</el-button>
+			</div>
+		</el-drawer>
+
+		<el-dialog title="查看日志详情" width="600px" :visible.sync="showLog">
+			<div class="title">{{ ding_report.creator_name }}的{{ ding_report.template_name }}</div>
+			<div v-if="ding_report.contents.length > 0">
+				<div class="contents" v-for="(item, index) in ding_report.contents" :key="index">
+					<div class="key">{{ item.key }}</div>
+					<div class="value fontColorF">
+						<span v-if="item.value">{{ item.value }}</span>
+						<span v-else>未填写</span>
+					</div>
+				</div>
+			</div>
+			<div v-if="ding_report.images.length > 0">
+				<div class="key" style="margin-bottom: 20px;">图片</div>
+				<div class="flex-box flex-d-wrap">
+					<el-image
+						v-for="(item, index) in ding_report.images"
+						:key="index"
+						style="width: 100px; height: 100px;margin-right:8px"
+						:src="item"
+						:preview-src-list="ding_report.images"
+					></el-image>
+				</div>
+			</div>
+		</el-dialog>
+
+		<el-dialog title="提交结果" :visible.sync="isResult"  width="800" :close-on-click-modal="false" :close-on-press-escape="false" :show-close="false">
+			<div>
+				<el-progress :text-inside="true" :stroke-width="24" :percentage="percentage"></el-progress>
+				<div style="margin-top: 20px;border: 1px solid #f1f1f1;max-height: 500px;overflow-y: auto;" class="scroll-bar">
+					<div class="flex-box-ce results" style="font-weight: 600;">
+						<div style="border-right: 1px solid #f1f1f1;width: 50px;">序号</div>
+						<div class="flex-1" style="border-right: 1px solid #f1f1f1;">奖扣对象</div>
+						<div class="flex-2" style="border-right: 1px solid #f1f1f1;">事件内容</div>
+						<div class="flex-1" style="border-right: 1px solid #f1f1f1;">积分</div>
+						<div class="flex-2" >处理结果</div>
+					</div>
+					<div class="flex-box-ce results" v-for="(item, index) in results" :key="index">
+						<div style="border-right: 1px solid #f1f1f1;width: 50px;">{{results.length-index}}</div>
+						<div class="flex-1" style="border-right: 1px solid #f1f1f1;">{{ item.name }}</div>
+						<div class="flex-2" style="border-right: 1px solid #f1f1f1;">{{ item.remark }}</div>
+						<div class="flex-1" style="border-right: 1px solid #f1f1f1;">
+							{{ item.point>0? '+'+item.point:item.point }} 
+							<span>{{ item.pt_id==3? 'B分':'A分' }}</span>
+						</div>
+						<div class="flex-2 green" v-if="item.msg=='提交成功'">{{ item.msg }}</div>
+						<div class="flex-2 red" v-else>{{ item.msg }}</div>
+					</div>
+				</div>
+				<span slot="footer">
+					<div class="flex-box-end" style="margin-top: 20px;" v-show="results.length==resultList.length"><el-button type="primary" @click="isResult = false" size="small">确 定</el-button></div>
+				</span>
+			</div>
+		</el-dialog>
+	</div>
+</template>
+<script>
+import Steps from '@/components/Steps';
+import Review from '@/components/Review';
+import toLead from '@/components/toLead';
+export default {
+	data() {
+		return {
+			active:'review',
+			deleteDisabled: true,
+			loading: false,
+			page_size: 10,
+			point_types: this.$getTyps(),
+			dept_name: [],
+			dept_tree: [],
+			formData: {
+				page: 1,
+				page_size: 10,
+				dc_status:JSON.stringify([0]),
+				order_key:'update_time'
+			},
+			time_slot: null,
+			rule_trees: [],
+			props: { checkStrictly: true, value: 'id', label: 'name', children: 'child' },
+			rule: [],
+			list: [],
+			total: null,
+			detail_info: null,
+			detail_popup: false,
+			detail_loading: false,
+			pageLimit: 10,
+			select_employee_id: '',
+			employee_map: [],
+			selectionID: [], //删除的事件ID
+			// 查看日志
+			showLog: false,
+			see_log: 1,
+			ding_report: {
+				contents: [],
+				images: []
+			},
+			source_type: [
+				{ id: 0, name: '全部' },
+				{ id: 1, name: '积分奖扣' },
+				{ id: 2, name: '任务' },
+				{ id: 3, name: '积分系统分配' },
+				{ id: 4, name: '考勤系统分配' },
+				{ id: 5, name: '积分申请' },
+				// {id: 6,name: '绩效任务包'},
+				{ id: 8, name: '积分导入' },
+				{ id: 9, name: 'A分转B分' },
+				{ id: 10, name: '钉钉汇报(日志)奖扣分' }
+			],
+			dc_status:0,
+			reviewArr: [
+				{ id: 0, name: '全部' },
+				{ id: 1, name: '通过' },
+				{ id: 2, name: '不通过' },
+			],
+			rules: {
+				point: [{ required: true, message: '请输入分值', trigger: 'blur' }],
+				comment: [{ required: true, message: '请输入调整原因', trigger: 'blur' }],
+			},
+			newForm:{
+				point:'',
+				comment:''
+			},
+			isPrizeShow:false,
+			event_review_point:1,
+			// 长连接结果
+			results: [], //提交的返回结果集合
+			isResult: false,
+			percentage: 0,
+			resultList:[],//要发送数据的集合
+			resultIndex:0,
+			isShowError:false,
+			isShowError2:false,
+			errorMsg:'服务器繁忙,请稍后再试',
+			breakList:[],
+			isShowBreak:false,
+			
+			isNo:false,
+			noData:{},
+			comment:'',
+			setLoading:false,
+		};
+	},
+	components: { Steps, toLead,Review },
+	created() {
+		this.getEmployee();
+	},
+	mounted() {
+		this.getDepartment();
+		this.get_rule_trees();
+		this.get_integral_list(this.formData);
+		this.see_log = this.$store.state.config.see_log;
+		this.event_review_point=this.$store.state.config.event_review_point;
+		this.point_types = this.getTypes();
+	},
+	watch: {
+		selectionID() {
+			if (this.selectionID.length == 0) {
+				this.deleteDisabled = true;
+			} else {
+				this.deleteDisabled = false;
+			}
+		},
+		'formData.pt_id'(val, old_val) {
+			this.formData.page = 1;
+			!val ? delete this.formData.pt_id : '';
+			this.get_integral_list(this.formData);
+		},
+		'formData.source_type'(val) {
+			this.formData.page = 1;
+			val == 0 ? delete this.formData.source_type : '';
+			this.get_integral_list(this.formData);
+		},
+		'formData.page'(val, old_val) {
+			this.get_integral_list(this.formData);
+		},
+		select_employee_id(val) {
+		  this.formData.page = 1;
+		  this.formData.employee_ids = val;
+		  this.get_integral_list(this.formData);
+		},
+		time_slot(val, old_val) {
+			this.formData.page = 1;
+			if (val !== null) {
+				this.formData.start_day = val[0];
+				this.formData.end_day = val[1];
+			} else {
+				delete this.formData.start_day;
+				delete this.formData.end_day;
+			}
+			this.get_integral_list(this.formData);
+		},
+		dept_name(val, old_val) {
+			this.formData.page = 1;
+			if (val.length !== 0) {
+				this.formData.dept_ids = val[val.length - 1];
+			} else {
+				this.formData.dept_ids = 0;
+			}
+			this.$nextTick(() => {
+				this.$refs.dept.dropDownVisible = false;
+				this.get_integral_list(this.formData);
+			});
+		},
+		active(val){
+			this.formData.page = 1;
+			if(val=='review'){//待复核
+				this.formData.dc_status=JSON.stringify([0]);
+			}else{
+				this.dc_status=0;
+				this.formData.dc_status=JSON.stringify([1,2]);
+			}
+			this.get_integral_list(this.formData);
+		},
+		dc_status(val){
+			if(val==0){
+				this.formData.dc_status=JSON.stringify([1,2]);
+			}else if(val==1){
+				this.formData.dc_status=JSON.stringify([1]);
+			}else{
+				this.formData.dc_status=JSON.stringify([2]);
+			}
+			this.get_integral_list(this.formData);
+		},
+		isResult(val){
+			if(!val){
+				this.get_integral_list(this.formData);
+				this.$socketApi.closewebsocket();
+			}
+		},
+		
+	},
+	methods: {
+		setGrade(item){
+			this.noData={
+				type:'event_check',
+				action:'agree',
+				event_id:item.id,
+				comment:'',
+			}
+			this.newForm.point=item.point;
+			this.isPrizeShow=true;
+		},
+		// 提交表单
+		subGroupForm(formName) {
+			this.$refs[formName].validate(valid => {
+				if (valid) {
+					this.noData.comment=this.newForm.comment;
+					this.noData.point=this.newForm.point;
+					console.log(this.newForm.point)
+					if(!isNaN(this.newForm.point)){
+						this.setLoading=true;
+						this.webSocket(this.noData)
+					}else{
+						this.$message({type: 'error',message: '分值只能为数值'});
+					}
+				}
+			});
+		},
+		//通过
+		pass(item){
+			let data={
+				type:'event_check',
+				action:'agree',
+				event_id:item.id,
+				point:item.point
+			}
+			this.setLoading=true;
+			this.webSocket(data)
+		},
+		webSocket(data,is){
+			this.resultList=is? data:[data];
+			this.resultIndex=0;
+			this.percentage=0;
+			this.results=[];
+			if(this.resultList.length!=1){
+				this.isResult=true;
+			}
+			this.opneWebSocket()
+		},
+		opneWebSocket() {
+			let wsData=this.resultList;
+			if(wsData[this.resultIndex]){
+				this.$socketApi.sendData(wsData[this.resultIndex],this.onmessageWS)
+			}else{
+				console.log(this.results)
+			}
+			
+		},
+		onmessageWS(e){
+			this.setLoading=false;
+			if(e.type=='event_check'){
+				if(this.resultList.length==1){ //单条
+					if(e.code==1){
+						this.$message.success('提交成功')
+						this.isNo=false;
+						this.isPrizeShow=false;
+						this.get_integral_list(this.formData);
+						return false;
+					}else{
+						this.$message.error(e.msg)
+						return false;
+					}
+				}
+				let user;
+				if(e.code==1){
+					user={
+						name:e.result.task.msg.name,
+						point:e.result.task.msg.point,
+						remark:e.result.task.msg.remark,
+						pt_id:e.result.task.msg.pt_id,
+						msg:'提交成功'
+					}
+				}else{
+					user={
+						name:e.result.task.msg.name,
+						point:e.result.task.msg.point,
+						remark:e.result.task.msg.remark,
+						pt_id:e.result.task.msg.pt_id,
+						msg:e.msg
+					}
+				}
+				this.results.push(user);
+				this.resultIndex++;
+				this.opneWebSocket();
+				// 进度条
+				let lng = this.resultList.length;
+				this.percentage += Math.floor(100 / lng);
+				if (lng == this.results.length) {
+					this.percentage = 100;
+				}
+			}
+			// 连接不上
+			if(e.type=='error'){
+				this.errorMsg=e.msg
+				this.isShowError = true;
+			}
+		},
+		saveNo(){
+			if (!this.comment) {
+				this.$message({type: 'error',message: '请填写不通过原因'});
+				return false;
+			}
+			this.noData.comment=this.comment;
+			this.webSocket(this.noData)
+		},
+		//不通过
+		noPass(item){
+			this.comment='';
+			this.isNo=true;
+			this.noData={
+				type:'event_check',
+				action:'disagree',
+				event_id:item.id,
+				comment:'',
+			}
+		},
+		//获取员工列表
+		getEmployee() {
+			this.$axios('get', '/api/employee/index', { dept_id: 0, keywords: '', page: 1, page_size: 3000, is_official: 1 }).then(res => {
+				let list = res.data.data.list;
+				this.employee_map = list;
+			});
+		},
+		handleSizeChange(val) {
+			this.pageLimit = val;
+			this.formData.page_size = this.pageLimit;
+			this.get_integral_list(this.formData);
+		},
+		getTypes() {
+			var arr = this.$getTyps();
+			return arr.filter(function(item) {
+				return item.code != 'JX';
+			});
+		},
+		// keyword
+		keyWordSelect() {
+			this.formData.page = 1;
+			this.get_integral_list(this.formData);
+		},
+		deleteInBatches() {
+			if (this.selectionID.length < 1) {
+				return false;
+			}
+			this.webSocket(this.selectionID,true)
+		},
+		deleteEvents(selection) {
+			let listId = [];
+			selection.forEach(item => {
+				listId.push({
+					type:'event_check',
+					action:'agree',
+					event_id:item.id,
+					point:item.point,
+					remark:item.remark,
+					name:item.employee_name,
+					pt_id:item.pt_id
+				});
+			});
+			this.selectionID = listId;
+		},
+		open_detail(item) {
+			this.detail_popup = true;
+			let data = {
+				event_id: item.id
+			};
+			this.detail_loading = true;
+			this.$axios('get', '/api/integral/statistics/integral/info', data)
+				.then(res => {
+					if (res.data.code == 1) {
+						this.detail_info = res.data.data;
+						var ding_report = res.data.data.remark.ding_report;
+						if (Object.keys(ding_report).length != 0) {
+							this.ding_report = res.data.data.remark.ding_report;
+						}
+					} else {
+						this.$message.error(res.data.data.msg);
+					}
+				})
+				.finally(() => {
+					this.detail_loading = false;
+				});
+		},
+		//获取部门
+		getDepartment() {
+			this.$axios('get', '/api/department/tree').then(res => {
+				this.dept_tree = this.getTreeData(res.data.data.list);
+			});
+		},
+		//获取规则
+		get_rule_trees() {
+			this.$axios('get', '/api/integral/rule/trees').then(res => {
+				this.rule_trees = this.getRuleTreeData(res.data.data.rule_tree);
+			});
+		},
+		get_integral_list(data) {
+			this.loading = true;
+			this.$axios('get', '/api/integral/statistics/integral', data)
+				.then(res => {
+					if (res.data.code == 1) {
+						this.list = res.data.data.list;
+						this.total = res.data.data.total;
+					} else {
+						this.$message.error(res.data.data.msg);
+					}
+				})
+				.finally(() => {
+					this.loading = false;
+				});
+		},
+		handleCurrentChange(val) {
+			this.formData.page = val;
+		},
+		rule_null(val) {
+			if (val.length == 0) {
+				this.formData.rule_id = 0;
+			} else {
+				this.formData.rule_id = this.rule[this.rule.length - 1];
+			}
+			this.$nextTick(() => {
+				this.$refs.rule.dropDownVisible = false;
+				this.get_integral_list(this.formData);
+			});
+		},
+		del_integral_event(item) {
+			this.$confirm('删除事件的同时也会撤销积分,确定删除吗?', '提示', {
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type: 'warning'
+			}).then(() => {
+				this.$axios('post', '/api/integral/statistics/integral/destroy', { event_id: item.event_id }).then(res => {
+					if (res.data.code == 1) {
+						this.$message.success(res.data.msg);
+						this.detail_popup = false;
+						this.get_integral_list(this.formData);
+					} else {
+						this.$message.error(res.data.msg);
+					}
+				});
+			});
+		},
+		close_integral_event() {
+			this.detail_popup = false;
+		},
+		point_name(id) {
+			return this.point_types.find(item => {
+				if (item.id == id) {
+					return item.name;
+				}
+			}).name;
+		},
+		// 递归判断列表,把最后的children设为undefined
+		getTreeData(data) {
+			for (var i = 0; i < data.length; i++) {
+				if (data[i]._child.length < 1) {
+					// children若为空数组,则将children设为undefined
+					data[i]._child = undefined;
+				} else {
+					// children若不为空数组,则继续 递归调用 本方法
+					this.getTreeData(data[i]._child);
+				}
+			}
+			return data;
+		},
+		// 规则递归 children
+		getRuleTreeData(data) {
+			for (var i = 0; i < data.length; i++) {
+				if (data[i].child.length < 1) {
+					// children若为空数组,则将children设为undefined
+					data[i].child = undefined;
+				} else {
+					// children若不为空数组,则继续 递归调用 本方法
+					this.getRuleTreeData(data[i].child);
+				}
+			}
+			return data;
+		}
+	}
+};
+</script>
+<style scoped lang="scss">
+	.results {
+		border-bottom: 1px solid #f1f1f1;
+		text-align: center;
+	}
+	.results div {
+		padding: 10px;
+	}
+.remark {
+	display: -webkit-box;
+	-webkit-box-orient: vertical;
+	-webkit-line-clamp: 2;
+	overflow: hidden;
+}
+.title {
+	text-align: center;
+	font-weight: 700;
+	max-width: 70%;
+	margin: 20px auto;
+	margin-top: 0;
+	font-size: 18px;
+}
+.key {
+	font-weight: 700;
+	font-size: 16px;
+}
+.value {
+	font-size: 14px;
+	margin: 10px 0;
+	margin-bottom: 20px;
+}
+.imgs {
+	width: 80px;
+	height: 80px;
+	margin-right: 5px;
+	margin-bottom: 5px;
+}
+header.el-drawer__header {
+	font-size: 18px;
+	font-family: MicrosoftYaHei;
+	color: #303133;
+	width: 500px;
+	span {
+		:focus {
+			outline: 0;
+		}
+	}
+}
+.display_flex {
+	display: flex;
+}
+.label {
+	line-height: 36px;
+	padding-right: 10px;
+}
+.time_section {
+	.el-range-editor {
+		width: 330px;
+	}
+}
+.pagination {
+	padding: 20px 0;
+}
+.detail_popup {
+	padding: 20px;
+	height: calc(100vh - 140px);
+	overflow: auto;
+	padding-bottom: 100px;
+	.row_title {
+		position: relative;
+		margin: 0 0 20px 0;
+		padding-top: 12px;
+		font-size: 16px;
+		color: #303133;
+		line-height: 22px;
+	}
+	.row_title:before {
+		position: absolute;
+		top: 0;
+		content: ' ';
+		width: 100%;
+		border-top: 1px #f8f8f8 solid;
+	}
+	.el-row {
+		margin-bottom: 10px;
+		font-size: 14px;
+		.el-col-4 {
+			color: #606266;
+		}
+	}
+}
+span.point {
+	font-size: 16px;
+}
+.drawer_title {
+	font-size: 18px;
+	padding: 20px;
+	border-bottom: 1px #efefef solid;
+}
+.row_tips {
+	display: block;
+	color: #909399;
+	font-size: 12px;
+	margin-top: 0px;
+}
+.el-range-editor--medium .el-range-separator {
+	width: 25px;
+}
+.integral_event_box {
+	background-color: #ffffff;
+	padding: 20px;
+	min-height: calc(100vh - 160px);
+}
+.examine_steps ::v-deep .el-step.is-vertical .el-step__title {
+	padding-bottom: 0;
+}
+
+.diy-tip1 {
+	margin-bottom: 10px !important;
+	background: #f0f9eb !important;
+	color: #67c23a !important;
+	border: 1px solid #67c23a !important;
+	padding: 9px !important;
+	min-width: 800px;
+	border-radius: 4px;
+}
+</style>