walter 11 bulan lalu
induk
melakukan
131dbeaffc

+ 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
 }

+ 34 - 19
src/components/Steps.vue

@@ -11,27 +11,42 @@
             <userImage width="36px" height="36px" :img_url="item.img_url" :user_name="item.name"></userImage>
           </template>
           <template slot="title">
-            <div>
-              <div class="flex-box-ce" style="color: #303133;font-size:14px;margin-top:5px;">
-                <div class="flex-1">
-                  {{ item.name }}
-                  <span style="margin: 0 5px;">
-                    <span v-if="item.remark == '待审核'" style="color:#E6A23C;font-size:13px">待审批</span>
-                    <span v-else-if="item.remark == '审核通过'" style="color:#67C23A;font-size:13px">审批通过</span>
-                    <span v-else-if="item.remark == '审核驳回'" style="color:#F56C6C;font-size:13px">审批驳回</span>
-                    <span v-else>{{ item.remark }}</span>
-                  </span>
-                  <strong style="font-weight: 500;">
-                    <span class="red point" v-show="item.review_point > 0">+{{ item.review_point }}</span>
-                    <span class="green point" v-show="item.review_point < 0">{{ item.review_point }}</span>
-                  </strong>
-                </div>
-                <span class="fontColorC" style="font-size:12px;">{{ item.time }}</span>
-              </div>
-            </div>
+<!--            <div>-->
+<!--              <div class="flex-box-ce" style="color: #303133;font-size:14px;margin-top:5px;">-->
+<!--                <div class="flex-1">-->
+<!--                  {{ item.name }}-->
+<!--                  <span style="margin: 0 5px;">-->
+<!--                    <span v-if="item.remark == '待审核'" style="color:#E6A23C;font-size:13px">待审批</span>-->
+<!--                    <span v-else-if="item.remark == '审核通过'" style="color:#67C23A;font-size:13px">审批通过</span>-->
+<!--                    <span v-else-if="item.remark == '审核驳回'" style="color:#F56C6C;font-size:13px">审批驳回</span>-->
+<!--                    <span v-else>{{ item.remark }}</span>-->
+<!--                  </span>-->
+<!--                  <strong style="font-weight: 500;">-->
+<!--                    <span class="red point" v-show="item.review_point > 0">+{{ item.review_point }}</span>-->
+<!--                    <span class="green point" v-show="item.review_point < 0">{{ item.review_point }}</span>-->
+<!--                  </strong>-->
+<!--                </div>-->
+<!--                <span class="fontColorC" style="font-size:12px;">{{ item.time }}</span>-->
+<!--              </div>-->
+<!--            </div>-->
+            <span style="margin: 0 5px;">
+              <span v-if="item.remark == '待审核'" style="color:#E6A23C;font-size:13px">待审批</span>
+              <span v-else-if="item.remark == '审核通过'" style="color:#67C23A;font-size:13px">审批通过</span>
+              <span v-else-if="item.remark == '审核驳回'" style="color:#F56C6C;font-size:13px">审批驳回</span>
+              <span v-else>{{ item.remark }}</span>
+            </span>
           </template>
           <template slot="description" style="">
-            <div class="fontColorB" style="margin: 5px 0;">{{ item.review_remark }}</div>
+            <el-descriptions :column="1" size="small" :label-style="{width : '80px'}" border>
+              <el-descriptions-item v-if="item.time" label="时间">{{item.time}}</el-descriptions-item>
+              <el-descriptions-item label="姓名">{{item.name}}</el-descriptions-item>
+              <el-descriptions-item v-if="item.point" label="申请分值" >{{item.point ? item.point : ''}}</el-descriptions-item>
+              <el-descriptions-item v-if="index > 0" label="发放奖票">{{item.ticket_count ? '是' :'否'}}</el-descriptions-item>
+              <el-descriptions-item v-if="item.remark !== '发起' && item.review_point" label="审批分值">{{item.review_point ? item.review_point : ''}}</el-descriptions-item>
+              <el-descriptions-item v-if="item.review_remark" label="备注">{{item.review_remark}}</el-descriptions-item>
+            </el-descriptions>
+
+<!--            <div class="fontColorB" style="margin: 5px 0;">{{ item.review_remark }}</div>-->
           </template>
         </el-step>
       </el-steps>

+ 4 - 3
src/point/views/common/examinePopup.vue

@@ -235,7 +235,7 @@
           <el-input :rows="4" type="textarea" v-model="adoptForm.remark" placeholder="说点什么(限100字)"></el-input>
         </el-form-item>
         <div style="padding-left: 80px">奖票用于优秀表现和重要事项的表彰</div>
-        <el-form-item label="发放奖票"><el-switch v-model="adoptForm.switch" active-color="#13ce66"></el-switch></el-form-item>
+        <el-form-item label="发放奖票"><el-switch :disabled="!!detail_info.pid" v-model="adoptForm.switch" active-color="#13ce66"></el-switch></el-form-item>
 
         <el-form-item label="发生时间" v-if="(detail_info.source_type == 2 || detail_info.source_type == 3) && detail_info.pid == 0">
           <el-row>
@@ -539,10 +539,11 @@ export default {
       self.detail_loading = true;
       this.$axiosUser('get', '/api/pro/integral/review', params)
         .then(res => {
-          if (res.data.code == 1) {
+          if (res.data.code === 1) {
             self.detail_info = res.data.data;
 
             self.detail_info.rule_id ? (self.adoptForm.rule_id = self.detail_info.rule_id) : '';
+            self.adoptForm.switch = self.detail_info.ticket_count > 0;
             if (res.data.data.item_id) {
               self.adoptForm.item_id = self.detail_info.item_id;
               self.adoptForm.showPoint = self.detail_info.point;
@@ -683,7 +684,7 @@ export default {
     // 确定通过
     submitAdopt(formName) {
       let self = this;
-      console.log(self.adoptForm.point)
+      // console.log(self.adoptForm.point)
       if(this.adoptForm.point===''||this.adoptForm.point===undefined){
         this.$message.error("请填写积分分值")
         return false

+ 13 - 0
src/point/views/common/repeatTaskDetailsPopup.vue

@@ -50,6 +50,13 @@
           		<span v-if="workDetailData.task_cycle == '3'">{{workDetailData.task_cycle_mark}}{{ workDetailData.task_cycle_value }}号截止</span>
           	</div>
           </li>
+          <li class="flex-box" v-if="workDetailData.schedule_expire_time">
+            <div class="label">有效日期</div>
+            <div class="content_text" >
+              <span v-if="!isExpire(workDetailData.schedule_expire_time)" >{{workDetailData.schedule_expire_time}}</span>
+              <el-alert v-else :title="workDetailData.schedule_expire_time" type="warning" :closable="false" ></el-alert>
+            </div>
+          </li>
           <li class="flex-box" v-if="workDetailData.department_info">
           	<div class="label">可见范围</div>
           	<div class="content_text" v-if="workDetailData.department_info.length>0">
@@ -151,6 +158,12 @@ export default {
           self.$message.error(e.data.msg);
           self.loading = false;
         });
+    },
+    isExpire(expire_time){
+      if (!expire_time) return false
+      let now = new Date();
+      let expire_date = new Date(expire_time);
+      return now >= expire_date;
     }
   }
 };

+ 61 - 4
src/point/views/common/rewardTask.vue

@@ -75,6 +75,22 @@
             </el-select>
           </el-form-item>
 
+          <el-form-item prop="schedule_expire_date" label="有效日期">
+            <el-date-picker
+              v-model="formData.schedule_expire_date"
+              type="date"
+              placeholder="选择日期"
+              format="yyyy-MM-dd"
+              value-format="yyyy-MM-dd"
+              :clearable="true"
+              :default-value="formData.schedule_expire_date"
+              :disabled="formData.task_cycle === 0"
+              @change="scheduleExpireDateChange"
+              @input="scheduleExpireDateInput"
+            ></el-date-picker>
+            <el-tooltip placement="right" content="设置此选项,到了有效日期不再自动发布。默认一直重复发布悬赏" style="margin-left: 10px"><span class="tips">?</span></el-tooltip>
+          </el-form-item>
+
           <el-form-item label="任务备注" prop="task_remark" :rules="[{ max: 300, message: '长度不能超过 300 个字'}]">
             <el-input type="textarea" :rows="5" maxlength="300" show-word-limit v-model="formData.task_remark" placeholder="请输入任务内容(限300字)"></el-input>
           </el-form-item>
@@ -127,7 +143,16 @@
 
           <el-form-item>
             <el-button @click="resetForm('formData')">取消</el-button>
-            <el-button type="primary" @click="sub('formData')">提交</el-button>
+            <el-popconfirm
+              confirm-button-text="确定"
+              cancel-button-text="取消"
+              v-if="formData.schedule_expire_date"
+              :title="'重复悬赏将在' + formData.schedule_expire_date + '停止自动发布,是否继续提交?'"
+              @confirm="sub('formData')"
+            >
+              <el-button slot="reference" type="primary">提交</el-button>
+            </el-popconfirm>
+            <el-button v-else type="primary" @click="sub('formData')">提交</el-button>
           </el-form-item>
         </el-form>
       </div>
@@ -138,6 +163,8 @@
 <script>
 import moment from 'moment';
 import EmployeeSelector from '@/components/EmployeeSelector';
+import {format} from "echarts/lib/export";
+import {deflateSetHeader} from "pikaz-excel-js/lib/PikazJsExcel.common";
 export default {
   name: 'bonusPoints',
   props: {
@@ -182,7 +209,8 @@ export default {
 				timeout_deduction_point_limit: null,
 				ahead_award_point: null,
 				ahead_award_point_limit: null,
-				dept_ids: []
+				dept_ids: [],
+        schedule_expire_date: '',
       },
       reviewerName: null,
       reviewer_selected: { dept: [], employee: [] },
@@ -273,8 +301,9 @@ export default {
         this.formData.task_expire_day = 1;
       } else {
         this.formData.expire_time = moment().format('YYYY-MM-DD 18:00');
+        this.formData.schedule_expire_date = '';
       }
-    }
+    },
   },
   methods: {
     sub(formName) {
@@ -361,6 +390,10 @@ export default {
       }else if(this.formData.task_cycle==3&&this.formData.task_expire_day<=moment().format('D')){
       	is=false
       }
+
+      //没有有效日期就不提交传参
+      if (!data.schedule_expire_date) delete data.schedule_expire_date;
+
       this.$axiosUser('post', self.formData.task_cycle == 0 ? '/api/pro/integral/task/publish' : '/api/pro/integral/schedule/publish/task', data).then(res => {
             this.$message.success(res.data.msg);
             if(this.formData.task_cycle&&is){//是否重复任务
@@ -448,9 +481,22 @@ export default {
     },
     // 部门可见 end
     closeDialog() {
+      this.formData.timeout_deduction_point_limit = null;
+      this.formData.ahead_award_point_limit = null;
       this.resetForm('formData');
       // this.$emit('update:dialogVisible', false)
-    }
+    },
+    scheduleExpireDateChange(v){
+      this.formData.schedule_expire_date = v;
+    },
+    scheduleExpireDateInput(v){
+      //有时日期组件选择日期后change不触发用这个代替
+      this.scheduleExpireDateChange(v)
+      //解决日期选中后页面没有实时渲染选中结果
+      this.$nextTick(()=>{
+        this.$forceUpdate();
+      })
+    },
   }
 };
 </script>
@@ -467,4 +513,15 @@ export default {
   font-size: 14px;
   word-break: break-all;
 }
+.tips {
+  background: #409EFF;
+  border-radius: 50%;
+  width: 14px;
+  height: 14px;
+  color: #fff;
+  display: inline-block;
+  font-size: 12px;
+  line-height: 14px;
+  text-align: center;
+}
 </style>

+ 57 - 5
src/point/views/common/temporaryTask.vue

@@ -56,7 +56,6 @@
               :clearable="false"
             ></el-date-picker>
           </el-form-item>
-
           <el-form-item label="截止日期" prop="task_expire_day" v-if="formData.task_cycle == 1" :rules="[{ required: true, message: '请选择截止日期'}]">
             <el-select v-model="formData.task_expire_day" placeholder="请选择截止日期">
               <el-option v-for="item in columns1" :key="item.value" :label="item.name" :value="item.value"></el-option>
@@ -75,6 +74,22 @@
             </el-select>
           </el-form-item>
 
+          <el-form-item label="有效日期" prop="schedule_expire_date" >
+            <el-date-picker
+              v-model="formData.schedule_expire_date"
+              type="date"
+              placeholder="选择日期"
+              format="yyyy-MM-dd"
+              value-format="yyyy-MM-dd"
+              :clearable="true"
+              :default-value="formData.schedule_expire_date"
+              :disabled="formData.task_cycle === 0"
+              @change="scheduleExpireDateChange"
+              @input="scheduleExpireDateInput"
+            ></el-date-picker>
+            <el-tooltip placement="right" content="设置此选项,到了有效日期不再自动发布。默认一直重复发布任务" style="margin-left: 10px"><span class="tips">?</span></el-tooltip>
+          </el-form-item>
+
           <el-form-item label="任务备注" prop="task_remark" :rules="[{ max: 300, message: '长度不能超过 300 个字'}]">
             <el-input type="textarea" :rows="5" maxlength="300" show-word-limit v-model="formData.task_remark" placeholder="请输入任务内容(限300字)"></el-input>
           </el-form-item>
@@ -110,7 +125,17 @@
 
           <el-form-item>
             <el-button @click="resetForm('formData')">取消</el-button>
-            <el-button type="primary" @click="sub('formData')">提交</el-button>
+<!--            <el-button type="primary" @click="sub('formData')">提交</el-button>-->
+            <el-popconfirm
+              confirm-button-text="确定"
+              cancel-button-text="取消"
+              v-if="formData.schedule_expire_date"
+              :title="'重复任务将在' + formData.schedule_expire_date + '停止自动发布,是否继续提交?'"
+              @confirm="sub('formData')"
+            >
+              <el-button slot="reference" type="primary">提交</el-button>
+            </el-popconfirm>
+            <el-button v-else type="primary" @click="sub('formData')">提交</el-button>
           </el-form-item>
         </el-form>
       </div>
@@ -176,7 +201,8 @@ export default {
         timeout_deduction_point: null,
         timeout_deduction_point_limit: null,
         ahead_award_point: null,
-        ahead_award_point_limit: null
+        ahead_award_point_limit: null,
+        schedule_expire_date:''
       },
       pickerOptions:{
           disabledDate (time) {
@@ -276,10 +302,10 @@ export default {
         this.formData.task_expire_day = 1;
       } else {
         this.formData.expire_time = moment().format('YYYY-MM-DD 18:00');
+        this.formData.schedule_expire_date = '';
       }
     }
   },
-  mounted() {},
   methods: {
     sub(formName) {
       this.$refs[formName].validate(valid => {
@@ -369,6 +395,10 @@ export default {
       }else if(this.formData.task_cycle==3&&this.formData.task_expire_day<=moment().format('D')){
       	is=false
       }
+
+      //没有有效日期就不提交传参
+      if (!data.schedule_expire_date) delete data.schedule_expire_date;
+
       this.$axiosUser('post', this.formData.task_cycle == 0 ? '/api/pro/integral/work/publish' : '/api/pro/integral/schedule/publish/work', data).then(res => {
           this.$message.success(res.data.msg);
           this.closeDialog();
@@ -438,7 +468,18 @@ export default {
       this.formData.ahead_award_point_limit= null;
       this.resetForm('formData');
       // this.$emit('update:dialogVisible', false)
-    }
+    },
+    scheduleExpireDateChange(v){
+      this.formData.schedule_expire_date = v;
+    },
+    scheduleExpireDateInput(v){
+      //有时日期组件选择日期后change不触发用这个代替
+      this.scheduleExpireDateChange(v)
+      //解决日期选中后页面没有实时渲染选中结果
+      this.$nextTick(()=>{
+        this.$forceUpdate();
+      })
+    },
   }
 };
 </script>
@@ -454,4 +495,15 @@ export default {
   font-size: 14px;
   word-break: break-all;
 }
+.tips {
+  background: #409EFF;
+  border-radius: 50%;
+  width: 14px;
+  height: 14px;
+  color: #fff;
+  display: inline-block;
+  font-size: 12px;
+  line-height: 14px;
+  text-align: center;
+}
 </style>

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

@@ -182,6 +182,85 @@
             </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%', mimHeight: '400px' }"></div>-->
+                <div ref="deptFormChart" style="width: 100%; min-height: 400px;"></div>
+              </div>
+            </div>
+          </div>
+
           <div class="raiders_box">
             <div style="position: relative;">
               <div><b class="title" style="margin-bottom:15px;display:block">积分构成
@@ -381,7 +460,13 @@ export default {
     QRCode
   },
   data() {
+    let deptRankStartDate = new Date();
+    deptRankStartDate.setTime(deptRankStartDate.getTime() - 3600 * 1000 * 24 * 7);
+    deptRankStartDate = this.$moment(deptRankStartDate).format('YYYY-MM-DD');
+    let deptRankEndDate = this.$moment().format('YYYY-MM-DD');
     return {
+      ruleTrees:[],
+      rule:[],
       noticeRole: !this.$supremeAuthority('dept_manager')&&!this.$supremeAuthority('employee'),
       innerVisible: false,
       experience_data: false, //是否体验账号
@@ -451,6 +536,7 @@ export default {
       ManagerSAwardnone: false, //管理者奖扣执行情况为空或报错,展示的开关
       dept_name2: [], //本月积分情况--部门
       dept_name3: [], //管理者统计数据--部门
+      dept_name4:[], //部门排名
       dept_tree: [], //部门
       RankingPush: '',
       tabPositionLoad: false, //排名分类loading
@@ -538,7 +624,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:[
+          deptRankStartDate,
+          deptRankEndDate
+        ],
+        ruleId:0,
+        ruleIncludeSub:false,
+        deptId:0,
+        deptIncludeSub:false,
+        itemId:0
+      },
+      deptRankTimeScope:[],
+      deptRankList: [
+        // {name:'',point:0}   //echart必须要有初始化数据后面才可以正常渲染图形,不知道为什么
+      ],
     };
   },
   watch: {
@@ -558,6 +665,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 +717,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 +1589,134 @@ 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.getDom().style.height = this.deptRankList.length * 30 + 'px';
+      this.deptRankChart.setOption(option);
+      //图像重新适应容器高度
+      this.deptRankChart.resize();
+    },
+    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 +1734,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 +1753,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(); //本周考勤

+ 29 - 4
src/point/views/statistics/integral_event.vue

@@ -37,7 +37,7 @@
         </div>
         <div class="sleItem">
           <span class="label">积分类型</span>
-          <el-select class="date-picker-width" v-model="formData.pt_id" clearable placeholder="请选择积分分类">
+          <el-select class="date-picker-width" v-model="formData.pt_id" clearable placeholder="全部">
             <el-option v-for="item in $getTyps()" :key="item.name" :label="item.name" :value="item.id"></el-option>
           </el-select>
         </div>
@@ -71,6 +71,10 @@
           <el-input v-model="formData.keyword" style="width: 250px;" placeholder="输入关键字查找" maxlength="100" @keyup.enter.native="keyWordSelect" class="persons_name">
             <el-button slot="append" icon="el-icon-search" @click="keyWordSelect"></el-button>
           </el-input>
+          <span class="label" style="margin-left: 10px">奖扣分值</span>
+          <el-select v-model="formData.add_subtract" style="width:110px;" filterable placeholder="全部">
+            <el-option v-for="item in add_subtract_items" :key="item.id" :label="item.value" :value="item.id"></el-option>
+          </el-select>
         </div>
       </div>
       <div class="flex-box-ce" style="margin-bottom: 20px;">
@@ -391,6 +395,7 @@ export default {
       formData: {
         page: 1,
         page_size: 10,
+        add_subtract:0
       },
       time_slot: [this.$moment().startOf('month').format('YYYY-MM-DD'),this.$moment().endOf('month').format('YYYY-MM-DD')],
       rule_trees: [],
@@ -421,6 +426,20 @@ export default {
       	{id: 9,name: 'A分转B分'},
       ],
       process:'production',
+      add_subtract_items: [
+        {
+          value: '全部',
+          id: 0
+        },
+        {
+          value: '奖分',
+          id: 1
+        },
+        {
+          value: '扣分',
+          id: 2
+        },
+      ]
     };
   },
   components: {Steps},
@@ -454,6 +473,11 @@ export default {
       !val ? delete this.formData.pt_id : '';
       this.get_integral_list(this.formData);
     },
+    'formData.add_subtract'(val, old_val) {
+      if (val === old_val) return;
+      this.formData.page = 1;
+      this.get_integral_list(this.formData);
+    },
     time_slot(val, old_val) {
       this.formData.page = 1;
       this.get_integral_list(this.formData);
@@ -474,7 +498,7 @@ export default {
       this.formData.page = 1;
       this.formData.employee_ids = val;
       this.get_integral_list(this.formData);
-    }
+    },
   },
   methods: {
     returnStr(id){
@@ -625,8 +649,9 @@ export default {
           (this.formData.start_day ? '&start_day=' + this.formData.start_day : '') +
           (this.formData.end_day ? '&end_day=' + this.formData.end_day : '') +
           (this.formData.source_type ? '&source_type=' + this.formData.source_type : '') +
-          (this.formData.keyword ? '&keyword=' + this.formData.keyword : '') +'&token=' +token
-        window.open(url,'_blank' );
+          (this.formData.add_subtract ? '&add_subtract=' + this.formData.add_subtract : '') +
+          (this.formData.keyword ? '&keyword=' + this.formData.keyword : '') +'&token=' +token;
+      window.open(url,'_blank' );
     },
 
     handleSizeChange(val) {

+ 20 - 6
src/point/views/statistics/integral_event_two.vue

@@ -2,7 +2,8 @@
 	<div>
 		<div class="all boxMinHeight">
 			<header class="flex-box-ce" style="padding-bottom: 20px;">
-				<el-link :underline="false" :disabled="loading" class="fh" @click="$router.go(-1)">返回</el-link>
+<!--				<el-link :underline="false" :disabled="loading" class="fh" @click="$router.go(-1)">返回</el-link>-->
+				<el-link :underline="false" :disabled="loading" class="fh" @click="goBack">返回</el-link>
 				<div>{{parameter.name}}的奖扣执行明细</div>
 			</header>
 			<el-form ref="form" :inline="true" label-width="80px">
@@ -217,6 +218,8 @@ export default {
 			formData: {
         employee_ids:'',
 				month:'',
+        start_date:'',
+        end_date:'',
 				pt_id:3,
 				dc_status:JSON.stringify([1]),
 				order_key:'update_time',
@@ -244,8 +247,9 @@ export default {
 	components: { Steps,downloadexcel },
 	created() {
 		this.parameter=JSON.parse(this.$route.query.data);
-    console.log(this.parameter)
-		this.formData.month=this.parameter.date;
+		this.formData.month=this.parameter.date ? this.parameter.date : '';
+    this.formData.start_date= this.parameter.startDate ? this.parameter.startDate : '';
+    this.formData.end_date= this.parameter.endDate ? this.parameter.endDate : '';
 		this.formData.recorder_id=this.parameter.id;
 		this.getDataAccess();
 	},
@@ -292,29 +296,35 @@ export default {
 		},
 
 		opneWebSocket(is) {
+      if (!this.formData.month && (!this.formData.start_date || !this.formData.end_date)) return;
       let item=this.formData;
 			let data={
 				type:"esi",
 				recorder_id:item.recorder_id,
 				page:this.page,
 				page_size:this.page_size,
-				month:item.month,
 				dc_status:item.dc_status,
 				keyword:item.keyword,
 				pt_id:item.pt_id,
 				source_type:item.source_type,
 			};
+      if (item.month) data.month = item.month;
+      if (item.start_date && item.end_date) {
+        data.start_date = item.start_date;
+        data.end_date = item.end_date;
+      }
+
 			if(item.employee_ids){
 				data.employee_id=item.employee_ids
 			}
 			if(is){
-				data.page_size=100000;
+				data.page = 0;
 			}else{
 				this.loading = true;
 			}
 			this.$socketApiTow.sendData(data,(res)=>{
 				if (res.code == 1&&res.type=='esi') {
-					if(res.result.source_msg.page_size==100000){
+					if(res.result.source_msg.page === 0){
 						let list = res.result.list;
 						let strArr=['','积分奖扣','任务','积分系统分配','考勤系统分配','积分申请','绩效任务包','','积分导入','A分转B分','其他'];
 						list.forEach(item=>{
@@ -379,6 +389,10 @@ export default {
       this.page = 1;
 			this.get_integral_list();
 		},
+    goBack(){
+      let source = this.parameter.source ? this.parameter.source : 'target';
+      this.$router.replace({path : '/manager_statistics', query : {tag : source}});
+    }
 	},
 	beforeRouteLeave(to, from, next) {
 		this.$socketApiTow.closewebsocket();

+ 649 - 0
src/point/views/statistics/managerStatisticsV2.vue

@@ -0,0 +1,649 @@
+<template>
+  <div class="manager_statistics_box boxMinHeight">
+    <el-tabs v-model="currentTag">
+      <el-tab-pane v-for="(item,index) in tabs" :key="index" :label="item.label" :name="item.name" :disabled="loading"></el-tab-pane>
+    </el-tabs>
+    <el-container>
+      <el-header height="100px">
+<!--    搜索    -->
+        <el-form :model="formData"  :inline="true" >
+          <el-form-item label="部门">
+            <el-cascader
+              v-model="dept_name_xq_xq"
+              :options="deptTrees"
+              @change="getLastDeptNull"
+              ref="dept"
+              filterable
+              change-on-select
+              placeholder="全公司"
+              clearable
+            ></el-cascader>
+          </el-form-item>
+          <!--     关键字     -->
+          <el-form-item class="persons_names">
+            <el-input v-model="formData.keyword" :clearable="true" placeholder="搜索姓名" max="200" class="persons_name" @clear="keywordSearch" >
+              <el-button slot="append" icon="el-icon-search" @click="keywordSearch"></el-button>
+            </el-input>
+          </el-form-item>
+<!--    月份搜索      -->
+          <el-form-item label="月份" v-if="currentTag === 'target'">
+            <el-date-picker
+              class="date-picker-width"
+              v-model="formData.month"
+              clearable
+              width="100%"
+              type="month"
+              :clearable="false"
+              placeholder="请选择月份"
+              value-format="yyyy-MM"
+            />
+          </el-form-item>
+<!--     时间区间搜索     -->
+          <el-form-item label="时间区间" v-if="currentTag === 'search'">
+            <el-date-picker
+              v-model="timeScope"
+              type="daterange"
+              align="right"
+              unlink-panels
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              value-format="yyyy-MM-dd"
+              editable
+              :clearable="false"
+            />
+          </el-form-item>
+<!--     达标选项     -->
+          <el-form-item v-if="currentTag === 'target'" label="只看全部达标的" >
+            <el-checkbox v-model="formData.complete" size="medium" />
+          </el-form-item>
+          <el-form-item>
+            <div class="flex-box">
+              <downloadexcel
+                v-if="currentTag === 'target' ? (target.total > 0) : (search.total > 0)"
+                :fetch="getDownloadData"
+                name="管理者奖扣列表.xls"
+                :fields="downloadFields"
+              >
+                <el-button type="primary" plain size="medium" style="margin-right: 10px;">导出报表</el-button>
+              </downloadexcel>
+              <span class="blue cursor" style="padding-left: 20px;font-size: 14px;" @click="$openUrl(18)">什么是每月奖扣目标,如何使用?</span>
+            </div>
+          </el-form-item>
+        </el-form>
+      </el-header>
+      <el-main v-if="currentTag === 'target'">
+        <el-table :data="target.list" style="width: 100%" v-loading="loading" @row-click="openDetailTarget">
+          <el-table-column label="管理者">
+            <template slot-scope="scope">
+              <userImage class="fl" :id="scope.row.id" :user_name="scope.row.name" :img_url="scope.row.img_url" width="50px" height="50px" />
+              <span style="margin-left: 10px; line-height: 50px; display: inline-block;">{{scope.row.name}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="奖分">
+            <template slot-scope="scope">
+              <b>{{scope.row.reward.point}}</b>
+              <span :class="scope.row.reward.status === 1 ? 'color_green' : ''">{{scope.row.reward.status === 1 ? '达标' : ''}}</span>
+              <br/>
+              <span class="span_h">奖分目标 {{scope.row.reward.target}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="扣分">
+            <template slot-scope="scope">
+              <b>{{scope.row.deduction.point}}</b>
+              <span :class="scope.row.deduction.status === 1 ? 'color_green' : ''">{{scope.row.deduction.status === 1 ? '达标' : ''}}</span>
+              <br/>
+              <span class="span_h">扣分目标 {{scope.row.deduction.target}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="奖扣比例">
+            <template slot-scope="scope">
+              <div v-if="scope.row.ratio.enable === 1">
+                <b>{{scope.row.ratio.reward_ratio}} : 1</b>
+                <span :class="scope.row.ratio.status === 1 ? 'color_green' : ''">{{scope.row.ratio.status === 1 ? '达标' : ''}}</span>
+                <br/>
+                <span class="span_h">
+                  比例目标 小于 {{scope.row.ratio.target}}
+                  <b>:</b>
+                  1
+                </span>
+              </div>
+              <div v-else style="padding-left:21px">—</div>
+            </template>
+          </el-table-column>
+          <el-table-column label="奖扣人次" >
+            <template slot-scope="scope">
+              <b>{{ scope.row.exec.count }}&nbsp;</b>
+              <span :class="scope.row.exec.status === 1 ? 'color_green' : ''">{{ scope.row.exec.status === 1 ? '达标' : '' }}</span>
+              <br />
+              <span class="span_h">人次目标 {{ scope.row.exec.target }}人次</span>
+            </template>
+          </el-table-column>
+        </el-table>
+        <center style="padding: 20px 0;">
+          <el-pagination
+            background
+            @size-change="handleTargetSizeChange"
+            @current-change="handleTargetPageChange"
+            :current-page="target.page"
+            layout="total, sizes, prev, pager, next"
+            :page-size="target.pageSize"
+            :page-sizes="[10, 20, 50, 100]"
+            :total="target.total"
+          />
+        </center>
+
+      </el-main>
+      <el-main v-if="currentTag === 'search'">
+        <el-table :data="search.list" style="width: 100%" v-loading="loading" @row-click="openDetailSearch">
+          <el-table-column label="管理者">
+            <template slot-scope="scope">
+              <userImage class="fl" :id="scope.row.id" :user_name="scope.row.name" :img_url="scope.row.img_url" width="50px" height="50px" />
+              <span style="margin-left: 10px; line-height: 50px; display: inline-block;">{{scope.row.name}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="奖分" prop="reward_point" />
+          <el-table-column label="扣分" prop="deduction_point"/>
+          <el-table-column label="奖扣比例" prop="ratio" :formatter="ratioFormatter"/>
+          <el-table-column label="奖扣人次" prop="exec" />
+        </el-table>
+        <center style="padding: 20px 0;">
+          <el-pagination
+            background
+            @size-change="handleSearchSizeChange"
+            @current-change="handleSearchPageChange"
+            :current-page="search.page"
+            layout="total, sizes, prev, pager, next"
+            :page-size="search.pageSize"
+            :page-sizes="[10, 20, 50, 100]"
+            :total="search.total"
+          />
+        </center>
+      </el-main>
+
+    </el-container>
+  </div>
+</template>
+
+
+<script>
+
+import Template from "../../../examine/components/Template.vue";
+import downloadexcel from "vue-json-excel";
+export default {
+  name:'manager_statistics_v2',
+  components: {Template,downloadexcel},
+  data(){
+    let startDate = new Date();
+    startDate.setTime(startDate.getTime() - 3600 * 1000 * 24 * 7);
+    startDate = this.$moment(startDate).format('YYYY-MM-DD');
+    let endDate = this.$moment().format('YYYY-MM-DD');
+    return {
+      tabs:[
+        {label:'奖扣目标',name:'target'},
+        {label: '奖扣查询',name: 'search'}
+      ],
+      currentTag:'target',
+      loading:false,
+      deptTrees: [],
+      formData:{
+        month: this.$moment().format('YYYY-MM'),
+        startDate: startDate,
+        endDate: endDate,
+        deptId: 0,
+        keyword: '',
+        complete: false
+      },
+      timeScope:[
+        startDate,
+        endDate
+      ],
+      dept_name_xq_xq: '',
+      target:{
+        list:[],
+        total:0,
+        page:1,
+        pageSize:10
+      },
+      search:{
+        list:[],
+        total:0,
+        page:1,
+        pageSize:10
+      },
+      downloadTargetFields:{
+        '姓名':'name',
+        '部门':'dept',
+        '实际奖分':'rewardPoint',
+        '奖分目标':'rewardTarget',
+        '实际扣分':'deductionPoint',
+        '扣分目标':'deductionTarget',
+        '实际奖扣比例':'ratio',
+        '比例目标':'ratioTarget',
+        '实际奖扣人次':'exec',
+        '人次目标':'execTarget',
+        '月份':'timeScope',
+      },
+      downloadSearchFields:{
+        '姓名':'name',
+        '部门':'dept',
+        '奖分':'rewardPoint',
+        '扣分':'deductionPoint',
+        '奖扣比例':'ratio',
+        '奖扣人次':'exec',
+        '周期':'timeScope',
+      },
+      downloadData:[]
+    }
+  },
+  created() {
+    this.currentTag = this.$route.query.tag || 'target';
+    if (['target','search'].indexOf(this.currentTag) < 0) this.currentTag = 'target';
+  },
+  computed:{
+    downloadFields: function (){
+      return this.currentTag === 'target' ? this.downloadTargetFields : this.downloadSearchFields;
+    }
+  },
+  mounted() {
+    if (this.$getCache('dept_tree')) {
+      this.deptTrees = this.getTreeData(this.$getCache('dept_tree'));
+    }
+    this.getList();
+  },
+  watch:{
+    'formData.month'(val,oVal){
+      if (val === oVal) return;
+      this.target.page = 1;
+      this.search.page = 1;
+      this.getList();
+    },
+    'formData.startDate'(val,oVal){
+      if (val === oVal) return;
+      this.target.page = 1;
+      this.search.page = 1;
+      this.getList();
+    },
+    'formData.endDate'(val,oVal){
+      if (val === oVal) return;
+      this.target.page = 1;
+      this.search.page = 1;
+      this.getList();
+    },
+    'formData.deptId'(val,oVal){
+      if (val === oVal) return;
+      this.target.page = 1;
+      this.search.page = 1;
+      this.getList();
+    },
+    'formData.complete'(val,oVal){
+      if (val === oVal) return;
+      this.target.page = 1;
+      this.search.page = 1;
+      this.getList();
+    },
+    'target.page'(val,oVal){
+      if (val === oVal) return;
+      this.getList();
+    },
+    'target.pageSize'(val,oVal){
+      if (val === oVal) return;
+      this.getList();
+    },
+    'search.page'(val,oVal){
+      if (val === oVal) return;
+      this.getList();
+    },
+    'search.pageSize'(val,oVal){
+      if (val === oVal) return;
+      this.getList();
+    },
+    currentTag(val,oVal){
+      if (val === oVal) return;
+      this.getList();
+      // this.$router.push({path: '/manager_statistics',query:{tag:val}})
+    },
+    timeScope(val,oVal){
+      this.formData.startDate = val[0];
+      this.formData.endDate = val[1];
+    }
+  },
+  methods: {
+    //部门
+    getLastDeptNull(val) {
+      if (val.length == 0) {
+        this.formData.deptId = 0;
+      } else {
+        this.formData.deptId = val[val.length-1];
+      }
+      this.$nextTick(() => {
+        this.$refs.dept.dropDownVisible = 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;
+    },
+    getList(){
+      if (this.currentTag === 'target'){
+        this.getTargetList();
+      }else {
+        this.getSearchList();
+      }
+    },
+    parseDownloadDataTarget(data){
+      return {
+        name:data.name,
+        dept:data.dept,
+        rewardPoint:data.reward.point,
+        rewardTarget:data.reward.target,
+        deductionPoint:data.deduction.point,
+        deductionTarget:data.deduction.target,
+        ratio:data.ratio.enable === 1 ? data.ratio.reward_ratio + '比1' : '-',
+        ratioTarget:data.ratio.target+'比1',
+        exec:data.exec.count,
+        execTarget:data.exec.target,
+      }
+    },
+    parseDownloadDataSearch(data){
+      return {
+        name:data.name,
+        dept:data.dept,
+        rewardPoint:data.reward_point,
+        deductionPoint:data.deduction_point,
+        ratio:data.ratio,
+        exec:data.exec,
+      }
+    },
+    getTargetList(){
+      let msg = {
+        type:'es',
+        employee_id:this.$userInfo().id,
+        page:this.target.page,
+        page_size:this.target.pageSize,
+        month:this.formData.month,
+        dept_id:this.formData.deptId,
+        complete:this.formData.complete ? 1 : 0,
+        keyword:this.formData.keyword
+      }
+      let self = this;
+      self.loading = true;
+      //清空导出数据
+      self.downloadData = [];
+      this.$socketApiTow.sendData(msg,(res) => {
+        if (res.type !== msg.type || res.code !== 1) return;
+        self.target.list = res.result.list;
+        self.target.total = res.result.total;
+        //刷新导出数据
+        if (msg.page === 0){
+          self.downloadData = self.target.list.map((item) => {
+            let i = self.parseDownloadDataTarget(item);
+            i.timeScope = msg.month
+            return i;
+          });
+          self.loading = false;
+        }else {
+          msg.page = 0;
+          self.$socketApiTow.sendData(msg,(res) => {
+            if (res.type !== msg.type || res.code !== 1) return;
+            self.downloadData = res.result.list.map((item) => {
+              let i = self.parseDownloadDataTarget(item);
+              i.timeScope = msg.month
+              return i;
+            });
+            self.loading = false;
+          })
+        }
+      })
+    },
+    getSearchList(){
+      let msg = {
+        type:'ess',
+        employee_id:this.$userInfo().id,
+        start_date:this.formData.startDate,
+        end_date:this.formData.endDate,
+        dept_id:this.formData.deptId,
+        keyword:this.formData.keyword,
+        page:this.search.page,
+        page_size:this.search.pageSize
+      }
+      let self = this;
+      self.loading = true;
+      //清空导出数据
+      self.downloadData = [];
+      this.$socketApiTow.sendData(msg,(res)=>{
+        if (res.type !== msg.type || res.code !== 1) return;
+        self.search.list = res.result.list;
+        self.search.total = res.result.total;
+        //刷新导出数据
+        if (msg.page === 0){
+          self.downloadData = self.search.list.map((item) => {
+            let i = self.parseDownloadDataSearch(item);
+            i.timeScope = msg.start_date + "至" + msg.end_date;
+            return i;
+          });
+          self.loading = false;
+        }else {
+          msg.page = 0;
+          self.$socketApiTow.sendData(msg,(res) => {
+            if (res.type !== msg.type || res.code !== 1) return;
+            self.downloadData = res.result.list.map((item) => {
+              let i = self.parseDownloadDataSearch(item);
+              i.timeScope = msg.start_date + "至" + msg.end_date;
+              return i;
+            });
+            self.loading = false;
+          })
+        }
+      })
+    },
+    handleTargetSizeChange(val){
+      this.target.pageSize = val;
+    },
+    handleTargetPageChange(val){
+      this.target.page = val;
+    },
+    handleSearchSizeChange(val){
+      this.search.pageSize = val;
+    },
+    handleSearchPageChange(val){
+      this.search.page = val;
+    },
+    keywordSearch(){
+      this.target.page = 1;
+      this.search.page = 1;
+      this.getList();
+    },
+    getDownloadData(){
+      return this.downloadData;
+    },
+    openDetailTarget(e){
+      this.openDetail({
+        date:this.formData.month,
+        id:e.id,
+        name:e.name,
+        source:'target',
+      });
+    },
+    openDetailSearch(e){
+      this.openDetail({
+        startDate:this.formData.startDate,
+        endDate:this.formData.endDate,
+        id:e.id,
+        name:e.name,
+        source:'search',
+      });
+    },
+    openDetail(data){
+      // this.$router.push({path:'/integral_event_two',query:{data:JSON.stringify(data)}})
+      this.$router.replace({path:'/integral_event_two',query:{data:JSON.stringify(data)}});
+    },
+    ratioFormatter(row, column, cellValue, index){
+      return cellValue ? cellValue : '--';
+    },
+  }
+}
+
+</script>
+
+
+<style scoped lang="scss">
+.search_box {
+  /deep/ button:active {
+    background: #409EFF;
+  }
+  /deep/ button:active .el-icon-search {
+    color: #fff;
+  }
+}
+.date-picker-width {
+  width: 100% !important;
+}
+.color_green {
+  color: #67c23a;
+}
+.nopoint_box {
+  display: inline-block;
+  text-align: center;
+  width: 100%;
+  margin-bottom: 10px;
+}
+.title {
+  display: block;
+  text-align: center;
+  font-size: 12px !important;
+  line-height: 30px;
+  color: #909399 !important;
+  padding: 0;
+}
+.nopoint_box a {
+  color: #409EFF;
+}
+.chart_content {
+  height: 90vh;
+  overflow-y: auto;
+  overflow-x: hidden;
+  .chart-legend__wrap {
+    text-align: right;
+    padding: 20px;
+    padding-right: 50px;
+    & .chart-legend__pink {
+      position: relative;
+      padding-left: 12px;
+      padding-right: 5px;
+      &:after {
+        content: '';
+        position: absolute;
+        margin-top: -2px;
+        top: 35%;
+        left: 0;
+        width: 8px;
+        height: 8px;
+        background: #f56c6c;
+        border-radius: 100%;
+      }
+    }
+
+    & .chart-legend__green {
+      position: relative;
+      padding-left: 12px;
+      &:after {
+        content: '';
+        position: absolute;
+        margin-top: -2px;
+        top: 35%;
+        left: 0;
+        width: 8px;
+        height: 8px;
+        background: #53b87f;
+        border-radius: 100%;
+      }
+    }
+  }
+}
+
+// 滚动条样式
+.chart_content::-webkit-scrollbar-track {
+  -webkit-box-shadow: inset 0 0 5px rgb(255, 255, 255);
+  border-radius: 5px;
+  background-color: rgb(255, 255, 255);
+}
+.chart_content::-webkit-scrollbar {
+  width: 5px;
+  background-color: rgba(201, 201, 201, 0);
+}
+.chart_content::-webkit-scrollbar-thumb {
+  border-radius: 5px;
+  -webkit-box-shadow: inset 0 0 5px rgb(153, 145, 145) (160, 154, 154);
+  background-color: rgb(168, 167, 167);
+}
+
+.dataItem {
+  text-align: center;
+  .point {
+    font-size: 22px;
+    color: #409EFF;
+    margin: 10px 0;
+  }
+  .target {
+    font-size: 12px;
+    color: #909399;
+  }
+}
+.drawer_title {
+  font-size: 18px;
+  padding: 20px;
+}
+.manager_statistics_box {
+  background-color: #ffffff;
+  padding: 20px;
+  /deep/ .el-row .el-checkbox .el-checkbox__label {
+    line-height: 20px;
+  }
+}
+.tips {
+  background: #409EFF;
+  border-radius: 50%;
+  width: 14px;
+  height: 14px;
+  color: #fff;
+  display: inline-block;
+  font-size: 12px;
+  line-height: 14px;
+  text-align: center;
+}
+.el-form-item__label {
+  width: 0px !important;
+}
+
+// .persons_names{
+// 	margin-left: 160px;
+// }
+.wlj {
+  & .color_green {
+    color: #49d3a7;
+  }
+  & .color_red {
+    color: #f04b56;
+  }
+}
+b {
+  font-size: 14px;
+}
+.span_h {
+  font-size: 13px;
+  color: #898c94;
+}
+/deep/.el-table tbody tr{
+  cursor: pointer;
+}
+</style>

+ 11 - 1
src/point/views/workbench/task/my_issue.vue

@@ -152,7 +152,7 @@
       </div>
 
       <div v-if="status == 'repetitive'">
-        <el-table :data="list" style="width: 100%" v-loading="loading" @row-click="repetitiveTasksClick">
+        <el-table :data="list" style="width: 100%" v-loading="loading" :row-class-name="scheduleClassName" @row-click="repetitiveTasksClick">
           <el-table-column label="执行人" prop="target_info" width='250px'>
             <template slot-scope="scope">
               <span v-for="(item,index) in scope.row.target_info" :key="index">
@@ -458,6 +458,12 @@
         }).finally((e)=>{
           self.loading = false
 		})
+      },
+      scheduleClassName({row, rowIndex}){
+        if (!row.schedule_expire_time) return "";
+        let now = new Date();
+        let expire_date = new Date(row.schedule_expire_time);
+        return now >= expire_date ? "schedule-expire" : "";
       }
     }
   }
@@ -520,4 +526,8 @@ $red: #f56c6c;
  /deep/ .el-table tr:hover{
   cursor:pointer
 }
+
+/deep/ .el-table .schedule-expire{
+   background: oldlace;
+ }
 </style>

+ 2 - 1
src/router/index.js

@@ -152,7 +152,8 @@ const constantRouterMap = [
           {
             path: '/manager_statistics',
             name: '奖扣目标',
-            component: () => import( /* webpackChunkName: "manager_statistics" */'@/point/views/statistics/manager_statistics'),
+            component: () => import( /* webpackChunkName: "manager_statistics" */'@/point/views/statistics/managerStatisticsV2'),
+            // component: () => import( /* webpackChunkName: "manager_statistics" */'@/point/views/statistics/manager_statistics'),
             meta: {
               groupCode: 'integral',
               jurisdiction: ['creator', 'admin', 'point_manager', 'dept_manager']