哥哥玩剑魂呢 3 lat temu
rodzic
commit
4bf7220eb7

+ 11 - 2
src/components/EmployeeSelector.vue

@@ -58,7 +58,7 @@
 									<div class="imgUrl" v-else style="background: #238DFA;color: #fff;margin-right: 8px;">{{item.name.substring(item.name.length-2)}}</div>
 									<div class="userName font-flex-word">{{ item.name }}</div>
 								</div>
-								<i class="el-icon-error deleteUser" @click="employee_cancel(item, true)"></i>
+								<i class="el-icon-error deleteUser" v-if="!item.is_creator || !createDimness" @click="employee_cancel(item, true)"></i>
 							</div>
 						</div>
 					</el-scrollbar>
@@ -144,6 +144,11 @@ export default {
 			//未指定员工并请求人员接口时,保留管理员,过滤员工
 			type: Boolean,
 			default: false
+		},
+		createDimness: {
+			//组织架构设置上级专用-不清除创始人
+			type: Boolean,
+			default: false
 		}
 	},
 	name: 'EmployeeSelector',
@@ -307,7 +312,11 @@ export default {
 
 		clear_data() {
 			this.employee_selected = [];
-			this.employee_selected_list = [];
+			if(this.createDimness){
+				this.employee_selected_list = this.employee_selected_list.filter(x => x.is_creator);
+			}else{
+				this.employee_selected_list = [];
+			}
 			this.dept_selected = [];
 			this.dept_selected_list = [];
 			this.checked = false;

+ 1 - 0
src/components/bonusPointsPopup.vue

@@ -407,6 +407,7 @@ export default {
 					const resultData = res.data.data;
 					this.rule_item_list = resultData.tree;
 					this.flatteningIntegralRules = this.getItemDetail(this.rule_item_list);
+					console.log(this.flatteningIntegralRules)
 					this.loading = false;
 				}
 			});

+ 14 - 14
src/components/examinePopup.vue

@@ -192,7 +192,6 @@
 						<el-input-number
 							v-else-if="detail_info.item_range_type == 1"
 							:disabled="detail_info.item_range_type == 1"
-							:min="1"
 							v-model="adoptForm.point"
 							placeholder="请输入分值"
 						></el-input-number>
@@ -513,7 +512,8 @@ export default {
 							self.adoptForm.item_id = self.detail_info.item_id;
 							self.adoptForm.showPoint = self.detail_info.point;
 							self.detail_info.point > 0 ? (self.awardPoints = 1) : (self.awardPoints = 2);
-							self.adoptForm.point = Math.abs(self.detail_info.point);
+							// self.adoptForm.point = Math.abs(self.detail_info.point);
+							self.adoptForm.point = self.detail_info.point;
 						}
 					}
 				})
@@ -573,11 +573,11 @@ export default {
 		},
 		// 通过按钮
 		adoptBtn() {
-			if (this.detail_info.item_range_type == 1) {
-				this.adoptForm.point = Math.abs(this.detail_info.point);
-			} else {
-				this.adoptForm.point = this.detail_info.point;
-			}
+			// if (this.detail_info.item_range_type == 1) {
+			// 	this.adoptForm.point = Math.abs(this.detail_info.point);
+			// } else {
+			// 	this.adoptForm.point = this.detail_info.point;
+			// }
 			this.detail_info.point > 0 ? (this.awardPoints = 1) : (this.awardPoints = 2);
 			this.adoptForm.rule_id = this.detail_info.rule_id;
 			this.adoptForm.item_id = this.detail_info.item_id;
@@ -650,13 +650,13 @@ export default {
 					self.adoptForm.item_id ? (data.item_id = self.adoptForm.item_id) : (data.item_id = 0);
 					self.adoptForm.reviewer_id ? (data.reviewer_id = self.adoptForm.reviewer_id) : (data.reviewer_id = 0);
 					self.adoptForm.switch ? (data.ticket_count = 1) : (data.ticket_count = 0);
-					if (this.detail_info.item_range_type == 1) {
-						if (self.awardPoints === 1) {
-							data.point = self.adoptForm.point;
-						} else {
-							data.point = self.adoptForm.point * -1;
-						}
-					}
+					// if (this.detail_info.item_range_type == 1) {
+					// 	if (self.awardPoints === 1) {
+					// 		data.point = self.adoptForm.point;
+					// 	} else {
+					// 		data.point = self.adoptForm.point * -1;
+					// 	}
+					// }
 					if (data.rule_id == '' || data.rule_id == null) {
 						data.rule_id = 0;
 					}

+ 74 - 15
src/views/common/repeatTaskDetailsPopup.vue

@@ -17,30 +17,85 @@
             <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.ahead_award_point">
-						<div class="label">提前奖分</div>
-						<div class="content_text">{{ workDetailData.point_config.ahead_award_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>
+            <div class="content_text">{{workDetailData.point_config.base_point}} <span>{{workDetailData.pt_id == 2 ? 'A分' : workDetailData.pt_id == 3 ? 'B分' : ''}}</span> </div>
           </li>
-          <li class="flex-box">
-            <div class="label">任务附件</div>
+          <li class="flex-box" v-if="workDetailData.file_list && workDetailData.file_list.length > 0">
+            <div class="label">附件</div>
             <div class="content_text">
               <el-image
-                v-for="(item,index) in workDetailData.file_list"
+                v-for="(item, index) in workDetailData.file_list"
                 :key="index"
-                style="width: 100px; height: 100px"
-                :src="item">
-              </el-image>
+                style="width: 100px; height: 100px;margin-right:8px"
+                :src="item"
+                :preview-src-list="workDetailData.file_list"
+              ></el-image>
             </div>
           </li>
+          <li class="flex-box">
+            <div class="label">发布人</div>
+            <div class="content_text">{{workDetailData.owner_name}}</div>
+          </li>
+          <li class="flex-box">
+            <div class="label">创建时间</div>
+            <div class="content_text">{{workDetailData.create_time}}</div>
+          </li>
+          <li class="flex-box">
+            <div class="label">截止时间</div>
+            <div class="content_text">
+              <span v-if="workDetailData.task_cycle == '1'">每天{{dayTime(workDetailData.task_cycle_value)}}截止</span>
+              <span v-if="workDetailData.task_cycle == '2'">
+                <span>每周{{weekList[workDetailData.task_cycle_value - 1]}}截止</span>
+              </span>
+              <span v-if="workDetailData.task_cycle == '3'">每月{{workDetailData.task_cycle_value}}号截止</span>
+            </div>
+          </li>
+          
+            <template slot-scope="scope">
+              <span v-if="scope.row.task_cycle == '1'">每天0点自动发布,{{dayTime(scope.row.task_cycle_value)}}截止</span>
+              <span v-if="scope.row.task_cycle == '2'">
+                <span>每周一自动发布,周{{weekList[scope.row.task_cycle_value - 1]}}截止</span>
+              </span>
+              <span v-if="scope.row.task_cycle == '3'">每月1号自动发布,{{scope.row.task_cycle_value}}号截止</span>
+            </template>
+          <li class="flex-box" v-if="workDetailData.point_config && workDetailData.point_config.ahead_award_point">
+						<div class="label">提前奖分</div>
+						<div class="content_text">{{ workDetailData.point_config.ahead_award_point }}/天</div>
+					</li>
+          <li class="flex-box" v-if="workDetailData.point_config && workDetailData.point_config.ahead_award_point_limit">
+						<div class="label">奖分上限</div>
+						<div class="content_text">{{ workDetailData.point_config.ahead_award_point_limit }}</div>
+					</li>
+
+          <li class="flex-box" v-if="workDetailData.point_config && workDetailData.point_config.timeout_deduction_point">
+            <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 && workDetailData.point_config.timeout_deduction_point_limit">
+            <div class="label">扣分上限</div>
+            <div class="content_text">{{workDetailData.point_config.timeout_deduction_point_limit}}</div>
+          </li>
         </ul>
+
+				<div v-show="workDetailData.rule_item_id">
+					<p class="row_title">规则依据</p>
+					<el-row :gutter="10">
+						<el-col :span="4">规则分类</el-col>
+						<el-col :span="19">{{ workDetailData.rule_list }}</el-col>
+					</el-row>
+					<el-row v-if="workDetailData.remark && workDetailData.remark.rule">
+						<el-col :span="4">积分规则</el-col>
+						<el-col :span="19">{{ workDetailData.remark.rule }}</el-col>
+					</el-row>
+					<el-row v-if="workDetailData.rule_item">
+						<el-col :span="4">积分</el-col>
+						<el-col :span="19" v-show="workDetailData.rule_item.min_point == workDetailData.rule_item.max_point">{{ workDetailData.rule_item.min_point }}</el-col>
+						<el-col :span="19" v-show="workDetailData.rule_item.min_point != workDetailData.rule_item.max_point">
+							{{ workDetailData.rule_item.min_point }} ~ {{ workDetailData.rule_item.max_point }}
+						</el-col>
+					</el-row>
+				</div>
         <el-row style=" margin-bottom: 20px;">
           <el-col :span="24" style="line-height: 30px;">审批人</el-col>
           <el-col :span="24">
@@ -88,6 +143,7 @@
         
         loading: false,
         workDetailData:{},
+        weekList: ['一', '二', '三', '四', '五', '六', '日'],
       }
     },
     components: {},
@@ -97,6 +153,9 @@
       this.Delay_to_open = this.visible//更换打开抽屉时机,避免打开两次
     },
     methods: {
+      dayTime(item){
+        return item > 9 ? item + ': 00' : '0' + item + ': 00'
+      },
       // 关闭弹窗
       handleClose(){
         this.$emit('update:visible', false)

+ 160 - 18
src/views/common/rewardTask.vue

@@ -19,9 +19,43 @@
 							class="reward_textarea"
 						></el-input>
 					</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="trees_PtId(formData.pt_id) +'规则'"
+						prop="tree_echo"
+					>
+						<el-cascader
+							v-model="formData.tree_echo"
+							ref="ruleItem"
+							:popper-class="'itemClass'"
+							filterable
+							clearable
+							:options="formData.pt_id == 2 ? trees_ab.A : trees_ab.B"
+							@change="ruleItemChange"
+							:show-all-levels="false"
+							:props="{ children: 'child', label: 'name', value: 'id' }"
+						></el-cascader>
+					</el-form-item>
+					<el-form-item prop="range_type" v-if="formData.range_type != 0">
+						<div style="line-height: 24px;" v-show="formData.range_type == 1">
+							{{ min }}
+							<span class="blue">{{ trees_PtId(formData.pt_id) }}</span>
+						</div>
+						<div style="line-height: 24px;" v-show="formData.range_type == 2">
+							{{ min }} ~ {{ max }}
+							<span class="blue">{{ trees_PtId(formData.pt_id) }}</span>
+						</div>
+						<div style="line-height: 24px;">{{ treeName }}</div>
+					</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-input-number v-if="formData.range_type == 0" v-model.number="formData.base_point"></el-input-number>
+						<el-input-number v-else :disabled="formData.range_type == 1" v-model.number="formData.base_point" :min="min" :max="max"></el-input-number>
 					</el-form-item>
 					<el-form-item label="审批人" prop="reviewer_id" :rules="[{ required: true, message: '请选择审批人', trigger: 'change' }]">
 						<el-row>
@@ -46,11 +80,6 @@
 						</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
@@ -84,6 +113,25 @@
 					<el-form-item label="任务备注" prop="task_remark" :rules="[{ max: 300, message: '长度不能超过 300 个字', trigger: 'blur' }]">
 						<el-input type="textarea" :rows="5" v-model="formData.task_remark" maxlength="300" show-word-limit placeholder="请输入任务内容(限300字)"></el-input>
 					</el-form-item>
+					<el-form-item label="图片">
+						<upload
+							:headers="Xtoken"
+							class="avatar-uploader"
+							:action="'https://' + 'integralsys.oss-cn-shenzhen.aliyuncs.com'"
+							:show-file-list="true"
+							:file-list="fileList"
+							:on-success="handleFilesSuccess"
+							:on-preview="onFilePreView"
+							:before-upload="beforeUpload"
+							:on-remove="onFileRemove"
+							:limit="3"
+							:multiple="true"
+							ref="clearPicture"
+						>
+							<el-button size="small" type="primary">点击上传</el-button>
+							(最多选择3张)
+						</upload>
+					</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>
@@ -131,6 +179,7 @@
 <script>
 import moment from 'moment';
 import EmployeeSelector from '@/components/EmployeeSelector.vue';
+import upload from '@/components/upload';
 export default {
 	name: 'bonusPoints',
 	props: {
@@ -147,10 +196,22 @@ export default {
 		showTitle: {
 			type: String,
 			default: ''
-		}
+		},
+		trees_ab: {
+			type: Object,
+			default: {}
+		},
 	},
 	data() {
 		return {
+			//图片附件
+			Xtoken: { 'X-Token': this.$getToken() },
+			fileList: [],
+			// treesAb: [],
+			max: 0,
+			min: 0,
+			treeName: '',
+
 			dept_name: [],
 			dept_tree: [],
 			forTheTaskLoading: false,
@@ -159,7 +220,11 @@ export default {
 				pt_id: 2,
 				task_name: '',
 				task_remark: '',
-				base_point: '',
+				base_point: '0',
+				range_type: 0,
+				rule_id: 0,
+				file_list: [],
+				tree_echo: [],//用于编辑任务时的规则回显
 				expire_time: moment().format('YYYY-MM-DD 18:00'),
 				task_expire_day: '',
 				targets: [],
@@ -264,7 +329,7 @@ export default {
 			show_employee_selector: false
 		};
 	},
-	components: { EmployeeSelector },
+	components: { EmployeeSelector, upload },
 	watch: {
 		'formData.task_cycle'(val) {
 			if (val) {
@@ -272,6 +337,17 @@ export default {
 			} else {
 				this.formData.expire_time = moment().format('YYYY-MM-DD 18:00');
 			}
+		},
+		'formData.pt_id'(val) {
+			console.log(val)
+			let item = this.formData
+			item.tree_echo = []
+			this.max = 0;
+			this.min = 0;
+			this.treeName = ''
+			item.task_remark = '';
+			item.base_point = '0';
+			item.range_type = 0;
 		}
 	},
 	mounted() {
@@ -279,6 +355,66 @@ export default {
 		this.getDepartment();
 	},
 	methods: {
+		handleFilesSuccess(response, file, fileList) {
+			this.fileFun(file, fileList)
+		},
+		onFilePreView(file) {
+			if (file.response) {
+				window.open(file.response.url, '_blank');
+			}
+		},
+		onFileRemove(file, fileList) {
+			this.fileFun(file, fileList)
+		},
+		fileFun(file, fileList){
+			this.fileList = fileList;
+			this.formData.file_list = []
+			fileList.forEach((item, index) => {
+				this.formData.file_list.push(item.url);
+			});
+		},
+		// 附件上传
+		beforeUpload(file) {
+			const isJPG = /^image\/(jpeg|png|jpg)$/.test(file.type);
+			const isLt2M = file.size / 1024 / 1024 < 1;
+			if (!isJPG) {
+				this.$message.error('上传头像图片只能是 JPG 格式!');
+			}
+			if (!isLt2M) {
+				this.$message.error('上传头像图片大小不能超过 2MB!');
+			}
+			return isJPG && isLt2M;
+		},
+		trees_PtId(id) {
+			return id == 2 ? 'A分' : 'B分'
+		},
+		ruleItemChange(val){
+			let item = this.formData
+			if(val.length>0){
+				let data = this.$refs.ruleItem.getCheckedNodes()[0].data;//当前选中的节点数据
+				console.log(this.$refs.ruleItem.getCheckedNodes()[0].data)
+				item.task_remark = data.name;
+				this.max = data.max_point * 1;
+				this.min = data.min_point * 1;
+				this.treeName = data.name;
+				item.base_point = data.min_point;
+				item.range_type = data.range_type;
+				item.rule_id = data.pid;
+				item.item_id = data.id;
+			}else{
+				item.task_remark = '';
+				this.treeName = '';
+				this.max = 0;
+				this.min = 0;
+				item.base_point = '0';
+				item.range_type = 0;
+				item.rule_id = 0;
+				item.item_id = 0;
+				
+			}
+		},
+
+
 		handleChange(val) {
 			console.log(this.dept_name);
 			let data = [];
@@ -306,7 +442,12 @@ export default {
 			this.$refs[formName].resetFields();
 			this.executorName = '';
 			this.reviewerName = '';
+			this.deptVisibleName = '';
+			this.treeName = '';
+			this.fileList = [];
 			this.dept_name = [];
+			this.formData.dept_ids=[];
+			this.formData.tree_echo = [],
 			this.reviewer_selected = { dept: [], employee: [] };
 			this.dept_selected = { dept: [], employee: [] };
 		},
@@ -382,16 +523,17 @@ export default {
 				.then(res => {
 					if (res.data.code == 1) {
 						this.$parent.get_list();
-						self.$emit('update:dialogVisible', false);
-						self.$refs[formName].resetFields();
-						self.formData.dept_ids=[];
+						this.resetForm('formData');
 						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 = '';
+						// self.$emit('update:dialogVisible', false);
+						// self.$refs[formName].resetFields();
+						// self.formData.dept_ids=[];
+						// 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);
 					}

+ 174 - 16
src/views/common/rewardTaskAmend.vue

@@ -11,8 +11,44 @@
 					>
 						<el-input type="textarea" rows="3" maxlength="20" show-word-limit v-model="formData.task_name" placeholder="请输入任务内容(限20字)" class="reward_textarea"></el-input>
 					</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="trees_PtId(formData.pt_id) +'规则'"
+						prop="tree_echo"
+					>
+						<el-cascader
+							v-model="formData.tree_echo"
+							ref="ruleItem"
+							:popper-class="'itemClass'"
+							filterable
+							clearable
+							:options="formData.pt_id == 2 ? trees_ab.A : trees_ab.B"
+							@change="ruleItemChange"
+							:show-all-levels="false"
+							:props="{ children: 'child', label: 'name', value: 'id' }"
+						></el-cascader>
+					</el-form-item>
+
+					<el-form-item prop="range_type" v-if="formData.range_type != 0">
+						<div style="line-height: 24px;" v-show="formData.range_type == 1">
+							{{ min }}
+							<span class="blue">{{ trees_PtId(formData.pt_id) }}</span>
+						</div>
+						<div style="line-height: 24px;" v-show="formData.range_type == 2">
+							{{ min }} ~ {{ max }}
+							<span class="blue">{{ trees_PtId(formData.pt_id) }}</span>
+						</div>
+						<div style="line-height: 24px;">{{ treeName }}</div>
+					</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-input-number v-if="formData.range_type == 0" v-model.number="formData.base_point"></el-input-number>
+						<el-input-number v-else :disabled="formData.range_type == 1" v-model.number="formData.base_point" :min="min" :max="max"></el-input-number>
 					</el-form-item>
 					<el-form-item label="审批人" prop="reviewer_id" :rules="[{ required: true, message: '请选择审批人', trigger: 'change' }]">
 						<el-row>
@@ -39,11 +75,6 @@
 						</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
@@ -77,6 +108,26 @@
 					<el-form-item label="任务描述" prop="task_remark" :rules="[{ max: 300, message: '长度不能超过 300 个字', trigger: 'blur' }]">
 						<el-input type="textarea" :rows="5" v-model="formData.task_remark" maxlength="300" show-word-limit placeholder="请输入任务内容(限300字)"></el-input>
 					</el-form-item>
+					
+					<el-form-item label="图片">
+						<upload
+							:headers="Xtoken"
+							class="avatar-uploader"
+							:action="'https://' + 'integralsys.oss-cn-shenzhen.aliyuncs.com'"
+							:show-file-list="true"
+							:file-list="fileList"
+							:on-success="handleFilesSuccess"
+							:on-preview="onFilePreView"
+							:before-upload="beforeUpload"
+							:on-remove="onFileRemove"
+							:limit="3"
+							:multiple="true"
+							ref="clearPicture"
+						>
+							<el-button size="small" type="primary">点击上传</el-button>
+							(最多选择3张)
+						</upload>
+					</el-form-item>
 					<el-form-item label="谁可以看" prop="dept_ids">
 						<el-cascader
 							size="medium"
@@ -120,6 +171,7 @@
 <script>
 import moment from 'moment';
 import EmployeeSelector from '@/components/EmployeeSelector.vue';
+import upload from '@/components/upload';
 export default {
 	name: 'bonusPoints',
 	props: {
@@ -139,20 +191,36 @@ export default {
 		showTitle: {
 			type: String,
 			default: ''
-		}
+		},
+		trees_ab: {
+			type: Object,
+			default: {}
+		},
 	},
 	data() {
 		return {
+			//图片附件
+			Xtoken: { 'X-Token': this.$getToken() },
+			fileList: [],
+			max: 0,
+			min: 0,
+			treeName: '',
+
 			dept_name: [],
 			dept_tree: [],
 			forTheTaskLoading: false,
 			formData: {
+				tree_echo: [],//用于编辑任务时的规则回显
+				file_list: [],
+				range_type: 0,
+				rule_id: 0,
+
 				id: 0,
 				task_type: '1',
 				pt_id: 2,
 				task_name: '',
 				task_remark: '',
-				base_point: '',
+				base_point: '0',
 				expire_time: moment().format('YYYY-MM-DD 18:00'),
 				task_expire_day: '',
 				targets: [],
@@ -262,7 +330,7 @@ export default {
 			echoGather: []
 		};
 	},
-	components: { EmployeeSelector },
+	components: { EmployeeSelector, upload },
 	watch: {
 		'formData.task_cycle'(val) {
 			if (val) {
@@ -271,6 +339,17 @@ export default {
 				this.formData.expire_time = moment().format('YYYY-MM-DD 18:00');
 			}
 		},
+		'formData.pt_id'(val) {
+			console.log(val)
+			let item = this.formData
+			item.tree_echo = []
+			this.max = 0;
+			this.min = 0;
+			this.treeName = ''
+			item.task_remark = '';
+			item.base_point = '0';
+			item.range_type = 0;
+		},
 		rewardTaskAmendData() {
 			this.formData.id = this.rewardTaskAmendData.id; //任务id
 			this.formData.pt_id = this.rewardTaskAmendData.pt_id; //积分种类id
@@ -315,6 +394,21 @@ export default {
 				this.getTreeDatas(this.dept_tree, deptIDdata[i]);
 			}
 			this.dept_name = this.echoGather;
+
+			
+			let filtList = []
+			this.rewardTaskAmendData.task_file_list.forEach((item, index) =>{
+				filtList.push({name: item ,url:item, response: { url:item }})
+			})
+			this.fileList = filtList
+			if(this.rewardTaskAmendData.point_config.tree_echo){
+				this.formData.tree_echo = this.rewardTaskAmendData.point_config.tree_echo.map(Number);
+			}
+			this.$nextTick(_=>{
+				if(this.formData.tree_echo){
+					this.ruleItemChange(this.formData.tree_echo)
+				}
+			})
 		}
 	},
 	mounted() {
@@ -322,6 +416,66 @@ export default {
 		this.getDepartment();
 	},
 	methods: {
+		handleFilesSuccess(response, file, fileList) {
+			this.fileFun(file, fileList)
+		},
+		onFilePreView(file) {
+			if (file.response) {
+				window.open(file.response.url, '_blank');
+			}
+		},
+		onFileRemove(file, fileList) {
+			this.fileFun(file, fileList)
+		},
+		fileFun(file, fileList){
+			this.fileList = fileList;
+			this.formData.file_list = []
+			fileList.forEach((item, index) => {
+				this.formData.file_list.push(item.url);
+			});
+		},
+		// 附件上传
+		beforeUpload(file) {
+			const isJPG = /^image\/(jpeg|png|jpg)$/.test(file.type);
+			const isLt2M = file.size / 1024 / 1024 < 1;
+			if (!isJPG) {
+				this.$message.error('上传头像图片只能是 JPG 格式!');
+			}
+			if (!isLt2M) {
+				this.$message.error('上传头像图片大小不能超过 2MB!');
+			}
+			return isJPG && isLt2M;
+		},
+		
+		trees_PtId(id) {
+			return id == 2 ? 'A分' : 'B分'
+		},
+		ruleItemChange(val){
+			let item = this.formData
+			if(val.length>0){
+				let data = this.$refs.ruleItem.getCheckedNodes()[0].data;//当前选中的节点数据
+				item.task_remark = data.name;
+				this.treeName = data.name;
+				this.max = data.max_point * 1;
+				this.min = data.min_point * 1;
+				item.base_point = data.min_point;
+				item.range_type = data.range_type;
+				item.rule_id = data.pid;
+				item.item_id = data.id;
+			}else{
+				item.task_remark = '';
+				this.treeName = '';
+				this.max = 0;
+				this.min = 0;
+				item.base_point = '0';
+				item.range_type = 0;
+				item.rule_id = 0;
+				item.item_id = 0;
+			}
+		},
+
+
+
 		deductionPoint(item){
 			if (this.rewardTaskAmendData.point_config[item] != '0') {
 				this.formData[item] = this.rewardTaskAmendData.point_config[item];
@@ -355,9 +509,12 @@ export default {
 			this.echoGather = [];
 			this.$emit('update:dialogVisible', false);
 			this.$refs[formName].resetFields();
+			this.fileList = [];
 			this.executorName = '';
 			this.reviewerName = '';
 			this.dept_name = [];
+			this.treeName = '';
+			this.formData.tree_echo = [],
 			this.dept_selected = { dept: [], employee: [] };
 		},
 		ahead_timeout(item,arr,codes,code){
@@ -441,12 +598,13 @@ export default {
 				.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();
+						this.resetForm('formData')
+						// this.dept_selected = { dept: [], employee: [] };
+						// self.executorName = '';
+						// self.reviewerName = '';
+						// this.dept_name = [];
+						// self.$emit('update:dialogVisible', false);
+						// self.$refs[formName].resetFields();
 						self.$message.success(res.data.msg);
 					} else {
 						self.$message.error(res.data.msg);
@@ -502,7 +660,7 @@ export default {
 		// 部门可见 end
 		closeDialog() {
 			this.echoGather = [];
-			this.$emit('update:dialogVisible', false);
+			this.resetForm('formData')
 		},
 
 		//获取部门

+ 42 - 0
src/views/common/rewardTaskDetailsPopup.vue

@@ -36,9 +36,33 @@
             <div class="label">任务备注</div>
             <div class="content_text">{{workDetailData.task_remark}}</div>
           </li>
+					<li class="flex-box" v-if="workDetailData.task_file_list && workDetailData.task_file_list.length > 0">
+						<div class="label"></div>
+						<div class="content_text">
+						<el-image
+							v-for="(item, index) in workDetailData.task_file_list"
+							:key="index"
+							style="width: 100px; height: 100px;margin-right:8px"
+							:src="item"
+							:preview-src-list="workDetailData.task_file_list"
+						></el-image>
+						</div>
+					</li>
           <li class="flex-box" v-if="workDetailData.point_config">
             <div class="label">任务积分</div>
             <div class="content_text">{{workDetailData.point_config.base_point}}{{$getTypsName(workDetailData.pt_id)}}</div>
+          </li>
+					<li class="flex-box">
+						<div class="label">审批人</div>
+						<div class="content_text">{{ workDetailData.reviewer_name }}</div>
+					</li>
+          <li class="flex-box" v-if="workDetailData.owner_name">
+            <div class="label">发布人</div>
+            <div class="content_text">{{workDetailData.owner_name}}</div>
+          </li>
+          <li class="flex-box" v-if="workDetailData.create_time">
+            <div class="label">发布时间</div>
+            <div class="content_text">{{workDetailData.create_time}}</div>
           </li>
           <li class="flex-box">
             <div class="label">截止时间</div>
@@ -64,6 +88,24 @@
             <div class="content_text">{{workDetailData.source_type_mark}}</div>
           </li>
         </ul>
+				<div v-show="workDetailData.point_config && workDetailData.point_config.item_info">
+					<p class="row_title">规则依据</p>
+					<el-row :gutter="10" v-if="workDetailData.point_config.rule_info">
+						<el-col :span="4">规则分类</el-col>
+						<el-col :span="19">{{ workDetailData.point_config.rule_info.name }}</el-col>
+					</el-row>
+					<el-row v-if="workDetailData.point_config.item_info">
+						<el-col :span="4">积分规则</el-col>
+						<el-col :span="19">{{ workDetailData.point_config.item_info.remark }}</el-col>
+					</el-row>
+					<el-row v-if="workDetailData.point_config.item_info">
+						<el-col :span="4">积分</el-col>
+						<el-col :span="19" v-show="workDetailData.point_config.item_info.min_point == workDetailData.point_config.item_info.max_point">{{ workDetailData.point_config.item_info.min_point }}</el-col>
+						<el-col :span="19" v-show="workDetailData.point_config.item_info.min_point != workDetailData.point_config.item_info.max_point">
+							{{ workDetailData.point_config.item_info.min_point }} ~ {{ workDetailData.point_config.item_info.max_point }}
+						</el-col>
+					</el-row>
+				</div>
       </div>
     </el-drawer>
 

+ 287 - 30
src/views/common/taskDetailsPopup.vue

@@ -25,6 +25,22 @@
 						<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" v-if="workDetailData.task_file_list && workDetailData.task_file_list.length > 0">
+						<div class="label"></div>
+						<div class="content_text">
+						<el-image
+							v-for="(item, index) in workDetailData.task_file_list"
+							:key="index"
+							style="width: 100px; height: 100px;margin-right:8px"
+							:src="item"
+							:preview-src-list="workDetailData.task_file_list"
+						></el-image>
+						</div>
+					</li>
+					<li class="flex-box">
+						<div class="label">积分种类</div>
+						<div class="content_text">{{ workDetailData.pt_name }}</div>
+					</li>
 					<li class="flex-box">
 						<div class="label">任务积分</div>
 						<div class="content_text">{{ workDetailData.point_config.base_point }}{{ workDetailData.pt_name }}</div>
@@ -33,52 +49,100 @@
 						<div class="label">最终分</div>
 						<div class="content_text">{{ workDetailData.point_config.review_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.publisher_name }}</div>
+					</li>
+					<li class="flex-box" v-if="workDetailData.create_time">
+						<div class="label">发布时间</div>
+						<div class="content_text">{{ workDetailData.create_time }}</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 }} B分/天</div>
-					</li>
 					<li class="flex-box" v-if="workDetailData.point_config.ahead_award_point > 0">
 						<div class="label">提前奖分</div>
 						<div class="content_text">{{ workDetailData.point_config.ahead_award_point }} B分/天</div>
 					</li>
-					<li class="flex-box">
-						<div class="label">审批人</div>
-						<div class="content_text">{{ workDetailData.reviewer_name }}</div>
+					<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 }} B分/天</div>
 					</li>
-					<li class="flex-box">
-						<div class="label">发布人</div>
-						<div class="content_text">{{ workDetailData.publisher_name }}</div>
+					<li class="flex-box" v-if="workDetailData.complete_task && workDetailData.complete_task.time">
+						<div class="label">完成时间</div>
+						<div class="content_text">{{ workDetailData.complete_task.time }}</div>
 					</li>
-					<li class="flex-box">
-						<div class="label">积分种类</div>
-						<div class="content_text">{{ workDetailData.pt_name }}</div>
+					<li class="flex-box" v-if="workDetailData.complete_task && workDetailData.complete_task.remark">
+						<div class="label">完成备注</div>
+						<div class="content_text">{{ workDetailData.complete_task.remark }}</div>
+					</li>
+					<li class="flex-box" v-if="workDetailData.complete_task && workDetailData.complete_task.files && workDetailData.complete_task.files.length > 0">
+						<div class="label"></div>
+						<div class="content_text">
+						<el-image
+							v-for="(item, index) in workDetailData.complete_task.files"
+							:key="index"
+							style="width: 100px; height: 100px;margin-right:8px"
+							:src="item"
+							:preview-src-list="workDetailData.complete_task.files"
+						></el-image>
+						</div>
 					</li>
 				</ul>
-				<div v-show="showWork">
+				
+				<div v-show="workDetailData.point_config && workDetailData.point_config.item_info">
+					<p class="row_title">规则依据</p>
+					<el-row :gutter="10" v-if="workDetailData.point_config.rule_info">
+						<el-col :span="4">规则分类</el-col>
+						<el-col :span="19">{{ workDetailData.point_config.rule_info.name }}</el-col>
+					</el-row>
+					<el-row v-if="workDetailData.point_config.item_info">
+						<el-col :span="4">积分规则</el-col>
+						<el-col :span="19">{{ workDetailData.point_config.item_info.remark }}</el-col>
+					</el-row>
+					<el-row v-if="workDetailData.point_config.item_info">
+						<el-col :span="4">积分</el-col>
+						<el-col :span="19" v-show="workDetailData.point_config.item_info.min_point == workDetailData.point_config.item_info.max_point">{{ workDetailData.point_config.item_info.min_point }}</el-col>
+						<el-col :span="19" v-show="workDetailData.point_config.item_info.min_point != workDetailData.point_config.item_info.max_point">
+							{{ workDetailData.point_config.item_info.min_point }} ~ {{ workDetailData.point_config.item_info.max_point }}
+						</el-col>
+					</el-row>
+				</div>
+				<div v-show="showWork" style="border-top: 2px solid #f8f8f8;">
 					<div class="d_progress">
-						<div class="flex-box">
+						<div class="flex-box ">
 							<div class="flex-1">工作进度({{ workDetailData.progress }}%)</div>
+            				<div class="fontColorF addJf" @click="sliderShow" v-if="workDetailData.employee_id == userId && workDetailData.status==1">+更新进度</div>
 						</div>
 						<el-progress :percentage="workDetailData.progress"></el-progress>
 					</div>
 					<div>
 						<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 || workDetailData.employee_id == userId && workDetailData.status == 2">+记一条工作记录</div>
+								</div>
 								<div class="work_box" style="padding-top:10px">
-									<div class="work_item" v-for="(item, index) in text_list" :key="index">
-										<div class="flex-box-ce">
+									<div class="work_item" v-for="(item, index) in text_list" :key="index" style="margin: 0 0 15px 0">
+										<div class="flex-box">
 											<userImage class="user_img person_imghead" width="40px" height="40px" :user_name="item.recorder" :img_url="item.img_url"></userImage>
-											<div class="d_name flex-1">{{ item.recorder }} 
-												<span v-if="item.point * 1 > 0">+{{ item.point }}</span>
-												<span v-if="item.point * 1 < 0">{{ item.point }}</span>
+											<div style="width: 100%;" class="d_name">
+												<div class="flex-box flex-d-center">
+													<div class="flex-1">{{ item.recorder }} 
+														<span v-if="item.point * 1 > 0">+{{ item.point }}</span>
+														<span v-if="item.point * 1 < 0">{{ item.point }}</span>
+													</div>
+													<div class="d_date fontColorF">{{ item.time }}</div>
+												</div>
+												<div class="fontColorB" style="margin-top: 5px;">{{ item.remark }}</div>
 											</div>
-											<div class="d_date fontColorF">{{ item.time }}</div>
 										</div>
-										<div class="d_content fontColorB">{{ item.remark }}</div>
 									</div>
 									<div v-if="text_list.length==0" class="fontColorF" style="text-align: center;">暂无工作记录</div>
 								</div>
@@ -89,18 +153,23 @@
 										<span v-if="point_total > 0">合计:+{{ point_total }}</span>
 										<span v-else>合计:{{ point_total }}</span>
 									</div>
+            						<div class="fontColorF addJf" @click="isIntegral = true" v-if="workDetailData.reviewer_id == userId && workDetailData.status == 1 || workDetailData.reviewer_id == userId && workDetailData.status == 2">+记分</div>
 								</div>
 								<div class="work_box" style="padding-top:10px">
-									<div class="work_item" v-for="(item, index) in point_list" :key="index">
-										<div class="flex-box-ce">
+									<div class="work_item" v-for="(item, index) in point_list" :key="index" style="margin: 0 0 15px 0">
+										<div class="flex-box">
 											<userImage class="user_img person_imghead" width="40px" height="40px" :user_name="item.recorder" :img_url="item.img_url"></userImage>
-											<div class="d_name flex-1">{{ item.recorder }}
-												<span class="red" v-if="item.point * 1 > 0">+{{ item.point }}</span>
-												<span class="green" v-if="item.point * 1 < 0">{{ item.point }}</span>
+											<div style="width: 100%;" class="d_name">
+												<div class="flex-box flex-d-center">
+													<div class="flex-1">{{ item.recorder }}
+														<span class="red" v-if="item.point * 1 > 0">+{{ item.point }}</span>
+														<span class="green" v-if="item.point * 1 < 0">{{ item.point }}</span>
+													</div>
+													<div class="d_date fontColorF">{{ item.time }}</div>
+												</div>
+												<div class="fontColorB" style="margin-top: 5px;">{{ item.remark }}</div>
 											</div>
-											<div class="d_date fontColorF">{{ item.time }}</div>
 										</div>
-										<div class="d_content fontColorB">{{ item.remark }}</div>
 									</div>
 									<div v-if="point_list.length==0" class="fontColorF" style="text-align: center;">暂无积分记录</div>
 								</div>
@@ -110,10 +179,67 @@
 				</div>
 			</div>
 		</el-drawer>
+		
+		<!-- 更新进度 -->
+		<el-dialog title="更新进度" :close-on-click-modal="false" :visible.sync="isSlider" :before-close="publicClose" width="40%">
+			<div class="slider">
+			<div class="fontColorF">拖动滑杆更新进度</div>
+			<el-slider v-model="progress"></el-slider>
+			</div>
+			<span slot="footer">
+			<el-button @click="publicClose()">取消</el-button>
+			<el-button type="primary" @click="sliderSend">完成</el-button>
+			</span>
+		</el-dialog>
+		<!-- 记一条 -->
+		<el-dialog title="记一条" :close-on-click-modal="false" :visible.sync="isOne" :before-close="publicClose" width="40%">
+			<div class="flex-box">
+				<div style="width: 80px;">工作记录</div>
+				<el-input type="textarea" :rows="3" placeholder="请输入内容" v-model="textarea"></el-input>
+			</div>
+			<span slot="footer">
+				<el-button @click="publicClose()">取消</el-button>
+				<el-button type="primary" @click="onerecord">完成</el-button>
+			</span>
+		</el-dialog>
+		<!-- 记分记录 -->
+		<el-dialog title="记分" :visible.sync="isIntegral" :before-close="publicClose" width="40%" :close-on-click-modal="false">
+			<el-form :model="integral" ref="integral" label-width="80px" :rules="formRules">
+				<el-form-item label="记录"  prop="text" :rules="[{ required: true, message: '记录不能为空'}]">
+					<el-input type="textarea" :rows="3" v-model="integral.text"></el-input>
+				</el-form-item>
+				<!-- 记分不能为空 -->
+				<el-form-item label="记分"  prop="num" >
+				<!-- <el-form-item label="记分"  prop="num" :rules="[{ required: false, message: '记分不能为空'},{ type: 'number', message: '积分必须为数字值'}]"> -->
+					<div class="num" :class="[integral.type=='1'?'add':'jian']"></div>
+					<el-input placeholder="请输入内容" v-model.number="integral.num">
+						<el-select v-model="integral.type" slot="prepend" placeholder="请选择" style="width: 80px;">
+							<el-option label="奖分" value="1"></el-option>
+							<el-option label="扣分" value="2"></el-option>
+						</el-select>
+					</el-input>
+				</el-form-item>
+			</el-form>
+			<span slot="footer">
+				<el-button @click="publicClose()">取消</el-button>
+				<el-button type="primary" @click="integralSend('integral')">完成</el-button>
+			</span>
+		</el-dialog>
 	</div>
 </template>
 
 <script>
+const validatorNoZero = (rule, value, callback) => {//设置记分的验证
+	if (value === 0) {
+		return callback(new Error("记分不能为0"));
+	} else if (value === '') {
+		return callback(new Error("记分不能为空"));
+	}else if (isNaN(value)){
+		return callback(new Error("积分必须为数字值"));
+	}else{
+		callback();
+	}
+};
 export default {
 	name: 'taskDetailsPopup',
 	props: {
@@ -159,7 +285,29 @@ export default {
 			point_list: [],
 			activeName: 'work',
 			getDataUrl: '/api/integral/work',
-			params: {}
+			params: {},
+
+
+			userId: this.$getUserData().id,
+			isSlider: false,//更新进度弹窗
+			  progress: 0,//更新进度modus
+			  isOne: false,//记一条
+			  textarea: '',//记录一条内容
+			  isIntegral:false,//记分记录
+			integral:{
+				text:'',
+				num:0,
+				type:"1",
+			},
+			formRules:{//记分验证
+				num: [
+				{
+					required: true,
+					validator: validatorNoZero,
+					trigger: "blur"
+				}
+				],
+			},
 		};
 	},
 	mounted() {
@@ -170,6 +318,86 @@ export default {
 		});
 	},
 	methods: {
+		//记分记录
+		integralSend(formName){
+			var items = this.workDetailData.process.list || [];
+			var process = {
+					img_url: this.$getUserData().img_url,
+					point: this.integral.type == "1" ? this.integral.num : '-' + this.integral.num,
+					recorder_id: this.$getUserData().id,
+					recorder: this.$getUserData().name,
+					remark: this.integral.text,
+					time: this.$moment().format('YYYY-MM-DD HH:mm')
+			}
+			var data = {
+				work_id: this.workDetailData.id,
+				process: [],
+			}
+			items.unshift(process);
+			data.process = items;
+			this.$refs[formName].validate((valid) => {
+				if (valid) {
+					this.$axios('post','/api/integral/work',data).then(res => {
+						if (res.data.code == 1) {
+							this.publicClose();
+							this.getData();
+						}
+					})
+				}
+			})
+		},
+		//记一条
+		onerecord(){
+			if(!this.textarea){
+				this.$message.error("请输入备注内容");
+				return
+			}
+			var items = this.workDetailData.process.list || [];
+			console.log(items)
+			var process = {
+				img_url: this.$getUserData().img_url,
+				point: 0,
+				recorder_id: this.$getUserData().id,
+				recorder: this.$getUserData().name,
+				remark: this.textarea,
+				time: this.$moment().format('YYYY-MM-DD HH:mm')
+			}
+			var data={
+				work_id:this.workDetailData.id,
+				process:[],
+			}
+			items.unshift(process);
+			data.process=items;
+			this.$axios('post', '/api/integral/work', data).then(res => {
+				if (res.data.code == 1) {
+					this.publicClose();
+					this.getData();
+				}
+			})
+		},
+		//更新进度
+		sliderShow(){
+			this.progress = this.workDetailData.progress
+			this.isSlider = true
+		},
+		sliderSend(){
+			var self = this;
+			let data = {
+				work_id: self.workDetailData.id,
+				progress: self.progress,
+			}
+			self.$axios('post','/api/integral/work',data).then(res => {
+				if (res.data.code == 1) {
+					this.getData();
+					self.isSlider = false;
+				}
+			})
+		},
+		publicClose(){
+			this.isSlider = false;
+			this.isOne = false;
+			this.isIntegral = false;
+		},
 		// 关闭弹窗
 		handleClose() {
 			this.$emit('update:visible', false);
@@ -248,6 +476,7 @@ export default {
 	padding: 20px;
 	height: calc(100vh - 60px);
 	overflow: auto;
+	padding-bottom: 100px;
 	.row_title {
 		position: relative;
 		margin: 0 0 20px 0;
@@ -282,4 +511,32 @@ export default {
 .d_content{
 	margin-left: 50px;
 }
+.addJf{
+	font-size: 13px;
+	cursor: pointer;
+	margin-bottom: 5px;
+	padding: 5px;
+	transition: all .3s;
+}
+.addJf:hover{
+	color: #26a2ff !important;
+}
+.num{
+	position: absolute;
+	height: 22px;
+	width: 20px;
+	z-index: 999;
+	left: 85px;
+	line-height: 40px !important;
+}
+.add:before{
+	position: absolute;
+	content: "+";
+	color: #f56c6c;
+}
+.jian:before{
+	position: absolute;
+	content: "-";
+	color: #67c23a;
+}
 </style>

+ 183 - 16
src/views/common/temporaryTask.vue

@@ -11,9 +11,45 @@
 					>
 						<el-input type="textarea" rows="3" maxlength="20" show-word-limit v-model="formData.task_name" placeholder="请输入任务内容(限20字)"></el-input>
 					</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="trees_PtId(formData.pt_id) +'规则'"
+						prop="tree_echo"
+					>
+						<el-cascader
+							v-model="formData.tree_echo"
+							ref="ruleItem"
+							:popper-class="'itemClass'"
+							filterable
+							clearable
+							:options="formData.pt_id == 2 ? trees_ab.A : trees_ab.B"
+							@change="ruleItemChange"
+							:show-all-levels="false"
+							:props="{ children: 'child', label: 'name', value: 'id' }"
+						></el-cascader>
+					</el-form-item>
+					
+					<el-form-item prop="range_type" v-if="formData.range_type != 0">
+						<div style="line-height: 24px;" v-show="formData.range_type == 1">
+							{{ min }}
+							<span class="blue">{{ trees_PtId(formData.pt_id) }}</span>
+						</div>
+						<div style="line-height: 24px;" v-show="formData.range_type == 2">
+							{{ min }} ~ {{ max }}
+							<span class="blue">{{ trees_PtId(formData.pt_id) }}</span>
+						</div>
+						<div style="line-height: 24px;">{{ treeName }}</div>
+					</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-input-number v-if="formData.range_type == 0" v-model.number="formData.base_point"></el-input-number>
+						<el-input-number v-else :disabled="formData.range_type == 1" v-model.number="formData.base_point" :min="min" :max="max"></el-input-number>
 					</el-form-item>
 
 					<el-form-item label="执行人" prop="targets" :rules="[{ required: true, message: '请选择执行人', trigger: 'change' }]">
@@ -64,12 +100,6 @@
 						</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"
@@ -102,6 +132,28 @@
 					<el-form-item label="任务备注" prop="task_remark" :rules="[{ max: 300, message: '长度不能超过 300 个字', trigger: 'blur' }]">
 						<el-input type="textarea" :rows="5" maxlength="300" show-word-limit v-model="formData.task_remark" placeholder="请输入任务内容(限300字)"></el-input>
 					</el-form-item>
+					
+					<el-form-item label="图片">
+						<upload
+							:headers="Xtoken"
+							class="avatar-uploader"
+							:action="'https://' + 'integralsys.oss-cn-shenzhen.aliyuncs.com'"
+							:show-file-list="true"
+							:file-list="fileList"
+							:on-success="handleFilesSuccess"
+							:on-preview="onFilePreView"
+							:before-upload="beforeUpload"
+							:on-remove="onFileRemove"
+							:limit="3"
+							:multiple="true"
+							ref="clearPicture"
+						>
+							<el-button size="small" type="primary">点击上传</el-button>
+							(最多选择3张)
+						</upload>
+					</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>
@@ -135,6 +187,7 @@
 <script>
 import moment from 'moment';
 import EmployeeSelector from '@/components/EmployeeSelector.vue';
+import upload from '@/components/upload';
 export default {
 	name: 'temporaryTask',
 	props: {
@@ -151,16 +204,35 @@ export default {
 		showTitle: {
 			type: String,
 			default: ''
-		}
+		},
+		trees_ab: {
+			type: Object,
+			default: {}
+		},
 	},
 	data() {
 		return {
+			//图片附件
+			Xtoken: { 'X-Token': this.$getToken() },
+			fileList: [],
+			// treesAb: [],
+			max: 0,
+			min: 0,
+			treeName: '',
+
 			taskload: false,
 			formData: {
 				task_name: '',
-				base_point: '',
+				
+				base_point: '0',
 				task_remark: '',
 				pt_id: 3,
+
+				tree_echo: [],//用于编辑任务时的规则回显
+				range_type: 0,
+				rule_id: 0,
+				file_list: [],
+
 				task_expire_day: 1,
 				expire_time: moment().format('YYYY-MM-DD 18:00'),
 				weight: 0,
@@ -259,7 +331,7 @@ export default {
 			]
 		};
 	},
-	components: { EmployeeSelector },
+	components: { EmployeeSelector, upload },
 	watch: {
 		'formData.task_cycle'(val) {
 			if (val) {
@@ -267,12 +339,96 @@ export default {
 			} else {
 				this.formData.expire_time = moment().format('YYYY-MM-DD 18:00');
 			}
+		},
+		'formData.pt_id'(val) {
+			console.log(val)
+			let item = this.formData
+			this.max = 0;
+			this.min = 0;
+			this.treeName = ''
+			item.tree_echo = []
+			item.task_remark = '';
+			item.base_point = '0';
+			item.range_type = 0;
 		}
 	},
 	mounted() {
 		this.point_types = JSON.parse(localStorage.getItem('types'));
 	},
 	methods: {
+		handleFilesSuccess(response, file, fileList) {
+			this.fileFun(file, fileList)
+		},
+		onFilePreView(file) {
+			if (file.response) {
+				window.open(file.response.url, '_blank');
+			}
+		},
+		onFileRemove(file, fileList) {
+			this.fileFun(file, fileList)
+		},
+		fileFun(file, fileList){
+			this.fileList = fileList;
+			this.formData.file_list = []
+			fileList.forEach((item, index) => {
+				this.formData.file_list.push(item.url);
+			});
+		},
+		// 附件上传
+		beforeUpload(file) {
+			const isJPG = /^image\/(jpeg|png|jpg)$/.test(file.type);
+			const isLt2M = file.size / 1024 / 1024 < 1;
+			if (!isJPG) {
+				this.$message.error('上传头像图片只能是 JPG 格式!');
+			}
+			if (!isLt2M) {
+				this.$message.error('上传头像图片大小不能超过 2MB!');
+			}
+			return isJPG && isLt2M;
+		},
+
+
+		trees_PtId(id) {
+			return id == 2 ? 'A分' : 'B分'
+		},
+		ruleItemChange(val){
+			let item = this.formData
+			if(val.length>0){
+				let data = this.$refs.ruleItem.getCheckedNodes()[0].data;//当前选中的节点数据
+				console.log(this.$refs.ruleItem.getCheckedNodes()[0].data)
+				item.task_remark = data.name;
+				this.treeName = data.name;
+				this.max = data.max_point * 1;
+				this.min = data.min_point * 1;
+				item.base_point = data.min_point;
+				item.range_type = data.range_type;
+				item.rule_id = data.pid;
+				item.item_id = data.id;
+			}else{
+				item.task_remark = '';
+				this.treeName = '';
+				this.max = 0;
+				this.min = 0;
+				item.base_point = '0';
+				item.range_type = 0;
+				item.rule_id = 0;
+				item.item_id = 0;
+				
+			}
+		},
+		// 获取规则细则
+		getRuleItemData() {
+			let data = { cycle_type: '1', pt_id: this.integralType };
+			this.$axios('get', '/api/integral/rule/trees', data, 'v2').then(res => {
+				if (res.data.code == 1) {
+					const resultData = res.data.data;
+					this.rule_item_list = resultData.tree;
+					this.flatteningIntegralRules = this.getItemDetail(this.rule_item_list);
+					console.log(this.flatteningIntegralRules)
+					this.loading = false;
+				}
+			});
+		},
 		submitEmployee(name) {
 			this.$refs[name].confirm(); //调用组件的confirm();
 		},
@@ -290,6 +446,13 @@ export default {
 		resetForm(formName) {
 			this.$emit('update:dialogVisible', false);
 			this.$refs[formName].resetFields();
+			this.formData.range_type = 0
+			this.formData.file_list = []
+			this.fileList = []
+			this.formData.tree_echo = [],
+			this.max = 0,
+			this.min = 0,
+			this.treeName = '';
 			this.executorName = '';
 			this.reviewerName = '';
 			this.approval_selected = { dept: [], employee: [] };
@@ -329,6 +492,7 @@ export default {
 				delete data.expire_time;
 				data.task_remark ? '' : delete data.task_remark;
 			}
+			
 
 			if(!data.ahead_award_point && data.ahead_award_point_limit){
 				this.$message.warning('奖分上限不为0时每日奖分不能为空')
@@ -363,17 +527,20 @@ export default {
 			add.forEach(item =>{
 				this.deletedata(data,item)
 			})
-
+			console.log(data)
+			// return
 			this.taskload = true;
 			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);
+						this.resetForm('formData');
+						// 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);
 					}

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

@@ -12,8 +12,39 @@
 						<el-input type="textarea" rows="3" maxlength="20" show-word-limit v-model="formData.task_name" placeholder="请输入任务内容(限20字)"></el-input>
 					</el-form-item>
 
+					
+					<el-form-item
+						:label="trees_PtId(formData.pt_id) +'规则'"
+						prop="tree_echo"
+					>
+						<el-cascader
+							v-model="formData.tree_echo"
+							ref="ruleItem"
+							:popper-class="'itemClass'"
+							filterable
+							clearable
+							:options="formData.pt_id == 2 ? trees_ab.A : trees_ab.B"
+							@change="ruleItemChange"
+							:show-all-levels="false"
+							:props="{ children: 'child', label: 'name', value: 'id' }"
+						></el-cascader>
+					</el-form-item>
+
+					<el-form-item prop="range_type" v-if="formData.range_type != 0">
+						<div style="line-height: 24px;" v-show="formData.range_type == 1">
+							{{ min }}
+							<span class="blue">{{ trees_PtId(formData.pt_id) }}</span>
+						</div>
+						<div style="line-height: 24px;" v-show="formData.range_type == 2">
+							{{ min }} ~ {{ max }}
+							<span class="blue">{{ trees_PtId(formData.pt_id) }}</span>
+						</div>
+						<div style="line-height: 24px;">{{ treeName }}</div>
+					</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-input-number v-if="formData.range_type == 0" v-model.number="formData.base_point"></el-input-number>
+						<el-input-number v-else :disabled="formData.range_type == 1" v-model.number="formData.base_point" :min="min" :max="max"></el-input-number>
 					</el-form-item>
 
 					<el-form-item label="执行人" prop="targets" :rules="[{ required: true, message: '请选择执行人', trigger: 'change' }]">
@@ -100,6 +131,26 @@
 						<el-input type="textarea" :rows="5" maxlength="300" show-word-limit v-model="formData.task_remark" placeholder="请输入任务内容(限300字)"></el-input>
 					</el-form-item>
 					
+					<el-form-item label="图片">
+						<upload
+							:headers="Xtoken"
+							class="avatar-uploader"
+							:action="'https://' + 'integralsys.oss-cn-shenzhen.aliyuncs.com'"
+							:show-file-list="true"
+							:file-list="fileList"
+							:on-success="handleFilesSuccess"
+							:on-preview="onFilePreView"
+							:before-upload="beforeUpload"
+							:on-remove="onFileRemove"
+							:limit="3"
+							:multiple="true"
+							ref="clearPicture"
+						>
+							<el-button size="small" type="primary">点击上传</el-button>
+							(最多选择3张)
+						</upload>
+					</el-form-item>
+					
 					<div style="margin-left: 80px; margin-bottom: 8px;">以天为单位,每 提前/逾期 一天 加分/扣分</div>
 					<el-form-item label="提前奖分" prop="ahead_award_point">
 						<el-input v-model="formData.ahead_award_point" oninput="value=value.replace(/[^\d]/g,'')" placeholder="请输入每日奖分" style="width: 150px;"></el-input> B分/每天,
@@ -127,6 +178,7 @@
 <script>
 import moment from 'moment';
 import EmployeeSelector from '@/components/EmployeeSelector.vue';
+import upload from '@/components/upload';
 export default {
 	name: 'temporaryTask',
 	props: {
@@ -146,15 +198,33 @@ export default {
 		showTitle: {
 			type: String,
 			default: ''
-		}
+		},
+		trees_ab: {
+			type: Object,
+			default: {}
+		},
 	},
 	data() {
 		return {
+			//图片附件
+			Xtoken: { 'X-Token': this.$getToken() },
+			fileList: [],
+
+			// treesAb: [],
+			max: 0,
+			min: 0,
+			treeName: '',
+
 			taskload: false,
 			formData: {
+				tree_echo: [],//用于编辑任务时的规则回显
+				file_list: [],
+				range_type: 0,
+				rule_id: 0,
+
 				id: 0,
 				task_name: '',
-				base_point: '',
+				base_point: '0',
 				task_remark: '',
 				pt_id: 3,
 				task_expire_day: 1,
@@ -256,7 +326,7 @@ export default {
 			]
 		};
 	},
-	components: { EmployeeSelector },
+	components: { EmployeeSelector, upload },
 	watch: {
 		dialogVisible() {
 			if (this.dialogVisible) {
@@ -273,11 +343,73 @@ export default {
 		modifyData() {
 			// this.Datas()
 		}
+	},
+	created() {
+
 	},
 	mounted() {
 		this.point_types = JSON.parse(localStorage.getItem('types'));
 	},
 	methods: {
+		handleFilesSuccess(response, file, fileList) {
+			this.fileFun(file, fileList)
+		},
+		onFilePreView(file) {
+			if (file.response) {
+				window.open(file.response.url, '_blank');
+			}
+		},
+		onFileRemove(file, fileList) {
+			this.fileFun(file, fileList)
+		},
+		fileFun(file, fileList){
+			this.fileList = fileList;
+			this.formData.file_list = []
+			fileList.forEach((item, index) => {
+				this.formData.file_list.push(item.url);
+			});
+		},
+		// 附件上传
+		beforeUpload(file) {
+			const isJPG = /^image\/(jpeg|png|jpg)$/.test(file.type);
+			const isLt2M = file.size / 1024 / 1024 < 1;
+			if (!isJPG) {
+				this.$message.error('上传头像图片只能是 JPG 格式!');
+			}
+			if (!isLt2M) {
+				this.$message.error('上传头像图片大小不能超过 2MB!');
+			}
+			return isJPG && isLt2M;
+		},
+		
+		trees_PtId(id) {
+			return id == 2 ? 'A分' : 'B分'
+		},
+		ruleItemChange(val){
+			let item = this.formData
+			if(val.length>0){
+				let data = this.$refs.ruleItem.getCheckedNodes()[0].data;//当前选中的节点数据
+				item.task_remark = data.name;
+				this.treeName = data.name;
+				this.max = data.max_point * 1;
+				this.min = data.min_point * 1;
+				item.base_point = data.min_point;
+				item.range_type = data.range_type;
+				item.rule_id = data.pid;
+				item.item_id = data.id;
+			}else{
+				item.task_remark = '';
+				this.treeName = '';
+				this.max = 0;
+				this.min = 0;
+				item.base_point = '0';
+				item.range_type = 0;
+				item.rule_id = 0;
+				item.item_id = 0;
+				
+			}
+		},
+
 		submitEmployee(name) {
 			this.$refs[name].confirm(); //调用组件的confirm();
 		},
@@ -304,6 +436,20 @@ export default {
 
 			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 }];
+			
+			let filtList = []
+			this.modifyData.task_file_list.forEach((item, index) =>{
+				filtList.push({name: item ,url:item, response: { url:item }})
+			})
+			this.fileList = filtList
+			if(this.modifyData.point_config.tree_echo){
+				this.formData.tree_echo = this.modifyData.point_config.tree_echo.map(Number);
+			}
+			this.$nextTick(_=>{
+				if(this.formData.tree_echo){
+					this.ruleItemChange(this.formData.tree_echo)
+				}
+			})
 			// if (this.modifyData.point_config.timeout_deduction_point != '0') {
 			// 	this.formData.timeout_deduction_point = this.modifyData.point_config.timeout_deduction_point;
 			// } else {
@@ -333,6 +479,8 @@ export default {
 		resetForm(formName) {
 			this.$emit('update:dialogVisible', false);
 			this.$refs[formName].resetFields();
+			this.fileList = []
+			this.formData.tree_echo = []
 			this.executorName = '';
 			this.reviewerName = '';
 		},
@@ -398,10 +546,11 @@ export default {
 				.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.resetForm('formData')
+						// 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);
@@ -439,7 +588,8 @@ export default {
 			this.show_reviewer_selector = false;
 		},
 		closeDialog() {
-			this.$emit('update:dialogVisible', false);
+			this.resetForm('formData')
+			// this.$emit('update:dialogVisible', false);
 		}
 	}
 };

+ 26 - 14
src/views/ranking/integral_event.vue

@@ -154,10 +154,6 @@
 					<el-col :span="18">{{ detail_info.rule_list }}</el-col>
 				</el-row>
 
-				<el-row v-show="detail_info.rule_list">
-					<el-col :span="6">事件时间</el-col>
-					<el-col :span="18">{{ detail_info.date }}</el-col>
-				</el-row>
 
 				<el-row v-show="detail_info.source_type_mark">
 					<el-col :span="6">来源类型</el-col>
@@ -169,15 +165,29 @@
 					<el-col :span="18">{{ detail_info.employee_name }}</el-col>
 				</el-row>
 
-				<el-row v-show="detail_info.files !== null && detail_info.files.length > 0">
-					<el-col :span="6">图片</el-col>
-					<el-col :span="18">
+				<el-row v-show="detail_info.rule_list">
+					<el-col :span="6">事件时间</el-col>
+					<el-col :span="18">{{ detail_info.date }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.complete_task">
+					<el-col :span="6">完成时间</el-col>
+					<el-col :span="18">{{ detail_info.complete_task.time }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.complete_task">
+					<el-col :span="6">完成备注</el-col>
+					<el-col :span="18">{{ detail_info.complete_task.remark }}</el-col>
+				</el-row>
+
+				<el-row v-show="detail_info.complete_task && detail_info.complete_task.files && detail_info.complete_task.files.length > 0">
+					<el-col :span="18" :offset="6">
 						<el-image
-							v-for="(itme, index) in detail_info.files"
+							v-for="(itme, index) in detail_info.complete_task.files"
 							:key="index"
 							style="width: 80px; height: 80px;margin: 0 5px;"
 							:src="itme"
-							:preview-src-list="detail_info.files"
+							:preview-src-list="detail_info.complete_task.files"
 						></el-image>
 					</el-col>
 				</el-row>
@@ -210,10 +220,10 @@
 						<span style=";padding-left:5px;">»</span>
 					</el-button>
 				</div>
-				<div v-if="!this.$authoritys('employee')" style="position: absolute; bottom: 20px; display: block; right: 20px;">
-					<el-button @click="close_integral_event">取消</el-button>
-					<el-button type="danger" @click="del_integral_event(detail_info)">删除</el-button>
-				</div>
+			</div>
+			<div v-if="!this.$authoritys('employee')" style="position: absolute; bottom: 20px; display: block; right: 20px;">
+				<el-button @click="close_integral_event">取消</el-button>
+				<el-button type="danger" @click="del_integral_event(detail_info)">删除</el-button>
 			</div>
 		</el-drawer>
 
@@ -818,7 +828,9 @@ header.el-drawer__header {
 }
 .detail_popup {
 	padding: 20px;
-	height: 100%;
+	height: calc(100vh - 140px);
+	overflow: auto;
+    padding-bottom: 100px;
 	.row_title {
 		position: relative;
 		margin: 0 0 20px 0;

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

@@ -123,6 +123,11 @@
 								</div>
 							</template>
 						</el-table-column>
+						<el-table-column label="管理上级" align="center" width="80">
+							<template slot-scope="scope">
+								<span v-if="scope.row.is_creator != 1 && scope.row.is_official != 0" class="participateRank" style="color:#409eff;" @click="setSuperior(scope.row)">设置</span>
+							</template>
+						</el-table-column>
 						<template slot="empty">
 							<noData></noData>
 						</template>
@@ -175,15 +180,41 @@
 						</el-upload>
 					</div>
 		</el-dialog>
+		
+		<el-dialog title="设置管理上级" :visible.sync="manageScope_show" :before-close="publicClose2" top="5vh" width="700px">
+			<EmployeeSelector
+				v-if="manageScope_show"
+				ref="Employee2"
+				:employee_list="employeeList"
+				:user_no_select="false"
+				isCreatorSelect
+				createDimness
+				:selected="selected_manage"
+				@confirm="manage_confirm"
+			></EmployeeSelector>
+			<span slot="footer">
+				<el-button @click="publicClose2()">取消</el-button>
+				<el-button type="primary" :loading="scope_loading" :disabled="scope_loading" @click="sub_manageScope">完成</el-button>
+			</span>
+		</el-dialog>
 	</div>
 </template>
 
 <script>
 import noData from '@/components/noData';
+import EmployeeSelector from '@/components/EmployeeSelector.vue';
 import {_debounce} from '@/api/auth';
 export default {
 	data() {
 		return {
+			manageData: [],//管理员列表
+			employeeList: [],
+			manageScope_show: false,
+			scope_loading: false,
+			clickone: false,
+			mangeId: 0,
+			selected_manage: { employee: [], dept: [] },
+
 			is: 1,
 			no: 0,
 			page: 1,
@@ -236,7 +267,8 @@ export default {
 		};
 	},
 	components: {
-		noData
+		noData,
+		EmployeeSelector
 	},
 	watch: {
 		keywords: {
@@ -258,6 +290,7 @@ export default {
 	created() {
 		this.getInfo();
 		this.getEmployee();
+		this.manageList();
 	},
 	mounted() {
 		this.$nextTick(function() {
@@ -269,6 +302,70 @@ export default {
 		});
 	},
 	methods: {
+		manage_confirm(date) {
+			let manageId = [];
+			date.employee.forEach(item => manageId.push(item.id))
+			let data = {
+				employee_id: this.mangeId,
+				manage_id: manageId
+			}
+			this.$axios('post', '/api/employee/superior', data).then(res =>{
+				if(res.data.code == 1){
+					this.manageScope_show = false
+					this.$message.success('设置成功');
+				}
+			}).finally(_=>{
+				this.scope_loading = false
+			})
+		},
+		sub_manageScope(){
+			this.scope_loading = true
+			this.$refs.Employee2.confirm();
+		},
+		setSuperior(row){
+
+			if(this.clickone){
+				return false
+			}
+			this.mangeId = row.id
+			let createData = {}
+			createData = this.manageData.filter(x => x.is_creator == 1)
+			let list = this.manageData.filter(x => x.id != row.id && x.is_creator != 1)
+			this.employeeList = list
+			this.clickone = true
+			this.$axios('get', '/api/employee/info', { id: row.id })
+			.then(res => {
+				if (res.data.code == 1) {
+					let supList = res.data.data.employee_detail.superior_list
+					supList.some(item =>{
+						if(item.id == createData[0].id){
+							item.is_creator = true
+							return true
+						}
+					})
+					this.selected_manage.employee = supList
+					this.manageScope_show = true
+				}
+			})
+			.finally(() => {
+				this.clickone = false
+			});
+		},
+		publicClose2() {
+			this.$refs.Employee2.close();
+			this.manageScope_show = false;
+		},
+		//管理列表
+		manageList(){
+			let params = {
+				roles: ['creator', 'admin', 'point_manager', 'dept_manager']
+			}
+			this.$axios('get', '/api/employee/role_employee', params).then(res =>{
+				if(res.data.code == 1){
+					this.manageData = res.data.data.list
+				}
+			})
+		},
 		handleSuccess(response) {
 			if (response.code == 1) {
 				if (response.data.list.length > 0) {
@@ -706,4 +803,15 @@ export default {
 	cursor: pointer;
 	text-decoration: underline;
 }
+.tips {
+	background: #dcdfe6;
+	border-radius: 50%;
+	width: 14px;
+	height: 14px;
+	color: #fff;
+	display: inline-block;
+	font-size: 12px;
+	line-height: 14px;
+	text-align: center;
+}
 </style>

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

@@ -79,6 +79,42 @@
 				</div>
 				<el-button type="primary" class="save" @click="saveFirst('second')">保存</el-button>
 			</el-tab-pane>
+			<el-tab-pane label="操作历史" name="history">
+				<el-form :inline="true">
+					<el-form-item style="float: right;margin-bottom: 0;">
+						<el-input size="medium" v-model="formData.keywords" placeholder="请输入内容" max="200" @keyup.enter.native="his_int()" class="persons_name">
+							<el-button size="medium" slot="append" icon="el-icon-search" @click="his_int()"></el-button>
+						</el-input>
+					</el-form-item>
+				</el-form>
+				<el-table :data="list" style="width: 100%" v-loading="hisload">
+					<!-- <el-table-column label="操作人" prop="name" width="250">
+						<template slot-scope="scope">
+							<div class="flex-box-ce">
+								<userImage class="fl" :id="scope.row.id" :user_name="scope.row.name" :img_url="scope.row.img_url" width="50px" height="50px"></userImage>
+								<span style="line-height: 50px; padding-left: 10px;">{{ scope.row.name }}</span>
+							</div>
+						</template>
+					</el-table-column> -->
+					<el-table-column label="内容" prop="content"></el-table-column>
+					<el-table-column prop="create_time" label="时间" width="180px"></el-table-column>
+					<template slot="empty">
+						<noData></noData>
+					</template>
+				</el-table>
+				<center style="padding: 20px 0;">
+					<el-pagination
+					background
+					@size-change="handleSizeChange"
+					@current-change="handleCurrentChange"
+					:page-sizes="[10, 20, 50, 100]"
+					layout="total, sizes, prev, pager, next"
+					:page-size="formData.page_size"
+					:current-page="formData.page"
+					:total="total"
+					></el-pagination>
+				</center>
+			</el-tab-pane>
 		</el-tabs>
 
 		<el-dialog title="系统审批流程" :visible.sync="dialogVisible" width="770px" top="3vh" :before-close="handleClose">
@@ -87,6 +123,7 @@
 	</div>
 </template>
 <script>
+import noData from '@/components/noData';
 export default {
 	data() {
 		return {
@@ -111,13 +148,41 @@ export default {
 			isApB: false,
 
 			// 管理者奖扣记入
-			task_review: false
+			task_review: false,
+
+			// 操作历史
+			hisload: false,
+			list: null,
+      		total: null,
+			formData: {
+				keywords: '',
+				page: 1,
+				page_size: 10
+			},
 		};
 	},
+	components: {
+		noData
+	},
 	mounted() {
 		this.cheakAx('first');
 	},
 	methods: {
+		hisList() {
+			let params = this.formData
+			console.log(params)
+			this.hisload = true
+			this.$axios('get', '/api/log/operation/list', params).then(res =>{
+				if(res.data.code == 1){
+					let list = res.data.data.list
+					console.log(res)
+					this.list = list.list
+					this.total = list.total
+				}
+			}).finally(_=>{
+				this.hisload = false
+			})
+		},
 		approvalProcess() {
 			this.dialogVisible = true;
 		},
@@ -125,7 +190,11 @@ export default {
 			none();
 		},
 		handleClick(tab, event) {
-			this.cheakAx(this.activeName);
+			if(this.activeName == 'history'){
+				this.hisList()
+			}else{
+				this.cheakAx(this.activeName);
+			}
 		},
 		saveFirst(name) {
 			let data = {};
@@ -184,7 +253,20 @@ export default {
 				.finally(err => {
 					this.loading = false;
 				});
-		}
+		},
+		// 页码变更
+		handleCurrentChange(val) {
+			this.formData.page = val;
+			this.hisList()
+		},
+		handleSizeChange(val) {
+			this.formData.page_size = val;
+			this.hisList()
+		},
+		his_int(val) {
+			this.formData.page = 1;
+			this.hisList()
+		},
 	}
 };
 </script>

+ 6 - 5
src/views/task/allTask.vue

@@ -11,16 +11,16 @@
 						<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.employee_id" filterable clearable placeholder="请输入负责人">
+				<el-form-item label="执行人" label-width="60px">
+					<el-select  v-model="formData.employee_id" filterable clearable placeholder="请输入执行人">
 					  <el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
 					</el-select>
 				</el-form-item>
-<!-- 				<el-form-item label="审批人">
+				<el-form-item label="审批人" label-width="60px">
 					<el-select  v-model="formData.reviewer_id" filterable clearable placeholder="请输入审批人">
 					  <el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
 					</el-select>
-				</el-form-item> -->
+				</el-form-item>
 				<el-form-item label="任务内容">
 					<el-input
 						placeholder="搜索任务内容"
@@ -36,7 +36,7 @@
 
 			<div>
 				<el-table :data="list" ref="elTable" style="width: 100%" v-loading="loading"  @sort-change="sortChange">
-					<el-table-column label="负责人" prop="employee_id">
+					<el-table-column label="执行人" prop="employee_id">
 					  <template slot-scope="scope">
 					   <div class="flex-box-ce">
 					      <userImage  :id="scope.row.employee_id" width="50px" height="50px"  :user_name="scope.row.employee_name" ></userImage>
@@ -72,6 +72,7 @@
 						</template>
 					</el-table-column>
 					<el-table-column label="截止时间" prop="expire_time" sortable="custom"></el-table-column>
+					<el-table-column label="审批人" prop="reviewer_name"></el-table-column>
 					<el-table-column label="操作" prop="owner_id">
 						<template slot-scope="scope">
 							<el-link type="primary" :underline="false" @click.stop="openDetail(scope.row)" class="blue">查看任务</el-link>

+ 56 - 7
src/views/task/get_task.vue

@@ -108,6 +108,24 @@
 						<el-col :span="20">{{ detailInfo.task_remark }}</el-col>
 					</el-row>
 
+					<!-- 发布时的图片 -->
+					<el-row v-if="detailInfo.task_file_list !== null && detailInfo.task_file_list.length !== 0">
+						<el-col :span="20" :offset="4">
+							<el-image
+								v-for="(item, index) in detailInfo.task_file_list"
+								:key="index"
+								style="width: 100px; height: 100px;margin-right:8px"
+								:src="item"
+								:preview-src-list="detailInfo.task_file_list"
+							></el-image>
+						</el-col>
+					</el-row>
+					<!-- <el-row v-if="detailInfo.task_file_list !== null && detailInfo.task_file_list.length !== 0">
+						<el-col :span="20" :offset="4">
+							<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> -->
+
 					<el-row v-if="detailInfo.type_mark !== ''">
 						<el-col :span="4">任务类型</el-col>
 						<el-col :span="20">{{ detailInfo.type_mark }}</el-col>
@@ -117,11 +135,6 @@
 						<el-col :span="4">积分类型</el-col>
 						<el-col :span="20">{{ $getTypsName(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="detailInfo.reviewer_name">
 						<el-col :span="4">审批人</el-col>
 						<el-col :span="20">{{ detailInfo.reviewer_name }}</el-col>
@@ -131,13 +144,49 @@
 						<el-col :span="4">发布人</el-col>
 						<el-col :span="20">{{ detailInfo.owner_name }}</el-col>
 					</el-row>
+					<el-row v-if="detailInfo.create_time">
+						<el-col :span="4">发布时间</el-col>
+						<el-col :span="20">{{ detailInfo.create_time }}</el-col>
+					</el-row>
 
-					<el-row v-if="detailInfo.task_file_list !== null && detailInfo.task_file_list.length !== 0">
+					<el-row v-if="detailInfo.expire_time !== ''">
+						<el-col :span="4">截止时间</el-col>
+						<el-col :span="20">{{ detailInfo.expire_time }}</el-col>
+					</el-row>
+					<el-row v-if="detailInfo.point_config">
+						<el-col :span="4">提前奖分</el-col>
+						<el-col :span="20">{{ detailInfo.point_config.ahead_award_point }}/天</el-col>
+					</el-row>
+					<el-row v-if="detailInfo.point_config">
+						<el-col :span="4">逾期扣分</el-col>
+						<el-col :span="20">{{detailInfo.point_config.timeout_deduction_point}}/天</el-col>
+					</el-row>
+					
+					<div v-show="detailInfo.point_config && detailInfo.point_config.item_info">
+						<p class="row_title">规则依据</p>
+						<el-row :gutter="10" v-if="detailInfo.point_config.rule_info">
+							<el-col :span="4">规则分类</el-col>
+							<el-col :span="19">{{ detailInfo.point_config.rule_info.name }}</el-col>
+						</el-row>
+						<el-row v-if="detailInfo.point_config.item_info">
+							<el-col :span="4">积分规则</el-col>
+							<el-col :span="19">{{ detailInfo.point_config.item_info.remark }}</el-col>
+						</el-row>
+						<el-row v-if="detailInfo.point_config.item_info">
+							<el-col :span="4">积分</el-col>
+							<el-col :span="19" v-show="detailInfo.point_config.item_info.min_point == detailInfo.point_config.item_info.max_point">{{ detailInfo.point_config.item_info.min_point }}</el-col>
+							<el-col :span="19" v-show="detailInfo.point_config.item_info.min_point != detailInfo.point_config.item_info.max_point">
+								{{ detailInfo.point_config.item_info.min_point }} ~ {{ detailInfo.point_config.item_info.max_point }}
+							</el-col>
+						</el-row>
+					</div>
+
+					<!-- <el-row v-if="detailInfo.task_file_list !== null && detailInfo.task_file_list.length !== 0">
 						<el-col :span="4">图片附件</el-col>
 						<el-col :span="20">
 							<el-image style="width: 100px; height: 100px" :src="detailInfo.task_file_list[0]" :preview-src-list="detailInfo.task_file_list"></el-image>
 						</el-col>
-					</el-row>
+					</el-row> -->
 
 					<div
 						style="position: absolute; bottom: 20px; display: block; right: 20px;"

+ 20 - 5
src/views/task/myExamine.vue

@@ -11,21 +11,26 @@
 						<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.employee_id" filterable clearable placeholder="请输入负责人">
+				<el-form-item label="执行人" label-width="60px">
+					<el-select  v-model="formData.employee_id" filterable clearable placeholder="请输入执行人">
 					  <el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
 					</el-select>
 				</el-form-item>
-				<el-form-item label="排序">
+				<el-form-item label="排序" label-width="60px">
 					<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-item>
+					<el-input v-model="formData.content" placeholder="请输入任务内容" max="200" @keyup.enter.native="getContent()" class="persons_name">
+						<el-button slot="append" icon="el-icon-search" @click="getContent()"></el-button>
+					</el-input>
+				</el-form-item>
 			</el-form>
 
 			<div>
 				<el-table :data="list" style="width: 100%" v-loading="loading">
-					<el-table-column label="负责人" prop="employee_id">
+					<el-table-column label="执行人" prop="employee_id">
 					  <template slot-scope="scope">
 					   <div class="flex-box-ce">
 					      <userImage  width="50px" :id="scope.row.employee_id" height="50px"  :user_name="scope.row.employee_name" ></userImage>
@@ -121,7 +126,8 @@ export default {
 				sort: 'publish',
 				source_type: '0',
 				page: 1,
-				page_size: 10
+				page_size: 10,
+				content: ''
 			},
 			completeShow: false,
 			showDetailPopup: false,
@@ -139,17 +145,21 @@ export default {
 	watch: {
 		'formData.pt_id'(val) {
 			this.formData.page = 1;
+			this.list = []
 			this.getSpList();
 		},
 		'formData.sort'(val) {
 			this.formData.page = 1;
+			this.list = []
 			this.getSpList();
 		},
 		'formData.employee_id'(val) {
 			this.formData.page = 1;
+			this.list = []
 			this.getSpList();
 		},
 		'formData.status'(val) {
+			this.formData.content = '';
 			this.formData.page = 1;
 			this.formData.pt_id = 0;
 			this.formData.employee_id=''
@@ -166,6 +176,11 @@ export default {
 		this.point_type = this.getPointType();
 	},
 	methods: {
+		getContent(){
+			this.formData.page = 1
+			this.list = []
+			this.getSpList();
+		},
 		//获取员工列表
 		getEmployee() {
 			this.$axios('get', '/api/employee/index', { dept_id: 0, page: 1, page_size: 3000 }).then(res => {

+ 108 - 29
src/views/task/my_issue.vue

@@ -31,14 +31,28 @@
             <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 label-width="60px">
+						<el-input v-model="formData.content" placeholder="请输入任务内容" max="200" @keyup.enter.native="getContent()" class="persons_name">
+							<el-button slot="append" icon="el-icon-search" @click="getContent()"></el-button>
+						</el-input>
+        </el-form-item>
+
+        <el-form-item v-if="status == 'assign' || status == 'repetitive'" label="执行人" label-width="60px">
+					<el-select v-model="formData.executor_id" clearable filterable placeholder="请输入或选择执行人">
+						<el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
+					</el-select>
+        </el-form-item>
+
+        <el-form-item label="审批人" label-width="60px">
+					<el-select v-model="formData.reviewer_id" clearable filterable placeholder="请输入或选择审批人">
+						<el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
+					</el-select>
         </el-form-item>
+
       </el-form>
 
-      <div v-if="status == 'assign'">
+      <div v-show="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">
@@ -53,10 +67,10 @@
 				<span class="font-flex-word" style="max-width: 200px;">{{scope.row.task_name}}</span>
             </template>
           </el-table-column>
-          <el-table-column label="积分" prop="point_config.base_point" width="100px">
+          <el-table-column label="积分" prop="base_point" width="100px">
             <template slot-scope="scope">
-		      <span v-if="scope.row.point_config.review_point>0" class="red">+{{scope.row.point_config.review_point}} {{scope.row.pt_name}}</span>
-			  <span v-else class="red">+{{scope.row.point_config.base_point}} {{scope.row.pt_name}}</span>
+              <span v-if="scope.row.point_config && scope.row.point_config.review_point>0" class="red">+{{scope.row.point_config.review_point}} {{scope.row.pt_name}}</span>
+              <span v-else class="red">+<span v-if="scope.row.point_config && scope.row.point_config.base_point">{{scope.row.point_config.base_point}}</span> {{scope.row.pt_name}}</span>
             </template>
           </el-table-column>
           <el-table-column label="截止时间" prop="expire_time">
@@ -64,6 +78,7 @@
               <span>{{scope.row.expire_time}}</span>
             </template>
           </el-table-column>
+					<el-table-column label="审批人" width="100px" prop="reviewer_name"></el-table-column>
           <el-table-column label="状态" prop="owner_id" width="100px">
             <template slot-scope="scope">
               <span class="yellow" v-if="scope.row.status==1">进行中</span>
@@ -92,7 +107,7 @@
         </el-table>
       </div>
 
-      <div v-if="status == 'reward'">
+      <div v-show="status == 'reward'">
         <el-table :data="list" style="width: 100%" v-loading="loading" @row-click="rewardTasksClick">
           <el-table-column label="发布人" prop="employee_id">
             <template slot-scope="scope">
@@ -116,6 +131,11 @@
             <template slot-scope="scope">
               <span>{{scope.row.expire_time}}</span>
             </template>
+          </el-table-column>
+					<el-table-column label="审批人" width="100px" prop="reviewer_name">
+            <template slot-scope="scope">
+              <span v-if="scope.row.reviewer_id" >{{employee_map.filter(x => x.id == scope.row.reviewer_id)[0].name}}</span>
+            </template>
           </el-table-column>
           <el-table-column label="状态" prop="owner_id" width="100px">
             <template slot-scope="scope">
@@ -147,7 +167,7 @@
 
       <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">
+          <el-table-column label="执行人" prop="target_info" width="120px">
             <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>
@@ -160,26 +180,27 @@
 				<span class="font-flex-word" style="max-width: 200px;">{{scope.row.name || scope.row.remark}}</span>
             </template>
           </el-table-column>
-          <el-table-column label="任务积分" prop="point_config.base_point">
+          <el-table-column label="任务积分" prop="point_config.base_point" width="130px">
             <template slot-scope="scope">
 				<span class="red">+{{scope.row.point_config.base_point}} {{$getTypsName(scope.row.pt_id)}}</span>
             </template>
           </el-table-column>
-          <el-table-column label="重复周期" prop="task_cycle">
+          <el-table-column label="重复周期" prop="task_cycle" width="220px">
             <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 == '1'">每天0点自动发布,{{dayTime(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>每周一自动发布,周{{weekList[scope.row.task_cycle_value - 1]}}截止</span>
               </span>
-              <span v-if="scope.row.task_cycle == '3'">每月自动发布 完成截止为次月{{scope.row.task_cycle_value}}号</span>
+              <span v-if="scope.row.task_cycle == '3'">每月1号自动发布,{{scope.row.task_cycle_value}}号截止</span>
+            </template>
+          </el-table-column>
+
+          <el-table-column label="可见范围" prop="department_info">
+            <template slot-scope="scope">
+              <span v-for="(item,index) in scope.row.department_info" :key="index">{{item.name}}<span v-if="(scope.row.department_info.length - 1) > index">,</span></span>
             </template>
           </el-table-column>
+          <el-table-column label="创建时间" prop="create_time" width="90px"></el-table-column>
 
           <el-table-column prop="base_point" label="操作" align="center" width='80px'>
             <template slot-scope="scope">
@@ -212,13 +233,13 @@
 
     </div>
     <!-- 临时任务 -->
-    <temporaryTask :dialogVisible.sync="dialogVisible" :showTitle="'临时任务'"></temporaryTask>
+    <temporaryTask :dialogVisible.sync="dialogVisible" :trees_ab="trees_v2_ab_module" :showTitle="'临时任务'"></temporaryTask>
     <!-- 临时任务-修改 -->
-    <temporaryTaskAmend :dialogVisible.sync="dialogVisibleAmend" :showTitle="'任务编辑'" :modifyData="modifyData"></temporaryTaskAmend>
+    <temporaryTaskAmend :dialogVisible.sync="dialogVisibleAmend" :trees_ab="trees_v2_ab_module" :showTitle="'任务编辑'" :modifyData="modifyData"></temporaryTaskAmend>
     <!-- 悬赏任务 -->
-    <rewardTask :dialogVisible.sync="rewardTaskShow" :showTitle="'悬赏任务'"></rewardTask>
+    <rewardTask :dialogVisible.sync="rewardTaskShow" :trees_ab="trees_v2_ab_module" :showTitle="'悬赏任务'"></rewardTask>
     <!-- 悬赏任务-修改 -->
-    <rewardTaskAmend :dialogVisible.sync="rewardTaskAmendShow" ref="rewardTasks" :showTitle="'任务编辑'" :rewardTaskAmendData="rewardTaskAmendData"></rewardTaskAmend>
+    <rewardTaskAmend :dialogVisible.sync="rewardTaskAmendShow" :trees_ab="trees_v2_ab_module" ref="rewardTasks" :showTitle="'任务编辑'" :rewardTaskAmendData="rewardTaskAmendData"></rewardTaskAmend>
 
     <!-- 详情弹窗 -->
     <taskDetailsPopup :visible.sync="showDetailPopup"  v-if="showDetailPopup" :id="detailId" :title="'任务详情'"></taskDetailsPopup>
@@ -245,6 +266,7 @@
     name: 'my_issue',
     data() {
       return {
+        weekList: ['一', '二', '三', '四', '五', '六', '日'],
         rewardTaskAmendData:{},//悬赏修改
         modifyData:{},//任务修改
 
@@ -259,7 +281,11 @@
           pt_id: 0,
           page_size: 10,
           page: 1,
-          source_type: '1'
+          source_type: '1',
+
+          executor_id: '',//执行人
+          reviewer_id: '',//审批人
+          content: '',//内容
         },
         total: null,
         list: [],
@@ -280,6 +306,7 @@
           { label: '我悬赏的', name: 'reward' },
           { label: '重复任务', name: 'repetitive' },
         ],
+        
         dialogVisible: false,
         dialogVisibleAmend: false,
         rewardTaskShow: false,
@@ -287,12 +314,20 @@
         showDetailPopup: false,
         showRepetitiveTasksPopup: false,
         showRewardTaskDetailsPopup: false,
-        detailId: 0
+        detailId: 0,
+        trees_v2_ab_module: {
+          A: [],
+          B: [],
+        },
+        employee_map: [],//人员列表
       }
     },
     components: {noData,temporaryTask,rewardTask,rewardTaskAmend ,temporaryTaskAmend,taskDetailsPopup,repeatTaskDetailsPopup, rewardTaskDetailsPopup},
     watch:{
       status(val){
+        this.formData.executor_id = ''
+        this.formData.reviewer_id = ''
+        this.formData.content = ''
         this.formData.page = 1
         this.formData.status = "all"
         this.formData.sort = "publish"
@@ -322,6 +357,19 @@
         this.list = []
         this.get_list()
       },
+      'formData.executor_id' (){
+        this.formData.page = 1
+        this.list = []
+        this.get_list()
+      },
+      'formData.reviewer_id' (){
+        this.formData.page = 1
+        this.list = []
+        this.get_list()
+      },
+    },
+    created() {
+      this.getRuleItemData()//获取AB分细则
     },
     mounted() {
       this.getUserDetail()
@@ -332,8 +380,27 @@
       }
       this.get_list()
       this.point_types = this.getPointTypes()
+		  this.getEmployee();//员工列表
     },
     methods: {
+      dayTime(item){
+        return item > 9 ? item + ': 00' : '0' + item + ': 00'
+      },
+      getContent(){
+        this.formData.page = 1
+        this.list = []
+        this.get_list()
+      },
+
+      //获取员工列表
+      getEmployee() {
+        this.$axios('get', '/api/employee/index', { dept_id: 0, keywords: '', page: 1, page_size: 3000,is_official:1 })
+          .then(res => {
+            let list = res.data.data.list;
+            this.employee_map = list;
+          })
+      },
+
       getUserDetail(){
         this.$axios('get', '/api/employee/detail').then(res => {
           this.$setUserData(res.data.data.user);
@@ -389,7 +456,6 @@
 
       // 点击详情
       rowClick(row) {
-		console.log(row);
         this.showDetailPopup = true
         this.detailId = parseInt(row.id)
       },
@@ -431,9 +497,12 @@
         self.loading = true
         let params = JSON.parse(JSON.stringify(this.formData))
         params.pt_id == 0?delete params.pt_id:'';
+        params.executor_id == ''?delete params.executor_id:'';
+        params.reviewer_id == ''?delete params.reviewer_id:'';
         if(self.status == 'assign'){
           delete params.order_by
         }else if(self.status == 'reward'){
+          delete params.executor_id
           delete params.status
           delete params.sort
         }else{
@@ -455,7 +524,17 @@
         }).finally(()=>{
           self.loading = false
         })
-      }
+      },
+      
+      // 获取ab规则细则
+      getRuleItemData() {
+        let a = this.$axios('get', '/api/integral/rule/trees', { cycle_type: '1', pt_id: '2'}, 'v2');
+        let b = this.$axios('get', '/api/integral/rule/trees', { cycle_type: '1', pt_id: '3'}, 'v2');
+        Promise.all([a, b]).then(res =>{
+          this.trees_v2_ab_module.A = res[0].data.data.tree
+          this.trees_v2_ab_module.B = res[1].data.data.tree
+        })
+      },
     }
   }
 </script>

+ 87 - 6
src/views/task/my_task.vue

@@ -16,6 +16,12 @@
 						<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-item style="float: right;">
+					<el-input v-model="formData.content" placeholder="请输入任务内容" max="200" @keyup.enter.native="getContent()" class="persons_name">
+						<el-button slot="append" icon="el-icon-search" @click="getContent()"></el-button>
+					</el-input>
+				</el-form-item>
 			</el-form>
 
 			<div v-if="formData.status == 'running'">
@@ -39,6 +45,7 @@
 						</template>
 					</el-table-column>
 					<el-table-column label="截止时间" prop="expire_time"></el-table-column>
+					<el-table-column label="审批人" prop="reviewer_name"></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>
@@ -71,6 +78,7 @@
 						</template>
 					</el-table-column>
 					<el-table-column label="截止时间" prop="expire_time"></el-table-column>
+					<el-table-column label="审批人" prop="reviewer_name"></el-table-column>
 					<el-table-column label="状态" prop="review_status">
 						<template slot-scope="scope">
 							  <div class="yellow" v-if="scope.row.review_status == 0">待处理</div>
@@ -102,8 +110,27 @@
 			<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" :rows="4"  maxlength="20" show-word-limit></el-input>
+					<el-form-item label="任务备注" prop="remark" :rules="[{ required: true, message: '请填写任务备注(限200字)', trigger: 'blur' }]">
+						<el-input v-model="detail_form.remark" type="textarea" :rows="4"  maxlength="200" show-word-limit></el-input>
+					</el-form-item>
+					<el-form-item label="图片">
+						<upload
+							:headers="Xtoken"
+							class="avatar-uploader"
+							:action="'https://' + 'integralsys.oss-cn-shenzhen.aliyuncs.com'"
+							:show-file-list="true"
+							:file-list="detail_form.fileList"
+							:on-success="handleFilesSuccess"
+							:on-preview="onFilePreView"
+							:before-upload="beforeUpload"
+							:on-remove="onFileRemove"
+							:limit="3"
+							:multiple="true"
+							ref="clearPicture"
+						>
+							<el-button size="small" type="primary">点击上传</el-button>
+							(最多选择3张)
+						</upload>
 					</el-form-item>
 					<el-form-item>
 						<el-button @click="resetForm('detail_form')">取消</el-button>
@@ -121,11 +148,15 @@
 <script>
 import noData from '@/components/noData';
 import taskDetailsPopup from '@/views/common/taskDetailsPopup'
+import upload from '@/components/upload';
 
 export default {
 	name: 'my_task',
 	data() {
 		return {
+			//图片附件
+			Xtoken: { 'X-Token': this.$getToken() },
+
 			active: 'running',
 			tabsOption: [{ label: '待完成', name: 'running' }, { label: '待审批', name: 'complete' }, { label: '已审批', name: 'reviewed' }],
 			list: [],
@@ -135,7 +166,9 @@ export default {
 			point_type: null,
 			detail_form: {
 				id: '',
-				remark: ''
+				remark: '',
+				fileList: [],
+				files: [],
 			},
 			formData: {
 				status: 'running',
@@ -143,7 +176,8 @@ export default {
 				sort: 'publish',
 				today: '0',
 				page: 1,
-				page_size: 10
+				page_size: 10,
+				content: '',
 			},
 			completeShow: false,
 			showDetailPopup: false,
@@ -152,15 +186,20 @@ export default {
 			showRewardTaskDetailsPopup: false
 		};
 	},
-	components: { taskDetailsPopup, noData },
+	components: { taskDetailsPopup, noData, upload },
 	watch: {
 		'formData.pt_id'(val) {
+			this.formData.page = 1
+			this.list = []
 			this.get_list();
 		},
 		'formData.sort'(val) {
+			this.formData.page = 1
+			this.list = []
 			this.get_list();
 		},
 		'formData.status'(val) {
+			this.formData.content = '';
 			this.formData.page = 1;
 			this.formData.pt_id = 0;
 			this.formData.sort = 'publish';
@@ -175,6 +214,42 @@ export default {
 		this.point_type = this.getPointType();
 	},
 	methods: {
+		getContent(){
+			this.formData.page = 1
+			this.list = []
+			this.get_list()
+		},
+		handleFilesSuccess(response, file, fileList) {
+			this.fileFun(file, fileList)
+		},
+		onFilePreView(file) {
+			if (file.response) {
+				window.open(file.response.url, '_blank');
+			}
+		},
+		onFileRemove(file, fileList) {
+			this.fileFun(file, fileList)
+		},
+		fileFun(file, fileList){
+			this.detail_form.fileList = fileList;
+			this.detail_form.files = []
+			fileList.forEach((item, index) => {
+				this.detail_form.files.push(item.url);
+			});
+		},
+		// 附件上传
+		beforeUpload(file) {
+			const isJPG = /^image\/(jpeg|png|jpg)$/.test(file.type);
+			const isLt2M = file.size / 1024 / 1024 < 1;
+			if (!isJPG) {
+				this.$message.error('上传头像图片只能是 JPG 格式!');
+			}
+			if (!isLt2M) {
+				this.$message.error('上传头像图片大小不能超过 2MB!');
+			}
+			return isJPG && isLt2M;
+		},
+
 		// 点击完成
 		completeBtn(data) {
 			this.detail_form.id = data.id;
@@ -189,13 +264,16 @@ export default {
 						work_id: self.detail_form.id,
 						progress: '100',
 						remark: self.detail_form.remark,
-						state: '1'
+						state: '1',
+						files: this.detail_form.files
 					};
 					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.detail_form.fileList = []
+							self.detail_form.files = []
 							self.get_list();
 						} else {
 							self.$message.error(res.data.msg);
@@ -208,6 +286,9 @@ export default {
 		resetForm(formName) {
 			this.$refs[formName].resetFields();
 			this.completeShow = false;
+			this.detail_form.fileList = []
+			this.detail_form.files = []
+
 		},
 		getPointType() {
 			let point = window.plus ? JSON.parse(puls.storage.getItem('types')) : JSON.parse(localStorage.getItem('types'));