walter 11 月之前
父节点
当前提交
f4599308fc
共有 3 个文件被更改,包括 982 次插入4 次删除
  1. 126 4
      src/point/views/pointHome.vue
  2. 847 0
      src/point/views/setting/pk.vue
  3. 9 0
      src/router/index.js

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

@@ -16,11 +16,11 @@
       <div style="margin: 0 auto;width: 100%;margin-bottom: 10px;" v-if="experience_data">
           <el-carousel trigger="click" :interval="6000" height="125px">
             <el-carousel-item v-for="(item, index) in banner" :key="index">
-              <div  class="bacimg" :style="{backgroundImage: returnImgIndex(item.image)}" style="no-repeat center;" @click="bannerImagePush(item.key)"></div>
+              <div  class="bacimg" :style="{backgroundImage: returnImgIndex(item.image)}" style="no-repeat: center;" @click="bannerImagePush(item.key)"></div>
             </el-carousel-item>
           </el-carousel>
       </div>
-      
+
       <el-row  style="width: 100%;">
         <el-col :span="18">
           <div class="flex-box-ce br-5" style="background-color: #fff;padding:20px;">
@@ -114,13 +114,13 @@
 
                     <div
                       v-if="item.rank == 4 || item.rank == 5"
-                      style="z-index:1;position: absolute;left: 28px;top: -14px;width:24px;height:24px;border:1px solid #C0C4CC;border-radius:50%;background-color:#fff;font-size:12px;text-align-center;line-height:24px;color:#303133;"
+                      style="z-index:1;position: absolute;left: 28px;top: -14px;width:24px;height:24px;border:1px solid #C0C4CC;border-radius:50%;background-color:#fff;font-size:12px; line-height:24px;color:#303133;text-align:center;"
                     >
                       <b style="">{{ item.rank }}</b>
                     </div>
                     <div
                       v-if="item.employee_id == user_infos.id && index == 0 && item.rank > 3"
-                      style="z-index:1;position: absolute;left: 28px;top: -14px;width:24px;height:24px;border:1px solid #C0C4CC;border-radius:50%;background-color:#fff;font-size:12px;text-align-center;line-height:24px;color:#303133;"
+                      style="z-index:1;position: absolute;left: 28px;top: -14px;width:24px;height:24px;border:1px solid #C0C4CC;border-radius:50%;background-color:#fff;font-size:12px;text-align:center;line-height:24px;color:#303133;"
                     >
                       <b>{{ item.rank }}</b>
                     </div>
@@ -145,6 +145,43 @@
             </div>
           </div>
 
+          <div class="raiders_box" v-if="pkList.length > 0" v-loading="pkLoading">
+            <div class="flex-box-ce">
+              <div class="flex-1"><b class="title">团队PK</b></div>
+            </div>
+            <div>
+              <div class="flex-1 scroll-bar" style="margin: 20px 0; overflow-x: auto; ">
+                <div style="margin-bottom: 10px;">
+                  <el-date-picker
+                    v-model="pkTimeScope"
+                    type="daterange"
+                    align="right"
+                    unlink-panels
+                    range-separator="至"
+                    start-placeholder="开始日期"
+                    end-placeholder="结束日期"
+                    value-format="yyyy-MM-dd"
+                    editable
+                  ></el-date-picker>
+                </div>
+                <el-tabs v-model="activeDoc" type="card" :stretch="true" >
+                  <el-tab-pane  v-for="(doc,index) in pkList" :key="index" :name="index.toString()" :label="doc.name" >
+                    <el-row :gutter="20" v-if="pkTeamList.length > 0" v-loading="pkTeamLoading">
+                      <el-col :span="4" v-for="(team,index) in pkTeamList" :key="index" style="margin-bottom: 30px;">
+                        <el-statistic
+                          group-separator=","
+                          :value="team.point"
+                          :title="team.name"
+                        ></el-statistic>
+                      </el-col>
+                    </el-row>
+                    <div v-if="pkTeamList.length === 0"><NoData></NoData></div>
+                  </el-tab-pane>
+                </el-tabs>
+              </div>
+            </div>
+          </div>
+
           <div class="raiders_box">
             <div style="position: relative;">
               <div><b class="title" style="margin-bottom:15px;display:block">积分构成
@@ -464,6 +501,44 @@ export default {
 
       spTotal:0,//审批数量
       rwTotal:0,//任务数量
+      pkLoading: false,
+      pkPosition: 0,
+      pkList: [],
+      activeDoc:0,
+      pkTeamLoading:false,
+      pkTeamList:[],
+      pkTimeScope: [],
+      pkPickerOptions: {
+        shortcuts:[
+          {
+            text:'最近一周',
+            onClick(picker){
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit('pick', [start, end]);
+            }
+          },
+          {
+            text:'最近一个月',
+            onClick(picker){
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+              picker.$emit('pick', [start, end]);
+            }
+          },
+          {
+            text: '最近三个月',
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
+              picker.$emit('pick', [start, end]);
+            }
+          }
+        ]
+      }
     };
   },
   watch: {
@@ -476,6 +551,13 @@ export default {
     },
     exclusiveMonthChecked() {
       this.monthlyIntegral();
+    },
+    activeDoc(val,old){
+      if (this.pkList.length <= val || val == old) return;
+      this.getPkRankList(this.pkList[val].id)
+    },
+    pkTimeScope(val){
+      if (this.pkList.length > this.activeDoc) this.getPkRankList(this.pkList[this.activeDoc].id);
     }
   },
   computed: {
@@ -1186,6 +1268,38 @@ export default {
           this.tabPositionLoad = false;
         });
     },
+    getPkDocList(){
+      this.pkLoading = true;
+      //获取可见范围的PK档案列表
+      this.$axiosUser('GET','/api/pro/pk/doc/list/visible')
+        .then(res => {
+          this.pkList = res.data.data.list;
+          if (this.pkList.length > 0) this.getPkRankList(this.pkList[0].id)
+        })
+        .finally(() =>{
+          this.pkLoading = false;
+        })
+    },
+    getPkRankList(docId){
+      if (!this.pkTimeScope || this.pkTimeScope.length !== 2) {
+        this.pkTeamList = [];
+        return;
+      }
+
+      let type = "team_pk";
+      let params = {
+        type:type,
+        doc_id:docId,
+        start_date:this.pkTimeScope[0],
+        end_date:this.pkTimeScope[1]
+      };
+      this.pkTeamLoading = true;
+      this.$socketApiTow.sendData(params,(res) => {
+        if (res.type != type || res.code != 1) return;
+        this.pkTeamList = res.result.teams;
+        this.pkTeamLoading = false;
+      })
+    },
     tabPositions(item) {
       if (item) {
         this.addUpRankingLoad = true;
@@ -1349,6 +1463,13 @@ export default {
     //   }
     // });
     this.handleScrolls();
+
+    const pkStartData = new Date();
+    const pkEndData = new Date();
+    pkStartData.setTime(pkStartData.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");
+
   },
   mounted() {
     this.inCommonUse.forEach((item,index)=>{
@@ -1367,6 +1488,7 @@ export default {
     this.getNum();// 获取审批和任务数量
     this.authorityManagerHeader(); //管理员header
     this.rankingListname(); //获取自定义排行榜名
+    this.getPkDocList(); //pk档案列表
     this.integralForm(); //积分构成
 
     this.weekChecking_in(); //本周考勤

+ 847 - 0
src/point/views/setting/pk.vue

@@ -0,0 +1,847 @@
+<template>
+  <div>
+    <!--规则提示-->
+    <div class="diy_tip_bg" >
+      <el-alert class="diy-tip" type="success" :closable="false">
+        <p><b>团队PK通过自定义档案配置、团队参与人员等。在相同积分规则内对团队进行积分对比</b></p>
+        <p><b>PK配置流程</b></p>
+        <li class="headLi">指定档案在哪些积分规则分类或者积分规则内有效</li>
+        <li class="headLi">创建团队,指定参与者</li>
+        <p><b>团队积分构成</b></p>
+        <li class="headLi">团队参与者在档案配置中积分规则内的积分总和</li>
+        <li class="headLi">单独向团队录入的积分</li>
+      </el-alert>
+    </div>
+    <div style="background-color: #fff;padding: 20px;position: relative;" class="flex-box boxMinHeight">
+      <div class="left box-sizing-w scroll-bar" v-loading="menuLoading">
+        <div style="text-align: center; padding: 10px 0;">
+          <el-button type="primary" @click="addDoc" v-if="!manageAble">创建档案</el-button>
+        </div>
+        <el-menu v-if="docList.length > 0" :default-active="menuActive"  @select="activeRouter" class="el-menu-vertical-demo" >
+          <el-menu-item v-for="(item, index) in docList" :key="index" :index="index.toString()" @click="refreshContent(item)">
+            <span slot="title">{{item.name}}</span>
+          </el-menu-item>
+        </el-menu>
+        <div v-if="docList.length == 0"><NoData></NoData></div>
+      </div>
+      <div style="overflow-x: auto" class="flex-1 scroll-bar">
+        <el-row style="margin-left: 20px;margin-bottom: 20px;" v-if="currentDoc">
+          <el-col :span="10" style="display: block;font-size: 20px; color: rgb(48,49,51); vertical-align: middle" ><h4>{{currentDoc.name}}</h4></el-col>
+        </el-row>
+        <div style="margin-bottom: 20px;margin-left: 20px;" >
+          <el-button v-if="currentDoc" type="primary" size="small" @click="editDoc">档案配置</el-button>
+          <el-button v-if="currentDoc" type="primary" size="small" @click="addTeam">添加团队</el-button>
+        </div>
+        <el-tabs v-if=" currentDoc && currentDoc.teams.length > 0 " v-model="activeTeam"  type="border-card" closable @tab-remove="removeTeam" v-loading="contentLoading">
+          <el-tab-pane v-for="(team,index) in currentDoc.teams" :key="index" :name="index.toString()" :label="team.name" >
+            <el-table :data="team.employees" v-if="activeTeam === index.toString()"> <!--v-if="activeTeam == index.toString()"防止标签切换抖动-->
+              <el-table-column label="员工" align="left" width="200">
+                <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"></userImage>
+                  <span style="line-height: 50px; padding-left: 10px;">{{ scope.row.name }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="部门" prop="dept_list" align="center"></el-table-column>
+              <el-table-column label="操作" align="center">
+                <template slot="header" slot-scope="scope" >
+                  <el-tooltip effect="light" placement="top" content="团队配置">
+                    <el-button type="primary" size="mini" circle icon="el-icon-setting" @click="editTeam"></el-button>
+                  </el-tooltip>
+                  <el-tooltip effect="light" placement="top" content="添加团队积分">
+                    <el-button type="success" size="mini" circle icon="el-icon-folder-add" @click="addTeamPoint"></el-button>
+                  </el-tooltip>
+                  <el-tooltip effect="light" placement="top" content="团队积分列表">
+                    <el-button type="info" size="mini" circle icon="el-icon-document" @click="clickShowPoint" ></el-button>
+                  </el-tooltip>
+<!--                  <el-button type="primary" size="mini" round @click="editTeam">团队配置</el-button>-->
+<!--                  <el-button type="primary" size="mini" round>添加积分</el-button>-->
+<!--                  <el-button type="primary" size="mini" round>团队积分</el-button>-->
+                </template>
+                <template slot-scope="scope">
+                  <el-button @click="dropEmployee(team.id,scope.row.id,scope.row.name)" size="medium" type="danger" >移除出团队</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-tab-pane>
+        </el-tabs>
+        <div v-if="!currentDoc || currentDoc.teams.length === 0"><NoData></NoData></div>
+      </div>
+    </div>
+
+<!--  创建/编辑档案  -->
+    <el-dialog :title="isUpdateDoc ? '档案配置': '创建档案' " width="700px" top="10vh" :visible.sync="showDoc" :close-on-click-modal="false" >
+      <el-form ref="docForm" :model="docForm" :rules="docFormValidateRules" label-width="100px" @submit.native.prevent style="margin: 0 auto;">
+        <el-form-item label="档案名" prop="name" :required="true">
+          <el-input v-model="docForm.name" maxlength="10" auto-complete="off" show-word-limit placeholder="请输入档案名" ></el-input>
+        </el-form-item>
+        <el-form-item label="积分规则" :required="true" >
+          <el-select v-model="docForm.ruleType" style="margin-bottom: 6px;width: 400px;" >
+            <el-option label="全部" :value="1"></el-option>
+            <el-option label="指定规则分类" :value="2"></el-option>
+            <el-option label="指定规则" :value="3"></el-option>
+          </el-select>
+
+          <el-cascader
+            style="width: 400px;"
+            v-if="docForm.ruleType == 2"
+            v-model="rule_list_value"
+            ref="ruleCascader"
+            :show-all-levels="false"
+            filterable
+            :options="rule_list"
+            :props="{children:'child',label: 'name',value: 'id', checkStrictly: true,multiple: true}"
+          ></el-cascader>
+
+          <div v-if="docForm.ruleType == 3" style="position: relative;"  >
+            <div class="inputBox" @click="showItem = true">
+              <span v-if="selectItem.length > 0">已选择了{{selectItem.length}}条</span>
+              <span v-else style="color: #909399;">请选择</span>
+            </div>
+          </div>
+          <div>
+            <span v-if="docForm.ruleType==1">统计全部积分事件,不包含基础分和工龄分</span>
+            <span v-if="docForm.ruleType==2">包含指定规则分类的积分,不包含基础分和工龄分</span>
+            <span v-if="docForm.ruleType==3">按已指定的积分规则进行积分统计并排名,不包含基础分和工龄分</span>
+          </div>
+        </el-form-item>
+      </el-form>
+      <div class="flex-box-ce">
+        <el-button type="danger" v-if="isUpdateDoc" :loading="commitLoading" @click="deleteDoc">删 除</el-button>
+        <div class="flex-1"></div>
+        <el-button type="primary"  :loading="commitLoading" @click="commitDocForm('docForm')" >提 交</el-button>
+      </div>
+
+    </el-dialog>
+
+<!--  创建编辑团队  -->
+    <el-dialog :title="isUpdateTeam ? '团队配置' : '添加团队'" width="700px" top="10vh" :visible.sync="showTeam" :close-on-click-modal="false" >
+      <el-form ref="teamForm" :model="teamForm" :rules="teamFormValidateRules" label-width="100px" @submit.native.prevent style="margin: 0 auto;" >
+        <el-form-item label="团队名" prop="name" :required="true">
+          <el-input v-model="teamForm.name" maxlength="10" auto-complete="off" show-word-limit placeholder="请输入团队名" ></el-input>
+        </el-form-item>
+        <el-form-item label="参与人员" >
+          <div class="cursor" style="border-radius: 4px;border: 1px solid #dcdfe6;line-height: 34px;width: 400px;padding: 0 15px;" @click="showEmployeeSelect">
+            <div class="flex-box-ce fontColorB font-flex-word" v-if="employees_selected.employee.length>0">
+              <span v-for="item in employees_selected.employee" :key="item.id"> {{item.name}},</span>
+            </div>
+            <div v-else style="color: #C0C4CF;">请选择参与人员</div>
+          </div>
+        </el-form-item>
+      </el-form>
+      <div class="flex-box-ce">
+        <el-button type="danger" v-if="isUpdateTeam" :loading="commitLoading" @click="deleteTeam">删 除</el-button>
+        <div class="flex-1"></div>
+        <el-button type="primary"  :loading="commitLoading" @click="commitTeamForm('teamForm')" >提 交</el-button>
+      </div>
+    </el-dialog>
+
+<!--  添加团队积分  -->
+    <el-dialog title="添加团队积分" width="700px" top="10vh" :visible.sync="showAddPoint" :close-on-click-modal="false" >
+      <el-form ref="pointForm" :model="pointForm" :rules="pointFormValidateRules" label-width="100px" @submit.native.prevent style="margin: 0 auto;">
+        <el-form-item label="积分" prop="point" :required="true">
+          <el-input-number v-model="pointForm.point" :min="-999999" :max="999999" ></el-input-number>
+        </el-form-item>
+        <el-form-item label="日期" prop="date" :required="true">
+          <el-date-picker
+            v-model="pointForm.date"
+            type="date"
+            value-format="yyyy-MM-dd"
+          ></el-date-picker>
+        </el-form-item>
+        <el-form-item label="说明" prop="remark" >
+          <el-input
+            placeholder="积分说明"
+            type="textarea"
+            v-model="pointForm.remark"
+            maxlength="100"
+            rows="4"
+            show-word-limit
+            clearable></el-input>
+        </el-form-item>
+        <div class="flex-box-ce">
+          <div class="flex-1"></div>
+          <el-button type="primary"  :loading="commitLoading" @click="commitPointForm('pointForm')" >提 交</el-button>
+        </div>
+      </el-form>
+    </el-dialog>
+
+    <el-dialog title="团队积分列表" width="700px" top="10vh" :visible.sync="showPoint" :close-on-click-modal="false" >
+      <el-form :inline="true" @submit.native.prevent >
+        <el-date-picker
+          v-model="pointSearchDateScope"
+          type="daterange"
+          align="right"
+          unlink-panels
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          value-format="yyyy-MM-dd"
+          editable
+          :clearable="false"
+        ></el-date-picker>
+      </el-form>
+      <el-table :data="pointListData.list" style="width: 100%" v-loading="pointListLoading" >
+        <el-table-column label="积分" align="center" prop="point"></el-table-column>
+        <el-table-column label="日期" align="center" prop="date"></el-table-column>
+        <el-table-column label="说明" align="center" prop="remark"></el-table-column>
+        <template slot="empty">
+          <NoData></NoData>
+        </template>
+      </el-table>
+      <el-pagination
+        @current-change="handlePointPageChange"
+        :current-page="pointSearchForm.page"
+        :page-size="pointSearchForm.pageSize"
+        :total="pointListData.total"
+      ></el-pagination>
+    </el-dialog>
+
+    <EmployeeSelector
+      title="选择成员"
+      :selected="employees_selected"
+      :close_clear_data="false"
+      :visible.sync="showEmployeeSelector"
+      @confirm="move_employee_confirm"
+      :isChecKedAll="true"
+      :max="0"
+    />
+
+    <SelectRule :isAll="true" :visible.sync="showItem" @confirm="ruleConfirm" :ptId="docForm.ptId" :selectItems="selectItem"></SelectRule>
+  </div>
+
+</template>
+
+
+<script>
+import SelectRule from "@/components/SelectRule.vue";
+import EmployeeSelector from "@/components/EmployeeSelector.vue";
+import Template from "../../../examine/components/Template.vue";
+export default {
+  components: {Template, SelectRule,EmployeeSelector},
+  data(){
+    return {
+      manageAble: this.$supremeAuthority('dept_manager') || this.$supremeAuthority('employee'),
+      menuActive: '0',
+      menuLoading: false,
+      contentLoading: false,
+      currentDoc: null,
+      currentTeam: null,
+      activeTeam: "0",
+      docList: [],
+      isUpdateDoc: false,
+      isUpdateTeam: false,
+      showDoc: false,
+      showTeam: false,
+      showEmployeeSelector: false,
+      docForm:{
+        docId:0,
+        name:'',
+        ptId:3,
+        ruleType:1,
+        rules:[],
+        items:[],
+      },
+      docFormValidateRules:{
+        name: [
+          {required: true,message:'请输入档案名称'},
+          { min: 3, max: 10, message: '长度在 3 到 10 个字符'}
+        ]
+      },
+      teamFormValidateRules:{
+        name: [
+          {required: true,message:'请输入团队名'},
+          { min: 3, max: 10, message: '长度在 3 到 10 个字符'}
+        ]
+      },
+      // 规则分类
+      rule_list: [],
+      rule_tree:[],
+      rule_list_value:[],
+      showItem:false,
+      selectItem:[],
+      commitLoading:false,
+      teamForm:{
+        docId:0,
+        teamId:0,
+        name:"",
+        employees:[]
+      },
+      employees_selected: { employee: [], dept: [] },
+      showAddPoint:false,
+      showPoint:false,
+      pointForm:{
+        teamId:0,
+        teamName:'',
+        point:0,
+        date:"",
+        remark:""
+      },
+      pointFormValidateRules:{
+        point:[
+          {type:'integer'},
+          {required:true,message:"必须填写积分"},
+        ],
+        remark:[
+          {type:'string'},
+          {min:0,max:100,message:"最多100个字符"}
+        ],
+        date:[
+          {type:'string'},
+          {required:true,message:'积分日期必须填写'}
+        ]
+      },
+      pointSearchDateScope:[],
+      pointSearchForm:{
+        timeScope:[],
+        teamId:0,
+        docId:0,
+        page:1,
+        pageSize:10
+      },
+      pointListLoading:false,
+      pointListData:{
+        list:[],
+        total:0
+      }
+    }
+  },
+  methods: {
+    initDocForm(){
+      this.docForm.docId = 0;
+      this.docForm.name = '';
+      this.docForm.ruletype = 1;
+      this.docForm.rules = [];
+      this.docForm.items = [];
+      this.selectItem = [];
+      this.rule_list_value = [];
+    },
+    initTeamForm(){
+      this.teamForm.docId = this.currentDoc.id;
+      this.teamForm.teamId = 0;
+      this.teamForm.name = '';
+      this.teamForm.employees = [];
+      this.employees_selected = { employee: [], dept: [] };
+    },
+    initPointForm(){
+      this.pointForm.teamName = '';
+      this.pointForm.point = 0;
+      this.pointForm.teamId = 0;
+      this.pointForm.remark = '';
+      this.pointForm.date = '';
+    },
+    initPointListData(){
+      this.pointListData = {
+        list:[],
+        total:0
+      }
+    },
+    addDoc(){
+      //封装表单数据
+      this.initDocForm()
+
+      //打开表单弹窗
+      this.isUpdateDoc = false;
+      this.showDoc = true;
+    },
+    editDoc(){
+      //封装表单数据
+      this.docForm.docId = this.currentDoc.id;
+      this.docForm.name = this.currentDoc.name;
+      if (this.currentDoc.items.length > 0){
+        this.docForm.ruleType = 3;
+        this.docForm.rules = [];
+        this.docForm.items = this.currentDoc.items.map(e => e.id)
+        this.selectItem = this.currentDoc.items.map(e => {
+          return {
+            id:e.id,
+            remark:e.name
+          }
+        })
+      }else if (this.currentDoc.rules.length > 0){
+        this.docForm.ruleType = 2;
+        this.docForm.items = [];
+        this.docForm.rules = this.currentDoc.rules.map(e => e.id)
+        let rule_list_value = [];
+        if(this.currentDoc.rules.length > 0){
+          this.docForm.rules.forEach(id => {
+            let arr = [];
+            this.returnRuleVal(id,arr);
+            rule_list_value.push(arr);
+            this.rule_list_value = rule_list_value;
+          })
+        }
+      }else {
+        this.docForm.ruleType = 1;
+        this.docForm.rules = [];
+        this.docForm.rules = [];
+        this.selectItem = [];
+        this.rule_list_value = [];
+      }
+      //打开表单弹窗
+      this.isUpdateDoc = true;
+      this.showDoc = true;
+    },
+    deleteDoc(){
+      this.$confirm('确认删除当前档案吗?','删除档案',{confirmButtonText:'确定',cancelButtonText:'取消',type:"warning"}).then(() => {
+          this.commitDeleteDoc();
+      })
+    },
+    getDocList(){
+      this.menuLoading = true;
+      this.$axiosUser('get','/api/pro/pk/doc/list').then(res => {
+         this.docList = res.data.data.list;
+         if(this.docList.length > 0 && !this.currentDoc){
+           this.refreshContent(this.docList[this.menuActive]);
+         }
+      }).finally(()=>{
+        this.menuLoading = false;
+      })
+    },
+    //获取分类规则
+    get_rule_trees() {
+      let params = {pt_id:3,cycle_type:1};
+      this.$axiosUser('get', '/api/pro/integral/rule/trees', params).then(res => {
+        this.rule_list = this.getTreeData(res.data.data.rule_tree);
+        this.rule_tree = this.flatten(res.data.data.rule_tree);
+      })
+    },
+    // 递归判断列表,把最后的child设为undefined
+    getTreeData(data) {
+      for (var i = 0; i < data.length; i++) {
+        if (data[i].child.length < 1) {
+          // child若为空数组,则将child设为undefined
+          data[i].child = undefined;
+        } else {
+          // child若不为空数组,则继续 递归调用 本方法
+          this.getTreeData(data[i].child);
+        }
+      }
+      return data;
+    },
+    flatten(arr) {
+      return arr.reduce((result, item) => {
+        return result.concat(item, Array.isArray(item.child) ? this.flatten(item.child) : []);
+      }, []);
+    },
+    returnRuleVal(rule_id,arr){
+      arr.unshift(rule_id)
+      let list = this.rule_tree.filter(x => x.id == rule_id)
+      if(list[0]&&list[0].pid != 0){
+        this.returnRuleVal(list[0].pid,arr)
+      }
+      return arr;
+    },
+    activeRouter(index, indexPath){
+      this.menuActive = index.toString();
+    },
+    //加载右边内容页
+    refreshContent(doc){
+      if (!doc || !doc.id) return;
+      this.currentTeam = null;
+      this.currentDoc = null;
+      this.contentLoading = true;
+      this.$axiosUser('get','/api/pro/pk/doc/info',{doc_id:doc.id})
+        .then(res => {
+          this.currentDoc = res.data.data;
+          this.activeTeam = "0";    //只能在这里设置不能在开头初始化
+          if (this.currentDoc.teams.length > 0) this.currentTeam = this.currentDoc.teams[0];
+        })
+        .finally(() => {
+          this.contentLoading = false;
+        })
+    },
+    addTeam(){
+      //封装表单数据
+      this.initTeamForm();
+      //打开表单弹窗
+      this.isUpdateTeam = false;
+      this.showTeam = true;
+    },
+    editTeam(){
+      //封装表单数据
+      this.teamForm.docId = this.currentDoc.id;
+      this.teamForm.teamId = this.currentTeam.id;
+      this.teamForm.name = this.currentTeam.name;
+      this.teamForm.employees = this.currentTeam.employees.map(e => e.id);
+      this.employees_selected.employee = this.currentTeam.employees;
+
+      //打开表单弹窗
+      this.isUpdateTeam = true;
+      this.showTeam = true;
+    },
+    deleteTeam(){
+      this.$confirm('确认删除当前团队吗?','删除团队',{
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.commitDeleteTeam(this.teamForm.teamId);
+      })
+    },
+    removeTeam(i){
+      if (this.currentDoc.teams.length < i) return;
+      let team = this.currentDoc.teams[i];
+      let message = '确认删除团队<<' + team.name + '>>吗?';
+      this.$confirm(message,'删除团队',{
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.commitDeleteTeam(team.id)
+      })
+    },
+    commitDeleteTeam(teamId){
+      this.commitLoading = true;
+      this.$axiosUser('POST','/api/pro/pk/team/d',{team_id:teamId})
+        .then(res => {
+          this.$message.success(res.data.msg);
+          this.isUpdateTeam = false;
+          this.showTeam = false;
+          this.initTeamForm();
+          this.refreshContent(this.currentDoc);
+        })
+        .finally(() => {
+          this.commitLoading = false;
+        })
+    },
+    dropEmployee(teamId,employeeId,employeeName){
+      let message = "确认将<<" + employeeName + ">>移出团队吗?"
+      this.$confirm(message,"移出团队",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"})
+        .then(() => {
+          this.commitDeleteEmployee(teamId,employeeId);
+        })
+    },
+    //选择规则
+    ruleConfirm(rules) {
+      if (rules.length > 0) {
+        this.docForm.items = rules.map(e=> e.id);
+      } else {
+        this.docForm.items = [];
+      }
+      this.selectItem = rules;
+    },
+    commitDocForm(formName) {
+      this.$refs[formName].validate(valid => {
+        if (!valid) return;
+        if (this.isUpdateDoc){
+          this.commitUpdateDoc();
+        }else{
+          this.commitCreateDoc();
+        }
+      })
+    },
+    commitCreateDoc(){
+      let params = {
+        name:this.docForm.name,
+        rules:[],
+        items:[]
+      };
+      if (this.docForm.docId > 0){
+        this.$message.error("表单状态异常");
+        return;
+      }
+      if(this.docForm.ruleType === 2) {
+        if (this.docForm.rules.length === 0){
+          this.$message.error("选择规则分类");
+          return;
+        }
+        params.rules = this.docForm.rules;
+      }else if(this.docForm.ruleType === 3){
+        if (this.docForm.items.length === 0){
+          this.$message.error("请选择规则");
+          return;
+        }
+        params.items = this.docForm.items;
+      }
+
+      this.commitLoading = true
+      this.$axiosUser('POST','/api/pro/pk/doc/c',params).then(res => {
+          this.$message.success(res.data.msg);
+          this.showDoc = false;
+          this.initDocForm();
+          this.getDocList();
+      })
+        .finally(() => {
+          this.commitLoading = false
+        });
+    },
+    commitUpdateDoc(){
+      let params = {
+        doc_id:this.docForm.docId,
+        name:this.docForm.name,
+        rules:[],
+        items:[]
+      }
+      if (this.docForm.docId <= 0){
+        this.$message.error("表单状态异常");
+        return;
+      }
+      if(this.docForm.ruleType === 2) {
+        if (this.docForm.rules.length === 0){
+          this.$message.error("选择规则分类");
+          return;
+        }
+        params.rules = this.docForm.rules;
+      }else if(this.docForm.ruleType === 3){
+        if (this.docForm.items.length === 0){
+          this.$message.error("请选择规则");
+          return;
+        }
+        params.items = this.docForm.items;
+      }
+      this.commitLoading = true
+      this.$axiosUser('POST','/api/pro/pk/doc/e',params).then(res => {
+        this.$message.success(res.data.msg);
+        this.showDoc = false;
+        this.currentDoc = null; //触发当前文档数据刷新,更新右边界面
+        this.initDocForm();
+        this.getDocList();
+      })
+        .finally(() => {
+          this.commitLoading = false
+        });
+
+    },
+    // 选人组件提交
+    move_employee_confirm(data) {
+      this.teamForm.employees = data.employee.map(element => {
+        return element.id
+      });
+      this.employees_selected.employee = data.employee;
+    },
+    showEmployeeSelect(){
+      this.showEmployeeSelector = true;
+    },
+    commitTeamForm(formName){
+      this.$refs[formName].validate(valid => {
+        if (!valid) return;
+        if (this.isUpdateTeam){
+          this.commitUpdateTeam();
+        }else {
+          this.commitCreateTeam();
+        }
+      })
+    },
+    commitUpdateTeam(){
+      let params = {
+        team_id:this.teamForm.teamId,
+        name:this.teamForm.name,
+        employees:this.teamForm.employees
+      }
+
+      this.commitLoading = true;
+      this.$axiosUser('POST','/api/pro/pk/team/e',params).then(res => {
+        this.$message.success(res.data.msg);
+        this.showTeam = false;
+        this.initTeamForm();
+        this.refreshContent(this.currentDoc)
+      })
+        .finally(() => {
+          this.commitLoading = false
+        });
+    },
+    commitCreateTeam(){
+      let params = {
+        doc_id: this.teamForm.docId,
+        name: this.teamForm.name,
+        employees:this.teamForm.employees
+      }
+
+      this.$axiosUser('POST','/api/pro/pk/team/c',params).then(res => {
+        this.$message.success(res.data.msg);
+        this.showTeam = false;
+        this.initTeamForm();
+        this.refreshContent(this.currentDoc)
+      })
+        .finally(() =>{
+          this.commitLoading = false
+        });
+    },
+    commitDeleteEmployee(teamId,employeeId){
+      this.commitLoading = true;
+      this.$axiosUser('POST','/api/pro/pk/team/employee/d',{team_id:teamId,employee_id:employeeId})
+        .then(res => {
+          this.$message.success(res.data.msg);
+          this.refreshContent(this.currentDoc);
+        })
+        .finally(()=>{
+          this.commitLoading = false
+        })
+    },
+    commitDeleteDoc(){
+      this.commitLoading = true;
+      this.$axiosUser('POST','/api/pro/pk/doc/d',{doc_id:this.currentDoc.id})
+        .then(res => {
+          this.$message.success(res.data.msg);
+          this.showDoc = false;
+          this.currentDoc = null;
+          this.currentTeam = null;
+          this.initDocForm();
+          this.getDocList();
+        })
+        .finally(() => {
+          this.commitLoading = false;
+        })
+    },
+    addTeamPoint(){
+      this.pointForm.teamId = this.currentTeam.id;
+      this.pointForm.teamName = this.currentTeam.name;
+      this.showAddPoint = true;
+      this.pointForm.date = this.$moment(new Date()).format('YYYY-MM-DD');
+    },
+    commitPointForm(formName){
+      this.$refs[formName].validate(valid => {
+        if (!valid) return;
+        this.commitLoading = true;
+        let params = {
+          team_id: this.pointForm.teamId,
+          point: this.pointForm.point,
+          date: this.pointForm.date,
+          remark: this.pointForm.remark
+        }
+
+        this.$axiosUser('POST','/api/pro/pk/team/point',params)
+          .then(res => {
+            this.$message.success(res.data.msg);
+            this.showAddPoint = false;
+            this.initPointForm();
+          })
+          .finally(()=>{
+            this.commitLoading = false;
+          })
+      })
+    },
+    initPointSearchDateRange(){
+      //初始化积分列表时间区间
+      const pkStartData = new Date();
+      const pkEndData = new Date();
+      pkStartData.setTime(pkStartData.getTime() - 3600 * 1000 * 24 * 30);
+      this.pointSearchDateScope[0] = this.$moment(pkStartData).format('YYYY-MM-DD');
+      this.pointSearchDateScope[1] = this.$moment(pkEndData).format('YYYY-MM-DD');
+      this.pointSearchForm.timeScope = this.pointSearchDateScope;
+    },
+    initPointSearchForm(){
+      this.initPointSearchDateRange();
+      this.pointSearchForm.teamId = this.currentTeam.id;
+      this.pointSearchForm.docId = this.currentDoc.id;
+      this.pointSearchForm.page = 1;
+      this.pointSearchForm.pageSize = 10;
+    },
+    handlePointPageChange(page){
+      this.pointSearchForm.page = page;
+      this.getPointList();
+    },
+    getPointList(){
+      if (this.pointSearchForm.teamId === 0 || this.pointSearchForm.docId === 0 || !this.pointSearchForm.timeScope || this.pointSearchForm.timeScope.length !== 2) {
+        this.initPointListData();
+        return;
+      }
+      this.pointListLoading = true;
+      let params = {
+        doc_id: this.pointSearchForm.docId,
+        team_id: this.pointSearchForm.teamId,
+        page: this.pointSearchForm.page,
+        page_size: this.pointSearchForm.pageSize,
+        start_date: this.pointSearchForm.timeScope[0],
+        end_date: this.pointSearchForm.timeScope[1]
+      }
+      this.$axiosUser('get','/api/pro/pk/team/point/list',params)
+        .then(res => {
+          this.pointListData = res.data.data;
+        })
+        .finally(()=>{
+          this.pointListLoading = false;
+        })
+    },
+    clickShowPoint(){
+      //初始化积分搜索数据
+      this.initPointSearchForm();
+      this.getPointList();
+      this.showPoint = true;
+    }
+
+
+  },
+  created() {
+    this.get_rule_trees();
+
+  },
+  watch:{
+    activeTeam(value){
+      this.currentTeam = this.currentDoc.teams.length > value ? this.currentDoc.teams[value] : null;
+    },
+    rule_list_value(val){
+      if(val.length > 0){
+        this.docForm.rules = val.map(e => e[e.length - 1]);
+      }else {
+        this.docForm.rules = [];
+      }
+    },
+    pointSearchDateScope(val){
+      this.pointSearchForm.timeScope = val ? val : [];
+      this.getPointList();
+    }
+  },
+  mounted() {
+    this.getDocList();
+  }
+
+}
+
+</script>
+
+<style scoped lang="scss">
+.diy_tip_bg {
+  background: #f5f6f9;
+  overflow: hidden;
+  .diy-tip {
+    margin-bottom: 10px;
+    border: 1px solid #67c23a;
+    padding: 20px 16px;
+    p {
+      color: #67c23a !important;
+      font-size: 15px;
+      margin: 0 !important;
+      padding-bottom: 4px;
+    }
+  }
+}
+.headLi {
+  padding: 4px;
+  list-style: disc;
+  font-size: 14px;
+}
+
+.left{
+  padding:10px;
+  overflow: auto;
+  max-height: 800px;
+}
+
+.boxMinHeight{
+  background-color: #fff;
+}
+
+.inputBox {
+  height: 36px;
+  line-height: 36px;
+  padding-right: 30px;
+  -webkit-appearance: none;
+  background-color: #fff;
+  background-image: none;
+  border-radius: 4px;
+  border: 1px solid #dcdfe6;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+  color: #606266;
+  display: inline-block;
+  font-size: inherit;
+  width: 400px;
+  outline: 0;
+  padding: 0 15px;
+  cursor: pointer;
+  -webkit-transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
+  transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
+}
+
+</style>

+ 9 - 0
src/router/index.js

@@ -85,6 +85,15 @@ const constantRouterMap = [
               jurisdiction: ['creator', 'admin', 'point_manager']
             }
           },
+          {
+            path: '/teamPk',
+            name: '团队PK',
+            component: () => import('@/point/views/setting/pk'),
+            meta: {
+              groupCode: 'basics',
+              jurisdiction: ['creator', 'admin', 'point_manager']
+            }
+          },
           // {
           //   path: '/company_info',
           //   name: '公司信息',