|  | @@ -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>
 |