walter 7 ماه پیش
والد
کامیت
34363a33ec

+ 3 - 1
.eslintrc.js

@@ -8,7 +8,9 @@ module.exports = {
   //   'eslint:recommended'
   // ],
   parserOptions: {
-    parser: 'babel-eslint'
+    parser: 'babel-eslint',
+    sourceType: "module",
+    ecmaVersion: 2020
   },
   rules: {
     'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',

+ 19 - 51
package-lock.json

@@ -2566,7 +2566,7 @@
     },
     "async-validator": {
       "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz",
+      "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-1.8.5.tgz",
       "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
       "requires": {
         "babel-runtime": "6.x"
@@ -2649,7 +2649,7 @@
     },
     "babel-helper-vue-jsx-merge-props": {
       "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
+      "resolved": "https://registry.npmmirror.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
       "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
     },
     "babel-loader": {
@@ -2705,7 +2705,7 @@
     },
     "babel-runtime": {
       "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+      "resolved": "https://registry.npmmirror.com/babel-runtime/-/babel-runtime-6.26.0.tgz",
       "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
       "requires": {
         "core-js": "^2.4.0",
@@ -2714,7 +2714,7 @@
       "dependencies": {
         "core-js": {
           "version": "2.6.12",
-          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+          "resolved": "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz",
           "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
         }
       }
@@ -3134,16 +3134,6 @@
       "integrity": "sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0=",
       "dev": true
     },
-    "bindings": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npm.taobao.org/bindings/download/bindings-1.5.0.tgz",
-      "integrity": "sha1-EDU8npRTNLwFEabZCzj7x8nFBN8=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "file-uri-to-path": "1.0.0"
-      }
-    },
     "bl": {
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz",
@@ -5526,9 +5516,9 @@
       "dev": true
     },
     "element-ui": {
-      "version": "2.14.1",
-      "resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.14.1.tgz",
-      "integrity": "sha512-Uje0J12dBaXdyvt/EtuDA8diFbYTdO7uI4QCfl7zmEJmE1WxgCSVKhlRRoL8MDonO8pyNVhB4n0AFAR14g56nw==",
+      "version": "2.15.14",
+      "resolved": "https://registry.npmmirror.com/element-ui/-/element-ui-2.15.14.tgz",
+      "integrity": "sha512-2v9fHL0ZGINotOlRIAJD5YuVB8V7WKxrE9Qy7dXhRipa035+kF7WuU/z+tEmLVPBcJ0zt8mOu1DKpWcVzBK8IA==",
       "requires": {
         "async-validator": "~1.8.1",
         "babel-helper-vue-jsx-merge-props": "^2.0.0",
@@ -6740,13 +6730,6 @@
       "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==",
       "dev": true
     },
-    "file-uri-to-path": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npm.taobao.org/file-uri-to-path/download/file-uri-to-path-1.0.0.tgz",
-      "integrity": "sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90=",
-      "dev": true,
-      "optional": true
-    },
     "filename-reserved-regex": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
@@ -6998,9 +6981,9 @@
       "dev": true
     },
     "fsevents": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.3.2.tgz",
-      "integrity": "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=",
+      "version": "2.3.3",
+      "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
       "dev": true,
       "optional": true
     },
@@ -9974,13 +9957,6 @@
       "resolved": "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz",
       "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g=="
     },
-    "nan": {
-      "version": "2.14.2",
-      "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.2.tgz?cache=0&sync_timestamp=1602591675048&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnan%2Fdownload%2Fnan-2.14.2.tgz",
-      "integrity": "sha1-9TdkAGlRaPTMaUrJOT0MlYXu6hk=",
-      "dev": true,
-      "optional": true
-    },
     "nanoid": {
       "version": "3.1.30",
       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz",
@@ -10144,7 +10120,7 @@
     },
     "normalize-wheel": {
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
+      "resolved": "https://registry.npmmirror.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
       "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA=="
     },
     "npm-conf": {
@@ -11887,7 +11863,7 @@
     },
     "regenerator-runtime": {
       "version": "0.11.1",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+      "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
       "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
     },
     "regenerator-transform": {
@@ -12165,7 +12141,7 @@
     },
     "resize-observer-polyfill": {
       "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+      "resolved": "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
       "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
     },
     "resolve": {
@@ -13973,7 +13949,7 @@
     },
     "throttle-debounce": {
       "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
+      "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
       "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg=="
     },
     "through": {
@@ -14968,14 +14944,10 @@
         },
         "fsevents": {
           "version": "1.2.13",
-          "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.13.tgz",
-          "integrity": "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg=",
+          "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz",
+          "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
           "dev": true,
-          "optional": true,
-          "requires": {
-            "bindings": "^1.5.0",
-            "nan": "^2.12.1"
-          }
+          "optional": true
         },
         "glob-parent": {
           "version": "3.1.0",
@@ -15292,14 +15264,10 @@
         },
         "fsevents": {
           "version": "1.2.13",
-          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+          "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz",
           "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
           "dev": true,
-          "optional": true,
-          "requires": {
-            "bindings": "^1.5.0",
-            "nan": "^2.12.1"
-          }
+          "optional": true
         },
         "glob-parent": {
           "version": "3.1.0",

+ 1 - 1
package.json

@@ -19,7 +19,7 @@
     "dingtalk-jsapi": "^2.13.51",
     "dingtalk-service-window-libs": "^0.3.0",
     "echarts": "^4.9.0",
-    "element-ui": "^2.13.2",
+    "element-ui": "^2.15.14",
     "file-saver": "^2.0.5",
     "imagemin-pngquant": "^9.0.2",
     "moment": "^2.29.0",

+ 0 - 1
src/App.vue

@@ -6,7 +6,6 @@
 <style>
   @import "assets/css/reset.css";
   @import "assets/css/iconfont.css";
-  /* @import "assets/css/iconfont.js"; */
 </style>
 <style lang="scss">
 	#app{

+ 1 - 1
src/api/axios.js

@@ -9,7 +9,7 @@ import qs from 'qs'
 const service = axios.create({
 	baseURL: process.env.VUE_APP_BASE_API, 
 	// baseURL:'https://app55493.eapps.dingtalkcloud.com/',
-	timeout: 20000,
+	timeout: 60000,
 	headers: {
 		'Content-Type': 'application/x-www-form-urlencoded',
 	},

+ 9 - 1
src/assets/css/reset.css

@@ -26,8 +26,11 @@ label {
     font-weight: 600;
 }
 
-.el-icon-circle-close{
+.el-image-viewer__btn .el-icon-circle-close{
   color: #fff;
+  background-color: #606266;
+  border-color: #fff;
+  border-radius: 25px;
 }
 .icon {
   width: 1em;
@@ -413,4 +416,9 @@ a:hover {
 
   width: 100px !important;
   height: 100px !important;
+}
+
+
+.text-center {
+	text-align: center;
 }

+ 0 - 77
src/components/FormBox - 副本.vue

@@ -1,77 +0,0 @@
-<template>
-	<div style="border: 1px solid #EBEEF5;border-radius: 5px;">
-		<div style="padding: 10px;" v-if="isShowHeader">
-			 <slot name="header"></slot>	
-		</div>
-		<div class="form-box" :class="!isShowMore? 'auto':''" :style="{height:isShowGd?'auto':'49px'}">
-			<slot name="footer"></slot>	
-			<el-tooltip  effect="dark" :content="isShowGd?'收起':'更多'" placement="top">
-				<div v-if="isShowMore" class="gd" :class="isShowGd? 'gd2':''" @click="isShowGd=!isShowGd"><i class="el-icon-d-arrow-left fontColorC"></i></div>
-			</el-tooltip>
-		</div>
-	</div>
-</template>
-
-<script>
- import Tooltip from '@/components/Tooltip';
-  export default {
-    name:'FormBox',
-	components:{Tooltip},
-    props:{
-		isShowMore:{
-			type:Boolean,
-			default:false,
-		},
-		isShowHeader:{
-			type:Boolean,
-			default:true,
-		},
-    },
-    data(){
-      return{
-		str:'更多',
-		isShowGd:false,
-      }
-    },
-    methods:{
-
-    }
-  }
-</script>
-
-<style scoped="scoped">
-.form-box{
-	padding: 10px;
-	background-color: rgb(250, 251, 252);
-	border-radius: 5px;
-	padding-bottom: 0;
-	position: relative;
-	height: auto;
-	padding-right: 30px;
-	transition: all 1s; 
-	/* overflow: hidden; */
-}	
-.form-box ::v-deep .el-form-item{
-	margin-bottom: 10px;
-}
-.gd{
-	position: absolute;
-	width: 20px;
-	right: 10px;
-	top: 20px;
-	z-index: 999;
-	font-size: 20px;
-	cursor: pointer;
-	transform: rotate(-90deg);
-	transition: all 0.1s;  
-}
-.gd2{
-	transform: rotate(90deg);
-}
-.gd :hover{
-	background-color: #f1f1f1;
-}
-.auto{
-	height: auto !important;
-}
-</style>

+ 141 - 0
src/components/numberRangeSelector.vue

@@ -0,0 +1,141 @@
+<template>
+  <div>
+    <el-button-group>
+      <el-button size="small"  :disabled="disabled" @click.stop="openScope">
+        {{btRemark}}
+      </el-button>
+      <el-button size="small" icon="el-icon-delete" :disabled="disabled" @click.stop="clearScope"/>
+    </el-button-group>
+
+    <el-dialog
+        :visible.sync="showScope"
+        :show-close="false"
+        width="600px"
+        :title="title"
+        center
+        :before-close="onBeforeClose"
+    >
+      <el-form>
+        <el-form-item>
+          <el-input
+              v-model="minValue"
+              size="medium"
+              clearable
+              @input="onMinInput"
+              :disabled="disabled"
+              style="width: 200px;"
+          >
+            <template #prepend>最小值</template>
+          </el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-input
+              v-model="maxValue"
+              size="medium"
+              clearable
+              @input="onMaxInput"
+              :disabled="disabled"
+              style="width: 200px;"
+          >
+            <template #append>最大值</template>
+          </el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button-group>
+            <el-button size="small" @click="onBeforeClose">取消</el-button>
+            <el-button type="primary" size="small" @click="submit">确定</el-button>
+          </el-button-group>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {onlyNumberFilter} from "@/utils";
+export default {
+  name: "numberRangeSelector",
+  props:{
+    title:{
+      type: String,
+      default: ''
+    },
+    min:{
+      type: Number,
+      default: null
+    },
+    max:{
+      type: Number,
+      default: null
+    },
+    disabled:{
+      type: Boolean,
+      default: false
+    },
+  },
+  data() {
+    return {
+      showScope:false,
+      minValue:this.min,
+      maxValue:this.max,
+    }
+  },
+  computed: {
+    text(){
+      return this.min !== null && this.max !== null ? `分值区间 ${this.min} - ${this.max}` : ''
+    },
+    btRemark(){
+      return !!this.text ? this.text : '分值区间'
+    },
+
+  },
+  methods: {
+    onMaxInput(v){
+      this.maxValue = onlyNumberFilter(v)
+    },
+    onMinInput(v){
+      this.minValue = onlyNumberFilter(v)
+    },
+    submit(){
+      let min = null
+      let max = null
+      if(this.minValue !== null && this.maxValue !== null && this.minValue !== '' && this.maxValue !== ''){
+        min = Number(this.minValue)
+        max = Number(this.maxValue)
+        if(!Number.isInteger(min) || !Number.isInteger(max)) {
+          this.$message.error('只支持整数区间')
+          return
+        }
+      }else {
+        this.minValue = null
+        this.maxValue = null
+      }
+      this.$emit("update:min",min)
+      this.$emit("update:max",max)
+      this.$emit("scopeSubmit")
+      this.showScope = false
+    },
+    clearScope(){
+      this.minValue = null
+      this.maxValue = null
+      this.$emit("update:min",this.minValue)
+      this.$emit("update:max",this.maxValue)
+      this.$emit("scopeSubmit")
+    },
+    onBeforeClose(){
+      this.showScope = false
+      this.minValue = this.min
+      this.maxValue = this.max
+    },
+    openScope(){
+      this.showScope = true
+    },
+  }
+
+}
+</script>
+
+
+<style scoped lang="scss">
+
+</style>

+ 5 - 1
src/home.vue

@@ -23,6 +23,9 @@
 			<div class="btn" type="primary" @click="openGly">联系管理员</div>
 		</div>
 		<el-row style="min-width:1160px;">
+<!-- 			<div>
+				<el-image style="width: 100px; height: 100px;" src="http://cdn.intesys.g107.com/intesys/2020-03-07/HWxyADFZHTtaQJirZB5sGCQARnQxNHFn.jpg"></el-image>
+			</div> -->
 			<el-col :span="18" style="min-width:780px;">
 				<el-row class="home-left-header">
 					<el-col :span="7" class="hlheader-user">
@@ -865,7 +868,8 @@ export default {
 				type: 'waiting',
 				page: 1,
 				pt_id: 0,
-				page_size: 3
+				page_size: 3,
+				reviewer_id:this.$getUserData().id,
 			};
 			this.$axios('get', '/api/integral/review/list', params)
 				.then(res => {

+ 2 - 1
src/index.vue

@@ -493,7 +493,8 @@ export default {
 				{ title: '首页', children: this.returnRoutersArr('home'), icon: 'icon-shouye' },
 				{ title: 'A/B分', children: this.returnRoutersArr('abPoint'), icon: 'icon-PC_gongzuotai_ABfen' },
 				{ title: '任务', children: this.returnRoutersArr('task'), icon: 'icon-kaoqin_kaoqinyuebaobiao' },
-				{ title: '复核', children: this.returnRoutersArr('review'), icon: 'icon-jiedianyanshou-1' },
+				// { title: '复核', children: this.returnRoutersArr('review'), icon: 'icon-jiedianyanshou-1' },
+				{ title: '复核', children: this.returnRoutersArr('integral_review'), icon: 'icon-jiedianyanshou-1' },
 				{ title: '统计', children: this.returnRoutersArr('ranking'), icon: 'icon-dingdingPC_tongji1' },
 				{ title: '奖票', children: this.returnRoutersArr('award'), icon: 'icon-piao' },
 			];

+ 25 - 4
src/router/index.js

@@ -244,7 +244,6 @@ const routes = [{
 					icon: 'icon-shezhi_jifenguize',
 					groupCode: 'ranking',
 					groupName: "统计",
-
 				}
 			},
 			{
@@ -433,7 +432,7 @@ const routes = [{
 			{
 				path: '/alreadySp',
 				name: 'alreadySp',
-				title: '已审批',
+				title: '已审批',
 				component: () => import( /* webpackChunkName: "alreadySp" */
 					'@/views/workbench/alreadySp.vue'),
 				meta: {
@@ -441,14 +440,36 @@ const routes = [{
 					groupCode: 'workbench',
 				}
 			},
+			{
+				path: '/approvalAll',
+				name: 'approvalAll',
+				title: '审批跟进',
+				component: () => import( /* webpackChunkName: "approvalAll" */'@/views/workbench/approvalAll.vue'),
+				meta: {
+					icon: 'icon-shezhi_gongdaolbiao',
+					groupCode: 'workbench',
+					jurisdiction: ['dept_manager', 'employee']
+				}
+			},
+			// {
+			// 	path: '/review',
+			// 	name: 'review',
+			// 	title: '复核',
+			// 	component: () => import( /* webpackChunkName: "review" */ '@/views/workbench/review.vue'),
+			// 	meta: {
+			// 		icon: 'icon-shezhi_gongdaolbiao',
+			// 		groupCode: 'review',
+			// 		// jurisdiction: ['dept_manager', 'employee']
+			// 	}
+			// },
 			{
 				path: '/review',
 				name: 'review',
 				title: '复核',
-				component: () => import( /* webpackChunkName: "review" */ '@/views/workbench/review.vue'),
+				component: () => import( /* webpackChunkName: "review" */ '@/views/workbench/integral_review.vue'),
 				meta: {
 					icon: 'icon-shezhi_gongdaolbiao',
-					groupCode: 'review',
+					groupCode: 'integral_review',
 					// jurisdiction: ['dept_manager', 'employee']
 				}
 			},

+ 4 - 0
src/screen.vue

@@ -445,6 +445,10 @@ export default {
 						this.$message.error('窗口链接数量超过限制');
 						this.quit();
 					}
+					if(e.code=='0'){
+						this.$message.error('公司不可用');
+						this.quit();
+					}
 				} else {
 					if(!this.preview){
 						this.$setCache('code', this.code);

+ 5 - 1
src/screenSan.vue

@@ -8,7 +8,7 @@
 					<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 style="max-width: 90%; height: 30px; line-height: 30px; overflow: hidden;">{{ result.company.name }}</div>
 						</div>
 						<div style="width: 400px;"></div>
 						<div class="flex-1 flex-box-end flex-box-ce">
@@ -552,6 +552,10 @@ export default {
 						this.$message.warning('窗口链接数量超过限制,请选择其他大屏');
 						this.isShowList=true;
 					}
+					if(e.code=='0'){
+						this.$message.error('公司不可用');
+						this.quit();
+					}
 				} else {
 					this.result = e.result;
 					if(!this.result.config.ranking_type||this.result.config.ranking_type=='ranking'){

+ 4 - 0
src/utils/index.js

@@ -0,0 +1,4 @@
+export function onlyNumberFilter(inputStr){
+    // return inputStr.replace(/[^(\d)]/g,"")
+    return inputStr.replace(/[^(-?\d)]/g,"")
+}

+ 1 - 4
src/views/award/myGrantAward.vue

@@ -240,10 +240,7 @@ export default {
 			{
 				text: '上周',
 				onClick(picker) {
-					const now = new Date(new Date().toLocaleDateString());
-					const start = now.getTime() - (now.getDay() + 6) * 24 * 60 * 60 * 1000;
-					const end = start + 7 * 24 * 60 * 60 * 1000 - 1000;
-					picker.$emit('pick', [moment(start).format('YYYY-MM-DD'), moment(end).format('YYYY-MM-DD')]);
+					picker.$emit('pick', [moment().subtract(1, 'w').startOf('isoWeek').format('YYYY-MM-DD'),moment().subtract(1, 'w').endOf('isoWeek').format('YYYY-MM-DD')]);
 				}
 			},
 			{

+ 1 - 5
src/views/award/print.vue

@@ -255,11 +255,7 @@
 						{
 							text: '上周',
 							onClick(picker) {
-								const now = new Date(new Date().toLocaleDateString());
-								const start = now.getTime() - (now.getDay() + 6) * 24 * 60 * 60 * 1000;
-								const end = start + 7 * 24 * 60 * 60 * 1000 - 1000;
-								picker.$emit('pick', [moment(start).format('YYYY-MM-DD'), moment(end).format(
-									'YYYY-MM-DD')]);
+								picker.$emit('pick', [moment().subtract(1, 'w').startOf('isoWeek').format('YYYY-MM-DD'),moment().subtract(1, 'w').endOf('isoWeek').format('YYYY-MM-DD')]);
 							}
 						},
 						{

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

@@ -106,11 +106,11 @@
 					</li>
 					<li class="flex-box" v-if="workDetailData.complete_task && workDetailData.complete_task.time">
 						<div class="label">完成时间</div>
-						<div class="content_text">{{ workDetailData.complete_task.time }}</div>
+						<div class="content_text">{{$moment(workDetailData.complete_task.time).format('YYYY-MM-DD HH:mm')}}</div>
 					</li>
 					<li class="flex-box" v-if="workDetailData.complete_task && workDetailData.complete_task.remark">
 						<div class="label">完成备注</div>
-						<div class="content_text">{{ workDetailData.complete_task.remark }}</div>
+						<div class="content_text">{{workDetailData.complete_task.remark }}</div>
 					</li>
 					<li class="flex-box" v-if="workDetailData.complete_task && workDetailData.complete_task.files && workDetailData.complete_task.files.length > 0">
 						<div class="label"></div>

+ 4 - 6
src/views/ranking/attendance_rating.vue

@@ -92,6 +92,7 @@
 				</el-form-item>
 				<el-form-item label="日" v-if="update.type=='daily'">
 					<el-date-picker
+					  :clearable="false"
 					  v-model="update.target_date"
 					  type="date"
 					  value-format="yyyy-MM-dd"
@@ -105,6 +106,7 @@
 					 :picker-options="pickerOptions"
 					  v-model="update.target_month"
 					  type="month"
+					   :clearable="false"
 					  placeholder="选择月">
 					</el-date-picker>
 				</el-form-item>
@@ -132,7 +134,7 @@
 
 				<el-form-item label="时间">
 					<el-date-picker
-						:clearable="false"
+					    :clearable="false"
 						v-model="exportTime_range"
 						type="daterange"
 						value-format="yyyy-MM-dd"
@@ -223,11 +225,7 @@ export default {
 					{
 						text: '上周',
 						onClick(picker) {
-							const end = new Date();
-							const start = new Date();
-							start.setTime(start.getTime() - (start.getDay() + 6) * 3600 * 1000 * 24);
-							end.setTime(start.getTime() + 6 * 24 * 60 * 60 * 1000 - 1000);
-							picker.$emit('pick', [start, end]);
+							picker.$emit('pick', [moment().subtract(1, 'w').startOf('isoWeek').format('YYYY-MM-DD'),moment().subtract(1, 'w').endOf('isoWeek').format('YYYY-MM-DD')]);
 						}
 					},
 					{

+ 17 - 1
src/views/ranking/integral_event.vue

@@ -29,7 +29,7 @@
 				<div class="form-item">
 					<div class="form-label">积分类型</div>
 					<div class="form-search">
-						<el-select  size="medium" v-model="formData.pt_id" clearable placeholder="请选择积分类型">
+						<el-select  size="medium" v-model="formData.pt_id" clearable placeholder="A/B分">
 							<el-option v-for="item in getTypes()" :key="item.name" :label="item.name" :value="item.id"></el-option>
 						</el-select>
 					</div>
@@ -95,6 +95,16 @@
 						</el-select>
 					</div>
 				</div>
+				<div class="form-item">
+					<div class="form-label">奖扣分值</div>
+					<div class="form-search">
+						<el-select class="date-picker-width" size="medium" v-model="formData.add_subtract"  placeholder="请选择复核状态">
+							<el-option  label="全部" :value="0"></el-option>
+							<el-option  label="奖分" :value="1"></el-option>
+							<el-option  label="扣分" :value="2"></el-option>
+						</el-select>
+					</div>
+				</div>
 				<div class="form-item">
 					<div class="form-label">内容搜索</div>
 					<div class="form-search">
@@ -417,6 +427,7 @@ export default {
 				status:1,
 				dc_status:JSON.stringify([1]),
 				is_enable:1,
+				add_subtract:0,
 				// order_key:'update_time',
 			},
 			time_slot: null,
@@ -500,6 +511,10 @@ export default {
 				this.deleteDisabled = false;
 			}
 		},
+		'formData.add_subtract'(val, old_val) {
+			this.formData.page = 1;
+			this.get_integral_list(this.formData);
+		},
 		'formData.is_enable'(val, old_val) {
 			this.formData.page = 1;
 			this.get_integral_list(this.formData);
@@ -707,6 +722,7 @@ export default {
 					(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.add_subtract ? '&add_subtract=' + this.formData.add_subtract : '') +
 					(this.formData.keyword ? '&keyword=' + this.formData.keyword : ''),
 				'_blank'
 			);

+ 1 - 0
src/views/set/check.vue

@@ -42,6 +42,7 @@ export default {
 		  },
         {
           initialName: "正常打卡,每次加分",
+          message:'只包含打上班卡',
           initia_mark: false,
           initia_input: {
             age: "0",

+ 74 - 62
src/views/set/framework.vue

@@ -41,7 +41,7 @@
 					</div>
 				</div>
 				<div class="terr-right border-right flex-1">
-					<FormBox >
+					<FormBox>
 						<div class="form-item">
 							<div class="form-label">启用状态</div>
 							<div class="form-search">
@@ -84,7 +84,11 @@
 								</div>
 							</template>
 						</el-table-column>
-						<el-table-column prop="accedence_time" label="入职时间"></el-table-column>
+						<el-table-column prop="accedence_time" label="入职时间">
+							<template slot-scope="scope">
+								<span style="cursor: pointer;" @click="moreMessage(scope.row.id)">{{scope.row.accedence_time}}</span>
+							</template>
+						</el-table-column>
 						<!-- <el-table-column prop="id" label="员工标识" width="80">
 							<template slot-scope="scope">
 								<el-button size="mini" type="primary" @click="copyId(scope.row.id)">复制</el-button>
@@ -130,6 +134,7 @@
 								</div>
 							</template>
 						</el-table-column>
+						
 						<!-- <el-table-column label="管理上级" align="center" width="80">
 							<template slot-scope="scope">
 								<span v-if="scope.row.is_creator != 1 && scope.row.is_official != 0" class="participateRank" style="color:#409eff;" @click="setSuperior(scope.row)">设置</span>
@@ -179,9 +184,10 @@
 						style="width:100%;"
 						v-model="messageMore.accedence_time"
 						type="date"
+						@change="updateDate"
+						:clearable="false"
 						value-format="yyyy-MM-dd"
 						placeholder="选择日期"
-						disabled
 						></el-date-picker>
 					</el-form-item>
 					<el-form-item label="部门" prop="name" :label-width="'100px'">
@@ -410,6 +416,7 @@
 					v-model="dept_name"
 					@change="handleChange"
 					:options="dept_tree"
+					:disabled="selectTbIndex!=4"
 					collapse-tags
 					:props="{checkStrictly: true, value: 'id', label: 'name', multiple: true, children: '_child' }"
 					ref="dept"
@@ -535,11 +542,11 @@ export default {
 			
 			// 人员同步
 			isShowTb:false,
-			selectTbIndex:1,
+			selectTbIndex:4,
 			tbList: [
-				{ id: 1, name: '仅同步指定部门内的人员信息(可多选)', kam: '该选择不会包含子部门人员,请确保选中需要同步的人员的直属部门' },
-				{ id: 2, name: '仅同步部门信息和上下级关系', kam: '仅同步所有部门名称和上下级所属关系,但不同步人员信息' },
-				{ id: 3, name: '同步全部部门和人员信息 ', kam: '同步全部信息所需时间较长,请关注同步成功后推送的工作通知' },
+				{ id: 4, name: '仅同步指定部门内的人员信息(可多选)', kam: '该选择不会包含子部门人员,请确保选中需要同步的人员的直属部门' },
+				{ id: 3, name: '仅同步部门信息和上下级关系', kam: '仅同步所有部门名称和上下级所属关系,但不同步人员信息' },
+				{ id: 1, name: '同步全部部门和人员信息 ', kam: '同步全部信息所需时间较长,请关注同步成功后推送的工作通知' },
 			],
 			dept_tree:[],
 			dept_name: [],
@@ -623,8 +630,14 @@ export default {
 			if(val){
 				this.dept_name=[];
 				this.dept_ids=[];
+				this.selectTbIndex==4;
 			}
-		}
+		},
+		diaTableVisible(val){
+			if(!val){
+				this.getEmployee();
+			}
+		},
 	},
 	created() {
 		this.filtration();
@@ -634,7 +647,6 @@ export default {
 		this.getEmployeeList();
 	},
 	mounted() {
-		console.log(this.$moment('2023-06').endOf('month').format('YYYY-MM-DD'))
 		this.$nextTick(function() {
 			if (this.$getCache('rule')) {
 				this.tips_show = false;
@@ -644,6 +656,12 @@ export default {
 		});
 	},
 	methods: {
+		//获取员工列表
+		updateDate() {
+			this.$axios('POST', '/api/employee/accedence', { employee_id: this.messageMore.id, time:this.messageMore.accedence_time}).then(res => {
+				this.$message.success('已修改')
+			})
+		},
 		// 递归判断列表,把最后的children设为undefined
 		getTreeData(data) {
 			for (var i = 0; i < data.length; i++) {
@@ -1084,27 +1102,29 @@ export default {
 		},
 		//同步信息
 		tb(is) {
-			// if(!is){
-			// 	this.isShowTb=true;
-			// 	return false
-			// }
-			this.$confirm('即将同步钉钉通讯录的人员名单,确定同步吗?', '提示', {
-				confirmButtonText: '确定',
-				cancelButtonText: '取消',
-				type: 'warning'
-			}).then(() => {
-				this.tbLoading = true;
-				this.$axios('post', '/api/ding/department_sync')
-					.then(res => {
-						this.$message.success({ message: '同步成功' });
-						this.dept_id = 0;
-						this.getInfo();
-						this.page=1;
-						this.getEmployee();
-					})
-					.finally(() => {
-						this.tbLoading = false;
-					});
+			if(!is){
+				this.isShowTb=true;
+				return false
+			}
+			let data={
+				type:this.selectTbIndex,
+				dept_list:this.dept_ids.toString(),
+			}
+			if(this.selectTbIndex==4&&this.dept_ids.length==0){
+				this.$message.error({ message: '请选择指定部门' });
+				return false
+			}
+			this.tbLoading = true;
+			this.$axios('post', '/api/ding/site_sync',data).then(res => {
+				this.$message.success({ message: '同步中,成功后将发送工作通知' });
+				this.dept_id = 0;
+				this.getInfo();
+				this.page=1;
+				this.getEmployee();
+				this.isShowTb=false
+			}).finally(() => {
+				this.tbLoading = false;
+				this.isShowTb=false
 			});
 		},
 		//搜索
@@ -1116,15 +1136,12 @@ export default {
 		changeIs(e, id) {
 			var url = e == 1 ? '/api/employee/disable' : '/api/employee/enable';
 			this.$axios('post', url, { employee_id: [id] }).then(res => {
-				if (res) {
-					if (e == 0) {
-						this.$message.success({ message: '开启成功,可在"角色权限设置对应管理范围"' });
-					} else {
-						this.$message.success({ message: res.data.msg });
-					}
-					// this.page=1;
-					this.getEmployee();
+				if (e == 0) {
+					this.$message.success({ message: '开启成功,可在"角色权限设置对应管理范围"' });
+				} else {
+					this.$message.success({ message: res.data.msg });
 				}
+				this.getEmployee();
 			});
 		},
 		//批量开通权限
@@ -1134,17 +1151,13 @@ export default {
 				return;
 			}
 			this.enable_loading = true;
-			this.$axios('post', '/api/employee/enable', { employee_id: this.selectIds })
-				.then(res => {
-					if (res) {
-						this.$message.success({ message: '开启成功,可在"角色权限设置对应管理范围"' });
-						this.page=1;
-						this.getEmployee();
-					}
-				})
-				.finally(err => {
-					this.enable_loading = false;
-				});
+			this.$axios('post', '/api/employee/enable', { employee_id: this.selectIds }).then(res => {
+				this.$message.success({ message: '开启成功,可在"角色权限设置对应管理范围"' });
+				this.page=1;
+				this.getEmployee();
+			}).finally(err => {
+				this.enable_loading = false;
+			});
 		},
 		//获取公司信息
 		getInfo(is) {
@@ -1171,9 +1184,9 @@ export default {
 		getDepartment() {
 			this.ruleDeprt = true;
 			this.$axios('get', '/api/department/tree').then(res => {
-					var list = [{id: 0,name: this.info.name,_child: res.data.data.list}];
-					this.bmList = list;
-					this.dept_tree = this.getTreeData(res.data.data.list);
+				var list = [{id: 0,name: this.info.name,_child: res.data.data.list}];
+				this.bmList = list;
+				this.dept_tree = this.getTreeData(res.data.data.list);
 			}).finally(() => {
 				this.ruleDeprt = false;
 			});
@@ -1192,16 +1205,15 @@ export default {
 				data.is_official=is_official;
 			}
 			this.$axios('get', '/api/employee/index', data).then(res => {
-					this.total = res.data.data.pageInfo.count;
-					this.userList = res.data.data.list;
-					var visible = this.$getCache('visible');
-					if (!visible) {
-						this.visible = true;
-					}
-				})
-				.finally(err => {
-					this.tableToading = false;
-				});
+				this.total = res.data.data.pageInfo.count;
+				this.userList = res.data.data.list;
+				var visible = this.$getCache('visible');
+				if (!visible) {
+					this.visible = true;
+				}
+			}).finally(err => {
+				this.tableToading = false;
+			});
 		},
 		visible_close() {
 			this.$setCache('visible', 'true');

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

@@ -18,6 +18,7 @@ export default {
 			initia_arr: [
 				{
 					initialName: '基础分',
+          message:'设置分值后,系统将为全部员工自动加上此项基础分;此项基础分仅加一次,计入每个员工的累计总分。',
 					initia_mark: true,
 					initia_input: {
 						age: ''
@@ -27,6 +28,7 @@ export default {
 				},
 				{
 					initialName: '工龄分',
+          message:'首次加分=员工已在职的月份数*工龄分,未满一个月的不加分;后续加分按已设置的工龄分值每月自动累加',
 					initia_mark: true,
 					initia_input: {
 						age: ''

+ 3 - 0
src/views/set/jurisdiction.vue

@@ -637,6 +637,7 @@
 				</el-form-item>
 			</el-form>
 		</el-dialog>
+		
 		<!-- 添加老板 -->
 		<el-dialog title="添加系统管理员" :visible.sync="dialogFormVisible" top="5vh" width="700px">
 			<EmployeeSelector v-if="dialogFormVisible" ref="boss" :multi="false" :user_no_select="false" @confirm="selectBoss"></EmployeeSelector>
@@ -646,6 +647,7 @@
 				<el-button type="primary" :loading="isShowBoss" :disabled="isShowBoss" @click="add_creator()">确 定</el-button>
 			</div>
 		</el-dialog>
+		
 		<!-- 查看管理范围 -->
 		<el-dialog title="数据查看权限" :visible.sync="dataAccessShow" width="600px">
 			<div v-loading="dataAccessLoading">
@@ -1458,6 +1460,7 @@ export default {
 		},
 		open_right(data) {
 			this.page=1;
+			this.keyword='';
 			this.jurisdiction = data.code == 'employee' ? this.dataAccessListEmployee : this.dataAccessList;
 			this.item_info = data;
 			if (data.code != 'employee') {

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

@@ -12,7 +12,7 @@
 				</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>
-					<el-button  type="primary" plain  @click="add()">添加日志模板</el-button>
+					<el-button  type="primary" plain  @click="add()">新增模板</el-button>
 					<el-button  type="primary" @click="isPz = true">设置<i class="el-icon-setting el-icon--right"></i></el-button>
 				</div>
 			</div>
@@ -48,7 +48,7 @@
 				</template>
 			</el-table>
 		</div>
-		<el-dialog title="日志配置" :visible.sync="isPz" top="25vh" width="520px" class="dialog">
+		<el-dialog :visible.sync="isPz" top="25vh" width="520px" class="dialog">
 			<el-alert class="el-dialog__body" title="日志配置适用所有日志" type="warning" :closable="false" show-icon></el-alert>
 			<el-form label-width="170px" ref="setForm" class="form">
 				<el-form-item label="是否允许查看日志内容"><el-switch v-model="see_log" :active-value="1" :inactive-value="0"></el-switch></el-form-item>

+ 3 - 3
src/views/set/screenSet.vue

@@ -113,7 +113,7 @@
 			</div>
 		</el-dialog>
 
-		<el-dialog :title="'设置('+selectItem.name+')'" :visible.sync="dialogVisible" width="1000px" class="dialog">
+		<el-dialog :title="'设置('+selectItem.name+')'" :visible.sync="dialogVisible" width="70%" 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;">点击下面模块,快速定位到设置项
@@ -152,7 +152,7 @@
 							<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-input style="width: 350px;" maxlength="20" show-word-limit v-model.trim="config.company.name" placeholder="请输入名称"/>
 								</el-form-item>
 								<el-form-item label="logo">
 									<upload
@@ -615,7 +615,7 @@ export default {
 				//配置格式 不是删除则必填
 				ranking_type:'ranking',
 				company: {
-					name: this.$getUserData().company_info.name.slice(0, 10), //不超过十个字 公司名截断
+					name: this.$getUserData().company_info.name.slice(0, 20), //不超过十个字 公司名截断
 					logo: 'https://integralsys.oss-cn-shenzhen.aliyuncs.com/intesys/dd/17/2022/07/01/CaBis82ryBYbncxc3nehiSXkiwDbhbwi.png' //公司logo
 				},
 				title: '积分数据大屏', //不超过十个字

+ 3 - 3
src/views/set/voluntarilyPoint.vue

@@ -121,11 +121,11 @@
 
 			<!-- 可写公共组建: -->
 			<!-- 新增加分组弹出框 -->
-			<el-dialog :close-on-click-modal="false" :title="grouping_type ? '编辑加分组' : '新增加分组'" :visible.sync="dialogVisible" width="40%">
+			<el-dialog :close-on-click-modal="false" :title="grouping_type ? '编辑加分组' : '新增加分组'" :visible.sync="dialogVisible">
 				<el-form :model="numberValidateForm" ref="numberValidateForm" label-width="100px" class="demo-ruleForm">
 					<el-form-item label="加分组名称" prop="name" :rules="[{ required: true, message: '请输入加分组名称' }]">
-						<el-input type="age" v-model="numberValidateForm.name" placeholder="请输入加分组名称"></el-input>
-					</el-form-item>
+            <el-input v-model="numberValidateForm.name" placeholder="请输入加分组名称" maxlength="30" show-word-limit />
+          </el-form-item>
 				</el-form>
 				<span slot="footer" class="dialog-footer" style=" overflow: hidden;">
 					<el-button

+ 60 - 1
src/views/task/my_issue.vue

@@ -172,7 +172,7 @@
 							</span>
 						</template>
 						<template slot-scope="scope">
-							<span v-if="scope.row.total_chance">{{ scope.row.total_chance-scope.row.chance }}/{{ scope.row.total_chance }}</span>
+							<span v-if="scope.row.total_chance" @click.stop="openTable(scope.row)" class="qd-num">{{ scope.row.total_chance-scope.row.chance }}/{{ scope.row.total_chance }}</span>
 							<span v-else>--</span>
 						</template>
 					</el-table-column>
@@ -318,6 +318,42 @@
 
 		<!-- 抢单任务详情弹窗 -->
 		<rewardTaskDetailsPopup :visible.sync="showRewardTaskDetailsPopup" v-if="showRewardTaskDetailsPopup" :id="detailId" :title="'任务详情'"></rewardTaskDetailsPopup>
+	
+		<!-- 对齐我的目标详情 -->
+		<el-dialog title="抢单人员详情" :visible.sync="isShowTable" :append-to-body="true" width="750px" top="5%">
+		  <div>
+		      <div class="fontColorC" style="padding: 10px;font-size: 16px;">
+				  {{tableList.length}}人已抢单,其中<span class="blue">{{returnNum}}</span>人已完成
+			  </div>
+			  <el-table :data="tableList" style="width: 100%;height: 550px;overflow: auto;">
+					<el-table-column prop="name" label="执行人">
+					  <template slot-scope="scope">
+						  <div class="flex-box">
+							<userImage :user_name="scope.row.employee_name" :img_url="scope.row.img_url" width="40px" height="40px"></userImage>
+							<span style="line-height: 40px; padding-left: 10px;">{{ scope.row.employee_name }}</span>
+						  </div>
+					  </template>
+					</el-table-column>
+					<el-table-column label="部门" prop="dept"></el-table-column>
+					<el-table-column label="抢单时间" prop="create_time"></el-table-column>
+					<el-table-column label="执行情况" width="100px">
+					  <template slot-scope="scope">
+						 <span v-if="scope.row.status==1" class="orange">进行中</span>
+						 <span v-if="scope.row.status==2" class="blue">已完成</span>
+						 <span v-if="scope.row.status==3" class="fontColorB">退回</span>
+						 <span v-if="scope.row.status==4" class="green">已审批</span>
+						 <span v-if="scope.row.status==5" class="fontColorB">发布者已撤回</span>
+					  </template>
+					</el-table-column>
+					<template slot="empty">
+						<noData></noData>
+					</template>
+			  </el-table>
+		  </div>
+		  <div class="flex-box-end" style="margin-top: 20px;">
+		  	<el-button @click="isShowTable=false">关 闭</el-button>
+		  </div>
+		</el-dialog>
 	</div>
 </template>
 
@@ -390,9 +426,23 @@ export default {
 			//重复任务复用
 			isFy:false,
 			fyData:{},
+			
+			isShowTable:false,
+			tableList:[],
 		};
 	},
 	components: {temporaryTask, rewardTask, rewardTaskAmend, temporaryTaskAmend, taskDetailsPopup, repeatTaskDetailsPopup, rewardTaskDetailsPopup },
+	computed:{
+		returnNum(){
+			let num=0
+			this.tableList.forEach(item=>{
+				if(item.status==2||item.status==4){
+				   num++
+				}
+			})
+			return num
+		}
+	},
 	watch: {
 		dialogVisible(val){
 			if(!val){
@@ -471,6 +521,12 @@ export default {
 		this.getEmployee(); //员工列表
 	},
 	methods: {
+		openTable(item){
+			this.$axios('get', '/api/integral/task/work', { task_id:item.id }).then(res => {
+				this.isShowTable=true;
+				this.tableList=res.data.data.list;
+			});
+		},
 		enable(item){
 			this.$axios('post', '/api/integral/schedule/enable', { schedule_id:item.id }).then(res => {
 				this.$message.success(item.enable==1? '已暂停':'已启用');
@@ -685,6 +741,9 @@ export default {
 </script>
 
 <style scoped lang="scss">
+.qd-num:hover{
+	color: #26A2FF;
+}	
 .box {
 	min-height: calc(100vh - 184px);
 	min-width: 800px;

+ 1 - 5
src/views/welfare/conversion.vue

@@ -281,11 +281,7 @@
 						{
 							text: '上周',
 							onClick(picker) {
-								const end = new Date();
-								const start = new Date();
-								start.setTime(start.getTime() - (start.getDay() + 6) * 3600 * 1000 * 24);
-								end.setTime(start.getTime() + 6 * 24 * 60 * 60 * 1000 - 1000);
-								picker.$emit('pick', [start, end]);
+								picker.$emit('pick', [moment().subtract(1, 'w').startOf('isoWeek').format('YYYY-MM-DD'),moment().subtract(1, 'w').endOf('isoWeek').format('YYYY-MM-DD')]);
 							}
 						},
 						{

+ 1 - 5
src/views/welfare/operatingRecord.vue

@@ -216,11 +216,7 @@ export default {
 					{
 						text: '上周',
 						onClick(picker) {
-							const end = new Date();
-							const start = new Date();
-							start.setTime(start.getTime() - (start.getDay() + 6) * 3600 * 1000 * 24);
-							end.setTime(start.getTime() + 6 * 24 * 60 * 60 * 1000 - 1000);
-							picker.$emit('pick', [start, end]);
+							picker.$emit('pick', [moment().subtract(1, 'w').startOf('isoWeek').format('YYYY-MM-DD'),moment().subtract(1, 'w').endOf('isoWeek').format('YYYY-MM-DD')]);
 						}
 					},
 					{

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

@@ -57,18 +57,19 @@
 					<el-table-column label="时间" prop="event_time" width="150"></el-table-column>
 					<el-table-column label="积分" prop="review_point" width="120">
 						<template slot-scope="scope">
-							<span v-show="scope.row.review_point < 0" class="green">
+							<span v-if="scope.row.review_point < 0" class="green">
 								{{ scope.row.review_point }}
 								<span>{{ $getTypsName(scope.row.pt_id) }}</span>
 							</span>
-							<span class="red" v-show="scope.row.review_point >= 0">
-								+{{ scope.row.review_point }}
-								<span>{{ $getTypsName(scope.row.pt_id) }}</span>
+							<span class="red" v-else-if="scope.row.review_point > 0">
+								+{{ scope.row.review_point }}<span>{{ $getTypsName(scope.row.pt_id) }}</span>
 							</span>
+							<span v-else>--</span>
 						</template>
 					</el-table-column>
 					<el-table-column label="状态" prop="review_status" width="80">
 						<template slot-scope="scope">
+							<!-- <span v-show="scope.row.review_status == 0">待审批</span> -->
 							<span v-show="scope.row.review_status == 1" class="green">审批通过</span>
 							<span v-show="scope.row.review_status == 2" class="red">审批驳回</span>
 						</template>
@@ -113,6 +114,7 @@ export default {
 				page_size: 10,
 				page: 1,
 				keyword:'',
+				reviewer_id:this.$getUserData().id,
 			},
 			total: null,
 			list: null,

+ 250 - 0
src/views/workbench/approvalAll.vue

@@ -0,0 +1,250 @@
+<template>
+	<div>
+		<div class="all padding-20">
+			<FormBox>
+				<div class="form-item">
+					<div class="form-label">姓名搜索</div>
+					<div class="form-search">
+						<el-select size="medium" v-model="formData.target_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>
+					</div>
+				</div>
+				<div class="form-item">
+					<div class="form-label">审批人</div>
+					<div class="form-search">
+						<el-select size="medium" v-model="formData.reviewer_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>
+					</div>
+				</div>
+				<div class="form-item">
+					<div class="form-label">审批来源</div>
+					<div class="form-search">
+						  <el-select size="medium" v-model="formData.source_type" placeholder="请选择排序">
+							<el-option v-for="item in sourceList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+						  </el-select>
+					</div>
+				</div>
+				<div class="form-item">
+					<div class="form-label">积分类型</div>
+					<div class="form-search">
+						<el-select size="medium" v-model="formData.pt_id" placeholder="请选择排序">
+							<el-option v-for="item in point_types" :key="item.id" :label="item.name" :value="item.id"></el-option>
+						</el-select>
+					</div>
+				</div>
+<!-- 				<div class="form-item">
+					<div class="form-label">审批状态</div>
+					<div class="form-search">
+						<el-select size="medium" v-model="formData.type" placeholder="请选择排序">
+							<el-option v-for="item in stateList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+						</el-select>
+					</div>
+				</div> -->
+				<div class="form-item">
+					<div class="form-label">内容搜索</div>
+					<div class="form-search">
+						<el-input size="medium" max="20" v-model="formData.keyword" placeholder="请输入" clearable></el-input>
+					</div>
+				</div>
+			</FormBox>
+			<div>
+				<div class="orange" 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">
+							<div class="flex-box flex-v-ce">
+								<userImage width="50px" height="50px" :id="scope.row.employee_id" :user_name="scope.row.employee_name"></userImage>
+								<div style="margin-left: 5px;">
+									<span class="tableTitle" v-show="scope.row.source_type == 1">{{ scope.row.employee_name }}的积分任务</span>
+									<span class="tableTitle" v-show="scope.row.source_type == 2">{{ scope.row.employee_name }}的积分申请</span>
+									<span class="tableTitle" v-show="scope.row.source_type == 3">{{ scope.row.employee_name }}的积分奖扣</span>
+									<span class="tableTitle" v-show="scope.row.source_type == 4">{{ scope.row.employee_name }}的绩效工作</span>
+								</div>
+							</div>
+						</template>
+					</el-table-column>
+					<el-table-column label="审批内容" prop="remark.rule">
+						<template slot-scope="scope">
+							<span class="font-flex-word" style="max-width: 200px;">{{ scope.row.remark.customize || scope.row.remark.rule }}</span>
+						</template>
+					</el-table-column>
+					<el-table-column label="时间" prop="event_time" width="150"></el-table-column>
+<!-- 					<el-table-column label="积分" prop="review_point" width="120">
+						<template slot-scope="scope">
+							<span v-if="scope.row.review_point < 0" class="green">
+								{{ scope.row.review_point }}
+								<span>{{ $getTypsName(scope.row.pt_id) }}</span>
+							</span>
+							<span class="red" v-else-if="scope.row.review_point > 0">
+								+{{ scope.row.review_point }}<span>{{ $getTypsName(scope.row.pt_id) }}</span>
+							</span>
+							<span v-else>--</span>
+						</template>
+					</el-table-column> -->
+<!-- 					<el-table-column label="状态" prop="review_status" width="80">
+						<template slot-scope="scope">
+							<span v-show="scope.row.review_status == 0">待审批</span>
+							<span v-show="scope.row.review_status == 1" class="green">审批通过</span>
+							<span v-show="scope.row.review_status == 2" class="red">审批驳回</span>
+						</template>
+					</el-table-column> -->
+					<template slot="empty">
+						<div class="nopoint_box">
+							<div class="noimg noperson"></div>
+							<span class="title">没有对应的数据</span>
+						</div>
+					</template>
+				</el-table>
+			</div>
+
+			<center style="padding: 20px 0;">
+				<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="formData.page_size"
+					:total="total"
+				></el-pagination>
+			</center>
+		</div>
+		<examinePopup :title="'审核详情'" :id="detail_id" :show.sync="detailShow"></examinePopup>
+	</div>
+</template>
+
+<script>
+import examinePopup from '@/components/examinePopup.vue';
+import { _debounce, getToken } from '@/api/auth';
+export default {
+	data() {
+		return {
+			formData: {
+				type: 'waiting',
+				source_type: '0',
+				target_id:null,
+				pt_id: 0,
+				page_size: 10,
+				page: 1,
+				keyword:'',
+				reviewer_id:null,
+			},
+			total: null,
+			list: null,
+			loading: false,
+			point_types: null,
+			detailShow: false,
+			detail_id: null,
+			employee_map: this.$getCache("userList"),
+			sourceList: [{ name: '全部', id: '0' }, { name: '积分任务', id: '1' }, { name: '积分申请', id: '2' }, { name: '积分奖扣', id: '3' }],
+			config:{},
+			stateList: [{ name: '全部', id: 'all' }, { name: '待审批', id: 'waiting' }, { name: '已结束', id: 'reviewed' }],
+		};
+	},
+	watch: {
+		'formData.keyword': {
+			deep: true,
+			handler: _debounce(function(val) {
+				this.formData.page = 1;
+				this.getSpList();
+			}, 1000)
+		},
+		'formData.pt_id'() {
+			this.formData.page = 1;
+			this.getSpList();
+		},
+		// 'formData.type'() {
+		// 	this.formData.page = 1;
+		// 	this.getSpList();
+		// },
+		'formData.source_type'() {
+		  this.formData.page = 1;
+		  this.getSpList();
+		},
+		'formData.target_id'(val) {
+		  if(!val){
+		    this.formData.target_id = null;
+		  }
+		  this.formData.page = 1;
+		  this.getSpList();
+		},
+		'formData.reviewer_id'(val) {
+		  if(!val){
+		    this.formData.reviewer_id = null;
+		  }
+		  this.formData.page = 1;
+		  this.getSpList();
+		}
+	},
+	components: { examinePopup },
+	mounted() {
+		this.getSpList();
+		this.config=this.$store.state.config;
+		this.point_types = this.getPointTypes();
+	},
+	methods: {
+		openDetail(item) {
+			this.detail_id = item.id;
+			this.detailShow = true;
+		},
+		getTypes() {
+			var arr = this.$getTyps();
+			return arr.filter(function(item) {
+				return item.code != 'JX';
+			});
+		},
+		// 获取积分类型
+		getPointTypes() {
+			let point = this.getTypes();
+			point.unshift({ code: 'all', id: 0, name: '全部' });
+			return point;
+		},
+		// 页码变更
+		handleCurrentChange(val) {
+			this.formData.page = val;
+			this.getSpList();
+		},
+		handleSizeChange(val) {
+			this.formData.page_size = val;
+			this.getSpList();
+		},
+		getSpList() {
+			let self = this;
+			self.loading = true;
+			let params = JSON.parse(JSON.stringify(this.formData));
+			self.$axios('get', '/api/integral/review/list', params)
+				.then(res => {
+					if (res.data.code == 1) {
+						self.list = res.data.data.list;
+						self.total = res.data.data.total;
+					}
+				})
+				.finally(e => {
+					self.loading = false;
+				});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.box {
+	min-height: calc(100vh - 140px);
+	width: 100%;
+	background-color: #fff;
+	padding: 20px;
+	& .listTable {
+		& .tableTitle {
+			line-height: 50px;
+			padding-left: 10px;
+		}
+	}
+}
+.popperSPBOX {
+	max-width: calc(100vh - 400px);
+	background-color: #fff;
+}
+</style>

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

@@ -152,7 +152,8 @@ export default {
 				page: 1,
 				pt_id: '0',
 				page_size: 10,
-				source_type: '0'
+				source_type: '0',
+				reviewer_id:this.$getUserData().id,
 			},
 			loading: false,
 			list: [],

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

@@ -104,6 +104,7 @@
 					page_size: 10,
 					page: 1,
 					keyword: '',
+					reviewer_id:this.$getUserData().id,
 				},
 				total: null,
 				list: null,

+ 812 - 0
src/views/workbench/integral_review.vue

@@ -0,0 +1,812 @@
+<template>
+  <div class="all padding-20">
+    <el-card style="margin-bottom: 20px;">
+      <el-form inline>
+        <el-form-item>
+          <el-select class="date-picker-width" size="medium" v-model="formData.dc_status"  placeholder="复核状态" :disabled="loading">
+            <el-option v-for="item in dc_status_options" :key="item.id" :label="item.name" :value="item.id"/>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-select size="medium" v-model="formData.source_type" placeholder="全部来源" :disabled="loading">
+            <el-option v-for="item in source_types" :key="item.id" :label="item.name" :value="item.id"/>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-select size="medium" v-model="formData.is_enable" style="margin-right: 5px" :disabled="loading">
+            <el-option  label="已启用用户" :value="1"></el-option>
+            <el-option  label="未授权&未启用用户" :value="0"></el-option>
+          </el-select>
+          <el-tooltip effect="dark" placement="top">
+            <template slot="content">
+              人员状态过滤。默认仅显示组织架构中“已启用”人员的积分事件,未启用、已离职等人员的积分事件可以通过“未启用&未授权”筛选查看
+            </template>
+            <span><i class="el-icon-warning"></i></span>
+          </el-tooltip>
+        </el-form-item>
+        <el-form-item>
+          <el-select size="medium" v-model="formData.employee_ids" filterable clearable placeholder="请输入或选择人员" :disabled="loading">
+            <el-option v-for="item in employee_list" :key="item.id" :label="item.name" :value="item.id"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-select  size="medium" v-model="formData.pt_id" clearable placeholder="A/B分" :disabled="loading">
+            <el-option v-for="item in pts" :key="item.name" :label="item.name" :value="item.id"/>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item>
+          <el-cascader
+              v-model="formData.rules"
+              :options="rule_trees"
+              :props="{ checkStrictly: true, value: 'id', label: 'name', children: 'child' }"
+              @change="onRuleChange"
+              size="medium"
+              ref="rule"
+              clearable
+              placeholder="规则分类"
+              :disabled="loading"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-date-picker
+              v-model="formData.time_scope"
+              type="daterange"
+              size="medium"
+              value-format="yyyy-MM-dd"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              :disabled="loading"
+          />
+        </el-form-item>
+
+        <el-form-item>
+          <el-input
+              size="medium"
+              clearable
+              max="20"
+              v-model="formData.keyword"
+              placeholder="搜索内容"
+              :disabled="loading"
+          />
+        </el-form-item>
+<!--        <el-form-item>-->
+<!--          <el-input-->
+<!--              size="medium"-->
+<!--              clearable-->
+<!--              v-model="formData.point"-->
+<!--              placeholder="分值"-->
+<!--              @input="onPointInput"-->
+<!--              :disabled="loading"-->
+<!--          />-->
+<!--        </el-form-item>-->
+
+        <el-form-item>
+          <el-cascader
+              size="medium"
+              v-model="dept_names"
+              :options="dept_tree"
+              :props="{ checkStrictly: true, multiple: true, value: 'id', label: 'name', children: '_child' }"
+              ref="dept"
+              filterable
+              collapse-tags
+              clearable
+              placeholder="全公司"
+              style="min-width: 300px"
+              :disabled="loading"
+          />
+        </el-form-item>
+        <el-form-item>
+          <NumberRangeSelector
+              :min.sync="formData.minPoint"
+              :max.sync="formData.maxPoint"
+              :disabled="loading"
+              title="分值区间"
+              @scopeSubmit="handlePointScopeSubmit"
+          />
+        </el-form-item>
+      </el-form>
+      <el-row :gutter="5" justify="center" align="center">
+        <el-col :span="4">
+          <el-button-group>
+            <el-button type="primary" size="medium" :disabled="!canSubmitBatch" @click="openBatch">批处理</el-button>
+          </el-button-group>
+          <span style="padding-left: 20px;" :class="websocketAuth ? 'green' : 'orange'">
+            <i :class="websocketAuth ? 'el-icon-connection' : 'el-icon-warning-outline'">
+              {{websocketAuth ? '服务已启动' : '服务启动中.....'}}
+            </i>
+          </span>
+        </el-col>
+      </el-row>
+    </el-card>
+    <div>
+      <el-table
+          :data="integralList"
+          style="width: 100%;"
+          v-loading="loading"
+          @row-click="openDetail"
+          @selection-change="onSelectionChange"
+      >
+        <el-table-column
+            v-if="formData.dc_status === 0"
+            type="selection"
+            width="55"
+            :key="1"
+        />
+        <el-table-column prop="employee_name" label="姓名" align="center" width="200px" :key="2" >
+          <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="center"
+            :key="3"
+        />
+        <el-table-column prop="point" label="积分" align="center" :key="4">
+          <template slot-scope="scope">
+            <span :class="scope.row.point < 0 ? 'green' : 'red'">{{ scope.row.point }} {{ $getTypsName(scope.row.pt_id) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="remark" label="事件内容" align="center" show-overflow-tooltip :key="5" />
+        <el-table-column prop="event_time" label="时间" align="center" :key="6"/>
+        <el-table-column prop="source_type" label="事件来源" align="center" :key="7">
+          <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="操作" v-if="formData.dc_status === 0" :key="8">-->
+<!--          <template slot-scope="scope">-->
+<!--            <el-link :underline="false" type="primary" :disabled="loading" @click.stop="openPass(scope.row)">通过</el-link>-->
+<!--            <el-link :underline="false" type="primary" :disabled="loading" style="padding: 0 10px;" @click.stop="setGrade(scope.row)">调整分数</el-link>-->
+<!--            <el-link :underline="false" type="danger" :disabled="loading" style="padding: 0 10px;" @click.stop="reject(scope.row)">驳回</el-link>-->
+<!--          </template>-->
+<!--        </el-table-column>-->
+        <template slot="empty">
+          <noData></noData>
+        </template>
+      </el-table>
+      <center class="pagination">
+        <el-pagination
+            background
+            @size-change="v => formData.page_size = v"
+            @current-change="v => formData.page = v"
+            :current-page="formData.page"
+            :page-sizes="[10, 20, 50,100]"
+            layout="total, sizes, prev, pager, next"
+            :page-size="formData.page_size"
+            :total="formData.total"
+        />
+      </center>
+    </div>
+    <el-dialog
+        :visible.sync="showDetail"
+        custom-class="text-center"
+        title="积分信息"
+        :close-on-click-modal="!loading || !currentItem"
+        :close-on-press-escape="!loading || !currentItem"
+        :show-close="false"
+        :before-close="closeDetail"
+    >
+      <div v-if="currentItem">
+        <el-row :gutter="5" v-if="this.currentItem.dc_status === 0" style="margin-bottom: 10px;">
+          <el-col :span="6" v-if="event_review_point">
+            <el-input size="small" v-model="currentItem.point" type="number">
+              <template #prepend>积分</template>
+            </el-input>
+          </el-col>
+          <el-col :span="event_review_point > 0 ? 14 : 19" >
+            <el-input :size=" event_review_point > 0 ? 'small' : 'medium'" v-model="currentItem.comment" maxlength="50" show-word-limit  clearable >
+              <template #prepend>备注</template>
+            </el-input>
+          </el-col>
+          <el-col :span="event_review_point > 0 ? 4 : 5">
+            <el-button-group>
+              <el-button :size=" event_review_point > 0 ? 'small' : 'medium'" type="warning" @click="disagree" :disabled="loading">驳回</el-button>
+              <el-button :size=" event_review_point > 0 ? 'small' : 'medium'" type="primary" :disabled="!websocketAuth" :loading="loading" @click="agree">通过</el-button>
+            </el-button-group>
+          </el-col>
+        </el-row>
+        <el-descriptions
+            :column="1"
+            border
+            :label-style="{textAlign:'center'}"
+            :content-style="{textAlign: 'center'}"
+        >
+          <el-descriptions-item label="姓名">{{currentItem.employee_name}}&nbsp;{{currentItem.dept}}</el-descriptions-item>
+          <el-descriptions-item label="积分">{{currentItem.point_mark}}&nbsp;{{$getTypsName(currentItem.pt_id)}}</el-descriptions-item>
+          <el-descriptions-item label="内容">{{currentItem.remark}}</el-descriptions-item>
+          <el-descriptions-item label="事件时间">{{currentItem.event_time}}</el-descriptions-item>
+          <el-descriptions-item label="创建时间">{{currentItem.create_time}}</el-descriptions-item>
+        </el-descriptions>
+<!--        <template v-if="currentItem?.dc_remark?.flow?.length > 0">-->
+        <template v-if="currentItem.dc_remark && currentItem.dc_remark.flow">
+          <h3 style="margin: 10px 0;">复核流程</h3>
+          <el-steps
+              :active="currentItem.dc_remark.flow.length"
+              align-center
+          >
+            <el-step
+                v-for="(item,index) in currentItem.dc_remark.flow"
+                :key="index"
+                :title="`${item.employee_name} ${item.action === 'agree' ? '复核通过' : (item.action === 'disagree' ? '复核驳回' : '')}`"
+            >
+              <template #description>
+                {{$moment(item.time * 1000).format('YYYY-MM-DD')}}&nbsp;{{item.comment || ''}}
+              </template>
+            </el-step>
+          </el-steps>
+        </template>
+      </div>
+      <el-empty v-else/>
+    </el-dialog>
+    <el-dialog
+        :visible.sync="showBatch"
+        custom-class="text-center"
+        title="批处理"
+        :close-on-click-modal="!loading || !selectedItems || selectedItems.length === 0"
+        :close-on-press-escape="!loading || !selectedItems || selectedItems.length === 0"
+        :show-close="false"
+        :before-close="closeBatch"
+    >
+      <el-row :gutter="5">
+        <el-col :span="18">
+          <el-input
+              v-model="batchComment"
+              maxlength="50"
+              show-word-limit
+              :disabled="loading"
+          >
+            <template #prepend>备注</template>
+          </el-input>
+        </el-col>
+        <el-col :span="6">
+          <el-button-group>
+            <el-button  type="warning" @click="disagreeBatch" :disabled="loading">驳回</el-button>
+            <el-button  type="primary" :disabled="!websocketAuth" :loading="loading" @click="agreeBatch">通过</el-button>
+          </el-button-group>
+        </el-col>
+      </el-row>
+      <el-progress text-inside :stroke-width="20" :percentage="batchProgress" style="margin: 10px 0;" v-show="loading" />
+      <el-table :data="selectedItems">
+        <el-table-column
+            prop="employee_name"
+            show-overflow-tooltip
+            label="姓名"
+            align="center"
+        />
+        <el-table-column
+            prop="point_mark"
+            show-overflow-tooltip
+            label="积分"
+            align="center"
+        />
+        <el-table-column
+            prop="remark"
+            show-overflow-tooltip
+            label="内容"
+            align="center"
+        />
+        <el-table-column align="center">
+          <template #header>
+            结果&nbsp;
+            <el-dropdown trigger="click" @command="copyResult" v-if="canClipboard">
+              <span><i class="el-icon-more"/></span>
+              <el-dropdown-menu slot="dropdown">
+                <el-dropdown-item command="normal">复制结果</el-dropdown-item>
+                <el-dropdown-item command="origin">复制结果源</el-dropdown-item>
+              </el-dropdown-menu>
+            </el-dropdown>
+          </template>
+          <template slot-scope="scope">
+            <el-link :type="scope.row.code === 1 ? 'primary' : (scope.row.code === 1 ? 'primary' : 'warning')">
+              <template v-if="loading && scope.row.code === -1">
+                <i class="el-icon-loading"></i>
+              </template>
+              <template v-else>
+                {{ batchResultMark(scope.row) }}
+              </template>
+            </el-link>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-dialog>
+  </div>
+</template>
+
+
+<script>
+import {onlyNumberFilter} from "@/utils";
+import {isNumeric} from "echarts/lib/util/number";
+import {_debounce, getTypsName} from "@/api/auth";
+import {wsClient} from "@/api/wsService";
+import NumberRangeSelector from '@/components/numberRangeSelector'
+
+export default {
+  name: "integral_review",
+  components:{NumberRangeSelector},
+  data(){
+    let pts = this.$getTyps().filter(item => item.code !== 'JX');
+    return {
+      pts,
+      rule_trees:[],
+      employee_list:[],
+      event_review_point:0,
+      source_types:[
+        { 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_options:[
+        { id: 0, name: '待复核' },
+        { id: 1, name: '通过' },
+        { id: 2, name: '驳回' },
+      ],
+      loading: false,
+      dept_names:[],
+      dept_tree: [],
+      formData: {
+        page: 1,
+        page_size: 10,
+        employee_ids:'',
+        pt_id:'',
+        source_type:0,
+        rules:[],
+        rule_id:0,
+        time_scope:[],
+        start_day:'',
+        end_day:'',
+        dc_status:0,
+        keyword:'',
+        point:'',
+        is_enable:1,
+        dept_ids:'',
+        minPoint:null,
+        maxPoint:null,
+      },
+      integralList:[],
+      selectedItems:[],
+      wsClient:wsClient,
+      showDetail:false,
+      showBatch:false,
+      currentItem:null,
+      batchComment:'',
+      batchPoint:0,
+      batchResult:[]
+    }
+  },
+  methods:{
+    getTypsName,
+    getRuleTrees(){
+      this.$axios('get', '/api/integral/rule/trees').then(res => {
+        this.rule_trees = this.getRuleTreeData(res.data.data.rule_tree);
+      });
+    },
+    // 规则递归 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;
+    },
+    getEmployee(){
+      this.$axios('get', '/api/employee/index', { page: 0, page_size: 3000, is_official: 1 }).then(res => {
+        this.employee_list = res.data.data.list;
+      });
+    },
+    onRuleChange(val){
+      this.formData.rule_id = val.length === 0 ? 0 : this.formData.rules[this.formData.rules.length - 1]
+    },
+    onPointInput(v){
+      this.formData.point = onlyNumberFilter(v)
+    },
+    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;
+    },
+    handlePointScopeSubmit(){
+      this.formData.page = 1
+      this.getIntegralList()
+    },
+    getIntegralList(){
+      let self = this
+      if (self.loading) return;
+      self.loading = true;
+      let data = {
+        page:self.formData.page,
+        page_size:self.formData.page_size,
+        is_enable:self.formData.is_enable,
+        dc_status:[self.formData.dc_status],
+      }
+      if ([1,2].includes(self.formData.dc_status)) data.order_key = 'dc_time'
+
+      if (self.formData.source_type) data.source_type = self.formData.source_type;
+      if (self.formData.employee_ids) data.employee_ids = self.formData.employee_ids;
+      if (self.formData.pt_id) data.pt_id = self.formData.pt_id;
+      if (self.formData.rule_id) data.rule_id = self.formData.rule_id;
+      if (self.formData.start_day && self.formData.end_day) {
+        data.start_day = self.formData.start_day
+        data.end_day = self.formData.end_day
+      }
+      if (self.formData.keyword) data.keyword = self.formData.keyword
+      if (isNumeric(self.formData.point)) data.point = self.formData.point;
+      if (self.formData.dept_ids) data.dept_ids = self.formData.dept_ids;
+      if (self.formData.minPoint !== null && self.formData.maxPoint !== null) {
+        data.min_point = self.formData.minPoint
+        data.max_point = self.formData.maxPoint
+      }
+
+      self.$axios('get', '/api/integral/statistics/integral', data).then(res => {
+        self.integralList = res.data.data.list;
+        if(data.page === 1){
+          self.formData.total = res.data.data.total;
+        }
+      }).finally(() => {
+        self.loading = false;
+      });
+    },
+    onSelectionChange(selection){
+      this.selectedItems = selection.map(item => {
+        return {
+          event_id:item.id,
+          employee_name:item.employee_name,
+          point:item.point,
+          point_mark:item.point_mark + " " + this.$getTypsName(item.pt_id),
+          remark:item.remark,
+          hasFinish:false,
+          code:-1,
+          msg:'',
+        }
+      })
+    },
+    openDetail(item){
+      this.currentItem = item
+
+      let data = {
+        event_id: item.id
+      }
+      this.loading = true
+      this.$axios('get', '/api/integral/statistics/integral/info', data)
+          .then(res => {
+            if (res.data.code !== 1) return
+            this.currentItem.dc_remark = res.data.data.dc_remark
+          })
+          .finally(() => {
+            this.loading = false
+            this.showDetail = true
+          })
+    },
+    closeDetail(){
+      this.showDetail = false
+      this.currentItem = null
+      this.getIntegralList()
+    },
+    agree(){
+      if (!this.currentItem || this.loading) return
+      let data = {
+        type:'event_check',
+        action:'agree',
+        event_id:this.currentItem.id,
+        point:this.currentItem.point,
+        comment:this.currentItem?.comment || ''
+      }
+      this.showDetail = false
+      this.currentItem = null
+      this.loading = true
+      if (!this.wsClient.getAuthStatus()){
+        this.wsClient.initWebSocket(() => {
+          this.wsClient.send(data)
+        },(msg) => {
+          if (msg.type !== 'event_check') return
+          this.loading = false
+          this.getIntegralList()
+        })
+      }else {
+        this.wsClient.send(data,(msg) => {
+          if (msg.type !== 'event_check') return
+          this.loading = false
+          this.getIntegralList()
+        })
+      }
+    },
+    disagree(){
+      if (!this.currentItem || this.loading) return
+      let data = {
+        type:'event_check',
+        action:'disagree',
+        event_id:this.currentItem.id,
+        comment:this.currentItem?.comment || ''
+      }
+      this.showDetail = false
+      this.currentItem = null
+      this.loading = true
+      if (!this.wsClient.getAuthStatus()){
+        this.wsClient.initWebSocket(() => {
+          this.wsClient.send(data)
+        },(msg) => {
+          if (msg.type !== 'event_check') return
+          this.loading = false
+          this.getIntegralList()
+        })
+      }else {
+        this.wsClient.send(data,(msg) => {
+          if (msg.type !== 'event_check') return
+          this.loading = false
+          this.getIntegralList()
+        })
+      }
+
+    },
+    openBatch(){
+      console.log(this.selectedItems.map(item => item.event_id).toString())
+      this.showBatch = true
+      this.batchComment = ''
+    },
+    closeBatch(){
+      this.showBatch = false
+      this.batchComment = ''
+      this.batchResult = []
+      this.getIntegralList()
+    },
+    agreeBatch(){
+      this.loading = true
+      this.batchResult = []
+      this.wsClient.setBusinessFun((res) => {
+        if (res.type !== 'ping') this.batchResult.push(res)
+        if (res.type !== 'event_check') return
+        this.selectedItems.filter(item => item.event_id === res?.result?.source_msg?.event_id).forEach(item => {
+          item.hasFinish = true
+          item.code = res.code
+          item.msg = res.code === 1 ? '已处理' : (res?.msg ? res.msg : '处理失败')
+        })
+        if (this.selectedItems.filter(item => item.hasFinish).length >= this.selectedItems.length) this.loading = false
+      })
+      this.selectedItems.map(item => {
+        return {
+          type:'event_check',
+          action:'agree',
+          event_id:item.event_id,
+          point:item.point,
+          comment:this.batchComment || ''
+        }
+      }).forEach(data => {
+        this.wsClient.send(data)
+      })
+    },
+    disagreeBatch(){
+      this.loading = true
+      this.batchResult = []
+      this.wsClient.setBusinessFun(res => {
+        if (res.type !== 'ping') this.batchResult.push(res)
+        if (res.type !== 'event_check') return
+        this.selectedItems.filter(item => item.event_id === res?.result?.source_msg?.event_id).forEach(item => {
+          item.hasFinish = true
+          item.code = res.code
+          item.msg = res.code === 1 ? '已处理' : (res?.msg ? res.msg : '处理失败')
+        })
+        if (this.selectedItems.filter(item => item.hasFinish).length >= this.selectedItems.length) this.loading = false
+      })
+      this.selectedItems.map(item => {
+        return {
+          type:'event_check',
+          action:'disagree',
+          event_id:item.event_id,
+          comment:this.batchComment || ''
+        }
+      }).forEach(data => {
+        this.wsClient.send(data)
+      })
+    },
+    copyResult(origin){
+      switch (origin){
+        case 'normal':
+          let result = this.batchResult.filter(res => res.type === 'event_check').map(res => {
+            return {
+              type:res?.result?.source_msg?.type === 'event_check' ? '复核' : res.type,
+              action: res?.result?.source_msg?.action === 'agree' ? '同意' : (res?.result?.source_msg?.action === 'disagree' ? '驳回' : '未知'),
+              msg: res?.msg,
+              code: res?.code,
+              origin: {
+                action:res?.result?.source_msg?.action,
+                comment:res?.result?.source_msg?.comment,
+                no:res?.result?.source_msg?.event_id,
+                p:res?.result?.source_msg?.point,
+                t:res?.result?.source_msg?.type,
+              }
+            }
+          })
+          navigator.clipboard.writeText(JSON.stringify(result)).then(() => {
+            this.$message.success("已复制")
+          },(reason) => {
+            console.error('integral review clipboard',reason)
+            this.$message.info("没有任何结果")
+          })
+          break;
+        case 'origin':
+          navigator.clipboard.writeText(JSON.stringify(this.batchResult)).then(() => {
+            this.$message.success("已复制")
+          },(reason) => {
+            console.error('integral review clipboard',reason)
+            this.$message.info("没有任何结果")
+          })
+          break;
+      }
+    },
+    batchResultMark(item){
+      return !!item.msg ? item.msg : '待处理'
+    },
+
+  },
+  watch:{
+    'formData.time_scope'(v){
+      if (v){
+        this.formData.start_day = v[0]
+        this.formData.end_day = v[1]
+      }else {
+        this.formData.start_day = ''
+        this.formData.end_day = ''
+      }
+      this.formData.page = 1
+      this.getIntegralList()
+    },
+    'formData.employee_ids'(v){
+      this.formData.page = 1
+      this.getIntegralList()
+    },
+    'formData.pt_id'(v){
+      this.formData.page = 1
+      this.getIntegralList()
+    },
+    'formData.source_type'(v){
+      this.formData.page = 1
+      this.getIntegralList()
+    },
+    'formData.rule_id'(v){
+      this.formData.page = 1
+      this.getIntegralList()
+    },
+    'formData.dc_status'(v){
+      this.formData.page = 1
+      if (v !== 0) this.selectedItems = []
+      this.getIntegralList()
+    },
+    'formData.dept_ids'(v){
+      this.formData.page = 1
+      this.getIntegralList()
+    },
+    'formData.keyword' : {
+      deep: true,
+      handler: _debounce(function (v){
+        this.formData.page = 1
+        this.getIntegralList()
+      })
+    },
+    'formData.point': {
+      deep: true,
+      handler: _debounce(function (v,o){
+        if (v === o) return
+        this.formData.page = 1
+        this.getIntegralList()
+      })
+    },
+    'formData.is_enable'(v){
+      this.formData.page = 1
+      this.getIntegralList()
+    },
+    'formData.page'(v){
+      this.getIntegralList()
+    },
+    'formData.page_size'(v){
+      this.formData.page = 1
+      this.getIntegralList()
+    },
+    dept_names(v){
+      if (v.length !== 0){
+        let dept_ids = v.map(item => item[item.length - 1])
+        let set = new Set(dept_ids)
+        this.formData.dept_ids = [...set].toString()
+      } else {
+        this.formData.dept_ids = []
+      }
+      this.formData.page = 1
+      this.getIntegralList()
+    }
+  },
+  computed:{
+    websocketAuth(){
+      return this.wsClient.getAuthStatus()
+    },
+    canSubmitBatch(){
+      return !this.loading && this.websocketAuth && this.selectedItems && this.selectedItems.length > 0
+    },
+    batchProgress(){
+      return this.selectedItems && this.selectedItems.length > 0 ? (this.selectedItems.filter(item => item.hasFinish).length / this.selectedItems.length) * 100 : 0
+    },
+    canClipboard(){
+      return !!navigator?.clipboard && this.batchResult && this.batchResult.length > 0
+    }
+  },
+  mounted(){
+    this.getEmployee();
+    this.getDepartment();
+    this.getRuleTrees();
+    this.getIntegralList();
+    let siteConfig = this.$getCache('siteConfig');
+    this.event_review_point = siteConfig.event_review_point;
+
+    //初始化长连接
+    this.wsClient.initWebSocket()
+
+
+
+
+
+
+
+  },
+  beforeDestroy() {
+    if (this.wsClient) this.wsClient.close()
+  },
+  destroyed() {
+  }
+
+
+}
+</script>
+
+<style scoped lang="scss">
+
+.el-table tr{
+  cursor: pointer !important;
+}
+
+
+</style>