Explorar o código

1.5.3优化项完成

347617796@qq.com %!s(int64=4) %!d(string=hai) anos
pai
achega
714e9219c9

+ 13 - 0
package-lock.json

@@ -4660,6 +4660,11 @@
       "integrity": "sha1-P7rwIL/XlIhAcuomsel5HUWmKfA=",
       "dev": true
     },
+    "downloadjs": {
+      "version": "1.4.7",
+      "resolved": "https://registry.npmjs.org/downloadjs/-/downloadjs-1.4.7.tgz",
+      "integrity": "sha1-9p+W+UDg0FU9rCkROYZaPNAQHjw="
+    },
     "duplexer": {
       "version": "0.1.2",
       "resolved": "https://registry.npm.taobao.org/duplexer/download/duplexer-0.1.2.tgz",
@@ -11770,6 +11775,14 @@
       "integrity": "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI=",
       "dev": true
     },
+    "vue-json-excel": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/vue-json-excel/-/vue-json-excel-0.3.0.tgz",
+      "integrity": "sha512-FrSh0tVUpw4K+ilLO8g0Qp52eFJw/hkk3rZPTEKo9qVkJgVfQtZwzj3UWc5ACYxA3jLk9HtjK+f9xKHCN4Kgag==",
+      "requires": {
+        "downloadjs": "^1.4.7"
+      }
+    },
     "vue-loader": {
       "version": "15.9.7",
       "resolved": "https://registry.nlark.com/vue-loader/download/vue-loader-15.9.7.tgz",

+ 1 - 0
package.json

@@ -23,6 +23,7 @@
     "qrcodejs2": "0.0.2",
     "vconsole": "^3.3.4",
     "vue": "^2.6.11",
+    "vue-json-excel": "^0.3.0",
     "vue-router": "^3.2.0",
     "vuex": "^3.4.0"
   },

+ 29 - 11
src/components/applicationIntegrationPopup.vue

@@ -47,6 +47,8 @@
 								:options="rule_item_list"
 								@change="ruleItemChange"
 								:show-all-levels="false"
+								filterable
+								clearable
 								:props="{ children: 'child', label: 'name', value: 'id' }"
 							></el-cascader>
 						</el-form-item>
@@ -370,17 +372,25 @@ export default {
 		// 规则细则变化关闭down
 		ruleItemChange(value) {
 			const item = this.dialogData.items[this.itemIndex];
-			let ruleItemDetail = null;
-			this.flatteningIntegralRules.forEach(element => {
-				if (element.id == value[value.length - 1]) {
-					ruleItemDetail = { ...element };
-				}
-			});
-			item.rule_item_details = ruleItemDetail;
-			item.remark = ruleItemDetail.name;
-			item.rule_id = ruleItemDetail.pid;
-			item.item_id = value[value.length - 1];
-			this.$refs.ruleItem.dropDownVisible = false;
+			if(value.length>0){
+				let ruleItemDetail = null;
+				this.flatteningIntegralRules.forEach(element => {
+					if (element.id == value[value.length - 1]) {
+						ruleItemDetail = { ...element };
+					}
+				});
+				item.rule_item_details = ruleItemDetail;
+				item.remark = ruleItemDetail.name;
+				item.rule_id = ruleItemDetail.pid;
+				item.item_id = value[value.length - 1];
+				this.$refs.ruleItem.dropDownVisible = false;
+			}else{
+				item.rule_id = '';
+				item.item_id = '';
+				item.remark =  '';
+				item.rule_item_list_value = '';
+				item.rule_item_details = { range_type: '' };
+			}	
 		},
 		// 规则分类变化关闭dewn
 		ruleChange(value) {
@@ -442,6 +452,13 @@ export default {
 		},
 		// 加一条
 		addItem() {
+			if(this.dialogData.items.length==10){
+				this.$message({
+					type:"warning",
+					message: '一次只能添加10条申请'
+				});
+				return false
+			}
 			this.dialogData.items.push({
 				rule_switch: true,
 				rule_id: '',
@@ -566,6 +583,7 @@ export default {
 				item.rule_id = '';
 				item.item_id = '';
 				item.rule_item_list_value = '';
+				item.remark =  '';
 				item.rule_item_details = { range_type: '' };
 			} else {
 				item.rule_id = '';

+ 56 - 28
src/components/bonusPointsPopup.vue

@@ -12,17 +12,14 @@
 							</el-col>
 						</el-row>
 					</el-form-item>
-
 					<div v-for="(item, index) in dialogData.items" :key="index" @click.stop="itemIndex = index">
 						<div style="overflow: hidden;">
 							<span style="line-height: 36px;">录入明细({{ index + 1 }})</span>
 							<el-button type="text" class="fr" v-show="index > 0 || dialogData.items.length > 1" @click="delItem(index)">删除</el-button>
 						</div>
-
 						<el-form-item label="指定规则">
 							<el-switch @change="switchChange(index, item.rule_switch)" v-model="item.rule_switch"></el-switch>
 						</el-form-item>
-
 						<el-form-item
 							class="test_cascader_id"
 							label="选择分类"
@@ -34,6 +31,8 @@
 								v-model="item.rule_list_value"
 								ref="ruleCascader"
 								:popper-class="'ruleClass'"
+								filterable
+								clearable
 								:options="rule_list"
 								@change="ruleChange"
 								:props="{ children: 'child', label: 'name', value: 'id', checkStrictly: true }"
@@ -50,6 +49,8 @@
 								v-model="item.rule_item_list_value"
 								ref="ruleItem"
 								:popper-class="'itemClass'"
+								filterable
+								clearable
 								:options="rule_item_list"
 								@change="ruleItemChange"
 								:show-all-levels="false"
@@ -360,10 +361,14 @@ export default {
 			this.itemIndex = index;
 			const item = this.dialogData.items[this.itemIndex];
 			if (!value) {
+				item.remark = '';
 				item.rule_id = '';
 				item.item_id = '';
 				item.rule_item_list_value = '';
 				item.rule_item_details = { range_type: '' };
+				item.max =0;
+				item.min = 0;
+				item.point = '0';
 			} else {
 				item.rule_id = '';
 				item.rule_list_value = '';
@@ -409,36 +414,51 @@ export default {
 
 		// 规则细则变化关闭down
 		ruleItemChange(value) {
-			let ruleItemDetails = null;
-			this.flatteningIntegralRules.forEach(element => {
-				if (element.id == value[value.length - 1]) {
-					ruleItemDetails = { ...element };
-				}
-			});
 			const item = this.dialogData.items[this.itemIndex];
-			const user_info = this.$getUserData();
-			item.rule_item_details = ruleItemDetails;
-			item.remark = ruleItemDetails.name;
-			item.rule_id = ruleItemDetails.pid;
-			item.item_id = value[value.length - 1];
-			item.max = ruleItemDetails.max_point * 1;
-			item.min = ruleItemDetails.min_point * 1;
-			item.point = ruleItemDetails.min_point;
+			if(value.length>0){
+				let ruleItemDetails = null;
+				this.flatteningIntegralRules.forEach(element => {
+					if (element.id == value[value.length - 1]) {
+						ruleItemDetails = { ...element };
+					}
+				});
+				item.rule_item_details = ruleItemDetails;
+				item.remark = ruleItemDetails.name;
+				item.rule_id = ruleItemDetails.pid;
+				item.item_id = value[value.length - 1];
+				item.max = ruleItemDetails.max_point * 1;
+				item.min = ruleItemDetails.min_point * 1;
+				item.point = ruleItemDetails.min_point;
+			}else{
+				item.remark = '';
+				item.rule_id = '';
+				item.item_id = '';
+				item.rule_item_list_value = '';
+				item.rule_item_details = { range_type: '' };
+				item.max =0;
+				item.min = 0;
+				item.point = '0';
+			}
 		},
 		// 规则分类变化关闭dewn
 		ruleChange(value) {
 			const item = this.dialogData.items[this.itemIndex];
-			const user_info = this.$getUserData();
-			user_info.point_config.point_limit.forEach(element => {
-				if (this.ptid == this.integralType) {
-					item.max = element.point * 1;
-					item.min = element.point * -1;
-				}
-			});
-			this.$refs.ruleCascader.forEach(element => {
-				element.dropDownVisible = false;
-			});
-			item.rule_id = value[value.length - 1];
+			if(value.length>0){
+				const user_info = this.$getUserData();
+				user_info.point_config.point_limit.forEach(element => {
+					if (this.ptid == this.integralType) {
+						item.max = element.point * 1;
+						item.min = element.point * -1;
+					}
+				});
+				this.$refs.ruleCascader.forEach(element => {
+					element.dropDownVisible = false;
+				});
+				item.rule_id = value[value.length - 1];
+			}else{
+				item.rule_id = '';
+				item.rule_list_value = '';
+			}
 		},
 		// 递归判断列表,把最后的child设为undefined
 		getTreeData(data) {
@@ -469,6 +489,14 @@ export default {
 		},
 		// 加一条
 		addItem() {
+			if(this.dialogData.items.length==10){
+				this.$message({
+					type:"warning",
+					message: '一次只能添加10条奖扣'
+				});
+				return false
+			}
+			
 			this.dialogData.items.push({
 				rule_switch: true,
 				rule_id: '',

+ 3 - 0
src/main.js

@@ -15,6 +15,9 @@ import NProgress from 'nprogress';
 import 'nprogress/nprogress.css'
 import { getToken, setToken,getUserData,setUserData,getTyps,setTyps,getIsCreator,supremeAuthority,authoritys,getTypsName} from './api/auth';
 // import { createSocket,sendWSPush,sendPing } from './api/websocket'
+import JsonExcel from "vue-json-excel";
+
+Vue.component("downloadExcel", JsonExcel);
 
 // 头像
 import userImage from '@/components/UserImage'

+ 113 - 100
src/views/ranking/dept_rank.vue

@@ -7,13 +7,13 @@
 			<el-form :inline="true">
 				<el-form-item label="时间">
 					<el-col :span="8">
-						<el-select  size="medium" v-model="time_type" placeholder="请选择分类" style="width: 100px;">
+						<el-select size="medium" v-model="time_type" placeholder="请选择分类" style="width: 100px;">
 							<el-option v-for="item in time_types" :key="item.label" :label="item.label" :value="item.value"></el-option>
 						</el-select>
 					</el-col>
 					<el-col :span="16">
 						<el-date-picker
-						   size="medium"
+							size="medium"
 							v-show="time_type == '2'"
 							v-model="export_from.year"
 							class="date-picker-width"
@@ -22,7 +22,7 @@
 							placeholder="选择年份排名"
 						></el-date-picker>
 						<el-date-picker
-						     size="medium"
+							size="medium"
 							v-show="time_type == '1' || time_type == '月份'"
 							v-model="export_from.month"
 							class="date-picker-width"
@@ -35,11 +35,11 @@
 				</el-form-item>
 				<el-form-item label="部门">
 					<el-cascader
-					    size="medium"
+						size="medium"
 						class="date-picker-width"
 						v-model="dept_name"
 						:options="dept_tree"
-						:props="{ checkStrictly: true,value:'id',label:'name',children:'_child'}"
+						:props="{ checkStrictly: true, value: 'id', label: 'name', children: '_child' }"
 						ref="dept"
 						clearable
 						filterable
@@ -58,39 +58,39 @@
 					  ></el-cascader>-->
 				</el-form-item>
 				<el-form-item label="谁不参与排名">
-					<el-select v-model="formData.exclusion"  size="medium"  multiple filterable collapse-tags placeholder="请选择员工">
+					<el-select v-model="formData.exclusion" size="medium" multiple filterable collapse-tags 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="规则分类">
 					<el-cascader
 					   size="medium"
 						class="date-picker-width"
 						v-model="rule_id"
 						:options="rule_trees"
-						:props="props"
+						:props="props2"
 						ref="rule"
 						clearable
 						collapse-tags
 						placeholder="请选择规则分类"
 					></el-cascader>
-				</el-form-item> -->
-			  <el-form-item label="积分分类">
-				  <el-select class="date-picker-width" size="medium" v-model="formData.pt_id" clearable placeholder="请选择积分分类">
-				  	<el-option v-for="item in point_types" :key="item.name" :label="item.name" :value="item.id"></el-option>
-				  </el-select>
-			  </el-form-item>
+				</el-form-item>
+				<el-form-item label="积分分类">
+					<el-select class="date-picker-width" size="medium" v-model="formData.pt_id" clearable placeholder="请选择积分分类">
+						<el-option v-for="item in point_types" :key="item.name" :label="item.name" :value="item.id"></el-option>
+					</el-select>
+				</el-form-item>
 				<el-form-item label="人员">
-					<el-select  size="medium" v-model="formData.position" style="width:150px" placeholder="请选择">
+					<el-select size="medium" v-model="formData.position" style="width:150px" placeholder="请选择">
 						<el-option v-for="item in positions" :key="item.id" :label="item.name" :value="item.age"></el-option>
 					</el-select>
 				</el-form-item>
 				<el-form-item>
 					<el-checkbox v-model="sort" size="medium" label="排名由低到高" border></el-checkbox>
-					<el-button type="primary"  size="medium" @click="selectBtn" style="margin-left:20px">查询</el-button>
+					<el-button type="primary" size="medium" @click="selectBtn" style="margin-left:20px">查询</el-button>
 				</el-form-item>
 				<el-form-item>
-					<el-button type="primary"  size="medium" plain @click="dialogVisible = true">导出排名</el-button>
+					<el-button type="primary" size="medium" plain @click="dialogVisible = true">导出排名</el-button>
 					<!-- <el-button type="primary"  size="medium" plain @click="byRanking('byRankingData')">轮播排名</el-button> -->
 				</el-form-item>
 			</el-form>
@@ -105,10 +105,10 @@
 				</el-table-column>
 				<el-table-column label="姓名" align="left">
 					<template slot-scope="scope">
-							<div class="flex-box">
-								<userImage	:user_name="scope.row.employee_name" :img_url="scope.row.employee_img_url" width="50px" height="50px"></userImage>
-								<span style="line-height: 50px; padding-left: 10px;">{{ scope.row.employee_name }}</span>
-							</div>
+						<div class="flex-box">
+							<userImage :user_name="scope.row.employee_name" :img_url="scope.row.employee_img_url" width="50px" height="50px"></userImage>
+							<span style="line-height: 50px; padding-left: 10px;">{{ scope.row.employee_name }}</span>
+						</div>
 					</template>
 				</el-table-column>
 				<el-table-column :label="labelName" align="left" prop="point"></el-table-column>
@@ -140,7 +140,7 @@
 						<el-date-picker
 							v-model="Dc_Data.value1"
 							type="daterange"
-							 size="medium"
+							size="medium"
 							value-format="yyyy-MM-dd"
 							format="yyyy-MM-dd"
 							range-separator="至"
@@ -150,7 +150,7 @@
 					</el-form-item>
 
 					<el-form-item label="人员" style="margin-left:30px">
-						<el-select  size="medium" v-model="Dc_Data.DC_position" style="width:150px" placeholder="请选择">
+						<el-select size="medium" v-model="Dc_Data.DC_position" style="width:150px" placeholder="请选择">
 							<el-option v-for="item in positions" :key="item.id" :label="item.name" :value="item.age"></el-option>
 						</el-select>
 					</el-form-item>
@@ -160,7 +160,7 @@
 						class="date-picker-width cascader_bm"
 						v-model="Dc_Data.dept_name"
 						:options="dept_tree"
-						:props="{ checkStrictly: true,value:'id',label:'name',children:'_child'}"
+						:props="{ checkStrictly: true, value: 'id', label: 'name', children: '_child' }"
 						ref="dept2"
 						size="medium"
 						clearable
@@ -171,11 +171,11 @@
 				<el-form-item label="规则分类" style="margin-left:20px">
 					<el-cascader
 						class="date-picker-width"
-            			@change="ruleInquiredialog"
+						@change="ruleInquiredialog"
 						v-model="rule_ids"
 						:options="rule_trees"
 						:props="props"
-						 size="medium"
+						size="medium"
 						ref="derive"
 						clearable
 						collapse-tags
@@ -184,8 +184,8 @@
 				</el-form-item>
 			</el-form>
 			<span slot="footer" class="dialog-footer">
-				<el-button @click="dialogVisible = false"  size="medium">取 消</el-button>
-				<el-button type="primary" @click="exportExcel"  size="medium">导 出</el-button>
+				<el-button @click="dialogVisible = false" size="medium">取 消</el-button>
+				<el-button type="primary" @click="exportExcel" size="medium">导 出</el-button>
 			</span>
 		</el-dialog>
 
@@ -194,15 +194,22 @@
 			<div>
 				<el-form :inline="true" ref="byRankingData" :model="byRankingData" :rules="byRankingDataRules" label-width="90px">
 					<el-form-item label="月份" prop="month">
-						<el-date-picker v-model="byRankingData.month"  size="medium" class="date-picker-width" type="month" value-format="yyyy-MM" placeholder="选择月份排名"></el-date-picker>
+						<el-date-picker
+							v-model="byRankingData.month"
+							size="medium"
+							class="date-picker-width"
+							type="month"
+							value-format="yyyy-MM"
+							placeholder="选择月份排名"
+						></el-date-picker>
 					</el-form-item>
 					<el-form-item label="选择部门" prop="dept_id">
 						<el-cascader
-						    size="medium"
+							size="medium"
 							class="date-picker-width"
 							v-model="byRankingData.dept_id"
 							:options="dept_tree"
-							:props="{ checkStrictly: true,value:'obj',label:'name',children:'_child'}"
+							:props="{ checkStrictly: true, value: 'obj', label: 'name', children: '_child' }"
 							ref="dept1"
 							clearable
 							filterable
@@ -210,7 +217,7 @@
 						></el-cascader>
 					</el-form-item>
 					<el-form-item label="人员范围" prop="position">
-						<el-radio-group  size="medium" v-model="byRankingData.position">
+						<el-radio-group size="medium" v-model="byRankingData.position">
 							<el-radio label="all">管理者和员工</el-radio>
 							<el-radio label="manager">只看管理者</el-radio>
 							<el-radio label="employee">只看员工</el-radio>
@@ -219,8 +226,8 @@
 				</el-form>
 			</div>
 			<span slot="footer">
-				<el-button @click="byRankingShow = false"  size="medium">取 消</el-button>
-				<el-button type="primary" @click="swiperPage('byRankingData')"  size="medium">开始轮播</el-button>
+				<el-button @click="byRankingShow = false" size="medium">取 消</el-button>
+				<el-button type="primary" @click="swiperPage('byRankingData')" size="medium">开始轮播</el-button>
 			</span>
 		</el-dialog>
 	</div>
@@ -231,7 +238,7 @@ import season from '@/components/season';
 export default {
 	data() {
 		return {
-			rule_ids:null,
+			rule_ids: null,
 			Dc_Data: {
 				//导出数据
 				value1: '', //时间
@@ -250,7 +257,7 @@ export default {
 				time_type: 1,
 				exclusion: [],
 				page: 1,
-				rule_id: [],
+				rule_id: '',
 				page_size: 10,
 				position: 0 //部门多选删除这个
 			},
@@ -258,11 +265,12 @@ export default {
 			rule_trees: null,
 			rule_id: null,
 			list: null,
-			point_types:[],
+			point_types: [],
 			point_type: [],
 			sort: false,
 			time_types: [{ label: '月份', value: '1' }, { label: '年份', value: '2' }, { label: '季度', value: '3' }],
 			props: { value: 'id', label: 'name', children: 'child', multiple: true },
+			props2: { value: 'id', label: 'name', children: 'child'},
 			time_type: '月份',
 			export_from: {
 				year: '',
@@ -284,7 +292,7 @@ export default {
 				dept_id: [{ required: true, message: '请选择部门', trigger: 'change' }],
 				position: [{ required: true, message: '请选择人员范围', trigger: 'change' }]
 			},
-			labelName:'B分',
+			labelName: 'B分'
 		};
 	},
 	watch: {
@@ -319,46 +327,48 @@ export default {
 			this.$refs.dept2.dropDownVisible = false;
 		},
 		rule_id(val) {
-			if (val.length !== 0) {
-				this.formData.rule_id = [];
-				val.forEach((element, index) => {
-					this.formData.rule_id.push(element[element.length - 1]);
-				});
-			} else {
-				this.formData.rule_id !== undefined ? delete this.formData.rule_id : '';
+			if(val.length==0){
+				this.formData.rule_id='';
+				return false
+			}
+			
+			if(val.length==1){
+				this.formData.rule_id=JSON.stringify(val)
+			}else{
+				this.formData.rule_id=JSON.stringify([val[val.length-1]]);
 			}
 		}
 	},
 	components: { season },
 	methods: {
-		ruleInquiredialog(){
-			this.ruleUtif("derive")
+		ruleInquiredialog() {
+			this.ruleUtif('derive');
 		},
-		ruleUtif(rule){
-			let ruleList = this.$refs[rule].getCheckedNodes()
-			let ruleId = []
-			ruleList.forEach(item=>{
-				ruleId.push(item.value)
-			})
-			if(rule == 'ruleinquire'){
-				this.formData.rule_id = ruleId
-			}else{
-				this.Dc_Data.rule_id = ruleId
+		ruleUtif(rule) {
+			let ruleList = this.$refs[rule].getCheckedNodes();
+			let ruleId = [];
+			ruleList.forEach(item => {
+				ruleId.push(item.value);
+			});
+			if (rule == 'ruleinquire') {
+				this.formData.rule_id = ruleId;
+			} else {
+				this.Dc_Data.rule_id = ruleId;
 			}
-			this.$nextTick(()=>{
-				if(this.$refs[rule].presentTags[1]){
-				this.$refs[rule].presentTags[1].text = '+ '+(ruleId.length-1).toString()
-				}else{
-				if(ruleId.length>1){
-					let list = {
-					closable: false,
-					key: -1,
-					text: '+ '+(ruleId.length-1).toString()
+			this.$nextTick(() => {
+				if (this.$refs[rule].presentTags[1]) {
+					this.$refs[rule].presentTags[1].text = '+ ' + (ruleId.length - 1).toString();
+				} else {
+					if (ruleId.length > 1) {
+						let list = {
+							closable: false,
+							key: -1,
+							text: '+ ' + (ruleId.length - 1).toString()
+						};
+						this.$refs[rule].presentTags[1] = list;
 					}
-					this.$refs[rule].presentTags[1] = list
 				}
-				}
-			})
+			});
 		},
 		// 轮播页面跳转
 		swiperPage(formName) {
@@ -371,7 +381,7 @@ export default {
 							type: '2',
 							position: this.byRankingData.position,
 							dept_id: this.byRankingData.dept_id[0].id,
-							dept_name:this.byRankingData.dept_id[0].name,
+							dept_name: this.byRankingData.dept_id[0].name,
 							pt_id: 3
 						}
 					});
@@ -381,12 +391,12 @@ export default {
 		},
 		// 轮播排名弹窗
 		byRanking() {
-			this.byRankingData={
+			(this.byRankingData = {
 				month: '',
 				dept_id: '',
 				position: 'all'
-			},
-			this.byRankingShow = true;	
+			}),
+				(this.byRankingShow = true);
 		},
 		// 提示信息
 		tips_close() {
@@ -415,10 +425,11 @@ export default {
 				default:
 					break;
 			}
-			
+
 			let data = JSON.parse(JSON.stringify(this.formData));
-			var employee_ids =data.exclusion.join(',');
-			data.exclusion=employee_ids;
+			console.log(data);
+			var employee_ids = data.exclusion.join(',');
+			data.exclusion = employee_ids;
 			data.page = 1;
 			data.page_size = 10;
 			this.$nextTick(() => {
@@ -460,25 +471,26 @@ export default {
 			let self = this;
 			self.loading = true;
 			data ? '' : (data = this.formData);
-			
+
 			data.position = data.position == 'manager' ? 'manager' : data.position == 'employee' ? 'employee' : 'all';
-			self.$axios('get','/api/integral/statistics/ranking',data,'v2').then(res => {
-				this.labelName=this.formData.pt_id==2? 'A分':'B分';
-				if (res.data.code == 1) {
-					self.list = res.data.data.list;
-					self.total = res.data.data.total;
-				} else {
-					self.$message.error(res.data.data.msg);
-				}
-			})
-			.finally(() => {
-				self.loading = false;
-			});
+			self.$axios('get', '/api/integral/statistics/ranking', data, 'v2')
+				.then(res => {
+					this.labelName = this.formData.pt_id == 2 ? 'A分' : 'B分';
+					if (res.data.code == 1) {
+						self.list = res.data.data.list;
+						self.total = res.data.data.total;
+					} else {
+						self.$message.error(res.data.data.msg);
+					}
+				})
+				.finally(() => {
+					self.loading = false;
+				});
 		},
 		// 获取积分规则
 		get_rule_tree() {
-			this.$axios('get','/api/integral/rule/trees',{ cycle_type: '1'}).then(res => {
-				this.rule_trees =this.getRuleTreeData(res.data.data.rule_tree);
+			this.$axios('get', '/api/integral/rule/trees', { cycle_type: '1' }).then(res => {
+				this.rule_trees = this.getRuleTreeData(res.data.data.rule_tree);
 			});
 		},
 		// 规则递归 children
@@ -497,7 +509,7 @@ export default {
 		// 递归判断列表,把最后的children设为undefined
 		getTreeData(data) {
 			for (var i = 0; i < data.length; i++) {
-				data[i].obj={id:data[i].id,name:data[i].name};
+				data[i].obj = { id: data[i].id, name: data[i].name };
 				if (data[i]._child.length < 1) {
 					// children若为空数组,则将children设为undefined
 					data[i]._child = undefined;
@@ -510,18 +522,19 @@ export default {
 		},
 		getEmployeeList() {
 			let self = this;
-			self.$axios('get','/api/employee/list',{ dept_id: self.formData.dept_id }).then(res => {
+			self.$axios('get', '/api/employee/list', { dept_id: self.formData.dept_id }).then(res => {
 				if (res.data.code == 1) {
 					this.employee_map = res.data.data.list;
 				} else {
 					self.$message.error(res.data.data.msg);
 				}
-			})
+			});
 		},
 
 		exportExcel() {
 			//人员
-			this.Dc_Data.DC_position =this.Dc_Data.DC_position == 'manager' ? 'manager' : this.Dc_Data.DC_position == 'employee' ? 'employee' : this.Dc_Data.DC_position == '全部' ? 'all' : 'all';
+			this.Dc_Data.DC_position =
+				this.Dc_Data.DC_position == 'manager' ? 'manager' : this.Dc_Data.DC_position == 'employee' ? 'employee' : this.Dc_Data.DC_position == '全部' ? 'all' : 'all';
 			//部门
 			let dept_name;
 			for (let i in this.Dc_Data.dept_name) {
@@ -546,18 +559,18 @@ export default {
 			if (this.Dc_Data.rule_id.length > 0) {
 				data += '&rule_id=' + this.Dc_Data.rule_id;
 			}
-			window.open(process.env.VUE_APP_BASE_API + 'api/download/ranking/v2?pt_id='+this.formData.pt_id+'&employee_id='+this.$getUserData().id+ data, '_blank');
+			window.open(process.env.VUE_APP_BASE_API + 'api/download/ranking/v2?pt_id=' + this.formData.pt_id + '&employee_id=' + this.$getUserData().id + data, '_blank');
 			this.dialogVisible = false;
 		},
 		//获取部门
 		getDepartment() {
-			this.$axios('get','/api/department/tree').then(res => {
-				this.dept_tree =this.getTreeData(res.data.data.list);
+			this.$axios('get', '/api/department/tree').then(res => {
+				this.dept_tree = this.getTreeData(res.data.data.list);
 			});
-		},
+		}
 	},
 	mounted() {
-		this.point_types=this.$getTyps();
+		this.point_types = this.$getTyps();
 		this.tips_show = JSON.parse(localStorage.getItem('dept_rank_tips')) ? false : true;
 		this.getDepartment();
 		this.getEmployeeList();

+ 37 - 7
src/views/set/framework.vue

@@ -42,11 +42,17 @@
 				</div>
 				<div class="terr-right border-right flex-1">
 					<div class="margin-bottom">
-						<el-button @click="participation()" :loading="enable_loading" size="medium" type="primary">批量启用积分管理</el-button>
-						<el-button @click="forbidden()" :loading="enable_loading" size="medium" type="danger" style="margin-right: 10px;">批量禁用积分管理</el-button>
-						<el-input placeholder="输入同事姓名" size="medium" style="width: 230px;" v-model="keywords" clearable>
-							<!-- <el-button slot="append" icon="el-icon-search" @click="getEmployee()"></el-button> -->
-						</el-input>
+						<el-button @click="participation()" :loading="enable_loading" size="medium" type="primary">批量启用</el-button>
+						<el-button @click="forbidden()" :loading="enable_loading" size="medium" type="danger" style="margin-right: 10px;">批量禁用</el-button>
+						<el-select v-model="status"  size="medium" style="margin-right: 10px;width: 150px;">
+						  <el-option
+						    v-for="item in options"
+						    :key="item.value"
+						    :label="item.label"
+						    :value="item.value">
+						  </el-option>
+						</el-select>
+						<el-input placeholder="输入同事姓名" size="medium" style="width: 230px;" v-model="keywords" clearable></el-input>
 					</div>
 					<el-table :data="userList" @selection-change="handleSelectionChange" v-loading="tableToading">
 						<el-table-column type="selection" width="50" :selectable="selectable"></el-table-column>
@@ -184,6 +190,17 @@ export default {
 			radioLi: [{ id: '1', name: '参与排名', kam: '在排名中展示此人' }, { id: '0', name: '不参与排名', kam: '排名不展示此人(自定义排名除外)' }],
 			userInfo: this.$getUserData(),
 			copyIds:'',
+			options: [{
+			  value: '-1',
+			  label: '全部'
+			}, {
+			  value: '1',
+			  label: '已开启'
+			}, {
+			  value: '0',
+			  label: '已禁用'
+			}],
+			status: '-1'
 		};
 	},
 	components: {
@@ -199,6 +216,10 @@ export default {
 		},
 		dept_id(val) {
 			this.getEmployee();
+		},
+		status(){
+			 this.page = 1;
+			 this.getEmployee();
 		}
 	},
 	created() {
@@ -394,8 +415,17 @@ export default {
 		//获取员工
 		getEmployee() {
 			this.tableToading = true;
-			this.$axios('get', '/api/employee/index', { dept_id: this.dept_id, keywords: this.keywords, page: this.page, page_size: this.perPage })
-				.then(res => {
+			let data={
+				dept_id: this.dept_id,
+				keywords: this.keywords,
+				page: this.page,
+				page_size:this.perPage,
+			}
+			let is_official=this.status=='-1'? '':this.status;
+			if(is_official){
+				data.is_official=is_official;
+			}
+			this.$axios('get', '/api/employee/index', data).then(res => {
 					this.total = res.data.data.pageInfo.count;
 					this.userList = res.data.data.list;
 					var visible = localStorage.getItem('visible');

+ 139 - 80
src/views/set/initialPoint.vue

@@ -1,87 +1,146 @@
 <template>
-  <div v-loading="loading">
-    <workpoints :initia_arr="initia_arr" :initia_head="initia_head" @initia="initia" />
-  </div>
+	<div v-loading="loading">
+		<workpoints :initia_arr="initia_arr" :initia_head="initia_head" @initia="initia" />
+		<!-- 	<download-excel
+	    :fields="exportDataStandard"
+	    :data="exportData"
+	    type="xlsx"
+	    :name="exportName"
+	    :header="exportHeader"
+	    :footer="exportFooter"
+	    :defaultValue="exportDefaultValue"
+	    :fetch="createExportData"
+	    :before-generate="startDownload"
+	    :before-finish="finishDownload"
+	    worksheet="导出信息"
+	>
+	  <el-button icon="el-icon-download">导出</el-button>
+	</download-excel> -->
+	</div>
 </template>
 <script>
-import workpoints from "@/components/publics/workpoints";
+import workpoints from '@/components/publics/workpoints';
 export default {
-  data() {
-    return {
-      loading: false,
-      initia_head: {
-        initial_suername: "初始分",
-        initial_suertext: "基础分和工龄分均为B分",
-        initial_left: "85px",
-        initial_width: "83px",
-      },
-      initia_arr: [
-        {
-          initialName: "基础分",
-          initia_mark: true,
-          initia_input: {
-            age: "",
-          },
-          initial_text:
-            "基础分是为了让积分保持正激励的作用,减少出现0分<br/>以下的情况,更好地激励员工挣分;<br/>设置分值后,系统将为全部员工自动加上此项基础分;<br/>此项基础分仅加一次,计入每个员工的累积总分",
-        },
-        {
-          initialName: "工龄分",
-          initia_mark: true,
-          initia_input: {
-            age: "",
-          },
-          initial_text:
-            "工龄分是为了更好的认可老员工;<br/>首次加分=员工已在职的月份*工龄分,未满一个月的不<br/>加分;后续加分按设置的工龄分值每月自动累加",
-        },
-      ],
-      obj: [
-        {
-          base_point: "",
-          service_point: "",
-        },
-      ],
-    };
-  },
-  components: {
-    workpoints,
-  },
-  created() {},
-  mounted() {
-    this.cheak_ax();
-  },
-  methods: {
-    initia(ok) {
-      this.loading = true;
-      this.obj.base_point = +ok[0].sj;
-      this.obj.service_point = +ok[1].sj;
-      this.$axios('post',"/api/integral/site/config", this.obj).then((res) => {
-          if (res.data.code == 1) {
-            this.$message({
-              message: res.data.msg,
-              type: "success",
-            });
-          }
-        }).finally(err=>{
-			this.loading = false;
-		});
-    },
-    cheak_ax() {
-      this.loading = true;
-      this.$axios('get',"/api/integral/site/config").then((res) => {
-        var arr = [];
-        for (let i in res.data.data) {
-          arr.push(res.data.data[i]);
-        }
-        this.initia_arr[0].initia_input.age = Math.abs(arr[0]);
-        this.initia_arr[1].initia_input.age = Math.abs(arr[3]);
-      }).finally(err=>{
-			this.loading = false;
-	  });
-    },
-  },
+	data() {
+		return {
+			exportDataStandard: {
+				名称: 'name',
+				性别: 'sex',
+				地区: {
+					field: 'phone',
+					callback: value => {
+						return `他的电话是:${value}`;
+					}
+				}
+			},
+			exportData: [
+				{ name: '甲', sex: '女', phone: 15521103211 },
+				{ name: '乙', sex: '男', phone: 15521103222 },
+				{ name: '丙', sex: '女', phone: 15521103233 },
+				{ area: '北京市朝阳区' },
+				{ name: '丁', sex: '男', phone: 15521103233 },
+				{ name: '丁', sex: '男', phone: 15521103233 }
+			],
+			exportName: '导出数据',
+			exportHeader: ['用户信息页头1', '用户信息页头2'],
+			exportFooter: ['用户的信息页脚1', '用户的信息页脚2'],
+			exportDefaultValue: '这一行这一列没有数据',
+
+			loading: false,
+			initia_head: {
+				initial_suername: '初始分',
+				initial_suertext: '基础分和工龄分均为B分',
+				initial_left: '85px',
+				initial_width: '83px'
+			},
+			initia_arr: [
+				{
+					initialName: '基础分',
+					initia_mark: true,
+					initia_input: {
+						age: ''
+					},
+					initial_text:
+						'基础分是为了让积分保持正激励的作用,减少出现0分<br/>以下的情况,更好地激励员工挣分;<br/>设置分值后,系统将为全部员工自动加上此项基础分;<br/>此项基础分仅加一次,计入每个员工的累积总分'
+				},
+				{
+					initialName: '工龄分',
+					initia_mark: true,
+					initia_input: {
+						age: ''
+					},
+					initial_text: '工龄分是为了更好的认可老员工;<br/>首次加分=员工已在职的月份*工龄分,未满一个月的不<br/>加分;后续加分按设置的工龄分值每月自动累加'
+				}
+			],
+			obj: [
+				{
+					base_point: '',
+					service_point: ''
+				}
+			]
+		};
+	},
+	components: {
+		workpoints
+	},
+	created() {},
+	mounted() {
+		this.cheak_ax();
+	},
+	methods: {
+		createExportData() {
+			// 点击导出按钮之后,开始导出数据之前的执行函数,返回值为需要下载的数据
+			// TODO:构造需要下载的数据返回
+			return [
+				{ name: '甲', sex: '女', phone: 15521103211 },
+				{ name: '乙', sex: '男', phone: 15521103222 },
+				{ name: '丙', sex: '女', phone: 15521103233 },
+				{ area: '北京市朝阳区' },
+				{ name: '丁', sex: '男', phone: 15521103233 },
+				{ name: '丁', sex: '男', phone: 15521103233 }
+			];
+		},
+		startDownload() {
+			console.log('数据开始');
+		},
+		finishDownload() {
+			console.log('数据下载完成');
+		},
+
+		initia(ok) {
+			this.loading = true;
+			this.obj.base_point = +ok[0].sj;
+			this.obj.service_point = +ok[1].sj;
+			this.$axios('post', '/api/integral/site/config', this.obj)
+				.then(res => {
+					if (res.data.code == 1) {
+						this.$message({
+							message: res.data.msg,
+							type: 'success'
+						});
+					}
+				})
+				.finally(err => {
+					this.loading = false;
+				});
+		},
+		cheak_ax() {
+			this.loading = true;
+			this.$axios('get', '/api/integral/site/config')
+				.then(res => {
+					var arr = [];
+					for (let i in res.data.data) {
+						arr.push(res.data.data[i]);
+					}
+					this.initia_arr[0].initia_input.age = Math.abs(arr[0]);
+					this.initia_arr[1].initia_input.age = Math.abs(arr[3]);
+				})
+				.finally(err => {
+					this.loading = false;
+				});
+		}
+	}
 };
 </script>
 
-<style  scoped lang="scss">
-</style>
+<style scoped lang="scss"></style>

+ 74 - 18
src/views/set/log.vue

@@ -10,6 +10,9 @@
 					<br />
 					3、日志支持每月、每周、每次汇报,可自行根据需要设置“日志积分规则
 				</div>
+				<div class="flex-box-end" style="margin-top: 20px;">
+					<el-button size="small" plain @click="add()">添加日志模板</el-button>
+				</div>
 			</div>
 			<el-table ref="multipleTable" :data="list" tooltip-effect="dark" align="center" v-loading="loading">
 				<el-table-column label="序号" align="left" type="index"></el-table-column>
@@ -27,22 +30,28 @@
 				</el-table-column>
 				<el-table-column label="操作">
 					<template slot-scope="scope">
-						<div @click.stop="openSet(scope.row)"><span class="lookQrcode">设置</span></div>
+						<div class="flex-box-ce">
+							<div @click.stop="openSet(scope.row)" style="margin-right: 10px;"><span class="lookQrcode">编辑</span></div>
+							<div @click.stop="deleteSet(scope.row)"><span class="lookQrcode red">删除</span></div>
+						</div>
 					</template>
 				</el-table-column>
 				<template slot="empty">
 					<noData></noData>
 				</template>
 			</el-table>
-
+			
 		</div>
 		<el-dialog title="设置" :visible.sync="dialogVisible" top="25vh" width="520px" class="dialog">
 			<el-alert class="el-dialog__body" title="日志名称必须与钉钉日志模板名称一致,否则设置无效,不会产生积分" type="warning" :closable="false" show-icon></el-alert>
 			<el-form label-width="110px" :model="selectItem" ref="setForm" class="form">
 				<el-form-item style="margin-bottom: 0px;" label="日志名称">
 					<div class="flex-box flex-v-ce">
-						<div class="font-flex-word name">{{ selectItem.name }}</div>
-						<div class="blue" @click="showName(selectItem.name)">修改</div>
+						<el-input v-if="isAdd" style="width: 200px;" v-model="selectItem.name" placeholder="请输入日志名称"></el-input>
+						<template v-else>
+							<div class="font-flex-word name">{{ selectItem.name }}</div>
+							<div class="blue" @click="showName(selectItem.name)">修改</div>
+						</template>
 					</div>
 					<el-dialog title="设置名称" :visible.sync="isShowName" top="25vh" width="520px" append-to-body>
 						<div style="text-align: center;">
@@ -53,9 +62,7 @@
 								:closable="false"
 								show-icon
 							></el-alert>
-							<!-- <el-popover placement="top-start" title="温馨提示" width="200" trigger="hover" content="日志名称必须与钉钉预设模板名称一致,否则可能会无法同步钉钉的日志记录"> -->
-							<el-input style="width: 200px;" v-model="nameVal" slot="reference"></el-input>
-							<!-- </el-popover> -->
+							<el-input style="width: 200px;" v-model="nameVal" placeholder="请输入日志名称"></el-input>
 							<div class="flex-box-end" style="margin-top: 20px;">
 								<el-button @click="isShowName = false">取消</el-button>
 								<el-button type="primary" @click="submitName()">确定</el-button>
@@ -114,10 +121,10 @@ export default {
 			list: [],
 			dialogVisible: false,
 			selectItem: {
-				config: { point: '', upper_limit: '' },
-				enable: '',
+				config: { point: 0, upper_limit: 0 },
+				enable: true,
 				id: '',
-				interval: '',
+				interval: 1,
 				name: '',
 				site_id: '',
 				type: ''
@@ -138,12 +145,50 @@ export default {
 			],
 			isShowName: false,
 			nameVal: '',
+			
+			// 添加模板
+			isAdd:false,
 		};
 	},
+	watch:{
+		dialogVisible(val){
+			if(!val){
+				this.isAdd=false;
+				this.selectItem={
+					config: { point: 0, upper_limit: 0 },
+					enable: true,
+					id: '',
+					interval: 1,
+					name: '',
+					site_id: '',
+					type: ''
+				};
+			}
+		}
+	},
 	mounted() {
 		this.getList();
 	},
 	methods: {
+		deleteSet(e){
+			this.$confirm('确定要删除该日志模板吗?', '提示', {
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type: 'warning'
+			}).then(() => {
+				this.$axios('DELETE', '/api/integral/report/templates', { id: e.id })
+					.then(res => {
+						if (res.data.code == 1) {
+							this.$message.success("删除成功");
+							this.getList();
+						}
+					})
+			});
+		},
+		add(){
+			this.isAdd=true;
+			this.dialogVisible=true;
+		},
 		// 最大值不能大于100
 		checkCountry(e, id) {
 			//解决v-model与oninput同时使用失效问题
@@ -153,7 +198,7 @@ export default {
 			value = value.replace(/[^\d]/g, '');
 			if (value > 999) {
 				id == 'input1' ? (this.selectItem.config.point = '') : (this.selectItem.config.upper_limit = '');
-				this.$message.error('不能大于999');
+				this.$message.warning('不能大于999');
 				return false;
 			}
 			dom.value = value; //输入框赋值
@@ -172,15 +217,22 @@ export default {
 			this.isShowName = true;
 		},
 		submit(fromName) {
-			if (this.selectItem.config.point == 0) {
-				this.$message.error('汇报奖励不能为0');
-				return false;
+			if(this.isAdd){
+				if (!this.selectItem.name) {
+					this.$message.error('请输入日志名称');
+					return false;
+				}
 			}
-			if (this.selectItem.config.upper_limit == 0) {
-				this.$message.error('提交超过次数不能为0');
-				return false;
+			if(this.selectItem.enable){
+				if (this.selectItem.config.point == 0) {
+					this.$message.error('汇报奖励不能为0');
+					return false;
+				}
+				if (this.selectItem.config.upper_limit == 0) {
+					this.$message.error('提交超过次数不能为0');
+					return false;
+				}
 			}
-
 			this.$refs[fromName].validate(valid => {
 				if (valid) {
 					this.setLoading = true;
@@ -189,6 +241,9 @@ export default {
 					data.enable = data.enable ? 1 : 0;
 					data.point = data.config.point;
 					data.upper_limit = data.config.upper_limit;
+					if(this.isAdd){
+						data.type='other'
+					}
 					this.$axios('post', '/api/integral/report/templates', data)
 						.then(res => {
 							if (res.data.code == 1) {
@@ -204,6 +259,7 @@ export default {
 			});
 		},
 		openSet(item) {
+			console.log(item);
 			var jsonItem = JSON.stringify(item);
 			this.selectItem = JSON.parse(jsonItem);
 			this.selectItem.enable = this.selectItem.enable == 0 ? false : true;

+ 5 - 6
src/views/set/rule.vue

@@ -839,22 +839,21 @@ export default {
 
 		getData(is) {
 			this.rule_loading = true;
-			var that = this;
 			this.$axios('get', '/api/integral/rule/trees', { cycle_type: 1 , keyword:this.keyword})
 				.then(res => {
 					var item_list = res.data.data.item_list || [];
 					var list = [];
 					for (let i in item_list) {
 						for (let k in item_list[i]) {
-							item_list[i][k].pt_Obj = that.$getTyps(item_list[i][k].pt_id);
+							item_list[i][k].pt_Obj = this.$getTyps(item_list[i][k].pt_id);
 							list.push(item_list[i][k]);
 						}
 					}
-					that.rule_tree = res.data.data.rule_tree || [];
-					that.item_list = list;
-					that.all_item_list = list;
+					this.rule_tree = res.data.data.rule_tree || [];
+					this.item_list = list;
+					this.all_item_list = list;
 					if (is) {
-						that.handleNodeClick(that.selectItem);
+						this.handleNodeClick(this.selectItem);
 					} else {
 						this.selectItem = { name: '积分规则' }; //选择的分类
 					}

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

@@ -796,7 +796,6 @@ export default {
 			this.table_loading = true;
 			this.rule_trees_load = true;
 			this.$axios('get','/api/integral/rule/trees', {cycle_type: '2'}).then(res => {
-					// this.is_attendance = this.rules_detail_form.is_attendance == '0' ? false : true;
 					var	rule_list = res.data.data.rule_tree||[];
 					var	item_list = res.data.data.item_list||[];
 					var itemListAll=[];