哥哥玩剑魂呢 4 år sedan
förälder
incheckning
8f3ff2405d

+ 5 - 0
package-lock.json

@@ -8848,6 +8848,11 @@
       "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
       "dev": true
     },
+    "qrcodejs2": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/qrcodejs2/-/qrcodejs2-0.0.2.tgz",
+      "integrity": "sha1-Rlr+Xjnxn6zsuTLBH3oYYQkUauE="
+    },
     "qs": {
       "version": "6.5.2",
       "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz",

+ 1 - 0
package.json

@@ -19,6 +19,7 @@
     "element-ui": "^2.13.2",
     "moment": "^2.29.0",
     "nprogress": "^0.2.0",
+    "qrcodejs2": "0.0.2",
     "vconsole": "^3.3.4",
     "vue": "^2.6.11",
     "vue-router": "^3.2.0",

+ 17 - 0
src/api/auth.js

@@ -31,6 +31,23 @@ export function getIsCreator (key) {
 	 return is
 }
 
+export function supremeAuthority () {//获取当前角色最高权限     判断是否为某项权限:this.$authoritys('dept_manager') 或 this.$supremeAuthority() == 'dept_manager'
+	if(getIsCreator('creator')){
+		return 'creator'
+	}else if(getIsCreator('admin')){
+		return 'admin'
+	}else if(getIsCreator('point_manager')){
+		return 'point_manager'
+	}else if(getIsCreator('dept_manager')){
+		return 'dept_manager'
+	}else if(getIsCreator('employee')){
+		return 'employee'
+	}
+}
+export function authoritys (key) {//判断是否为某项权限:this.$authoritys('dept_manager')
+	return supremeAuthority() == key
+}
+
 export function setTyps (data) {
      localStorage.setItem(TypesKey,JSON.stringify(data))
 }

+ 3 - 1
src/assets/css/iconfont.css

@@ -57,4 +57,6 @@
 .icon-dingdingPC_tongji:before {
   content: "\e726";
 }
-
+.icon-PC_gongzuotai_renwu:before {
+  content: "\e70d";
+}

+ 1 - 0
src/assets/css/iconfont.svg

@@ -50,6 +50,7 @@ Created by iconfont
     <glyph glyph-name="dingdingPC_tongji1" unicode="&#59174;" d="M534.7 747.7h-45.5c-25.1 0-45.5-20.3-45.5-45.5v-636.3c0-25.1 20.3-45.5 45.5-45.5h45.5c25.1 0 45.5 20.3 45.5 45.5V702.2c0 25.1-20.4 45.5-45.5 45.5zM762 384h-45.5c-25.1 0-45.5-20.3-45.5-45.5v-272.7c0-25.1 20.3-45.5 45.5-45.5H762c25.1 0 45.5 20.3 45.5 45.5V338.5c0 25.2-20.4 45.5-45.5 45.5zM307.5 543.1H262c-25.1 0-45.5-20.3-45.5-45.5v-431.8c0-25.1 20.3-45.5 45.5-45.5h45.5c25.1 0 45.5 20.3 45.5 45.5V497.7c-0.1 25.1-20.5 45.4-45.5 45.4z"  horiz-adv-x="1024" />
 
     
+    <glyph glyph-name="PC_gongzuotai_renwu" unicode="&#59167;" d="M736.4 481.4L497.9 242.9 390.1 350.6c-13.7 13.7-35.9 13.7-49.6 0-13.7-13.7-13.7-35.9 0-49.6l132.3-132.3c6.9-6.9 16-10.3 25-10.2 9.1-0.1 18.2 3.3 25.1 10.2L786 431.8c13.7 13.7 13.7 35.9 0 49.6-13.7 13.7-35.9 13.7-49.6 0zM855.1 779.5H725.3v28c0 24.8-20.2 45-45 45h-301c-24.8 0-45-20.2-45-45v-27.9H204.5c-42.1 0-76.4-34.3-76.4-76.4v-708c0-42.1 34.3-76.4 76.4-76.4h650.6c42.1 0 76.4 34.3 76.4 76.4v708c0 42.1-34.3 76.3-76.4 76.3zM400 786.8h259.6v-74.7H400v74.7z m465.8-791.6c0-5.9-4.8-10.8-10.8-10.8H204.5c-5.9 0-10.8 4.8-10.8 10.8v708c0 5.9 4.8 10.8 10.8 10.8h129.8v-22.4c0-24.8 20.2-45 45-45h301c24.8 0 45 20.2 45 45V714h129.8c5.9 0 10.8-4.8 10.8-10.8l-0.1-708z"  horiz-adv-x="1024" />
 
 
   </font>

BIN
src/assets/image/a_apply.png


BIN
src/assets/image/entry_list.png


BIN
src/assets/image/my_publish.png


BIN
src/assets/image/task_hall.png


+ 25 - 9
src/components/EmployeeSelector.vue

@@ -134,6 +134,10 @@ export default {
 	 isCreatorSelect:{//当employee_list为空时,依然显示空值而不是显示人员列表
 		 type: Boolean,
 		 default: false
+	 },
+	 use_Administrator_list:{//未指定员工并请求人员接口时,保留管理员,过滤员工
+		 type: Boolean,
+		 default: false
 	 }
 	 
   },
@@ -337,7 +341,7 @@ export default {
     get_user_list() {
       this.table_loading = true;
       var that=this;
-      var employee_selected_list=this.employee_selected_list;
+	  var employee_selected_list=this.employee_selected_list;
       if (this.employee_list.length > 0||this.isCreatorSelect) {
         let list = this.employee_list
 	    list.map((item)=>{
@@ -354,16 +358,19 @@ export default {
       }
       this.list = []
       this.$axios('get','/api/employee/index',{ dept_id: this.pid,keywords: this.keyword, page: 0,page_size: 2000}).then((res) => {
-        var employee=res.data.data.list||[];
+		var employee=res.data.data.list||[];
+		if(this.use_Administrator_list){//使用管理员列表
+			employee = this.useAdministratorList(employee)
+		}
 		var userAll=[];
         employee.forEach((item,i)=>{
-			  if(!this.not_user && item.is_creator == 1){//过滤创始人
-				  return null;
-			  }else if(this.my_no_select==item.id){//过滤掉当前设置人
-				  return null;
-			  }else if(item.is_official==1){
-				  userAll.push(item);
-			  }
+			if(!this.not_user && item.is_creator == 1){//过滤创始人
+				return null;
+			}else if(this.my_no_select==item.id){//过滤掉当前设置人
+				return null;
+			}else if(item.is_official==1){
+				userAll.push(item);
+			}
         })
 	    userAll.map((item)=>{
 			 item['checked'] = false;
@@ -377,6 +384,15 @@ export default {
 	   }).finally(() => {
 		  that.table_loading = false;
 	   })
+	},
+	useAdministratorList(list){//过滤掉普通员工,返回管理员
+		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) {
+				arr.push(item)
+			}
+		})
+		return arr
 	}
   },
   created() {

+ 6 - 1
src/components/applicationIntegrationPopup.vue

@@ -68,7 +68,7 @@
 						<el-form-item label="发生时间" :prop="'items.' + index + '.event_time'" :rules="[{ required: true, message: '请选择时间', trigger: 'blur' }]">
 							<el-row>
 								<el-col :span="18">
-									<el-date-picker v-model="item.event_time" type="date" placeholder="请选择时间" value-format="yyyy-MM-dd"></el-date-picker>
+									<el-date-picker v-model="item.event_time" :picker-options="pickerBeginDateBefore" type="date" placeholder="请选择时间" value-format="yyyy-MM-dd"></el-date-picker>
 								</el-col>
 							</el-row>
 						</el-form-item>
@@ -183,6 +183,11 @@ export default {
 	data() {
 		var getUserData = this.$getUserData();
 		return {
+			pickerBeginDateBefore: {
+				disabledDate(time) {
+					return time.getTime() > Date.now();
+				}
+			},
 			error_list: [], //错误信息数组
 			error_list_show: false, //错误信息弹窗
 			Xtoken: { 'X-Token': this.$getToken() },

+ 6 - 1
src/components/bonusPointsPopup.vue

@@ -92,7 +92,7 @@
 						<el-form-item label="发生时间" :prop="'items.' + index + '.event_time'" :rules="[{ required: true, message: '请选择时间', trigger: 'blur' }]">
 							<el-row>
 								<el-col :span="18">
-									<el-date-picker v-model="item.event_time" type="date" placeholder="请选择时间" value-format="yyyy-MM-dd"></el-date-picker>
+									<el-date-picker v-model="item.event_time" :picker-options="pickerBeginDateBefore" type="date" placeholder="请选择时间" value-format="yyyy-MM-dd"></el-date-picker>
 								</el-col>
 							</el-row>
 						</el-form-item>
@@ -197,6 +197,11 @@ export default {
 	},
 	data() {
 		return {
+			pickerBeginDateBefore: {
+				disabledDate(time) {
+					return time.getTime() > Date.now();
+				}
+			},
 			Xtoken: { 'X-Token': this.$getToken() },
 			btn_loading: false,
 			loading: false,

+ 178 - 20
src/home.vue

@@ -82,16 +82,17 @@
 									<span style="color:#606266;font-size:14px;padding-top:8px;display: inline-block;">本月A分</span>
 								</p>
 								<!-- <p style="text-align:center;cursor:pointer;margin: 0;" @click="$router.push({ path: '/my_performance' })"><b style="color:#26A2FF;font-size:27px;">{{authorityManagerHeaders.performance?authorityManagerHeaders.performance.review_point:'0'}}</b><br><span style="color:#606266;font-size:14px;padding-top:8px;display: inline-block;">绩效分</span></p> -->
-								<p style="text-align:center;cursor:pointer;margin: 0;" @click="Administrator">
+								<!-- <p style="text-align:center;cursor:pointer;margin: 0;" @click="Administrator"> -->
+								<p style="text-align:center;cursor:pointer;margin: 0;" @click="$router.push({ path: '/my_task' })">
 									<b style="color:#26A2FF;font-size:27px;">
 										{{
 											authorityManagerHeaders.performance
-												? authorityManagerHeaders.performance.total_count + '/' + authorityManagerHeaders.performance.complete_count
+												? authorityManagerHeaders.performance.complete_count + '/' + authorityManagerHeaders.performance.total_count
 												: '0/0'
 										}}
 									</b>
 									<br />
-									<span style="color:#606266;font-size:14px;padding-top:8px;display: inline-block;">任务进度</span>
+									<span style="color:#606266;font-size:14px;padding-top:8px;display: inline-block;">本月任务进度</span>
 								</p>
 							</div>
 						</el-col>
@@ -202,7 +203,7 @@
 						<el-col :span="24"><b class="title" style="margin-bottom:15px;display:block">积分构成</b></el-col>
 
 						<div v-loading="IntegralFormChartLoad">
-							<el-col :span="5" style="position: relative;left:10px;z-index:1;margin-top:10px;">
+							<el-col :span="5" style="position: relative;left:10px;z-index:1;margin-top:10px;" v-if="!this.employeeRout">
 								<el-cascader
 									v-model="dept_name1"
 									:options="dept_tree"
@@ -234,7 +235,7 @@
 							<el-checkbox v-model="exclusiveMonthChecked">不包含自动积分加分项</el-checkbox>
 						</el-col>
 						<div v-loading="monthlyIntegralloading">
-							<el-col :span="5" style="position: relative;left:10px;z-index:1;">
+							<el-col :span="5" style="position: relative;left:10px;z-index:1;" v-if="!this.employeeRout">
 								<el-cascader
 									v-model="dept_name2"
 									:options="dept_tree"
@@ -276,7 +277,7 @@
 					</el-row>
 				</el-row>
 
-				<el-row class="left-all-style" style="">
+				<el-row v-if="!this.employeeRout" class="left-all-style" style="">
 					<el-row style="">
 						<el-col :span="24"><b class="title" style="margin-bottom:15px;display:block">管理者奖扣任务执行情况</b></el-col>
 						<div v-loading="ManagerSAwardloading">
@@ -318,6 +319,17 @@
 				</el-row>
 			</el-col>
 			<el-col :span="6" style="min-width:280px;">
+				<el-row v-if="!creatorJurisdiction">
+					<div class="right-all-style" style="background-color:#fff;padding:20px;;text-align:left;margin-bottom: 10px;">
+					<span class="title">常用</span>
+					<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>
+						</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">本周奖分最高</span>
@@ -387,6 +399,8 @@ var bool = true; // 五秒执行一次变量
 export default {
 	data() {
 		return {
+			employeeRout:this.$authoritys('employee'),
+
 			authorityManagerHeaderLoad: false, //管理员头部loading
 			authorityManagerHeaders: {}, //管理员头部 数据
 			creatorJurisdiction: this.$getIsCreator('creator'), //是否创始人
@@ -471,7 +485,14 @@ export default {
 			//奖扣分
 			highestPrizeBuckleloading: false, //奖扣分最高loading
 			prize: {}, //奖分
-			buckle: {} //扣分
+			buckle: {}, //扣分
+			
+			inCommonUse:[
+				{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'},
+			],
 		};
 	},
 	watch: {
@@ -481,6 +502,14 @@ export default {
 		}
 	},
 	mounted() {
+		if(this.employeeRout){
+			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'},
+			)
+		}
+
 		console.log(encodeURIComponent(`pages/index/index?id=${encodeURIComponent('小米')}`))
 		this.function_All();
 		window.addEventListener('resize', this.selfAdaption);
@@ -496,7 +525,9 @@ export default {
 			this.getDepartment(); //获取部门列表
 			this.rankingListname(); //获取自定义排行榜名
 			this.monthlyIntegral(); //本月积分情况
-			this.ManagerSAward(); //管理者奖扣任务执行情况
+			if(!this.employeeRout){
+				this.ManagerSAward(); //管理者奖扣任务执行情况
+			}
 			this.highestPrizeBuckle(); //奖扣分最高积分事件
 		},
 
@@ -515,12 +546,12 @@ export default {
 			// },20)
 		},
 		openGzd(val) {
-			if (val == '/my_issue') {
-				this.popout();
-			} else {
-				val ? this.$router.push({ path: val }) : '';
-				// localStorage.setItem("path",'2-1');
-			}
+			val ? this.$router.push({ path: val }) : '';
+			// if (val == '/my_issue') {
+			// 	this.popout();
+			// } else {
+			// 	val ? this.$router.push({ path: val }) : '';
+			// }
 		},
 		popout() {
 			if (bool) {
@@ -721,6 +752,9 @@ export default {
 			} else {
 				(params.dept_id = null), (params.month = this.$moment().format('YYYY-MM'));
 			}
+			if(this.employeeRout){
+				params.employee_id = this.$getUserData().id;
+			}
 			this.$axios('get', '/api/integral/statistics/pie/b', params, 'v2')
 				.then(res => {
 					let lists = res.data.data.list;
@@ -997,7 +1031,12 @@ export default {
 			this.monthlyIntegralloading = true;
 			let params = {};
 			let listslength = [];
-			(params.dept_id = this.exclusiveMonthBranch), (params.month = this.$moment().format('YYYY-MM'));
+			if(this.employeeRout){
+				params.employee_id = this.$getUserData().id;
+			}else{
+				(params.dept_id = this.exclusiveMonthBranch)
+			}
+			(params.month = this.$moment().format('YYYY-MM'));
 			if (this.exclusiveMonthChecked) {
 				params.include_fixed = 1;
 			} else {
@@ -1246,7 +1285,14 @@ export default {
 		//   company_info: { creator_ids: [167, 166, 165], id: 15, industry: '计算机软件', is_official: 1, logo_url: '', name: '测试组织', status: 1, user_count_max: 50 },
 		//   employee_detail: {
 		//     dept_list: [{ dept_id: 432675338, dept_name: '技术' }],
-		//     manage_scope: [{ id: 164, name: '刘瑞欣' }, { id: 184, name: '莫仕钊' }],
+		//     manage_scope: [{id: 164,name: "刘瑞欣"},
+		// 		{id: 165,name: "方慧毅"},
+		// 		{id: 166,name: "郭家裕(创始人)"},
+		// 		{id: 184,name: "莫仕钊"},
+		// 		{id: 185,name: "秦杨升"},
+		// 		{id: 186,name: "程健"},
+		// 		{id: 187,name: "梁丽焕"},
+		// 		{id: 188,name: "刘俊华"}],
 		//     permission_list: [],
 		//     role_list: [
 		//       { id: 15, name: 'employee', remark: '员工' },
@@ -1280,7 +1326,95 @@ export default {
 		//   site_config: { a2b: 0, base_point: 0, rule_limit_check: 1, service_point: 0, task_review: 0 },
 		//   site_id: 15
 		// };
-		// localStorage.setItem('userData',JSON.stringify(user));
+    // localStorage.setItem('userData',JSON.stringify(user));
+    
+    
+	var user = {
+      accedence_time: "2020-12-26 15:04:33",
+      company_id: '',
+      company_info: { creator_ids: [167], id: 15, industry: '计算机软件', is_official: 1, logo_url: '', name: '测试组织', status: 1, user_count_max: 50 },
+      employee_detail: {
+        dept_list: [],
+        manage_scope: [{"id": 164,"name": "刘瑞欣"},{"id": 165,"name": "方慧毅"},{"id": 166,"name": "郭家裕(创始人)"},{"id": 184,"name": "莫仕钊"},{"id": 185,"name": "秦杨升"}],
+        permission_list: [],
+        role_list: [
+          { id: 15, name: 'employee', remark: '员工' },
+          { id: 12, name: 'admin', remark: '公司管理员' },
+          { id: 14, name: 'dept_manager', remark: '部门管理者' },
+          { id: 13, name: 'point_manager', remark: '积分管理员' },
+        //   { id: 11, name: 'creator', remark: '创始人' }
+        ],
+        superior_list: [{id: 164,name: "刘瑞欣"},
+				{id: 165,name: "方慧毅"},
+				{id: 166,name: "郭家裕(创始人)"},
+				{id: 184,name: "莫仕钊"},
+				{id: 185,name: "秦杨升"},
+				{id: 187,name: "梁丽焕"},
+				{id: 188,name: "刘俊华"},{id: 167,name: "蔡文"}]
+      },
+      id: 186,
+      img_url: "https://static-legacy.dingtalk.com/media/lADPBE1Xcf-wCfbNAwvNAwA_768_779.jpg",
+      is_admin: 0,
+      is_creator: 0,
+      is_official: 1,
+      is_scope: 1,
+      letter_index: 'C',
+      name: '程健',
+      point_config: {
+        deduct_task_monthly: [
+          {
+            name: "A分",
+            point: "0",
+            pt_id: 2
+          },
+          {
+            name: "B分",
+            point: "0",
+            pt_id: 3
+          }
+        ],
+        reward_ratio: 0,
+        exec_count: 0,
+        exec_count_point: 0,
+        reward_ratio_point: 0,
+        service_point: 0,
+        entry_limit: 1000,
+        point_limit: [
+          {
+            name: "A分",
+            point: "200",
+            pt_id: 2
+          },
+          {
+            name: "B分",
+            point: "100",
+            pt_id: 3
+          }
+        ],
+        reward_task_monthly: [
+          {
+            name: "A分",
+            point: "0",
+            pt_id: 2
+          },
+          {
+            name: "B分",
+            point: "0",
+            pt_id: 3
+          }
+        ],
+      },
+      post: '',
+      site_config: {
+        base_point: 120,
+        rule_limit_check: 1,
+        task_review: 0,
+        service_point: 120,
+        a2b: 0
+      },
+      site_id: 15
+    };
+    localStorage.setItem('userData',JSON.stringify(user));
 	}
 };
 </script>
@@ -1314,7 +1448,7 @@ export default {
 // 	}
 // }
 .left-all-style {
-	margin-top: 20px;
+	margin-top: 10px;
 	padding: 20px;
 	background: #fff;
 	border-radius: 5px;
@@ -1348,7 +1482,7 @@ export default {
 .right-all-style {
 	background: #fff;
 	border-radius: 5px;
-	margin: 0 0 20px 20px;
+	margin: 0 0 10px 20px;
 	.title {
 		padding-left: 10px;
 		font-size: 16px;
@@ -1487,4 +1621,28 @@ export default {
 	width: 100%;
 	// border-bottom:1px solid #EFEFEF;
 }
-</style>
+  .inCommonUseStyle{
+    width:95%;
+    height:54px;
+    border:1px solid #C0C4CC;
+    display:block;
+    margin:16px 0 0 10px;
+    display:flex;
+    line-height:54px;
+    border-radius:5px;
+    cursor:pointer;
+    transition: all .5s;
+  }
+  .inCommonUseStyle b{
+    transition: all .5s;
+    color:#303133;
+    font-size:14px;
+  }
+  .inCommonUseStyle:hover{
+    background-color: #fcfcfc;
+    border: 1px solid #409EFF;
+  }
+  .inCommonUseStyle:hover b{
+    color : #409EFF;
+  }
+</style>

+ 61 - 19
src/index.vue

@@ -11,7 +11,7 @@
 					<div class="flex-box flex-v-ce">
 						<div>您当前为 <span class="blue">"{{corpMessage.package_name}}"</span>,有效期至<span style="color:#FF9600">{{corpMessage.expire_time}}</span></div>
 						<el-button size="small" @click="isTz=true" class="upgrade" type="primary" icon="el-icon-upload">续费升级</el-button>
-						<el-tooltip class="item" effect="dark" content="设置向导" placement="bottom">
+						<el-tooltip class="item" effect="dark" content="设置向导" placement="bottom" v-if="!this.$authoritys('employee') && !this.$authoritys('dept_manager')">
 							<img src="./assets/image/wn.png" class="wn" @click="showWn">
 						</el-tooltip>
 						<userImage :user_name="userData.name" :img_url="userData.img_url" width="44px" height="44px"></userImage>
@@ -23,18 +23,20 @@
 			<el-aside>
 				<el-menu :default-active="defaultActive" class="el-menu-vertical-demo" :router="true" @select="activeRouter" >
 					<template v-for="(item, index) in routers">
-						<el-submenu :index="index.toString()"  :key="index" v-if="item.children.length>1">
-							<template slot="title"><span class="iconfont titleIcon" :class="item.icon" style="font-size: 20px;"></span><span style="margin-left: 5px;">{{item.name}}</span></template>
-							<template v-for="(item2, index2) in item.children">
-								<el-menu-item :index="returnIndex(index,index2)" :ref="item2.path" :route="item2.path" :key="index2" class="font-flex-word">
-									<span slot="title" style="margin-left: 10px;width:120px">{{ item2.name }}</span>
-								</el-menu-item>
-							</template>
-						</el-submenu>
-						<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].name }}</span>
-						</el-menu-item>
+						<div v-if="item.children.length!=0" :key="index">
+							<el-submenu :index="index.toString()"  :key="index" v-if="item.children.length>=1 && item.name!='首页'">
+								<template slot="title"><span class="iconfont titleIcon" :class="item.icon" style="font-size: 20px;"></span><span style="margin-left: 5px;">{{item.name}}</span></template>
+								<template v-for="(item2, index2) in item.children">
+									<el-menu-item :index="returnIndex(index,index2)" :ref="item2.path" :route="item2.path" :key="index2" class="font-flex-word">
+										<span slot="title" style="margin-left: 10px;width:120px">{{ item2.name }}</span>
+									</el-menu-item>
+								</template>
+							</el-submenu>
+							<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].name }}</span>
+							</el-menu-item>
+						</div>
 					</template>	  
 				</el-menu>
 			</el-aside>
@@ -117,10 +119,16 @@ export default {
 		this.routers=[
 			{name:'首页',children:this.returnRoutersArr('home'),icon:'icon-xuanzhong_shouye'},
 			{name:'A/B分',children:this.returnRoutersArr('abPoint'),icon:'icon-PC_gongzuotai_ABfen'},
-			{name:'设置',children:this.returnRoutersArr('set'),icon:'icon-dingdingPC_shezhi'},
+			{name:'任务',children:this.returnRoutersArr('task'),icon:'icon-PC_gongzuotai_renwu'},
 			{name:'统计',children:this.returnRoutersArr('ranking'),icon:'icon-dingdingPC_tongji'},
+			// {name:'设置',children:this.returnRoutersArr('set'),icon:'icon-dingdingPC_shezhi'},
 			];
-		this.routers_one=this.returnRoutersArr('set');
+		//this.$authoritys('权限名') 判断权限
+		if(this.$authoritys('creator') || this.$authoritys('admin') || this.$authoritys('point_manager')){
+			this.routers.push({name:'设置',children:this.returnRoutersArr('set'),icon:'icon-dingdingPC_shezhi'})
+		}
+		//this.returnRoutersArr('set',true) 加true表示不限制路由
+		this.routers_one=this.returnRoutersArr('set',true);
 		this.userData=this.$getUserData();
 		if(this.$route.path!='/home'){//当刷新页面是控制左边导航栏的选中
 			this.defaultActive=localStorage.getItem("path");
@@ -147,7 +155,24 @@ export default {
 	},
 	watch:{
 		 $route(to,from){
-			this.defaultActive = to.meta.identification
+			//多一层判断,防止误入或乱跳页面,判断对应路由是否有权限
+			// if(to.meta.jurisdiction.indexOf(this.$supremeAuthority())==-1){
+			// 	this.$router.push({ path: '/home' })
+			//  this.defaultActive = '0-0'
+			//  localStorage.setItem("path",'0-0');
+			// }else{
+			// }
+
+			 let routes = this.routers[to.meta.identification].children
+			 let paths = ''
+			 for(let i in routes){
+				 if(routes[i].path == to.path){
+					paths = to.meta.identification+'-'+i
+					// paths = this.returnIndex(to.meta.identification,i)
+				 }
+			 }
+			this.defaultActive = paths
+			localStorage.setItem("path",paths);
 		}
 	},
 	methods: {
@@ -183,9 +208,23 @@ export default {
 		//当刷新页面是控制左边导航栏的选中
 		activeRouter(index,indexPath){
 			// console.log(index,indexPath)
-			localStorage.setItem("path",indexPath[1]);
+			localStorage.setItem("path",indexPath[1]?indexPath[1]:indexPath[0]);
+		},
+		routerAstrict(data){//限制路由
+			let obj = []
+			let supAuthority = this.$supremeAuthority()
+			data.forEach(item=>{
+				if(!item.meta.jurisdiction){
+					obj.push(item)
+				}else{
+					if(item.meta.jurisdiction.indexOf(supAuthority)==-1){
+						obj.push(item)
+					}
+				}
+			})
+			return obj
 		},
-		returnRoutersArr(str){
+		returnRoutersArr(str,bool){
 			var routers = this.$router.options.routes[0].children;
 			var routersArr=[];
 			routers.forEach(item=>{
@@ -193,7 +232,10 @@ export default {
 					routersArr.push(item);
 				}
 			})
-			return routersArr;
+			if(bool){
+				return routersArr;
+			}
+			return this.routerAstrict(routersArr);
 		},
 		returnIndex(str,str2){
 			return str+"-"+str2;

+ 1 - 0
src/init.vue

@@ -70,6 +70,7 @@ export default {
 		login(corpId) {
 			var that = this;
 			this.loading = true;
+     		localStorage.setItem('corpId',corpId)
 			this.$dd.runtime.permission.requestAuthCode({
 				corpId: corpId, // 企业id
 				onSuccess: function(info) {

+ 8 - 1
src/main.js

@@ -13,7 +13,7 @@ import service from './api/axios'
 import echarts from 'echarts'
 import NProgress from 'nprogress';
 import 'nprogress/nprogress.css'
-import { getToken, setToken,getUserData,setUserData,getTyps,setTyps,getIsCreator } from './api/auth';
+import { getToken, setToken,getUserData,setUserData,getTyps,setTyps,getIsCreator,supremeAuthority,authoritys} from './api/auth';
 
 // 头像
 import userImage from '@/components/UserImage'
@@ -23,6 +23,11 @@ Vue.use(ElementUI);
 // if (process.env.NODE_ENV === 'development') {
 //   new VConsole()
 // }
+if (process.env.NODE_ENV === 'development') {
+	Vue.prototype.$appId = 50530
+}else if(process.env.NODE_ENV === 'production'){
+	Vue.prototype.$appId = 55493
+}
 Vue.prototype.$echarts = echarts
 Vue.prototype.$dd=dd;
 Vue.prototype.$getToken = getToken
@@ -32,6 +37,8 @@ Vue.prototype.$setUserData = setUserData
 Vue.prototype.$getTyps = getTyps
 Vue.prototype.$setTyps = setTyps
 Vue.prototype.$getIsCreator = getIsCreator
+Vue.prototype.$supremeAuthority = supremeAuthority
+Vue.prototype.$authoritys = authoritys
 Vue.prototype.$moment = moment
 
 Vue.prototype.$http= service;

+ 147 - 95
src/router/index.js

@@ -12,189 +12,241 @@ Vue.use(VueRouter)
 const routes = [{
 		path: '/index',
 		name: '初始页',
-		component: () => import('@/index'),
+		component: () => import(/* webpackChunkName: "index" */'@/index'),
 		redirect: "home",
 		children: [
 			{
 				path: '/home',
 				name: '首页',
 				id:'0',
-				component: () => import('@/home'),
+				component: () => import(/* webpackChunkName: "home" */'@/home'),
 				meta: {
 					icon: 'icon-shezhi_zuzhijiagou',
 					groupCode:'home',
-					identification:'0-0'
+					identification:0,//大分类 下标 的标识,上边groupCode可以用同一个。
 				}
 			},
 			{
 				path: '/award_punish',
 				name: '我奖扣的',
-				component: () => import('@/views/abPoint/award_punish.vue'),
+				component: () => import(/* webpackChunkName: "award_punish" */'@/views/abPoint/award_punish.vue'),
 				meta: {
 					icon: 'icon-shezhi_zuzhijiagou',
 					groupCode:'abPoint',
-					identification:'1-0'
+					identification:1,
+					jurisdiction :['employee']//什么权限隐藏
 				}
 			},
 			{
 				path: '/apply_list',
 				name: '我申请的',
-				component: () => import('@/views/abPoint/apply_list.vue'),
+				component: () => import(/* webpackChunkName: "apply_list" */'@/views/abPoint/apply_list.vue'),
 				meta: {
 					icon: 'icon-shezhi_zuzhijiagou',
 					groupCode:'abPoint',
-					identification:'1-1'
+					identification:1,
+					jurisdiction :['creator']
 				}
-			},			
+			},
+			{
+				path: '/my_issue',
+				name: '我发布的',
+				component: () => import(/* webpackChunkName: "my_issue" */'@/views/task/my_issue.vue'),
+				meta: {
+					icon: 'icon-PC_gongzuotai_renwu',
+					groupCode:'task',
+					identification:2,
+					jurisdiction :['employee']
+				}
+			  },
+			  {
+				path: '/get_task',
+				name: '领任务',
+				component: () => import(/* webpackChunkName: "get_task" */'@/views/task/get_task.vue'),
+				meta: {
+					icon: 'icon-PC_gongzuotai_renwu',
+					groupCode:'task',
+					identification:2,
+				}
+			  },
+			  {
+				path: '/my_task',
+				name: '我的任务',
+				component: () => import(/* webpackChunkName: "my_task" */'@/views/task/my_task.vue'),
+				meta: {
+					icon: 'icon-PC_gongzuotai_renwu',
+					groupCode:'task',
+					identification:2,
+					jurisdiction :['creator']
+				}
+			  },
+			  {
+				  path: '/dept_rank',
+				  name: '阶段排名',
+				  component: () => import(/* webpackChunkName: "dept_rank" */'@/views/ranking/dept_rank.vue'),
+				  meta: {
+					  icon: 'icon-shezhi_zuzhijiagou',
+					  groupCode:'ranking',
+					  identification:3,
+				  }
+			  },
+			  {
+				  path: '/total_rank',
+				  name: '累计B分排名',
+				  component: () => import(/* webpackChunkName: "total_rank" */'@/views/ranking/total_rank.vue'),
+				  meta: {
+					  icon: 'icon-shezhi_jiaose',
+					  groupCode:'ranking',
+					  identification:3,
+				  }
+			  },
+			  {
+				  path: '/custom_rank',
+				  name: '自定义分组B分排名',
+				  component: () => import(/* webpackChunkName: "custom_rank" */'@/views/ranking/custom_rank.vue'),
+				  meta: {
+					  icon: 'icon-shezhi_jichushezhi',
+					  groupCode:'ranking',
+					  identification:3,
+				  }
+			  },
+			  {
+				  path: '/manager_statistics',
+				  name: '管理者奖扣',
+				  component: () => import(/* webpackChunkName: "manager_statistics" */'@/views/ranking/manager_statistics.vue'),
+				  meta: {
+					  icon: 'icon-shezhi_jichushezhi',
+					  groupCode:'ranking',
+					  identification:3,
+					  jurisdiction :['employee']
+				  }
+			  },
+			  {
+				path: '/integral_event',
+				name: '积分事件',
+				component: () => import(/* webpackChunkName: "integral_event" */'@/views/ranking/integral_event.vue'),
+				meta: {
+					icon: 'icon-shezhi_jifenguize',
+					groupCode:'ranking',
+					groupName:"统计",
+					identification:3,
+				}
+			  },
+			  {
+				  path: '/individual_statistics',
+				  name: '个人统计',
+				  component: () => import(/* webpackChunkName: "individual_statistics" */'@/views/ranking/individual_statistics.vue'),
+				  meta: {
+					  icon: 'icon-shezhi_jichushezhi',
+					  groupCode:'ranking',
+					  identification:3,
+				  }
+			  },
+			  {
+				  path: '/department_statistics',
+				  name: '部门统计',
+				  component: () => import(/* webpackChunkName: "department_statistics" */'@/views/ranking/department_statistics.vue'),
+				  meta: {
+					  icon: 'icon-shezhi_jichushezhi',
+					  groupCode:'ranking',
+					  identification:3,
+					  jurisdiction :['employee']
+				  }
+			  },
+			  {
+				path: '/lotteryTicket_statistics',
+				name: '奖票统计',
+				component: () => import(/* webpackChunkName: "lotteryTicket_statistics" */'@/views/ranking/lotteryTicket_statistics'),
+				meta: {
+					icon: 'icon-shezhi_jichushezhi',
+					groupCode:'ranking',
+					identification:3,
+					jurisdiction :['employee']
+				}
+			  },
 			{
 				path: '/framework',
 				name: '组织架构',
-				component: () => import('@/views/set/framework.vue'),
+				component: () => import(/* webpackChunkName: "framework" */'@/views/set/framework.vue'),
 				meta: {
 					icon: 'icon-shezhi_zuzhijiagou',
 					groupCode:'set',
-					identification:'2-0'
+					identification:4,
+					jurisdiction :['dept_manager','employee']
 				}
 			},
 			{
 				path: '/jurisdiction',
 				name: '角色权限',
-				component: () => import('@/views/set/jurisdiction.vue'),
+				component: () => import(/* webpackChunkName: "jurisdiction" */'@/views/set/jurisdiction.vue'),
 				meta: {
 					icon: 'icon-shezhi_jiaose',
 					groupCode:'set',
-					identification:'2-1'
+					identification:4,
+					jurisdiction :['dept_manager','employee']
 				}
 			},
 			{
 				path: '/rule',
 				name: '积分规则',
-				component: () => import('@/views/set/rule.vue'),
+				component: () => import(/* webpackChunkName: "rule" */'@/views/set/rule.vue'),
 				meta: {
 					icon: 'icon-shezhi_jifenguize',
 					groupCode:'set',
 					groupName:"设置",
-					identification:'2-2'
+					identification:4,
+					jurisdiction :['dept_manager','employee']
 				}
 			},
 			{
 				path: '/initialPoint',
 				name: '初始分',
-				component: () => import('@/views/set/initialPoint.vue'),
+				component: () => import(/* webpackChunkName: "initialPoint" */'@/views/set/initialPoint.vue'),
 				meta: {
 					icon: 'icon-shezhi_jichushezhi',
 					groupCode:'set',
-					identification:'2-3'
+					identification:4,
+					jurisdiction :['dept_manager','employee']
 				}
 			},
 			{
 				path: '/check',
 				name: '考勤积分',
-				component: () => import('@/views/set/check.vue'),
+				component: () => import(/* webpackChunkName: "check" */'@/views/set/check.vue'),
 				meta: {
 					icon: 'icon-kaoqin_kaoqinyuebaobiao',
 					groupCode:'set',
-					identification:'2-4'
+					identification:4,
+					jurisdiction :['dept_manager','employee']
 				}
 			},
 			{
 				path: '/voluntarilyPoint',
 				name: '自动积分',
-				component: () => import('@/views/set/voluntarilyPoint.vue'),
+				component: () => import(/* webpackChunkName: "voluntarilyPoint" */'@/views/set/voluntarilyPoint.vue'),
 				meta: {
 					icon: 'icon-shezhi_zidongjifen',
 					groupCode:'set',
-					identification:'2-5'
-				}
-			},
-			{
-				path: '/integral_event',
-				name: '积分事件',
-				component: () => import('@/views/ranking/integral_event.vue'),
-				meta: {
-					icon: 'icon-shezhi_jifenguize',
-					groupCode:'ranking',
-					groupName:"统计",
-					identification:'3-0'
+					identification:4,
+					jurisdiction :['dept_manager','employee']
 				}
 			},
-			{
-				path: '/dept_rank',
-				name: '部门排名',
-				component: () => import('@/views/ranking/dept_rank.vue'),
-				meta: {
-					icon: 'icon-shezhi_zuzhijiagou',
-					groupCode:'ranking',
-					identification:'3-1'
-				}
-			},
-			{
-				path: '/total_rank',
-				name: '累计B分排名',
-				component: () => import('@/views/ranking/total_rank.vue'),
-				meta: {
-					icon: 'icon-shezhi_jiaose',
-					groupCode:'ranking',
-					identification:'3-2'
-				}
-			},
-			{
-				path: '/custom_rank',
-				name: '自定义分组B分排名',
-				component: () => import('@/views/ranking/custom_rank.vue'),
-				meta: {
-					icon: 'icon-shezhi_jichushezhi',
-					groupCode:'ranking',
-					identification:'3-3'
-				}
-			},
-			{
-				path: '/manager_statistics',
-				name: '管理者奖扣',
-				component: () => import('@/views/ranking/manager_statistics.vue'),
-				meta: {
-					icon: 'icon-shezhi_jichushezhi',
-					groupCode:'ranking',
-					identification:'3-4'
-				}
-			},
-			
-			{
-				path: '/department_statistics',
-				name: '部门统计',
-				component: () => import('@/views/ranking/department_statistics.vue'),
-				meta: {
-					icon: 'icon-shezhi_jichushezhi',
-					groupCode:'ranking',
-					identification:'3-5'
-				}
-			},
-			{
-				path: '/individual_statistics',
-				name: '个人统计',
-				component: () => import('@/views/ranking/individual_statistics.vue'),
-				meta: {
-					icon: 'icon-shezhi_jichushezhi',
-					groupCode:'ranking',
-					identification:'3-6'
-				}
-			}
 		]
 	},
 	{
 		path: '/',
 		name: '初始化',
-		component: () => import('@/init'),
+		component: () => import(/* webpackChunkName: "init" */'@/init'),
 	},
 	{
 		path: '/noAccess',
 		name: '无权限',
-		component: () => import('@/noAccess'),
+		component: () => import(/* webpackChunkName: "noAccess" */'@/noAccess'),
 	},
 	{
 		path: '/deptRankSwiper',
 		name: '轮播',
-		component: () => import('@/views/ranking/deptRankSwiper.vue'),
+		component: () => import(/* webpackChunkName: "deptRankSwiper" */'@/views/ranking/deptRankSwiper.vue'),
 	},
 ]
 

+ 187 - 0
src/views/common/below/repeatTaskDetailsPopup.vue

@@ -0,0 +1,187 @@
+<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">
+        <ul>
+          <li class="flex-box">
+            <div class="label">任务内容</div>
+            <div class="content_text">{{workDetailData.name}}</div>
+          </li>
+          <li class="flex-box">
+            <div class="label">任务描述</div>
+            <div class="content_text">{{workDetailData.remark}}</div>
+          </li>
+          <li class="flex-box" v-if="workDetailData">
+            <div class="label">执行周期</div>
+            <div class="content_text">{{workDetailData.task_expire_day}}{{workDetailData.task_cycle == 1?'天':workDetailData.task_cycle == 2?'周':'月'}}</div>
+          </li>
+          <li class="flex-box" v-if="workDetailData.point_config">
+            <div class="label">逾期扣分</div>
+            <div class="content_text">{{workDetailData.point_config.timeout_deduction_point}}/天</div>
+          </li>
+          <li class="flex-box" v-if="workDetailData.point_config">
+            <div class="label">任务积分</div>
+            <div class="content_text">{{workDetailData.point_config.base_point}}</div>
+          </li>
+          <li class="flex-box">
+            <div class="label">任务附件</div>
+            <div class="content_text">
+              <el-image
+                v-for="(item,index) in workDetailData.file_list"
+                :key="index"
+                style="width: 100px; height: 100px"
+                :src="item">
+              </el-image>
+            </div>
+          </li>
+        </ul>
+        <el-row style=" margin-bottom: 20px;">
+          <el-col :span="24" style="line-height: 30px;">审批人</el-col>
+          <el-col :span="24">
+            <div style="display:flex">
+              <userImage class="fl" :id="workDetailData.reviewer_id" :user_name="workDetailData.reviewer_name" width="50px" height="50px" style=" margin-right: 15px;" fontSize="1"></userImage>
+              <p style="margin: 0; line-height: 50px;">{{workDetailData.reviewer_name}}</p>
+            </div>
+          </el-col>
+        </el-row>
+        <el-row v-if="workDetailData.target_info">
+          <el-col :span="24" style="line-height: 30px;">执行人</el-col>
+          <el-col :span="24">
+            <div v-for="(item,index) in workDetailData.target_info" :key="index" style="margin-bottom: 10px;display:flex;">
+              <userImage class="fl" :id="item.id" :user_name="item.name" width="50px" height="50px" style=" margin-right: 15px;" fontSize="1"></userImage>
+              <p style="margin: 0; line-height: 50px;">{{item.name}}</p>
+            </div>
+          </el-col>
+        </el-row>
+      </div>
+    </el-drawer>
+
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'repeatTaskDetailsPopup',
+    props:{
+      title: {
+        type: String,
+        default: ''
+      },
+      visible: {
+        type: Boolean,
+        default: false
+      },
+      id: {
+        type: Number,
+        default: 0
+      },
+    },
+    data() {
+      return {
+        Delay_to_open:false,//打开抽屉
+        
+        loading: false,
+        workDetailData:{},
+      }
+    },
+    components: {},
+    watch:{},
+    mounted() {
+      this.getData()
+      this.Delay_to_open = this.visible//更换打开抽屉时机,避免打开两次
+    },
+    methods: {
+      // 关闭弹窗
+      handleClose(){
+        this.$emit('update:visible', false)
+      },
+      // 获取数据
+      getData(){
+        let self = this
+        self.loading = true
+        let data =  {schedule_id: this.id}
+        self.$axios('get','/api/integral/schedule',data
+        ).then(res => {
+					if (res.data.code == 1) {
+            self.workDetailData = res.data.data
+          }
+          self.loading = false
+				}).finally(()=>{
+          self.loading = false
+        })
+      }
+    }
+  }
+</script>
+<style lang="scss" scoped="scoped">
+  .details_content{
+    & .d_userMessage{
+      margin-left: 10px;
+    }
+    & .d_userMessage div:nth-child(1){
+      font-size: 16px;
+      margin-bottom: 8px;
+    }
+    & .d_userMessage div:nth-child(2){
+      font-size: 12px;
+      color: #909399;
+    }
+    & .d_progress{
+      padding: 12px 0;
+      border-bottom: 1px solid #f1f1f1;
+      margin-bottom: 10px;
+    }
+    & ul{
+      padding: 12px 0;
+      border-bottom: 1px solid #f1f1f1;
+      & li{
+        padding: 6px 0;
+      }
+      & .label{
+        width: 80px;
+        text-align: left;
+        color: #909399;
+      }
+      & .content_text{
+        flex:1
+      }
+    }
+  }
+  .fontColorF{
+    color:#909399;
+  }
+  .details_content {
+    padding: 20px;
+    height: calc(100vh - 60px);
+    overflow: auto;
+    .row_title {
+      position: relative;
+      margin: 0 0 20px 0;
+      padding-top: 12px;
+      font-size: 16px;
+      color: #303133;
+      line-height: 22px;
+    }
+    .row_title:before {
+      position: absolute;
+      top: 0;
+      content: ' ';
+      width: 100%;
+      border-top: 1px #f8f8f8 solid;
+    }
+    .el-row {
+      margin-bottom: 10px;
+      font-size: 14px;
+      .el-col-4 {
+        color: #606266;
+      }
+    }
+  }
+  .details_title {
+    font-size: 18px;
+    padding: 20px;
+    border-bottom: 1px #efefef solid;
+  }
+</style>

+ 443 - 0
src/views/common/below/rewardTask.vue

@@ -0,0 +1,443 @@
+<template>
+  <div>
+    <!-- 悬赏任务弹窗 -->
+    <el-dialog
+      :title="showTitle"
+      :visible.sync="dialogVisible"
+      :close-on-click-modal="false"
+      :before-close="closeDialog"
+      width="600px">
+      <div v-loading="forTheTaskLoading">
+        <el-form :model="formData" ref="formData" label-width="80px">
+          <el-form-item label="任务内容" prop="task_name" :rules="[{ required: true, message: '请填写任务内容', trigger: 'blur' },{ min: 3, max: 20, message: '长度在 3 到 20 个字符', trigger: 'blur' }]">
+            <el-input type="textarea" rows="2" v-model="formData.task_name" placeholder="请输入任务内容(限20字)" class="reward_textarea" ></el-input>
+          </el-form-item>
+
+          <el-form-item label="任务积分" prop="base_point" :rules="[{ required: true, message: '请填写任务积分', trigger: 'blur' }]">
+            <el-input-number v-model="formData.base_point" :min="1" ></el-input-number>
+          </el-form-item>
+
+          <!-- <el-form-item label="执行人" v-if="formData.task_cycle == 0" prop="targets" :rules="[{ required: true, message: '请选择执行人', trigger: 'change' }]">
+            <el-row>
+              <el-col :span="18">
+                <el-input auto-complete="off" v-model="executorName" placeholder="请选择执行人"></el-input>
+                <div @click="show_approval_selector = true" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
+              </el-col>
+            </el-row>
+            <EmployeeSelector
+              :employee_not_select="approval_not_select"
+              :employee_list="employee_list"
+              :isChecKedAll="true"
+              :can_select_employee="true"
+              :can_select_dept="false"
+              :multi="true"
+              :selected="approval_selected"
+              :visible.sync="show_approval_selector"
+              @confirm="approval_confirm"/>
+          </el-form-item> -->
+          <el-form-item label="审批人" prop="reviewer_id" :rules="[{ required: true, message: '请选择审批人', trigger: 'change' }]">
+            <el-row>
+              <el-col :span="18">
+                <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>
+              </el-col>
+            </el-row>
+            <!-- <EmployeeSelector
+              :employee_not_select="reviewer_not_select"
+              :employee_list="reviewer_employee_list"
+              :can_select_employee="true"
+              :can_select_dept="false"
+              :multi="false"
+              :selected="reviewer_selected"
+              :visible.sync="show_reviewer_selector"
+              @confirm="reviewer_confirm"/> -->
+
+              
+						<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"
+								:employee_list="reviewer_employee_list"
+								:can_select_dept="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="pt_id" :rules="[{ required: true, message: '请选择积分类型', trigger: 'blur' }]">
+            <el-radio-group v-model="formData.pt_id" >
+              <el-radio v-for="(item,index) in point_types" :key="index" v-show="item.code !== 'JX'" :label="item.id">{{item.name}}</el-radio>
+            </el-radio-group>            
+          </el-form-item>
+
+          <el-form-item label="截止日期" prop="expire_time" v-if="formData.task_cycle == 0" :rules="[{ required: true, message: '请选择截止日期', trigger: 'blur' }]">
+            <el-date-picker
+              v-model="formData.expire_time"
+              type="datetime"
+              placeholder="选择日期时间"
+              format="yyyy-MM-dd HH:mm"
+              value-format="yyyy-MM-dd HH:mm"
+              default-time="18:00"
+              >
+            </el-date-picker>
+          </el-form-item>
+
+          <el-form-item label="截止日期" prop="task_expire_day" v-if="formData.task_cycle == 1" :rules="[{ required: true, message: '请选择截止日期', trigger: 'blur' }]">
+            <el-select v-model="formData.task_expire_day" placeholder="请选择截止日期">
+              <el-option
+                v-for="item in columns1"
+                :key="item.value"
+                :label="item.name"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item label="截止日期" prop="task_expire_day" v-if="formData.task_cycle == 2" :rules="[{ required: true, message: '请选择截止日期', trigger: 'blur' }]">
+            <el-select v-model="formData.task_expire_day" placeholder="请选择截止日期">
+              <el-option
+                v-for="item in columns2"
+                :key="item.value"
+                :label="item.name"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item label="截止日期" prop="task_expire_day" v-if="formData.task_cycle == 3" :rules="[{ required: true, message: '请选择截止日期', trigger: 'blur' }]">
+            <el-select v-model="formData.task_expire_day" placeholder="请选择截止日期">
+              <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 label="任务备注" prop="task_remark" :rules="[{ max: 100 ,message: '长度不能超过 100 个字', trigger: 'blur' }]">
+            <el-input type="textarea" :rows="5" v-model="formData.task_remark" placeholder="请输入任务内容(限100字)"></el-input>
+          </el-form-item>
+          <el-form-item label="重复周期" prop="task_cycle">
+            <el-select v-model="formData.task_cycle" placeholder="请选择重复周期">
+              <el-option v-for="(item,index) in task_cycle_arr" :key="index" :label="item.name" :value="item.value"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="谁可以看" prop="dept_ids">
+            <!-- <el-row>
+              <el-col :span="18">
+                <el-input auto-complete="off" v-model="deptVisibleName" placeholder="请选中部门的人可领取"></el-input>
+                <div @click="show_employee_selector = true" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
+              </el-col>
+            </el-row> -->
+            <!-- <EmployeeSelector
+              :employee_not_select="dept_not_select"
+              :employee_list="dept_employee_list"
+              :isChecKedAll="false"
+              :can_select_employee="false"
+              :can_select_dept="true"
+              :multi="true"
+              :selected="dept_selected"
+              :visible.sync="show_employee_selector"
+              @confirm="dept_confirm"/> -->
+              
+						<!-- <el-dialog title="选择部门" width="640px" :visible.sync="show_employee_selector" append-to-body :before-close="handleClose">
+							<EmployeeSelector
+								v-if="show_employee_selector"
+								ref="members1"
+								:employee_list="dept_employee_list"
+                :selectDept="true"
+								:selected="dept_selected"
+								@confirm="dept_confirm"
+							/>
+							<span slot="footer" class="dialog-footer">
+								<el-button @click="show_employee_selector = false">取 消</el-button>
+								<el-button type="primary" @click="submitMembers('members1')">确 定</el-button>
+							</span>
+						</el-dialog> -->
+
+            <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>
+
+          <div style="margin-left: 80px; margin-bottom: 8px;">以天为单位,每逾期一天扣分</div>
+          <el-form-item label="逾期扣分" prop="timeout_deduction_point">
+            <el-input v-model="formData.timeout_deduction_point" oninput="value=value.replace(/[^\d]/g,'')" placeholder="请输入数值"></el-input>
+          </el-form-item> 
+
+          <el-form-item>
+            <el-button type="primary" @click="sub('formData')">提交</el-button>
+            <el-button @click="resetForm('formData')">取消</el-button>
+          </el-form-item>
+          
+        </el-form>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import moment from 'moment'
+  import EmployeeSelector from '@/components/EmployeeSelector.vue'
+  export default {
+    name: 'bonusPoints',
+    props:{
+      employee_not_select: {
+        type: Array,
+        default: () => {
+          return []
+        }
+      },
+      dialogVisible: {
+        type: Boolean,
+        default: false
+      },
+      showTitle: {
+        type: String,
+        default: ''
+      }
+    },
+    data() {
+      return {
+        dept_name: [],
+        dept_tree: [],
+        forTheTaskLoading:false,
+        formData: {
+          task_type: '1',
+          pt_id: 2,
+          task_name: '',
+          task_remark: '',
+          base_point: '',
+          expire_time: moment().format('YYYY-MM-DD 18:00'),
+          task_expire_day: '',
+          targets: [],
+          reviewer_id: '',
+          task_cycle: 0,
+          timeout_deduction_point: null,
+          dept_ids: null
+        },
+        point_types: [],
+        // 执行者
+        // executorName: null,
+        // show_approval_selector: false,
+        // approval_selected: {dept: [],employee:[]},
+        // approval_not_select: [],
+        // employee_list: this.$store.getters.user_info.employee_detail.manage_scope,
+        // 审批人
+        reviewerName: null,
+        reviewer_not_select: [],
+        reviewer_employee_list: [],
+        reviewer_selected: {dept: [],employee:[]},
+        show_reviewer_selector: false,
+
+        // 重复周期
+        task_cycle_arr: [
+          {value:  0, name: '不重复'}, 
+          {value:  1, name: '每天重复'}, 
+          {value:  2, name: '每周重复'}, 
+          {value:  3, name: '每月重复'}
+        ],
+        // 周期时间
+        columns1: [{name:'01:00', value: 1}, {name:'02:00', value: 2}, {name:'03:00', value: 3}, {name:'04:00', value: 4}, {name:'05:00', value: 5}, {name:'06:00', value: 6}, {name:'07:00', value: 7}, {name:'08:00', value: 8}, {name:'09:00', value: 9}, {name:'10:00', value: 10}, {name:'11:00', value: 11}, {name:'12:00', value: 12}, {name:'13:00', value: 13}, {name:'14:00', value: 14}, {name:'15:00', value: 15}, {name:'16:00', value: 16}, {name:'17:00', value: 17}, {name:'18:00', value: 18}, {name:'19:00', value: 19}, {name:'20:00', value: 20}, {name:'21:00', value: 21}, {name:'22:00', value: 22}, {name:'23:00', value: 23}, {name:'24:00', value: 24}],
+        columns2: [{name: '周一', value: 1}, {name: '周二', value: 2}, {name: '周三', value: 3}, {name: '周四', value: 4}, {name: '周五', value: 5}, {name: '周六', value: 6}, {name: '周日', value: 7}],
+        columns3: [{name:'1号', value: 1},{name:'2号', value: 2},{name:'3号', value: 3},{name:'4号', value: 4},{name:'5号', value: 5},{name:'6号', value: 6},{name:'7号', value: 7},{name:'8号', value: 8},{name:'9号', value: 9},{name:'10号', value: 10},{name:'11号', value: 11},{name:'12号', value: 12},{name:'13号', value: 13},{name:'14号', value: 14},{name:'15号', value: 15},{name:'16号', value: 16},{name:'17号', value: 17},{name:'18号', value: 18},{name:'19号', value: 19},{name:'20号', value: 20},{name:'21号', value: 21},{name:'22号', value: 22},{name:'23号', value: 23},{name:'24号', value: 24},{name:'25号', value: 25},{name:'26号', value: 26},{name:'27号', value: 27},{name:'28号', value: 28},{name:'29号', value: 29},{name:'30号', value: 30},{name:'31号', value: 31}],
+
+        // 部门可见
+        deptVisibleName: null,
+        dept_not_select: [],
+        dept_employee_list: [],
+        dept_selected: {dept: [],employee:[]},
+        show_employee_selector: false,
+      }
+    },
+    components: {EmployeeSelector},
+    watch:{
+      'formData.task_cycle'(val){
+        if (val) {
+          this.formData.task_expire_day = 1
+        }else{
+          this.formData.expire_time = moment().format('YYYY-MM-DD 18:00')
+        }
+      },
+      // dept_name(){
+      //   console.log(this.dept_name)
+      // }
+    },
+    mounted() {
+      this.point_types = JSON.parse(localStorage.getItem('types'))
+		  this.getDepartment();
+    },
+    methods: {
+      handleChange(val){
+        console.log(this.dept_name)
+        let data = []
+        for(let i in val){
+          data.push(val[i][val[i].length -1])
+          // console.log(val[i][val[i].length -1])
+        }
+        this.formData.dept_ids = data
+      },
+      submitMembers(name) {
+        this.$refs[name].confirm(); //调用组件的confirm();
+      },
+      //关闭
+      handleClose(done) {
+        done();
+      },
+      sub(formName){
+        this.$refs[formName].validate((valid) => {
+          if (valid) {
+            this.saveFun(formName)
+          }
+        });
+      },
+      resetForm(formName){
+        this.$emit('update:dialogVisible', false)
+        this.$refs[formName].resetFields();
+        this.executorName = ''
+        this.reviewerName = ''
+        this.dept_name = []
+        this.reviewer_selected = {dept: [],employee:[]}
+        this.dept_selected = {dept: [],employee:[]}
+      },
+      // 提交
+      saveFun(formName){
+        // 没有选择重复任务的时候
+        // /api/integral/task/publish
+        // 选择重复任务之后
+        // /api/integral/schedule/publish/task
+        this.forTheTaskLoading = true
+        let self = this
+        let data = JSON.parse(JSON.stringify(self.formData))
+        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
+        }
+        self.$axios('post',self.formData.task_cycle == 0?'/api/integral/task/publish':'/api/integral/schedule/publish/task',data
+        ).then(res => {
+          if(res.data.code == 1){
+            this.$parent.get_list()
+            self.$emit('update:dialogVisible', false)
+            self.$refs[formName].resetFields();
+            self.$message.success(res.data.msg)
+            self.executorName = ''
+            self.reviewerName = ''
+            this.dept_name = []
+            this.reviewer_selected = {dept: [],employee:[]}
+            this.dept_selected = {dept: [],employee:[]}
+            this.deptVisibleName = ''
+          }else{
+            self.$message.error(res.data.msg)
+          }
+        }).finally(()=>{
+          setTimeout(()=>{
+            this.forTheTaskLoading = false
+          },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:[]}
+        this.formData.reviewer_id = ''
+        this.reviewerName = ''
+        if (data.employee !== null && data.employee.length != 0) {
+          this.reviewer_selected = data
+          this.formData.reviewer_id = data.employee[0].id
+          this.reviewerName = data.employee[0].name
+        }
+        this.show_reviewer_selector = false
+      },
+      // 审核人 end
+      // 部门可见
+      dept_confirm(data){
+        this.dept_selected = {dept: [],employee:[]}
+        this.formData.dept_ids = []
+        this.deptVisibleName = ''
+        if (data.dept !== null && data.dept.length != 0) {
+          this.dept_selected = data
+          data.dept.forEach(element => {
+						this.formData.dept_ids.push(element.dept_id)
+						this.deptVisibleName += (element.dept_name+',')
+          });
+        }
+        this.show_employee_selector = false
+      },
+      // 部门可见 end
+      closeDialog(){
+        this.resetForm('formData')
+        // this.$emit('update:dialogVisible', false)
+      },
+      
+      //获取部门
+      getDepartment() {
+        this.$axios('get','/api/department/tree').then(res => {
+          this.dept_tree =this.getTreeData(res.data.data.list);
+        });
+      },
+      // 递归判断列表,把最后的children设为undefined
+      getTreeData(data) {
+        for (var i = 0; i < data.length; i++) {
+          if (data[i]._child.length < 1) {
+            // children若为空数组,则将children设为undefined
+            data[i]._child = undefined;
+          } else {
+            // children若不为空数组,则继续 递归调用 本方法
+            this.getTreeData(data[i]._child);
+          }
+        }
+        return data;
+      },
+    }
+  }
+</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;
+    }
+  }
+</style>

+ 543 - 0
src/views/common/below/rewardTaskAmend.vue

@@ -0,0 +1,543 @@
+<template>
+  <div>
+    <!-- 悬赏任务弹窗 -->
+    <el-dialog
+      :title="showTitle"
+      :visible.sync="dialogVisible"
+      :close-on-click-modal="false"
+      :before-close="closeDialog"
+      width="600px">
+      <div v-loading="forTheTaskLoading">
+        <el-form :model="formData" ref="formData" label-width="80px">
+          <el-form-item label="任务内容" prop="task_name" :rules="[{ required: true, message: '请填写任务内容', trigger: 'blur' },{ min: 3, max: 20, message: '长度在 3 到 20 个字符', trigger: 'blur' }]">
+            <el-input type="textarea" rows="2" v-model="formData.task_name" placeholder="请输入任务内容(限20字)" class="reward_textarea" ></el-input>
+          </el-form-item>
+
+          <el-form-item label="任务积分" prop="base_point" :rules="[{ required: true, message: '请填写任务积分', trigger: 'blur' }]">
+            <el-input-number v-model="formData.base_point" :min="1" ></el-input-number>
+          </el-form-item>
+
+          <!-- <el-form-item label="执行人" v-if="formData.task_cycle == 0" prop="targets" :rules="[{ required: true, message: '请选择执行人', trigger: 'change' }]">
+            <el-row>
+              <el-col :span="18">
+                <el-input auto-complete="off" v-model="executorName" placeholder="请选择执行人"></el-input>
+                <div @click="show_approval_selector = true" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
+              </el-col>
+            </el-row>
+            <EmployeeSelector
+              :employee_not_select="approval_not_select"
+              :employee_list="employee_list"
+              :isChecKedAll="true"
+              :can_select_employee="true"
+              :can_select_dept="false"
+              :multi="true"
+              :selected="approval_selected"
+              :visible.sync="show_approval_selector"
+              @confirm="approval_confirm"/>
+          </el-form-item> -->
+          <el-form-item label="审批人" prop="reviewer_id" :rules="[{ required: true, message: '请选择审批人', trigger: 'change' }]">
+            <el-row>
+              <el-col :span="18">
+                <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>
+              </el-col>
+            </el-row>
+            <!-- <EmployeeSelector
+              :employee_not_select="reviewer_not_select"
+              :employee_list="reviewer_employee_list"
+              :can_select_employee="true"
+              :can_select_dept="false"
+              :multi="false"
+              :selected="reviewer_selected"
+              :visible.sync="show_reviewer_selector"
+              @confirm="reviewer_confirm"/> -->
+              
+						<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"
+								:isCreatorSelect="false"
+								:employee_list="reviewer_employee_list"
+								:can_select_dept="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="pt_id" :rules="[{ required: true, message: '请选择积分类型', trigger: 'blur' }]">
+            <el-radio-group v-model="formData.pt_id" >
+              <el-radio v-for="(item,index) in point_types" :key="index" v-show="item.code !== 'JX'" :label="item.id">{{item.name}}</el-radio>
+            </el-radio-group>            
+          </el-form-item>
+
+          <el-form-item label="截止日期" prop="expire_time" v-if="formData.task_cycle == 0" :rules="[{ required: true, message: '请选择截止日期', trigger: 'blur' }]">
+            <el-date-picker
+              v-model="formData.expire_time"
+              type="datetime"
+              placeholder="选择日期时间"
+              format="yyyy-MM-dd HH:mm"
+              value-format="yyyy-MM-dd HH:mm"
+              default-time="18:00"
+              >
+            </el-date-picker>
+          </el-form-item>
+
+          <el-form-item label="截止日期" prop="task_expire_day" v-if="formData.task_cycle == 1" :rules="[{ required: true, message: '请选择截止日期', trigger: 'blur' }]">
+            <el-select v-model="formData.task_expire_day" placeholder="请选择截止日期">
+              <el-option
+                v-for="item in columns1"
+                :key="item.value"
+                :label="item.name"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item label="截止日期" prop="task_expire_day" v-if="formData.task_cycle == 2" :rules="[{ required: true, message: '请选择截止日期', trigger: 'blur' }]">
+            <el-select v-model="formData.task_expire_day" placeholder="请选择截止日期">
+              <el-option
+                v-for="item in columns2"
+                :key="item.value"
+                :label="item.name"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item label="截止日期" prop="task_expire_day" v-if="formData.task_cycle == 3" :rules="[{ required: true, message: '请选择截止日期', trigger: 'blur' }]">
+            <el-select v-model="formData.task_expire_day" placeholder="请选择截止日期">
+              <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 label="任务描述" prop="task_remark" :rules="[{ max: 100 ,message: '长度不能超过 100 个字', trigger: 'blur' }]">
+            <el-input type="textarea" :rows="5" v-model="formData.task_remark" placeholder="请输入任务内容(限100字)"></el-input>
+          </el-form-item>
+          <!-- <el-form-item label="重复周期" prop="task_cycle">
+            <el-select v-model="formData.task_cycle" placeholder="请选择重复周期">
+              <el-option v-for="(item,index) in task_cycle_arr" :key="index" :label="item.name" :value="item.value"></el-option>
+            </el-select>
+          </el-form-item> -->
+          <el-form-item label="谁可以看" prop="dept_ids">
+            <!-- <el-row>
+              <el-col :span="18">
+                <el-input auto-complete="off" v-model="deptVisibleName" placeholder="请选中部门的人可领取"></el-input>
+                <div @click="show_employee_selector = true" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
+              </el-col>
+            </el-row> -->
+            <!-- <EmployeeSelector
+              :employee_not_select="dept_not_select"
+              :employee_list="dept_employee_list"
+              :isChecKedAll="false"
+              :can_select_employee="false"
+              :can_select_dept="true"
+              :multi="true"
+              :selected="dept_selected"
+              :visible.sync="show_employee_selector"
+              @confirm="dept_confirm"/> -->
+						
+            <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>
+
+          <div style="margin-left: 80px; margin-bottom: 8px;">以天为单位,每逾期一天扣分</div>
+          <el-form-item label="逾期扣分" prop="timeout_deduction_point">
+            <el-input v-model="formData.timeout_deduction_point" oninput="value=value.replace(/[^\d]/g,'')" placeholder="请输入数值"></el-input>
+          </el-form-item> 
+
+          <el-form-item>
+            <el-button type="primary" @click="sub('formData')">确认修改</el-button>
+            <el-button @click="resetForm('formData')">取消</el-button>
+          </el-form-item>
+          
+        </el-form>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import moment from 'moment'
+  import EmployeeSelector from '@/components/EmployeeSelector.vue'
+  export default {
+    name: 'bonusPoints',
+    props:{
+      rewardTaskAmendData: {
+        type: Object,
+      },
+      employee_not_select: {
+        type: Array,
+        default: () => {
+          return []
+        }
+      },
+      dialogVisible: {
+        type: Boolean,
+        default: false
+      },
+      showTitle: {
+        type: String,
+        default: ''
+      }
+    },
+    data() {
+      return {
+        dept_name: [],
+        dept_tree: [],
+        forTheTaskLoading:false,
+        formData: {
+          id:0,
+          task_type: '1',
+          pt_id: 2,
+          task_name: '',
+          task_remark: '',
+          base_point: '',
+          expire_time: moment().format('YYYY-MM-DD 18:00'),
+          task_expire_day: '',
+          targets: [],
+          reviewer_id: '',
+          task_cycle: 0,
+          timeout_deduction_point: null,
+          dept_ids: null
+        },
+        point_types: [],
+        // 执行者
+        // executorName: null,
+        // show_approval_selector: false,
+        // approval_selected: {dept: [],employee:[]},
+        // approval_not_select: [],
+        // employee_list: this.$store.getters.user_info.employee_detail.manage_scope,
+        // 审批人
+        reviewerName: null,
+        reviewer_not_select: [],
+        reviewer_employee_list: [],
+        reviewer_selected: {dept: [],employee:[]},
+        show_reviewer_selector: false,
+
+        // 重复周期
+        task_cycle_arr: [
+          {value:  0, name: '不重复'}, 
+          {value:  1, name: '每天重复'}, 
+          {value:  2, name: '每周重复'}, 
+          {value:  3, name: '每月重复'}
+        ],
+        // 周期时间
+        columns1: [{name:'01:00', value: 1}, {name:'02:00', value: 2}, {name:'03:00', value: 3}, {name:'04:00', value: 4}, {name:'05:00', value: 5}, {name:'06:00', value: 6}, {name:'07:00', value: 7}, {name:'08:00', value: 8}, {name:'09:00', value: 9}, {name:'10:00', value: 10}, {name:'11:00', value: 11}, {name:'12:00', value: 12}, {name:'13:00', value: 13}, {name:'14:00', value: 14}, {name:'15:00', value: 15}, {name:'16:00', value: 16}, {name:'17:00', value: 17}, {name:'18:00', value: 18}, {name:'19:00', value: 19}, {name:'20:00', value: 20}, {name:'21:00', value: 21}, {name:'22:00', value: 22}, {name:'23:00', value: 23}, {name:'24:00', value: 24}],
+        columns2: [{name: '周一', value: 1}, {name: '周二', value: 2}, {name: '周三', value: 3}, {name: '周四', value: 4}, {name: '周五', value: 5}, {name: '周六', value: 6}, {name: '周日', value: 7}],
+        columns3: [{name:'1号', value: 1},{name:'2号', value: 2},{name:'3号', value: 3},{name:'4号', value: 4},{name:'5号', value: 5},{name:'6号', value: 6},{name:'7号', value: 7},{name:'8号', value: 8},{name:'9号', value: 9},{name:'10号', value: 10},{name:'11号', value: 11},{name:'12号', value: 12},{name:'13号', value: 13},{name:'14号', value: 14},{name:'15号', value: 15},{name:'16号', value: 16},{name:'17号', value: 17},{name:'18号', value: 18},{name:'19号', value: 19},{name:'20号', value: 20},{name:'21号', value: 21},{name:'22号', value: 22},{name:'23号', value: 23},{name:'24号', value: 24},{name:'25号', value: 25},{name:'26号', value: 26},{name:'27号', value: 27},{name:'28号', value: 28},{name:'29号', value: 29},{name:'30号', value: 30},{name:'31号', value: 31}],
+
+        // 部门可见
+        deptVisibleName: null,
+        dept_not_select: [],
+        dept_employee_list: [],
+        dept_selected: {dept: [],employee:[]},
+        show_employee_selector: false,
+        chapterArr:[],
+
+        oneruleId:[],
+        echoGather:[],
+      }
+    },
+    components: {EmployeeSelector},
+    watch:{
+      'formData.task_cycle'(val){
+        if (val) {
+          this.formData.task_expire_day = 1
+        }else{
+          this.formData.expire_time = moment().format('YYYY-MM-DD 18:00')
+        }
+      },
+      rewardTaskAmendData(){
+        this.formData.id = this.rewardTaskAmendData.id//任务id
+        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.reviewerName = this.rewardTaskAmendData.reviewer_name//审批者id
+
+        this.formData.reviewer_id = this.rewardTaskAmendData.reviewer_id
+        this.reviewer_selected.employee = [{id: this.rewardTaskAmendData.reviewer_id ,img_url:this.rewardTaskAmendData.img_url,name: this.rewardTaskAmendData.reviewer_name}]
+        
+        if(this.rewardTaskAmendData.point_config.timeout_deduction_point != '0'){//逾期扣分/月
+          this.formData.timeout_deduction_point = this.rewardTaskAmendData.point_config.timeout_deduction_point
+        }else{
+          this.formData.timeout_deduction_point = ''
+        }
+        let department_infoName = ''
+        // avatar: "static/images/e66f.jpg"
+        // dept_id: 462
+        // dept_name: "技术部"
+        let deptIDs = []
+        this.dept_selected = {dept: [],employee:[]}
+        for(let i in this.rewardTaskAmendData.department_info){
+          deptIDs.push(this.rewardTaskAmendData.department_info[i].id)
+          let department_infoDept = {}
+          department_infoDept.dept_id = this.rewardTaskAmendData.department_info[i].id
+          department_infoDept.dept_name = this.rewardTaskAmendData.department_info[i].name
+          department_infoDept.avatar = "static/images/e66f.jpg"
+          this.dept_selected.dept.push(department_infoDept)
+          // department_infoName.push(this.rewardTaskAmendData.department_info[i].name)
+          department_infoName+=this.rewardTaskAmendData.department_info[i].name+','
+        }
+        this.deptVisibleName = department_infoName
+        this.formData.dept_ids = deptIDs//可见范围
+        
+        let deptIDdata = deptIDs
+        for(let i in deptIDdata){
+           this.getTreeDatas(this.dept_tree,deptIDdata[i]);
+        }
+        this.dept_name = this.echoGather
+      }
+    },
+    mounted() {
+      this.point_types = JSON.parse(localStorage.getItem('types'))
+		  this.getDepartment();
+    },
+    methods: {
+      // getCascaderObj(val,opt) {
+      //   var thisVue=this
+      //   return val.map(function (value) {
+      //     for (var itm of opt) {
+      //       if (itm.id == value) {
+      //         // console.log("成功匹配")
+      //         thisVue.chapterArr.unshift(itm.id)
+      //         // console.log("第二步找父级。。。")
+      //         // console.log("parentId:"+itm.parentId)
+      //         // thisVue.getCascaderObj([itm.parentId],thisVue.$store.state.selectorMod.contentChas)
+      //         return
+      //       }else{
+      //         if(thisVue.isHasChid(itm)){
+      //           thisVue.getCascaderObj(val,itm.childs)
+      //         }
+      //       }
+      //     }
+      //     return null;
+      //   });
+      // },
+      handleChange(val){
+        let data = []
+        for(let i in val){
+          data.push(val[i][val[i].length -1])
+          // console.log(val[i][val[i].length -1])
+        }
+        this.formData.dept_ids = data
+      },
+
+      submitMembers(name) {
+        this.$refs[name].confirm(); //调用组件的confirm();
+      },
+      //关闭
+      handleClose(done) {
+        done();
+      },
+      sub(formName){
+        this.$refs[formName].validate((valid) => {
+          if (valid) {
+            this.saveFun(formName)
+          }
+        });
+      },
+      resetForm(formName){
+        this.echoGather = []
+        this.$emit('update:dialogVisible', false)
+        this.$refs[formName].resetFields();
+        this.executorName = ''
+        this.reviewerName = ''
+        this.dept_name = []
+        this.dept_selected = {dept: [],employee:[]}
+      },
+      // 提交
+      saveFun(formName){
+        // 没有选择重复任务的时候
+        // /api/integral/task/publish
+        // 选择重复任务之后
+        // /api/integral/schedule/publish/task
+        this.forTheTaskLoading = true
+        let self = this
+        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
+        // }
+        self.$axios('post','/api/integral/task/update',data
+        ).then(res => {
+          if(res.data.code == 1){
+            this.$parent.get_list()
+            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)
+          }
+        }).finally(()=>{
+          this.echoGather = []
+          setTimeout(()=>{
+            this.forTheTaskLoading = false
+          },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:[]}
+        this.formData.reviewer_id = ''
+        this.reviewerName = ''
+        if (data.employee !== null && data.employee.length != 0) {
+          this.reviewer_selected = data
+          this.formData.reviewer_id = data.employee[0].id
+          this.reviewerName = data.employee[0].name
+        }
+        this.show_reviewer_selector = false
+      },
+      // 审核人 end
+      // 部门可见
+      dept_confirm(data){
+        this.dept_selected = {dept: [],employee:[]}
+        this.formData.dept_ids = []
+        this.deptVisibleName = ''
+        if (data.dept !== null && data.dept.length != 0) {
+          this.dept_selected = data
+          data.dept.forEach(element => {
+						this.formData.dept_ids.push(element.dept_id)
+						this.deptVisibleName += (element.dept_name+',')
+          });
+        }
+      },
+      // 部门可见 end
+      closeDialog(){
+        this.echoGather = []
+        this.$emit('update:dialogVisible', false)
+      },
+
+      
+      //获取部门
+      getDepartment() {
+        this.$axios('get','/api/department/tree').then(res => {
+          this.dept_tree =this.getTreeData(res.data.data.list);
+          console.log(this.dept_tree)
+          // let aaa = [438550526,442486286,432649335,442348685]
+          // for(let i in aaa){
+          //   this.getTreeDatas(this.dept_tree,aaa[i]);
+          // }
+          // console.log(this.$refs.depts.getCheckedKeys().concat(this.$refs.depts.getHalfCheckedKeys()))
+          // console.log(this.$refs['depts'])
+
+
+          //FF是父级ID,FF为1时表示没有父了
+          // [{id:100,FF:1,child:[
+          //       {id:200,FF:100,child:[
+          //         {id:300,FF:200,child:[
+          //           {id:400,FF:300},//比如我有id  400 ,求[100,200,300,400] 。或者我有300 。[100,200,300]
+          //         ]},
+          //       ]},
+          //       {id:201,FF:100,child:[
+          //         {id:301,FF:201},//比如我有id  301 ,求[100,201,301]
+          //       ]},
+          //     ]
+          //   },
+          //   {id:101,FF:1,child:[{id:201,FF:101}]},
+          //   {id:102,FF:1,child:[{id:202,FF:102}]},
+          //   {id:103,FF:1},//如果我有103,那就得到[103]
+          // ]
+        });
+      },
+      
+      getTreeDatas(data,item) {
+        // debugger
+        for (let i in data) {
+          if(data[i].id == item){
+            if(data[i].parentid == 1){
+              this.oneruleId.unshift(data[i].id)
+              this.echoGather.push(this.oneruleId)
+              this.oneruleId = []
+              break
+            }else{
+              this.oneruleId.unshift(data[i].id)
+              this.getTreeDatas(this.dept_tree,data[i].parentid)
+            }
+          }else{
+            if(data[i]._child){
+              this.getTreeDatas(data[i]._child,item)
+            }
+          }
+        }
+        return
+      },
+
+      // 递归判断列表,把最后的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;
+      },
+    }
+  }
+</script>
+
+<style>
+</style>

+ 202 - 0
src/views/common/below/rewardTaskDetailsPopup.vue

@@ -0,0 +1,202 @@
+<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">
+        <el-row>
+          <el-col :span="24">
+            <div class="flex-box flex-v-ce">
+              <userImage style="margin-right: 15px;" width="50px" height="50px" class="fl" :id="workDetailData.owner_id" :user_name="workDetailData.owner_name" :img_url="workDetailData.owner_img_url"></userImage>
+              <div>
+                <div style="line-height: 25px;">我悬赏的{{get_point_name(workDetailData.pt_id)}}任务    {{workDetailData.point_config.base_point}}{{get_point_name(workDetailData.pt_id)}}</div>
+                <div style="color: #909399; line-height: 25px;"><b>{{workDetailData.receiver_name}}</b> {{workDetailData.status_mark}}</div>
+              </div>
+            </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="content_text">{{workDetailData.receiver_name}}</div>
+          </li>
+          <li class="flex-box" v-if="workDetailData.status==3 && workDetailData.receiver_id != 0">
+            <div class="label">完成人</div>
+            <div class="content_text">{{workDetailData.receiver_name}}</div>
+          </li>
+          <li class="flex-box" v-if="workDetailData.task_remark">
+            <div class="label">任务备注</div>
+            <div class="content_text">{{workDetailData.task_remark}}</div>
+          </li>
+          <li class="flex-box" v-if="workDetailData.point_config">
+            <div class="label">任务积分</div>
+            <div class="content_text yellow">{{workDetailData.point_config.base_point}}{{get_point_name(workDetailData.pt_id)}}</div>
+          </li>
+          <li class="flex-box">
+            <div class="label">截止时间</div>
+            <div class="content_text">{{workDetailData.end_time}}</div>
+          </li>
+          <li class="flex-box" v-if="workDetailData.point_config">
+            <div class="label">逾期扣分</div>
+            <div class="content_text">{{workDetailData.point_config.timeout_deduction_point}}/天</div>
+          </li>
+          <li class="flex-box" v-if="workDetailData.department_info" >
+            <div class="label">可见范围</div>
+            <div class="content_text">
+              <span v-for="(item,index) in workDetailData.department_info">{{item.name}},</span>
+            </div>
+          </li>
+          <li class="flex-box">
+            <div class="label">任务类型</div>
+            <div class="content_text">{{workDetailData.source_type_mark}}</div>
+          </li>
+        </ul>
+      </div>
+    </el-drawer>
+
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'repeatTaskDetailsPopup',
+    props:{
+      title: {
+        type: String,
+        default: ''
+      },
+      visible: {
+        type: Boolean,
+        default: false
+      },
+      id: {
+        type: Number,
+        default: 0
+      },
+    },
+    data() {
+      return {
+        Delay_to_open:false,//打开抽屉
+
+        loading: false,
+        workDetailData:{
+          point_config:{base_point:''}
+        },
+        point_types: JSON.parse(localStorage.getItem('types'))
+      }
+    },
+    components: {},
+    watch:{},
+    mounted() {
+      this.getData()
+      this.Delay_to_open = this.visible//更换打开抽屉时机,避免打开两次
+    },
+    methods: {
+      // 关闭弹窗
+      handleClose(){
+        this.$emit('update:visible', false)
+      },
+      // 获取数据
+      getData(){
+        let self = this
+        self.loading = true
+        let data =  {task_id: this.id}
+        self.$axios('get','/api/integral/task',data).then(res => {
+					if (res.data.code == 1) {
+            self.workDetailData = res.data.data
+          }
+				}).finally(()=>{
+          self.loading = false
+        })
+      },
+      // 获取积分名称
+      get_point_name(id){
+        let name = ''
+        this.point_types.forEach(element => {
+          if (element.id == id) {
+            name = element.name
+          }
+        });
+        return name
+      },
+    }
+  }
+</script>
+<style lang="scss" scoped="scoped">
+  .details_content{
+    & .d_userMessage{
+      margin-left: 10px;
+    }
+    & .d_userMessage div:nth-child(1){
+      font-size: 16px;
+      margin-bottom: 8px;
+    }
+    & .d_userMessage div:nth-child(2){
+      font-size: 12px;
+      color: #909399;
+    }
+    & .d_progress{
+      padding: 12px 0;
+      border-bottom: 1px solid #f1f1f1;
+      margin-bottom: 10px;
+    }
+    & ul{
+      padding: 12px 0;
+      border-bottom: 1px solid #f1f1f1;
+      & li{
+        padding: 6px 0;
+      }
+      & .label{
+        width: 80px;
+        text-align: left;
+        color: #909399;
+      }
+      & .content_text{
+        flex:1
+      }
+    }
+  }
+  .fontColorF{
+    color:#909399;
+  }
+  .yellow{
+    color: #E6A23C;
+  }
+  .details_content {
+    padding: 20px;
+    height: calc(100vh - 60px);
+    overflow: auto;
+    .row_title {
+      position: relative;
+      margin: 0 0 20px 0;
+      padding-top: 12px;
+      font-size: 16px;
+      color: #303133;
+      line-height: 22px;
+    }
+    .row_title:before {
+      position: absolute;
+      top: 0;
+      content: ' ';
+      width: 100%;
+      border-top: 1px #f8f8f8 solid;
+    }
+    .el-row {
+      margin-bottom: 10px;
+      font-size: 14px;
+      .el-col-4 {
+        color: #606266;
+      }
+    }
+  }
+  .details_title {
+    font-size: 18px;
+    padding: 20px;
+    border-bottom: 1px #efefef solid;
+  }
+</style>

+ 279 - 0
src/views/common/below/taskDetailsPopup.vue

@@ -0,0 +1,279 @@
+<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">
+        <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>
+          <div class="d_userMessage">
+            <div>{{workDetailData.employee_name}}</div>
+            <div v-if="detailType != 2 && workDetailData.dept_list[0]">{{workDetailData.dept_list[0].dept_name}}</div>
+          </div>
+          <!-- 为了在抽屉打开之后获取焦点 -->
+          <el-button type="text" style="padding: 0; margin: 0; visibility: hidden;">test</el-button>
+        </div>
+        <ul>
+          <li class="flex-box">
+            <div class="label">任务内容</div>
+            <div class="content_text">{{workDetailData.task_name}}</div>
+          </li>
+          <li class="flex-box">
+            <div class="label">任务备注</div>
+            <textarea class="flex-1" disabled="disabled" v-model="workDetailData.task_remark"  style="border: none;height:100px"></textarea>
+          </li>
+          <li class="flex-box">
+            <div class="label">任务积分</div>
+            <div class="content_text yellow">{{workDetailData.point_config.base_point}}{{workDetailData.pt_name}}</div>
+          </li>
+          <li class="flex-box" v-if="workDetailData.point_config.review_point">
+            <div class="label">最终分</div>
+            <div class="content_text yellow">{{workDetailData.point_config.review_point}}</div>
+          </li>
+          <li class="flex-box">
+            <div class="label">截止时间</div>
+            <div class="content_text">{{workDetailData.expire_time}}</div>
+          </li>
+          <li class="flex-box" v-if="workDetailData.point_config.timeout_deduction_point>0">
+            <div class="label">逾期扣分</div>
+            <div class="content_text">{{workDetailData.point_config.timeout_deduction_point}}</div>
+          </li>
+          <li class="flex-box">
+            <div class="label">审批人</div>
+            <div class="content_text">{{workDetailData.reviewer_name}}</div>
+          </li>
+          <li class="flex-box">
+            <div class="label">积分种类</div>
+            <div class="content_text">{{workDetailData.pt_name}}</div>
+          </li>
+        </ul>
+        <div v-show="showWork">
+          <div class="d_progress">
+            <div class="flex-box">
+              <div class="flex-1">工作进度({{workDetailData.progress}}%)</div>
+              <!-- <div class="fontColorF addJf" @click="isSlider=true" v-if="workDetailData.employee_id==userId&& workDetailData.status==1">+更新进度</div> -->
+            </div>
+            <el-progress :percentage="workDetailData.progress"></el-progress>
+          </div>
+          <div v-if="Object.keys(workDetailData.process).length === 0">
+            <el-tabs v-model="activeName" >
+              <el-tab-pane label="工作记录" name="work">
+                <div class="flex-box">
+                  <div class="flex-1"></div>
+                  <!-- <div class="fontColorF addJf" @click="isOne=true" v-if="workDetailData.employee_id==userId&&workDetailData.status==1">+记一条工作记录</div> -->
+                </div>
+                <div class="work_box" style="padding-top:10px" v-if="workDetailData.process !== null && workDetailData.process.list !== null">
+                  <div class="flex-box work_item" v-for="(item,index) in workDetailData.process.list" :key="index" v-show="item.point == 0">
+                    <userImage class="user_img person_imghead" width="40px" height="40px" :user_name="item.recorder" :img_url="item.img_url"></userImage>
+                    <div class="work_right flex-1">
+                      <div class="flex-box">
+                        <div class="d_name flex-1">{{item.recorder}}</div>
+                        <div class="d_date">{{item.time}}</div>
+                      </div>
+                      <div class="d_content">{{item.remark}}</div>
+                      <div>
+                        <i class="el-icon-delete delicon color-red" @click="delItem(index,'work')"></i>
+                      </div>
+                    </div>
+                  </div>
+                  <div v-if="!text_list[0]" class="fontColorF" style="text-align: center;">暂无工作记录</div>
+                </div>
+              </el-tab-pane>
+              <el-tab-pane label="记分记录" name="participation">
+                <div class="flex-box" style="padding-bottom: 10px;border-bottom: 1px solid #f1f1f1;">
+                  <div class="flex-1 fontColorF"><span v-if="point_total>0">合计:{{point_total}}</span> </div>
+                  <!-- <div class="fontColorF addJf" @click="isIntegral=true" v-if="workDetailData.reviewer_id==userId&&workDetailData.status==1">+记分</div> -->
+                </div>
+                <div class="work_box" style="padding-top:10px" v-if="workDetailData.process !== null && workDetailData.process.list !== null">
+                  <div class="flex-box work_item" v-for="(item,index) in workDetailData.process.list" :key="index" v-show="item.point != 0">
+                    <userImage class="user_img person_imghead" width="40px" height="40px" :user_name="item.recorder" :img_url="item.img_url"></userImage>
+                    <div class="work_right flex-1">
+                      <div class="flex-box">
+                        <div class="d_name flex-1">{{item.recorder}}
+                        <span class="blue" v-if="item.point>0">+{{item.point}}</span>
+                        <span class="green" v-if="item.point<0">{{item.point}}</span>
+                        </div>
+                        <div class="d_date">{{item.time}}</div>
+                      </div>
+                      <div class="d_content">{{item.remark}}</div>
+                      <div>
+                        <i class="el-icon-delete delicon color-red" @click="delItem(index,'point')"></i>
+                      </div>
+                    </div>
+                  </div>
+                  <div v-if="!point_list[0]" class="fontColorF" style="text-align: center;">暂无记分记录</div>
+                </div>
+              </el-tab-pane>
+            </el-tabs>
+          </div>
+        </div>
+      </div>
+      <!-- <el-row>
+        <el-col :span="24">
+          <el-button type="danger" @click="delItem">删除</el-button>
+        </el-col>
+      </el-row> -->
+    </el-drawer>
+
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'taskDetailsPopup',
+    props:{
+      title: {
+        type: String,
+        default: ''
+      },
+      visible: {
+        type: Boolean,
+        default: false
+      },
+      id: {
+        type: Number,
+        default: 0
+      },
+      showWork: {
+        type: Boolean,
+        default: true
+      },
+      detailType: {
+        type: String,
+        default: ''
+      }
+    },
+    data() {
+      // let getId = this.id
+      return {
+        Delay_to_open:false,//打开抽屉
+        
+        loading: false,
+        workDetailData:{
+          process:[],
+          dept_list:[],
+          point_config:{
+            base_point: '0'
+          }
+        },
+        // itemId: getId,
+        isOne: false,
+        text_list:[],
+        point_total:0,
+        isIntegral:false,
+        point_list:[],
+        // userId:this.$store.getters.user_info.id,
+        activeName: "work",
+        getDataUrl: '/api/integral/work',
+        params: {}
+      }
+    },
+    components: {},
+    watch:{},
+    mounted() {
+      this.detailType == 2?this.getDataUrl = '/api/integral/schedule':this.getDataUrl = '/api/integral/work'
+      this.$nextTick(() => {
+        this.getData()
+        this.Delay_to_open = this.visible//更换打开抽屉时机,避免打开两次
+      })
+    },
+    created() {
+    },
+    methods: {
+      // 关闭弹窗
+      handleClose(){
+        this.$emit('update:visible', false)
+      },
+      // 删除
+      delItem(){
+        console.log('删除')
+      },
+      // 获取数据
+      getData(){
+        let self = this
+        self.loading = true
+        let data =  this.detailType == 2?{schedule_id: this.id}:{work_id: this.id}
+        self.$axios('get',self.getDataUrl,data).then(res => {
+					if (res.data.code == 1) {
+            self.workDetailData = res.data.data
+          }
+				}).finally(()=>{
+          self.loading = false
+        })
+      }
+    },
+    // activated(){
+    //   this.getData()
+    // }
+  }
+</script>
+<style lang="scss" scoped="scoped">
+  .details_content{
+    & .d_userMessage{
+      margin-left: 10px;
+    }
+    & .d_userMessage div:nth-child(1){
+      font-size: 16px;
+      margin-bottom: 8px;
+    }
+    & .d_userMessage div:nth-child(2){
+      font-size: 12px;
+      color: #909399;
+    }
+    & .d_progress{
+      padding: 12px 0;
+      border-bottom: 1px solid #f1f1f1;
+      margin-bottom: 10px;
+    }
+    & ul{
+      padding: 12px 0;
+      border-bottom: 1px solid #f1f1f1;
+      & li{
+        padding: 6px 0;
+      }
+      & .label{
+        width: 80px;
+        text-align: left;
+        color: #909399;
+      }
+      & .content_text{
+        flex:1
+      }
+    }
+  }
+  .fontColorF{
+    color:#909399;
+  }
+  .details_content {
+    padding: 20px;
+    height: calc(100vh - 60px);
+    overflow: auto;
+    .row_title {
+      position: relative;
+      margin: 0 0 20px 0;
+      padding-top: 12px;
+      font-size: 16px;
+      color: #303133;
+      line-height: 22px;
+    }
+    .row_title:before {
+      position: absolute;
+      top: 0;
+      content: ' ';
+      width: 100%;
+      border-top: 1px #f8f8f8 solid;
+    }
+    .el-row {
+      margin-bottom: 10px;
+      font-size: 14px;
+      .el-col-4 {
+        color: #606266;
+      }
+    }
+  }
+  .details_title {
+    font-size: 18px;
+    padding: 20px;
+    border-bottom: 1px #efefef solid;
+  }
+</style>

+ 345 - 0
src/views/common/below/temporaryTask.vue

@@ -0,0 +1,345 @@
+<template>
+  <div>
+    <!-- 临时任务弹窗 -->
+    <el-dialog
+      :title="showTitle"
+      :visible.sync="dialogVisible"
+      :close-on-click-modal="false"
+      :before-close="closeDialog"
+      width="600px">
+      <div>
+        <el-form :model="formData" ref="formData" label-width="80px" v-loading="taskload">
+          <el-form-item label="任务内容" prop="task_name" :rules="[{ required: true, message: '请填写任务内容', trigger: 'blur' },{ min: 3, max: 20, message: '长度在 3 到 20 个字符', trigger: 'blur' }]">
+            <el-input type="textarea" rows="2" v-model="formData.task_name" placeholder="请输入任务内容(限20字)"></el-input>
+          </el-form-item>
+
+          <el-form-item label="任务积分" prop="base_point" :rules="[{ required: true, message: '请填写任务积分', trigger: 'change' }]">
+            <el-input-number v-model="formData.base_point" :min="1"></el-input-number>
+          </el-form-item>
+
+          <el-form-item label="执行人" prop="targets" :rules="[{ required: true, message: '请选择执行人', trigger: 'change' }]">
+            <el-row>
+              <el-col :span="18">
+                <el-input auto-complete="off" v-model="executorName" placeholder="请选择执行人"></el-input>
+                <div @click="show_employee_selector = true" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
+              </el-col>
+            </el-row>
+            <!-- <EmployeeSelector
+              :employee_not_select="approval_not_select"
+              :employee_list="employee_list"
+              :isChecKedAll="true"
+              :can_select_employee="true"
+              :can_select_dept="false"
+              :multi="true"
+              :selected="approval_selected"
+              :visible.sync="show_employee_selector"
+              @confirm="approval_confirm"/> -->
+              
+						<el-dialog title="选择执行人员" width="640px" :visible.sync="show_employee_selector" append-to-body :before-close="handleClose">
+							<EmployeeSelector
+								v-if="show_employee_selector"
+								ref="members"
+								:isCreatorSelect="true"
+								:employee_list="employee_list"
+								:user_no_select="false"
+								:can_select_dept="false"
+                :multi="false"
+								:selected="approval_selected"
+								@confirm="approval_confirm"
+							/>
+							<span slot="footer" class="dialog-footer">
+								<el-button @click="show_employee_selector = false">取 消</el-button>
+								<el-button type="primary" @click="submitEmployee('members')">确 定</el-button>
+							</span>
+						</el-dialog>
+
+          </el-form-item>
+          <el-form-item label="审批人" prop="reviewer_id" :rules="[{ required: true, message: '请选择审批人', trigger: 'change' }]">
+            <el-row>
+              <el-col :span="18">
+                <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>
+              </el-col>
+            </el-row>
+            <!-- <EmployeeSelector
+              :employee_not_select="reviewer_not_select"
+              :employee_list="reviewer_employee_list"
+              :can_select_employee="true"
+              :can_select_dept="false"
+              :multi="false"
+              :use_employee_list="true"
+              :selected="reviewer_selected"
+              :visible.sync="show_reviewer_selector"
+              @confirm="reviewer_confirm"/> -->
+						<el-dialog title="选择审批人员" width="640px" :visible.sync="show_reviewer_selector" append-to-body :before-close="handleClose">
+							<EmployeeSelector
+								v-if="show_reviewer_selector"
+								ref="members1"
+                :isChecKedAll="false"
+								:employee_list="reviewer_employee_list"
+								:can_select_dept="false"
+                :use_Administrator_list="true"
+                :multi="false"
+								: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="submitEmployee('members1')">确 定</el-button>
+							</span>
+						</el-dialog>
+
+          </el-form-item>
+
+          <el-form-item label="积分类型" prop="pt_id" :rules="[{ required: true, message: '请选择积分类型', trigger: 'blur' }]">
+            <el-radio-group v-model="formData.pt_id" >
+              <el-radio v-for="(item,index) in point_types" :key="index" v-show="item.code !== 'JX'" :label="item.id">{{item.name}}</el-radio>
+            </el-radio-group>            
+          </el-form-item>
+
+          <el-form-item label="截止日期" prop="expire_time" v-if="formData.task_cycle == 0" :rules="[{ required: true, message: '请选择截止日期', trigger: 'blur' }]">
+            <el-date-picker
+              v-model="formData.expire_time"
+              type="datetime"
+              placeholder="选择日期时间"
+              format="yyyy-MM-dd HH:mm"
+              value-format="yyyy-MM-dd HH:mm"
+              default-time="18:00"
+              >
+            </el-date-picker>
+          </el-form-item>
+
+          <el-form-item label="截止日期" prop="task_expire_day" v-if="formData.task_cycle == 1" :rules="[{ required: true, message: '请选择截止日期', trigger: 'blur' }]">
+            <el-select v-model="formData.task_expire_day" placeholder="请选择截止日期">
+              <el-option
+                v-for="item in columns1"
+                :key="item.value"
+                :label="item.name"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item label="截止日期" prop="task_expire_day" v-if="formData.task_cycle == 2" :rules="[{ required: true, message: '请选择截止日期', trigger: 'blur' }]">
+            <el-select v-model="formData.task_expire_day" placeholder="请选择截止日期">
+              <el-option
+                v-for="item in columns2"
+                :key="item.value"
+                :label="item.name"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item label="截止日期" prop="task_expire_day" v-if="formData.task_cycle == 3" :rules="[{ required: true, message: '请选择截止日期', trigger: 'blur' }]">
+            <el-select v-model="formData.task_expire_day" placeholder="请选择截止日期">
+              <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 label="任务备注" prop="task_remark" :rules="[{ max: 300 ,message: '长度不能超过 300 个字', trigger: 'blur' }]">
+            <el-input type="textarea" :rows="5" v-model="formData.task_remark" placeholder="请输入任务内容(限300字)"></el-input>
+          </el-form-item>
+          <el-form-item label="重复周期" prop="task_cycle">
+            <el-select v-model="formData.task_cycle" placeholder="请选择重复周期">
+              <el-option v-for="(item,index) in task_cycle_arr" :key="index" :label="item.name" :value="item.value"></el-option>
+            </el-select>
+          </el-form-item>
+
+          <div style="margin-left: 80px; margin-bottom: 8px;">以天为单位,每逾期一天扣分</div>
+          <el-form-item label="逾期扣分" prop="timeout_deduction_point">
+            <el-input v-model="formData.timeout_deduction_point" oninput="value=value.replace(/[^\d]/g,'')" placeholder="请输入数值"></el-input>
+          </el-form-item> 
+
+          <el-form-item>
+            <el-button type="primary" @click="sub('formData')">提交</el-button>
+            <el-button @click="resetForm('formData')">取消</el-button>
+          </el-form-item>
+          
+
+        </el-form>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import moment from 'moment'
+  import EmployeeSelector from '@/components/EmployeeSelector.vue'
+  export default {
+    name: 'temporaryTask',
+    props:{
+      employee_not_select: {
+        type: Array,
+        default: () => {
+          return []
+        }
+      },
+      dialogVisible: {
+        type: Boolean,
+        default: false
+      },
+      showTitle: {
+        type: String,
+        default: ''
+      }
+    },
+    data() {
+      return {
+        taskload:false,
+        formData: {
+          task_name: '',
+          base_point: '',
+          task_remark: '',
+          pt_id: 3,
+          task_expire_day: 1,
+          expire_time: moment().format('YYYY-MM-DD 18:00'),
+          weight: 0,
+          package_id: 0,
+          targets: [],
+          reviewer_id: '',
+          task_cycle: 0,
+          timeout_deduction_point: null
+        },
+        point_types: [],
+        // 执行者
+        executorName: null,
+        show_employee_selector: false,
+        approval_selected: {dept: [],employee:[]},
+        approval_not_select: [],
+        employee_list: this.$getUserData().employee_detail.manage_scope,
+        // 审批人
+        reviewerName: null,
+        reviewer_not_select: [],
+        reviewer_employee_list: [],
+        reviewer_selected: {dept: [],employee:[]},
+        show_reviewer_selector: false,
+
+        // 重复周期
+        task_cycle_arr: [
+          {value:  0, name: '不重复'}, 
+          {value:  1, name: '每天重复'}, 
+          {value:  2, name: '每周重复'}, 
+          {value:  3, name: '每月重复'}
+        ],
+        // 周期时间
+        columns1: [{name:'01:00', value: 1}, {name:'02:00', value: 2}, {name:'03:00', value: 3}, {name:'04:00', value: 4}, {name:'05:00', value: 5}, {name:'06:00', value: 6}, {name:'07:00', value: 7}, {name:'08:00', value: 8}, {name:'09:00', value: 9}, {name:'10:00', value: 10}, {name:'11:00', value: 11}, {name:'12:00', value: 12}, {name:'13:00', value: 13}, {name:'14:00', value: 14}, {name:'15:00', value: 15}, {name:'16:00', value: 16}, {name:'17:00', value: 17}, {name:'18:00', value: 18}, {name:'19:00', value: 19}, {name:'20:00', value: 20}, {name:'21:00', value: 21}, {name:'22:00', value: 22}, {name:'23:00', value: 23}, {name:'24:00', value: 24}],
+        columns2: [{name: '周一', value: 1}, {name: '周二', value: 2}, {name: '周三', value: 3}, {name: '周四', value: 4}, {name: '周五', value: 5}, {name: '周六', value: 6}, {name: '周日', value: 7}],
+        columns3: [{name:'1号', value: 1},{name:'2号', value: 2},{name:'3号', value: 3},{name:'4号', value: 4},{name:'5号', value: 5},{name:'6号', value: 6},{name:'7号', value: 7},{name:'8号', value: 8},{name:'9号', value: 9},{name:'10号', value: 10},{name:'11号', value: 11},{name:'12号', value: 12},{name:'13号', value: 13},{name:'14号', value: 14},{name:'15号', value: 15},{name:'16号', value: 16},{name:'17号', value: 17},{name:'18号', value: 18},{name:'19号', value: 19},{name:'20号', value: 20},{name:'21号', value: 21},{name:'22号', value: 22},{name:'23号', value: 23},{name:'24号', value: 24},{name:'25号', value: 25},{name:'26号', value: 26},{name:'27号', value: 27},{name:'28号', value: 28},{name:'29号', value: 29},{name:'30号', value: 30},{name:'31号', value: 31}],
+      }
+    },
+    components: {EmployeeSelector},
+    watch:{
+      'formData.task_cycle'(val){
+        if (val) {
+          this.formData.task_expire_day = 1
+        }else{
+          this.formData.expire_time = moment().format('YYYY-MM-DD 18:00')
+        }
+      }
+    },
+    mounted() {
+      this.point_types = JSON.parse(localStorage.getItem('types'))
+    },
+    methods: {
+      submitEmployee(name) {
+        this.$refs[name].confirm(); //调用组件的confirm();
+      },
+      //关闭
+      handleClose(done) {
+        done();
+      },
+      sub(formName){
+        this.$refs[formName].validate((valid) => {
+          if (valid) {
+            this.saveFun(formName)
+          }
+        });
+      },
+      resetForm(formName){
+        this.$emit('update:dialogVisible', false)
+        this.$refs[formName].resetFields();
+        this.executorName = ''
+        this.reviewerName = ''
+        this.approval_selected = {dept: [],employee:[]}
+        this.reviewer_selected = {dept: [],employee:[]}
+      },
+      // 提交
+      saveFun(formName){
+        this.taskload = true
+        // 没有选择重复任务的时候
+        // /api/integral/work/publish
+        // 选择重复任务之后
+        // /api/integral/schedule/publish/work
+        
+        let self = this
+        let data = JSON.parse(JSON.stringify(self.formData))
+        if(data.task_cycle == 0){
+          delete data.task_cycle
+          delete data.task_expire_day
+          data.task_remark?'':delete data.task_remark
+          data.timeout_deduction_point?'':delete data.timeout_deduction_point
+        }else{
+          delete data.package_id
+          delete data.weight
+          delete data.expire_time
+          data.task_remark?'':delete data.task_remark
+          data.timeout_deduction_point?'':delete data.timeout_deduction_point
+        }
+        self.$axios('post',self.formData.task_cycle == 0?'/api/integral/work/publish':'/api/integral/schedule/publish/work',data).then(res => {
+          if(res.data.code == 1){
+            this.$parent.get_list()
+            self.$emit('update:dialogVisible', false)
+            self.$refs[formName].resetFields();
+            self.executorName = ''
+            self.reviewerName = ''
+            this.approval_selected = {dept: [],employee:[]},
+            this.reviewer_selected = {dept: [],employee:[]},
+            self.$message.success(res.data.msg)
+          }else{
+            self.$message.error(res.data.msg)
+          }
+        }).finally(()=>{
+          this.taskload = false
+        })
+
+      },
+      // 执行者
+      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+',')
+          });
+        }
+        this.show_employee_selector = false
+      },
+      // 执行者 end
+      // 审核人
+      reviewer_confirm(data){
+        this.reviewer_selected = {dept: [],employee:[]}
+        this.formData.reviewer_id = ''
+        this.reviewerName = ''
+        if (data.employee !== null && data.employee.length != 0) {
+          this.reviewer_selected = data
+          this.formData.reviewer_id = data.employee[0].id
+          this.reviewerName = data.employee[0].name
+        }
+        this.show_reviewer_selector = false
+      },
+      closeDialog(){
+        this.resetForm('formData')
+        // this.$emit('update:dialogVisible', false)
+      }
+    }
+  }
+</script>

+ 371 - 0
src/views/common/below/temporaryTaskAmend.vue

@@ -0,0 +1,371 @@
+<template>
+  <div>
+    <!-- 临时任务弹窗 -->
+    <el-dialog
+      :title="showTitle"
+      :visible.sync="dialogVisible"
+      :close-on-click-modal="false"
+      :before-close="closeDialog"
+      width="600px">
+      <div>
+        <el-form :model="formData" ref="formData" label-width="80px" v-loading="taskload">
+          <el-form-item label="任务内容" prop="task_name" :rules="[{ required: true, message: '请填写任务内容', trigger: 'blur' },{ min: 3, max: 20, message: '长度在 3 到 20 个字符', trigger: 'blur' }]">
+            <el-input type="textarea" rows="2" v-model="formData.task_name" placeholder="请输入任务内容(限20字)"></el-input>
+          </el-form-item>
+
+          <el-form-item label="任务积分" prop="base_point" :rules="[{ required: true, message: '请填写任务积分', trigger: 'change' }]">
+            <el-input-number v-model="formData.base_point" :min="1"></el-input-number>
+          </el-form-item>
+
+          <el-form-item label="执行人" prop="targets" :rules="[{ required: true, message: '请选择执行人', trigger: 'change' }]">
+            <el-row>
+              <el-col :span="18">
+                <el-input auto-complete="off" v-model="executorName" placeholder="请选择执行人"></el-input>
+                <div @click="show_employee_selector = true" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
+              </el-col>
+            </el-row>
+            <!-- <EmployeeSelector
+              :employee_not_select="approval_not_select"
+              :employee_list="employee_list"
+              :isChecKedAll="false"
+              :can_select_employee="true"
+              :can_select_dept="false"
+              :multi="false"
+              :selected="approval_selected"
+              :visible.sync="show_employee_selector"
+              @confirm="approval_confirm"/> -->
+              
+						<el-dialog title="选择执行人" width="640px" :visible.sync="show_employee_selector" append-to-body :before-close="handleClose">
+							<EmployeeSelector
+								v-if="show_employee_selector"
+								ref="members"
+								:isCreatorSelect="true"
+								:employee_list="employee_list"
+								:user_no_select="false"
+								:can_select_dept="false"
+                :multi="false"
+								:selected="approval_selected"
+								@confirm="approval_confirm"
+							/>
+							<span slot="footer" class="dialog-footer">
+								<el-button @click="show_employee_selector = false">取 消</el-button>
+								<el-button type="primary" @click="submitEmployee('members')">确 定</el-button>
+							</span>
+						</el-dialog>
+
+          </el-form-item>
+          <el-form-item label="审批人" prop="reviewer_id" :rules="[{ required: true, message: '请选择审批人', trigger: 'blur' }]">
+            <el-row>
+              <el-col :span="18">
+                <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>
+              </el-col>
+            </el-row>
+            <!-- <EmployeeSelector
+              :employee_not_select="reviewer_not_select"
+              :employee_list="reviewer_employee_list"
+              :can_select_employee="true"
+              :can_select_dept="false"
+              :multi="false"
+              :use_employee_list="true"
+              :selected="reviewer_selected"
+              :visible.sync="show_reviewer_selector"
+              @confirm="reviewer_confirm"/> -->
+						<el-dialog title="选择审批人" width="640px" :visible.sync="show_reviewer_selector" append-to-body :before-close="handleClose">
+							<EmployeeSelector
+								v-if="show_reviewer_selector"
+								ref="members1"
+                :isChecKedAll="false"
+								:isCreatorSelect="false"
+								:employee_list="reviewer_employee_list"
+								:user_no_select="true"
+								:can_select_dept="false"
+                :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="submitEmployee1('members1')">确 定</el-button>
+							</span>
+						</el-dialog>
+
+          </el-form-item>
+
+          <!-- <el-form-item label="积分类型" prop="pt_id" :rules="[{ required: true, message: '请选择积分类型', trigger: 'blur' }]">
+            <el-radio-group v-model="formData.pt_id" >
+              <el-radio v-for="(item,index) in point_types" :key="index" v-show="item.code !== 'JX'" :label="item.id">{{item.name}}</el-radio>
+            </el-radio-group>            
+          </el-form-item> -->
+
+          <el-form-item label="截止日期" prop="expire_time" v-if="formData.task_cycle == 0" :rules="[{ required: true, message: '请选择截止日期', trigger: 'blur' }]">
+            <el-date-picker
+              v-model="formData.expire_time"
+              type="datetime"
+              placeholder="选择日期时间"
+              format="yyyy-MM-dd HH:mm"
+              value-format="yyyy-MM-dd HH:mm"
+              default-time="18:00"
+              >
+            </el-date-picker>
+          </el-form-item>
+
+          <el-form-item label="截止日期" prop="task_expire_day" v-if="formData.task_cycle == 1" :rules="[{ required: true, message: '请选择截止日期', trigger: 'blur' }]">
+            <el-select v-model="formData.task_expire_day" placeholder="请选择截止日期">
+              <el-option
+                v-for="item in columns1"
+                :key="item.value"
+                :label="item.name"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item label="截止日期" prop="task_expire_day" v-if="formData.task_cycle == 2" :rules="[{ required: true, message: '请选择截止日期', trigger: 'blur' }]">
+            <el-select v-model="formData.task_expire_day" placeholder="请选择截止日期">
+              <el-option
+                v-for="item in columns2"
+                :key="item.value"
+                :label="item.name"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item label="截止日期" prop="task_expire_day" v-if="formData.task_cycle == 3" :rules="[{ required: true, message: '请选择截止日期', trigger: 'blur' }]">
+            <el-select v-model="formData.task_expire_day" placeholder="请选择截止日期">
+              <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 label="任务描述" prop="task_remark" :rules="[{ max: 300 ,message: '长度不能超过 300 个字', trigger: 'blur' }]">
+            <el-input type="textarea" :rows="5" v-model="formData.task_remark" placeholder="请输入任务内容(限300字)"></el-input>
+          </el-form-item>
+          <!-- <el-form-item label="重复周期" prop="task_cycle">
+            <el-select v-model="formData.task_cycle" placeholder="请选择重复周期">
+              <el-option v-for="(item,index) in task_cycle_arr" :key="index" :label="item.name" :value="item.value"></el-option>
+            </el-select>
+          </el-form-item> -->
+
+          <div style="margin-left: 80px; margin-bottom: 8px;">以天为单位,每逾期一天扣分</div>
+          <el-form-item label="逾期扣分" prop="timeout_deduction_point">
+            <el-input v-model="formData.timeout_deduction_point" oninput="value=value.replace(/[^\d]/g,'')" placeholder="请输入数值"></el-input>
+          </el-form-item> 
+
+          <el-form-item>
+            <el-button type="primary" @click="sub('formData')">确认修改</el-button>
+            <el-button @click="resetForm('formData')">取消</el-button>
+          </el-form-item>
+          
+
+        </el-form>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import moment from 'moment'
+  import EmployeeSelector from '@/components/EmployeeSelector.vue'
+  // import EmployeeSelector from '@/views/common/EmployeeSelectorCopy'
+  export default {
+    name: 'temporaryTask',
+    props:{
+      modifyData: {
+        type: Object,
+      },
+      employee_not_select: {
+        type: Array,
+        default: () => {
+          return []
+        }
+      },
+      dialogVisible: {
+        type: Boolean,
+        default: false
+      },
+      showTitle: {
+        type: String,
+        default: ''
+      }
+    },
+    data() {
+      return {
+        taskload:false,
+        formData: {
+          id:0,
+          task_name: '',
+          base_point: '',
+          task_remark: '',
+          pt_id: 3,
+          task_expire_day: 1,
+          expire_time: moment().format('YYYY-MM-DD 18:00'),
+          weight: 0,
+          package_id: 0,
+          targets: [],
+          reviewer_id: '',
+          task_cycle: 0,
+          timeout_deduction_point: null
+        },
+        point_types: [],
+        // 执行者
+        executorName: null,
+        show_employee_selector: false,
+        approval_selected: {dept: [],employee:[]},
+        approval_not_select: [],
+        employee_list: this.$getUserData().employee_detail.manage_scope,
+        // 审批人
+        reviewerName: null,
+        reviewer_not_select: [],
+        reviewer_employee_list: [],
+        reviewer_selected: {dept: [],employee:[]},
+        show_reviewer_selector: false,
+
+        // 重复周期
+        task_cycle_arr: [
+          {value:  0, name: '不重复'}, 
+          {value:  1, name: '每天重复'}, 
+          {value:  2, name: '每周重复'}, 
+          {value:  3, name: '每月重复'}
+        ],
+        // 周期时间
+        columns1: [{name:'01:00', value: 1}, {name:'02:00', value: 2}, {name:'03:00', value: 3}, {name:'04:00', value: 4}, {name:'05:00', value: 5}, {name:'06:00', value: 6}, {name:'07:00', value: 7}, {name:'08:00', value: 8}, {name:'09:00', value: 9}, {name:'10:00', value: 10}, {name:'11:00', value: 11}, {name:'12:00', value: 12}, {name:'13:00', value: 13}, {name:'14:00', value: 14}, {name:'15:00', value: 15}, {name:'16:00', value: 16}, {name:'17:00', value: 17}, {name:'18:00', value: 18}, {name:'19:00', value: 19}, {name:'20:00', value: 20}, {name:'21:00', value: 21}, {name:'22:00', value: 22}, {name:'23:00', value: 23}, {name:'24:00', value: 24}],
+        columns2: [{name: '周一', value: 1}, {name: '周二', value: 2}, {name: '周三', value: 3}, {name: '周四', value: 4}, {name: '周五', value: 5}, {name: '周六', value: 6}, {name: '周日', value: 7}],
+        columns3: [{name:'1号', value: 1},{name:'2号', value: 2},{name:'3号', value: 3},{name:'4号', value: 4},{name:'5号', value: 5},{name:'6号', value: 6},{name:'7号', value: 7},{name:'8号', value: 8},{name:'9号', value: 9},{name:'10号', value: 10},{name:'11号', value: 11},{name:'12号', value: 12},{name:'13号', value: 13},{name:'14号', value: 14},{name:'15号', value: 15},{name:'16号', value: 16},{name:'17号', value: 17},{name:'18号', value: 18},{name:'19号', value: 19},{name:'20号', value: 20},{name:'21号', value: 21},{name:'22号', value: 22},{name:'23号', value: 23},{name:'24号', value: 24},{name:'25号', value: 25},{name:'26号', value: 26},{name:'27号', value: 27},{name:'28号', value: 28},{name:'29号', value: 29},{name:'30号', value: 30},{name:'31号', value: 31}],
+      }
+    },
+    components: {EmployeeSelector},
+    watch:{
+      dialogVisible(){
+        if(this.dialogVisible){
+          this.Datas()
+        }
+      },
+      'formData.task_cycle'(val){
+        if (val) {
+          this.formData.task_expire_day = 1
+        }else{
+          this.formData.expire_time = moment().format('YYYY-MM-DD 18:00')
+        }
+      },
+      modifyData(){
+        // this.Datas()
+      }
+    },
+    mounted() {
+      this.point_types = JSON.parse(localStorage.getItem('types'))
+    },
+    methods: {
+      submitEmployee(name) {
+        this.$refs[name].confirm(); //调用组件的confirm();
+      },
+      submitEmployee1(name) {
+        this.$refs[name].confirm(); //调用组件的confirm();
+      },
+      //关闭
+      handleClose(done) {
+        done();
+      },
+      Datas(){
+        this.formData.id = this.modifyData.id
+        this.formData.task_name = this.modifyData.task_name
+        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
+        this.executorName = this.modifyData.employee_name
+        this.reviewerName = this.modifyData.reviewer_name
+
+        // this.formData.targets.push(this.modifyData.employee_id)//执行者
+        this.formData.targets.push(this.modifyData.employee_id)//执行者
+        this.approval_selected.employee = [{id: this.modifyData.employee_id ,img_url:this.modifyData.img_url,name: this.modifyData.employee_name}]
+
+        this.formData.reviewer_id = this.modifyData.reviewer_id
+        this.reviewer_selected.employee = [{id: this.modifyData.reviewer_id ,img_url:this.modifyData.img_url,name: this.modifyData.reviewer_name}]
+        if(this.modifyData.point_config.timeout_deduction_point != '0'){
+          this.formData.timeout_deduction_point = this.modifyData.point_config.timeout_deduction_point
+        }else{
+          this.formData.timeout_deduction_point = ''
+        }
+      },
+      sub(formName){
+        this.$refs[formName].validate((valid) => {
+          if (valid) {
+            this.saveFun(formName)
+          }
+        });
+      },
+      resetForm(formName){
+        this.$emit('update:dialogVisible', false)
+        this.$refs[formName].resetFields();
+        this.executorName = ''
+        this.reviewerName = ''
+      },
+      // 提交
+      saveFun(formName){
+        this.taskload = true
+        // 没有选择重复任务的时候
+        // /api/integral/work/publish
+        // 选择重复任务之后
+        // /api/integral/schedule/publish/work
+        
+        let self = this
+        let data = JSON.parse(JSON.stringify(self.formData))
+        if(data.timeout_deduction_point==''){
+          data.timeout_deduction_point = 0
+        }
+        self.$axios('post','/api/integral/work/update',data).then(res => {
+          if(res.data.code == 1){
+            this.$parent.get_list()
+            self.$emit('update:dialogVisible', false)
+            self.$refs[formName].resetFields();
+            self.executorName = ''
+            self.reviewerName = ''
+            self.$message.success(res.data.msg)
+          }else{
+            self.$message.error(res.data.msg)
+          }
+        }).finally(()=>{
+          this.taskload = false
+        })
+
+      },
+      // 执行者
+      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+',')
+          });
+        }
+        this.show_employee_selector = false
+      },
+      // 执行者 end
+      // 审核人
+      reviewer_confirm(data){
+        this.reviewer_selected = {dept: [],employee:[]}
+        this.formData.reviewer_id = ''
+        this.reviewerName = ''
+        if (data.employee !== null && data.employee.length != 0) {
+          this.reviewer_selected = data
+          this.formData.reviewer_id = data.employee[0].id
+          this.reviewerName = data.employee[0].name
+        }
+        this.show_reviewer_selector = false
+      },
+      closeDialog(){
+        this.$emit('update:dialogVisible', false)
+      }
+    }
+  }
+</script>

+ 278 - 0
src/views/common/taskDetailsPopup.vue

@@ -0,0 +1,278 @@
+<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">
+        <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>
+          <div class="d_userMessage">
+            <div>{{workDetailData.employee_name}}</div>
+            <div v-if="detailType != 2 && workDetailData.dept_list[0]">{{workDetailData.dept_list[0].dept_name}}</div>
+          </div>
+          <!-- 为了在抽屉打开之后获取焦点 -->
+          <el-button type="text" style="padding: 0; margin: 0; visibility: hidden;">test</el-button>
+        </div>
+        <ul>
+          <li class="flex-box">
+            <div class="label">任务内容</div>
+            <div class="content_text">{{workDetailData.task_name}}</div>
+          </li>
+          <li class="flex-box">
+            <div class="label">任务备注</div>
+            <textarea class="flex-1" disabled="disabled" v-model="workDetailData.task_remark"  style="border: none;height:100px"></textarea>
+          </li>
+          <li class="flex-box">
+            <div class="label">任务积分</div>
+            <div class="content_text yellow">{{workDetailData.point_config.base_point}}{{workDetailData.pt_name}}</div>
+          </li>
+          <li class="flex-box" v-if="workDetailData.point_config.review_point">
+            <div class="label">最终分</div>
+            <div class="content_text yellow">{{workDetailData.point_config.review_point}}</div>
+          </li>
+          <li class="flex-box">
+            <div class="label">截止时间</div>
+            <div class="content_text">{{workDetailData.expire_time}}</div>
+          </li>
+          <li class="flex-box" v-if="workDetailData.point_config.timeout_deduction_point>0">
+            <div class="label">逾期扣分</div>
+            <div class="content_text">{{workDetailData.point_config.timeout_deduction_point}}</div>
+          </li>
+          <li class="flex-box">
+            <div class="label">审批人</div>
+            <div class="content_text">{{workDetailData.reviewer_name}}</div>
+          </li>
+          <li class="flex-box">
+            <div class="label">积分种类</div>
+            <div class="content_text">{{workDetailData.pt_name}}</div>
+          </li>
+        </ul>
+        <div v-show="showWork">
+          <div class="d_progress">
+            <div class="flex-box">
+              <div class="flex-1">工作进度({{workDetailData.progress}}%)</div>
+              <!-- <div class="fontColorF addJf" @click="isSlider=true" v-if="workDetailData.employee_id==userId&& workDetailData.status==1">+更新进度</div> -->
+            </div>
+            <el-progress :percentage="workDetailData.progress"></el-progress>
+          </div>
+          <div v-if="Object.keys(workDetailData.process).length === 0">
+            <el-tabs v-model="activeName" >
+              <el-tab-pane label="工作记录" name="work">
+                <div class="flex-box">
+                  <div class="flex-1"></div>
+                  <!-- <div class="fontColorF addJf" @click="isOne=true" v-if="workDetailData.employee_id==userId&&workDetailData.status==1">+记一条工作记录</div> -->
+                </div>
+                <div class="work_box" style="padding-top:10px" v-if="workDetailData.process !== null && workDetailData.process.list !== null">
+                  <div class="flex-box work_item" v-for="(item,index) in workDetailData.process.list" v-show="item.point == 0">
+                    <userImage class="user_img person_imghead" width="40px" height="40px" :user_name="item.recorder" :img_url="item.img_url"></userImage>
+                    <div class="work_right flex-1">
+                      <div class="flex-box">
+                        <div class="d_name flex-1">{{item.recorder}}</div>
+                        <div class="d_date">{{item.time}}</div>
+                      </div>
+                      <div class="d_content">{{item.remark}}</div>
+                      <div>
+                        <i class="el-icon-delete delicon color-red" @click="delItem(index,'work')"></i>
+                      </div>
+                    </div>
+                  </div>
+                  <div v-if="!text_list[0]" class="fontColorF" style="text-align: center;">暂无工作记录</div>
+                </div>
+              </el-tab-pane>
+              <el-tab-pane label="记分记录" name="participation">
+                <div class="flex-box" style="padding-bottom: 10px;border-bottom: 1px solid #f1f1f1;">
+                  <div class="flex-1 fontColorF"><span v-if="point_total>0">合计:{{point_total}}</span> </div>
+                  <!-- <div class="fontColorF addJf" @click="isIntegral=true" v-if="workDetailData.reviewer_id==userId&&workDetailData.status==1">+记分</div> -->
+                </div>
+                <div class="work_box" style="padding-top:10px" v-if="workDetailData.process !== null && workDetailData.process.list !== null">
+                  <div class="flex-box work_item" v-for="(item,index) in workDetailData.process.list" v-show="item.point != 0">
+                    <userImage class="user_img person_imghead" width="40px" height="40px" :user_name="item.recorder" :img_url="item.img_url"></userImage>
+                    <div class="work_right flex-1">
+                      <div class="flex-box">
+                        <div class="d_name flex-1">{{item.recorder}}
+                        <span class="blue" v-if="item.point>0">+{{item.point}}</span>
+                        <span class="green" v-if="item.point<0">{{item.point}}</span>
+                        </div>
+                        <div class="d_date">{{item.time}}</div>
+                      </div>
+                      <div class="d_content">{{item.remark}}</div>
+                      <div>
+                        <i class="el-icon-delete delicon color-red" @click="delItem(index,'point')"></i>
+                      </div>
+                    </div>
+                  </div>
+                  <div v-if="!point_list[0]" class="fontColorF" style="text-align: center;">暂无记分记录</div>
+                </div>
+              </el-tab-pane>
+            </el-tabs>
+          </div>
+        </div>
+      </div>
+      <!-- <el-row>
+        <el-col :span="24">
+          <el-button type="danger" @click="delItem">删除</el-button>
+        </el-col>
+      </el-row> -->
+    </el-drawer>
+
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'taskDetailsPopup',
+    props:{
+      title: {
+        type: String,
+        default: ''
+      },
+      visible: {
+        type: Boolean,
+        default: false
+      },
+      id: {
+        type: Number,
+        default: 0
+      },
+      showWork: {
+        type: Boolean,
+        default: true
+      },
+      detailType: {
+        type: String,
+        default: ''
+      }
+    },
+    data() {
+      let getId = this.id
+      return {
+        Delay_to_open:false,//打开抽屉
+        
+        loading: false,
+        workDetailData:{
+          process:[],
+          dept_list:[],
+          point_config:{
+            base_point: '0'
+          }
+        },
+        itemId: getId,
+        isOne: false,
+        text_list:[],
+        point_total:0,
+        isIntegral:false,
+        point_list:[],
+        userId:this.$getUserData().id,
+        activeName: "work",
+        getDataUrl: '/api/integral/work',
+        params: {}
+      }
+    },
+    components: {},
+    watch:{},
+    mounted() {
+      this.detailType == 2?this.getDataUrl = '/api/integral/schedule':this.getDataUrl = '/api/integral/work'
+      this.$nextTick(() => {
+        this.getData()
+        this.Delay_to_open = this.visible//更换打开抽屉时机,避免打开两次
+      })
+    },
+    methods: {
+      // 关闭弹窗
+      handleClose(){
+        this.$emit('update:visible', false)
+      },
+      // 删除
+      delItem(){
+        console.log('删除')
+      },
+      // 获取数据
+      getData(){
+        let self = this
+        self.loading = true
+        let data =  this.detailType == 2?{schedule_id: this.id}:{work_id: this.id}
+        self.$axios('get',self.getDataUrl,data).then(res => {
+					if (res.data.code == 1) {
+            self.workDetailData = res.data.data
+          }
+          self.loading = false
+				}).finally(()=>{
+          self.loading = false
+        })
+      }
+    },
+    // activated(){
+    //   this.getData()
+    // }
+  }
+</script>
+<style lang="scss" scoped="scoped">
+  .details_content{
+    & .d_userMessage{
+      margin-left: 10px;
+    }
+    & .d_userMessage div:nth-child(1){
+      font-size: 16px;
+      margin-bottom: 8px;
+    }
+    & .d_userMessage div:nth-child(2){
+      font-size: 12px;
+      color: #909399;
+    }
+    & .d_progress{
+      padding: 12px 0;
+      border-bottom: 1px solid #f1f1f1;
+      margin-bottom: 10px;
+    }
+    & ul{
+      padding: 12px 0;
+      border-bottom: 1px solid #f1f1f1;
+      & li{
+        padding: 6px 0;
+      }
+      & .label{
+        width: 80px;
+        text-align: left;
+        color: #909399;
+      }
+      & .content_text{
+        flex:1
+      }
+    }
+  }
+  .fontColorF{
+    color:#909399;
+  }
+  .details_content {
+    padding: 20px;
+    height: calc(100vh - 60px);
+    overflow: auto;
+    .row_title {
+      position: relative;
+      margin: 0 0 20px 0;
+      padding-top: 12px;
+      font-size: 16px;
+      color: #303133;
+      line-height: 22px;
+    }
+    .row_title:before {
+      position: absolute;
+      top: 0;
+      content: ' ';
+      width: 100%;
+      border-top: 1px #f8f8f8 solid;
+    }
+    .el-row {
+      margin-bottom: 10px;
+      font-size: 14px;
+      .el-col-4 {
+        color: #606266;
+      }
+    }
+  }
+  .details_title {
+    font-size: 18px;
+    padding: 20px;
+    border-bottom: 1px #efefef solid;
+  }
+</style>

+ 19 - 3
src/views/ranking/custom_rank.vue

@@ -3,7 +3,7 @@
 		<div class="all">
 			<div class="flex-box">
 				<div class="terr-left">
-					<el-button size="medium" @click="addGroup" type="primary">新建分组</el-button>
+					<el-button v-if="!this.$authoritys('employee') && !this.$authoritys('dept_manager')" size="medium" @click="addGroup" type="primary">新建分组</el-button>
 					<el-menu default-active="0" class="el-menu-vertical-demo" style="border: none" v-if="groups_list.length>0" v-loading="groups_loading">
 						<el-menu-item
 							style="height: 47px;line-height: 47px;"
@@ -28,7 +28,7 @@
 						<div class="flex-box">
 							<div class="flex-box flex-v-ce margin-bottom">
 								<div class="groupsName">{{groups_info.name}}<span class="blue">({{total}}人)</span></div>
-								<el-button @click="editGroup" size="medium">编辑</el-button>
+								<el-button v-if="!this.$authoritys('employee') && !this.$authoritys('dept_manager')" @click="editGroup" size="medium">编辑</el-button>
 							</div>
 						</div>
 						<!-- form -->
@@ -655,7 +655,23 @@ export default {
 			this.groups_loading = true;
 			this.$axios('get','/api/integral/statistics/groups').then(res => {
 				if (res.data.code == 1) {
-					this.groups_list = res.data.data.list;
+					let lists = res.data.data.list;
+					if(this.$authoritys('employee')){//员工权限只能查看包含自己的
+						let user = this.$getUserData().id
+						let data = []
+						lists.forEach(item=>{
+							if(item.employees.length == 0){
+								data.push(item)
+							}else{
+								if(item.employees.indexOf(user.toString())!=-1){
+									data.push(item)
+								}
+							}
+						})
+						this.groups_list = data;
+					}else{
+						this.groups_list = lists;
+					}
 					if(this.groups_list[0]){
 						isAdd? this.open_right(this.groups_list[0]):this.open_right();
 					}else{

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

@@ -491,7 +491,6 @@ export default {
     },
   },
   mounted() {
-    console.log(this.formData)
     this.formData.month = this.$moment().format("YYYY-MM");
     this.executiveFunction();
     window.addEventListener('resize',this.selfAdaption); 
@@ -959,7 +958,7 @@ export default {
   color: #595959;
 }
 .left-all-style {
-  margin-top: 20px;
+  margin-top: 10px;
   padding: 20px;
   background: #fff;
   border-radius: 5px;
@@ -993,7 +992,7 @@ export default {
 .right-all-style {
   background: #fff;
   border-radius: 5px;
-  margin: 0 0 20px 20px;
+  margin: 0 0 10px 20px;
   .title {
     padding-left: 10px;
     font-size: 16px;

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

@@ -869,7 +869,7 @@ export default {
 }
 
 .left-all-style {
-	margin-top: 20px;
+	margin-top: 10px;
 	padding: 20px;
 	background: #fff;
 	border-radius: 5px;
@@ -904,7 +904,7 @@ export default {
 	padding: 20px;
 	background: #fff;
 	border-radius: 5px;
-	margin: 0 0 20px 20px;
+	margin: 0 0 10px 20px;
 	.title {
 		padding-left: 10px;
 		font-size: 16px;

+ 248 - 0
src/views/ranking/lotteryTicket_statistics.vue

@@ -0,0 +1,248 @@
+<template>
+  <div>
+    <el-row :span="24" style="display:flex;min-width:650px;">
+      <el-col style="width:200px;">
+        <el-date-picker
+          v-model="formData.month"
+          type="month"
+          placeholder="请选择月份"
+          value-format="yyyy-MM"
+        ></el-date-picker
+      ></el-col>
+      <el-col style="width:200px;">
+        <el-cascader
+          v-model="dept_name"
+          :options="dept_tree"
+          @change="dept1_null"
+          :props="{
+            checkStrictly: true,
+            value: 'id',
+            label: 'name',
+            children: '_child',
+          }"
+          ref="dept1"
+          filterable
+          change-on-select
+          placeholder="全公司"
+          clearable
+        ></el-cascader>
+      </el-col>
+
+      <el-col class="search" style="width:200px;">
+        <el-input
+          v-model="formData.keywords"
+          placeholder="输入同事姓名"
+          @keyup.enter.native="get_all_integral"
+        >
+          <el-button
+            class="buttonCLo"
+            slot="append"
+            @click="get_all_integral"
+            icon="el-icon-search"
+          ></el-button>
+        </el-input>
+      </el-col>
+    </el-row>
+
+    <div class="all">
+      <div>
+        <el-table
+          :data="all_integral_list"
+          style="width: 100%"
+          v-loading="loading"
+        >
+          <el-table-column prop="employee_name" label="姓名" align="left">
+            <template slot-scope="scope">
+              <div style="display:flex">
+                <span class="fl">
+                  <userImage
+                    :id="scope.row.id"
+                    width="50px"
+                    height="50px"
+                    fontSize="1"
+                    :user_name="scope.row.name"
+                    :img_url="scope.row.img_url"
+                  ></userImage>
+                </span>
+                <span
+                  style="margin-left: 20px; line-height: 50px; display: inline-block"
+                  >{{ scope.row.name }}</span
+                >
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column prop="performance" label="部门" align="left">
+            <template slot-scope="scope">
+              <span>{{ scope.row.dept_name }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="a" label="奖票数量" align="left">
+            <template slot-scope="scope">
+              <span>{{ scope.row.ticketNumber }}</span>
+            </template>
+          </el-table-column>
+          <template slot="empty">
+            <noData></noData>
+          </template>
+        </el-table>
+        <center style="padding: 20px 0;">
+          <el-pagination
+            background
+            @size-change="handleSizeChange1"
+            @current-change="handleCurrentChange"
+            :current-page="formData.page"
+            :page-sizes="[10, 20, 30, 40, 50, 100]"
+            layout="total, sizes, prev, pager, next"
+            :page-size="pageLimit1"
+            :total="total"
+          >
+          </el-pagination>
+        </center>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import noData from '@/components/noData';
+export default {
+  data() {
+    return {
+      loading: false,
+      all_integral_list: null,
+      formData: {
+        month: this.$moment().format("YYYY-MM"),
+        keywords: "",
+        dept_id: "",
+        page: 1,
+        page_size: 10
+      },
+      total: 0,
+      //部门
+      dept_name: [],
+      dept_tree: [],
+      pageLimit1: 10
+    };
+  },
+  components: {noData},
+  watch: {
+    "formData.month"(val, old_val) {
+      this.formData.page = 1;
+      this.get_all_integral();
+    },
+    "formData.dept_id"(val, old_val) {
+      if (!val) {
+        this.formData.dept_id = 0;
+      }
+      this.formData.page = 1;
+      this.get_all_integral();
+    }
+  },
+  mounted() {
+    this.get_all_integral();
+    this.getDepartment(); //部门
+  },
+  methods: {
+    //分页
+    handleSizeChange1(val) {
+      this.pageLimit1 = val;
+      this.formData.page_size = this.pageLimit1;
+      this.get_all_integral();
+    },
+    handleCurrentChange(val) {
+      this.formData.page = val;
+      this.get_all_integral();
+    },
+    //请求数据
+    get_all_integral() {
+      let self = this;
+      self.loading = true;
+      self
+        .$axios("get", "/api/integral/statistics/ticket", self.formData)
+        .then(res => {
+          if (res.data.code == 1) {
+            self.all_integral_list = res.data.data.list;
+            self.total = res.data.data.total;
+          } else {
+            self.$message.error(res.data.data.msg);
+          }
+        })
+        .finally(() => {
+          self.loading = false;
+        });
+    },
+    dept1_null(val) {
+      //部门
+      if (val.length == 0) {
+        this.formData.dept_id = 0;
+      } else {
+        this.formData.dept_id = this.dept_name[this.dept_name.length - 1];
+      }
+      this.$nextTick(() => {
+        this.$refs.dept1.dropDownVisible = false;
+      });
+    },
+    // // 递归判断列表,把最后的children设为undefined
+    // getTreeData(data) {
+    //   for (var i = 0; i < data.length; i++) {
+    //     if (data[i].children.length < 1) {
+    //       // children若为空数组,则将children设为undefined
+    //       data[i].children = undefined;
+    //     } else {
+    //       // children若不为空数组,则继续 递归调用 本方法
+    //       this.getTreeData(data[i].children);
+    //     }
+    //   }
+    //   return data;
+    // },
+
+    
+    //获取部门
+    getDepartment() {
+      this.$axios("get", "/api/department/tree").then((res) => {
+        this.dept_tree = this.getTreeData(res.data.data.list);
+      });
+    },
+    // 递归判断列表,把最后的children设为undefined
+    getTreeData(data) {
+      for (var i = 0; i < data.length; i++) {
+        if (data[i]._child.length < 1) {
+          // children若为空数组,则将children设为undefined
+          data[i]._child = undefined;
+        } else {
+          // children若不为空数组,则继续 递归调用 本方法
+          this.getTreeData(data[i]._child);
+        }
+      }
+      return data;
+    },
+  }
+};
+</script>
+
+<style scoped lang="scss">
+.el-date-editor.el-input {
+  width: auto;
+}
+.date-picker-width {
+  width: 145px !important;
+}
+
+.search ::v-deep .el-input-group__append{
+  background: #FFF;
+}
+.search ::v-deep .el-input-group__append:active {
+  background: #26a2ff;
+}
+.search ::v-deep .el-input-group__append:active .el-icon-search {
+  color: #fff;
+}
+</style>
+<style scoped="scoped" lang="scss">
+
+  .all{
+    margin-top:10px;
+    padding:10px 20px 0px 20px;
+    min-height: calc(100vh - 204px);
+    
+  }
+</style>

+ 12 - 4
src/views/set/check.vue

@@ -101,12 +101,19 @@ export default {
         //   initia_input: {
         //     age: "0",
         //   },
-        // },
+		// },
+		
+		{
+		  initialName: "月度全勤加分",
+		  initia_mark: false,
+		  initia_input: {
+		    age: "0",
+		  },
+		},
       ],
 	  obj: {
 		  // ding_enable:'',
 		  enable:'',
-		  // month_full_ad: "", //>=0
 		  normal: "", //>=0
 		  no_sign: "", //<=0
 		  absent: "", //<=0
@@ -115,6 +122,7 @@ export default {
 		  // ot_per_hour: "", //>=0
 		  ot_per_day:'',
 		  // leave_per_hour: "", //<=0
+		  month_full_ad: "", //>=0
 	  },
     };
   },
@@ -134,7 +142,7 @@ export default {
 	  
    //    objs.ot_per_hour = ok[7].sj; //>=0
    //    objs.leave_per_hour = ok[8].sj>0? -ok[8].sj:ok[8].sj; //<=0
-	  // objs.month_full_ad = 0
+	  objs.month_full_ad = ok[7].sj
       this.$axios('post',"/api/ad/update",objs).then((res) => {
           if (res.data.code == 1) {
             this.$message({
@@ -161,7 +169,6 @@ export default {
 		// config.leave_per_hour=config.leave_per_hour-(config.leave_per_hour+config.leave_per_hour);
 		
 		this.initia_arr[0].initia_input.age =config.enable
-		// this.initia_arr[1].initia_input.age =config.month_full_ad? config.month_full_ad:0  //月度全勤加分
 		this.initia_arr[1].initia_input.age =config.normal? config.normal:0   //正常打卡加分
 		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 //旷工扣分
@@ -170,6 +177,7 @@ export default {
 		// 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  //月度全勤加分
 		
       }).finally(err=>{
 			this.loading = false;

+ 120 - 0
src/views/set/rule.vue

@@ -44,6 +44,19 @@
 								</div>
 							</template>
 						</el-table-column>
+						<el-table-column prop="remark" label="操作" align="center">
+							<!-- <template slot-scope="scope">
+								<el-dropdown placement="bottom" :show-timeout="150" :hide-timeout="150" >
+									<span class="el-dropdown-links" @click.stop="">···</span>
+									<el-dropdown-menu  slot="dropdown" >
+										<el-dropdown-item ><el-button type="text" class="color-red" style="font-size:12px;" v-loading.fullscreen.lock="bodyLoad" @click.stop="ruleQRcode(scope.row)">查看二维码</el-button></el-dropdown-item>
+									</el-dropdown-menu>
+								</el-dropdown>
+							</template> -->
+							<template slot-scope="scope">
+								<div @click.stop="ruleQRcode(scope.row)"><span class="lookQrcode">查看二维码</span></div>
+							</template>
+						</el-table-column>
 						<template slot="empty">
 							<noData></noData>
 						</template>
@@ -51,6 +64,25 @@
 				</div>
 			</div>
 		</div>
+
+		<!-- <el-dialog
+			width="280px"
+			@close="closeCode"
+			:visible.sync="innerVisible"
+			append-to-body>
+			<div class="paycode">
+				<div id="qrcode" ref="qrcode"></div>
+				<div @click.stop="downloadE">下载保存此二维码</div>
+			</div>
+		</el-dialog> -->
+		
+		<el-dialog @close="closeCode" :visible.sync="innerVisible" width="400px" append-to-body>
+			<div style="border-radius: 15px;border: 1px solid #f1f1f1;padding: 10px; width: 223px;box-sizing: border-box;margin: 0 auto;">
+				<div id="qrcode" ref="qrcode"></div>
+			</div>
+			<div class="qrcodesave" ><span @click.stop="downloadE">下载保存此二维码</span></div>
+		</el-dialog>
+
 		<!-- 编辑添加分类 -->
 		<el-dialog :title="class_type == 'add' ? '添加规则分类' : '编辑规则分类'" :visible.sync="class_show" @close="add_dept_close('dept_formdata')" :close-on-click-modal="false" width="500px">
 			<el-form :model="dept_formdata" ref="dept_formdata" :rules="dept_formdata_rules" label-width="80px">
@@ -207,9 +239,13 @@
 
 <script>
 import noData from '@/components/noData';
+import QRCode from 'qrcodejs2';
 export default {
 	data() {
 		return {
+			ruleDetails:{},
+			innerVisible:false,
+      		bodyLoad: false,
 			action:process.env.VUE_APP_BASE_API+'api/rule/import',
 			downloadUrl:process.env.VUE_APP_BASE_API+'api/download/rule_item',
 			ATOKEN: { 'A-TOKEN': this.$getToken(),'Accept':'application/vnd.test.v2+json' },
@@ -350,6 +386,55 @@ export default {
 		// },1000);
 	},
 	methods: {
+		downloadE() {
+			let rule_remark = ''
+			if(this.ruleDetails.remark.length > 10){
+				rule_remark = this.ruleDetails.remark
+				rule_remark = rule_remark.slice(0, 10);
+			}else{
+				rule_remark = this.ruleDetails.remark
+			}
+			var canvasData = this.$refs.qrcode.getElementsByTagName('canvas')
+			var a = document.createElement("a");
+			var event = new MouseEvent("click"); // 创建一个单击事件
+			a.href = canvasData[0].toDataURL("image/png");;
+			a.download = rule_remark;
+			a.dispatchEvent(event); // 触发a的单击事件
+		},
+		payOrder (row) {// 展示二维码
+			let url = 'dingtalk://dingtalkclient/action/open_micro_app'
+			let appid = '?appId='+this.$appId
+			let corpId = '&corpId='+localStorage.getItem('corpId')
+			// let corpId = '&corpId=ding011f57ab048cf202ffe93478753d9884'
+			let page = '&page='+encodeURIComponent(`pages/workbench/apply/apply?id=${encodeURIComponent(row)}`)//encodeURIComponent('小米')
+			let urls = url+appid+corpId+page
+			var qrcode = new QRCode('qrcode', {
+				text: urls, // 二维码内容
+				width: 200,
+				height: 200,
+				// render: 'canvas' // 设置渲染方式(有两种方式 table和canvas,默认是canvas)
+				colorDark: '#34373e', // 二维码色
+				colorLight: '#ffffff', // 背景色
+				correctLevel: QRCode.CorrectLevel.H // 容错等级,H是heigh,最高,所以二维码看起来很密
+			})
+		},
+		ruleQRcode(row){
+			this.ruleDetails = row
+			console.log(row)
+			// 生成二维码
+			this.innerVisible = true
+			// 使用$nextTick确保数据渲染
+			this.$nextTick(() => {
+				this.payOrder(row.id)
+			})
+		},
+		// 关闭弹框,清除已经生成的二维码
+		closeCode () {
+			setTimeout(()=>{
+				this.$refs.qrcode.innerHTML = ''
+			},150)
+		},
+
 		// 导入相关
 		close_import() {
 			this.import_rules_show = false;
@@ -888,6 +973,7 @@ export default {
 </script>
 
 <style scoped lang="scss">
+$red: #f56c6c;
 .select_width .el-select {
 	width: 80px;
 	background-color: #fff;
@@ -950,4 +1036,38 @@ export default {
 	display: block;
 	margin-bottom: 20px;
 }
+
+.el-dropdown-links {
+    font-size: 20px;
+    cursor: pointer;
+    color: #686a6d;
+}
+.color-red{
+  color: $red;
+  &:hover{
+    color: #f14141;
+  }
+}
+.qrcodesave{
+	text-align: center;
+	margin-top: 15px;
+	font-size: 18px;
+	span{
+		color: #606266;
+		cursor:pointer;
+    	transition: all .3s;
+	}
+}
+
+.qrcodesave span:hover{
+	color: #2490fd;
+}
+.lookQrcode{
+	color: #606266;
+	cursor:pointer;
+	transition: all .3s;
+}
+.lookQrcode:hover{
+	color: #2490fd;
+}
 </style>

+ 12 - 14
src/views/set/voluntarilyPoint.vue

@@ -624,21 +624,19 @@ export default {
 			}).then(() => {
 				this.disabled = true;
 				this.$axios('post','/api/integral/rule/destroy',{rule_id: item.id}).then(res => {
-						this.dialogVisible = false;
-						this.disabled = false;
-						if (res.data.code == 1) {
-							this.get_role_lists();
-							this.$message.success('删除成功');
-						}
-					}).catch(err => {
-						this.dialogVisible = false;
-						this.disabled = false;
-					});
-				}).catch(() => {
-					setTimeout(() => {
-						this.dialogVisible = false;
-					}, 300);
+					if (res.data.code == 1) {
+						this.get_role_lists();
+						this.$message.success('删除成功');
+					}
+				}).finally(()=>{
+					this.dialogVisible = false;
+					this.disabled = false;
 				});
+			}).catch(() => {
+				setTimeout(() => {
+					this.dialogVisible = false;
+				}, 300);
+			});
 		},
 		// 获取初始化数据
 		get_role_lists(is,noUpdata) {

+ 346 - 0
src/views/task/get_task.vue

@@ -0,0 +1,346 @@
+<template>
+  <div>
+    <div class="box">
+      <el-tabs v-model="active" type="card">
+        <el-tab-pane label="待领取" name="unclaimed">
+        </el-tab-pane>
+        <el-tab-pane label="已领取" name="received">
+        </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"></el-table-column>
+          <el-table-column label="积分" prop="base_point"></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>
+              <!-- <span>{{scope.row.receiver_id == owner_id?'(发布人)':''}}</span> -->
+            </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"></el-table-column>
+          <el-table-column label="积分" prop="base_point"></el-table-column>
+          <el-table-column label="截止时间" prop="expire_time"></el-table-column>
+          <template slot="empty">
+						<noData></noData>
+          </template>
+        </el-table>
+      </div>
+
+			<center style="padding: 20px 0;">
+				<el-pagination
+					background
+					@size-change="handleSizeChange"
+					@current-change="handleCurrentChange"
+					:page-sizes="[10, 20, 30, 40, 50, 100]"
+					layout="total, sizes, prev, pager, next"
+          :current-page="formData.page"
+					:page-size="formData.page_size"
+					:total="total">
+				</el-pagination>
+			</center>
+
+      <el-drawer
+        title="我是标题"
+        :custom-class="'drawer_details'"
+        :visible.sync="detailShow"
+        :with-header="false"
+        size="500px">
+        <div class="details_title">任务详情</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" :id="active=='unclaimed'?detailInfo.owner_id:detailInfo.receiver_id" :img_url="active=='unclaimed'?detailInfo.owner_img_url:detailInfo.receiver_img_url" class="fl" width="50px" height="50px" fontSize="1.1"></userImage>
+                <span style="line-height:50px; margin-left:10px;margin-right:4px;">{{active=='unclaimed'?detailInfo.owner_name:detailInfo.receiver_name}}</span>
+                <span class="color_red point" v-show="detailInfo.point_config.base_point >= 0"> +{{detailInfo.point_config.base_point}}</span>
+                <span class="color_green point" v-show="detailInfo.point_config.base_point < 0"> {{detailInfo.point_config.base_point}}</span>
+              </div>
+              <!-- {{point_name(detailInfo.pt_id)}} -->
+              <!-- {{point_name(detailInfo.pt_id)}} -->
+            </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.type_mark!==''">
+            <el-col :span="4">任务类型</el-col>
+            <el-col :span="20">{{detailInfo.type_mark}}</el-col>
+          </el-row>
+
+          <el-row  v-if="get_point_name(detailInfo.pt_id)!==''">
+            <el-col :span="4">积分类型</el-col>
+            <el-col :span="20">{{get_point_name(detailInfo.pt_id)}}</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="active =='unclaimed'">
+            <el-col :span="4">审批人</el-col>
+            <el-col :span="20">{{detailInfo.reviewer_name}}</el-col>
+          </el-row>
+
+          <el-row v-if="active !=='unclaimed'">
+            <el-col :span="4">发布人</el-col>
+            <el-col :span="20">{{detailInfo.owner_name}}</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.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>
+  </div>
+</template>
+
+<script>
+  import noData from '@/components/noData';
+  export default {
+    name: 'get_task',
+    data() {
+      return {
+        active: 'unclaimed',
+        list: [],
+        loading: false,
+        receiveLoad: false,
+        total: null,
+        formData: {
+          page: 1,
+          page_size: 10
+        },
+        detailShow: false,
+        detail_loading: false,
+        detailInfo: {
+          point_config:{},
+          task_file_list: []
+        },
+        point_types: JSON.parse(localStorage.getItem('types')),
+        user_id: this.$getUserData().id
+      }
+    },
+    mounted() {
+      this.get_list()
+    },
+    components: {noData},
+    watch:{
+      active(val){
+        this.list = []
+        this.get_list()
+      }
+    },
+    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
+				})
+      },
+			// 页面变更
+      handleCurrentChange(val) {
+				this.formData.page = val
+				this.get_list()
+			},
+      handleSizeChange(val){
+        this.formData.page_size = val
+        this.get_list()
+      },
+
+      // 打开详情弹窗
+      openDetail(item){
+        this.detailShow = true
+        this.getDetailInfo(item)
+      },
+      // 获取详情信息
+      getDetailInfo(item){
+        let self = this
+        self.detail_loading = true
+        let data = {task_id: item.id}
+        self.$axios('get','/api/integral/task',data).then((res) => {
+          if (res.data.code == 1) {
+            self.detailInfo = JSON.parse(JSON.stringify(res.data.data))
+          }else{
+            self.$message.error(res.data.data.msg)
+          }
+        }).finally(() => {
+          self.detail_loading = false
+        })
+      },
+      // 获取列表信息
+      get_list(){
+        let self = this
+        self.loading = true
+        let data = JSON.parse(JSON.stringify(this.formData))
+        if (self.active == 'unclaimed') {
+          data.hall_type = 'waiting'
+        }else{
+          data.hall_type = 'catch'
+        }
+        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
+        })
+      },
+      // point_name(id){
+      //   return this.point_types.find((item)=>{if (item.id == id) {return item.name}}).name
+      // },
+      // 获取积分名称
+      get_point_name(id){
+        let name = ''
+        this.point_types.forEach(element => {
+          if (element.id == id) {
+            name = element.name
+          }
+        });
+        return name
+      },
+
+      
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .box{
+    min-height: calc(100vh - 184px);
+    min-width: 800px;
+    background-color: #fff;
+    padding: 20px;
+  }
+  .color_red{
+    color: #F56C6C;
+  }
+  .color_green{
+    color: #67C23A;
+  }
+  .details_content{
+    .row_title{
+      position:relative;
+      margin:0 0 20px 0;
+      padding-top: 12px;
+      font-size: 16px;
+      color: #303133;
+      line-height: 22px;
+    }
+    .row_title:before{
+      position: absolute;
+      top: 0;
+      content: " ";
+      width: 100%;
+      border-top: 1px #f8f8f8 solid;
+    }
+    .el-row {
+      margin-bottom:10px;
+      font-size: 14px;
+      .el-col-4{
+        color: #606266;
+      }
+    }
+  }
+   ::v-deep .el-table tr:hover{
+    cursor:pointer
+  }
+
+  
+  .details_content {
+    padding: 20px;
+    height: calc(100vh - 60px);
+    overflow: auto;
+    .row_title {
+      position: relative;
+      margin: 0 0 20px 0;
+      padding-top: 12px;
+      font-size: 16px;
+      color: #303133;
+      line-height: 22px;
+    }
+    .row_title:before {
+      position: absolute;
+      top: 0;
+      content: ' ';
+      width: 100%;
+      border-top: 1px #f8f8f8 solid;
+    }
+    .el-row {
+      margin-bottom: 10px;
+      font-size: 14px;
+      .el-col-4 {
+        color: #606266;
+      }
+    }
+  }
+  .details_title {
+    font-size: 18px;
+    padding: 20px;
+    border-bottom: 1px #efefef solid;
+  }
+</style>

+ 558 - 0
src/views/task/my_issue.vue

@@ -0,0 +1,558 @@
+<template>
+  <div>
+    <div class="box">
+      <el-tabs v-model="status" type="card">
+        <el-tab-pane v-for="(item,index) in tabsOption" :key="index" :label="item.label" :name="item.name"></el-tab-pane>
+      </el-tabs>
+      <el-form ref="formData" :inline="true" :model="formData" label-width="70px">
+        <el-form-item>
+          <el-dropdown @command="downClick">
+            <el-button type="primary">
+              发布任务<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-menu>
+          </el-dropdown>          
+        </el-form-item>
+        <el-form-item v-if="status == 'assign' || status == 'reward'" label="积分类型">
+          <el-select v-model="formData.pt_id" placeholder="请选择排序">
+            <el-option v-for="item in point_types" :key="item.id" :label="item.name" :value="item.id"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="status == 'assign'" label="任务状态">
+          <el-select v-model="formData.status" placeholder="请选择排序">
+            <el-option v-for="item in task_status" :key="item.id" :label="item.name" :value="item.code"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="status == 'reward'" label="排序">
+          <el-select v-model="formData.order_by" placeholder="请选择排序">
+            <el-option v-for="item in order_by" :key="item.id" :label="item.name" :value="item.code"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item v-if="status == 'assign'" label="排序" label-width="45px">
+          <el-select v-model="formData.sort" placeholder="请选择排序">
+            <el-option v-for="item in sort" :key="item.id" :label="item.name" :value="item.code"></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+
+      <div v-if="status == 'assign'">
+        <el-table :data="list" style="width: 100%" v-loading="loading" @row-click="rowClick">
+          <el-table-column label="执行人" prop="task_name" width='250px'>
+            <template slot-scope="scope">
+              <div style="display:flex">
+                <userImage class="fl" width="50px" height="50px" :id="scope.row.employee_id" :user_name="scope.row.employee_name"></userImage>
+                <span style="line-height: 50px; padding-left: 10px;">{{scope.row.employee_name}}的{{scope.row.pt_name}}任务</span>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column label="任务内容" prop="task_name">
+            <template slot-scope="scope">
+              <el-popover trigger="hover" placement="top">
+                <span>{{ scope.row.task_name }}</span>
+                <div slot="reference" class="name-wrapper">
+                  <span style="white-space: normal; overflow: hidden;">{{ scope.row.task_name }}</span>
+                </div>
+              </el-popover>
+            </template>
+          </el-table-column>
+          <el-table-column label="积分" prop="point_config.base_point" width="100px">
+            <template slot-scope="scope">
+              <span v-if="scope.row.point_config?scope.row.point_config.base_point >= 0 && scope.row.status == 2 :false">+ {{scope.row.point_config.base_point}}</span>
+              <span v-else>{{scope.row.point_config?scope.row.point_config.base_point:''}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="截止时间" prop="expire_time">
+            <template slot-scope="scope">
+              <span>{{scope.row.expire_time}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="状态" prop="owner_id" width="100px">
+            <template slot-scope="scope">
+              <span :class="scope.row.status == 1?'color_yelllo':scope.row.status == 2?'color_green':scope.row.status == 3?'color_3':scope.row.status == 4?'color_4':scope.row.status == 5?'color_5':''">{{scope.row.status == 1?'进行中':scope.row.status == 2?'已完成':scope.row.status == 3?'已退回':scope.row.status == 4?'已审批':scope.row.status == 5?'已撤销':''}}</span>
+            </template>
+          </el-table-column>
+
+          <el-table-column prop="base_point" label="操作" align="center" width='80px'>
+            <template slot-scope="scope">
+              <el-dropdown placement="bottom" :show-timeout="150" :hide-timeout="150" >
+              <span class="el-dropdown-links" @click.stop="">···</span>
+              <el-dropdown-menu  slot="dropdown" >
+                <!-- <el-dropdown-item :disabled="false" v-if="scope.row.source_type==1"><el-button type="text" class="color-red" v-loading.fullscreen.lock="bodyLoad" @click.stop="issueAmend1(scope.row)">修改</el-button></el-dropdown-item> -->
+                <el-dropdown-item :disabled="false" v-if="scope.row.status==1"><el-button type="text" class="color-red" v-loading.fullscreen.lock="bodyLoad" @click.stop="issueAmend1(scope.row)">修改</el-button></el-dropdown-item>
+                <el-dropdown-item :disabled="false"><el-button type="text" class="color-red" v-loading.fullscreen.lock="bodyLoad" @click.stop="deletes(scope.row,0)">删除</el-button></el-dropdown-item>
+              </el-dropdown-menu>
+            </el-dropdown>
+            </template>
+          </el-table-column>
+
+          <template slot="empty">
+						<noData></noData>
+          </template>
+        </el-table>
+      </div>
+
+      <div v-if="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 class="fl" width="50px" height="50px" :id="scope.row.owner_id" :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">
+            <template slot-scope="scope">
+              <el-popover trigger="hover" placement="top">
+                <span>{{ scope.row.task_name }}</span>
+                <div slot="reference" class="name-wrapper">
+                  <span style="white-space: normal; overflow: hidden;">{{ scope.row.task_name }}</span>
+                </div> 
+              </el-popover>
+            </template>
+          </el-table-column>
+          <el-table-column label="积分" prop="base_point" width="100px">
+            <template slot-scope="scope">
+              <span v-if="scope.row.status == 3 && scope.row.base_point >= 0">+ {{scope.row.base_point}}</span>
+              <span v-else>{{scope.row.base_point}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="截止时间" prop="expire_time">
+            <template slot-scope="scope">
+              <span>{{scope.row.expire_time}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="状态" prop="owner_id" width="100px">
+            <template slot-scope="scope">
+                <!-- <el-button class="color_yelllo" v-show="scope.row.status == 1" type="text">待领取</el-button> -->
+                <!-- <el-button class="color_yelllo" v-show="scope.row.status == 1" type="text">待领取</el-button> -->
+                <!-- <el-button class="color_yelllo" v-show="scope.row.status == 1" type="text">待领取</el-button> -->
+              <span class="color_3" v-show="scope.row.status == -1">已过期</span>
+              <span class="color_yelllo" v-show="scope.row.status == 1">待领取</span>
+              <span class="color_yelllo2"  v-show="scope.row.status == 2">待处理</span>
+              <span class="color_green" v-show="scope.row.status == 3">已完成</span>
+              <span class="color_5" v-show="scope.row.status == 4">已撤回</span>
+            </template>
+          </el-table-column>
+
+          <el-table-column prop="base_point" label="操作" align="center" width='80px'>
+            <template slot-scope="scope">
+              <el-dropdown placement="bottom" :show-timeout="150" :hide-timeout="150" >
+              <span class="el-dropdown-links" @click.stop="">···</span>
+              <el-dropdown-menu  slot="dropdown" >
+                <el-dropdown-item :disabled="false" v-if="scope.row.status==1"><el-button type="text" class="color-red" v-loading.fullscreen.lock="bodyLoad" @click.stop="offerARewardAmend2(scope.row)">修改</el-button></el-dropdown-item>
+                <el-dropdown-item :disabled="false"><el-button type="text" class="color-red" v-loading.fullscreen.lock="bodyLoad" @click.stop="deletes(scope.row,1)">删除</el-button></el-dropdown-item>
+              </el-dropdown-menu>
+            </el-dropdown>
+            </template>
+          </el-table-column>
+
+          <template slot="empty">
+						<noData></noData>
+          </template>
+        </el-table>
+      </div>
+
+      <div v-if="status == 'repetitive'">
+        <el-table :data="list" style="width: 100%" v-loading="loading" @row-click="repetitiveTasksClick">
+          <el-table-column label="执行人" prop="target_info">
+            <template slot-scope="scope">
+              <span v-for="(item,index) in scope.row.target_info" :key="index">
+                <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>
+            </template>
+          </el-table-column>
+          <el-table-column label="任务内容" prop="remark">
+            <template slot-scope="scope">
+              {{scope.row.name || scope.row.remark}}
+            </template>
+          </el-table-column>
+          <el-table-column label="任务积分" prop="point_config.base_point">
+            <template slot-scope="scope">
+              <span>{{scope.row.point_config.base_point}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="重复周期" prop="task_cycle">
+            <template slot-scope="scope">
+              <span v-if="scope.row.task_cycle == '1'">每天自动发布 完成截止为{{scope.row.task_cycle_value}}点</span>
+              <span v-if="scope.row.task_cycle == '2'">
+                <span v-if="scope.row.task_cycle_value == 1">每周一自动发布</span>
+                <span v-if="scope.row.task_cycle_value == 2">每周二自动发布</span>
+                <span v-if="scope.row.task_cycle_value == 3">每周三自动发布</span>
+                <span v-if="scope.row.task_cycle_value == 4">每周四自动发布</span>
+                <span v-if="scope.row.task_cycle_value == 5">每周五自动发布</span>
+                <span v-if="scope.row.task_cycle_value == 6">每周六自动发布</span>
+                <span v-if="scope.row.task_cycle_value == 7">每周日自动发布</span>
+              </span>
+              <span v-if="scope.row.task_cycle == '3'">每月自动发布 完成截止为次月{{scope.row.task_cycle_value}}号</span>
+            </template>
+          </el-table-column>
+
+          <el-table-column prop="base_point" label="操作" align="center" width='80px'>
+            <template slot-scope="scope">
+              <el-dropdown placement="bottom" :show-timeout="150" :hide-timeout="150" >
+              <span class="el-dropdown-links" @click.stop="">···</span>
+              <el-dropdown-menu  slot="dropdown" >
+                <el-dropdown-item :disabled="false"><el-button type="text" class="color-red" v-loading.fullscreen.lock="bodyLoad" @click.stop="deletes(scope.row,2)">删除</el-button></el-dropdown-item>
+              </el-dropdown-menu>
+            </el-dropdown>
+            </template>
+          </el-table-column>
+          <!-- 
+          <el-table-column label="操作" prop="task_cycle">
+            <template slot-scope="scope">
+              <el-button type="primary" size="mini" @click.stop="editRepeatTask(scope.row)">修改</el-button>
+            </template>
+          </el-table-column> 
+          -->
+          <template slot="empty">
+						<noData></noData>
+          </template>
+        </el-table>
+      </div>
+      
+      <center style="padding: 20px 0;">
+        <el-pagination
+          background
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :page-sizes="[10, 20, 30, 40, 50, 100]"
+          layout="total, sizes, prev, pager, next"
+          :page-size="formData.page_size"
+          :current-page="formData.page"
+          :total="total">
+        </el-pagination>
+      </center>
+
+    </div>
+    <!-- 临时任务 -->
+    <temporaryTask :dialogVisible.sync="dialogVisible" :showTitle="'临时任务'"></temporaryTask>
+    <!-- 临时任务-修改 -->
+    <temporaryTaskAmend :dialogVisible.sync="dialogVisibleAmend" :showTitle="'任务编辑'" :modifyData="modifyData"></temporaryTaskAmend>
+    <!-- 悬赏任务 -->
+    <rewardTask :dialogVisible.sync="rewardTaskShow" :showTitle="'悬赏任务'"></rewardTask>
+    <!-- 悬赏任务-修改 -->
+    <rewardTaskAmend :dialogVisible.sync="rewardTaskAmendShow" ref="rewardTasks" :showTitle="'任务编辑'" :rewardTaskAmendData="rewardTaskAmendData"></rewardTaskAmend>
+
+    <!-- 详情弹窗 -->
+    <taskDetailsPopup :visible.sync="showDetailPopup"  v-if="showDetailPopup" :id="detailId" :title="'任务详情'"></taskDetailsPopup>
+
+    <!-- 重复任务详情弹窗 -->
+    <repeatTaskDetailsPopup :visible.sync="showRepetitiveTasksPopup" v-if="showRepetitiveTasksPopup" :id="detailId" :title="'重复任务详情'"></repeatTaskDetailsPopup>
+    
+    <!-- 悬赏任务详情弹窗 -->
+    <rewardTaskDetailsPopup :visible.sync="showRewardTaskDetailsPopup" v-if="showRewardTaskDetailsPopup" :id="detailId" :title="'工作详情'"></rewardTaskDetailsPopup>
+  </div>
+</template>
+
+<script>
+  import noData from '@/components/noData';
+  import temporaryTask from '@/views/common/below/temporaryTask'
+  import temporaryTaskAmend from '@/views/common/below/temporaryTaskAmend'
+  import rewardTask from '@/views/common/below/rewardTask'
+  import rewardTaskAmend from '@/views/common/below/rewardTaskAmend'
+  import taskDetailsPopup from '@/views/common/below/taskDetailsPopup'
+  import repeatTaskDetailsPopup from '@/views/common/below/repeatTaskDetailsPopup'
+  import rewardTaskDetailsPopup from '@/views/common/below/rewardTaskDetailsPopup'
+  
+  export default {
+    name: 'my_issue',
+    data() {
+      return {
+        rewardTaskAmendData:{},//悬赏修改
+        modifyData:{},//任务修改
+
+        operation_if:false,//操作列显示隐藏
+        bodyLoad: false,
+
+        status:'assign',
+        formData:{
+          status: "all",
+          sort: "publish",
+          order_by: "create_time",
+          pt_id: 0,
+          page_size: 10,
+          page: 1,
+          source_type: '1'
+        },
+        total: null,
+        list: [],
+        loading: false,
+        point_types: null,
+        task_status: [
+          {id: 1, name: '全部', code: 'all'},
+          {id: 2, name: '进行中', code: 'running'},
+          {id: 3, name: '已完成', code: 'complete'},
+          {id: 4, name: '已审批', code: 'reviewed'},
+          {id: 5, name: '已撤销', code: 'revocation'},
+          {id: 6, name: '已退回', code: 'refuse'},
+        ],
+        sort: [{id:1,name:'按截止时间',code:'expire'},{id:2,name:'按发布时间',code:'publish'}],
+        order_by: [{id:1,name:'按截止时间',code:'expire_time'},{id:2,name:'按发布时间',code:'create_time'}],
+        tabsOption: [
+          { label: '我指派的', name: 'assign' },
+          { label: '我悬赏的', name: 'reward' },
+          { label: '重复任务', name: 'repetitive' },
+        ],
+        dialogVisible: false,
+        dialogVisibleAmend: false,
+        rewardTaskShow: false,
+        rewardTaskAmendShow: false,
+        showDetailPopup: false,
+        showRepetitiveTasksPopup: false,
+        showRewardTaskDetailsPopup: false,
+        detailId: 0
+      }
+    },
+    components: {noData,temporaryTask,rewardTask,rewardTaskAmend ,temporaryTaskAmend,taskDetailsPopup,repeatTaskDetailsPopup, rewardTaskDetailsPopup},
+    watch:{
+      status(val){
+        this.formData.page = 1
+        this.formData.status = "all"
+        this.formData.sort = "publish"
+        this.formData.order_by = "create_time"
+        this.formData.pt_id = 0
+        this.list = []
+        this.get_list()
+      },
+      'formData.status'(){
+        // debugger
+        this.formData.page = 1
+        this.list = []
+        this.get_list()
+      },
+      'formData.sort'(){
+        this.formData.page = 1
+        this.list = []
+        this.get_list()
+      },
+      'formData.order_by'(){
+        this.formData.page = 1
+        this.list = []
+        this.get_list()
+      },
+      'formData.pt_id'(){
+        this.formData.page = 1
+        this.list = []
+        this.get_list()
+      },
+    },
+    mounted() {
+      if(this.$route.query.type == 1){
+        this.dialogVisible = true
+      }else if(this.$route.query.type == 2){
+        this.rewardTaskShow = true
+      }
+      this.get_list()
+      this.point_types = this.getPointTypes()
+    },
+    methods: {
+      //悬赏修改
+      offerARewardAmend2(item){
+        this.rewardTaskAmendShow = true
+        this.$refs.rewardTasks.forTheTaskLoading = true
+        let params = {
+          task_id:item.id
+        }
+        // this.rewardTaskAmendData = item
+        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
+          })
+      },
+      //任务修改
+      issueAmend1(item){
+        this.modifyData = item
+        this.dialogVisibleAmend = true
+      },
+       //删除---我指派的、我悬赏的、重复任务    (重复任务需等后端接口)
+      deletes(item,s){
+        let self = this
+        this.$message.closeAll()
+        //去掉,所有的都可删除
+        // if(s==0 || s==1){
+        //   if(item.status != 1){
+        //     this.$message({
+        //       showClose: true,
+        //       message: '此工作不能删除',
+        //       type: 'error'
+        //     });
+        //     return false
+        //   }
+        // }
+        self.$confirm('删除此任务将会删除其相关记录和积分数据,确认删除吗?', '删除任务', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }).then(() => {
+          // self.bodyLoad = true
+          self.$axios(s==0?'get':s==1?'get':'get',s==0?'/api/integral/work/delete':s==1?'/api/integral/task/delete':'/api/integral/schedule/delete',s==0?{work_id: item.id}:s==1?{task_id: item.id}:{schedule_id: item.id}
+            ).then(res => {
+            if (res.data.code == 1) {
+              if(this.formData.page>1){
+                if(self.list.length == 1){
+                  this.formData.page = this.formData.page -1
+                }
+              }
+              this.get_list()
+              self.$message.success(res.data.msg);
+              console.log(s==0?'我发布的':s==1?'我悬赏的':'重复任务')
+            } else {
+              self.$message.error(res.data.msg);
+            }
+          }).finally(() => {
+              // self.bodyLoad = false;
+          })
+        })
+      },
+
+      // 点击详情
+      rowClick(row) {
+        this.showDetailPopup = true
+        this.detailId = parseInt(row.id)
+        // console.log(this.detailId)
+      },
+      // 重复任务详情
+      repetitiveTasksClick(row) {
+        this.showRepetitiveTasksPopup = true
+        this.detailId = parseInt(row.id)
+      },
+      // 悬赏任务详情
+      rewardTasksClick(row){
+        this.showRewardTaskDetailsPopup = true
+        this.detailId = parseInt(row.id)
+      },
+      // 编辑重复任务
+      editRepeatTask(item){
+        console.log(item)
+      },
+      // 发布临时任务 和 悬赏任务
+      downClick(val){
+        if(val == 1){
+          this.dialogVisible = true
+        }else{
+          this.rewardTaskShow = true
+        }
+      },
+      // 获取积分类型
+      getPointTypes(){
+        let point = window.plus?JSON.parse(plus.storage('types')):JSON.parse(localStorage.getItem('types'))
+        point.unshift({code: "all",id: 0,name: "全部"})
+        return point
+      },
+			// 页码变更
+      handleCurrentChange(val) {
+				this.formData.page = val
+				this.get_list()
+			},
+      handleSizeChange(val){
+        this.formData.page_size = val
+        this.get_list()
+      },
+
+       //此函数判断当前账号与发布者是否一致、。。此处任务返回就是登录账号发布的任务,所以不需要
+      // operation_none_fei(publisher_id){
+      //   let SET_EMPLOYEE_MAP = [];
+      //   for(let i in JSON.parse(localStorage.getItem('SET_EMPLOYEE_MAP'))){
+      //     SET_EMPLOYEE_MAP.push(JSON.parse(localStorage.getItem('SET_EMPLOYEE_MAP'))[i])
+      //   }
+      //   if(publisher_id == SET_EMPLOYEE_MAP[0].id){
+      //     this.operation_if = true  
+      //   }else{
+      //     this.operation_if = false
+      //   }
+      // },
+      get_list(){
+        let self = this
+        self.loading = true
+        let params = JSON.parse(JSON.stringify(this.formData))
+        params.pt_id == 0?delete params.pt_id:'';
+        if(self.status == 'assign'){
+          delete params.order_by
+        }else if(self.status == 'reward'){
+          delete params.status
+          delete params.sort
+        }else{
+          delete params.status
+          delete params.sort
+          delete params.order_by
+          delete params.pt_id
+        }
+        self.$axios('get',self.status=='assign'?'/api/integral/work/list/publisher':self.status=='reward'?'/api/integral/task/publish/list':'/api/integral/schedule/list',params).then((res) => {
+           //数据过多的情况延迟较大
+          if (res.data.code == 1) {
+            //传入发布者ID进行判断
+            // this.operation_none_fei(res.data.data.list[0].publisher_id)//我指派的 :发布者ID
+            // this.operation_none_fei(res.data.data.list[0].owner_id)//我悬赏的 :发布者ID
+			      self.list = res.data.data.list
+            self.total = res.data.data.total
+          }else{
+            self.$message.error(res.data.data.msg)
+            this.get_list()
+          }
+        }).finally(()=>{
+          self.loading = false
+        })
+      }
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .box{
+    min-height: calc(100vh - 184px);
+    min-width: 800px;
+    background-color: #fff;
+    padding: 20px;
+    & .color_yelllo{
+      color: #ffce2f;
+    }
+    & .color_green{
+      color: #49d3a7;
+    }
+    & .color_3{
+      color: #ff4753;
+    }
+    & .color_4{
+      color: #49d3a7;
+    }
+    & .color_5{
+      color: #f04b56;
+    }
+    & .color_yelllo2{
+      color: #ffa939;
+    }
+  }
+
+
+$red: #f56c6c;
+.color-red{
+  color: $red;
+  &:hover{
+    color: #f14141;
+  }
+}
+  .delicon{
+  font-size: 20px;
+  float: right;
+}
+
+.el-dropdown-links {
+    font-size: 20px;
+    cursor: pointer;
+    color: #a6a8aa;
+  }
+
+ ::v-deep .el-table tr:hover{
+  cursor:pointer
+}
+</style>

+ 274 - 0
src/views/task/my_task.vue

@@ -0,0 +1,274 @@
+<template>
+  <div>
+    <div class="box">
+      <el-tabs v-model="formData.status" type="card">
+        <el-tab-pane v-for="(item,index) in tabsOption" :key="index" :label="item.label" :name="item.name"></el-tab-pane>
+      </el-tabs>
+
+      <el-form ref="formData" :inline="true" :model="formData" label-width="80px">
+        <el-form-item label="积分类型">
+          <el-select v-model="formData.pt_id" clearable placeholder="请选择积分类型">
+            <el-option v-for="item in point_type" :key="item.id" :label="item.name" :value="item.id"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="排序">
+          <el-select v-model="formData.sort" placeholder="请选择排序">
+            <el-option v-for="item in sort" :key="item.id" :label="item.name" :value="item.code"></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+
+      <div v-if="formData.status == 'running'">
+        <el-table :data="list" style="width: 100%" v-loading="loading" @row-click="openDetail" >
+          <el-table-column label="任务内容" prop="task_name"></el-table-column>
+          <el-table-column label="积分">
+            <template slot-scope="scope">
+              <span>{{scope.row.point_config.base_point}}</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' @click.stop="completeBtn(scope.row)">完成任务</el-link>
+            </template>
+          </el-table-column>
+          <template slot="empty">
+						<noData></noData>
+          </template>
+        </el-table>
+      </div>
+
+      <div v-else>
+        <el-table :data="list" style="width: 100%" v-loading="loading" @row-click="openDetail">
+          <el-table-column label="任务内容" prop="task_name"></el-table-column>
+          <el-table-column label="积分">
+            <template slot-scope="scope">
+              <span>{{scope.row.point_config.base_point}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="截止时间" prop="expire_time"></el-table-column>
+          <template slot="empty">
+						<noData></noData>
+          </template>
+        </el-table>
+      </div>
+
+      <center style="padding: 20px 0;">
+        <el-pagination
+          background
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :page-sizes="[10, 20, 30, 40, 50, 100]"
+          layout="total, sizes, prev, pager, next"
+          :current-page="formData.page"
+          :page-size="formData.page_size"
+          :total="total">
+        </el-pagination>
+      </center>
+
+    </div>
+
+    <el-drawer
+      :custom-class="'drawer_details'"
+      :visible.sync="completeShow"
+      wrapperClosable
+      :with-header="false"
+      size="500px">
+      <div class="details_title">完成任务</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: '请填写任务备注(限20字)', trigger: 'blur' }]">
+            <el-input v-model="detail_form.remark" type="textarea" max="20"></el-input>
+          </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>
+
+    <!-- 详情弹窗 -->
+    <taskDetailsPopup :visible.sync="showDetailPopup"  v-if="showDetailPopup" :id="detailId" :title="'任务详情'"></taskDetailsPopup>
+
+  </div>
+</template>
+
+<script>
+  import noData from '@/components/noData';
+  import taskDetailsPopup from '@/views/common/taskDetailsPopup'
+
+  export default {
+    name: 'my_task',
+    data() {
+      return {
+        active: 'running',
+        tabsOption: [
+          { label: '待完成', name: 'running' },
+          { label: '待审批', name: 'complete' },
+          { label: '已审批', name: 'reviewed' },
+        ],
+        list: [],
+        loading: false,
+        total: null,
+        sort:[{id: 1,code: 'expire',name: '按截止时间'}, {id: 2,code: 'publish',name: '按发布时间'}],
+        point_type: null,
+        detail_form:{
+          id: '',
+          remark: ''
+        },
+        formData: {
+          status: "running",
+          pt_id: 0,
+          sort: 'publish',
+          today: '0',
+          page: 1,
+          page_size: 10,
+        },
+        completeShow: false,
+        showDetailPopup: false,
+        detailId: null,
+        showDetailPopup: false,
+        showRepetitiveTasksPopup: false,
+        showRewardTaskDetailsPopup: false
+      }
+    },
+    components: {taskDetailsPopup,noData},
+    watch:{
+      'formData.pt_id'(val){
+        this.get_list()
+      },
+      'formData.sort'(val){
+        this.get_list()
+      },
+      'formData.status'(val){
+        this.formData.page = 1
+        this.formData.pt_id = 0
+        this.formData.sort = 'expire'
+        this.list = []
+        this.get_list()
+      }
+    },
+    mounted() {
+      this.get_list()
+      this.point_type = this.getPointType()
+    },
+    methods: {
+      // 点击完成
+      completeBtn(data){
+        this.detail_form.id = data.id
+        this.completeShow = true
+      },
+      //提交完成任务
+      onSubmit(formName){
+        this.$refs[formName].validate((valid) => {
+          if (valid) {
+            let self = this
+            let data = {
+              work_id: self.detail_form.id,
+              progress: '100',
+              remark: self.detail_form.remark,
+              state:'1'
+            }
+            self.$axios('post','/api/integral/work',data).then(res => {
+              if (res.data.code == 1) {
+                self.$message.success(res.data.msg);
+                self.$refs[formName].resetFields();
+                self.completeShow = false
+                self.get_list()
+              } else {
+                self.$message.error(res.data.msg);
+              }
+            })
+          }
+        });
+      },
+      //重置表单
+      resetForm(formName){
+        this.$refs[formName].resetFields();
+        this.completeShow = false
+      },
+      getPointType(){
+        let point = window.plus?JSON.parse(puls.storage.getItem('types')):JSON.parse(localStorage.getItem('types'))
+        // point.splice(0,1)
+        point.unshift({code: "AF",id: 0,name: "全部"})
+        return point
+      },
+			// 页码变更
+      handleCurrentChange(val) {
+				this.formData.page = val
+				this.get_list()
+			},
+      handleSizeChange(val){
+        this.formData.page_size = val
+        this.get_list()
+      },
+      openDetail(row){
+        this.detailId = parseInt(row.id)
+        this.showDetailPopup = true
+      },
+      get_list(){
+        let self = this
+        self.loading = true
+        let params = JSON.parse(JSON.stringify(this.formData))
+        if (params.pt_id == 0) {
+          delete params.pt_id
+        }
+        self.$axios('get','/api/integral/work/list',params).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
+        })
+      }
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .box{
+    min-height: calc(100vh - 184px);
+    min-width: 800px;
+    background-color: #fff;
+    padding: 20px;
+  }
+   ::v-deep .el-table tr:hover{
+    cursor:pointer
+  }
+  .details_content {
+    padding: 20px;
+    height: calc(100vh - 60px);
+    overflow: auto;
+    .row_title {
+      position: relative;
+      margin: 0 0 20px 0;
+      padding-top: 12px;
+      font-size: 16px;
+      color: #303133;
+      line-height: 22px;
+    }
+    .row_title:before {
+      position: absolute;
+      top: 0;
+      content: ' ';
+      width: 100%;
+      border-top: 1px #f8f8f8 solid;
+    }
+    .el-row {
+      margin-bottom: 10px;
+      font-size: 14px;
+      .el-col-4 {
+        color: #606266;
+      }
+    }
+  }
+  .details_title {
+    font-size: 18px;
+    padding: 20px;
+    border-bottom: 1px #efefef solid;
+  }
+</style>