哥哥玩剑魂呢 3 年之前
父节点
当前提交
60beb323d6

+ 1 - 0
src/index.vue

@@ -367,6 +367,7 @@ export default {
 	height: calc(100vh - 60px);
 	overflow-y: scroll;
 	padding: 10px;
+	min-width: 1000px;
 }
 .el-main::-webkit-scrollbar {
 	width: 3px;

+ 11 - 0
src/router/index.js

@@ -186,6 +186,17 @@ const routes = [{
 					jurisdiction: ['dept_manager', 'employee']
 				}
 			},
+			{
+				path: '/balanceA',
+				name: 'A分余额',
+				component: () => import( /* webpackChunkName: "balanceA" */
+					'@/views/ranking/balanceA'),
+				meta: {
+					icon: 'icon-shezhi_jichushezhi',
+					groupCode: 'ranking',
+					jurisdiction: ['dept_manager', 'employee']
+				}
+			},
 			{
 				path: '/framework',
 				name: '组织架构',

+ 291 - 0
src/views/ranking/balanceA.vue

@@ -0,0 +1,291 @@
+<template>
+  <div>
+    <el-alert class="diy-tip" @close="tips_close" v-show="tips_show" type="success" description>
+      <p>A分余额在线下兑换/使用过后,由管理员手动结算清零;</p>
+      <p>清零操作为全员批量清除,请谨慎操作!</p>
+      <p>每次清零将清空指定月份之前的余额(不含指定月份),不可清空未结束月份的余额:</p>
+      <p>例如当前是2020年7月8号,指定选择2020年7月份,可清空2020年7月1号之前所有余额,不清除7月1-8号的余额。</p>
+    </el-alert>
+
+    <div class="box boxMinHeight">
+      <el-tabs v-model="active">
+        <el-tab-pane label="A分余额" name="balanceA"></el-tab-pane>
+        <el-tab-pane label="清空记录" name="clearLog"></el-tab-pane>
+      </el-tabs>
+
+      <el-form :inline="true" v-if="active == 'balanceA'">
+        <el-form-item label="部门">
+          <el-cascader class="date-picker-width" v-model="dept_name" :options="dept_tree" ref="dept" clearable filterable change-on-select placeholder="全公司"></el-cascader>
+        </el-form-item>
+
+        <el-form-item>
+          <el-input v-model="formData.keyword" placeholder="输入同事姓名" max="200" @keyup.enter.native="getList()" class="persons_name">
+            <el-button slot="append" icon="el-icon-search" @click="getList()"></el-button>
+          </el-input>
+        </el-form-item>
+
+        <el-form-item style="float: right;"><el-button type="primary" @click="clearAPointShow = true">清空A分余额</el-button></el-form-item>
+      </el-form>
+
+      <el-table :data="list" style="width: 100%" v-if="active == 'balanceA'" v-loading="loading">
+        <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="A分余额" prop="balance_a"></el-table-column>
+        <template slot="empty">
+			<noData></noData>
+        </template>
+      </el-table>
+
+      <el-table :data="list" style="width: 100%" v-else v-loading="loading">
+        <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="remark"></el-table-column>
+        <el-table-column prop="create_time" label="时间"></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-dialog title="清空A分余额" :visible.sync="clearAPointShow" width="500px" @close="clearAPointClose('popupForm')">
+        <el-form :model="popupForm" ref="popupForm">
+          <el-form-item prop="month" :rules="[{ required: true, message: '请选择月份', trigger: 'blur' }]">
+            <el-col :span="3">清空</el-col>
+            <el-col :span="8"><el-date-picker style="width: 100%" v-model="popupForm.month" value-format="yyyy-MM" type="month" placeholder="请选择月份"></el-date-picker></el-col>
+            <el-col :span="6">之前的A分</el-col>
+          </el-form-item>
+        </el-form>
+        <span slot="footer">
+          <el-button @click="resetForm('popupForm')">取 消</el-button>
+          <el-button type="primary" @click="onSubmit('popupForm')">确 定</el-button>
+        </span>
+      </el-dialog>
+    </div>
+  </div>
+</template>
+<script>
+import noData from '@/components/noData';
+export default {
+  data() {
+    return {
+      active: 'balanceA',
+      loading: false,
+      tips_show: false,
+      clearAPointShow: false,
+      list: null,
+      total: null,
+      dept_name: '',
+      formData: {
+        keyword: '',
+        dept_id: '0',
+        page: 1,
+        page_size: 10
+      },
+      dept_tree: null,
+      popupForm: {
+        month: ''
+      }
+    };
+  },
+  watch: {
+    dept_name(val) {
+      this.formData.dept_id = val[val.length - 1];
+      this.$refs.dept.dropDownVisible = false;
+      this.getList();
+    },
+    active(val) {
+      this.list = [];
+      this.formData = {
+        keyword: '',
+        dept_id: '0',
+        page: 1,
+        page_size: 10
+      };
+      val == 'balanceA' ? this.getList() : this.getLog();
+    }
+  },
+  components: {noData},
+  methods: {
+    resetForm(formName) {
+      this.clearAPointShow = false;
+      this.$refs[formName].resetFields();
+    },
+    // 清空数据
+    onSubmit(formName) {
+      this.$refs[formName].validate(valid => {
+        if (valid) {
+          this.$axios('post', '/api/integral/site/a/clear', this.popupForm)
+            .then(res => {
+              if (res.data.code == 1) {
+                this.$message.success('清除成功');
+                this.resetForm(formName);
+                this.getList();
+                this.clearAPointShow = false;
+              } else {
+                this.$message.error(res.data.data.msg);
+              }
+            })
+            .finally(() => {
+              this.loading = false;
+            });
+        }
+      });
+    },
+    // 关闭弹窗
+    clearAPointClose(formName) {
+      this.$refs[formName].resetFields();
+    },
+    // 提示信息
+    tips_close() {
+      localStorage.setItem('balanceA_tips', 'true');
+      this.tips_show = false;
+    },
+    // 页码变更
+    handleCurrentChange(val) {
+      this.formData.page = val;
+      this.active == 'balanceA' ? this.getList() : this.getLog();
+    },
+    handleSizeChange(val) {
+      this.formData.page_size = val;
+      this.active == 'balanceA' ? this.getList() : this.getLog();
+    },
+    // 获取列表
+    getList() {
+      let self = this;
+      self.loading = true;
+      self.$axios('get', '/api/integral/site/a/balance', this.formData)
+        .then(res => {
+          if (res.data.code == 1) {
+            self.list = res.data.data.list;
+            self.total = res.data.data.total;
+          } else {
+            self.$message.error(res.data.data.msg);
+          }
+        })
+        .catch(e => {
+          self.$message.error(e.data.data.msg);
+        })
+        .finally(() => {
+          self.loading = false;
+        });
+    },
+    // 获取日志列表
+    getLog() {
+      let self = this;
+      self.loading = true;
+      let data = {
+        page: this.formData.page,
+        page_size: this.formData.page_size
+      };
+      self
+        .$axios('get', '/api/integral/site/a/logs', data)
+        .then(res => {
+          if (res.data.code == 1) {
+            self.list = res.data.data.list;
+            self.total = res.data.data.total;
+          } else {
+            self.$message.error(res.data.data.msg);
+          }
+        })
+        .finally(() => {
+          self.loading = false;
+        });
+    },
+    // 递归判断列表,把最后的children设为undefined
+    getTreeData(data) {
+      for (var i = 0; i < data.length; i++) {
+        if (data[i].children.length < 1) {
+          // children若为空数组,则将children设为undefined
+          data[i].children = undefined;
+        } else {
+          // children若不为空数组,则继续 递归调用 本方法
+          this.getTreeData(data[i].children);
+        }
+      }
+      return data;
+    }
+  },
+  mounted() {
+    if (localStorage.getItem('dept_tree')) {
+      this.dept_tree = this.getTreeData(JSON.parse(localStorage.getItem('dept_tree')));
+    }
+    if (localStorage.getItem('balanceA_tips')) {
+      this.tips_show = false;
+    } else {
+      this.tips_show = true;
+    }
+    this.getList();
+  }
+};
+</script>
+<style scoped lang="scss">
+.box {
+  background-color: #ffffff;
+  padding: 20px;
+}
+.listData {
+  position: relative;
+  display: table-cell;
+  margin: 0 !important;
+  padding: 20px;
+  min-height: 600px;
+  &::after {
+    content: ' ';
+    position: absolute;
+    top: 0;
+    left: 0;
+    bottom: 0;
+    width: 1px;
+    background: #ebeef5;
+  }
+  & .groups_name {
+    display: block;
+    font-size: 20px;
+    color: rgb(48, 49, 51);
+    vertical-align: middle;
+  }
+}
+::v-deep .el-menu-item {
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  &.is-active {
+    background-color: #ecf5ff;
+  }
+}
+.diy-tip {
+  margin-bottom: 15px;
+  border: 1px solid #67c23a;
+  padding: 20px 16px;
+  p {
+    color: #67c23a !important;
+    font-size: 14px;
+    margin: 0 !important;
+    padding: 4px 0;
+  }
+}
+</style>

+ 22 - 29
src/views/ranking/custom_rank.vue

@@ -35,34 +35,14 @@
 						<el-form-item label="月份" label-width="40px" v-if="newGroupForm.date_interval == 1">
 							<el-date-picker v-model="time.month" type="month" :clearable="false" placeholder="请选择月份" value-format="yyyy-MM"></el-date-picker>
 						</el-form-item>
-
 						<el-form-item label="年份" label-width="40px" v-if="newGroupForm.date_interval == 3">
 							<el-date-picker v-model="time.year" type="year" :clearable="false" placeholder="请选择年份" value-format="yyyy"></el-date-picker>
 						</el-form-item>
 						<el-form-item label="季度" label-width="40px" v-if="newGroupForm.date_interval == 2">
-							<!-- <el-date-picker
-              v-model="time.quarter"
-              type="month"
-              placeholder="请选择季度"
-              value-format="Q"
-            ></el-date-picker> -->
 							<Season ref="Seasons" :defaultHint="true" :isActive="true" class="date-picker-width" @confirm="export_quarter_confirm"></Season>
 						</el-form-item>
-						<!-- <el-form-item label="规则分类" label-width="70px" >
-						<el-cascader
-							class="date-picker-width"
-							v-model="params.rule"
-							:options="rule_trees"
-							:props="props"
-							@change="rule_null"
-							ref="rule"
-							clearable
-							filterable
-							change-on-select
-							placeholder="全部规则分类"
-						></el-cascader>
-					</el-form-item> -->
 						<el-form-item><el-checkbox v-model="sort" size="medium" label="由低到高" border></el-checkbox></el-form-item>
+						<el-button type="primary" @click="exportExcel"  size="medium">导 出</el-button>
 						<el-alert
 							v-if="lastUpdateTime != undefined || lastUpdateTime"
 							:title="
@@ -117,13 +97,14 @@
 			</div>
 			<!-- </el-row> -->
 		</div>
+
+		
 		<!-- 新增分组 -->
 		<el-dialog :title="popupType ? '新增分组' : '编辑分组'" width="460px" :visible.sync="groupShow" :close-on-click-modal="false">
 			<el-form ref="newGroupForm" v-loading="loading" :model="newGroupForm" :rules="rules" label-width="85px" @submit.native.prevent>
 				<el-form-item label="分组名称" prop="group_name">
 					<el-input v-model="newGroupForm.group_name" placeholder="请输入分组名称" auto-complete="off"></el-input>
 				</el-form-item>
-
 				<el-form-item label="分组成员" :required="true">
 					<el-input auto-complete="off" v-model="employees" placeholder="请选择分组成员"></el-input>
 					<div @click="isEmployeeShow = true" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
@@ -142,7 +123,6 @@
 						</span>
 					</el-dialog>
 				</el-form-item>
-
 				<el-form-item label="积分规则" :required="true">
 					<el-input auto-complete="off" v-model="newGroupFormRules" placeholder="全部规则分类"></el-input>
 					<div @click="ruleDialogTableVisibles" style="height:36px; position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;cursor:pointer"></div>
@@ -306,12 +286,6 @@ export default {
 			groupShow: false,
 			rules: {
 				group_name: [{ required: true, message: '请输入分组名称', trigger: 'blur' }, { min: 3, max: 10, message: '长度在 3 到 10 个字符', trigger: 'blur' }]
-				// employees:[
-				// 	{ required: true, message: '请选择成员', trigger: 'blur' },
-				// ],
-				// rule_null_trees:[
-				// 	{required: false, message: '请选择规则分类', trigger: 'blur'}
-				// ]
 			},
 			newGroupForm: {
 				group_name: '',
@@ -376,6 +350,25 @@ export default {
 	},
 	components: { EmployeeSelector, Season },
 	methods: {
+		exportExcel() {
+			let months;
+			if (this.newGroupForm.date_interval == '1') {
+				months = this.time.month.replace('-', '');
+			}
+			let data={
+				group_id:this.clickItem.id,
+				date:'',
+				sort:this.sort?'desc':'asc',
+				employee_id:this.$getUserData().id,
+			};
+			data.date =this.newGroupForm.date_interval == '1'? months: this.newGroupForm.date_interval == '2'
+					? this.time.quarter
+					: this.newGroupForm.date_interval == '3'
+					? this.time.year
+					: '';	
+			let str='&group_id='+data.group_id+'&date='+data.date+'&sort='+data.sort;
+			window.open(process.env.VUE_APP_BASE_API + 'api/download/groups_export?employee_id='+this.$getUserData().id+str, '_blank');
+		},
 		submitEmployee() {
 			this.$refs.Employee.confirm(); //调用组件的confirm();
 		},

+ 9 - 3
src/views/ranking/dept_rank.vue

@@ -167,7 +167,12 @@
 						placeholder="全公司"
 					></el-cascader>
 				</el-form-item>
-				<el-form-item label="规则分类" style="margin-left:10px">
+				<el-form-item label="积分分类">
+					<el-select  style="width: 80px;" size="medium" v-model="Dc_Data.pt_id" 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="规则分类" style="margin-left:20px">
 					<el-cascader
 						class="date-picker-width"
 						@change="ruleInquiredialog"
@@ -248,7 +253,8 @@ export default {
 				value1: '', //时间
 				DC_position: '全部', //人员
 				dept_name: [], //部门
-				rule_id: [], //规则
+				rule_id: [] ,//规则
+				pt_id: 3,
 			},
 			dialogVisible: false,
 			dept_name: [],
@@ -566,7 +572,7 @@ 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.Dc_Data.pt_id + '&employee_id=' + this.$getUserData().id + data, '_blank');
 			this.dialogVisible = false;
 		},
 		//获取部门

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

@@ -54,6 +54,10 @@
 						</el-select>
 						<el-input placeholder="输入同事姓名" size="medium" style="width: 230px;" v-model="keywords" clearable></el-input>
 					</div>
+					<div>
+						<el-button size="small" type="success" @click="import_rules_show = true" plain>导入人员</el-button>
+						<el-button size="small" type="primary" @click="derivedRule" plain>导出人员</el-button>
+					</div>
 					<el-table :data="userList" @selection-change="handleSelectionChange" v-loading="tableToading">
 						<el-table-column type="selection" width="50" :selectable="selectable"></el-table-column>
 						<el-table-column label="姓名">
@@ -151,6 +155,26 @@
 				<el-button type="primary" @click="setRanking" :disabled="rangLoad">确 定</el-button>
 			</span>
 		</el-dialog>
+		<!-- 导入规则 -->
+		<el-dialog title="导入人员" :visible.sync="import_rules_show" width="500px" @before-close="close_import">
+					<div class="text-center flex-box-v flex-center-center">
+						<p><img src="@/assets/image/rules_mould1.png" alt="" /></p>
+						<p>仅支持xls、xlsx格式文件</p>
+						<el-upload
+							class="upload-demo"
+							:headers="ATOKEN"
+							ref="upload"
+							:limit="1"
+							:action="action"
+							:on-remove="handleRemove"
+							:on-success="handleSuccess"
+							:before-upload="beforeFilesUpload"
+							:file-list="fileList"
+						>
+							<el-button slot="trigger" type="primary">选取文件</el-button>
+						</el-upload>
+					</div>
+		</el-dialog>
 	</div>
 </template>
 
@@ -200,7 +224,15 @@ export default {
 			  value: '0',
 			  label: '已禁用'
 			}],
-			status: '-1'
+			status: '-1',
+			//导入规则
+			import_rules_show: false,
+			save_loading: false,
+			import_btn_show: false,
+			fileList: [],
+			file: null,
+			action: process.env.VUE_APP_BASE_API + 'api/employee/enable_import',
+			ATOKEN: { 'A-TOKEN': this.$getToken()},
 		};
 	},
 	components: {
@@ -237,6 +269,68 @@ export default {
 		});
 	},
 	methods: {
+		handleSuccess(response) {
+			if (response.code == 1) {
+				if (response.data.length > 0) {
+					var htmls = response.data;
+					var str = "<div class='red'></div>";
+					htmls.forEach(item => {
+						str += `<div>${item.errors}</div>`;
+					});
+					this.close_import();
+					this.$notify.error({
+						title: '导入错误',
+						dangerouslyUseHTMLString: true,
+						message: str,
+						duration: 0,
+						offset: 50,
+						customClass: 'notifyBox'
+					});
+				} else {
+					this.file = response.data;
+					this.$message.success({ message: response.msg });
+					this.getEmployee();
+					this.close_import();
+				}
+			}else{
+				this.$message.error({ message: response.msg });
+			}
+		},
+		handleRemove(file, fileList) {
+			if (fileList !== null && fileList.length != 0) {
+				this.import_btn_show = true;
+			} else {
+				this.import_btn_show = false;
+			}
+		},
+		beforeFilesUpload(file) {
+			const $ext_list = ['xlsx', 'xls'];
+			let len = file.name.split('.').length - 1;
+			const $ext_name = file.name.split('.')[len];
+			if ($ext_list.indexOf($ext_name) != -1) {
+				this.import_btn_show = true;
+			} else {
+				this.$message.warning('文件格式上传错误,仅支持上传xlsx,xls)');
+				return false;
+			}
+		},
+		//导出规则按钮
+		derivedRule(){
+		  let status=this.status=='-1'? '':this.statu
+		  if(status){
+			  var str='&is_official='+status+'&dept_id='+this.dept_id+'&keywords='+this.keywords;
+		  }else{
+			  var str='&dept_id='+this.dept_id+'&keywords='+this.keywords;
+		  }
+		  let userData=this.$getUserData();
+		  window.open(process.env.VUE_APP_BASE_API+'/api/download/employee_status_export?employee_id='+userData.id+str)
+		},
+		// 导入相关
+		close_import() {
+			this.import_rules_show = false;
+			this.import_btn_show = false;
+			this.$refs.upload.clearFiles();
+		},
 		// 复制ID
 		copyId(id) {
 			this.$axios('get', '/api/employee/code', { employee_id: id })
@@ -466,6 +560,12 @@ export default {
 </script>
 
 <style lang="scss" scoped="scoped">
+.text-center {
+	text-align: center;
+}
+.text-center p {
+	padding: 10px 0;
+}
 .title {
 	font-size: 16px;
 	color: #909399;

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

@@ -532,13 +532,6 @@ export default {
 				this.import_btn_show = false;
 			}
 		},
-		imgChange(file, fileList) {
-			if (fileList !== null && fileList.length != 0) {
-				this.import_btn_show = true;
-			} else {
-				this.import_btn_show = false;
-			}
-		},
 		beforeFilesUpload(file) {
 			const $ext_list = ['xlsx', 'xls'];
 			let len = file.name.split('.').length - 1;