瀏覽代碼

部门排名

walter 11 月之前
父節點
當前提交
d18e716f7d

+ 15 - 2
src/api/websocketTow.js

@@ -60,9 +60,21 @@ let initWebSocket = (fun) => {
 	ws.onopen = websocketonopen
 	ws.onerror = websocketonerror
 	ws.onclose = websocketclose
-  fun()
+  if (typeof fun === 'function') fun()
 }
 
+
+let authWebSocket = (callback) => {
+  if (!ws) initWebSocket();
+  let authData = {
+    type: 'auth',
+    token: getToken(),
+    machine:generateUUID()
+  };
+  sendData(authData,callback)
+}
+
+
 // 发送数据
 let sendData = (data, callback) => {
 	weboscket_callback = callback
@@ -100,5 +112,6 @@ let sendData = (data, callback) => {
 export {
 	initWebSocket,
 	sendData,
-	closewebsocket
+	closewebsocket,
+  authWebSocket
 }

+ 2 - 1
src/point/views/common/rewardTask.vue

@@ -203,7 +203,7 @@ export default {
 				ahead_award_point: null,
 				ahead_award_point_limit: null,
 				dept_ids: [],
-        schedule_expire_date: null
+        schedule_expire_date: moment().format('YYYY-MM-DD')
       },
       reviewerName: null,
       reviewer_selected: { dept: [], employee: [] },
@@ -295,6 +295,7 @@ export default {
       } else {
         this.formData.expire_time = moment().format('YYYY-MM-DD 18:00');
       }
+      this.formData.schedule_expire_date = moment().format('YYYY-MM-DD');
     }
   },
   methods: {

+ 3 - 1
src/point/views/common/temporaryTask.vue

@@ -197,7 +197,7 @@ export default {
         timeout_deduction_point_limit: null,
         ahead_award_point: null,
         ahead_award_point_limit: null,
-        schedule_expire_date:null
+        schedule_expire_date:moment().format('YYYY-MM-DD')
       },
       pickerOptions:{
           disabledDate (time) {
@@ -293,11 +293,13 @@ export default {
   components: { EmployeeSelector },
   watch: {
     'formData.task_cycle'(val) {
+
       if (val) {
         this.formData.task_expire_day = 1;
       } else {
         this.formData.expire_time = moment().format('YYYY-MM-DD 18:00');
       }
+      this.formData.schedule_expire_date = moment().format('YYYY-MM-DD');
     }
   },
   mounted() {},

+ 273 - 4
src/point/views/pointHome.vue

@@ -182,6 +182,84 @@
             </div>
           </div>
 
+          <div class="raiders_box" >
+            <div class="flex-box-ce">
+              <div class="flex-1">
+                <b class="title">
+                  部门排名
+                  <el-tooltip placement="top">
+                    <div slot="content">统计同级部门积分数据</div>
+                    <i class="el-icon-question fontColorC"></i>
+                  </el-tooltip>
+                </b>
+              </div>
+            </div>
+            <el-form :inline="true" v-if="this.supAuthority !== 'employee'" style="margin-top: 10px">
+              <el-form-item label="时间区间">
+                <el-date-picker
+                  v-model="deptRankForm.timeRange"
+                  type="daterange"
+                  align="right"
+                  unlink-panels
+                  range-separator="至"
+                  start-placeholder="开始日期"
+                  end-placeholder="结束日期"
+                  value-format="yyyy-MM-dd"
+                  editable
+                ></el-date-picker>
+              </el-form-item>
+              <el-form-item label="部门">
+                <el-cascader
+                  v-model="dept_name4"
+                  :options="dept_tree"
+                  @change="deptRankChange"
+                  ref="dept4"
+                  filterable
+                  change-on-select
+                  placeholder="公司顶级部门"
+                  clearable
+                />
+              </el-form-item>
+              <el-form-item label="子部门">
+                <el-checkbox v-model="deptRankForm.deptIncludeSub">包含</el-checkbox>
+              </el-form-item>
+              <br/>
+              <el-form-item label="规则分类">
+                <el-cascader
+                  ref="deptRankRule"
+                  v-model="rule"
+                  @change="deptRankRuleChange"
+                  :options="ruleTrees"
+                  :props="{value:'id',label:'name',children:'child'}"
+                  clearable
+                  filterable
+                  change-on-select
+                  placeholder="规则分类"
+                />
+              </el-form-item>
+              <el-form-item label="子分类">
+                <el-checkbox v-model="deptRankForm.ruleIncludeSub">包含</el-checkbox>
+              </el-form-item>
+              <el-form-item label="积分类型">
+                <el-select v-model="deptRankForm.ptId" placeholder="请选择积分类型">
+                  <el-option v-for="item in $getTyps()" :key="item.id" :label="item.name" :value="item.id"></el-option>
+                </el-select>
+              </el-form-item>
+
+            </el-form>
+            <div v-loading="deptRankLoading">
+              <NoData v-if="deptRankList.length === 0" :isSolt="true">
+                <span class="title1">
+                  暂无积分数据
+                  <span v-if="supAuthority !== 'employee'" @click="$router.push({path:'/award_punish'})" style="color:#409EFF;cursor:pointer;">,去奖扣积分</span>
+                </span>
+              </NoData>
+              <div>
+                <div ref="deptFormChart" :style="{ width: '100%', height: '400px' }"></div>
+              </div>
+            </div>
+          </div>
+
           <div class="raiders_box">
             <div style="position: relative;">
               <div><b class="title" style="margin-bottom:15px;display:block">积分构成
@@ -382,6 +460,8 @@ export default {
   },
   data() {
     return {
+      ruleTrees:[],
+      rule:[],
       noticeRole: !this.$supremeAuthority('dept_manager')&&!this.$supremeAuthority('employee'),
       innerVisible: false,
       experience_data: false, //是否体验账号
@@ -451,6 +531,7 @@ export default {
       ManagerSAwardnone: false, //管理者奖扣执行情况为空或报错,展示的开关
       dept_name2: [], //本月积分情况--部门
       dept_name3: [], //管理者统计数据--部门
+      dept_name4:[], //部门排名
       dept_tree: [], //部门
       RankingPush: '',
       tabPositionLoad: false, //排名分类loading
@@ -538,7 +619,28 @@ export default {
             }
           }
         ]
-      }
+      },
+
+      deptRankLoading: false,
+      deptRankChart:null,
+      deptRankForm:{
+        ptId:this.$getTyps().filter(item => item.code === 'BF')[0].id,
+        // startDate:this.$moment().startOf('week').format('YYYY-MM-DD'),
+        // endDate:this.$moment().format('YYYY-MM-DD'),
+        timeRange:[
+          this.$moment().startOf('week').format('YYYY-MM-DD'),
+          this.$moment().format('YYYY-MM-DD')
+        ],
+        ruleId:0,
+        ruleIncludeSub:false,
+        deptId:0,
+        deptIncludeSub:false,
+        itemId:0
+      },
+      deptRankTimeScope:[],
+      deptRankList: [
+        // {name:'',point:0}   //echart必须要有初始化数据后面才可以正常渲染图形,不知道为什么
+      ],
     };
   },
   watch: {
@@ -558,6 +660,38 @@ export default {
     },
     pkTimeScope(val){
       if (this.pkList.length > this.activeDoc) this.getPkRankList(this.pkList[this.activeDoc].id);
+    },
+    deptRankTimeScope(val){
+      this.deptRankForm.startDate = val[0];
+      this.deptRankForm.endDate = val[1];
+    },
+    deptRankList(value){
+      if (value.length === 0) {
+        this.$refs.deptFormChart.style.display = 'none';
+      }else {
+        this.$refs.deptFormChart.style.display = 'block';
+      }
+      this.drawDeptRank();
+    },
+    'deptRankForm.ptId'(val,oVal){
+      if (val === oVal) return;
+      this.getDeptRank();
+    },
+    'deptRankForm.deptId'(val,oVal){
+      if (val === oVal) return;
+      this.getDeptRank();
+    },
+    'deptRankForm.timeRange'(val,oVal){
+      this.getDeptRank();
+    },
+    'deptRankForm.deptIncludeSub'(val,oVal){
+      this.getDeptRank();
+    },
+    'deptRankForm.ruleId'(val,oVal){
+      this.getDeptRank();
+    },
+    'deptRankForm.ruleIncludeSub'(val,oVal){
+      this.getDeptRank();
     }
   },
   computed: {
@@ -578,8 +712,11 @@ export default {
     selfAdaption() {
     	var myChart1 =ECharts.init(this.$refs.monthlyIntegralChart);
     	var myChart2 =ECharts.init(this.$refs.IntegralFormChart);
+      // var myChart3 = ECharts.init(this.$refs.deptFormChart);
     	myChart1.resize();
     	myChart2.resize();
+      this.deptRankChart.resize();
+      // myChart3.resize();
     },
     //点击轮播图
     bannerImagePush(item) {
@@ -1447,8 +1584,131 @@ export default {
             this.rwTotal=res[1].data.data.total;//任务数量
        })
     },
+    deptRankChange(val){
+      if (val.length === 0){
+        this.deptRankForm.deptId = 0;
+      }else {
+        this.deptRankForm.deptId = val[val.length - 1];
+      }
+      this.$nextTick(() => {
+        this.$refs.dept4.dropDownVisible = false;
+      })
+    },
+    getDeptRank(){
+      if (!this.deptRankForm.timeRange || this.deptRankForm.timeRange.length !== 2 || this.deptRankForm.ptId <= 0) return;
+
+      this.deptRankLoading = true;
+      let msg = {
+        type: 'dr',
+        start_date:this.deptRankForm.timeRange[0],
+        end_date:this.deptRankForm.timeRange[1],
+        pt_id:this.deptRankForm.ptId,
+        dept_id:this.deptRankForm.deptId,
+        dept_include_sub:this.deptRankForm.deptIncludeSub ? 1 : 0,
+        rule_id:this.deptRankForm.ruleId,
+        rule_include_sub:this.deptRankForm.ruleIncludeSub ? 1 : 0,
+        item_id:this.deptRankForm.itemId
+      };
+      this.$socketApiTow.sendData(msg,(res) => {
+        if (res.type !== msg.type || res.code !== 1) return;
+        this.deptRankList = res.result.list;
+        this.deptRankLoading = false;
+      })
+    },
+    drawDeptRank() {
+      if (!this.deptRankChart) return;
+      //正负条形图
+      let itemStyle = {color:'#91CC75',shadowColor: '#91cc75',borderType: 'dashed'};
+
+      let option = {
+        tooltip:{
+          trigger:'axis',
+          axisPointer: {
+            type:'shadow'
+          }
+        },
+        grid: {
+          left: '1%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true
+        },
+        xAxis:{
+          type:'value'
+        },
+        yAxis:{
+          type: 'category',
+          axisTick: {
+            show: false
+          },
+          data:[]
+        },
+        series:{
+          name:'积分',
+          type:'bar',
+          label:{
+            show:true,
+            position:'inside'
+          },
+          data:[
+          ]
+        }
+      };
+      option.yAxis.data = [];
+      option.series.data = [];
+      let colorOk = '#409EFF';
+      let colorBad = '#F36F2A';
+      let colorNone = '#FECB09';
+      this.deptRankList.forEach(item => {
+        option.yAxis.data.push(item.name);
+
+        let value = {
+          value: item.point,
+          itemStyle:{color:item.point > 0 ? colorOk : (item.point === 0 ? colorNone : colorBad)}
+        }
+        option.series.data.push(value)
+      })
+
+      //生成图像
+      this.deptRankChart.setOption(option);
+    },
+    deptRankRuleChange(val){
+      if (val.length === 0){
+        this.deptRankForm.ruleId = 0;
+      }else {
+        this.deptRankForm.ruleId = val[val.length - 1];
+      }
+      this.$nextTick(() => {
+        this.$refs.deptRankRule.dropDownVisible = false;
+      })
+    },
+    getRuleTreeData(data){
+      for (var i = 0; i < data.length; i++) {
+        if (data[i].child.length < 1) {
+          // children若为空数组,则将children设为undefined
+          data[i].child = undefined;
+        } else {
+          // children若不为空数组,则继续 递归调用 本方法
+          this.getRuleTreeData(data[i].child);
+        }
+      }
+      return data;
+    },
+    getRuleTrees(){
+      let self = this;
+      self.$axiosUser('get', '/api/pro/integral/rule/trees',{ cycle_type: '1' }).then(res => {
+        if (res.data.code == 1) {
+          let arr = res.data.data.rule_tree;
+          self.ruleTrees = self.getRuleTreeData(arr);
+        } else {
+          self.$message.error(res.data.data.msg);
+        }
+      });
+    },
+
   },
   created() {
+
     this.$store.dispatch('get_dept_tree',true).then(res => {
       this.$nextTick(() => {
         this.dept_tree = this.getTreeData(this.$getCache('dept_tree'));
@@ -1466,12 +1726,15 @@ export default {
 
     const pkStartData = new Date();
     const pkEndData = new Date();
-    pkStartData.setTime(pkStartData.getTime() - 3600 * 1000 * 24 * 30);
+    pkStartData.setTime(pkEndData.getTime() - 3600 * 1000 * 24 * 30);
     this.pkTimeScope[0] = this.$moment(pkStartData).format("YYYY-MM-DD");
     this.pkTimeScope[1] = this.$moment(pkEndData).format("YYYY-MM-DD");
 
+    this.getRuleTrees();
   },
   mounted() {
+    this.deptRankChart = ECharts.init(this.$refs.deptFormChart);    //初始化部门排名图形对象
+
     this.inCommonUse.forEach((item,index)=>{
         if(this.supAuthority=='employee'&&(index==1||index==4||index==5)){
           item.isShow=true;
@@ -1482,13 +1745,19 @@ export default {
     if (this.$getCache('Experience_data')) {
       this.experience_data =this.$getCache('Experience_data').if; //是否体验账号
     }
-    window.addEventListener('resize', this.selfAdaption);
+    window.addEventListener('resize', this.selfAdaption);   //浏览器窗口大小变化触发图形对象重新自适应计算大小
     // 修改请求接口顺序
 
     this.getNum();// 获取审批和任务数量
     this.authorityManagerHeader(); //管理员header
     this.rankingListname(); //获取自定义排行榜名
-    this.getPkDocList(); //pk档案列表
+
+    //websocket数据统一处理
+    this.$socketApiTow.authWebSocket(() => {
+      this.getPkDocList(); //pk档案列表
+      this.getDeptRank(); //获取部门排名数据
+    });
+
     this.integralForm(); //积分构成
 
     this.weekChecking_in(); //本周考勤