Bläddra i källkod

Merge branch 'dev'

guojy 1 år sedan
förälder
incheckning
04d4e2ef52
47 ändrade filer med 2329 tillägg och 1191 borttagningar
  1. 13 0
      package-lock.json
  2. 1 0
      package.json
  3. 12 6
      src/api/websocketTow.js
  4. 89 94
      src/assets/css/iconfont.css
  5. 0 0
      src/assets/css/iconfont.js
  6. 7 0
      src/assets/css/iconfont.json
  7. BIN
      src/assets/css/iconfont.ttf
  8. BIN
      src/assets/css/iconfont.woff
  9. BIN
      src/assets/css/iconfont.woff2
  10. 3 0
      src/assets/css/reset.css
  11. 29 32
      src/components/EmployeeSelector.vue
  12. 205 0
      src/components/Rule.vue
  13. 1 0
      src/components/Suggest.vue
  14. 3 6
      src/components/applicationIntegrationPopup.vue
  15. 38 17
      src/components/publics/workpoints.vue
  16. 31 33
      src/home.vue
  17. 45 12
      src/index.vue
  18. 4 5
      src/router/index.js
  19. 7 5
      src/screen.vue
  20. 6 5
      src/screenSan.vue
  21. 1 4
      src/views/award/myGrantAward.vue
  22. 9 13
      src/views/award/print.vue
  23. 20 6
      src/views/common/repeatTaskDetailsPopup.vue
  24. 147 63
      src/views/common/rewardTask.vue
  25. 133 76
      src/views/common/rewardTaskAmend.vue
  26. 102 22
      src/views/common/rewardTaskDetailsPopup.vue
  27. 113 8
      src/views/common/taskDetailsPopup.vue
  28. 12 6
      src/views/common/temporaryTask.vue
  29. 16 9
      src/views/common/temporaryTaskAmend.vue
  30. 4 6
      src/views/ranking/attendance_rating.vue
  31. 10 12
      src/views/ranking/dept_rank.vue
  32. 3 3
      src/views/ranking/each_rank.vue
  33. 17 3
      src/views/ranking/log_rank.vue
  34. 2 3
      src/views/ranking/manager_statistics.vue
  35. 17 3
      src/views/ranking/task_rank.vue
  36. 5 0
      src/views/ranking/total_rank.vue
  37. 68 49
      src/views/set/check.vue
  38. 83 23
      src/views/set/framework.vue
  39. 443 247
      src/views/set/rule.vue
  40. 103 0
      src/views/set/rule2.vue
  41. 21 5
      src/views/set/screenSet.vue
  42. 149 68
      src/views/set/systemLayout.vue
  43. 230 241
      src/views/task/get_task.vue
  44. 58 61
      src/views/task/my_issue.vue
  45. 2 5
      src/views/welfare/conversion.vue
  46. 2 11
      src/views/welfare/operatingRecord.vue
  47. 65 29
      src/views/workbench/review.vue

+ 13 - 0
package-lock.json

@@ -12995,6 +12995,11 @@
         "sort-keys": "^1.0.0"
       }
     },
+    "sortablejs": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz",
+      "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A=="
+    },
     "source-list-map": {
       "version": "2.0.1",
       "resolved": "https://registry.npm.taobao.org/source-list-map/download/source-list-map-2.0.1.tgz",
@@ -14859,6 +14864,14 @@
       "resolved": "https://registry.npmjs.org/vue-virtual-scroll-list/-/vue-virtual-scroll-list-2.3.2.tgz",
       "integrity": "sha512-afm5bYgjJRK160KXlvs03dsPixEL/gS8sV5DKxEDRjPQKMXjIBmTMN/hMTEyazsPl+G4tXQs/msYK7p7tNVogQ=="
     },
+    "vuedraggable": {
+      "version": "2.24.3",
+      "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.3.tgz",
+      "integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==",
+      "requires": {
+        "sortablejs": "1.10.2"
+      }
+    },
     "vuex": {
       "version": "3.6.2",
       "resolved": "https://registry.npm.taobao.org/vuex/download/vuex-3.6.2.tgz",

+ 1 - 0
package.json

@@ -32,6 +32,7 @@
     "vue-router": "^3.2.0",
     "vue-seamless-scroll": "^1.1.23",
     "vue-virtual-scroll-list": "^2.3.2",
+    "vuedraggable": "^2.24.3",
     "vuex": "^3.4.0",
     "vuex-persistedstate": "^4.0.0"
   },

+ 12 - 6
src/api/websocketTow.js

@@ -57,25 +57,30 @@ let closewebsocket = () => {
 	}
 }
 
-let initWebSocket = () => {
+let initWebSocket = (fun) => {
 	//初始化 websocket
 	ws = new WebSocket(wsurl)
 	ws.onmessage = websocketonmessage
 	ws.onopen = websocketonopen
 	ws.onerror = websocketonerror
 	ws.onclose = websocketclose
+	fun()
 }
 
 
 let sendData = (data, callback) => {
 	weboscket_callback = callback
 	//  判断 data 数据类型
+	if(!data){
+		return false
+	}
 	if (typeof data == 'string') {
 		data = data
 	} else {
 		data = JSON.stringify(data)
 	}
-	if(ws){//  判断 websocket 的状态
+	if(ws){
+		//  判断 websocket 的状态
 		if (ws.readyState === ws.OPEN) {// 已经打开,可以直接发送
 			ws.send(data)
 		} else if (ws.readyState === ws.CONNECTING) {// 正在开启状态中,则 1 秒后重新发送
@@ -85,10 +90,11 @@ let sendData = (data, callback) => {
 		}
 	}else {
 		// 未打开,则开启后重新调用
-		initWebSocket()
-		let wsData = {type: 'auth',token: getToken(),machine:generateUUID()};
-		sendData(wsData, callback)
-		sendData(data, callback)
+		initWebSocket(()=>{
+			let wsData = {type: 'auth',token: getToken(),machine:generateUUID()};
+			sendData(wsData, callback)
+			sendData(data, callback)
+		})
 	}
 }
 

+ 89 - 94
src/assets/css/iconfont.css

@@ -1,94 +1,89 @@
-@font-face {
-  font-family: "iconfont"; /* Project id 2916418 */
-  src: url('iconfont.woff2?t=1682412478314') format('woff2'),
-       url('iconfont.woff?t=1682412478314') format('woff'),
-       url('iconfont.ttf?t=1682412478314') format('truetype');
-}
-
-.iconfont {
-	font-family: "iconfont" !important;
-	font-size: 26px;
-	font-style: normal;
-	-webkit-font-smoothing: antialiased;
-	-moz-osx-font-smoothing: grayscale;
-}
-.titleIcon{
-	color: #303133 !important;
-}
-
-.icon-piao:before {
-  content: "\e647";
-}
-
-.icon-shouye1:before {
-  content: "\e6cb";
-}
-
-.icon-tianshenpi:before {
-  content: "\eb67";
-}
-
-.icon-gongdanqueren:before {
-  content: "\ec36";
-}
-
-.icon-yonghujihuo:before {
-  content: "\e72f";
-}
-
-.icon-RectangleCopy:before {
-  content: "\e730";
-}
-
-.icon-star-half:before {
-  content: "\e9a1";
-}
-
-.icon-a-chaosongrenchaosongyonghu-01:before {
-  content: "\e731";
-}
-
-.icon-shezhi_jichushezhi:before {
-  content: "\e70c";
-}
-
-.icon-shezhi_jiaose:before {
-  content: "\e70f";
-}
-
-.icon-shezhi_zidongjifen:before {
-  content: "\e710";
-}
-
-.icon-shezhi_zuzhijiagou:before {
-  content: "\e711";
-}
-
-.icon-fulizhongxin:before {
-  content: "\e652";
-}
-
-.icon-kaoqin_kaoqinyuebaobiao:before {
-  content: "\e708";
-}
-
-.icon-shezhi_jifenguize:before {
-  content: "\e70d";
-}
-
-.icon-PC_gongzuotai_ABfen:before {
-  content: "\e71d";
-}
-
-.icon-dingdingPC_shezhi1:before {
-  content: "\e725";
-}
-
-.icon-dingdingPC_tongji1:before {
-  content: "\e726";
-}
-
-.icon-shouye:before {
-  content: "\e639";
-}
-
+@font-face {
+  font-family: "iconfont"; /* Project id 2916418 */
+  src: url('iconfont.woff2?t=1682412478314') format('woff2'),
+       url('iconfont.woff?t=1682412478314') format('woff'),
+       url('iconfont.ttf?t=1682412478314') format('truetype');
+}
+
+.iconfont {
	font-family: "iconfont" !important;
	font-size: 26px;
	font-style: normal;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}
.titleIcon{
	color: #303133 !important;
}
+
+.icon-jiedianyanshou-1:before {
+  content: "\e791";
+}
+
+.icon-piao:before {
+  content: "\e647";
+}
+
+.icon-shouye1:before {
+  content: "\e6cb";
+}
+
+.icon-tianshenpi:before {
+  content: "\eb67";
+}
+
+.icon-gongdanqueren:before {
+  content: "\ec36";
+}
+
+.icon-yonghujihuo:before {
+  content: "\e72f";
+}
+
+.icon-RectangleCopy:before {
+  content: "\e730";
+}
+
+.icon-star-half:before {
+  content: "\e9a1";
+}
+
+.icon-a-chaosongrenchaosongyonghu-01:before {
+  content: "\e731";
+}
+
+.icon-shezhi_jichushezhi:before {
+  content: "\e70c";
+}
+
+.icon-shezhi_jiaose:before {
+  content: "\e70f";
+}
+
+.icon-shezhi_zidongjifen:before {
+  content: "\e710";
+}
+
+.icon-shezhi_zuzhijiagou:before {
+  content: "\e711";
+}
+
+.icon-fulizhongxin:before {
+  content: "\e652";
+}
+
+.icon-kaoqin_kaoqinyuebaobiao:before {
+  content: "\e708";
+}
+
+.icon-shezhi_jifenguize:before {
+  content: "\e70d";
+}
+
+.icon-PC_gongzuotai_ABfen:before {
+  content: "\e71d";
+}
+
+.icon-dingdingPC_shezhi1:before {
+  content: "\e725";
+}
+
+.icon-dingdingPC_tongji1:before {
+  content: "\e726";
+}
+
+.icon-shouye:before {
+  content: "\e639";
+}
+

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
src/assets/css/iconfont.js


+ 7 - 0
src/assets/css/iconfont.json

@@ -5,6 +5,13 @@
   "css_prefix_text": "icon-",
   "description": "",
   "glyphs": [
+    {
+      "icon_id": "20810710",
+      "name": "节点验收-1",
+      "font_class": "jiedianyanshou-1",
+      "unicode": "e791",
+      "unicode_decimal": 59281
+    },
     {
       "icon_id": "4251745",
       "name": "票",

BIN
src/assets/css/iconfont.ttf


BIN
src/assets/css/iconfont.woff


BIN
src/assets/css/iconfont.woff2


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

@@ -26,6 +26,9 @@ label {
     font-weight: 600;
 }
 
+.el-icon-circle-close{
+  color: #fff;
+}
 .icon {
   width: 1em;
   height: 1em;

+ 29 - 32
src/components/EmployeeSelector.vue

@@ -27,11 +27,8 @@
 									<div class="employee_cell flex-box flex-v-ce" v-show="can_select_employee" @click.prevent.stop="select_employee(item)">
 										<div class="employee_checkbox"><el-checkbox v-model="item.checked"></el-checkbox></div>
 										<img :src="item.img_url" width="30" height="30" class="imgUrl" v-if="item.img_url">
-										<div class="imgUrl" v-else style="background: #238DFA;color: #fff;">
-											{{item.name}}
-										<!-- {{item.name.substring(item.name.length-2)}} -->
-										</div>
-										<div class="employee_name">{{ item.name }}</div>
+										<div class="imgUrl" v-else style="background: #238DFA;color: #fff;">{{item.name}}</div>
+										<div class="employee_name font-flex-word">{{ item.name }}</div>
 									</div>
 								</div>
 							</div>
@@ -42,7 +39,7 @@
 				<el-col :xs="2" :sm="2" :md="2" :lg="2" :xl="2" class="col-line"><span style="opacity: 0;">空</span></el-col>
 				<el-col :xs="11" :sm="11" :md="11" :lg="11" :xl="11" class="scroller-box">
 					<div class="option-box flex-box flex-v-ce">
-						<div class="fontColorC flex-1" v-show="multi">已选择{{ employee_selected_list.length }}个员</div>
+						<div class="fontColorC flex-1" v-show="multi">已选择{{ employee_selected_list.length }}个员</div>
 						<el-button type="type" @click="clear_data()">清空</el-button>
 					</div>
 					<el-scrollbar wrap-class="column-wrapper scrollable-items-container" :native="false" style="height: 390px;">
@@ -120,7 +117,7 @@ export default {
 			default: 0
 		},
 		user_no_select: {
-			//是否能选择系统管理员
+			//是否能选择创始人
 			type: Boolean,
 			default: true
 		},
@@ -139,11 +136,16 @@ export default {
 			type: Boolean,
 			default: false
 		},
-		use_Administrator_list: {
+		user_Administrator_list: {
 			//未指定员工并请求人员接口时,保留管理员,过滤员工
 			type: Boolean,
 			default: false
 		},
+		user_Administrator_list_tow: {
+			//未指定员工并请求人员接口时,保留管理员,过滤员工 与部门管理员
+			type: Boolean,
+			default: false
+		},
 		createDimness: {
 			//组织架构设置上级专用-不清除系统管理员
 			type: Boolean,
@@ -229,24 +231,6 @@ export default {
 				    }
 				  }
 				});
-				// for (let i in this.list) {
-				// 	this.$set(this.list[i], 'checked', true);
-				// }
-				// this.$nextTick(() => {
-				// 	let employeeSelectedList = JSON.parse(JSON.stringify(this.employee_selected_list));
-				// 	let employeeSelectedIds = [],total = 0;
-				// 	employeeSelectedList.forEach(element => {
-				// 		employeeSelectedIds.push(element.id);
-				// 	});
-				// 	for (const i in this.list) {
-				// 		if (employeeSelectedIds.includes(this.list[i].id)) {
-				// 			total += 1;
-				// 		} else {
-				// 			this.employee_selected_list.push(this.list[i]);
-				// 		}
-				// 	}
-				// 	this.list.length == total ? (this.indeterminate = true) : (this.indeterminate = false);
-				// });
 			} else {
 				this.clear_data();
 			}
@@ -423,10 +407,16 @@ export default {
 			this.list = [];
 			this.$axios('get', '/api/employee/index', { dept_id: this.pid, keywords: this.keyword, page: 0, page_size: 3000,is_official:1 }).then(res => {
 					var employee = res.data.data.list || [];
-					if (this.use_Administrator_list) {
+					if (this.user_Administrator_list) {
 						//使用管理员列表
 						employee = this.useAdministratorList(employee);
 					}
+					if (this.user_Administrator_list_tow) {
+						//使用管理员列表
+						employee = this.useAdministratorList2(employee);
+					}
+
+					
 					var userAll = [];
 					employee.forEach((item, i) => {
 						if (!this.not_user && item.is_creator == 1) {
@@ -463,11 +453,17 @@ export default {
 			//过滤掉普通员工,返回管理员
 			let arr = [];
 			list.forEach((item, i) => {
-				if (
-					item.employee_detail.role_list.findIndex(
-						value => value.name == 'dept_manager' || value.name == 'creator' || value.name == 'point_manager' || value.name == 'admin'
-					) >= 0
-				) {
+				if (item.employee_detail.role_list.findIndex(value => value.name == 'dept_manager' || value.name == 'creator' || value.name == 'point_manager' || value.name == 'admin') >= 0) {
+					arr.push(item);
+				}
+			});
+			return arr;
+		},
+		useAdministratorList2(list) {
+			//过滤掉普通员工,返回管理员
+			let arr = [];
+			list.forEach((item, i) => {
+				if (item.employee_detail.role_list.findIndex(value => value.name == 'creator' || value.name == 'point_manager' || value.name == 'admin') >= 0) {
 					arr.push(item);
 				}
 			});
@@ -532,6 +528,7 @@ export default {
 
 .employee_selector_box .choose_left .employee_name {
 	padding-left: 8px;
+	max-width: 150px;
 }
 
 /* .employee_selector_box ::v-deep .el-scrollbar__thumb {

+ 205 - 0
src/components/Rule.vue

@@ -0,0 +1,205 @@
+<template>
+	<div class="el-tree">
+		<transition-group  name="drag" tag="div">
+			<div v-for="(item,index) in data" :key="item.id" class="el-tree-node" draggable @dragend.stop="dragend($event,item,index)" @dragstart.stop="dragstart($event,item,index)"  @dragenter.stop="dragenter($event,item,index)"  @dragover.stop="dragover($event,item,index)"  @drop.stop="drop($event,item,index)">
+				<div class="el-tree-node__content" 
+				:class="{'border_bottom': (border_bottom==item.id&&directionIndex==1),'border_top': (border_bottom==item.id&&directionIndex==2)}"
+				:style="{paddingLeft:(18*sum)+'px'}" 
+				@click.stop="ruleActive(item)"
+				>
+					<span 
+						@click.stop="ruleActive(item,true)" 
+						class="el-tree-node__expand-icon el-icon-caret-right" 
+						:style="{transform:item.isShowChild? 'rotate(90deg)':'rotate(0)'}"
+						v-if="item.child&&item.child.length>0">
+					</span>
+					<span class="el-tree-node__expand-icon el-icon-caret-right"	style="color: transparent!important;" v-else></span>
+					
+					<span class="el-tree-node__label" :class="selectId==item.id? 'blue':''">{{item.name}}</span>
+				</div>
+				
+				<div v-show="!isTd" class="el-tree-node__children" :style="{maxHeight:item.isShowChild? '2000px':'0px'}">
+					<Rule :data="item.child" :paddingl="true" :sum="summ" :selectId="selectId" @ruleActive="ruleActive" @ruleDrag="ruleDrag"></Rule>
+				</div>
+			</div>
+		</transition-group>	
+	</div>
+</template>
+
+<script>
+	import { _debounce } from '@/api/auth';
+	export default {
+		name: 'Rule',
+		props: {
+			data: {
+				type: Array,
+				default: () => {
+					return [];
+				},
+			},
+			paddingl:{
+				type: Boolean,
+				default:true
+			},
+			selectId:{
+				type: Number,
+				default:0
+			},
+			sum:{
+				type: Number,
+				default:1
+			}
+		},
+		data() {
+			return {
+				isShowChild:false,
+				dragIndex:0,
+				isTd:false,//是否移动位置
+				summ:0,
+				border_bottom:0,
+				directionIndex:0,
+			};
+		},
+		methods: {
+			
+			// 拖拽前记录下标
+			dragstart(e,item,index) {
+			  e.stopPropagation()
+			  this.dragIndex = index;
+			  this.isTd=true;
+			  setTimeout(() => {
+			  	e.target.classList.add('moveing')
+			  }, 0)
+			},
+			
+			//进入目标元素触发,相当于mouseover
+			dragenter(e,item,index) {
+			  let moving = this.data[this.dragIndex]; //获取之前记录的元素
+			  if(item.pid==moving.pid&&this.isTd&&this.dragIndex != index){
+				if(index>this.dragIndex){
+				   this.directionIndex=1;
+				}else{
+				   this.directionIndex=2;
+				}
+				this.border_bottom=item.id
+			  }else{
+				this.border_bottom=0;
+			  }
+			},
+			
+			//进入目标、离开目标之间,连续触发
+			dragover(e,item,index) {
+			  e.preventDefault();
+			  e.dataTransfer.dropEffect = 'move'
+			},
+			
+			// 鼠标松开 防抖触发排序
+			drop(e,item,index) {
+				this.border_bottom=0;
+				if (this.dragIndex != index) {
+				  let moving = this.data[this.dragIndex]; //获取之前记录的元素
+				  if(item.pid==moving.pid&&this.isTd){
+					  this.isTd=false;
+					  this.data.splice(this.dragIndex, 1); //删除列表的记录元素
+					  this.data.splice(index,0,moving);//插入元素
+					  this.dragIndex = index;
+					  
+					  // oneId前一个ID twoId后一个ID
+					  let oneId=this.data[index-1]? this.data[index-1].id:0;
+					  let twoId=this.data[index+1]? this.data[index+1].id:0;
+					  let data={
+						  id:this.data[index].id,
+						  prev_id:oneId,
+						  sibling_id:twoId,
+					  }
+					  this.ruleDrag(data);
+				  }else{
+					  this.$message.error('不能跨分类排序');
+				  }
+				}
+			},
+			
+			//用户完成拖动后触发
+			dragend(e,item,index){
+				e.target.classList.remove('moveing')
+				this.border_bottom=0;
+				this.isTd=false;
+			},
+
+			ruleDrag(data){
+				this.$emit('ruleDrag',data);
+			},
+			
+			ruleActive(item,is){
+				if(item.child&&item.child.length>0){
+					item.isShowChild=!item.isShowChild
+				}
+				if(is){
+					return false
+				}
+				this.$emit('ruleActive',JSON.parse(JSON.stringify(item)));
+			},
+		},
+		created() {
+			this.summ=this.sum+1;
+		},
+	};
+</script>
+
+<style scoped="scoped">
+	.moveing {
+		opacity: 0.5;
+	}
+	.drag-move {
+		transition: transform .3s;
+	}	
+	.border_top{
+		border-top: 1px solid #017FFF !important;
+	}
+	.border_bottom{
+		border-bottom: 1px solid #017FFF !important;
+	}	
+	.el-tree {
+		position: relative;
+		cursor: default;
+		background: #FFF;
+		color: #606266;
+	}
+
+	.rule_class_box {
+		white-space: nowrap;
+		border-bottom: 1px #f8f8f8 solid;
+	}
+
+	.el-tree-node__content {
+		padding: 10px 0;
+		display: flex;
+		align-items: center;
+		height: 26px;
+		cursor: pointer;
+		border-bottom: 1px #f8f8f8 solid;
+	}
+
+	.el-tree-node__expand-icon {
+		padding: 6px;
+		cursor: pointer;
+		color: #C0C4CC;
+		font-size: 12px;
+		transform: rotate(0);
+		transition: transform .3s;
+	}
+
+	.el-tree-node__label {
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+	}
+	.el-tree-node__children{
+		transition: max-height .5s;
+		max-height: 0px;
+		overflow: hidden;
+	}
+	.paddingl{
+		padding-left: 18px !important;
+	}
+</style>

+ 1 - 0
src/components/Suggest.vue

@@ -131,6 +131,7 @@ export default {
 	},
 	methods: {
 		onChange(editor) {
+			console.log(editor)
 			this.params.content = editor.children;
 			this.params.html = editor.getHtml();
 		},

+ 3 - 6
src/components/applicationIntegrationPopup.vue

@@ -212,9 +212,7 @@
 							<span v-else>--</span>
 						</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 }} 
-							<span>{{ item.pt_id==3? 'B分':'A分' }}</span>
-						</div> -->
+
 						<div class="flex-1" style="border-right: 1px solid #f1f1f1;">{{ item.reviewer_name }}</div>
 					</div>
 				</div>
@@ -336,10 +334,10 @@ export default {
 	components: { EmployeeSelector, upload },
 	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: '' };
-		this.LocalValObj = res;
+		this.LocalValObj = reviewerObj ? reviewerObj : { id: '', name: '' };
 		this.getRuleItemData();
 		// 初始化审批人
 		if (this.LocalValObj.id) {
@@ -559,7 +557,6 @@ export default {
 			item.employeeName = '';
 			item.employee_selected = { dept: [], employee: [] };
 			item.employee_id = '';
-
 			if (data.employee !== null && data.employee.length != 0) {
 				item.employeeName = data.employee[0].name;
 				item.employee_selected.employee = [{ name: data.employee[0].name, id: data.employee[0].id, img_url: data.employee[0].img_url }];

+ 38 - 17
src/components/publics/workpoints.vue

@@ -17,7 +17,7 @@
 		  </el-form-item>
 		  <div v-else-if="v.type=='object'" style="padding: 20px 0px;margin-left: 160px;">
 			<div style="margin-bottom: 10px;">全勤加分需同时满足以下条件</div>
-			<div style="padding-left: 23px;">1、当月无旷工</div>
+			<div style="padding-left: 23px;">1、当月无旷工缺席</div>
 			<div style="margin: 15px 0;">
 				<div><el-checkbox v-model="v.absent_holiday.enable" :true-label="1" :false-label="0">2、当月未提交以下请假
 					<el-tooltip placement="top" content="填写的请假名称必须与钉钉考勤打卡-假期管理-假期规则对应,否则此项不生效">
@@ -30,16 +30,23 @@
 					<el-input :disabled="v.absent_holiday.enable==1?false:true" style="width: 150px;" type="text" :key="3" v-model="val3" placeholder="假期类型"></el-input>
 				</div>
 			</div>
-			<div>
-				<div><el-checkbox v-model="v.absent_late.enable" :true-label="1" :false-label="0">
-				3、当月迟到少于 
-				<el-input @input="[v.absent_late.count=v.absent_late.count.replace(/[^\d]/g,'')]" :disabled="v.absent_late.enable==1?false:true" style="width: 150px;" v-model="v.absent_late.count" placeholder="次数"></el-input>
-				 次</el-checkbox></div>
-<!-- 				<div class="flex-box">
-					<el-input style="width: 150px;" placeholder="假期类型"></el-input>
-					<el-input style="width: 150px;margin: 0 10px;" placeholder="假期类型"></el-input>
-					<el-input style="width: 150px;" placeholder="假期类型"></el-input>
-				</div> -->
+			<div class="flex-box">
+				<el-checkbox style="position: relative;top: 12px;" v-model="v.absent_late.enable" :true-label="1" :false-label="0"></el-checkbox>
+				<div style="padding-left: 10px;">
+					<div class="flex-box-ce" style="padding-top: 10px;">
+						3、当月迟到次数(填0或不填时,代表该条件不生效)
+					</div>
+					<div class="flex-box-ce" style="margin-top: 10px;">当月迟到少于 <el-input class="width-150" @input="v.absent_late.count = v.absent_late.count.replace(/[^\d]/g, '')" :disabled="v.absent_late.enable==1?false:true"  v-model="v.absent_late.count" placeholder="0或者空为不限制"></el-input> 次
+						<el-tooltip placement="top">
+						  <div slot="content">
+							  <span>此项不包含严重、旷工迟到次数</span>
+						  </div>
+						  <span class="initia_mark" style="background-color: #666;">?</span>
+						</el-tooltip>
+					</div>
+					<div class="flex-box-ce" style="margin: 10px 0;">当月严重迟到少于 <el-input class="width-150" @input="v.absent_late.serious_late_count = v.absent_late.serious_late_count.replace(/[^\d]/g, '');v.absent_late.serious_late_count < 0 || v.absent_late.serious_late_count>100 && (v.absent_late.serious_late_count = 100)" :disabled="v.absent_late.enable==1?false:true"  v-model="v.absent_late.serious_late_count" placeholder="0或者空为不限制"></el-input> 次</div>
+					<div class="flex-box-ce">当月旷工迟到少于 <el-input class="width-150" @input="v.absent_late.absent_late_count = v.absent_late.absent_late_count.replace(/[^\d]/g, '');v.absent_late.absent_late_count < 0 || v.absent_late.absent_late_count>100 && (v.absent_late.absent_late_count = 100)" :disabled="v.absent_late.enable==1?false:true"  v-model="v.absent_late.absent_late_count" placeholder="0或者空为不限制"></el-input> 次</div>
+				</div>	
 			</div>
 		  </div>  
           <el-form-item  style="margin: 20px 0 0 0 " v-else>
@@ -54,7 +61,15 @@
 					<span slot="reference" :style="'width:'+initia_head.initial_left">{{v.initialName}}</span>
 				</template>
             </template>
-            <el-input type="age" v-model="v.initia_input.age" :disabled="disabled"  autocomplete="off"  class="nitia_list_input"  placeholder="请输入分值" oninput="if(this.value=='00'){this.value='0';}else{this.value=this.value.replace(/[^0-9]/g,'')}"></el-input>
+            <el-input 
+				type="age" 
+				v-model="v.initia_input.age" 
+				:disabled="disabled"  
+				autocomplete="off"  
+				class="nitia_list_input"  
+				placeholder="请输入分值" 
+				oninput="if(this.value=='00'){this.value='0';}else{this.value=this.value.replace(/[^0-9]/g,'')}">
+			</el-input>
 		  </el-form-item>
         </el-form>
       </div>
@@ -63,7 +78,7 @@
         type="primary"
         class="initia_button"
         @click="save()"
-        :style="'margin: 20px 0 20px '+initia_head.initial_left"
+        style='margin: 20px 0'
       >保存</el-button>
     </div>
   </div>
@@ -86,10 +101,10 @@ export default {
 	};
   },
   created() {
-	 if(this.initia_arr.length==9){
-		 this.val1=this.initia_arr[8].absent_holiday.list[0]
-		 this.val2=this.initia_arr[8].absent_holiday.list[1]
-		 this.val3=this.initia_arr[8].absent_holiday.list[2]
+	 if(this.initia_arr.length==11){
+		 this.val1=this.initia_arr[10].absent_holiday.list[0]
+		 this.val2=this.initia_arr[10].absent_holiday.list[1]
+		 this.val3=this.initia_arr[10].absent_holiday.list[2]
 	 }
   },
   mounted() {;
@@ -117,6 +132,8 @@ export default {
 			  })
 		  }
       }
+	  // console.log(checkAllData,this.initia_arr)
+	  // return false
 	  this.$emit("initia", {arr,checkAllData});
     },
   },
@@ -160,4 +177,8 @@ export default {
   border-radius: 4px;
   background-color: rgba(255, 255, 255, 1);
 }
+.width-150{
+	width: 150px;
+	margin: 0 5px;
+}
 </style>

+ 31 - 33
src/home.vue

@@ -2,11 +2,10 @@
 	<div>
 		<!-- 过去提醒 -->
 		<div class="diy-tip2 flex-box-ce" style="min-width: 1100px;" v-if="isShowDate">
-			<div class="flex-1">
-				<div class="font-flex-word" style="max-width: 1000px;overflow:hidden">
+			<div class="flex-1 font-flex-word" style="padding-right: 20px;">
+				<!-- <div class="font-flex-word" style="max-width: 1300px;overflow:hidden"> -->
 					尊敬的【{{ corpMessage.name }}】用户!距离贵司开通的“功道云积分制”使用结束只剩下<span class="red">{{day}}</span>天,到期时间 {{ corpMessage.expire_time}} 00:00。
-					为避免使用期结束给您带来不便,请及时续费升级。
-				</div>
+				<!-- </div> -->
 			</div>
 			<span class="blue cursor" @click="isTz=true">续费/升级</span>
 			<i class="el-icon-close fontColorC cursor" style="position: relative;right: -20px;" @click="isShowDate=false"></i>
@@ -140,31 +139,15 @@
 							</div>
 							<div v-else v-for="(item, index) in rankingListDetails" :key="index" style="cursor: pointer; text-align:center;width:80px;margin:0 20px;" @click="$router.push({ path: RankingPush })">
 								<div  style="position: relative;height: 60px;">
-									<svg-icon
-										v-if="item.rank <= 3"
-										:icon-class="item.rank == 1 ? 'first' : item.rank == 2 ? 'secondPlace' : item.rank == 3 ? 'third' : ''"
-										style="z-index:1;position: absolute;left: 26px;top: -18px;font-size:28px;"
-									/>
-									<div
-										v-if="item.rank == 4 || item.rank == 5"
-										style="z-index:1;position: absolute;left: 27px;top: -14px;width:24px;height:24px;border:1px solid #C0C4CC;border-radius:50%;background-color:#fff;font-size:12px;text-align-center;line-height:24px;color:#303133;"
-									>
+									<svg-icon v-if="item.rank <= 3" :icon-class="item.rank == 1 ? 'first' : item.rank == 2 ? 'secondPlace' : item.rank == 3 ? 'third' : ''"	style="z-index:1;position: absolute;left: 26px;top: -18px;font-size:28px;"/>
+									<div v-else	style="z-index:1;position: absolute;left: 27px;top: -14px;width:24px;height:24px;border:1px solid #C0C4CC;border-radius:50%;background-color:#fff;font-size:12px;text-align-center;line-height:24px;color:#303133;">
 										<b style="">{{ item.rank }}</b>
 									</div>
-									<div
-										v-if="item.employee_id == user_info.id && index == 0 && item.rank > 3"
+									<div v-if="item.employee_id == user_info.id && index == 0 && item.rank > 3"
 										style="z-index:1;position: absolute;left: 26px;top: -14px;width:25px;height:25px;border:1px solid #C0C4CC;border-radius:50%;background-color:#fff;font-size:12px;text-align-center;line-height:24px;color:#303133;"
 									>
 										<b>{{ item.rank }}</b>
 									</div>
-									<div style="position: absolute;left: 8px;top: -16px;z-index:2;">
-										<div
-											v-if="index == 5 || index == 6"
-											style="width:60px;height:24px;border:1px solid #C0C4CC;background-color:#fff;border-radius:20px;font-size:12px;color:#303133;text-align:center;line-height:24px"
-										>
-											<b>{{ index == 5 ? '倒数第2' : index == 6 ? '倒数第1' : '' }}</b>
-										</div>
-									</div>
 									<userImage :img_url="item.employee_img_url" fontSize="1" :user_name="item.employee_name" width="60px" height="60px"></userImage>
 								</div>
 								<span
@@ -319,14 +302,16 @@
 						<div>
 							<span v-for="(item, index) in inCommonUse" :key="index" @click="$router.push({ path: item.push })" class="inCommonUseStyle">
 								<img :src="item.image" alt="" style="width:31px;height:31px;margin:11px 10% 0 8%;" />
-								<b>{{ item.name }}</b>
+								<div class="flex-box-ce flex-1">
+								  <b class="flex-1">{{ item.name }}</b><span v-if="item.num" class="el-badge__content" style="margin-right: 10px;">{{item.num}}</span>
+								</div>
 							</span>
 						</div>
 					</div>
 				</el-row>
 				<el-row>
-					<div class="right-all-style" v-loading="highestPrizeBuckleloading" style="background:#fff;padding: 20px 20px 0;">
-						<span class="title">待我审批({{ auditList.length }})</span>
+					<div v-if="creatorJurisdiction" class="right-all-style" v-loading="highestPrizeBuckleloading" style="background:#fff;padding: 20px 20px 0;">
+						<span class="title">待我审批({{ auditTotal }})</span>
 
 						<div class="nopoint_box" v-if="auditList.length == 0">
 							<div class="noimg"></div>
@@ -430,9 +415,7 @@
 									<b style="color:#303133;font-size:16px;margin:0px 0 0 5px;">{{ buckle.name }}</b>
 									<span style="color:#FF9600;font-size:16px;">{{ buckle.point }} B分</span>
 								</p>
-								<p
-									style="margin:8px 0 0 5px;font-size:13px;line-height:20px;color:#303133;overflow:hidden; text-overflow:ellipsis;display:-webkit-box; -webkit-box-orient:vertical;-webkit-line-clamp:3;"
-								>
+								<p	style="margin:8px 0 0 5px;font-size:13px;line-height:20px;color:#303133;overflow:hidden; text-overflow:ellipsis;display:-webkit-box; -webkit-box-orient:vertical;-webkit-line-clamp:3;">
 									{{ buckle.remark ? buckle.remark.customize : '' }}
 								</p>
 							</div>
@@ -628,13 +611,15 @@ export default {
 			buckle: {}, //扣分
 
 			inCommonUse: [
+				{ name: '审批', image:require('./assets/image/att_review.png'), push: '/approval_list',num:0,isShow:false},
 				{ name: '奖扣积分', image: require('./assets/image/entry_list.png'), push: '/award_punish' },
-				{ name: '发布任务', image: require('./assets/image/my_publish.png'), push: '/my_issue' },
 				{ name: '申请积分', image: require('./assets/image/a_apply.png'), push: '/apply_list' },
-				{ name: '领任务', image: require('./assets/image/task_hall.png'), push: '/get_task' }
+				{ name: '发布任务', image: require('./assets/image/my_publish.png'), push: '/my_issue' },
+				{ name: '抢任务', image: require('./assets/image/task_hall.png'), push: '/get_task' }
 			],
 			// 待我审批模块
 			auditList: [],
+			audiTotal:0,
 			detail_id: 0,
 			detailShow: false,
 			thisweek:'',
@@ -651,6 +636,7 @@ export default {
 			],
 			day:0,
 			dateIndex:0,
+			auditTotal:0,
 		};
 	},
 	watch: {
@@ -680,7 +666,7 @@ export default {
 			this.inCommonUse = [];
 			this.inCommonUse.push(
 				{ name: '申请积分', image: require('./assets/image/a_apply.png'), push: '/apply_list' },
-				{ name: '任务', image: require('./assets/image/task_hall.png'), push: '/get_task' }
+				{ name: '任务', image: require('./assets/image/task_hall.png'), push: '/get_task' }
 			);
 		}
 		this.function_All();
@@ -879,17 +865,29 @@ export default {
 				type: 'waiting',
 				page: 1,
 				pt_id: 0,
-				page_size: '3'
+				page_size: 3
 			};
 			this.$axios('get', '/api/integral/review/list', params)
 				.then(res => {
 					if (res.data.code == 1) {
 						this.auditList = res.data.data.list;
+						this.auditTotal=res.data.data.total;
+						this.inCommonUse.forEach((e)=>{
+							if(e.name=='审批'){
+								e.num=res.data.data.total;
+							}
+						})
 					}
 				})
 				.finally(() => {});
 		},
 		noticeList() {
+			let accedence_time=this.$moment(this.$getUserData().accedence_time).format('YYYY-MM-DD');
+			let date = this.$moment().format('YYYY-MM-DD');
+			if (accedence_time==date) {
+			  return
+			}
+			
 			//系统公告
 			this.announLoad = true;
 			let params = {

+ 45 - 12
src/index.vue

@@ -24,18 +24,18 @@
 						</div>
 					</div>
 					<div class="flex-box flex-v-ce">
-						  <el-popover placement="bottom" width="240" trigger="hover">
+						  <el-popover placement="bottom" width="240" trigger="hover" v-if="$supremeAuthority()!='dept_manager'&&$supremeAuthority()!='employee'">
 							 <div class="popoverText">
-								 <div class="flex-box-ce"><span>当前使用版本:</span><i>{{ corpMessage.package_name|| '测试环境版本' }}</i></div>
+								 <div class="flex-box-ce"><span>当前使用版本:</span><i>{{ corpMessage.package_name|| '试用规格' }}</i></div>
 								 <div class="flex-box-ce"><span>到期时间:</span><i class="orange">{{ corpMessage.expire_time}}</i></div>
-								 <div class="flex-box-ce"><span>企业使用人数:</span><i class="blue">{{ corpMessage.user_count_max }}人</i></div>
+								 <div class="flex-box-ce"><span>企业使用人数:</span><i class="blue">{{ corpMessage.user_count }}</i>/{{ corpMessage.user_count_max }}人</div>
 								 <div class="flex-box-end">
 									<el-button size="small" @click="isTz = true" class="upgrade" type="primary" icon="el-icon-upload">续费升级</el-button>
 								 </div>
 							 </div> 
 							<div slot="reference" class="flex-box-ce megData" style="cursor: pointer;margin: 0 10px;">
-								<div>{{ corpMessage.package_name|| '测试环境版本' }}</div>
-								<div>{{ corpMessage.user_count_max }}人</div>
+								<div>{{ corpMessage.package_name|| '试用规格' }}</div>
+								<!-- <div>{{ corpMessage.user_count }}人</div> -->
 							</div>
 						  </el-popover>
 						 <el-popover
@@ -61,7 +61,7 @@
 				<el-menu :default-active="defaultActive" class="el-menu-vertical-demo" :router="true" @select="activeRouter" :unique-opened="true">
 					<template v-for="(item, index) in routers">
 						<div v-if="item.children.length != 0" :key="index">
-							<template v-if="item.children.length >= 1 && item.title != '首页'">
+							<template v-if="item.children.length >= 1 && item.title != '首页' && item.title != '复核'">
 								<template v-if="item.title=='福利'">
 									<el-submenu :index="index.toString()" :key="index" v-if="returnConfig">
 										<template slot="title">
@@ -87,10 +87,18 @@
 									</template>
 								</el-submenu>
 							</template>
-							<el-menu-item :index="returnIndex(index, index)" :route="item.children[0].path" :ref="item.children[0].path" v-else>
-								<span class="iconfont titleIcon" :class="item.icon" style="font-size: 20px;"></span>
-								<span slot="title" style="margin-left: 5px;">{{ item.children[0].title }}</span>
-							</el-menu-item>
+							<template v-else>
+								<template  v-if="item.title=='复核'">
+									<el-menu-item v-if="isShowReview" :index="returnIndex(index, index)" :route="item.children[0].path" :ref="item.children[0].path">
+										<span class="iconfont titleIcon" :class="item.icon" style="font-size: 20px;"></span>
+										<span slot="title" style="margin-left: 5px;">{{ item.children[0].title }}</span>
+									</el-menu-item>
+								</template>
+								<el-menu-item v-else :index="returnIndex(index, index)" :route="item.children[0].path" :ref="item.children[0].path">
+									<span class="iconfont titleIcon" :class="item.icon" style="font-size: 20px;"></span>
+									<span slot="title" style="margin-left: 5px;">{{ item.children[0].title }}</span>
+								</el-menu-item>
+							</template>
 						</div>
 					</template>
 				</el-menu>
@@ -309,6 +317,29 @@ export default {
 		}
 	},
 	computed:{
+		isShowReview(){
+			if(this.$getIsCreator('creator')){
+				return true
+			}
+			let is=false;
+			let supremeAuthority=this.$supremeAuthority();
+			if(this.$store.getters.config.event_special){
+				if(this.$store.getters.config.event_review_manager==1){
+					if(supremeAuthority=='admin'||supremeAuthority=='point_manager'){
+						is=true;
+					}
+				}else{
+					let event_special=this.$store.getters.config.event_special;
+					if(event_special.length>0){
+						let ids=event_special.map(e=> e.id);
+						is=ids.indexOf(this.$getUserData().id)!=-1
+					}else{
+						is=false;
+					}
+				}
+			}
+			return is;
+		},
 		returnConfig(){
 			return this.$store.getters.config.shop_status==1;
 		}
@@ -462,6 +493,7 @@ 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('ranking'), icon: 'icon-dingdingPC_tongji1' },
 				{ title: '奖票', children: this.returnRoutersArr('award'), icon: 'icon-piao' },
 			];
@@ -595,8 +627,9 @@ export default {
 	background-image: linear-gradient(to bottom, #5e6e9b 0%, #232d48 100%);
 	text-align: center;
 	color: #e1bf66;
-	border-top-left-radius: 25px;
-	border-bottom-left-radius: 25px;
+	border-radius: 25px;
+	// border-top-left-radius: 25px;
+	// border-bottom-left-radius: 25px;
 	line-height: 35px;
 	height: 35px;
 	padding: 0 10px;

+ 4 - 5
src/router/index.js

@@ -72,7 +72,7 @@ const routes = [{
 			{
 				path: '/get_task',
 				name: 'get_task',
-				title: '任务',
+				title: '任务',
 				component: () => import( /* webpackChunkName: "get_task" */ '@/views/task/get_task.vue'),
 				meta: {
 					icon: 'icon-PC_gongzuotai_renwu',
@@ -445,12 +445,11 @@ const routes = [{
 				path: '/review',
 				name: 'review',
 				title: '复核',
-				component: () => import( /* webpackChunkName: "review" */
-					'@/views/workbench/review.vue'),
+				component: () => import( /* webpackChunkName: "review" */ '@/views/workbench/review.vue'),
 				meta: {
 					icon: 'icon-shezhi_gongdaolbiao',
-					groupCode: 'workbench',
-					jurisdiction: ['dept_manager', 'employee']
+					groupCode: 'review',
+					// jurisdiction: ['dept_manager', 'employee']
 				}
 			},
 			{

+ 7 - 5
src/screen.vue

@@ -1,5 +1,6 @@
 <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%;">
@@ -47,15 +48,15 @@
 													<div v-if="item.rank == 3" class="index"><img src="./assets/image/3.png" /></div>
 												</template>
 												<div style="font-size: 20px;width: 36px;text-align: center;" v-else>{{ item.rank }}</div>
-												<userImage :user_name="item.employee.name" :img_url="item.employee.img_url" width="54px" height="54px" style="margin: 0 18px;"></userImage>
+												<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 style="font-size: 20px;margin-bottom: 5px;">{{ item.employee_name }}</div>
 													<div class="fontColorD" 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 class="num">{{ item.point }}</div>
 										</div>
 									</div>
 								</template>
@@ -158,6 +159,7 @@
 				<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%;">
@@ -213,7 +215,7 @@
 														</div>
 													</div>
 												</div>
-												<div class="num" style="font-size: 14px;">{{ item.s_point }}</div>
+												<div class="num" style="font-size: 14px;">{{ item.point }}</div>
 											</div>
 										</div>
 								</template>
@@ -467,7 +469,6 @@ export default {
 				this.errorMsg='网络连接失败,正在尝试重连...';
 				let setT=setTimeout(()=>{
 					this.opneWebSocket()
-					// this.isShowError=false;
 					clearTimeout(setT)
 				},120000)
 			}
@@ -504,6 +505,7 @@ export default {
 			}
 			this.$axios('get', '/api/screen/ranking', data).then(res => {
 				this.rankingList =this.$returnDeptName(res.data.data.list);
+				console.log(this.rankingList)
 			})
 		},
 		// 累计排名

+ 6 - 5
src/screenSan.vue

@@ -51,15 +51,15 @@
 													<div v-if="item.rank == 3" class="index"><img src="./assets/image/3.png" /></div>
 												</template>
 												<div style="font-size: 20px;width: 36px;text-align: center;" v-else>{{ item.rank }}</div>
-												<userImage :user_name="item.employee.name" :img_url="item.employee.img_url" width="54px" height="54px" style="margin: 0 18px;"></userImage>
+												<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 style="font-size: 20px;margin-bottom: 5px;">{{ item.employee_name }}</div>
 													<div class="fontColorD" 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 class="num">{{ item.point }}</div>
 										</div>
 									</div>
 								</template>
@@ -154,6 +154,7 @@
 				<div style="color: #fff;">管理执行难,就用功道云</div>
 			</div>
 		</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%;">
@@ -212,7 +213,7 @@
 														</div>
 													</div>
 												</div>
-												<div class="num" style="font-size: 14px;">{{ item.s_point }}</div>
+												<div class="num" style="font-size: 14px;">{{ item.point }}</div>
 											</div>
 										</div>
 								</template>
@@ -382,7 +383,7 @@ export default {
 			isSetInterval:'',
 			rankingList:[],
 			
-			innerVisible:true,
+			innerVisible:false,
 			generateId:'',//唯一标识
 			corpId:'',//企业ID
 			screenList:[],//

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

@@ -234,10 +234,7 @@ export default {
 			{
 				text: '本周',
 				onClick(picker) {
-					const now = new Date(new Date().toLocaleDateString());
-					const start = now.getTime() - (now.getDay() - 1) * 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().startOf('isoWeek').format('YYYY-MM-DD'),moment().endOf('isoWeek').format('YYYY-MM-DD')]);
 				}
 			},
 			{

+ 9 - 13
src/views/award/print.vue

@@ -249,11 +249,7 @@
 						{
 							text: '本周',
 							onClick(picker) {
-								const now = new Date(new Date().toLocaleDateString());
-								const start = now.getTime() - (now.getDay() - 1) * 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().startOf('isoWeek').format('YYYY-MM-DD'),moment().endOf('isoWeek').format('YYYY-MM-DD')]);
 							}
 						},
 						{
@@ -311,14 +307,14 @@
 							this.pickerMinDate = new Date(obj.minDate).getTime();
 						}
 					},
-					disabledDate: time => {
-						if (this.pickerMinDate && !this.dialogVisible) {
-							const day1 = 30 * 24 * 3600 * 1000 //限制只能选一个月的范围区间
-							let maxTime = this.pickerMinDate + day1
-							let minTime = this.pickerMinDate - day1
-							return time.getTime() > maxTime || time.getTime() < minTime
-						}
-					}
+					// disabledDate: time => {
+					// 	if (this.pickerMinDate && !this.dialogVisible) {
+					// 		const day1 = 30 * 24 * 3600 * 1000 //限制只能选一个月的范围区间
+					// 		let maxTime = this.pickerMinDate + day1
+					// 		let minTime = this.pickerMinDate - day1
+					// 		return time.getTime() > maxTime || time.getTime() < minTime
+					// 	}
+					// }
 				},
 				selectType: 1,
 				total: 0,

+ 20 - 6
src/views/common/repeatTaskDetailsPopup.vue

@@ -19,7 +19,7 @@
 					<li class="flex-box" v-if="workDetailData">
 						<div class="label">执行周期</div>
 						<div class="content_text">
-							{{workDetailData.target_info.length>0? '临时任务-':'悬赏任务-'}}{{ workDetailData.task_cycle_mark }}
+							{{workDetailData.target_info.length>0? '指派任务-':'抢单任务-'}}{{ workDetailData.task_cycle_mark }}
 						</div>
 					</li>
 					<li class="flex-box" v-if="workDetailData.point_config">
@@ -59,16 +59,29 @@
 							<span v-if="workDetailData.task_cycle == '3'">{{workDetailData.task_cycle_mark}}{{ workDetailData.task_cycle_value }}号截止</span>
 						</div>
 					</li>
+					<li class="flex-box-ce" v-if="workDetailData.total_chance">
+						<div class="label">抢单人数</div>
+						<div class="content_text">{{ workDetailData.total_chance}}</div>
+					</li>
+					
 					<li class="flex-box" v-if="workDetailData.department_info&&workDetailData.type==2">
 						<div class="label">可见范围</div>
-						<div class="content_text" v-if="workDetailData.department_info.length>0">
-						<span v-for="(item,index) in workDetailData.department_info" :key="index">
-							{{item.name}}
-							<span v-if="(workDetailData.department_info.length - 1) > index"> ,</span>
-						</span>
+						<div class="flex-1" v-if="workDetailData.department_info.length > 0||workDetailData.employee_info.length > 0" style="background-color: rgb(250, 251, 252);padding: 8px;border: 5px;">
+							<div class="content_text" style="margin-bottom: 10px;" v-if="workDetailData.department_info.length > 0">
+								<div class="fontColorC">指定部门</div>
+								<span v-for="(item, index) in workDetailData.department_info" :key="index">{{ item.name }}<span v-if="workDetailData.department_info.length - 1 > index">,</span></span>
+							</div>
+							<div class="content_text" v-if="workDetailData.employee_info.length > 0">
+								<div class="fontColorC">指定人员</div>
+								<span v-for="(item, index) in workDetailData.employee_info" :key="index">
+									{{ item.name }}
+									<span v-if="workDetailData.employee_info.length - 1 > index">,</span>
+								</span>
+							</div>
 						</div>
 						<div class="content_text" v-else>全公司</div>
 					</li>
+					
 					<li class="flex-box" v-if="workDetailData.point_config && workDetailData.point_config.ahead_award_point">
 						<div class="label">提前奖分</div>
 						<div class="content_text">{{ workDetailData.point_config.ahead_award_point }}/天</div>
@@ -155,6 +168,7 @@ export default {
 			workDetailData: {
 				target_info:[],
 				department_info:[],
+				employee_info:[],
 				point_config:{
 					rule_info:''
 				}

+ 147 - 63
src/views/common/rewardTask.vue

@@ -1,6 +1,6 @@
 <template>
 	<div>
-		<!-- 悬赏任务弹窗 -->
+		<!-- 抢单任务弹窗 -->
 		<el-dialog :title="showTitle" :visible.sync="dialogVisible" :close-on-click-modal="false" :before-close="closeDialog" width="700px" top="3%">
 			<div v-loading="forTheTaskLoading">
 				<div class="orange" style="text-align: center;padding-bottom: 10px;" v-if="config.event_review_status&&config.event_task_review">复核开启后,积分需管理员复核后才计入排名和统计</div>
@@ -83,21 +83,6 @@
 							<el-input auto-complete="off" v-model="reviewerName" placeholder="请选择审批人"></el-input>
 							<div @click="show_reviewer_selector = true" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
 						</div>
-						</el-row>
-						<el-dialog title="选择审批人" width="640px" :visible.sync="show_reviewer_selector" append-to-body :before-close="handleClose">
-							<EmployeeSelector
-								v-if="show_reviewer_selector"
-								ref="members"
-								:multi="false"
-								:use_Administrator_list="true"
-								:selected="reviewer_selected"	
-								@confirm="reviewer_confirm"
-							/>
-							<span slot="footer" class="dialog-footer">
-								<el-button @click="show_reviewer_selector = false">取 消</el-button>
-								<el-button type="primary" @click="submitMembers('members')">确 定</el-button>
-							</span>
-						</el-dialog>
 					</el-form-item>
 					<el-form-item label="重复周期" prop="task_cycle">
 						<template slot="label">
@@ -144,8 +129,20 @@
 							<el-option v-for="item in columns3" :key="item.value" :label="item.name" :value="item.value"></el-option>
 						</el-select>
 					</el-form-item>
+					
+					<el-form-item prop="chance" :rules="[{ required: true, message: '请输入名额' }]">
+						<template slot="label">
+							<el-tooltip  effect="dark" placement="top">
+							  <div slot="content">
+								 抢单名额决定多少个人能抢到任务去做,最多不能超过100名
+							  </div>
+							  <span>抢单名额<i style="padding-left: 5px;font-size: 16px;" class="el-icon-question fontColorD"></i></span>
+							</el-tooltip>
+						</template>
+						<el-input v-model="formData.chance" style="width: 220px;" @input="formData.chance = formData.chance.replace(/[^\d]/g, '')" placeholder="请输入名额(最多100名)"></el-input>
+					</el-form-item>
 
-					<el-form-item label="任务备注" prop="task_remark" :rules="[{ max: 300, message: '长度不能超过 300 个字', trigger: 'blur' }]">
+					<el-form-item label="任务备注" prop="task_remark" :rules="[{ max: 300, message: '长度不能超过 300 个字' }]">
 						<el-input type="textarea" :rows="5" v-model="formData.task_remark" maxlength="300" show-word-limit placeholder="请输入任务备注(限300字)"></el-input>
 					</el-form-item>
 					<el-form-item label="图片">
@@ -168,23 +165,36 @@
 							(最多选择3张)
 						</upload>
 					</el-form-item>
-					<el-form-item label="谁可以看" prop="dept_ids">
-						<el-cascader
-							size="medium"
-							class="date-picker-width"
-							v-model="dept_name"
-							@change="handleChange"
-							:options="dept_tree"
-							collapse-tags
-							:props="{checkStrictly: true, value: 'id', label: 'name', multiple: true, children: '_child' }"
-							ref="dept"
-							clearable
-							placeholder="全公司"
-						></el-cascader>
-						<span style="color:#b5b7bb;padding-left:10px;">选中的部门可查看或领取任务</span>
+					<el-form-item label="可见范围" prop="dept_ids">
+						<div style="background-color: rgb(250, 251, 252);padding: 8px;border: 5px;">
+							<div style="margin-bottom: 16px;">
+								<div  style="padding-left:5px;">没有指定部门与人员时默认全公司可见</div>
+								<el-cascader
+									size="medium"
+									style="width: 360px;"
+									v-model="dept_name"
+									@change="handleChange"
+									:options="dept_tree"
+									collapse-tags
+									:props="{checkStrictly: true, value: 'id', label: 'name', multiple: true, children: '_child' }"
+									ref="dept"
+									clearable
+									placeholder="请选择部门"
+								></el-cascader>
+							</div>
+							<div>
+								<!-- <div style="padding-left:5px;">指定人员可查看或领取任务(最多50人)</div> -->
+								<div class="input-box font-flex-word" @click="openUserSelect">
+									<span style="color:#b5b7bb;" v-if="employeeList.length==0">请选择人员</span>
+									<template v-else>
+										<span v-for="(item,index) in employeeList" :key="index">{{item.name}}<span v-if="index!=employeeList.length-1">,</span></span>
+									</template>
+								</div>
+							</div>
+						</div>
 					</el-form-item>
 
-					<div style="margin-left: 80px; margin-bottom: 8px;">以天为单位,每 提前/逾期 一天 加分/扣分</div>
+					<div style="margin-left: 100px; margin-bottom: 8px;">以天为单位,每 提前/逾期 一天 加分/扣分</div>
 					<el-form-item label="提前奖分" prop="ahead_award_point">
 						<el-input v-model="formData.ahead_award_point" oninput="value=value.replace(/[^\d]/g,'')" placeholder="请输入每日奖分" style="width: 150px;"></el-input>
 						B分/每天, 奖分上限 &nbsp;
@@ -223,6 +233,35 @@
 				</el-form>
 			</div>
 		</el-dialog>
+		
+		<el-dialog title="选择审批人" width="640px" :visible.sync="show_reviewer_selector" append-to-body :before-close="handleClose">
+			<EmployeeSelector
+				v-if="show_reviewer_selector"
+				ref="members"
+				:multi="false"
+				:user_Administrator_list="true"
+				:selected="reviewer_selected"	
+				@confirm="reviewer_confirm"
+			/>
+			<span slot="footer" class="dialog-footer">
+				<el-button @click="show_reviewer_selector = false">取 消</el-button>
+				<el-button type="primary" @click="submitMembers('members')">确 定</el-button>
+			</span>
+		</el-dialog>
+		<el-dialog title="人员选择" :visible.sync="manageScope_show" top="5vh" width="700px">
+			<EmployeeSelector
+				v-if="manageScope_show"
+				ref="Employee2"
+				:isChecKedAll="false"
+				:max="50"
+				:selected="selected_manage"
+				@confirm="manage_confirm"
+			></EmployeeSelector>
+			<span slot="footer">
+				<el-button @click="manageScope_show=false">取消</el-button>
+				<el-button type="primary"  @click="sub_manageScope">完成</el-button>
+			</span>
+		</el-dialog>
 	</div>
 </template>
 
@@ -275,7 +314,7 @@ export default {
 			dept_tree: [],
 			forTheTaskLoading: false,
 			formData: {
-				task_type: '1',
+				task_type: '3',
 				pt_id: 3,
 				task_name: '',
 				task_remark: '',
@@ -294,7 +333,9 @@ export default {
 				timeout_deduction_point_limit: null,
 				ahead_award_point: null,
 				ahead_award_point_limit: null,
-				dept_ids: []
+				dept_ids: [],
+				chance:1,//次数
+				employee_ids:[],
 			},
 			point_types: [],
 			// 审批人
@@ -382,10 +423,12 @@ export default {
 			dept_selected: { dept: [], employee: [] },
 			show_employee_selector: false,
 			config:{},
-			
-			
 			oneruleId: [],
 			echoGather: [],
+			
+			employeeList:[],
+			manageScope_show:false,
+			selected_manage: { employee: [], dept: [] },
 		};
 	},
 	components: { EmployeeSelector, upload },
@@ -435,6 +478,22 @@ export default {
 		this.getDepartment();
 	},
 	methods: {
+		manage_confirm(val){
+			if(val.employee.length>0){
+				this.employeeList=val.employee;
+			}else{
+				this.employeeList=[];
+			}
+			this.manageScope_show = false
+		},
+		openUserSelect(){
+			this.selected_manage.employee=this.employeeList;
+			this.manageScope_show=true;
+		},
+		sub_manageScope(){
+			this.$refs.Employee2.confirm();
+		},
+		
 		//复原数据
 		Datas() {
 			// this.formData.id = this.modifyData.id;
@@ -443,7 +502,8 @@ export default {
 			this.formData.pt_id = this.modifyData.pt_id;
 			this.formData.expire_time = this.modifyData.expire_time;
 			this.formData.task_cycle = this.modifyData.task_cycle;
-			
+			this.formData.chance = this.modifyData.total_chance;
+			this.employeeList=this.modifyData.employee_info
 			
 			this.reviewerName = this.modifyData.reviewer_name;	
 			this.formData.reviewer_id = this.modifyData.reviewer_id; //审批者
@@ -488,7 +548,6 @@ export default {
 					this.formData.tree_echo = JSON.parse(JSON.stringify(this.arr))
 					this.$nextTick(_=>{
 						this.ruleItemChange(this.formData.tree_echo,true);
-						// this.formData.task_expire_day = this.modifyData.task_cycle_value;
 					})
 				})
 			}else if(this.modifyData.point_config.rule_info){//指定了分类
@@ -498,9 +557,9 @@ export default {
 			}
 			this.$nextTick(_=>{
 				this.$nextTick(_=>{
-						this.formData.task_remark = this.modifyData.remark;
-						this.formData.base_point = this.modifyData.point_config.base_point;
-						this.formData.task_expire_day = this.modifyData.task_cycle_value;
+					this.formData.task_remark = this.modifyData.remark;
+					this.formData.base_point = this.modifyData.point_config.base_point;
+					this.formData.task_expire_day = this.modifyData.task_cycle_value;
 				})
 			})
 			
@@ -605,22 +664,16 @@ export default {
 		},
 
 		handleChange(val) {
-			// let data = [];
-			// for (let i in val) {
-			// 	data.push(val[i][val[i].length - 1]);
-			// }
 			if (val.length !== 0) {
 				let dept_ids=[];
 				val.forEach((item)=>{
 					dept_ids.push(item[item.length-1]);
-					// dept_ids.push(...item);
 				})
 				let set =new Set(dept_ids);
 				this.formData.dept_ids = [...set];
 			} else {
 				this.formData.dept_ids = 0;
 			}
-			// this.formData.dept_ids = data;
 		},
 		submitMembers(name) {
 			this.$refs[name].confirm(); //调用组件的confirm();
@@ -646,7 +699,7 @@ export default {
 			this.fileList = [];
 			this.dept_name = [];
 			this.formData={
-				task_type: '1',
+				task_type: '3',
 				pt_id: 3,
 				task_name: '',
 				task_remark: '',
@@ -665,10 +718,14 @@ export default {
 				timeout_deduction_point_limit: null,
 				ahead_award_point: null,
 				ahead_award_point_limit: null,
-				dept_ids: []
+				dept_ids: [],
+				chance:1,
+				employee_ids:[],
 			}
 			this.reviewer_selected = { dept: [], employee: [] };
 			this.dept_selected = { dept: [], employee: [] };
+			this.employeeList=[];
+			this.selected_manage={ employee: [], dept: [] };
 		},
 		ahead_timeout(item, arr, codes, code) {
 			if (item) {
@@ -679,6 +736,7 @@ export default {
 					}
 				} else {
 					this.$message.warning(codes + '不为0时,' + code + '上限不能为空');
+					// this.$message.warning(`设置${codes}时,需同时设置每天${code}及${code}上限`);
 					return true;
 				}
 			}
@@ -690,6 +748,7 @@ export default {
 		saveFun(formName) {
 			// 没有选择重复任务的时候
 			// /api/integral/task/publish
+			
 			// 选择重复任务之后
 			// /api/integral/schedule/publish/task
 			let self = this;
@@ -704,17 +763,18 @@ export default {
 				data.task_remark ? '' : delete data.task_remark;
 			}
 			if (!data.ahead_award_point && data.ahead_award_point_limit) {
-				this.$message.warning('奖分上限不为0时每日奖分不能为空');
+				// this.$message.warning('奖分上限不为0时每日奖分不能为空');
+				this.$message.warning('设置提前奖分时,需同时设置每天奖分及奖分上限');
 				return;
 			} else if (data.ahead_award_point && !data.ahead_award_point_limit) {
-				this.$message.warning('每日奖分不为0时奖分上限不能为空');
+				this.$message.warning('设置提前奖分时,需同时设置每天奖分及奖分上限');
 				return;
 			}
 			if (!data.timeout_deduction_point && data.timeout_deduction_point_limit) {
-				this.$message.warning('扣分上限不为0时每日扣分不能为空');
+				this.$message.warning('设置逾期扣分时,需同时设置每天扣分及扣分上限');
 				return;
 			} else if (data.timeout_deduction_point && !data.timeout_deduction_point_limit) {
-				this.$message.warning('每日扣分不为0时扣分上限不能为空');
+				this.$message.warning('设置逾期扣分时,需同时设置每天扣分及扣分上限');
 				return;
 			}
 			if (this.ahead_timeout(data.ahead_award_point, data.ahead_award_point_limit, '提前奖分', '奖分')) return;
@@ -736,6 +796,22 @@ export default {
 			add.forEach(item => {
 				this.deletedata(data, item);
 			});
+			if(data.base_point<=0){
+				this.$message.warning('任务积分必须大于0,请调整后再发布');
+				return;
+			}
+			if(data.chance==0){
+				this.$message.warning('抢单人数不能为0');
+				return;
+			}
+			if(data.chance>100){
+				this.$message.warning('抢单人数不能超过100个');
+				return;
+			}
+			if(this.employeeList.length>0){
+				data.employee_ids=this.employeeList.map(e=> e.id).toString();
+			}
+			
 			let is=true;
 			if(this.formData.task_cycle==1&&this.formData.task_expire_day<=moment().format('HH')){
 				is=false  
@@ -744,7 +820,6 @@ export default {
 			}else if(this.formData.task_cycle==3&&this.formData.task_expire_day<=moment().format('D')){
 				is=false  
 			}
-			console.log(data)
 			this.forTheTaskLoading = true;
 			this.$axios('post', this.formData.task_cycle == 0 ? '/api/integral/task/publish' : '/api/integral/schedule/publish/task', data).then(res => {
 					this.$message.success(res.data.msg);
@@ -865,13 +940,22 @@ export default {
 };
 </script>
 <style lang="scss">
-// .el-cascader-menu .el-cascader-menu__wrap .el-scrollbar__view li.el-cascader-node {
-//   height: auto;
-//   max-width: 500px;
-//   .el-cascader-node__label {
-//     white-space: initial;
-//     overflow: initial;
-//     text-overflow: initial;
-//   }
-// }
+.input-box{
+	-webkit-appearance: none;
+	background-color: #FFF;
+	background-image: none;
+	border-radius: 4px;
+	border: 1px solid #DCDFE6;
+	box-sizing: border-box;
+	color: #606266;
+	display: inline-block;
+	font-size: inherit;
+	height: 36px;
+	line-height: 36px;
+	outline: 0;
+	padding: 0 15px;
+	transition: border-color .2s cubic-bezier(.645,.045,.355,1);
+	width: 360px;
+	cursor: pointer;
+}
 </style>

+ 133 - 76
src/views/common/rewardTaskAmend.vue

@@ -1,6 +1,6 @@
 <template>
 	<div>
-		<!-- 悬赏任务弹窗 -->
+		<!-- 抢单任务弹窗 -->
 		<el-dialog :title="showTitle" :visible.sync="dialogVisible" :close-on-click-modal="false" :before-close="closeDialog" width="700px" top="5%">
 			<div v-loading="forTheTaskLoading">
 				<div class="orange" style="text-align: center;padding-bottom: 10px;" v-if="config.event_review_status&&config.event_task_review">复核开启后,积分需管理员复核后才计入排名和统计</div>
@@ -81,7 +81,7 @@
 								v-if="show_reviewer_selector"
 								ref="members"
 								:multi="false"
-								:use_Administrator_list="true"
+								:user_Administrator_list="true"
 								:selected="reviewer_selected"
 								@confirm="reviewer_confirm"
 							/>
@@ -121,7 +121,17 @@
 							<el-option v-for="item in columns3" :key="item.value" :label="item.name" :value="item.value"></el-option>
 						</el-select>
 					</el-form-item>
-
+					<el-form-item prop="chance" :rules="[{ required: true, message: '请输入名额', trigger: 'blur' }]">
+						<template slot="label">
+							<el-tooltip  effect="dark" placement="top">
+							  <div slot="content">
+								 抢单名额决定多少个人能抢到任务去做,最多不能超过100名
+							  </div>
+							  <span>抢单名额<i style="padding-left: 5px;font-size: 16px;" class="el-icon-question fontColorD"></i></span>
+							</el-tooltip>
+						</template>
+						<el-input v-model="formData.chance" style="width: 220px;"  @input="formData.chance = formData.chance.replace(/[^\d]/g, '')" placeholder="请输入名额(最多100名)"></el-input>
+					</el-form-item>
 					<el-form-item label="任务备注" prop="task_remark" :rules="[{ max: 300, message: '长度不能超过 300 个字', trigger: 'blur' }]">
 						<el-input type="textarea" :rows="5" v-model="formData.task_remark" maxlength="300" show-word-limit placeholder="请输入任务备注(限300字)"></el-input>
 					</el-form-item>
@@ -146,20 +156,33 @@
 							(最多选择3张)
 						</upload>
 					</el-form-item>
-					<el-form-item label="谁可以看" prop="dept_ids">
-						<el-cascader
-							size="medium"
-							class="date-picker-width"
-							v-model="dept_name"
-							@change="handleChange"
-							:options="dept_tree"
-							collapse-tags
-							:props="{ checkStrictly: true, value: 'id', label: 'name', multiple: true, children: '_child' }"
-							ref="depts"
-							clearable
-							placeholder="全公司"
-						></el-cascader>
-						<span style="color:#b5b7bb;padding-left:10px;">选中的部门可查看或领取任务</span>
+					<el-form-item label="可见范围" prop="dept_ids">
+						<div style="background-color: rgb(250, 251, 252);padding: 8px;border: 5px;">
+							<div style="margin-bottom: 16px;">
+								<div  style="padding-left:5px;">没有指定部门与人员时默认全公司可见</div>
+								<el-cascader
+									size="medium"
+									style="width: 360px;"
+									v-model="dept_name"
+									@change="handleChange"
+									:options="dept_tree"
+									collapse-tags
+									:props="{checkStrictly: true, value: 'id', label: 'name', multiple: true, children: '_child' }"
+									ref="dept"
+									clearable
+									placeholder="请选择部门"
+								></el-cascader>
+							</div>
+							<div>
+								<!-- <div style="padding-left:5px;">指定人员可查看或领取任务(最多50人)</div> -->
+								<div class="input-box font-flex-word" @click="openUserSelect">
+									<span style="color:#b5b7bb;" v-if="employeeList.length==0">请选择人员</span>
+									<template v-else>
+										<span v-for="(item,index) in employeeList" :key="index">{{item.name}}<span v-if="index!=employeeList.length-1">,</span></span>
+									</template>
+								</div>
+							</div>
+						</div>
 					</el-form-item>
 
 					<div style="margin-left: 80px; margin-bottom: 8px;">以天为单位,每 提前/逾期 一天 加分/扣分</div>
@@ -183,6 +206,20 @@
 				</el-form>
 			</div>
 		</el-dialog>
+		<el-dialog title="人员选择" :visible.sync="manageScope_show" top="5vh" width="700px">
+			<EmployeeSelector
+				v-if="manageScope_show"
+				ref="Employee2"
+				:isChecKedAll="false"
+				:max="50"
+				:selected="selected_manage"
+				@confirm="manage_confirm"
+			></EmployeeSelector>
+			<span slot="footer">
+				<el-button @click="manageScope_show=false">取消</el-button>
+				<el-button type="primary"  @click="sub_manageScope">完成</el-button>
+			</span>
+		</el-dialog>
 	</div>
 </template>
 
@@ -237,7 +274,7 @@ export default {
 				rule_id: 0,
 				rule_value:[],
 				id: 0,
-				task_type: '1',
+				task_type: '3',
 				pt_id: 2,
 				task_name: '',
 				task_remark: '',
@@ -251,7 +288,9 @@ export default {
 				timeout_deduction_point_limit: null,
 				ahead_award_point: null,
 				ahead_award_point_limit: null,
-				dept_ids: null
+				dept_ids: null,
+				chance:1,//次数
+				employee_ids:[],
 			},
 			point_types: [],
 			arr:[],
@@ -345,6 +384,10 @@ export default {
 			oneruleId: [],
 			echoGather: [],
 			config:{},
+			
+			employeeList:[],
+			manageScope_show:false,
+			selected_manage: { employee: [], dept: [] },
 		};
 	},
 	components: { EmployeeSelector, upload },
@@ -362,8 +405,11 @@ export default {
 			this.formData.pt_id = this.rewardTaskAmendData.pt_id; //积分种类id
 			this.formData.task_name = this.rewardTaskAmendData.task_name; //任务名
 			this.formData.task_remark = this.rewardTaskAmendData.task_remark; //任务详细描述
-			this.formData.base_point = this.rewardTaskAmendData.point_config.base_point; //任务参考积分
 			this.formData.expire_time = this.rewardTaskAmendData.expire_time; //截至时间
+			this.formData.task_type=this.rewardTaskAmendData.type;
+			this.formData.chance = this.rewardTaskAmendData.total_chance;
+			this.employeeList=this.rewardTaskAmendData.employee_info;
+			
 			this.reviewerName = this.rewardTaskAmendData.reviewer_name; //审批者id
 			this.formData.reviewer_id = this.rewardTaskAmendData.reviewer_id;
 			this.reviewer_selected.employee = [
@@ -398,11 +444,6 @@ export default {
 			this.rewardTaskAmendData.task_file_list.forEach((item, index) =>{
 				filtList.push({name: item ,url:item, response: { url:item }})
 			})
-			this.$nextTick(()=>{
-				this.$nextTick(()=>{
-					this.formData.task_remark = this.rewardTaskAmendData.task_remark; //任务详细描述
-				})
-			})
 			this.fileList = filtList
 			this.fileFun('', filtList)
 			if(this.rewardTaskAmendData.point_config.item_info){
@@ -416,11 +457,17 @@ export default {
 					this.arr=[];
 					this.ruleItemChange(this.formData.tree_echo)
 				})
-			}else if(this.rewardTaskAmendData.rule_id){//指定了分类
+			}else if(this.rewardTaskAmendData.point_config.rule_info){//指定了分类
 				this.isSelectType=false;
-				this.formData.rule_id = this.rewardTaskAmendData.rule_id;
-				this.formData.rule_value = this.returnRuleVal(this.rewardTaskAmendData.rule_id,[]);
+				this.formData.rule_id = this.rewardTaskAmendData.point_config.rule_info.id;
+				this.formData.rule_value = this.returnRuleVal(this.rewardTaskAmendData.point_config.rule_info.id,[]);
 			}
+			this.$nextTick(()=>{
+				this.$nextTick(()=>{
+					this.formData.task_remark = this.rewardTaskAmendData.task_remark; //任务详细描述
+					this.formData.base_point = this.rewardTaskAmendData.point_config.base_point; //任务参考积分
+				})
+			})
 		}
 	},
 	mounted() {
@@ -429,6 +476,21 @@ export default {
 		this.getDepartment();
 	},
 	methods: {
+		manage_confirm(val){
+			if(val.employee.length>0){
+				this.employeeList=val.employee;
+			}else{
+				this.employeeList=[];
+			}
+			this.manageScope_show = false
+		},
+		openUserSelect(){
+			this.selected_manage.employee=this.employeeList;
+			this.manageScope_show=true;
+		},
+		sub_manageScope(){
+			this.$refs.Employee2.confirm();
+		},
 		// 规则分类变化关闭dewn
 		ruleChange2(value) {
 			const item = this.formData;
@@ -522,7 +584,6 @@ export default {
 		ruleItemChange(val){
 			let item = this.formData
 			if(val.length>0){
-				// let data = this.$refs.ruleItem.getCheckedNodes()[0].data;//当前选中的节点数据
 				let id=val[val.length-2]
 				let key='rule_'+id
 				let list =this.trees_ab.item_list[key]; //当前选中的节点数据
@@ -532,7 +593,6 @@ export default {
 						data=e;
 					}
 				})
-				
 				item.task_remark = data.name;
 				this.treeName = data.name;
 				this.max = data.max_point * 1;
@@ -607,8 +667,9 @@ export default {
 						return true
 					}
 				}else{
-					this.$message.warning( codes + '不为0时,'+ code +'上限不能为空')
-					return true
+					this.$message.warning(codes + '不为0时,' + code + '上限不能为空');
+					// this.$message.warning(`设置${codes}时,需同时设置每天${code}及${code}上限`);
+					return true;
 				}
 			}
 		},
@@ -621,36 +682,19 @@ export default {
 			let data = JSON.parse(JSON.stringify(self.formData));
 			data.task_remark ? '' : delete data.task_remark;
 			data.timeout_deduction_point ? '' : delete data.timeout_deduction_point;
-			// if(data.timeout_deduction_point == ""){
-			//   data.timeout_deduction_point = null
-			// }
-			// if(data.task_remark == ""){
-			//   data.task_remark = null
-			// }
-			// if(data.task_cycle == 0){
-			//   delete data.task_cycle
-			//   delete data.task_expire_day
-			//   delete data.targets
-			//   data.task_remark?'':delete data.task_remark
-			//   data.timeout_deduction_point?'':delete data.timeout_deduction_point
-			// }else{
-			//   delete data.expire_time
-			//   data.task_remark?'':delete data.task_remark
-			//   data.timeout_deduction_point?'':delete data.timeout_deduction_point
-			// }
-			
 			if(!data.ahead_award_point && data.ahead_award_point_limit){
-				this.$message.warning('奖分上限不为0时每日奖分不能为空')
+				// this.$message.warning('奖分上限不为0时每日奖分不能为空');
+				this.$message.warning('设置提前奖分时,需同时设置每天奖分及奖分上限');
 				return
 			}else if(data.ahead_award_point && !data.ahead_award_point_limit){
-				this.$message.warning('每日奖分不为0时奖分上限不能为空')
+				this.$message.warning('设置提前奖分时,需同时设置每天奖分及奖分上限')
 				return
 			}
 			if(!data.timeout_deduction_point && data.timeout_deduction_point_limit){
-				this.$message.warning('扣分上限不为0时每日扣分不能为空')
+				this.$message.warning('设置逾期扣分时,需同时设置每天扣分及扣分上限');
 				return
 			}else if(data.timeout_deduction_point && !data.timeout_deduction_point_limit){
-				this.$message.warning('每日扣分不为0时扣分上限不能为空')
+				this.$message.warning('设置逾期扣分时,需同时设置每天扣分及扣分上限')
 				return
 			}
 			if(this.ahead_timeout(data.ahead_award_point,data.ahead_award_point_limit,'提前奖分','奖分')) return
@@ -674,19 +718,27 @@ export default {
 			add.forEach(item =>{
 				this.deletedata(data,item)
 			})
-
+			if(data.base_point<=0){
+				this.$message.warning('任务积分必须大于0,请调整后再发布');
+				return;
+			}
+			if(data.chance==0){
+				this.$message.warning('抢单人数不能为0');
+				return;
+			}
+			if(data.chance>100){
+				this.$message.warning('抢单人数不能超过100个');
+				return;
+			}
+			if(this.employeeList.length>0){
+				data.employee_ids=this.employeeList.map(e=> e.id).toString();
+			}
 			this.forTheTaskLoading = true;
 			self.$axios('post', '/api/integral/task/update', data)
 				.then(res => {
 					if (res.data.code == 1) {
 						this.$parent.get_list();
 						this.resetForm('formData')
-						// this.dept_selected = { dept: [], employee: [] };
-						// self.executorName = '';
-						// self.reviewerName = '';
-						// this.dept_name = [];
-						// self.$emit('update:dialogVisible', false);
-						// self.$refs[formName].resetFields();
 						self.$message.success(res.data.msg);
 					} else {
 						self.$message.error(res.data.msg);
@@ -699,20 +751,6 @@ export default {
 					}, 300);
 				});
 		},
-		// // 执行者
-		// approval_confirm(data){
-		//   this.approval_selected = {dept: [],employee:[]}
-		//   this.formData.targets = []
-		//   this.executorName = ''
-		//   if (data.employee !== null && data.employee.length != 0) {
-		//     this.approval_selected = data
-		//     data.employee.forEach(element => {
-		// 			this.formData.targets.push(element.id)
-		// 			this.executorName += (element.name+',')
-		//     });
-		//   }
-		// },
-		// 执行者 end
 		// 审核人
 		reviewer_confirm(data) {
 			this.reviewer_selected = { dept: [], employee: [] };
@@ -790,4 +828,23 @@ export default {
 };
 </script>
 
-<style></style>
+<style lang="scss" scoped>
+	.input-box{
+		-webkit-appearance: none;
+		background-color: #FFF;
+		background-image: none;
+		border-radius: 4px;
+		border: 1px solid #DCDFE6;
+		box-sizing: border-box;
+		color: #606266;
+		display: inline-block;
+		font-size: inherit;
+		height: 36px;
+		line-height: 36px;
+		outline: 0;
+		padding: 0 15px;
+		transition: border-color .2s cubic-bezier(.645,.045,.355,1);
+		width: 360px;
+		cursor: pointer;
+	}
+</style>

+ 102 - 22
src/views/common/rewardTaskDetailsPopup.vue

@@ -1,6 +1,6 @@
 <template>
 	<div>
-		<!-- 悬赏任务详情弹窗 -->
+		<!-- 抢单任务详情弹窗 -->
 		<el-drawer :visible.sync="Delay_to_open" :with-header="false" :size="'500px'" :before-close="handleClose" :custom-class="'drawer_details'">
 			<div class="details_title">{{ title }}</div>
 			<div class="details_content" v-if="workDetailData" v-loading="loading">
@@ -16,7 +16,7 @@
 							></userImage>
 							<div>
 								<div style="line-height: 25px;">
-									我悬赏的{{ $getTypsName(workDetailData.pt_id) }}任务
+									{{workDetailData.owner_name}}发布的{{ $getTypsName(workDetailData.pt_id) }}任务
 									<span v-if="workDetailData.point_config.base_point > 0" class="red">+{{ workDetailData.point_config.base_point }}</span>
 									<span v-else class="green">{{ workDetailData.point_config.base_point }}</span>
 									{{ $getTypsName(workDetailData.pt_id) }}
@@ -29,13 +29,14 @@
 						</div>
 					</el-col>
 				</el-row>
+				
 				<ul>
 					<li class="flex-box">
 						<div class="label">任务内容</div>
 						<div class="content_text">{{ workDetailData.task_name }}</div>
 					</li>
 					<li class="flex-box" v-if="workDetailData.status == 2 && workDetailData.receiver_id != 0">
-						<div class="label">领取人</div>
+						<div class="label">抢单人</div>
 						<div class="content_text">{{ workDetailData.receiver_name }}</div>
 					</li>
 					<li class="flex-box" v-if="workDetailData.status == 3 && workDetailData.receiver_id != 0">
@@ -58,10 +59,7 @@
 							></el-image>
 						</div>
 					</li>
-					<li class="flex-box">
-						<div class="label">任务类型</div>
-						<div class="content_text">{{ workDetailData.type_mark }}</div>
-					</li>
+
 					<li class="flex-box" v-if="workDetailData.point_config">
 						<div class="label">任务积分</div>
 						<div class="content_text">{{ workDetailData.point_config.base_point }}{{ $getTypsName(workDetailData.pt_id) }}</div>
@@ -82,6 +80,14 @@
 						<div class="label">截止时间</div>
 						<div class="content_text">{{ workDetailData.end_time }}</div>
 					</li>
+					<li class="flex-box-ce" v-if="workDetailData.total_chance">
+						<div class="label">抢单人数
+							<el-tooltip class="item" effect="dark" content="已抢单人数/可抢单名额" placement="top-start">
+								<i class="el-icon-warning fontColorC"></i>
+							</el-tooltip>
+						</div>
+						<div class="content_text"><span class="blue">{{workDetailData.total_chance-workDetailData.chance}}</span> / {{ workDetailData.total_chance }}   <span class="blue cursor" @click="isShowTable=true" v-if="workDetailData.total_chance!=workDetailData.chance">查看详情</span></div>
+					</li>
 					<li class="flex-box" v-if="workDetailData.point_config.timeout_deduction_point">
 						<div class="label">逾期扣分</div>
 						<div class="content_text">{{ workDetailData.point_config.timeout_deduction_point }}/天</div>
@@ -92,11 +98,18 @@
 					</li>
 					<li class="flex-box" v-if="workDetailData.department_info">
 						<div class="label">可见范围</div>
-						<div class="content_text" v-if="workDetailData.department_info.length > 0">
-							<span v-for="(item, index) in workDetailData.department_info" :key="index">
-								{{ item.name }}
-								<span v-if="workDetailData.department_info.length - 1 > index">,</span>
-							</span>
+						<div class="flex-1" v-if="workDetailData.department_info.length > 0||workDetailData.employee_info.length > 0" style="background-color: rgb(250, 251, 252);padding: 8px;border: 5px;">
+							<div class="content_text" style="margin-bottom: 10px;" v-if="workDetailData.department_info.length > 0">
+								<div class="fontColorC">指定部门</div>
+								<span v-for="(item, index) in workDetailData.department_info" :key="index">{{ item.name }}<span v-if="workDetailData.department_info.length - 1 > index">,</span></span>
+							</div>
+							<div class="content_text"  v-if="workDetailData.employee_info.length > 0">
+								<div class="fontColorC">指定人员</div>
+								<span v-for="(item, index) in workDetailData.employee_info" :key="index">
+									{{ item.name }}
+									<span v-if="workDetailData.employee_info.length - 1 > index">,</span>
+								</span>
+							</div>
 						</div>
 						<div class="content_text" v-else>全公司</div>
 					</li>
@@ -117,6 +130,7 @@
 						</div>
 					</li>
 				</ul>
+				
 				<div v-show="workDetailData.point_config && workDetailData.point_config.item_info">
 					<p class="row_title">规则依据</p>
 					<el-row :gutter="10" v-if="workDetailData.point_config.rule_info">
@@ -138,7 +152,45 @@
 					</el-row>
 				</div>
 			</div>
+			<div style="height: 60px;border-top: 1px #efefef solid;padding: 0 20px;text-align: right">
+				<el-button style="margin-top: 8px;" :disabled="loading" type="primary" @click="activeTask" v-if="workDetailData.composite_state==1&&userInfo.id!=workDetailData.owner_id&&!userInfo.is_creator">抢任务</el-button>
+			</div>
 		</el-drawer>
+		<!-- 对齐我的目标详情 -->
+		<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>
 
@@ -162,20 +214,48 @@ export default {
 	data() {
 		return {
 			Delay_to_open: false, //打开抽屉
-
 			loading: false,
 			workDetailData: {
 				point_config: { base_point: '' }
-			}
+			},
+			userInfo:this.$getUserData(),
+			isShowTable:false,
+			tableList:[],
 		};
 	},
-	components: {},
-	watch: {},
+	computed:{
+		returnNum(){
+			let num=0
+			this.tableList.forEach(item=>{
+				if(item.status==2||item.status==4){
+				   num++
+				}
+			})
+			return num
+		}
+	},
 	mounted() {
 		this.getData();
 		this.Delay_to_open = this.visible; //更换打开抽屉时机,避免打开两次
 	},
 	methods: {
+		activeTask(){
+			this.$axios('post', '/api/integral/task/exist',{task_id:this.id}).then(res => {
+				let exist=res.data.data.exist
+				if(exist){
+					this.$message.warning("你已经抢到该任务了,请前往【我抢到的】查看")
+				}else{
+					this.collectTask()
+				}
+			})
+		},
+		// 领取任务
+		collectTask() {
+			this.$axios('POST', '/api/integral/task', { task_id: this.id }).then(res => {
+				this.$message.success('抢单成功!');
+				this.getData();
+			})
+		},
 		// 关闭弹窗
 		handleClose() {
 			this.$emit('update:visible', false);
@@ -186,9 +266,7 @@ export default {
 			let data = { task_id: this.id };
 			this.$axios('get', '/api/integral/task', data).then(res => {
 				this.workDetailData = res.data.data;
-				if('2023-07-25 18:00' > '2023-07-25 17:00'){
-					console.log("123")
-				}
+				this.tableList=res.data.data.works
 			}).finally(() => {
 				this.loading = false;
 			});
@@ -215,8 +293,8 @@ export default {
 		margin-bottom: 10px;
 	}
 	& ul {
+		border-top: 1px solid #f1f1f1;
 		padding: 12px 0;
-		border-bottom: 1px solid #f1f1f1;
 		& li {
 			padding: 6px 0;
 		}
@@ -232,7 +310,7 @@ export default {
 }
 .details_content {
 	padding: 20px;
-	height: calc(100vh - 60px);
+	height: calc(100vh - 120px);
 	overflow: auto;
 	.row_title {
 		position: relative;
@@ -259,7 +337,9 @@ export default {
 }
 .details_title {
 	font-size: 18px;
-	padding: 20px;
+	height: 60px;
+	line-height: 60px;
+	padding: 0 20px;
 	border-bottom: 1px #efefef solid;
 }
 </style>

+ 113 - 8
src/views/common/taskDetailsPopup.vue

@@ -2,7 +2,10 @@
 	<div>
 		<!-- 任务详情弹窗 -->
 		<el-drawer :visible.sync="Delay_to_open" :with-header="false" :size="'500px'" :before-close="handleClose" :custom-class="'drawer_details'">
-			<div class="details_title">{{ title }}</div>
+			<div class="details_title flex-box-ce">
+				<span class="flex-1">{{ title }}</span>
+				<!-- <span><el-button type="primary" v-if="  workDetailData.status==1" size="small" @click.stop="completeBtn()">完成</el-button></span> -->
+			</div>
 			<div class="details_content" v-if="workDetailData" v-loading="loading">
 				<div class="flex-box flex-v-ce">
 					<userImage class="user_img person_imghead" width="46px" height="46px" :user_name="workDetailData.employee_name" :img_url="workDetailData.img_url"></userImage>
@@ -277,6 +280,38 @@
 				<el-button type="primary" @click="integralSend('integral')">完成</el-button>
 			</span>
 		</el-dialog>
+	
+		<el-dialog title="完成任务" :visible.sync="completeShow"  :close-on-click-modal="false" destroy-on-close width="50%">
+			<el-form :model="detail_form" ref="detail_form" label-width="80px">
+				<el-form-item label="任务备注" prop="remark" :rules="[{ required: true, message: '请填写任务备注(限200字)', trigger: 'blur' }]">
+					<el-input v-model="detail_form.remark" type="textarea" :rows="4"  maxlength="200" show-word-limit></el-input>
+				</el-form-item>
+				<el-form-item label="图片">
+					<upload
+						:headers="Xtoken"
+						class="avatar-uploader"
+						:action="'https://' + 'integralsys.oss-cn-shenzhen.aliyuncs.com'"
+						:show-file-list="true"
+						:file-list="detail_form.fileList"
+						:on-success="handleFilesSuccess"
+						:on-preview="onFilePreView"
+						:before-upload="beforeUpload"
+						:on-remove="onFileRemove"
+						:limit="3"
+						accept="image/jpeg,image/png"
+						:multiple="true"
+						ref="clearPicture"
+					>
+						<el-button size="small" type="primary">点击上传</el-button>
+						(最多选择3张)
+					</upload>
+				</el-form-item>
+			</el-form>
+			<div class="flex-box-end">
+				<el-button @click="resetForm('detail_form')">取消</el-button>
+				<el-button type="primary" @click="onSubmit('detail_form')">提交</el-button>
+			</div>
+		</el-dialog>
 	</div>
 </template>
 
@@ -294,9 +329,10 @@ const validatorNoZero = (rule, value, callback) => {
 	}
 };
 import examinePopup from '@/components/examinePopup.vue';
+import upload from '@/components/upload';
 export default {
 	name: 'taskDetailsPopup',
-	components: { examinePopup },
+	components: { examinePopup,upload },
 	props: {
 		title: {
 			type: String,
@@ -367,7 +403,16 @@ export default {
 			keepTheScore: false,
 			employeeMe: {},
 			detailShow: false,
-			detail_id: 0
+			detail_id: 0,
+			detail_form: {
+				id: '',
+				remark: '',
+				fileList: [],
+				files: [],
+			},
+			completeShow:false,
+			//图片附件
+			Xtoken: { 'X-Token': this.$getToken() },
 		};
 	},
 	mounted() {
@@ -378,6 +423,70 @@ export default {
 		});
 	},
 	methods: {
+		//提交完成任务
+		onSubmit(formName) {
+			this.$refs[formName].validate(valid => {
+				if (valid) {
+					let data = {
+						work_id: this.detail_form.id,
+						progress: '100',
+						remark: this.detail_form.remark,
+						state: '1',
+						files: this.detail_form.files
+					};
+					this.$axios('post', '/api/integral/work', data).then(res => {
+						this.$message.success(res.data.msg);
+						this.resetForm(formName);
+						this.getData();
+					});
+				}
+			});
+		},
+		//重置表单
+		resetForm(formName) {
+			this.$refs[formName].resetFields();
+			this.completeShow = false;
+			this.detail_form.fileList = []
+			this.detail_form.files = []
+		},
+		handleFilesSuccess(response, file, fileList) {
+			let fileListData=fileList.filter(e=>{
+			  return e.url
+			})
+			this.fileFun(file, fileList)
+		},
+		onFilePreView(file) {
+			if (file.response) {
+				window.open(file.response.url, '_blank');
+			}
+		},
+		onFileRemove(file, fileList) {
+			this.fileFun(file, fileList)
+		},
+		fileFun(file, fileList){
+			this.detail_form.fileList = fileList;
+			this.detail_form.files = []
+			fileList.forEach((item, index) => {
+				this.detail_form.files.push(item.url);
+			});
+		},
+		// 附件上传
+		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;
+		},
+		// 点击完成
+		completeBtn() {
+			this.detail_form.id = this.workDetailData.id;
+			this.completeShow = true;
+		},
 		openDetail(item) {
 			this.detailShow = true;
 			this.detail_id = item.id;
@@ -521,10 +630,6 @@ export default {
 		handleClose() {
 			this.$emit('update:visible', false);
 		},
-		// 删除
-		delItem() {
-			console.log('删除');
-		},
 		// 获取数据
 		getData() {
 			this.loading = true;
@@ -689,7 +794,7 @@ export default {
 }
 .details_title {
 	font-size: 18px;
-	padding: 20px;
+	padding: 18px 20px;
 	border-bottom: 1px #efefef solid;
 }
 .d_name {

+ 12 - 6
src/views/common/temporaryTask.vue

@@ -1,6 +1,6 @@
 <template>
 	<div>
-		<!-- 临时任务弹窗 -->
+		<!-- 指派任务弹窗 -->
 		<el-dialog :title="showTitle" :visible.sync="dialogVisible" :close-on-click-modal="false" :before-close="closeDialog" width="700px" top="3%">
 			<div>
 				<div class="orange" style="text-align: center;padding-bottom: 10px;" v-if="config.event_review_status&&config.event_task_review">复核开启后,积分需管理员复核后才计入排名和统计</div>
@@ -109,7 +109,7 @@
 								v-if="show_reviewer_selector"
 								ref="members1"
 								:isChecKedAll="false"
-								:use_Administrator_list="true"
+								:user_Administrator_list="true"
 								:multi="false"
 								:selected="reviewer_selected"
 								@confirm="reviewer_confirm"
@@ -656,6 +656,7 @@ export default {
 					}
 				} else {
 					this.$message.warning(codes + '不为0时,' + code + '上限不能为空');
+					// this.$message.warning(`设置${codes}时,需同时设置每天${code}及${code}上限`);
 					return true;
 				}
 			}
@@ -683,17 +684,18 @@ export default {
 			}
 
 			if (!data.ahead_award_point && data.ahead_award_point_limit) {
-				this.$message.warning('奖分上限不为0时每日奖分不能为空');
+				// this.$message.warning('奖分上限不为0时每日奖分不能为空');
+				this.$message.warning('设置提前奖分时,需同时设置每天奖分及奖分上限');
 				return;
 			} else if (data.ahead_award_point && !data.ahead_award_point_limit) {
-				this.$message.warning('每日奖分不为0时奖分上限不能为空');
+				this.$message.warning('设置提前奖分时,需同时设置每天奖分及奖分上限');
 				return;
 			}
 			if (!data.timeout_deduction_point && data.timeout_deduction_point_limit) {
-				this.$message.warning('扣分上限不为0时每日扣分不能为空');
+				this.$message.warning('设置逾期扣分时,需同时设置每天扣分及扣分上限');
 				return;
 			} else if (data.timeout_deduction_point && !data.timeout_deduction_point_limit) {
-				this.$message.warning('每日扣分不为0时扣分上限不能为空');
+				this.$message.warning('设置逾期扣分时,需同时设置每天扣分及扣分上限');
 				return;
 			}
 			if (this.ahead_timeout(data.ahead_award_point, data.ahead_award_point_limit, '提前奖分', '奖分')) return;
@@ -723,6 +725,10 @@ export default {
 			}else if(this.formData.task_cycle==3&&this.formData.task_expire_day<=moment().format('D')){
 				is=false  
 			}
+			if(data.base_point<=0){
+				this.$message.warning('任务积分必须大于0,请调整后再发布');
+				return;
+			}
 			this.taskload = true;
 			this.$axios('post', this.formData.task_cycle == 0 ? '/api/integral/work/publish' : '/api/integral/schedule/publish/work', data).then(res => {
 				let msg=res.data.msg;

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

@@ -1,6 +1,6 @@
 <template>
 	<div>
-		<!-- 临时任务弹窗 -->
+		<!-- 指派任务弹窗 -->
 		<el-dialog :title="showTitle" :visible.sync="dialogVisible" :close-on-click-modal="false" :before-close="closeDialog" width="700px" top="5%">
 			<div>
 				<div class="orange" style="text-align: center;padding-bottom: 10px;" v-if="config.event_review_status&&config.event_task_review">复核开启后,积分需管理员复核后才计入排名和统计</div>
@@ -106,7 +106,7 @@
 								:employee_list="reviewer_employee_list"
 								:user_no_select="true"
 								:multi="false"
-								:use_Administrator_list="true"
+								:user_Administrator_list="true"
 								:selected="reviewer_selected"
 								@confirm="reviewer_confirm"
 							/>
@@ -433,7 +433,7 @@ export default {
 			this.formData.id = this.modifyData.id;
 			this.formData.task_name = this.modifyData.task_name;
 			this.formData.range_type = 0;
-			this.formData.base_point = this.modifyData.point_config.base_point;
+			
 			// this.formData.task_remark = this.modifyData.task_remark;
 			this.formData.pt_id = this.modifyData.pt_id;
 			this.formData.expire_time = this.modifyData.expire_time;
@@ -472,6 +472,7 @@ export default {
 			this.$nextTick(()=>{
 				this.$nextTick(()=>{
 					this.formData.task_remark = this.modifyData.task_remark;
+					this.formData.base_point = this.modifyData.point_config.base_point;
 				})
 			})
 			let add = ['ahead_award_point', 'ahead_award_point_limit', 'timeout_deduction_point', 'timeout_deduction_point_limit']
@@ -540,8 +541,9 @@ export default {
 						return true
 					}
 				}else{
-					this.$message.warning( codes + '不为0时,'+ code +'上限不能为空')
-					return true
+					this.$message.warning(codes + '不为0时,' + code + '上限不能为空');
+					// this.$message.warning(`设置${codes}时,需同时设置每天${code}及${code}上限`);
+					return true;
 				}
 			}
 		},
@@ -557,17 +559,18 @@ export default {
 			}
 			
 			if(!data.ahead_award_point && data.ahead_award_point_limit){
-				this.$message.warning('奖分上限不为0时每日奖分不能为空')
+				// this.$message.warning('奖分上限不为0时每日奖分不能为空');
+				this.$message.warning('设置提前奖分时,需同时设置每天奖分及奖分上限');
 				return
 			}else if(data.ahead_award_point && !data.ahead_award_point_limit){
-				this.$message.warning('每日奖分不为0时奖分上限不能为空')
+				this.$message.warning('设置提前奖分时,需同时设置每天奖分及奖分上限')
 				return
 			}
 			if(!data.timeout_deduction_point && data.timeout_deduction_point_limit){
-				this.$message.warning('扣分上限不为0时每日扣分不能为空')
+				this.$message.warning('设置逾期扣分时,需同时设置每天扣分及扣分上限');
 				return
 			}else if(data.timeout_deduction_point && !data.timeout_deduction_point_limit){
-				this.$message.warning('每日扣分不为0时扣分上限不能为空')
+				this.$message.warning('设置逾期扣分时,需同时设置每天扣分及扣分上限')
 				return
 			}
 			if(this.ahead_timeout(data.ahead_award_point,data.ahead_award_point_limit,'提前奖分','奖分')) return
@@ -589,6 +592,10 @@ export default {
 			add.forEach(item =>{
 				this.deletedata(data,item)
 			})
+			if(data.base_point<=0){
+				this.$message.warning('任务积分必须大于0,请调整后再发布');
+				return;
+			}
 			this.taskload = true;
 			self.$axios('post', '/api/integral/work/update', data)
 				.then(res => {

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

@@ -151,7 +151,7 @@
 	</div>
 </template>
 <script>
-
+import moment from 'moment' // 时间库
 export default {
 	data() {
 		return {
@@ -167,6 +167,8 @@ export default {
 			event_type: [
 				{ id: 0, name: '总分' },
 				{ id: 1, name: '迟到' },
+				{ id: 23, name: '严重迟到' },
+				{ id: 27, name: '旷工迟到' },
 				{ id: 2, name: '早退' },
 				{ id: 6, name: '准时打卡' },
 				{ id: 20, name: '上班缺卡' },
@@ -215,11 +217,7 @@ export default {
 					{
 						text: '本周',
 						onClick(picker) {
-							const now = new Date();
-							const start = new Date();
-							start.setTime(now.getTime() - (now.getDay() - 1) * 24 * 60 * 60 * 1000);
-							now.setTime(start.getTime() + 6 * 24 * 60 * 60 * 1000 - 1000);
-							picker.$emit('pick', [start, now]);
+							picker.$emit('pick', [moment().startOf('isoWeek').format('YYYY-MM-DD'),moment().endOf('isoWeek').format('YYYY-MM-DD')]);
 						}
 					},
 					{

+ 10 - 12
src/views/ranking/dept_rank.vue

@@ -156,6 +156,7 @@
 				></el-pagination>
 			</center>
 		</div>
+		
 		<!-- 导出弹窗 -->
 		<el-dialog title="导出排名" :visible.sync="dialogVisible" width="730px" top="3%">
 			<div style="font-size:15px;margin-bottom:10px;font-weight: 600;">系统将按以下已选条件导出对应的排名报表</div>
@@ -339,10 +340,7 @@ export default {
 					{
 						text: '本周',
 						onClick(picker) {
-							const now = new Date(new Date().toLocaleDateString());
-							const start = now.getTime() - (now.getDay() - 1) * 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().startOf('isoWeek').format('YYYY-MM-DD'),moment().endOf('isoWeek').format('YYYY-MM-DD')]);
 						}
 					},
 					{
@@ -378,14 +376,14 @@ export default {
                    	  	this.pickerMinDate = new Date(obj.minDate).getTime();
 					}
                 },
-				disabledDate : time => {
-                    if (this.pickerMinDate && !this.dialogVisible) {
-                        const day1 =  30 * 24 * 3600 * 1000//限制只能选一个月的范围区间
-                        let maxTime = this.pickerMinDate + day1
-                        let minTime = this.pickerMinDate - day1
-                        return time.getTime() > maxTime || time.getTime()<minTime
-                    }
-				}
+				// disabledDate : time => {
+    //                 if (this.pickerMinDate && !this.dialogVisible) {
+    //                     const day1 =  30 * 24 * 3600 * 1000//限制只能选一个月的范围区间
+    //                     let maxTime = this.pickerMinDate + day1
+    //                     let minTime = this.pickerMinDate - day1
+    //                     return time.getTime() > maxTime || time.getTime()<minTime
+    //                 }
+				// }
 			},
 		};
 	},

+ 3 - 3
src/views/ranking/each_rank.vue

@@ -2,13 +2,13 @@
   <div style="background-color: #fff;padding: 20px;" class="boxMinHeight">
     <el-tabs v-model="activeName" @tab-click="handleClick">
       <el-tab-pane label="考勤分" name="1">
-        <attendance_rating></attendance_rating>
+        <attendance_rating v-if="activeName==1"></attendance_rating>
       </el-tab-pane>
       <el-tab-pane label="日志分" name="2">
-        <log_rank :isEntrance="true"></log_rank>
+        <log_rank :isEntrance="true" v-if="activeName==2"></log_rank>
       </el-tab-pane>
       <el-tab-pane label="任务分" name="3">
-        <task_rank></task_rank>
+        <task_rank v-if="activeName==3"></task_rank>
       </el-tab-pane>
     </el-tabs>
   </div>

+ 17 - 3
src/views/ranking/log_rank.vue

@@ -14,6 +14,7 @@
 							v-model="formData.month"
 							class="date-picker-width"
 							type="month"
+							:clearable="false"
 							value-format="yyyy-MM"
 							placeholder="选择月份排名"
 						></el-date-picker>
@@ -23,12 +24,14 @@
 							v-model="formData.year"
 							class="date-picker-width"
 							type="year"
+							:clearable="false"
 							value-format="yyyy"
 							placeholder="选择年份排名"
 						></el-date-picker>
 						<season v-if="time_type == '3'" style="display: inline-block" :isActive="true" class="date-picker-width" @confirm="export_quarter_confirm"></season>
 						<el-date-picker
 							size="medium"
+							:clearable="false"
 							v-show="time_type == '4'"
 							class="date-picker-width"
 							v-model="formData.time_range"
@@ -203,6 +206,11 @@ export default {
 			this.formData.page = 1;
 			this.get_list();
 		},
+		'Dc_Data.dept_name'(){
+			this.$nextTick(() => {
+				this.$refs.dept2.dropDownVisible = false;
+			});
+		},
 		sort(val) {
 			if (val) {
 				this.formData.sort = 'ASC';
@@ -384,11 +392,17 @@ export default {
 				rule_id:this.formData.rule_id,
 			};
 			if (this.time_type == 1) {
-				data.month = this.formData.month;
+				if(this.formData.month){
+					data.month = this.formData.month;
+				}
 			} else if (this.time_type == 2) {
-				data.year = this.formData.year;
+				if(this.formData.year){
+					data.year = this.formData.year;
+				}
 			} else if (this.time_type == 3) {
-				data.quarter = this.formData.quarter;
+				if(this.formData.quarter){
+					data.quarter = this.formData.quarter;
+				}
 			} else if (this.time_type == 4) {
 				data.start_date = this.formData.time_range[0];
 				data.end_date = this.formData.time_range[1];

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

@@ -45,14 +45,13 @@
 							</div>
 						</div>
 					</FormBox>
-					<div style="margin: 10px 0;" class="flex-box-ce">
+					<div style="margin: 10px 0;" class="flex-box-ce" v-loading="loading2">
 						<downloadexcel
-							v-if="exportExcelArr.length>0"
 							:fetch="returnArr"
 							 name="管理者奖扣列表.xls"
 							:fields="json_fields"
 							>
-							<el-button type="primary" plain size="medium" style="margin-right: 10px;">导出报表</el-button>
+							<el-button type="primary" plain size="medium" :disabled="exportExcelArr.length==0" style="margin-right: 10px;">导出报表</el-button>
 						</downloadexcel>
 						<el-checkbox v-model="allPass" size="medium" label="只看全部达标的" border></el-checkbox>
 					</div>

+ 17 - 3
src/views/ranking/task_rank.vue

@@ -14,6 +14,7 @@
 							v-model="formData.month"
 							class="date-picker-width"
 							type="month"
+							:clearable="false"
 							value-format="yyyy-MM"
 							placeholder="选择月份排名"
 						></el-date-picker>
@@ -23,6 +24,7 @@
 							v-model="formData.year"
 							class="date-picker-width"
 							type="year"
+							:clearable="false"
 							value-format="yyyy"
 							placeholder="选择年份排名"
 						></el-date-picker>
@@ -33,6 +35,7 @@
 							class="date-picker-width"
 							v-model="formData.time_range"
 							type="daterange"
+							:clearable="false"
 							format="yyyy 年 MM 月 dd 日"
 							value-format="yyyy-MM-dd"
 							range-separator="至"
@@ -222,6 +225,11 @@ export default {
 			this.formData.page = 1;
 			this.get_list();
 		},
+		'Dc_Data.dept_name'(){
+			this.$nextTick(() => {
+				this.$refs.dept2.dropDownVisible = false;
+			});
+		},
 		sort(val) {
 			if (val) {
 				this.formData.sort = 'ASC';
@@ -402,11 +410,17 @@ export default {
 				rule_id:this.formData.rule_id,
 			};
 			if (this.time_type == 1) {
-				data.month = this.formData.month;
+				if(this.formData.month){
+					data.month = this.formData.month;
+				}
 			} else if (this.time_type == 2) {
-				data.year = this.formData.year;
+				if(this.formData.year){
+					data.year = this.formData.year;
+				}
 			} else if (this.time_type == 3) {
-				data.quarter = this.formData.quarter;
+				if(this.formData.quarter){
+					data.quarter = this.formData.quarter;
+				}
 			} else if (this.time_type == 4) {
 				data.start_date = this.formData.time_range[0];
 				data.end_date = this.formData.time_range[1];

+ 5 - 0
src/views/ranking/total_rank.vue

@@ -157,6 +157,11 @@ export default {
 			this.formData.page = 1;
 			this.get_list();
 		},
+		'Dc_Data.dept_name'(){
+			this.$nextTick(() => {
+				this.$refs.dept2.dropDownVisible = false;
+			});
+		},
 		dept_name(val) {
 			if (val.length !== 0) {
 				this.formData.dept_id = val[val.length - 1];

+ 68 - 49
src/views/set/check.vue

@@ -27,7 +27,7 @@ export default {
 	  ding_enable:true,
       initia_head: {
         initial_suername: "考勤积分",
-        initial_suertext: "以下考勤扣分,均为B分",
+        initial_suertext: "以下考勤扣分,均为B分",
         initial_left: "167px",
         initial_width: "165px",
       },
@@ -40,13 +40,6 @@ export default {
 			  age: "0",
 			},
 		  },
-        // {
-        //   initialName: "月度全勤,每月加分",
-        //   initia_mark: false,
-        //   initia_input: {
-        //     age: "0",
-        //   },
-        // },
         {
           initialName: "正常打卡,每次加分",
           initia_mark: false,
@@ -70,11 +63,28 @@ export default {
 		},
         {
           initialName: "上班迟到,每次扣分",
+		  message:'不包含严重迟到、旷工迟到',
           initia_mark: false,
           initia_input: {
             age: "0",
           },
         },
+		
+		{
+		  initialName: "严重迟到,每次扣分",
+		  initia_mark: false,
+		  initia_input: {
+		    age: "0",
+		  },
+		},
+		{
+		  initialName: "旷工迟到,每次扣分",
+		  initia_mark: false,
+		  initia_input: {
+		    age: "0",
+		  },
+		},
+
         {
           initialName: "下班早退,每次扣分",
           initia_mark: false,
@@ -82,13 +92,6 @@ export default {
             age: "0",
           },
         },
-        // {
-        //   initialName: "加班,每小时加分",
-        //   initia_mark: false,
-        //   initia_input: {
-        //     age: "0",
-        //   },
-        // },
 		{
 		  initialName: "加班加分",
 		  initia_mark: false,
@@ -97,14 +100,6 @@ export default {
 		    age: "0",
 		  },
 		},
-        // {
-        //   initialName: "请假,每小时扣分",
-        //   initia_mark: false,
-        //   initia_input: {
-        //     age: "0",
-        //   },
-		// },
-		
 		{
 		  initialName: "月度全勤加分",
 		  initia_mark: false,
@@ -123,7 +118,9 @@ export default {
 		  },
 		  absent_late:{
 			enable:0,
-			count:1
+			count:1,
+			serious_late_count:1,
+			absent_late_count:1,
 		  },
 		},
       ],
@@ -143,28 +140,40 @@ export default {
     };
   },
   mounted() {
-    this.cheak_ax();
+    this.getData();
   },
   methods: {
     initia(obj) {
+	  console.log(obj);
+	  // return false
+		
 	  let ok=obj.arr;
       var objs = {};
-	  objs.enable = ok[0].sj; 
-      objs.normal = ok[1].sj; //>=0
-	  objs.no_sign = ok[2].sj>0? ok[2].sj:ok[2].sj; //<=0
-	  objs.absent = ok[3].sj>0? ok[3].sj:ok[3].sj; //<=0
-	  objs.on_duty_late = ok[4].sj>0? ok[4].sj:ok[4].sj; //<=0
-	  objs.off_duty_early = ok[5].sj>0? ok[5].sj:ok[5].sj; //<=0
-	  objs.ot_per_day =ok[6].sj; //>=0
-	  objs.month_full_ad = ok[7].sj
+	  objs.enable = ok[0].sj; //是否启用考勤设置
+
+      objs.normal = ok[1].sj; //正常打卡加分
+	  objs.no_sign = ok[2].sj; //缺卡扣分
+	  objs.absent = ok[3].sj; //旷工扣分
+	  objs.on_duty_late = ok[4].sj; //迟到扣分
+	  
+	  objs.serious_late = ok[5].sj; //严重迟到,每次扣分
+	  objs.absenteeism_late = ok[6].sj; //矿工迟到,每次扣分
+	  
+	  objs.off_duty_early = ok[7].sj;//早退扣分
+	  objs.ot_per_day =ok[8].sj; //每加班满一天加分 
+	  objs.month_full_ad = ok[9].sj //月度全勤加分
+	  
+	  
+	  //全勤加分需同时满足以下条件
 	  let {absent_late,absent_holiday}=obj.checkAllData;
 	  objs.absent_late=absent_late;
+	  
 	  objs.absent_holiday=absent_holiday;
-	  // if(absent_holiday.list.length==0){
-		 //  objs.absent_holiday.list="";
-	  // }
-	  if(absent_late.enable==1&&(absent_late.count==='0'||absent_late.count===0)){
-		  this.$message.error("'当月迟到少于次数'不能为0")
+	  if(absent_late.enable==1
+		&&(absent_late.count==0||!absent_late.count)
+		&&(absent_late.serious_late_count==0||!absent_late.serious_late_count)
+		&&(absent_late.absent_late_count==0||!absent_late.absent_late_count)){
+		  this.$message.error("月度全勤加分的三种“迟到少于次数”至少要有一个值不能为0或空")
 		  return
 	  }
       this.$axios('post',"/api/ad/update",objs).then((res) => {
@@ -178,7 +187,7 @@ export default {
 			this.loading = false;
 		});
     },
-    cheak_ax() {
+    getData() {
       this.loading = true;
       this.$axios('get',"/api/ad/info").then((res) => {
         var arr = [],config=res.data.data;
@@ -191,18 +200,28 @@ export default {
 		this.initia_arr[2].initia_input.age =config.no_sign? config.no_sign:0 //缺卡扣分
 		this.initia_arr[3].initia_input.age =config.absent? config.absent:0 //旷工扣分
 		this.initia_arr[4].initia_input.age =config.on_duty_late? config.on_duty_late:0 //迟到扣分
-		this.initia_arr[5].initia_input.age =config.off_duty_early? config.off_duty_early:0 //早退扣分
-		// this.initia_arr[7].initia_input.age =config.ot_per_hour? config.ot_per_hour:0 //每小时加班加分 
-		this.initia_arr[6].initia_input.age =config.ot_per_day? config.ot_per_day:0 //每加班满一天加分 
-		// this.initia_arr[8].initia_input.age =config.leave_per_hour? config.leave_per_hour:0 //每小时请假扣分
-		this.initia_arr[7].initia_input.age =config.month_full_ad? config.month_full_ad:0  //月度全勤加分
+		
+		
+		this.initia_arr[5].initia_input.age =config.serious_late? config.serious_late:0 //严重迟到,每次扣分
+		this.initia_arr[6].initia_input.age =config.absenteeism_late? config.absenteeism_late:0 //矿工迟到,每次扣分
+		
+		
+		this.initia_arr[7].initia_input.age =config.off_duty_early? config.off_duty_early:0 //早退扣分
+		this.initia_arr[8].initia_input.age =config.ot_per_day? config.ot_per_day:0 //每加班满一天加分 
+		this.initia_arr[9].initia_input.age =config.month_full_ad? config.month_full_ad:0  //月度全勤加分
 		
 		// 全勤配置
-		this.initia_arr[8].absent_holiday =config.absent_holiday
-		// this.initia_arr[8].absent_holiday.val1 =config.absent_holiday.list[0]
-		// this.initia_arr[8].absent_holiday.val2 =config.absent_holiday.list[1]
-		// this.initia_arr[8].absent_holiday.val3 =config.absent_holiday.list[2]
-		this.initia_arr[8].absent_late = config.absent_late 
+		this.initia_arr[10].absent_holiday =config.absent_holiday
+		this.initia_arr[10].absent_late = config.absent_late 
+		
+		
+		// this.initia_arr[5].initia_input.age =config.off_duty_early? config.off_duty_early:0 //早退扣分
+		// this.initia_arr[6].initia_input.age =config.ot_per_day? config.ot_per_day:0 //每加班满一天加分 
+		// this.initia_arr[7].initia_input.age =config.month_full_ad? config.month_full_ad:0  //月度全勤加分
+		
+		// // 全勤配置
+		// this.initia_arr[8].absent_holiday =config.absent_holiday
+		// this.initia_arr[8].absent_late = config.absent_late 
       }).finally(err=>{
 			this.loading = false;
 	  });

+ 83 - 23
src/views/set/framework.vue

@@ -216,8 +216,9 @@
 		</el-dialog>
 		
 		<!-- 事项转交 -->
-		<el-dialog class="dialog" :title="'事项转交 ('+selectUserName+')'" :visible.sync="isShowZj" top="10vh" width="700px" :before-close="handleClose">
+		<el-dialog class="dialog" :visible.sync="isShowZj" top="10vh" width="700px" :before-close="handleClose">
 			<div>
+			  <div style="margin-top: 10px;" v-if="selectUserName">事项转交({{selectUserName}})</div>
 			  <el-tabs v-model="activeName">
 				<el-tab-pane label="待完成任务" name="first"></el-tab-pane>
 				<el-tab-pane label="待审批事项" name="second"></el-tab-pane>
@@ -236,12 +237,7 @@
 					  	<el-table-column label="任务内容" prop="task_name">
 					  		<template slot-scope="scope"><span class="font-flex-word" style="max-width: 400px;">{{ scope.row.task_name }}</span></template>
 					  	</el-table-column>
-<!-- 					  	<el-table-column label="积分" width="80px">
-					  		<template slot-scope="scope">
-					  			<span class="red" v-if="scope.row.point_config.base_point > 0">+{{ scope.row.point_config.base_point }} {{ scope.row.pt_name }}</span>
-					  			<span class="green" v-else>{{ scope.row.point_config.base_point }} {{ scope.row.pt_name }}</span>
-					  		</template>
-					  	</el-table-column> -->
+
 					  	<el-table-column label="操作" width="120px">
 					  		<template slot-scope="scope">
 								<el-link type="primary" style="padding-right: 10px;" :underline="false" @click.stop="openDetail(scope.row)" class="blue">查看任务</el-link>
@@ -401,6 +397,31 @@
 		    <el-button type="primary" @click="savecomtheResults()">确 定</el-button>
 		  </span>
 		</el-dialog>
+		<!-- 人员同步 -->
+		<el-dialog title="钉钉通讯录同步" :visible.sync="isShowTb" top="30vh" width="600px" :before-close="handleClose">
+			<div style="margin-left:20px;">
+				<el-radio :style="{marginBottom:index==0?'70px':'30px'}" v-for="(item, index) in tbList" :key="index" v-model="selectTbIndex" :label="item.id">
+					<span style="font-size:17px;font-weight: 600;" class="black">{{ item.name }}</span>
+					<div style="font-size:13px;padding-left: 24px;padding-top: 5px;" class="fontColorC">{{ item.kam }}</div>
+				</el-radio>
+				<el-cascader
+					size="medium"
+					style="width: 300px;position: relative;left: 20px;top: -196px;"
+					v-model="dept_name"
+					@change="handleChange"
+					:options="dept_tree"
+					collapse-tags
+					:props="{checkStrictly: true, value: 'id', label: 'name', multiple: true, children: '_child' }"
+					ref="dept"
+					clearable
+					placeholder="请选择部门"
+				></el-cascader>
+			</div>
+			<span slot="footer" class="dialog-footer">
+				<el-button @click="isShowTb = false">取 消</el-button>
+				<el-button type="primary" @click="tb(true)" :disabled="rangLoad">确 定</el-button>
+			</span>
+		</el-dialog>
 	</div>
 </template>
 
@@ -511,6 +532,18 @@ export default {
 			selectId:0,
 			employee_map:[],
 			taskType:1,
+			
+			// 人员同步
+			isShowTb:false,
+			selectTbIndex:1,
+			tbList: [
+				{ id: 1, name: '仅同步指定部门内的人员信息(可多选)', kam: '该选择不会包含子部门人员,请确保选中需要同步的人员的直属部门' },
+				{ id: 2, name: '仅同步部门信息和上下级关系', kam: '仅同步所有部门名称和上下级所属关系,但不同步人员信息' },
+				{ id: 3, name: '同步全部部门和人员信息 ', kam: '同步全部信息所需时间较长,请关注同步成功后推送的工作通知' },
+			],
+			dept_tree:[],
+			dept_name: [],
+			dept_ids:[],
 		};
 	},
 	components: {
@@ -564,7 +597,6 @@ export default {
 			this.perPage3= 10;
 			this.total3= 0;
 			this.keyName='';
-			// this.taskType=1;
 			this.$nextTick(()=>{
 				if(val=='first'){
 					if(this.taskType==1){
@@ -586,6 +618,12 @@ export default {
 			}else{
 				this.getTaskList2();
 			}
+		},
+		isShowTb(val){
+			if(val){
+				this.dept_name=[];
+				this.dept_ids=[];
+			}
 		}
 	},
 	created() {
@@ -606,6 +644,31 @@ export default {
 		});
 	},
 	methods: {
+		// 递归判断列表,把最后的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;
+		},
+		handleChange(val) {
+			if (val.length !== 0) {
+				let dept_ids=[];
+				val.forEach((item)=>{
+					dept_ids.push(item[item.length-1]);
+				})
+				let set =new Set(dept_ids);
+				this.dept_ids=[...set]
+			} else {
+				this.dept_ids=[];
+			}
+		},
 		//获取员工列表
 		getEmployeeList() {
 			this.$axios('get', '/api/employee/index', { dept_id: 0, keywords: '', page: 1, page_size: 3000, is_official: 1 })
@@ -1020,7 +1083,11 @@ export default {
 			done();
 		},
 		//同步信息
-		tb() {
+		tb(is) {
+			// if(!is){
+			// 	this.isShowTb=true;
+			// 	return false
+			// }
 			this.$confirm('即将同步钉钉通讯录的人员名单,确定同步吗?', '提示', {
 				confirmButtonText: '确定',
 				cancelButtonText: '取消',
@@ -1084,7 +1151,7 @@ export default {
 			this.ruleDeprt = true;
 			this.$axios('get', '/api/site/info').then(res => {
 				this.info = res.data.data;
-				this.getDepartment(is);
+				this.getDepartment();
 			});
 		},
 		//选择员工
@@ -1103,20 +1170,13 @@ 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.$axios('get', '/api/department/tree').then(res => {
+					var list = [{id: 0,name: this.info.name,_child: res.data.data.list}];
 					this.bmList = list;
-				})
-				.finally(() => {
-					this.ruleDeprt = false;
-				});
+					this.dept_tree = this.getTreeData(res.data.data.list);
+			}).finally(() => {
+				this.ruleDeprt = false;
+			});
 		},
 		//获取员工
 		getEmployee() {

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 443 - 247
src/views/set/rule.vue


+ 103 - 0
src/views/set/rule2.vue

@@ -0,0 +1,103 @@
+<template>
+	<div class="all-box">
+		<transition-group name="drag" tag="div">
+				<div class="item" v-for="(item, i) in list" :key="item.id" draggable="true"
+					@dragstart="dragstart($event, i)" @dragenter="dragenter($event, i)" @dragend="dragend"
+					@dragover="dragover">
+					{{ item.name }}
+				</div>
+		</transition-group>
+	</div>
+</template>
+
+<script>
+	import QRCode from 'qrcodejs2';
+	import toLead from '@/components/toLead';
+	import Rule from '@/components/Rule';
+	import {
+		_debounce
+	} from '@/api/auth';
+	export default {
+		data() {
+			return {
+				list: [{
+						name: 'a',
+						id: 1
+					},
+					{
+						name: 'b',
+						id: 2
+					},
+					{
+						name: 'c',
+						id: 3
+					},
+					{
+						name: 'd',
+						id: 4
+					},
+					{
+						name: 'e',
+						id: 5
+					},
+				],
+				dragIndex: 0
+			};
+		},
+		methods: {
+			dragstart(e, index) {
+				e.stopPropagation()
+				this.dragIndex = index
+				setTimeout(() => {
+					e.target.classList.add('moveing')
+				}, 0)
+			},
+			dragenter(e, index) {
+				e.preventDefault()
+				// 拖拽到原位置时不触发
+				if (this.dragIndex !== index) {
+					const source = this.list[this.dragIndex];
+					this.list.splice(this.dragIndex, 1);
+					this.list.splice(index, 0, source);
+
+					// 更新节点位置
+					this.dragIndex = index
+				}
+			},
+			dragover(e) {
+				e.preventDefault()
+				e.dataTransfer.dropEffect = 'move'
+			},
+			dragend(e) {
+				e.target.classList.remove('moveing')
+			},
+		}
+	};
+</script>
+
+<style scoped lang="scss">
+	.drag-move {
+		transition: transform .2s;
+	}
+
+	.item {
+		width: 200px;
+		height: 40px;
+		line-height: 40px;
+		// background-color: #f5f6f8;
+		background-color: skyblue;
+		text-align: center;
+		margin: 10px;
+		color: #fff;
+		font-size: 18px;
+	}
+
+	.container {
+		position: relative;
+		padding: 0;
+	}
+
+	.moveing {
+		opacity: 0;
+	}
+</style>

+ 21 - 5
src/views/set/screenSet.vue

@@ -1,5 +1,6 @@
 <template>
 	<div class="all-box">
+		
 		<div class="all" style="padding: 20px;">
 			<div class="flex-box-ce" style="padding: 30px 10px;">
 				<div class="flex-1">
@@ -273,7 +274,21 @@
 							</div>
 						</div>
 						<div class="kuai">
-							<div class="formTitle">今日积分数据设置</div>
+							<div class="formTitle">
+								今日积分数据设置
+								<el-tooltip effect="dark" placement="top">
+								  <template slot="content">
+									<div>
+										合并统计A分和B分数据<br />
+										● 今日奖分:仅统计奖分,不统计扣分<br />
+										● 今日人次:今日每有1条积分事件,记1人次(含奖分、扣分)<br />
+										● 仅统计事件发生时间是今日的数据<br />
+										● 仅统计复核通过的事件(未开复核的,系统会自动复核通过)
+									</div>
+								  </template>
+								  <span><i class="el-icon-warning fontColorC"></i></span>
+								</el-tooltip>
+							</div>
 							<div class="formBox">
 								<el-form-item label="部门">
 									<template slot="label">
@@ -302,11 +317,12 @@
 							<div class="formTitle">活跃度设置
 							  <el-tooltip effect="dark" placement="top">
 							    <template slot="content">
-									获得积分人员占比=获得积分的人数/参与积分的总人数</br>
-									执行奖扣管理人员占比=有执行奖扣的人/总管理者人数</br>
-									基准标尺为执行下限,要求活跃度在标尺之上执行才算执行到位
+									活跃度统计的积分包含A分和B分<br />
+									● 获得积分人员占比=获得积分的人数/参与积分的总人数<br />
+									● 执行奖扣管理人员占比=有执行奖扣的人/总管理者人数<br />
+									● 基准标尺为执行下限,要求活跃度在标尺之上执行才算执行到位
 							    </template>
-							    <i class="el-icon-warning"></i>
+							    <i class="el-icon-warning fontColorC"></i>
 							  </el-tooltip>
 							</div>
 							<div class="formBox">

+ 149 - 68
src/views/set/systemLayout.vue

@@ -5,34 +5,39 @@
 			<el-tab-pane label="基本设置" name="first">
 				<div class="integralApproval" style="margin-top: 30px;">
 					<b>积分审批</b>
-					<p>
-						当前系统审批流程
-						<a @click="approvalProcess">查看图例</a>
-					</p>
-					<div style="margin-top:5px;" class="fontColorC"><span>指定规则的审批或奖扣分,均可直接通过</span></div>
+					<div>当前系统审批流程 <span class="blue cursor" @click="approvalProcess">查看图例</span></div>
+					<div class="fontColorC"><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="orange">复核通过</span>后才计入排名和统计</div>
-						<div>哪些来源的积分需要复核(至少选择一项)</div>
+					<div style="line-height: 22px;"  v-if="event_review_status">
+						<div class="fontColorC" style="margin-bottom: 5px;">开启后,以下来源的积分需要在<span class="orange">复核通过</span>后才计入排名和统计<br/>哪些来源的积分需要复核(至少选择一项)</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>
+						<div style="margin: 12px 0;">
+							<div style="margin-bottom: 10px;">复核人员选择 <span style="font-size: 12px;" class="fontColorB">(仅系统管理员可更改此配置)</span></div>
+							<el-radio-group  v-model="is_review_manager" style="display: block;">
+							    <el-radio :disabled="!isCreator" :label="1">积分管理员、公司管理员、系统管理员均可操作复核</el-radio>
+								<div style="margin-bottom: 8px;"></div>
+							    <el-radio :disabled="!isCreator" :label="2">指定人员可操作复核</el-radio>
+							</el-radio-group>
+							<div class="input-box font-flex-word" @click="openUserSelect" v-if="is_review_manager==2">
+								<span class="fontColorC" v-if="event_special.length==0">请选择指定人员</span>
+								<template v-else>
+									<span v-for="(item,index) in event_special" :key="index">{{item.name}}<span v-if="index!=event_special.length-1">,</span></span>
+								</template>
+							</div>
+						</div>
 						<el-checkbox v-model="event_review_point">允许复核人调整分值</el-checkbox>
 					</div>
 				</div>
-				
 				<div class="integralApproval">
-					<b>
-						福利模块
-						<el-switch style="margin-left:30px;" :active-value="1" :inactive-value="0" v-model="shop_status"></el-switch>
-					</b>
-					<div style="margin-top:5px;" class="fontColorC">
+					<b>福利模块<el-switch style="margin-left:30px;" :active-value="1" :inactive-value="0" v-model="shop_status"></el-switch></b>
+					<div  class="fontColorC">
 						<div>开启后,通过“功勋点”可兑换公司的福利奖品;</div>
 						<div>员工可通过公司定期统一发放或挣更多个人B分来获得功勋点</div>
 					</div>
@@ -43,7 +48,7 @@
 						提交积分时,必须选择积分规则
 						<el-switch style="margin-left:30px;" v-model="ruleOnoff"></el-switch>
 					</b>
-					<div style="margin-top:5px;" class="fontColorC">
+					<div  class="fontColorC">
 						<div>开启后,申请积分或奖扣积分时,必须选择积分规则提交;</div>
 						<div>此配置不影响积分审批和任务发布</div>
 					</div>
@@ -53,7 +58,7 @@
 						指定规则的审批或奖扣分免审
 						<el-switch style="margin-left:30px;" v-model="examine"></el-switch>
 					</b>
-					<div style="margin-top:5px;" class="fontColorC">
+					<div  class="fontColorC">
 						<div>开启后,按照系统已有的积分规则制度提交的审批或者奖扣可直接通过;</div>
 						<div>即使审批人/录分人的权限分不足,也能审批通过</div>
 					</div>
@@ -63,10 +68,10 @@
 						A分转B分
 						<el-switch style="margin-left:30px;" v-model="isApB"></el-switch>
 					</b>
-					<div class="flex-box flex-v-ce" style="margin-top:10px;" v-if="isApB">
+					<div class="flex-box flex-v-ce" v-if="isApB">
 						1A分=<el-input v-model.number="pointNum" autofocus="0" size="mini" class="pointNum" oninput="value=value.replace(/[^\d]/g,'')"></el-input>B分
 					</div>
-					<div style="margin-top:10px;" class="fontColorC">
+					<div class="fontColorC">
 						<div>开启后,每奖/扣1条A分,额外产生一条分值按比例转换后的B分记录;</div>
 						<div>例如:设置1A分=10B分时,因表现出色奖10A分的同时,额外奖100B分。</div>
 					</div>
@@ -76,7 +81,7 @@
 						管理者审批计入奖扣分目标
 						<el-switch style="margin-left:30px;" v-model="task_review"></el-switch>
 					</b>
-					<div style="margin-top:5px;" class="fontColorC">
+					<div  class="fontColorC">
 						<div>系统默认的管理者奖扣目标只包含管理者主动给员工奖扣的积分;</div>
 						<div>开启后,审批员工申请的积分和任务也会记入Ta的奖扣分目标内</div>
 					</div>
@@ -90,47 +95,29 @@
 						</el-select>
 						结算上个月的管理者奖扣,不达标的自动扣分
 					</div>
-					<div style="margin-top:5px;" class="fontColorC">
+					<div class="fontColorC">
 						<div>结算产生的积分事件均记录为上月的管理者积分,例如6月5号结算5月份的管理者奖扣:</div>
 						<div>如果5月份管理者“张三”存在目标不达标,将进行扣分,扣分事件计入5月份的积分排名和统计中</div>
 						<div class="orange">*注:如上月已结算扣分,修改结算时间不会再次结算,请企业根据自身情况合理设置结算时间</div>
 					</div>
 				</div>
-				<!-- <el-button type="primary" class="save pop-up" @click="saveFirst('first')">保存</el-button> -->
 			</el-tab-pane>
 			<el-tab-pane label="通知设置" name="second">
 				<div class="integralApproval">
 					<div v-for="(item, index) in informText" :key="index" style="margin-top:30px;">
-						<p>
-							<b style="font-size:16px;">{{ item.title }}</b>
-							<el-switch
-								v-if="item.switchs == 0"
-								style="margin:-6px 0 0 30px;"
-								v-model="individualPoints"
-							></el-switch>
-							<el-switch
-								v-if="item.switchs == 1"
-								style="margin:-6px 0 0 30px;"
-								v-model="pointManagement"
-							></el-switch>
-							<el-switch
-								v-if="item.switchs == 2"
-								style="margin:-6px 0 0 30px;"
-								v-model="taskToInform"
-							></el-switch>
-							<el-switch
-								v-if="item.switchs == 3"
-								style="margin:-6px 0 0 30px;"
-								v-model="approvalNotice"
-							></el-switch>
+						<p  class="flex-box-ce">
+							<b>{{ item.title }}</b>
+							<el-switch v-if="item.switchs == 0" style="margin:-6px 0 0 30px;" v-model="individualPoints"></el-switch>
+							<el-switch v-if="item.switchs == 1" style="margin:-6px 0 0 30px;" v-model="pointManagement"></el-switch>
+							<el-switch v-if="item.switchs == 2" style="margin:-6px 0 0 30px;" v-model="taskToInform"></el-switch>
+							<el-switch v-if="item.switchs == 3" style="margin:-6px 0 0 30px;" v-model="approvalNotice"></el-switch>
 						</p>
 						<p>{{ item.ram }}</p>
-						<p v-if="item.checkboxs && individualPoints">
+						<p style="margin-top: 5px;" v-if="item.checkboxs && individualPoints">
 							<el-checkbox v-model="checked">{{ item.checkboxs }}</el-checkbox>
 						</p>
 					</div>
 				</div>
-				<!-- <el-button type="primary" class="save" @click="saveFirst('second')">保存</el-button> -->
 			</el-tab-pane>
 			<el-tab-pane label="操作历史" name="history">
 				<el-form :inline="true">
@@ -141,14 +128,6 @@
 					</el-form-item>
 				</el-form>
 				<el-table :data="list" style="width: 100%" v-loading="hisload">
-					<!-- <el-table-column label="操作人" prop="name" width="250">
-						<template slot-scope="scope">
-							<div class="flex-box-ce">
-								<userImage class="fl" :id="scope.row.id" :user_name="scope.row.name" :img_url="scope.row.img_url" width="50px" height="50px"></userImage>
-								<span style="line-height: 50px; padding-left: 10px;">{{ scope.row.name }}</span>
-							</div>
-						</template>
-					</el-table-column> -->
 					<el-table-column label="内容" prop="content"></el-table-column>
 					<el-table-column prop="create_time" label="时间" width="180px"></el-table-column>
 					<template slot="empty">
@@ -175,11 +154,28 @@
 		<el-dialog title="系统审批流程" :visible.sync="dialogVisible" width="770px" top="3vh" :before-close="handleClose">
 			<svg-icon icon-class="approval_process" style="font-size:730px;" />
 		</el-dialog>
+		
+		<el-dialog title="人员选择" :visible.sync="manageScope_show" top="5vh" width="700px">
+			<EmployeeSelector
+				v-if="manageScope_show"
+				ref="Employee2"
+				:max="10"
+				:isChecKedAll="false"
+				:selected="selected_manage"
+				@confirm="manage_confirm"
+			></EmployeeSelector>
+			<span slot="footer">
+				<el-button @click="manageScope_show=false">取消</el-button>
+				<el-button type="primary" :loading="scope_loading" :disabled="scope_loading" @click="sub_manageScope">完成</el-button>
+			</span>
+		</el-dialog>
+	
 	</div>
 </template>
 <script>
-
+import EmployeeSelector from '@/components/EmployeeSelector.vue';
 export default {
+	components:{EmployeeSelector},
 	data() {
 		return {
 			loading: false,
@@ -223,6 +219,13 @@ export default {
 			event_apply_review:1,//任务积分是否开启复核 1 开启 0或其他不开启
 			event_entry_review:1,//录入积分,是否开启复核 1 开启 0或其他不开启
 			event_review_point:1,//复核积分,是否允许修改分值 1 可以 0或其他不可以
+			
+			is_review_manager:1,
+			event_review_manager:1,//是否管理员复核 0-否 1-是
+			event_review_special:1,//是否指定人员复核 0-否 1-是
+			event_special:[], //指定复核的人员id列表
+			
+			
 			columns: [
 				{ name: '1号', value: 1 },
 				{ name: '2号', value: 2 },
@@ -257,12 +260,57 @@ export default {
 				// { name: '31号', value: 31 }
 			],
 			task_schedule_day:1,
+			
+			manageData:[],
+			manageScope_show:false,
+			scope_loading:false,
+			selected_manage: { employee: [], dept: [] },
+			isCreator:this.$getIsCreator('creator'),
 		};
 	},
+	watch:{
+		is_review_manager(val){
+			this.event_review_manager=0;//是否管理员复核 0-否 1-是
+			this.event_review_special=0;//是否指定人员复核 0-否 1-是
+			val==1? this.event_review_manager=1:this.event_review_special=1
+		}
+	},
 	mounted() {
+		this.manageList();
 		this.cheakAx('first');
 	},
 	methods: {
+		manage_confirm(val){
+			if(val.employee.length>0){
+				this.event_special=val.employee;
+			}else{
+				this.event_special=[];
+			}
+			this.scope_loading = false;
+			this.manageScope_show = false
+		},
+		openUserSelect(){
+			if(!this.$getIsCreator('creator')){
+				return false
+			}
+			this.selected_manage.employee=this.event_special;
+			this.manageScope_show=true;
+		},
+		sub_manageScope(){
+			this.scope_loading = true
+			this.$refs.Employee2.confirm();
+		},
+		//管理列表
+		manageList(){
+			let params = {
+				roles: ['creator', 'admin', 'point_manager', 'dept_manager']
+			}
+			this.$axios('get', '/api/employee/role_employee', params).then(res =>{
+				if(res.data.code == 1){
+					this.manageData = res.data.data.list
+				}
+			})
+		},
 		hisList() {
 			let params = this.formData
 			this.hisload = true
@@ -311,6 +359,12 @@ export default {
 				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或其他不可以
+				
+				data.event_review_manager=this.event_review_manager;//是否管理员复核 0-否 1-是
+				data.event_review_special=this.event_review_special;//是否指定人员复核 0-否 1-是
+				data.event_special=this.event_special.map(e=>{
+					return e.id
+				}); //指定复核的人员id列表
 				data.task_schedule_day=this.task_schedule_day  //月结日期
 				if(this.event_review_status&&!data.event_task_review&&!data.event_apply_review&&!data.event_entry_review){
 					this.$message({
@@ -319,6 +373,10 @@ export default {
 					});
 					return;
 				}
+				// if(this.event_review_special&&data.event_special.length==0){
+				// 	this.$message.error('请选择指定复核人员');
+				// 	return;
+				// }
 			} else {
 				data.report_integral_daily = this.individualPoints ? 1 : 0;
 				this.individualPoints ? (data.report_integral_daily_a = this.checked ? 1 : 0) : '';
@@ -327,19 +385,15 @@ export default {
 				data.report_review_daily = this.approvalNotice ? 1 : 0;
 			}
 			this.loading = true;
-			this.$axios('post', '/api/integral/site/config', data)
-				.then(res => {
-					if (res.data.code == 1) {
-						this.$message({
-							message: res.data.msg,
-							type: 'success'
-						});
-					}
-				})
-				.finally(() => {
-					this.loading = false;
-					this.cheakAx('first');
+			this.$axios('post', '/api/integral/site/config', data).then(res => {
+				this.$message({
+					message: res.data.msg,
+					type: 'success'
 				});
+			}).finally(() => {
+				this.loading = false;
+				this.cheakAx('first');
+			});
 		},
 		cheakAx(name) {
 			this.loading = true;
@@ -363,6 +417,13 @@ export default {
 					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或其他不可以
+					
+					this.is_review_manager=data.event_review_manager== 1 ? 1 : 2;
+					this.event_review_manager=data.event_review_manager;//是否管理员复核 0-否 1-是
+					this.event_review_special=data.event_review_special;//是否指定人员复核 0-否 1-是
+					this.event_special=data.event_special; //指定复核的人员id列表
+					
+					
 					this.task_schedule_day=data.task_schedule_day;
 				} else {
 					this.individualPoints = data.report_integral_daily == 1 ? true : false;
@@ -393,6 +454,25 @@ export default {
 </script>
 
 <style scoped lang="scss">
+.input-box{
+	-webkit-appearance: none;
+	background-color: #FFF;
+	background-image: none;
+	border-radius: 4px;
+	border: 1px solid #DCDFE6;
+	box-sizing: border-box;
+	color: #606266;
+	display: inline-block;
+	font-size: inherit;
+	height: 36px;
+	line-height: 36px;
+	outline: 0;
+	padding: 0 15px;
+	transition: border-color .2s cubic-bezier(.645,.045,.355,1);
+	width: 360px;
+	cursor: pointer;
+	margin-top: 8px;
+}	
 .el-input__inner {
 	height: 35px;
 	line-height: 35px;
@@ -405,9 +485,10 @@ export default {
 	}
 	b {
 		font-size: 16px;
+		margin-bottom: 12px;
+		display: block;
 	}
 	p {
-		margin-top: 10px;
 		a {
 			color: #1795f9;
 			padding-left: 15px;

+ 230 - 241
src/views/task/get_task.vue

@@ -2,69 +2,53 @@
 	<div>
 		<div class="box">
 			<el-tabs v-model="active">
-				<el-tab-pane :disabled="loading" label="待领取" name="unclaimed"></el-tab-pane>
-				<el-tab-pane :disabled="loading" label="已领取" name="received"></el-tab-pane>
+				<el-tab-pane :disabled="loading" label="正在抢单" name="waiting"></el-tab-pane>
+				<!-- <el-tab-pane :disabled="loading" label="抢单结束" name="catch"></el-tab-pane> -->
+				<el-tab-pane :disabled="loading" label="我抢到的" name="myTask"></el-tab-pane>
 			</el-tabs>
-			<div v-show="active === 'unclaimed'">
-				<el-table :data="list" style="width: 100%" v-loading="loading" @row-click="openDetail">
-					<el-table-column label="任务内容" prop="task_name">
-						<template slot-scope="scope">
-							<span class="font-flex-word" style="max-width: 200px;">{{scope.row.task_name}}</span>
-						</template>
-					</el-table-column>
-					<el-table-column label="积分" prop="base_point">
-						<template slot-scope="scope">
-							<span v-if="scope.row.base_point > 0" class="red">+{{scope.row.base_point}} {{$getTypsName(scope.row.pt_id)}}</span>
-							<span v-else class="green">{{scope.row.base_point}} {{$getTypsName(scope.row.pt_id)}}</span>
-						</template>
-					</el-table-column>
-					<el-table-column label="截止时间" prop="expire_time"></el-table-column>
-					<el-table-column label="操作" prop="owner_id">
-						<template slot-scope="scope">
-							<el-link type="primary" :underline="false">查看</el-link>
-						</template>
-					</el-table-column>
-					<template slot="empty">
-						<noData></noData>
-					</template>
-				</el-table>
-			</div>
 
-			<div v-show="active === 'received'">
-				<el-table :data="list" style="width: 100%" v-loading="loading" @row-click="openDetail">
-					<el-table-column label="执行人" prop="receiver_id">
-						<template slot-scope="scope">
-							<div style="display:flex">
-								<userImage
-									class="fl"
-									:id="scope.row.receiver_id"
-									:user_name="scope.row.receiver_name"
-									:img_url="scope.row.receiver_img_url"
-									width="50px"
-									height="50px"
-								></userImage>
-								<span style="line-height: 50px; padding-left: 10px;">{{ scope.row.receiver_name }}</span>
-							</div>
-						</template>
-					</el-table-column>
-					<el-table-column label="任务内容" prop="task_name">
-						<template slot-scope="scope">
-							<span class="font-flex-word" style="max-width: 200px;">{{scope.row.task_name}}</span>
-						</template>
-					</el-table-column>
-					<el-table-column label="积分" prop="base_point">
-						<template slot-scope="scope">
-							<span v-if="scope.row.base_point > 0" class="red">+{{scope.row.base_point}} {{$getTypsName(scope.row.pt_id)}}</span>
-							<span v-else class="green">{{scope.row.base_point}} {{$getTypsName(scope.row.pt_id)}}</span>
-						</template>
-					</el-table-column>
-					<el-table-column label="截止时间" prop="expire_time"></el-table-column>
-					<template slot="empty">
-						<noData></noData>
+			<el-table :data="list" v-loading="loading" class="cursor" @row-click="openDetail">
+				
+				<el-table-column label="任务内容" prop="task_name">
+					<template slot-scope="scope">
+						<span class="font-flex-word" style="max-width: 200px;">{{scope.row.task_name}}</span>
 					</template>
-				</el-table>
-			</div>
-
+				</el-table-column>
+				<el-table-column label="积分" v-if="active=='myTask'">
+					<template slot-scope="scope">
+						<span class="red" v-if="scope.row.point_config.base_point > 0">
+						   +{{ scope.row.point_config.base_point }} {{ scope.row.pt_name }}
+						</span>
+						<span class="green" v-else>
+							{{ scope.row.point_config.base_point }} {{ scope.row.pt_name }}
+						</span>
+					</template>
+				</el-table-column>
+				<el-table-column label="积分" v-else>
+					<template slot-scope="scope">
+						<span v-if="scope.row.base_point > 0" class="red">+{{scope.row.base_point}} {{$getTypsName(scope.row.pt_id)}}</span>
+						<span v-else class="green">{{scope.row.base_point}} {{$getTypsName(scope.row.pt_id)}}</span>
+					</template>
+				</el-table-column>
+				<el-table-column label="截止时间" prop="expire_time"></el-table-column>
+				<el-table-column label="操作" prop="owner_id" v-if="active=='waiting'">
+					<template slot-scope="scope">
+						<el-link :underline="false">查看</el-link>
+						<el-link type="primary" style="padding-left: 10px;" :underline="false" v-if="!userInfo.is_creator&&scope.row.owner_id!=userInfo.id&&scope.row.reviewer_id!=userInfo.id">抢任务</el-link>
+					</template>
+				</el-table-column>
+				<el-table-column label="操作" prop="owner_id" v-if="active=='myTask'">
+					<template slot-scope="scope">
+						<el-link type="primary" v-if="scope.row.status==1" :underline="false" @click.stop="completeBtn(scope.row)">完成任务</el-link>
+						<span v-else>--</span>
+					</template>
+				</el-table-column>
+				<template slot="empty">
+					<noData></noData>
+				</template>
+				
+			</el-table>
+			
 			<center style="padding: 20px 0;">
 				<el-pagination
 					background
@@ -77,151 +61,73 @@
 					:total="total"
 				></el-pagination>
 			</center>
-
-			<el-drawer  :custom-class="'drawer_details'" :visible.sync="detailShow" :with-header="false" size="500px">
-				<div class="details_title flex-box-ce">
-					<span class="flex-1">任务详情</span>
-					<i  @click="detailShow=false" style="cursor: pointer;" class="el-icon-close"></i>
-				</div>
-				<div class="details_content" v-loading="detail_loading">
-					<el-row style="padding-bottom:10px;border-bottom:1px #f8f8f8 solid;">
-						<el-col :span="24">
-							<div class="flex-box flex-v-ce">
-								<userImage
-									:user_name="active == 'unclaimed' ? detailInfo.owner_name : detailInfo.receiver_name"
-									:img_url="active == 'unclaimed' ? detailInfo.owner_img_url : detailInfo.receiver_img_url"
-									width="50px"
-									height="50px"
-								></userImage>
-								<span style="line-height:50px; margin-left:10px;margin-right:4px;">
-									{{ active == 'unclaimed' ? detailInfo.owner_name : detailInfo.receiver_name }}
-								</span>
-								<span class="red point" v-show="detailInfo.point_config.base_point >= 0">+{{ detailInfo.point_config.base_point }}</span>
-								<span class="green point" v-show="detailInfo.point_config.base_point < 0">{{ detailInfo.point_config.base_point }}</span>
-								<span style="margin-left: 5px;">{{ $getTypsName(detailInfo.pt_id)}}</span>
-							</div>
-						</el-col>
-					</el-row>
-
-					<el-row v-if="detailInfo.task_name !== ''">
-						<el-col :span="4">任务内容</el-col>
-						<el-col :span="20">{{ detailInfo.task_name }}</el-col>
-					</el-row>
-
-					<el-row v-if="detailInfo.task_remark !== ''">
-						<el-col :span="4">任务描述</el-col>
-						<el-col :span="20">{{ detailInfo.task_remark }}</el-col>
-					</el-row>
-
-					<!-- 发布时的图片 -->
-					<el-row v-if="detailInfo.task_file_list !== null && detailInfo.task_file_list.length !== 0">
-						<el-col :span="20" :offset="4">
-							<el-image
-								v-for="(item, index) in detailInfo.task_file_list"
-								:key="index"
-								style="width: 100px; height: 100px;margin-right:8px"
-								:src="item"
-								:preview-src-list="detailInfo.task_file_list"
-							></el-image>
-						</el-col>
-					</el-row>
-
-					<el-row v-if="detailInfo.type_mark !== ''">
-						<el-col :span="4">任务类型</el-col>
-						<el-col :span="20">{{ detailInfo.type_mark }}</el-col>
-					</el-row>
-
-					<el-row>
-						<el-col :span="4">任务积分</el-col>
-						<el-col :span="20">
-						<span class="red point" v-show="detailInfo.point_config.base_point >= 0">+{{ detailInfo.point_config.base_point }}</span>
-						<span class="green point" v-show="detailInfo.point_config.base_point < 0">{{ detailInfo.point_config.base_point }}</span>
-						
-						{{ $getTypsName(detailInfo.pt_id) }}</el-col>
-					</el-row>
-					
-					<el-row v-if="detailInfo.reviewer_name">
-						<el-col :span="4">审批人</el-col>
-						<el-col :span="20">{{ detailInfo.reviewer_name }}</el-col>
-					</el-row>
-
-					<el-row v-if="detailInfo.owner_name">
-						<el-col :span="4">发布人</el-col>
-						<el-col :span="20">{{ detailInfo.owner_name }}</el-col>
-					</el-row>
-					<el-row v-if="detailInfo.create_time">
-						<el-col :span="4">发布时间</el-col>
-						<el-col :span="20">{{ detailInfo.create_time }}</el-col>
-					</el-row>
-
-					<el-row v-if="detailInfo.expire_time !== ''">
-						<el-col :span="4">截止时间</el-col>
-						<el-col :span="20">{{ detailInfo.expire_time }}</el-col>
-					</el-row>
-					
-					<el-row v-if="detailInfo.point_config.ahead_award_point">
-						<el-col :span="4">提前奖分</el-col>
-						<el-col :span="20">{{ detailInfo.point_config.ahead_award_point }}{{ $getTypsName(detailInfo.pt_id) }}/天</el-col>
-					</el-row>
-					
-					<el-row v-if="detailInfo.point_config.timeout_deduction_point">
-						<el-col :span="4">逾期扣分</el-col>
-						<el-col :span="20">{{detailInfo.point_config.timeout_deduction_point}}{{ $getTypsName(detailInfo.pt_id) }}/天</el-col>
-					</el-row>
-					
-					<div v-show="detailInfo.point_config && detailInfo.point_config.item_info">
-						<p class="row_title">规则依据</p>
-						<el-row :gutter="10" v-if="detailInfo.point_config.rule_info">
-							<el-col :span="4">规则分类</el-col>
-							<el-col :span="19">{{ detailInfo.point_config.rule_info.name }}</el-col>
-						</el-row>
-						<el-row v-if="detailInfo.point_config.item_info">
-							<el-col :span="4">积分规则</el-col>
-							<el-col :span="19">{{ detailInfo.point_config.item_info.remark }}</el-col>
-						</el-row>
-						<el-row v-if="detailInfo.point_config.item_info">
-							<el-col :span="4">积分</el-col>
-							<el-col :span="19" v-show="detailInfo.point_config.item_info.min_point == detailInfo.point_config.item_info.max_point">{{ detailInfo.point_config.item_info.min_point }} {{ $getTypsName(detailInfo.pt_id) }}</el-col>
-							<el-col :span="19" v-show="detailInfo.point_config.item_info.min_point != detailInfo.point_config.item_info.max_point">
-								{{ detailInfo.point_config.item_info.min_point }} ~ {{ detailInfo.point_config.item_info.max_point }} {{ $getTypsName(detailInfo.pt_id) }}
-							</el-col>
-						</el-row>
-					</div>
-
-					<!-- <el-row v-if="detailInfo.task_file_list !== null && detailInfo.task_file_list.length !== 0">
-						<el-col :span="4">图片附件</el-col>
-						<el-col :span="20">
-							<el-image style="width: 100px; height: 100px" :src="detailInfo.task_file_list[0]" :preview-src-list="detailInfo.task_file_list"></el-image>
-						</el-col>
-					</el-row> -->
-
-					<div
-						style="position: absolute; bottom: 20px; display: block; right: 20px;"
-						v-if="detailInfo.status == '1' && user_id != detailInfo.owner_id && detailInfo.reviewer_id != user_id && !this.$authoritys('creator')"
-					>
-						<el-button plain @click="detailShow = false">取消</el-button>
-						<el-button type="primary" @click="collectTask" :loading="receiveLoad">领取任务</el-button>
-					</div>
-				</div>
-			</el-drawer>
 		</div>
+		
+		
+		<!-- 抢单任务详情弹窗 -->
+		<rewardTaskDetailsPopup :visible.sync="detailShow"  v-if="detailShow" :id="detailId" :title="'任务详情'"></rewardTaskDetailsPopup>
+		
+		<!-- 详情弹窗 -->
+		<taskDetailsPopup :visible.sync="showDetailPopup" v-if="showDetailPopup" :id="detailId" :title="'任务详情'"></taskDetailsPopup>
+		
+		<el-drawer :custom-class="'drawer_details'" :visible.sync="completeShow" wrapperClosable :with-header="false" size="500px">
+			<div class="details_title flex-box-ce">
+				<span class="flex-1">完成任务</span>
+				<i  @click="completeShow=false" style="cursor: pointer;" class="el-icon-close"></i>
+			</div>
+			<div class="details_content">
+				<el-form :model="detail_form" ref="detail_form" label-width="80px">
+					<el-form-item label="任务备注" prop="remark" :rules="[{ required: true, message: '请填写任务备注(限200字)', trigger: 'blur' }]">
+						<el-input v-model="detail_form.remark" type="textarea" :rows="4"  maxlength="200" show-word-limit></el-input>
+					</el-form-item>
+					<el-form-item label="图片">
+						<upload
+							:headers="Xtoken"
+							class="avatar-uploader"
+							:action="'https://' + 'integralsys.oss-cn-shenzhen.aliyuncs.com'"
+							:show-file-list="true"
+							:file-list="detail_form.fileList"
+							:on-success="handleFilesSuccess"
+							:on-preview="onFilePreView"
+							:before-upload="beforeUpload"
+							:on-remove="onFileRemove"
+							:limit="3"
+							accept="image/jpeg,image/png"
+							:multiple="true"
+							ref="clearPicture"
+						>
+							<el-button size="small" type="primary">点击上传</el-button>
+							(最多选择3张)
+						</upload>
+					</el-form-item>
+					<el-form-item>
+						<el-button @click="resetForm('detail_form')">取消</el-button>
+						<el-button type="primary" @click="onSubmit('detail_form')">提交</el-button>
+					</el-form-item>
+				</el-form>
+			</div>
+		</el-drawer>
 	</div>
 </template>
 
 <script>
-
+import rewardTaskDetailsPopup from '@/views/common/rewardTaskDetailsPopup';
+import taskDetailsPopup from '@/views/common/taskDetailsPopup'
+import upload from '@/components/upload';
 export default {
+	components:{rewardTaskDetailsPopup,taskDetailsPopup,upload},
 	name: 'get_task',
 	data() {
 		return {
-			active: 'unclaimed',
+			active: 'waiting',
 			list: [],
 			loading: false,
 			receiveLoad: false,
 			total: null,
 			formData: {
 				page: 1,
-				page_size: 10
+				page_size: 10,
+				hall_type:'waiting',
 			},
 			detailShow: false,
 			detail_loading: false,
@@ -229,7 +135,18 @@ export default {
 				point_config: {},
 				task_file_list: []
 			},
-			user_id: this.$getUserData().id
+			userInfo: this.$getUserData(),
+			detailId:0,
+			showDetailPopup:false,
+			detail_form: {
+				id: '',
+				remark: '',
+				fileList: [],
+				files: [],
+			},
+			completeShow:false,
+			//图片附件
+			Xtoken: { 'X-Token': this.$getToken() },
 		};
 	},
 	mounted() {
@@ -238,87 +155,159 @@ export default {
 	
 	watch: {
 		active(val) {
+			this.formData.page=1;
 			this.list = [];
-			this.get_list();
+			if(val=='myTask'){
+				this.get_myTask();
+			}else{
+				this.get_list();
+			}
+			
+		},
+		showDetailPopup(val){
+			if(!val){
+				this.get_myTask();
+			}
 		}
 	},
 	methods: {
-		// 领取任务
-		collectTask() {
-			let self = this;
-			self.receiveLoad = true;
-			self.$axios('POST', '/api/integral/task', { task_id: this.detailInfo.id })
-				.then(res => {
-					if (res.data.code == 1) {
-						self.$message.success('领取成功');
-						self.list.forEach((element, index) => {
-							if (element.id == self.detailInfo.id) {
-								self.list.splice(index, 1);
-							}
-						});
-						self.detailShow = false;
-					} else {
-						self.$message.error(res.data.msg);
-					}
-				})
-				.finally(() => {
-					self.receiveLoad = false;
-				});
+		//提交完成任务
+		onSubmit(formName) {
+			this.$refs[formName].validate(valid => {
+				if (valid) {
+					let data = {
+						work_id: this.detail_form.id,
+						progress: '100',
+						remark: this.detail_form.remark,
+						state: '1',
+						files: this.detail_form.files
+					};
+					this.$axios('post', '/api/integral/work', data).then(res => {
+						this.$message.success(res.data.msg);
+						this.resetForm(formName);
+						this.get_myTask();
+					
+					});
+				}
+			});
+		},
+		//重置表单
+		resetForm(formName) {
+			this.$refs[formName].resetFields();
+			this.completeShow = false;
+			this.detail_form.fileList = []
+			this.detail_form.files = []
+		},
+		handleFilesSuccess(response, file, fileList) {
+			let fileListData=fileList.filter(e=>{
+			  return e.url
+			})
+			this.fileFun(file, fileList)
+		},
+		onFilePreView(file) {
+			if (file.response) {
+				window.open(file.response.url, '_blank');
+			}
+		},
+		onFileRemove(file, fileList) {
+			this.fileFun(file, fileList)
+		},
+		fileFun(file, fileList){
+			this.detail_form.fileList = fileList;
+			this.detail_form.files = []
+			fileList.forEach((item, index) => {
+				this.detail_form.files.push(item.url);
+			});
+		},
+		// 附件上传
+		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;
+		},
+		// 点击完成
+		completeBtn(data) {
+			this.detail_form.id = data.id;
+			this.completeShow = true;
 		},
 		// 页面变更
 		handleCurrentChange(val) {
 			this.formData.page = val;
-			this.get_list();
+			
+			if(this.active=='myTask'){
+				this.get_myTask();
+			}else{
+				this.get_list();
+			}
 		},
 		handleSizeChange(val) {
 			this.formData.page_size = val;
-			this.get_list();
+			if(this.active=='myTask'){
+				this.get_myTask();
+			}else{
+				this.get_list();
+			}
 		},
 
 		// 打开详情弹窗
 		openDetail(item) {
-			this.detailShow = true;
-			this.getDetailInfo(item);
+			this.detailId=item.id
+			if(this.active=='myTask'){
+				this.showDetailPopup = true;
+			}else{
+				this.detailShow = true;
+			}
 		},
 		// 获取详情信息
 		getDetailInfo(item) {
-			let self = this;
-			self.detail_loading = true;
+			this.detail_loading = true;
 			let data = { task_id: item.id };
-			self.$axios('get', '/api/integral/task', data)
+			this.$axios('get', '/api/integral/task', data)
 				.then(res => {
 					if (res.data.code == 1) {
-						self.detailInfo = JSON.parse(JSON.stringify(res.data.data));
+						this.detailInfo = JSON.parse(JSON.stringify(res.data.data));
 					} else {
-						self.$message.error(res.data.data.msg);
+						this.$message.error(res.data.data.msg);
 					}
 				})
 				.finally(() => {
-					self.detail_loading = false;
+					this.detail_loading = false;
 				});
 		},
 		// 获取列表信息
 		get_list() {
-			let self = this;
-			self.loading = true;
+			this.loading = true;
 			let data = JSON.parse(JSON.stringify(this.formData));
-			if (self.active == 'unclaimed') {
-				data.hall_type = 'waiting';
-			} else {
-				data.hall_type = 'catch';
+			data.hall_type=this.active
+			this.$axios('get', '/api/integral/task/hall', data).then(res => {
+				this.list = res.data.data.list;
+				this.total = res.data.data.total;
+			}).finally(() => {
+				this.loading = false;
+			});
+		},
+		get_myTask() {
+			this.loading = true;
+			let data={
+				status:'all',
+				page:this.formData.page,
+				page_size:this.formData.page_size,
+				source_type:2,
+				sort: 'publish',
+				today: 0
 			}
-			self.$axios('get', '/api/integral/task/hall', data)
-				.then(res => {
-					if (res.data.code == 1) {
-						self.list = res.data.data.list;
-						self.total = res.data.data.total;
-					} else {
-						self.$message.error(res.data.data.msg);
-					}
-				})
-				.finally(() => {
-					self.loading = false;
-				});
+			this.$axios('get', '/api/integral/work/list', data).then(res => {
+				this.list = res.data.data.list;
+				this.total = res.data.data.total;
+			}).finally(() => {
+				this.loading = false;
+			});
 		},
 	}
 };

+ 58 - 61
src/views/task/my_issue.vue

@@ -11,8 +11,8 @@
 						<i class="el-icon-arrow-down el-icon--right"></i>
 					</el-button>
 					<el-dropdown-menu slot="dropdown">
-						<el-dropdown-item command="1">+ 临时任务</el-dropdown-item>
-						<el-dropdown-item command="2">+ 悬赏任务</el-dropdown-item>
+						<el-dropdown-item command="1">+ 指派任务</el-dropdown-item>
+						<el-dropdown-item command="2">+ 抢单任务</el-dropdown-item>
 					</el-dropdown-menu>
 				</el-dropdown>
 			</div>
@@ -71,8 +71,6 @@
 						<el-input  size="medium" clearable  v-model="formData.content" placeholder="请输入" max="200"></el-input>
 					</div>
 				</div>
-				
-				
 			</FormBox>
 
 			<div v-show="status == 'assign'">
@@ -93,7 +91,7 @@
 					</el-table-column>
 					<el-table-column label="任务内容" prop="task_name">
 						<template slot-scope="scope">		
-					<span class="font-flex-word" style="max-width: 200px;">{{ scope.row.task_name }}</span>
+							<span class="font-flex-word" style="max-width: 200px;">{{ scope.row.task_name }}</span>
 						</template>
 					</el-table-column>
 					<el-table-column label="积分" prop="base_point" width="100px">
@@ -149,20 +147,12 @@
 
 			<div v-show="status == 'reward'">
 				<el-table :data="list" style="width: 100%" v-loading="loading" @row-click="rewardTasksClick">
-					<el-table-column label="发布人" prop="employee_id">
-						<template slot-scope="scope">
-							<div style="display:flex">
-								<userImage width="50px" height="50px" :img_url="scope.row.owner_img_url" :user_name="scope.row.owner_name"></userImage>
-								<span style="line-height: 50px; padding-left: 10px;">我发布的{{ scope.row.pt_name }}任务</span>
-							</div>
-						</template>
-					</el-table-column>
-					<el-table-column label="任务内容" prop="task_name">
+					<el-table-column label="任务内容" prop="task_name" min-width="200px">
 						<template slot-scope="scope">	
-					 <span class="font-flex-word" style="max-width: 200px;">{{ scope.row.task_name }}</span>
+							<span class="font-flex-word">{{ scope.row.task_name }}</span>
 						</template>
 					</el-table-column>
-					<el-table-column label="积分" prop="base_point" width="100px">
+					<el-table-column label="积分" prop="base_point">
 						<template slot-scope="scope">
 							<span v-if="scope.row.base_point > 0" class="red">+{{ scope.row.base_point }} {{ scope.row.pt_name }}</span>
 							<span v-else class="color_green">{{ scope.row.base_point }} {{ scope.row.pt_name }}</span>
@@ -173,27 +163,48 @@
 							<span>{{ scope.row.expire_time }}</span>
 						</template>
 					</el-table-column>
-					<el-table-column label="审批人" width="100px" prop="reviewer_name">
+					<el-table-column>
+						<template slot="header">
+							<span>抢单人数
+							<el-tooltip class="item" effect="dark" content="已抢单人数/可抢单名额" placement="top-start">
+								<i class="el-icon-warning fontColorC"></i>
+							</el-tooltip>
+							</span>
+						</template>
 						<template slot-scope="scope">
-							<span v-if="scope.row.reviewer_id">{{ list_approver(scope.row.reviewer_id) }}</span>
+							<span v-if="scope.row.total_chance">{{ scope.row.total_chance-scope.row.chance }}/{{ scope.row.total_chance }}</span>
+							<span v-else>--</span>
+						</template>
+					</el-table-column>
+					<el-table-column label="审批人" prop="reviewer_name">
+						<template slot-scope="scope">
+							<span v-if="scope.row.reviewer_id">{{ scope.row.reviewer_name }}</span>
 						</template>
 					</el-table-column>
 					<el-table-column label="状态" prop="owner_id" width="100px">
+						<template slot="header">
+							<span>状态
+								<el-tooltip class="item" effect="dark" placement="top-start">
+									<div slot="content">
+										正在抢单:仍可以进行抢单的任务<br/>
+										抢单结束:抢单人数已满或任务截止时间已过期
+									</div>
+									<i class="el-icon-warning fontColorC"></i>
+								</el-tooltip>
+							</span>
+						</template>
 						<template slot-scope="scope">	
-							<span class="orange" v-if="scope.row.status == 1">待领取</span>			
-							<span class="orange" v-else-if="scope.row.status == 2">进行中</span>			
-							<span class="green" v-else-if="scope.row.status == 3">已完成</span>			
-							<span class="fontColorZ" v-else-if="scope.row.status == 4">已撤回</span>	
-							<span class="red" v-else>已过期</span>
+							<span class="orange" v-if="scope.row.composite_state == 1">正在抢单</span>			
+							<span class="fontColorC" v-else>抢单结束</span>			
 						</template>
 					</el-table-column>
 
-					<el-table-column prop="base_point" label="操作" align="center" width="80px">
+					<el-table-column label="操作" align="center" width="80px">
 						<template slot-scope="scope">
 							<el-dropdown placement="bottom" :show-timeout="150" :hide-timeout="150">
 								<span class="el-dropdown-links">···</span>
 								<el-dropdown-menu slot="dropdown">
-									<el-dropdown-item :disabled="false" v-if="scope.row.status == 1">
+									<el-dropdown-item :disabled="false" v-if="scope.row.composite_state == 1&&scope.row.total_chance==scope.row.chance">
 										<el-button type="text" class="color-blue" v-loading.fullscreen.lock="bodyLoad" @click.stop="offerARewardAmend2(scope.row)">修改</el-button>
 									</el-dropdown-item>
 									<el-dropdown-item :disabled="false">
@@ -218,6 +229,7 @@
 								<span v-if="scope.row.target_info.length == 1 && index == 0">{{ item.name }}</span>
 								<span v-if="scope.row.target_info.length > 1 && index == 0">{{ item.name }}等{{ scope.row.target_info.length }}人</span>
 							</span>
+							<span v-if="scope.row.target_info.length==0" class="fontColorC">--</span>
 						</template>
 					</el-table-column>
 					<el-table-column label="任务内容" prop="remark">
@@ -240,14 +252,6 @@
 							<span v-if="scope.row.task_cycle == '3'">每月1号自动发布,{{ scope.row.task_cycle_value }}号截止</span>
 						</template>
 					</el-table-column>
-					<el-table-column label="可见范围" prop="department_info">
-						<template slot-scope="scope">
-							<span v-for="(item, index) in scope.row.department_info" :key="index">
-								{{ item.name }}
-								<span v-if="scope.row.department_info.length - 1 > index">,</span>
-							</span>
-						</template>
-					</el-table-column>
 					<el-table-column label="创建时间" prop="create_time" width="140px"></el-table-column>
 					<el-table-column label="状态" prop="create_time" width="140px">
 						<template slot-scope="scope">
@@ -290,13 +294,14 @@
 				></el-pagination>
 			</center>
 		</div>
-		<!-- 临时任务 -->
-		<temporaryTask :dialogVisible.sync="dialogVisible" :trees_ab="trees_v2_ab_module" :isFy="isFy" :modifyData="fyData" :showTitle="'临时任务'"></temporaryTask>
-		<!-- 临时任务-修改 -->
+		<!-- 指派任务 -->
+		<temporaryTask :dialogVisible.sync="dialogVisible" :trees_ab="trees_v2_ab_module" :isFy="isFy" :modifyData="fyData" :showTitle="'指派任务'"></temporaryTask>
+		<!-- 指派任务-修改 -->
 		<temporaryTaskAmend :dialogVisible.sync="dialogVisibleAmend" :trees_ab="trees_v2_ab_module" :showTitle="'任务编辑'" :modifyData="modifyData"></temporaryTaskAmend>
-		<!-- 悬赏任务 -->
-		<rewardTask :dialogVisible.sync="rewardTaskShow" :isFy="isFy" :modifyData="fyData" :trees_ab="trees_v2_ab_module" :showTitle="'悬赏任务'"></rewardTask>
-		<!-- 悬赏任务-修改 -->
+		
+		<!-- 抢单任务 -->
+		<rewardTask :dialogVisible.sync="rewardTaskShow" :isFy="isFy" :modifyData="fyData" :trees_ab="trees_v2_ab_module" :showTitle="'抢单任务'"></rewardTask>
+		<!-- 抢单任务-修改 -->
 		<rewardTaskAmend
 			:dialogVisible.sync="rewardTaskAmendShow"
 			:trees_ab="trees_v2_ab_module"
@@ -311,8 +316,8 @@
 		<!-- 重复任务详情弹窗 -->
 		<repeatTaskDetailsPopup :visible.sync="showRepetitiveTasksPopup" v-if="showRepetitiveTasksPopup" :id="detailId" :title="'重复任务详情'"></repeatTaskDetailsPopup>
 
-		<!-- 悬赏任务详情弹窗 -->
-		<rewardTaskDetailsPopup :visible.sync="showRewardTaskDetailsPopup" v-if="showRewardTaskDetailsPopup" :id="detailId" :title="'工作详情'"></rewardTaskDetailsPopup>
+		<!-- 抢单任务详情弹窗 -->
+		<rewardTaskDetailsPopup :visible.sync="showRewardTaskDetailsPopup" v-if="showRewardTaskDetailsPopup" :id="detailId" :title="'任务详情'"></rewardTaskDetailsPopup>
 	</div>
 </template>
 
@@ -331,7 +336,7 @@ export default {
 	data() {
 		return {
 			weekList: ['一', '二', '三', '四', '五', '六', '日'],
-			rewardTaskAmendData: {}, //悬赏修改
+			rewardTaskAmendData: {}, //抢单修改
 			modifyData: {}, //任务修改
 
 			operation_if: false, //操作列显示隐藏
@@ -365,7 +370,7 @@ export default {
 			],
 			sort: [{ id: 2, name: '按发布时间', code: 'publish' }, { id: 1, name: '按截止时间', code: 'expire' }],
 			order_by: [{ id: 2, name: '按发布时间', code: 'create_time' }, { id: 1, name: '按截止时间', code: 'expire_time' }],
-			tabsOption: [{ label: '我指派的', name: 'assign' }, { label: '我悬赏的', name: 'reward' }, { label: '重复任务', name: 'repetitive' }],
+			tabsOption: [{ label: '指派任务', name: 'assign' }, { label: '抢单任务', name: 'reward' }, { label: '重复任务', name: 'repetitive' }],
 
 			dialogVisible: false,
 			dialogVisibleAmend: false,
@@ -493,24 +498,16 @@ export default {
 				this.$setUserData(res.data.data.user);
 			});
 		},
-		//悬赏修改
+		//抢单修改
 		offerARewardAmend2(item) {
 			this.rewardTaskAmendShow = true;
 			this.$refs.rewardTasks.forTheTaskLoading = true;
-			let params = {
-				task_id: item.id
-			};
-			this.$axios('get', '/api/integral/task', params)
-				.then(res => {
-					if (res.data.code == 1) {
-						this.rewardTaskAmendData = res.data.data;
-					} else {
-						self.$message.error(res.data.msg);
-					}
-				})
-				.finally(() => {
-					this.$refs.rewardTasks.forTheTaskLoading = false;
-				});
+			let params = {task_id: item.id};
+			this.$axios('get', '/api/integral/task', params).then(res => {
+				this.rewardTaskAmendData = res.data.data;
+			}).finally(() => {
+				this.$refs.rewardTasks.forTheTaskLoading = false;
+			});
 		},
 		//重复任务复用
 		copyTask(item){
@@ -528,7 +525,7 @@ export default {
 			this.modifyData = item;
 			this.dialogVisibleAmend = true;
 		},
-		//删除---我指派的、我悬赏的、重复任务    (重复任务需等后端接口)
+		//删除---我指派的、我抢单的、重复任务    (重复任务需等后端接口)
 		deletes(item, s) {
 			let self = this;
 			this.$message.closeAll();
@@ -567,12 +564,12 @@ export default {
 			this.showRepetitiveTasksPopup = true;
 			this.detailId = parseInt(row.id);
 		},
-		// 悬赏任务详情
+		// 抢单任务详情
 		rewardTasksClick(row) {
 			this.showRewardTaskDetailsPopup = true;
 			this.detailId = parseInt(row.id);
 		},
-		// 发布临时任务 和 悬赏任务
+		// 发布指派任务 和 抢单任务
 		downClick(val) {
 			if (val == 1) {
 				this.dialogVisible = true;

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

@@ -267,6 +267,7 @@
 	</div>
 </template>
 <script>
+	import moment from 'moment' // 时间库
 	export default {
 		data() {
 			return {
@@ -274,11 +275,7 @@
 					shortcuts: [{
 							text: '本周',
 							onClick(picker) {
-								const now = new Date();
-								const start = new Date();
-								start.setTime(now.getTime() - (now.getDay() - 1) * 24 * 60 * 60 * 1000);
-								now.setTime(start.getTime() + 6 * 24 * 60 * 60 * 1000 - 1000);
-								picker.$emit('pick', [start, now]);
+								picker.$emit('pick', [moment().startOf('isoWeek').format('YYYY-MM-DD'),moment().endOf('isoWeek').format('YYYY-MM-DD')]);
 							}
 						},
 						{

+ 2 - 11
src/views/welfare/operatingRecord.vue

@@ -168,15 +168,10 @@
 	</div>
 </template>
 <script>
+import moment from 'moment' // 时间库
 export default {
 	data() {
 		return {
-			// 设置只能选择当前日期及之后的日期
-			pickerOptions: {
-				disabledDate(time) {
-					return time.getTime() > Date.now() - 8.64e7; //如果没有后面的-8.64e7就是不可以选择今天的
-				}
-			},
 			exportLoad: false,
 			dialogVisible: false,
 			employee_map: [],
@@ -215,11 +210,7 @@ export default {
 					{
 						text: '本周',
 						onClick(picker) {
-							const now = new Date();
-							const start = new Date();
-							start.setTime(now.getTime() - (now.getDay() - 1) * 24 * 60 * 60 * 1000);
-							now.setTime(start.getTime() + 6 * 24 * 60 * 60 * 1000 - 1000);
-							picker.$emit('pick', [start, now]);
+							picker.$emit('pick', [moment().startOf('isoWeek').format('YYYY-MM-DD'),moment().endOf('isoWeek').format('YYYY-MM-DD')]);
 						}
 					},
 					{

+ 65 - 29
src/views/workbench/review.vue

@@ -110,6 +110,11 @@
 			</FormBox>
 			<div style="padding: 10px 0;position: relative;z-index: 1;background-color: #fff;" v-if="active=='review'">
 				<el-button plain  size="medium" :disabled="deleteDisabled" @click="deleteInBatches" type="primary">批量复核通过</el-button>
+				<span style="padding-left: 20px;">
+					<span class="orange" v-if="!isOpen"><i class="el-icon-warning-outline"></i> 正在连接服务器,请稍候...</span>
+					<span v-else class="green"><i class="el-icon-connection"></i> 成功连接服务器,可操作使用!</span>
+					<!-- <el-button type="primary" size="mini" plain v-if="isBtn" @click="initWebSocke">主要按钮</el-button> -->
+				</span>
 			</div>
 			<!-- 表格 -->
 			<div>
@@ -191,7 +196,7 @@
 						@size-change="handleSizeChange"
 						@current-change="handleCurrentChange"
 						:current-page="formData.page"
-						:page-sizes="[10, 20, 50, 100]"
+						:page-sizes="[10, 20, 50,100]"
 						layout="total, sizes, prev, pager, next"
 						:page-size="pageLimit"
 						:total="total"
@@ -199,6 +204,8 @@
 				</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">
@@ -388,6 +395,7 @@
 				</span>
 			</div>
 		</el-dialog>
+	
 	</div>
 </template>
 <script>
@@ -465,21 +473,24 @@ export default {
 			percentage: 0,
 			resultList:[],//要发送数据的集合
 			resultIndex:0,
+			
 			isShowError:false,
-			isShowError2:false,
 			errorMsg:'服务器繁忙,请稍后再试',
-			breakList:[],
-			isShowBreak:false,
+		
 			
 			isNo:false,
 			noData:{},
 			comment:'',
 			setLoading:false,
+			isOpen:false,
+			
+			isBtn:false,
 		};
 	},
 	components: { Steps, toLead,Review },
 	created() {
 		this.getEmployee();
+		this.initWebSocke();
 	},
 	mounted() {
 		this.getDepartment();
@@ -580,11 +591,25 @@ export default {
 		isResult(val){
 			if(!val){
 				this.get_integral_list(this.formData);
-				this.$socketApiTow.closewebsocket();
 			}
 		},
 	},
 	methods: {
+		initWebSocke(is){
+			// if(is){
+			// 	this.$message({type: 'info',message: '正在重新连接'});
+			// }
+			// this.isBtn=false;
+		    let setTime=setTimeout(()=>{
+				if(!this.isOpen){
+					// this.isBtn=true;
+					this.initWebSocke();
+				}
+				clearTimeout(setTime)
+			},20000)
+			this.$socketApiTow.sendData({},this.onmessageWS);
+		},
+		
 		setGrade(item){
 			this.noData={
 				type:'event_check',
@@ -596,6 +621,7 @@ export default {
 			this.newForm.comment='';
 			this.isPrizeShow=true;
 		},
+		
 		// 提交表单
 		subGroupForm(formName) {
 			this.$refs[formName].validate(valid => {
@@ -627,6 +653,11 @@ export default {
 			this.webSocket(data)
 		},
 		webSocket(data,is){
+			
+			if(!this.isOpen){
+				this.$message({type: 'info',message: '正在连接服务器,请稍候...'});
+				return false;
+			}
 			this.resultList=is? data:[data];
 			this.resultIndex=0;
 			this.percentage=0;
@@ -660,7 +691,7 @@ export default {
 					}
 				}
 				let user;
-				if(e.code==1){
+				if(e.code==1){		
 					user={
 						name:e.result.task.msg.name,
 						point:e.result.task.msg.point,
@@ -669,15 +700,16 @@ export default {
 						msg:'提交成功'
 					}
 				}else{
+					let item=this.resultList[this.resultIndex]
 					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,
+						name:item.name,
+						point:item.point,
+						remark:item.remark,
+						pt_id:item.pt_id,
 						msg:e.msg
 					}
 				}
-				this.results.push(user);
+				this.results.unshift(user);
 				this.resultIndex++;
 				this.opneWebSocket();
 				// 进度条
@@ -687,11 +719,17 @@ export default {
 					this.percentage = 100;
 				}
 			}
-			// 连接不上
-			if(e.type=='error'){
-				this.errorMsg=e.msg
-				this.isShowError = true;
+			if(e.type=='auth'){
+			  this.isOpen=true;
 			}
+			// // 连接不上
+			// if(e.type=='break'){
+			// 	this.isOpen=false;
+			// 	let setT=setTimeout(()=>{
+			// 		this.$socketApiTow.sendData({},this.onmessageWS);
+			// 		clearTimeout(setT)
+			// 	},120000)
+			// }
 		},
 		saveNo(){
 			if (!this.comment) {
@@ -787,20 +825,14 @@ export default {
 		},
 		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;
-						if(data.page==1){
-							this.total = res.data.data.total;
-						}
-					} else {
-						this.$message.error(res.data.data.msg);
-					}
-				})
-				.finally(() => {
-					this.loading = false;
-				});
+			this.$axios('get', '/api/integral/statistics/integral', data).then(res => {
+				this.list = res.data.data.list;
+				if(data.page==1){
+					this.total = res.data.data.total;
+				}
+			}).finally(() => {
+				this.loading = false;
+			});
 		},
 		handleCurrentChange(val) {
 			this.formData.page = val;
@@ -869,6 +901,10 @@ export default {
 			}
 			return data;
 		}
+	},
+	beforeDestroy() {
+		//取消echarts自适应
+		this.$socketApiTow.closewebsocket();
 	}
 };
 </script>

Vissa filer visades inte eftersom för många filer har ändrats