Browse Source

工作台

walter 8 months ago
parent
commit
215e3831b0

+ 2 - 1
build/webpack.prod.conf.js

@@ -133,7 +133,8 @@ const webpackConfig = merge(baseWebpackConfig, {
         },
         sourceMap: config.build.productionSourceMap,
         cache: true,
-        parallel: true
+        parallel: true,
+        exclude: /(node_modules|static)/
       }),
       // Compress extracted CSS. We are using this plugin so that possible
       // duplicated CSS from different components can be deduped.

+ 284 - 0
src/components/workbench/appeal.vue

@@ -0,0 +1,284 @@
+<template>
+  <el-card class="container">
+    <template slot="header">
+      <el-row class="header" type="flex" justify="space-between" align="middle">
+        <el-col :span="4">
+          <el-tag effect="plain" size="medium">申诉</el-tag>
+        </el-col>
+        <el-col :span="18">
+          <el-tabs v-model="formData.type">
+            <el-tab-pane
+              v-for="(item,index) in tabOption"
+              :key="index"
+              :label="item.label"
+              :name="item.type"
+            />
+          </el-tabs>
+        </el-col>
+        <el-col :span="2">
+          <el-button icon="el-icon-refresh" type="text" :loading="loading" @click="getList" />
+        </el-col>
+      </el-row>
+      <el-form class="header" inline style="text-align: left">
+        <template v-if="formData.type === 'publishList'">
+          <el-select v-model="formData.status">
+            <el-option
+              v-for="item in appealStatus"
+              :key="item.id"
+              :label="item.value"
+              :value="item.id"
+            />
+          </el-select>
+        </template>
+      </el-form>
+    </template>
+    <template slot="default">
+      <el-table
+        :height="300"
+        :max-height="300"
+        v-loading="loading"
+        :data="list"
+        @row-click="openAppeal"
+      >
+        <el-table-column
+          v-if="formData.type === 'publishList'"
+          label="审批人"
+          align="center"
+          prop="reviewer_name"
+        />
+        <el-table-column
+          v-else
+          label="申请人"
+          align="center"
+          prop="employee_name"
+        />
+
+        <el-table-column
+          label="积分事件数"
+          align="center"
+          prop="event_count"
+        />
+        <el-table-column
+          label="申请时间"
+          align="center"
+          prop="create_time"
+        />
+      </el-table>
+      <center style="padding: 20px 0;">
+        <el-pagination
+          small
+          layout="prev, pager, next"
+          :total="formData.total"
+          :page-size="formData.pageSize"
+          :current-page="formData.page"
+          @current-change="p => formData.page = p"
+        />
+      </center>
+    </template>
+<!--  申诉详情  -->
+    <el-drawer
+      :with-header="false"
+      :visible.sync="showAppealInfo"
+      size="500px"
+      direction="rtl"
+      :show-close="false"
+      wrapper-closable
+      @close="handleAppealClose"
+      @closed="handleAppealClosed"
+      @opened="handleAppealOpen"
+    >
+      <AppealPopup style="text-align: left" ref="appealInfo" :id="currentAppealId" @update:appeal="init"/>
+    </el-drawer>
+
+  </el-card>
+</template>
+
+<script>
+import Template from "../../examine/components/Template.vue";
+import AppealPopup from "../../point/views/common/AppealPopup.vue";
+
+export default {
+  name: "workbenchAppeal",
+  components:{AppealPopup, Template},
+  data(){
+    const tabs = [
+      {label:'待审核',type:'waitingList'},
+      {label:'我发布的',type:'publishList'},
+      {label:'我参与的',type:'joinList'},
+    ]
+    const appealStatus = [
+      {
+        id:0,
+        value:'全部'
+      },
+      {
+        id:1,
+        value:'审批中'
+      },
+      {
+        id:2,
+        value:'审批通过'
+      },
+      {
+        id:3,
+        value:'驳回重做'
+      },
+      {
+        id:4,
+        value:'撤回重填'
+      },
+      {
+        id:5,
+        value:'拒绝'
+      },
+    ]
+    return{
+      tabOption:tabs,
+      appealStatus:appealStatus,
+      loading:false,
+      formData:{
+        type:tabs[0].type,
+        page:1,
+        pageSize:5,
+        total:0,
+        status:appealStatus[3].id
+      },
+      list:[],
+      currentAppealId:0,
+      showAppealInfo:false,
+    }
+  },
+  methods:{
+    initPageData(){
+      this.formData.page = 1
+      this.formData.pageSize = 5
+      this.formData.total = 0
+    },
+    getList(){
+      switch (this.formData.type){
+        case 'waitingList':
+          this.getReviewList()
+          break;
+        case 'publishList':
+          this.getPublishList()
+          break;
+        case 'joinList':
+          this.getJoinList()
+          break;
+      }
+    },
+    getReviewList() {
+      let params = {
+        status:1,
+        last_reviewer_id: this.$userInfo().id,
+        page:this.formData.page,
+        page_size:this.formData.pageSize
+      }
+      let self = this
+      self.loading = true
+      self.$axiosUser('get','/api/pro/integral/appeal/list',params)
+        .then(res => {
+          if (res.data.code !== 1) throw new Error(res.data.msg)
+          self.list = res.data.data.list
+          self.formData.total = res.data.data.total
+        })
+        .catch(err => {
+          self.$message.error(err)
+        })
+        .finally(() => {
+          self.loading = false
+        })
+    },
+    getPublishList() {
+      console.log('get publish list')
+      let params = {
+        page:this.formData.page,
+        page_size:this.formData.pageSize,
+        status:this.formData.status
+      }
+      let self = this
+      self.loading = true
+      self.$axiosUser('get','/api/pro/integral/appeal/list/publisher',params)
+        .then(res => {
+          if (res.data.code !== 1) throw new Error(res.data.msg)
+          self.list = res.data.data.list
+          self.formData.total = res.data.data.total
+        })
+        .catch(err => {
+          self.$message.error(err)
+        })
+        .finally(() => {
+          self.loading = false
+        })
+    },
+    getJoinList() {
+      let params = {
+        page:this.formData.page,
+        page_size:this.formData.pageSize,
+      }
+      let self = this
+      self.loading = true
+      self.$axiosUser('get','/api/pro/integral/appeal/list/reviewer',params)
+        .then(res => {
+          if (res.data.code !== 1) throw new Error(res.data.msg)
+          self.list = res.data.data.list
+          self.formData.total = res.data.data.total
+        })
+        .catch(err => {
+          self.$message.error(err)
+        })
+        .finally(() => {
+          self.loading = false
+        })
+    },
+    openAppeal(appeal){
+      this.currentAppealId = appeal.id
+      this.showAppealInfo = true
+    },
+    handleAppealClose(){
+      this.$refs['appealInfo'].closeHandler()
+    },
+    handleAppealClosed(){
+      this.$refs['appealInfo'].closedHandler()
+    },
+    handleAppealOpen(){
+      this.$refs['appealInfo'].openedHandler()
+    },
+    init(){
+      this.initPageData()
+      this.getList()
+    },
+  },
+  watch:{
+    'formData.page'(v){
+      this.getList()
+    },
+    'formData.type'(v){
+      this.initPageData()
+      this.getList()
+    },
+    'formData.status'(v){
+      console.log(v)
+      this.initPageData()
+      this.getList()
+    }
+  },
+  mounted() {
+    this.getList()
+  }
+}
+
+</script>
+
+<style scoped>
+.container{
+  width: 100%;
+  height: 100%;
+}
+.container .header{
+  min-height: 50px;
+}
+::v-deep .el-table tbody tr:hover{
+  cursor: pointer;
+}
+</style>

+ 283 - 0
src/components/workbench/review.vue

@@ -0,0 +1,283 @@
+<template>
+  <el-card class="container">
+    <template slot="header">
+      <el-row class="header" type="flex" justify="space-between" align="middle">
+        <el-col :span="4">
+          <el-tag effect="plain" size="medium">审批</el-tag>
+        </el-col>
+        <el-col :span="18">
+          <el-tabs v-model="formData.type">
+            <el-tab-pane v-for="(item,index) in tabsOption" :key="index" :label="item.label" :name="item.type"/>
+          </el-tabs>
+        </el-col>
+        <el-col :span="2">
+          <el-button icon="el-icon-refresh" type="text" :loading="loading" @click="getList" />
+        </el-col>
+      </el-row>
+      <el-form class="header" inline style="text-align: left">
+        <template v-if="formData.type !== 'apply'">
+          <el-form-item label-width="0">
+            <el-select v-model="formData.sourceType">
+              <el-option
+                v-for="item in reviewSourceType"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label-width="0">
+            <el-select v-model="formData.ptId">
+              <el-option
+                v-for="item in pts"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label-width="0">
+            <el-select v-model="formData.targetId" filterable clearable placeholder="受益人">
+              <el-option
+                v-for="item in employeeMap"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+              />
+            </el-select>
+          </el-form-item>
+        </template>
+        <template v-else>
+          <el-form-item label-width="0">
+            <el-select v-model="formData.applyType">
+              <el-option
+                v-for="(item,index) in applyTypeOption"
+                :key="index"
+                :label="item.name"
+                :value="item.type"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label-width="0">
+            <el-input
+              v-model="formData.keyword"
+              placeholder="申请内容"
+              maxlength="10"
+              clearable
+            />
+          </el-form-item>
+        </template>
+      </el-form>
+    </template>
+    <template slot="default">
+      <el-table
+        :height="300"
+        :max-height="300"
+        v-loading="loading"
+        :data="list"
+        @row-click="openReview"
+      >
+        <el-table-column
+          label="内容"
+          align="center"
+          prop="remark.customize"
+          width="300"
+          show-overflow-tooltip
+        />
+        <el-table-column label="来源" align="center" prop="source_type">
+          <template slot-scope="scope">
+            <el-tag :type="sourceTypeTag(scope.row.source_type)">{{sourceMap[scope.row.source_type] || '--'}}</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="时间"
+          align="center"
+          prop="event_time"
+        />
+      </el-table>
+      <center style="padding: 20px 0;">
+        <el-pagination
+          small
+          layout="prev, pager, next"
+          :total="formData.total"
+          :page-size="formData.pageSize"
+          :current-page="formData.page"
+          @current-change="p => formData.page = p"
+        />
+      </center>
+    </template>
+    <examinePopup :refresh-parent-list="false" style="text-align: left" :title="'审核详情'" :id="currentReviewId" :show.sync="showReview" @hasSubmit="getList"/>
+  </el-card>
+</template>
+
+<script>
+import Template from "../../examine/components/Template.vue";
+import examinePopup from "../../point/views/common/examinePopup.vue";
+import {_debounce} from "../../utils/auth";
+
+export default {
+  name: 'workbenchReview',
+  components: {Template,examinePopup},
+  data(){
+    const tabs = [
+      {label:'待审批',type:'waiting'},
+      {label:'参与审批',type: 'reviewed'},
+      {label:'我申请的',type: 'apply'},
+    ]
+    const applyType = [{name:'待审批',type:'waiting'},{name:'已通过',type:'complete'},{name:'被驳回',type:'refuse'}]
+    const sourceType = [{ name: '审批来源', id: 0 }, { name: '积分任务', id: 1 }, { name: '积分申请', id: 2 }, { name: '积分奖扣', id: 3 }]
+    const pts = this.$getTyps()
+    pts.unshift({code:'all',id:0,name:'积分类型'})
+    return {
+      tabsOption:tabs,
+      loading:false,
+      reviewSourceType:sourceType,
+      applyTypeOption:applyType,
+      pts:pts,
+      employeeMap: this.$getEmployeeMap(),
+      formData:{
+        type:tabs[0].type,
+        ptId:0,
+        sourceType:0,
+        targetId:null,
+        page:1,
+        pageSize:5,
+        total:0,
+        applyType:applyType[0].type,
+        keyword:''
+      },
+      list:[],
+      sourceMap:{
+        1:'任务',
+        2:'申请',
+        3:'积分奖扣',
+      },
+      showReview:false,
+      currentReviewId:0,
+    }
+  },
+  watch:{
+    'formData.type'(v){
+      this.initPageData()
+      this.getList()
+    },
+    'formData.page'(v){
+      this.getList()
+    },
+    'formData.ptId'(v){
+      this.initPageData()
+      this.getList()
+    },
+    'formData.sourceType'(v){
+      this.initPageData()
+      this.getList()
+    },
+    'formData.targetId'(v){
+      this.initPageData()
+      this.getList()
+    },
+    'formData.applyType'(v){
+      this.initPageData()
+      this.getList()
+    },
+    'formData.keyword':_debounce(function (val){
+      this.initPageData()
+      this.getList()
+    }),
+  },
+  methods:{
+    initFormData(){
+    },
+    initPageData(){
+      this.formData.page = 1
+      this.formData.pageSize = 5
+      this.formData.total = 0
+    },
+    sourceTypeTag(sourceType){
+      const map = {
+        1:'info',
+        2:'success',
+        3:'warning',
+      }
+      return map[sourceType] || 'info'
+    },
+    getList(){
+      switch (this.formData.type){
+        case 'apply':
+          this.getApplyList()
+          break;
+        default:
+          this.getReviewList()
+      }
+    },
+    getReviewList(){
+      let params = {
+        type:this.formData.type,
+        pt_id:this.formData.ptId,
+        source_type:this.formData.sourceType,
+        page:this.formData.page,
+        page_size:this.formData.pageSize,
+      }
+      if (this.formData.targetId) params.target_id = this.formData.targetId
+      let self = this
+      self.loading = true
+      self.$axiosUser('get', '/api/pro/integral/review/list', params)
+        .then(res => {
+          if (res.data.code !== 1) throw new Error(res.data.msg)
+          self.list = res.data.data.list
+          self.formData.total = res.data.data.total
+        })
+        .catch(err => {
+          self.$message.error(err)
+        })
+        .finally(() => {
+          self.loading = false
+        })
+    },
+    getApplyList(){
+      let params = {
+        pt_id:this.formData.ptId,
+        type:this.formData.applyType,
+        page:this.formData.page,
+        page_size:this.formData.pageSize,
+      }
+      if (this.formData.keyword) params.keyword = this.formData.keyword
+      let self = this
+      self.loading = true
+      self.$axiosUser("get","/api/pro/integral/review/apply/list",params)
+        .then(res => {
+          if (res.data.code !== 1) throw new Error(res.data.msg)
+          self.list = res.data.data.list
+          self.formData.total = res.data.data.total
+        })
+        .catch(err => {
+          self.$message.error(err)
+        })
+        .finally(() => {
+          self.loading = false
+        })
+    },
+    openReview(row){
+      this.currentReviewId = row.id
+      this.showReview = true
+    }
+  },
+  mounted() {
+    this.getList()
+  }
+}
+</script>
+
+<style scoped>
+.container{
+  width: 100%;
+  height: 100%;
+}
+.container .header{
+  min-height: 50px;
+}
+::v-deep .el-table tbody tr:hover{
+  cursor: pointer;
+}
+
+</style>

+ 235 - 0
src/components/workbench/schedule.vue

@@ -0,0 +1,235 @@
+<template>
+  <el-card class="container">
+    <template slot="header">
+      <el-row class="header" type="flex" justify="space-between" align="middle">
+        <el-col :span="4">
+          <el-tag effect="plain" size="medium">定时模板</el-tag>
+        </el-col>
+        <el-col :span="18">
+          <el-tabs v-model="formData.type">
+            <el-tab-pane
+              v-for="(item,index) in tabs"
+              :key="index"
+              :label="item.label"
+              :name="item.type"
+              :disabled="loading"
+            />
+          </el-tabs>
+        </el-col>
+        <el-col :span="2">
+          <el-button icon="el-icon-refresh" type="text" :loading="loading" @click="getList" />
+        </el-col>
+      </el-row>
+      <el-form class="header" inline style="text-align: left"></el-form>
+    </template>
+    <template slot="default">
+      <el-table
+        :height="300"
+        :max-height="300"
+        v-loading="loading"
+        :data="list"
+        @row-click="openScheduleInfo"
+      >
+        <el-table-column
+          label="内容"
+          prop="name"
+          width="200"
+          align="center"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="发布周期"
+          align="center"
+          prop="task_cycle"
+          width="200"
+          show-overflow-tooltip
+        >
+          <template slot-scope="scope">
+            {{cycleMark(scope.row)}}
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="积分"
+          prop="point_config.base_point"
+          align="center"
+        >
+          <template slot-scope="scope">
+            {{scope.row.point_config.base_point > 0 ? '+' : ''}}
+            {{scope.row.point_config.base_point}}
+            {{$getTypsName(scope.row.pt_id)}}
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="操作"
+          align="center"
+          prop="id"
+        >
+          <template slot-scope="scope">
+            <el-dropdown placement="bottom" :show-timeout="150" :hide-timeout="150" >
+              <span class="el-dropdown-links" @click.stop="">···</span>
+              <el-dropdown-menu  slot="dropdown" >
+                <el-dropdown-item :disabled="false">
+                  <el-button type="text"  @click.stop="deleteSchedule(scope.row)">删除</el-button>
+                </el-dropdown-item>
+              </el-dropdown-menu>
+            </el-dropdown>
+          </template>
+        </el-table-column>
+
+      </el-table>
+      <center style="padding: 20px 0;">
+        <el-pagination
+          small
+          layout="prev, pager, next"
+          :total="formData.total"
+          :page-size="formData.pageSize"
+          :current-page="formData.page"
+          @current-change="p => formData.page = p"
+        />
+      </center>
+    </template>
+    <repeatTaskDetailsPopup
+      style="text-align: left"
+      :visible.sync="showScheduleInfo"
+      v-if="showScheduleInfo"
+      :id="currentScheduleId"
+      :title="'定时模板信息'"
+    />
+  </el-card>
+</template>
+
+<script>
+import repeatTaskDetailsPopup from '@/point/views/common/repeatTaskDetailsPopup'
+export default {
+  name:'workbenchSchedule',
+  components:{
+    repeatTaskDetailsPopup
+  },
+  data() {
+    const tabs = [
+      {label:'悬赏',type:'task'},
+      {label:'任务',type:'work'},
+    ]
+    return {
+      tabs:tabs,
+      formData:{
+        type:tabs[0].type,
+        page:1,
+        pageSize:5,
+        total:0,
+      },
+      loading:false,
+      list:[],
+      showScheduleInfo:false,
+      currentScheduleId:0,
+    }
+  },
+  methods:{
+    getList() {
+      let map = {
+        work:1,
+        task:2,
+      }
+      let params = {
+        page:this.formData.page,
+        page_size:this.formData.pageSize,
+        type:map[this.formData.type] || 0
+      }
+      let self = this
+      self.loading = true
+      self.$axiosUser('get','/api/pro/integral/schedule/list',params)
+        .then(res => {
+          if (res.data.code !== 1) throw new Error(res.data.msg)
+          self.list = res.data.data.list
+          self.formData.total = res.data.data.total
+        })
+        .catch(err => {
+          self.$message.error(err)
+        })
+        .finally(() => {
+          self.loading = false
+        })
+    },
+    initPageData(){
+      this.formData.page = 1
+      this.formData.pageSize = 5
+      this.formData.total = 0
+    },
+    cycleMark(schedule){
+      switch (schedule.task_cycle) {
+        case 1:
+          // 每天
+          return `每天凌晨发布,${schedule.task_cycle_value}点截止`
+        case 2:
+          // 每周
+          return `每周一发布,周${schedule.task_cycle_value - 1}截止`
+        case 3:
+          // 每月
+          return `每月1号发布,${schedule.task_cycle_value}号截止`
+      }
+    },
+    deleteSchedule(schedule){
+      this.$message.closeAll()
+      let self = this
+      self.$confirm(
+        `删除此模板 (${schedule.name}) 将会删除其相关记录和积分数据,确认删除吗?`,
+        '删除定时模板',
+        {
+          confirmButtonText:'确定',
+          cancelButtonText:'取消',
+          type:'warning',
+        }
+      )
+        .then(() => {
+          self.loading = true
+          self.$axiosUser('DELETE','/api/pro/integral/schedule',{schedule_id:schedule.id})
+            .then(res => {
+              if (res.data.code !== 1) throw new Error(res.data.msg)
+              self.getList()
+            })
+            .catch(err => {
+              self.$message.error(err)
+            })
+            .finally(() => {
+              self.loading = false
+            })
+        })
+    },
+    openScheduleInfo(schedule){
+      this.currentScheduleId = schedule.id
+      this.showScheduleInfo = true
+    }
+  },
+  watch:{
+    'formData.page'(v){
+      this.getList()
+    },
+    'formData.type'(v){
+      this.initPageData()
+      this.getList()
+    }
+  },
+  mounted() {
+    this.getList()
+  }
+}
+
+</script>
+
+<style scoped lang="scss">
+.container{
+  width: 100%;
+  height: 100%;
+}
+.container .header{
+  min-height: 50px;
+}
+::v-deep .el-table tbody tr:hover{
+  cursor: pointer;
+}
+.el-dropdown-links {
+  font-size: 20px;
+  cursor: pointer;
+  color: #a6a8aa;
+}
+</style>

+ 316 - 0
src/components/workbench/task.vue

@@ -0,0 +1,316 @@
+<template>
+  <el-card class="container">
+    <template slot="header">
+      <el-row class="header" type="flex" justify="space-between" align="middle">
+        <el-col :span="4">
+          <el-tag effect="plain" size="medium">悬赏大厅</el-tag>
+        </el-col>
+        <el-col :span="18">
+          <el-tabs v-model="formData.type">
+            <el-tab-pane v-for="(item,index) in tabs" :key="index" :label="item.label" :name="item.type" :disabled="loading"/>
+          </el-tabs>
+        </el-col>
+        <el-col :span="2">
+          <el-button icon="el-icon-refresh" type="text" :loading="loading" @click="getList" />
+        </el-col>
+      </el-row>
+      <el-form class="header" inline style="text-align: left">
+        <template v-if="formData.type === 'publish'">
+          <el-form-item label-width="0">
+            <el-select v-model="formData.publishStatus">
+              <el-option
+                v-for="item in publishStatus"
+                :key="item.id"
+                :label="item.name"
+                :value="item.code"
+              />
+            </el-select>
+            <el-select v-model="formData.ptId">
+              <el-option
+                v-for="item in pts"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label-width="0">
+            <el-select v-model="formData.publishSort" placeholder="请选择排序">
+              <el-option
+                v-for="item in publishSort"
+                :key="item.id"
+                :label="item.name"
+                :value="item.code"
+              />
+            </el-select>
+          </el-form-item>
+        </template>
+
+      </el-form>
+    </template>
+    <template slot="default">
+      <el-table
+        :height="300"
+        :max-height="300"
+        v-loading="loading"
+        :data="list"
+        @row-click="openTaskInfo"
+      >
+        <el-table-column
+          label="内容"
+          align="center"
+          prop="task_name"
+          width="200"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="积分"
+          align="center"
+          prop="base_point"
+        >
+          <template slot-scope="scope">
+            {{scope.row.base_point}}&nbsp;{{scope.row.pt_name || ''}}
+          </template>
+        </el-table-column>
+
+        <template v-if="formData.type !== 'publish'">
+          <el-table-column
+            label="截止时间"
+            align="center"
+            prop="expire_time"
+          />
+          <el-table-column
+            label="发布者"
+            align="center"
+            prop="owner_name"
+          />
+        </template>
+        <el-table-column
+          v-if="formData.type === 'publish'"
+          label="状态"
+          align="center"
+          prop="status_mark"
+          :key="Math.random()"
+        />
+        <el-table-column
+          v-if="formData.type === 'publish'"
+          label="操作"
+          align="center"
+          :key="Math.random()"
+        >
+          <template slot-scope="scope">
+            <el-dropdown placement="bottom" trigger="click" :show-timeout="150" :hide-timeout="150">
+              <span class="el-dropdown-links" @click.stop="">···</span>
+              <el-dropdown-menu slot="dropdown">
+                <el-dropdown-item v-if="scope.row.status === 1" >
+                  <el-button type="text" class="color-red" @click.stop="openTaskUpdate(scope.row)">修改</el-button>
+                </el-dropdown-item>
+                <el-dropdown-item class="color-red">
+                  <el-button type="text" class="color-red" @click.stop="taskDelete(scope.row)" >删除</el-button>
+                </el-dropdown-item>
+              </el-dropdown-menu>
+            </el-dropdown>
+          </template>
+        </el-table-column>
+      </el-table>
+      <center style="padding: 20px 0;">
+        <el-pagination
+          small
+          layout="prev, pager, next"
+          :total="formData.total"
+          :page-size="formData.pageSize"
+          :current-page="formData.page"
+          @current-change="p => formData.page = p"
+        />
+      </center>
+    </template>
+    <TaskInfo style="text-align: left" :show.sync="showTask" :task-id="currentTaskId" @update:task="getList"/>
+    <TaskUpdate style="text-align: left" :schedule-visible.sync="showTaskEdit" :task-id="currentTaskId" @hasSubmit="getList" />
+  </el-card>
+</template>
+
+<script>
+
+import TaskInfo from "../../point/views/common/taskInfo.vue"
+import TaskUpdate from "../../point/views/common/TaskUpdate.vue";
+
+export default {
+  name: 'workbenchTask',
+  components: {TaskUpdate, TaskInfo},
+  data(){
+    const tabs = [
+      {label:'待领取',type:'waiting'},
+      {label:'已领取',type:'catch'},
+      {label:'我发布的',type:'publish'},
+    ]
+    const pts = this.$getTyps()
+    pts.unshift({code:'all',id:0,name:'积分类型'})
+    const publishSort = [{id:1,name:'按截止时间',code:'expire_time'},{id:2,name:'按发布时间',code:'create_time'}]
+    const publishStatus = [
+      {code:'all',id:1,name:'悬赏状态'},
+      {code:'waiting',id:2,name:'未领取'},
+      {code:'catch',id:3,name:'已领取'},
+    ]
+    return {
+      tabs:tabs,
+      pts:pts,
+      publishStatus:publishStatus,
+      publishSort: publishSort,
+      formData:{
+        page:1,
+        pageSize:5,
+        total:0,
+        type:tabs[0].type,
+        publishSort:publishSort[1].code,
+        ptId:0,
+        publishStatus:publishStatus[0].code,
+      },
+      loading:false,
+      list:[],
+      currentTaskId:0,
+      showTask:false,
+      showTaskEdit:false,
+    }
+  },
+  methods:{
+    getList(){
+      switch (this.formData.type){
+        case 'publish':
+          this.getPublishList()
+          break;
+        default:
+          this.getHall()
+      }
+    },
+    getPublishList(){
+      if (this.loading) return
+      let params = {
+        page:this.formData.page,
+        page_size:this.formData.pageSize,
+        order_by:this.formData.publishSort,
+        source_type:1,
+        status:this.formData.publishStatus,
+      }
+      if (this.formData.ptId) params.pt_id = this.formData.ptId
+      let self = this
+      self.loading = true
+      self.$axiosUser('get', '/api/pro/integral/task/publish/list', params)
+        .then(res => {
+          if (res.data.code !== 1) throw new Error(res.data.msg)
+          self.list = res.data.data.list
+          self.formData.total = res.data.data.total
+        })
+        .catch(err => {
+          self.$message.error(err)
+        })
+        .finally(() => {
+          self.loading = false
+        })
+    },
+    getHall(){
+      let params = {
+        page:this.formData.page,
+        page_size:this.formData.pageSize,
+        hall_type:this.formData.type
+      }
+      let self = this
+      self.loading = true
+      self.$axiosUser('get', '/api/pro/integral/task/hall', params)
+        .then(res => {
+          if (res.data.code !== 1) throw new Error(res.data.msg)
+          self.list = res.data.data.list
+          self.formData.total = res.data.data.total
+        })
+        .catch(err => {
+          self.$message.error(err)
+        })
+        .finally(() => {
+          self.loading = false
+        })
+    },
+    initPageData(){
+      this.formData.page = 1
+      this.formData.pageSize = 5
+      this.formData.total = 0
+    },
+    openTaskInfo(task){
+      this.currentTaskId = task.id
+      this.showTask = true
+    },
+    openTaskUpdate(task){
+      this.showTaskEdit = true
+      this.currentTaskId = task.id
+    },
+    taskDelete(task){
+      this.$message.closeAll()
+      let self = this
+      self.$confirm(
+        `删除此悬赏 (${task.task_name}) 将会删除其相关记录和积分数据,确认删除吗?`,
+        '删除悬赏',
+        {
+          confirmButtonText:'确定',
+          cancelButtonText:'取消',
+          type:'warning'
+        })
+        .then(() => {
+          self.loading = true
+          self.$axiosUser('DELETE','/api/pro/integral/task',{task_id:task.id})
+            .then(res => {
+              if (res.data.code !== 1) self.$message.error(res.data.msg)
+            })
+            .catch(err => {
+              self.$message.error(err)
+            })
+            .finally(() => {
+              self.loading = false
+              self.getList()
+            })
+        })
+    },
+  },
+  watch:{
+    'formData.type'(v){
+      this.initPageData()
+      this.getList()
+    },
+    'formData.page'(v){
+      this.getList()
+    },
+    'formData.publishSort'(v){
+      this.initPageData()
+      this.getList()
+    },
+    'formData.ptId'(v){
+      this.initPageData()
+      this.getList()
+    },
+    'formData.publishStatus'(v){
+      this.initPageData()
+      this.getList()
+    }
+  },
+  mounted(){
+    this.getList()
+  }
+}
+
+</script>
+
+<style scoped>
+.container{
+  width: 100%;
+  height: 100%;
+}
+.container .header{
+  min-height: 50px;
+}
+::v-deep .el-table tbody tr:hover{
+  cursor: pointer;
+}
+.el-dropdown-links {
+  font-size: 20px;
+  cursor: pointer;
+  color: #a6a8aa;
+}
+
+</style>

+ 458 - 0
src/components/workbench/work.vue

@@ -0,0 +1,458 @@
+<template>
+  <el-card class="container">
+    <template slot="header">
+      <el-row class="header" type="flex" justify="space-between" align="middle">
+        <el-col :span="4">
+          <el-tag effect="plain" size="medium">任务</el-tag>
+        </el-col>
+        <el-col :span="18">
+          <el-tabs v-model="formData.type">
+            <el-tab-pane
+              v-for="(item,index) in tabsOption"
+              :key="index"
+              :label="item.label"
+              :name="item.type"
+            />
+          </el-tabs>
+        </el-col>
+        <el-col :span="2">
+          <el-button icon="el-icon-refresh" type="text" :loading="loading" @click="getList" />
+        </el-col>
+      </el-row>
+      <el-form class="header" inline style="text-align: left">
+        <template v-if="['running','complete','reviewed','publish'].includes(formData.type)">
+          <el-form-item label-width="0">
+            <el-select v-model="formData.ptId">
+              <el-option
+                v-for="item in pts"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+              />
+            </el-select>
+          </el-form-item>
+        </template>
+        <template v-if="['running','complete','reviewed'].includes(formData.type)">
+          <el-form-item label-width="0">
+            <el-select v-model="formData.sort" placeholder="请选择排序">
+              <el-option
+                v-for="item in sort"
+                :key="item.id"
+                :label="item.name"
+                :value="item.code"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item v-if="formData.type === 'running'" label-width="0">
+            <el-select v-model="formData.today" placeholder="任务种类">
+              <el-option
+                v-for="item in workType"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+              />
+            </el-select>
+          </el-form-item>
+        </template>
+        <template v-else-if="formData.type === 'publish'">
+          <el-form-item label-width="0">
+            <el-select v-model="formData.workStatus">
+              <el-option
+                v-for="item in workStatus"
+                :key="item.id"
+                :label="item.name"
+                :value="item.code"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label-width="0">
+            <el-select v-model="formData.workSort">
+              <el-option
+                v-for="item in workSort"
+                :key="item.id"
+                :label="item.name"
+                :value="item.code"
+              />
+            </el-select>
+          </el-form-item>
+        </template>
+      </el-form>
+    </template>
+    <template slot="default">
+      <el-table
+        :height="300"
+        :max-height="300"
+        v-loading="loading"
+        :data="list"
+        @row-click="openDetail"
+      >
+        <el-table-column
+          label="内容"
+          align="center"
+          prop="task_name"
+          width="300"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="截止时间"
+          prop="expire_time"
+        />
+        <el-table-column
+          label="积分"
+          prop="point_config.base_point"
+        >
+          <template slot-scope="scope">
+            {{ scope.row.point_config.base_point }}&nbsp;{{ scope.row.pt_name }}
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="操作"
+          prop="owner_id"
+          v-if="['rewrite','running'].includes(formData.type)"
+        >
+          <template slot-scope="scope">
+            <el-link type="primary" @click.stop="completeWork(scope.row)">完成任务</el-link>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="操作"
+          prop="owner_id"
+          v-if="formData.type === 'publish'"
+        >
+          <template slot-scope="scope">
+            <el-dropdown placement="bottom" trigger="click" :show-timeout="150" :hide-timeout="150">
+              <span class="el-dropdown-links" @click.stop="">···</span>
+              <el-dropdown-menu slot="dropdown">
+                <el-dropdown-item v-if="scope.row.status === 1" >
+                  <el-button type="text" class="color-red" @click.stop="openWorkUpdate(scope.row)">修改</el-button>
+                </el-dropdown-item>
+                <el-dropdown-item class="color-red">
+                  <el-button type="text" class="color-red" @click.stop="workDelete(scope.row)" >删除</el-button>
+                </el-dropdown-item>
+              </el-dropdown-menu>
+            </el-dropdown>
+          </template>
+        </el-table-column>
+      </el-table>
+      <center style="padding: 20px 0;">
+        <el-pagination
+          small
+          layout="prev, pager, next"
+          :total="formData.total"
+          :page-size="formData.pageSize"
+          :current-page="formData.page"
+          @current-change="p => formData.page = p"
+        />
+      </center>
+
+<!--   任务详情   -->
+      <taskDetailsPopup style="text-align: left" :visible.sync="showDetail" v-if="showDetail" :id="currentWork.id" :title="'任务详情'" />
+      <WorkUpdate
+        style="text-align: left"
+        :task-visible.sync="showWorkEdit"
+        :work-id="currentWork.id"
+        @hasSubmit="getList"
+      />
+<!--   完成任务   -->
+      <el-dialog
+        :visible.sync="showComplete"
+        width="30%"
+        :close-on-click-modal="false"
+        :show-close="false"
+        center
+      >
+        <template slot="title">
+<!--          <h3 style="text-align: left">完成任务</h3>-->
+          <h3>{{currentWork.task_name}}</h3>
+          <div style="font-size: 13px;color: #898c94;line-height: 30px;" v-if="currentWork.task_remark">{{currentWork.task_remark}}</div>
+        </template>
+        <template slot="default">
+          <el-form label-width="80px" :model="completeFormData" @validate="(p, isValid,msg) => completeFormData.validate = isValid" v-loading="submitting">
+            <el-form-item prop="remark" label-width="0" :rules="[{required:true,message:'任务备注(限30字)'}]">
+              <el-input
+                v-model="completeFormData.remark"
+                type="textarea"
+                maxlength="30"
+                placeholder="任务备注"
+                show-word-limit
+                @input="onRemarkInput"
+                :disabled="submitting"
+              />
+            </el-form-item>
+          </el-form>
+        </template>
+        <template slot="footer">
+          <el-button @click="initCompleteData" :disabled="submitting">取消</el-button>
+          <el-button type="primary" @click="onCompleteSubmit" :disabled="!canCompleteSubmit">提交</el-button>
+        </template>
+      </el-dialog>
+    </template>
+  </el-card>
+</template>
+
+<script>
+import Template from "../../examine/components/Template.vue";
+import taskDetailsPopup from '@/point/views/common/taskDetailsPopup';
+import {specialFilter} from "../../utils";
+import WorkUpdate from "../../point/views/common/WorkUpdate.vue";
+
+export default {
+  name: 'workbenchWork',
+  components: {WorkUpdate, Template,taskDetailsPopup},
+  data(){
+    const tabs = [{ label: '进行中', type: 'running' },{ label: '驳回重做', type: 'rewrite' }, { label: '待审批', type: 'complete' }, { label: '已审批', type: 'reviewed' },{label: '我发布的',type: 'publish'}]
+    const pts = this.$getTyps()
+    pts.unshift({code:'all',id:0,name:'积分类型'})
+    const sort = [{ id: 2, code: 'publish', name: '按发布时间排序' },{ id: 1, code: 'expire', name: '按截止时间排序' }]
+    const workType = [{id:0,name:'全部任务'},{id:1,name:'今日任务'},{id:2,name:'逾期任务'},{id:3,name:'其他任务'}]
+    const workStatus = [
+      {id: 1, name: '全部', code: 'all'},
+      {id: 2, name: '进行中', code: 'running'},
+      {id: 3, name: '已完成', code: 'complete'},
+      {id: 4, name: '已审批', code: 'reviewed'},
+      {id: 5, name: '已撤销', code: 'revocation'},
+      {id: 6, name: '已退回', code: 'refuse'},
+    ]
+    const workSort = [{id:1,name:'按截止时间',code:'expire'},{id:2,name:'按发布时间',code:'publish'}]
+    return{
+      pts:pts,
+      tabsOption: tabs,
+      loading:false,
+      submitting:false,
+      sort:sort,
+      workType:workType,
+      workStatus:workStatus,
+      workSort:workSort,
+      formData:{
+        type:tabs[0].type,
+        ptId:0,
+        sort:sort[0].code,
+        page:1,
+        pageSize:5,
+        total:0,
+        today:workType[0].id,
+        workStatus:workStatus[0].code,
+        workSort:workSort[1].code
+      },
+      list:[],
+      showDetail:false,
+      currentWork:{
+        id:0,
+        task_name:'',
+        task_remark:'',
+      },
+      showComplete:false,
+      completeFormData:{
+        id:0,
+        remark:'',
+        validate:false,
+      },
+      showWorkEdit:false,
+    }
+  },
+  computed:{
+    canCompleteSubmit(){
+      return this.completeFormData.id > 0 && this.completeFormData.validate && !this.submitting
+    }
+  },
+  methods:{
+    openDetail(row){
+      this.currentWork = {
+        id:parseInt(row.id),
+        task_name:row.task_name,
+        task_remark:row.task_remark,
+      }
+      this.showDetail = true;
+    },
+    getList(){
+      switch (this.formData.type){
+        case 'publish':
+          this.publishList()
+          break;
+        default:
+          this.chargeList()
+      }
+    },
+    chargeList(){
+      if (this.loading) return
+      let params = {
+        page:this.formData.page,
+        page_size:this.formData.pageSize,
+        status:this.formData.type,
+        sort:this.formData.sort,
+        today:this.formData.today,
+      }
+      if (this.formData.ptId) params.pt_id = this.formData.ptId
+      let self = this
+      self.loading = true
+      self.$axiosUser('get', '/api/pro/integral/work/list', params)
+        .then(res => {
+          if (res.data.code !== 1) throw new Error(res.data.msg)
+          self.list = res.data.data.list
+          self.formData.total = res.data.data.total
+        })
+        .catch(err => {
+          self.$message.error(err)
+        })
+        .finally(() => {
+          self.loading = false
+        })
+    },
+    publishList(){
+      if (this.loading) return
+      let params = {
+        page:this.formData.page,
+        page_size:this.formData.pageSize,
+        status:this.formData.workStatus,
+        pt_id:this.formData.ptId,
+        sort:this.formData.workSort,
+      }
+      let self = this
+      self.loading = true
+      self.$axiosUser('get','/api/pro/integral/work/list/publisher',params)
+        .then(res => {
+          if (res.data.code !== 1) throw new Error(res.data.msg)
+          self.list = res.data.data.list
+          self.formData.total = res.data.data.total
+        })
+        .catch(err => {
+          self.$message.error(err)
+        })
+        .finally(() => {
+          self.loading = false
+        })
+    },
+    completeWork(row){
+      this.currentWork = {
+        id:row.id,
+        task_name:row.task_name,
+        task_remark:row.task_remark,
+      }
+      this.completeFormData = {
+        id:row.id,
+        remark:'',
+        validate:false,
+      }
+      this.showComplete = true
+    },
+    initCompleteData(){
+      this.showComplete = false
+      this.completeFormData = {
+        id:0,
+        remark:'',
+        validate:false,
+      }
+      this.currentWork = {
+        id:0,
+        task_name:'',
+        task_remark:'',
+      }
+      this.submitting = false
+    },
+    onRemarkInput(val){
+      this.completeFormData.remark = specialFilter(val)
+    },
+    onCompleteSubmit(){
+      let data = {
+        work_id: this.completeFormData.id,
+        progress:'100',
+        remark:this.completeFormData.remark,
+        state:'1'
+      }
+      let self = this
+      self.submitting = true
+      self.$axiosUser('post', '/api/pro/integral/work', data)
+        .then(res => {
+          if (res.data.code !== 1) throw new Error(res.data.msg)
+          self.initCompleteData()
+          self.getList()
+        })
+        .catch(err => {
+          self.$message.error(err)
+        })
+        .finally(() => {
+          self.submitting = false
+        })
+    },
+    initPageData(){
+      this.formData.page = 1
+      this.formData.pageSize = 5
+      this.formData.total = 5
+    },
+    openWorkUpdate(work){
+      this.showWorkEdit = true
+      this.currentWork = {
+        id:work.id,
+        task_name: work.task_name,
+        task_remark: work.task_remark
+      }
+    },
+    workDelete(work){
+      let self = this
+      self.$message.closeAll()
+      self.$confirm(`删除此任务 (${work.task_name}) 将会删除其相关记录和积分数据,确认删除吗?`, '删除任务', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        self.loading = true
+        self.$axiosUser('DELETE','/api/pro/integral/work',{work_id: work.id})
+          .then(res => {
+          if (res.data.code !== 1) self.$message.error(res.data.msg)
+        })
+          .finally(() => {
+            self.loading = false
+            self.getList()
+          })
+      })
+    }
+  },
+  watch:{
+    'formData.type'(v){
+      this.initPageData()
+      this.getList()
+    },
+    'formData.page'(v){
+      this.getList()
+    },
+    'formData.ptId'(v){
+      this.initPageData()
+      this.getList()
+    },
+    'formData.sort'(v){
+      this.initPageData()
+      this.getList()
+    },
+    'formData.today'(v){
+      this.initPageData()
+      this.getList()
+    },
+    'formData.workStatus'(v){
+      this.initPageData()
+      this.getList()
+    },
+    'formData.workSort'(v){
+      this.initPageData()
+      this.getList()
+    }
+  },
+  mounted() {
+    this.getList()
+  }
+}
+
+</script>
+
+<style scoped>
+.container{
+  width: 100%;
+  height: 100%;
+}
+.container .header{
+  min-height: 50px;
+}
+::v-deep .el-table tbody tr:hover{
+  cursor: pointer;
+}
+
+</style>

+ 44 - 21
src/point/views/common/TaskUpdate.vue

@@ -262,12 +262,14 @@ export default {
   },
   watch:{
     'formData.rule_type'(v){
-      if (!this.firstInit) this.initRuleData()
-      this.firstInit = false    //防止一进来就将规则选项重置
+      this.initRuleData()
+      // if (!this.firstInit) this.initRuleData()
+      // this.firstInit = false    //防止一进来就将规则选项重置
     },
     'formData.pt_id'(v){
-      if (!this.firstInit && this.formData.rule_type === 2) this.initRuleData()
-      this.firstInit = false    //防止一进来就将规则选项重置
+      this.initRuleData()
+      // if (!this.firstInit && this.formData.rule_type === 2) this.initRuleData()
+      // this.firstInit = false    //防止一进来就将规则选项重置
     },
 
   },
@@ -378,7 +380,7 @@ export default {
       if (this.taskId <= 0) return
       let self = this
       self.loading = true
-      self.firstInit = true
+      // self.firstInit = true
       let data = {
         task_id:this.taskId
       }
@@ -389,6 +391,7 @@ export default {
             return
           }
           let info = res.data.data
+
           let formData = {
             id:info.id,
             rule_type:0,
@@ -422,20 +425,20 @@ export default {
             ahead_award_point: info.point_config.ahead_award_point,
             ahead_award_point_limit: info.point_config.ahead_award_point_limit,
           }
-          if (info.item_info){
-            formData.rule_item = {
-              id:info.item_id,
-              remark:info.item_info.remark,
-              cycle_type: info.item_info.cycle_type,
-              is_attendance: info.item_info.is_attendance,
-              max_point: info.item_info.max_point,
-              min_point: info.item_info.min_point,
-              prize_type: info.item_info.prize_type,
-              pt_id: info.item_info.pt_id,
-              range_type: info.item_info.range_type,
-              rule_id: info.rule_id
-            }
-          }
+          // if (info.item_info){
+          //   formData.rule_item = {
+          //     id:info.item_id,
+          //     remark:info.item_info.remark,
+          //     cycle_type: info.item_info.cycle_type,
+          //     is_attendance: info.item_info.is_attendance,
+          //     max_point: info.item_info.max_point,
+          //     min_point: info.item_info.min_point,
+          //     prize_type: info.item_info.prize_type,
+          //     pt_id: info.item_info.pt_id,
+          //     range_type: info.item_info.range_type,
+          //     rule_id: info.rule_id
+          //   }
+          // }
           info.department_info.forEach((item,index) => {
 
             formData.dept_selected.dept.push({
@@ -449,6 +452,27 @@ export default {
 
           formData.rule_type = info.item_id && info.rule_id ? 2 : (info.rule_id ? 1 : 0)
           self.formData = formData
+
+          //防止一进来就将规则选项重置,等所有watch监听初始化后再对关键数据赋值,前提是这些关键数据不会watch变动
+          self.$nextTick(() => {
+            if (info.item_info){
+              self.formData.rule_item = {
+                id:info.item_id,
+                remark:info.item_info.remark,
+                cycle_type: info.item_info.cycle_type,
+                is_attendance: info.item_info.is_attendance,
+                max_point: info.item_info.max_point,
+                min_point: info.item_info.min_point,
+                prize_type: info.item_info.prize_type,
+                pt_id: info.item_info.pt_id,
+                range_type: info.item_info.range_type,
+                rule_id: info.rule_id
+              }
+            }
+            self.formData.base_point = info.point_config.base_point
+            self.formData.rule_id = info.rule_id
+            self.formData.item_id = info.item_id
+          })
         })
         .catch(err => {
           self.$message.error(err)
@@ -520,8 +544,7 @@ export default {
           self.$message.success(res.data.msg)
           self.close()
         })
-        .catch(err => {
-          self.$message.error(err)
+        .finally(() => {
           self.loading = false
         })
 

+ 45 - 21
src/point/views/common/WorkUpdate.vue

@@ -253,12 +253,14 @@ export default {
   },
   watch:{
     'formData.rule_type'(val,old) {
-      if (!this.firstInit) this.initRuleData()
-      this.firstInit = false    //防止一进来就将规则选项重置
+      this.initRuleData()
+      // if (!this.firstInit) this.initRuleData()
+      // this.firstInit = false    //防止一进来就将规则选项重置
     },
     'formData.pt_id'(val,old){
-      if (!this.firstInit && this.formData.rule_type === 2) this.initRuleData()
-      this.firstInit = false    //防止一进来就将规则选项重置
+      this.initRuleData()
+      // if (!this.firstInit && this.formData.rule_type === 2) this.initRuleData()
+      // this.firstInit = false    //防止一进来就将规则选项重置
     }
   },
   computed:{
@@ -302,7 +304,7 @@ export default {
       if (this.workId <= 0) return
       let self = this
       self.loading = true
-      self.firstInit = true
+      // self.firstInit = true
       let data = {
         work_id: this.workId
       }
@@ -344,26 +346,49 @@ export default {
             ahead_award_point: info.point_config.ahead_award_point || '',
             ahead_award_point_limit: info.point_config.ahead_award_point_limit || '',
           }
-          if (info.item_info){
-            formData.rule_item = {
-              id:info.item_id,
-              remark:info.item_info.remark,
-              cycle_type: info.item_info.cycle_type,
-              is_attendance: info.item_info.is_attendance,
-              max_point: info.item_info.max_point,
-              min_point: info.item_info.min_point,
-              prize_type: info.item_info.prize_type,
-              pt_id: info.item_info.pt_id,
-              range_type: info.item_info.range_type,
-            }
-          }
+          // if (info.item_info){
+          //   formData.rule_item = {
+          //     id:info.item_id,
+          //     remark:info.item_info.remark,
+          //     cycle_type: info.item_info.cycle_type,
+          //     is_attendance: info.item_info.is_attendance,
+          //     max_point: info.item_info.max_point,
+          //     min_point: info.item_info.min_point,
+          //     prize_type: info.item_info.prize_type,
+          //     pt_id: info.item_info.pt_id,
+          //     range_type: info.item_info.range_type,
+          //   }
+          // }
           formData.rule_type = info.item_id && info.rule_id ? 2 : (info.rule_id ? 1 : 0)
           self.formData = formData
-          self.loading = false
+
+          //防止一进来就将规则选项重置,等所有watch监听初始化后再对关键数据赋值,前提是这些关键数据不会watch变动
+          self.$nextTick(() => {
+            if (info.item_info){
+              self.formData.rule_item = {
+                id:info.item_id,
+                remark:info.item_info.remark,
+                cycle_type: info.item_info.cycle_type,
+                is_attendance: info.item_info.is_attendance,
+                max_point: info.item_info.max_point,
+                min_point: info.item_info.min_point,
+                prize_type: info.item_info.prize_type,
+                pt_id: info.item_info.pt_id,
+                range_type: info.item_info.range_type,
+              }
+            }
+            self.formData.base_point = info.point_config.base_point
+            self.formData.rule_id = info.rule_id
+            self.formData.item_id = info.item_id
+          })
+
         })
         .catch(err => {
           self.$message.error(err)
         })
+        .finally(() => {
+          self.loading = false
+        })
     },
     getRuleList(){
       let data = {
@@ -535,8 +560,7 @@ export default {
               self.$message.success(res.data.msg)
               self.$emit('update:taskVisible',false)
             })
-            .catch(err => {
-              self.$message.error(err)
+            .finally(() => {
               self.loading = false
             })
 

+ 1 - 1
src/point/views/common/bonusPointsPopup.vue

@@ -694,7 +694,7 @@ export default {
       this.webSocket(data);
       return false
       this.$axiosUser('post',this.ptId === 2 ? '/api/pro/integral/review/a/entry' : '/api/pro/integral/point/entry', data).then(res => {
-        if (res.data.code == 1) {
+        if (res.data.code === 1) {
           this.$refs['dialogData'].resetFields();
           this.$emit('update:refresh',this.$moment().format().valueOf());
           this.$message.success(res.data.msg);

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

@@ -502,6 +502,10 @@ export default {
     title: {
       type: String,
       default: ''
+    },
+    refreshParentList:{
+      type: Boolean,
+      default: true
     }
   },
   watch: {
@@ -612,7 +616,8 @@ export default {
                 setTimeout(() => {
                   this.detail_loading = false;
                 }, 200);
-                this.$parent.get_list(); //刷新列表
+                if (this.refreshParentList) this.$parent.get_list(); //刷新列表
+                this.$emit('hasSubmit')
               }
             })
             .finally(() => {
@@ -765,7 +770,8 @@ export default {
                   this.rejectLoading = false;
                 }, 200);
                 this.closeDetail(); //关闭抽屉
-                this.$parent.get_list(); //刷新列表
+                if (this.refreshParentList) this.$parent.get_list(); //刷新列表
+                this.$emit('hasSubmit')
               } else {
                 self.$message.error(res.data.msg);
                 this.rejectLoading = false;
@@ -896,7 +902,8 @@ export default {
                 self.$message.success(res.data.msg);
                 this.adoptClose(); //关闭通过弹窗
                 this.closeDetail(); //关闭抽屉
-                this.$parent.get_list(); //刷新列表
+                if (this.refreshParentList) this.$parent.get_list(); //刷新列表
+                this.$emit('hasSubmit')
               }
             })
             .finally(e => {
@@ -919,7 +926,8 @@ export default {
             self.formRejectRewrite.remark = ''
             self.showRejectRewrite = false
             self.closeDetail()
-            self.$parent.get_list()
+            if (self.refreshParentList) self.$parent.get_list()
+            self.$emit('hasSubmit')
           } else {
             self.$message.error(res.data.msg)
           }

+ 8 - 3
src/point/views/common/rewardTask.vue

@@ -225,7 +225,11 @@ export default {
     showTitle: {
       type: String,
       default: ''
-    }
+    },
+    refreshParentList:{
+      type: Boolean,
+      default: true
+    },
   },
   data() {
     return {
@@ -507,6 +511,7 @@ export default {
 
       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);
+            this.$emit("hasSubmit")
             if(this.formData.task_cycle&&is){//是否重复任务
             	let str=this.formData.task_cycle==1? '您发布的每日重复任务将于明天0点执行自动发布,是否需要立即发布一条任务?':this.formData.task_cycle==2? '您发布的每周重复任务将于下周一执行自动发布,是否需要立即发布一条任务?':'您发布的每月重复任务将于下个月1号执行自动发布,是否需要立即发布一条任务?'
             	this.$confirm(str, '提示', {
@@ -516,11 +521,11 @@ export default {
             	}).then(() => {
             		this.executeTask(res.data.data)
             	}).catch(() => {
-            		this.$parent.get_list();
+            		if (this.refreshParentList) this.$parent.get_list();
                 this.closeData();
             	});
             }else{
-            	this.$parent.get_list();
+              if (this.refreshParentList) this.$parent.get_list();
               this.closeData();
             }
       }).finally(() => {

+ 2 - 3
src/point/views/common/taskDetailsPopup.vue

@@ -230,10 +230,9 @@
       </span>
     </el-dialog>
     <!-- 记一条 -->
-    <el-dialog :close-on-click-modal="false" title="记一条" :visible.sync="isOne" :before-close="publicClose" width="40%">
+    <el-dialog :close-on-click-modal="false" title="记一条" :visible.sync="isOne" :before-close="publicClose" width="30%">
       <div class="flex-box">
-        <div style="width: 80px;">工作记录</div>
-        <el-input type="textarea" :rows="3" placeholder="请输入内容" v-model="textarea" @input="onTextareaInput"></el-input>
+        <el-input type="textarea" :rows="3" placeholder="工作记录" v-model="textarea" @input="onTextareaInput"></el-input>
       </div>
       <span slot="footer">
         <el-button @click="publicClose()">取消</el-button>

+ 245 - 0
src/point/views/common/taskInfo.vue

@@ -0,0 +1,245 @@
+<template>
+  <el-dialog
+    title="悬赏信息"
+    :visible.sync="show"
+    :show-close="false"
+    :close-on-click-modal="false"
+    top="5%"
+    @open="openedHandler"
+    @close="closedHandler"
+  >
+    <el-card shadow="always" v-if="taskInfo">
+      <template slot="header">
+        <div class="flex-box-ce">
+          <userImage
+            :user_name="taskInfo.status === 1 ? taskInfo.owner_name : taskInfo.receiver_name"
+            :id="taskInfo.status === 1 ? taskInfo.owner_id : taskInfo.receiver_id"
+            :img_url="taskInfo.status === 1 ? taskInfo.owner_img_url : taskInfo.receiver_img_url"
+            class="fl"
+            width="30px"
+            height="30px"
+            fontSize="15"
+          />
+          <div style="margin-left: 10px;">
+            {{taskInfo.owner_name}}
+            {{ $getTypsName(taskInfo.pt_id) }}任务
+            <el-tag>{{ taskInfo.point_config.base_point }}分</el-tag>
+            <el-tag type="info">{{ taskInfo.receiver_name }}{{ taskInfo.status_mark }}</el-tag>
+          </div>
+        </div>
+      </template>
+      <el-descriptions
+        title="任务信息"
+        direction="vertical"
+        :column="3"
+        size="small"
+        :label-style="{width:'80px',textAlign:'center'}"
+        :content-style="{width:'80px',textAlign: 'center'}"
+        border
+      >
+        <el-descriptions-item label="任务内容">{{taskInfo.task_name}}</el-descriptions-item>
+        <el-descriptions-item
+          v-if="taskInfo.receiver_id !== 0"
+          :label="taskInfo.status === 3 ? '完成人' : '领取人'"
+        >
+          {{taskInfo.receiver_name}}
+        </el-descriptions-item>
+        <el-descriptions-item
+          v-if="taskInfo.task_remark"
+          label="任务备注"
+        >
+          {{taskInfo.task_remark}}
+        </el-descriptions-item>
+        <el-descriptions-item
+          v-if="taskInfo.point_config"
+          label="任务积分"
+        >
+          {{ taskInfo.point_config.base_point }}{{ $getTypsName(taskInfo.pt_id) }}
+        </el-descriptions-item>
+        <el-descriptions-item label="发布时间">{{taskInfo.create_time}}</el-descriptions-item>
+        <el-descriptions-item label="截止时间">{{taskInfo.end_time}}</el-descriptions-item>
+        <el-descriptions-item
+          v-if="taskInfo.point_config && taskInfo.point_config.timeout_deduction_point"
+          label="逾期扣分"
+        >
+          {{ taskInfo.point_config.timeout_deduction_point }}/天
+        </el-descriptions-item>
+        <el-descriptions-item
+          v-if="taskInfo.point_config && taskInfo.point_config.ahead_award_point"
+          label="提前奖分"
+        >
+          {{ taskInfo.point_config.ahead_award_point }}/天
+        </el-descriptions-item>
+        <el-descriptions-item
+          v-if="taskInfo.department_info"
+          label="可见范围"
+        >
+          <div class="content_text" v-if="taskInfo.department_info.length > 0">
+                <span
+                  v-for="(item, index) in taskInfo.department_info"
+                  :key="index"
+                >
+                  {{ item.name }}&nbsp;
+                </span>
+          </div>
+          <div v-else >
+            <el-tag>全公司可见</el-tag>
+          </div>
+        </el-descriptions-item>
+        <el-descriptions-item
+          v-if="taskInfo.reviewer_name"
+          label="审批人"
+        >
+          {{taskInfo.reviewer_name}}
+        </el-descriptions-item>
+        <el-descriptions-item label="任务类型">{{ taskInfo.source_type_mark }}</el-descriptions-item>
+      </el-descriptions>
+
+      <el-descriptions
+        v-if="taskInfo.item_info"
+        style="margin-top: 20px"
+        title="规则依据"
+        direction="vertical"
+        :column="2"
+        size="small"
+        :label-style="{width:'80px',textAlign:'center'}"
+        :content-style="{width:'80px',textAlign: 'center'}"
+        border
+      >
+        <el-descriptions-item label="规则">{{taskInfo.item_info.remark}}</el-descriptions-item>
+        <el-descriptions-item label="积分">{{pointRemark}}</el-descriptions-item>
+        <el-descriptions-item label="规则状态" v-if="taskInfo.item_info.has_delete">
+          <el-tag type="warning">规则已删除</el-tag>
+        </el-descriptions-item>
+        <el-descriptions-item v-if="taskInfo.rule_info" label="分类">{{taskInfo.rule_info.name}}</el-descriptions-item>
+        <el-descriptions-item v-if="taskInfo.rule_info && taskInfo.rule_info.has_delete" label="分类状态">
+          <el-tag type="warning">分类已删除</el-tag>
+        </el-descriptions-item>
+      </el-descriptions>
+
+      <el-descriptions
+        v-else-if="taskInfo.rule_info"
+        style="margin-top: 20px"
+        title="规则分类"
+        direction="vertical"
+        :column="2"
+        size="small"
+        :label-style="{width:'80px',textAlign:'center'}"
+        :content-style="{width:'80px',textAlign: 'center'}"
+        border
+      >
+        <el-descriptions-item label="分类">{{taskInfo.rule_info.name}}</el-descriptions-item>
+        <el-descriptions-item label="分类状态" v-if="taskInfo.rule_info.has_delete">
+          <el-tag type="warning">分类已删除</el-tag>
+        </el-descriptions-item>
+      </el-descriptions>
+
+      <div class="drawer-footer flex-box-end flex-v-ce">
+        <el-button plain @click="closedHandler" :loading="submitting" >取消</el-button>
+        <el-button type="primary" :loading="submitting" @click="catchTask" v-if="canCatch" >领取任务</el-button>
+      </div>
+    </el-card>
+    <no-data class="center" v-else />
+  </el-dialog>
+</template>
+
+<script>
+
+import Template from "../../../examine/components/Template.vue";
+
+export default {
+  name: 'taskInfo',
+  components: {Template},
+  props:{
+    taskId:{
+      type: Number,
+      default: 0
+    },
+    show:{
+      type: Boolean,
+      default: false
+    }
+  },
+  data(){
+    return {
+      loading:false,
+      taskInfo:null,
+      hasSubmit:false,
+      hasOpen:false,
+      submitting:false,
+    }
+  },
+  computed:{
+    pointRemark(){
+      if (!(this.taskInfo && this.taskInfo.item_info)) return ''
+      return this.taskInfo.item_info.range_type === 1 ? `${this.taskInfo.item_info.min_point} ${this.$getTypsName(this.taskInfo.item_info.pt_id)}` : `${this.taskInfo.item_info.min_point} -- ${this.taskInfo.item_info.max_point} ${this.$getTypsName(this.taskInfo.item_info.pt_id)}`
+    },
+    canCatch(){
+      return this.taskInfo.status === 1 && this.$userInfo().id !== this.taskInfo.owner_id && this.$userInfo().id !== this.taskInfo.reviewer_id
+    }
+  },
+  methods:{
+    initData(){
+      this.taskInfo = null
+      this.hasSubmit = false
+      this.hasOpen = false
+      this.submitting = false
+    },
+    getTaskInfo(){
+      let params = {
+        task_id: this.taskId
+      }
+      let self = this
+      self.loading = true
+      self.$axiosUser('get', '/api/pro/integral/task', params)
+        .then(res => {
+          if (res.data.code !== 1) throw new Error(res.data.msg)
+          self.taskInfo = res.data.data
+        })
+        .catch(err => {
+          self.$message.error(err)
+        })
+        .finally(() => {
+          self.loading = false
+        })
+    },
+    openedHandler() {
+      this.initData()
+      this.hasOpen = true
+      this.getTaskInfo()
+    },
+    closedHandler(){
+      this.$emit('update:show', false);
+    },
+    catchTask(){
+      let self = this
+      self.submitting = true
+      self.$axiosUser('POST', '/api/pro/integral/task', { task_id: self.taskInfo.id })
+        .then(res => {
+          if (res.data.code !== 1) throw new Error(res.data.msg)
+          self.hasSubmit = true
+          self.getTaskInfo()
+          self.$emit('update:task')
+        })
+        .catch(err => {
+          self.$message.error(err)
+        })
+        .finally(() => {
+          self.submitting = false
+        })
+    }
+  }
+}
+</script>
+
+<style scoped>
+.drawer-footer {
+  background-color: #fff;
+  border-top: 1px solid #ebebeb;
+  padding: 10px 20px;
+  font-size: 14px;
+}
+.center{
+  margin-top: calc(100vh * 0.3);
+}
+</style>

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

@@ -225,7 +225,11 @@ export default {
     showTitle: {
       type: String,
       default: ''
-    }
+    },
+    refreshParentList:{
+      type: Boolean,
+      default: true
+    },
   },
   data() {
     return {
@@ -511,6 +515,7 @@ export default {
 
       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.$emit("hasSubmit")
           this.closeDialog();
           if(this.formData.task_cycle&&is){//是否重复任务
           	let str=this.formData.task_cycle==1? '您发布的每日重复任务将于明天0点执行自动发布,是否需要立即发布一条任务?':this.formData.task_cycle==2? '您发布的每周重复任务将于下周一执行自动发布,是否需要立即发布一条任务?':'您发布的每月重复任务将于下个月1号执行自动发布,是否需要立即发布一条任务?'
@@ -521,13 +526,14 @@ export default {
           	}).then(() => {
           		this.executeTask(res.data.data)
           	}).catch(() => {
-          		this.$parent.get_list();
+          		if (this.refreshParentList) this.$parent.get_list();
               this.closeData();
           	});
           }else{
-          	this.$parent.get_list();
+            if (this.refreshParentList) this.$parent.get_list();
             this.closeData();
           }
+
       })
     },
     closeData(){;

+ 3 - 1
src/point/views/pointIndex.vue

@@ -8,7 +8,8 @@
                 <el-menu :default-active="defaultActive" class="el-menu-vertical-demo" ref="elMenu" :router="true" @select="activeRouter" :unique-opened="true">
                   <template v-for="(item, index) in routers">
                     <div v-if="item.children.length != 0" :key="index">
-                      <el-submenu :index="index.toString()" :key="index" v-if="item.children.length >= 1 && item.name != '首页'">
+<!--                      <el-submenu :index="index.toString()" :key="index" v-if="item.children.length >= 1 && item.name != '首页'">-->
+                      <el-submenu :index="index.toString()" :key="index" v-if="item.children.length >= 1 && !['首页','工作台'].includes(item.name)">
                         <template slot="title">
                           <div class="flex-box-ce">
                             <svg-icon :icon-class="item.icon" class="svgIcon"></svg-icon>
@@ -79,6 +80,7 @@ export default {
         setTimeout(()=>{
           this.routers = [
             { name: '首页', children: this.returnRoutersArr('home'), icon: '#icon-shezhi_qiyexinxi' },
+            { name: '工作台', children: this.returnRoutersArr('workbench'), icon: '#icon-biaoqian_guanlizhongxin' },
             { name: '基础设置', children: this.returnRoutersArr('basics'), icon: '#icon-shezhi_jichushezhi' },
             { name: '积分管理', children: this.returnRoutersArr('integral'), icon: '#icon-PC_gongzuotai_ABfen' },
             { name: '任务管理', children: this.returnRoutersArr('task'), icon: '#icon-tongji_jifenshijian1' },

+ 201 - 0
src/point/views/workbench.vue

@@ -0,0 +1,201 @@
+<template>
+  <div class="job-container">
+    <div class="breadcrumb">
+      <el-row align="middle" justify="space-around" type="flex">
+        <el-col :span="4">
+          <el-breadcrumb separator="/">
+            <el-breadcrumb-item :to="{path:'/pointHome'}">首页</el-breadcrumb-item>
+            <el-breadcrumb-item>工作台</el-breadcrumb-item>
+          </el-breadcrumb>
+        </el-col>
+        <el-col :span="10"/>
+        <el-col :span="10">
+          <el-row align="middle" justify="end" type="flex">
+            <el-col :span="4" v-if="canPointEntry"><el-button type="primary" size="small" @click="openPointEntryB">B分奖扣</el-button></el-col>
+            <el-col :span="4" v-if="canPointEntry"><el-button type="primary" size="small" @click="openPointEntryA">A分奖扣</el-button></el-col>
+            <el-col :span="4" v-if="canPointApply"><el-button type="primary" size="small" @click="openPointApply">积分申请</el-button></el-col>
+            <el-col :span="4"><el-button type="primary" size="small" :disabled="!siteConfig || siteConfig.appeal !== 1" @click="openPointAppeal">积分申诉</el-button></el-col>
+            <el-col :span="4" v-if="canJobPublish"><el-button type="primary" size="small" @click="openWorkPublish">发布任务</el-button></el-col>
+            <el-col :span="4" v-if="canJobPublish"><el-button type="primary" size="small" @click="openTaskPublish">发布悬赏</el-button></el-col>
+          </el-row>
+        </el-col>
+      </el-row>
+    </div>
+    <div class="content">
+      <div class="width-100 height-100 flex-box flex-d-wrap flex-dv-center" style="align-items: stretch;">
+        <template v-if="$supremeAuthority() === 'creator'">
+          <div class="content-item"><Review ref="reviewModule"/></div>
+          <div class="content-item"><Appeal ref="appealModule"/></div>
+          <div class="content-item"><Task ref="taskModule"/></div>
+          <div class="content-item"><Work ref="workModule"/></div>
+          <div class="content-item"><Schedule ref="scheduleModule"/></div>
+        </template>
+        <template v-else-if="$supremeAuthority() === 'employee'">
+          <div class="content-item"><Work ref="workModule"/></div>
+          <div class="content-item"><Appeal ref="appealModule"/></div>
+          <div class="content-item"><Task ref="taskModule"/></div>
+          <div class="content-item"><Review ref="reviewModule"/></div>
+          <div class="content-item"><Schedule ref="scheduleModule"/></div>
+        </template>
+        <template v-else>
+          <div class="content-item"><Review ref="reviewModule"/></div>
+          <div class="content-item"><Appeal ref="appealModule"/></div>
+          <div class="content-item"><Work ref="workModule"/></div>
+          <div class="content-item"><Task ref="taskModule"/></div>
+          <div class="content-item"><Schedule ref="scheduleModule"/></div>
+        </template>
+        <div class="content-item"></div>
+      </div>
+    </div>
+    <div style="text-align: left">
+      <bonusPointsPopup :title="pointEntryTitle" :visible.sync="showPointEntry" :pt-id="pointEntryPtId" />
+      <applicationIntegrationPopup title="申请积分" :visible.sync="showPointApply"/>
+      <AppealCreate :visible.sync="showPointAppeal" @createFinish="onAppealCreateFinish"/>
+      <temporaryTask :refreshParentList="false" :dialogVisible.sync="showWorkPublish" :showTitle="'发布任务'" @hasSubmit="onWorkPublishFinish" />
+      <rewardTask :refreshParentList="false" :dialogVisible.sync="showTaskPublish" :showTitle="'发布悬赏'" @hasSubmit="onTaskPublishFinish" />
+    </div>
+  </div>
+</template>
+
+<script>
+import Work from "../../components/workbench/work.vue"
+import Review from "../../components/workbench/review.vue"
+import Appeal from "../../components/workbench/appeal.vue"
+import Task from "../../components/workbench/task.vue"
+import Schedule from "../../components/workbench/Schedule.vue"
+import bonusPointsPopup from '@/point/views/common/bonusPointsPopup'
+import applicationIntegrationPopup from "@/point/views/common/applicationIntegrationPopup"
+import AppealCreate from "../../components/AppealCreate.vue"
+import temporaryTask from '@/point/views/common/temporaryTask'
+import rewardTask from '@/point/views/common/rewardTask'
+import {supremeAuthority} from "../../utils/auth";
+import Template from "../../examine/components/Template.vue";
+
+export default {
+  name: 'workbench',
+  components: {
+    Template,
+    AppealCreate,
+    Schedule,
+    Appeal,
+    Work,
+    Review,
+    Task,
+    bonusPointsPopup,
+    applicationIntegrationPopup,
+    temporaryTask,
+    rewardTask,
+  },
+  data(){
+    return{
+      showPointEntry: false,
+      refreshPointEntry:'',
+      pointEntryTitle:'标题',
+      pointEntryPtId:0,
+      showPointApply: false,
+      showPointAppeal: false,
+      showWorkPublish: false,
+      showTaskPublish: false,
+      siteConfig:null,
+    }
+  },
+  computed:{
+    canPointEntry(){
+      return ['creator', 'admin', 'point_manager', 'dept_manager'].includes(this.$supremeAuthority())
+    },
+    canPointApply(){
+      return ['admin', 'point_manager', 'dept_manager', 'employee'].includes(this.$supremeAuthority())
+    },
+    canJobPublish(){
+      return this.canPointEntry
+    },
+  },
+  methods:{
+    openPointEntryA(){
+      this.pointEntryPtId = 2
+      this.pointEntryTitle = 'A分奖扣'
+      this.showPointEntry = true
+    },
+    openPointEntryB(){
+      this.pointEntryPtId = 3
+      this.pointEntryTitle = 'B分奖扣'
+      this.showPointEntry = true
+    },
+    openPointApply(){
+      this.showPointApply = true
+    },
+    openPointAppeal(){
+      this.showPointAppeal = true
+    },
+    openWorkPublish(){
+      this.showWorkPublish = true
+    },
+    openTaskPublish(){
+      this.showTaskPublish = true
+    },
+    onAppealCreateFinish(){
+      this.$refs['appealModule'].getList()
+    },
+    onPointApplyFinish(){
+      this.$refs['reviewModule'].getList()
+    },
+    onWorkPublishFinish(){
+      this.$refs['workModule'].getList()
+      this.$refs['scheduleModule'].getList()
+    },
+    onTaskPublishFinish(){
+      this.$refs['taskModule'].getList()
+      this.$refs['scheduleModule'].getList()
+    },
+    getSiteConfig(){
+      let self = this
+      this.$axiosUser('get','/api/pro/integral/site/config')
+        .then(res => {
+          if (res.data.code === 1) self.siteConfig = res.data.data
+        })
+    }
+  },
+  watch:{
+    showPointApply(v){
+      if (!v) this.onPointApplyFinish()
+    },
+    // showWorkPublish(v){
+    //   if (!v) this.onWorkPublishFinish()
+    // },
+    // showTaskPublish(v){
+    //   if (!v) this.onTaskPublishFinish()
+    // }
+  },
+  mounted() {
+    this.getSiteConfig()
+  },
+}
+
+</script>
+
+<style scoped>
+.job-container{
+  width: 100%;
+  min-height: 100%;
+  background-color: white;
+  text-align: center;
+}
+.job-container .breadcrumb{
+  height: 5%;
+  width: 100%;
+  padding-left: 30px;
+  padding-top: 20px;
+}
+.job-container .content{
+  height: 95%;
+  width: 100%;
+  padding: 20px 5px 10px 5px;
+}
+.job-container .content .content-item{
+  width: 45%;
+  margin-top: 5px;
+  margin-bottom: 10px;
+  /*background-color: #00C4CB;*/
+}
+
+</style>

+ 9 - 1
src/router/index.js

@@ -49,6 +49,14 @@ const constantRouterMap = [
               groupCode: 'home'
             }
           },
+          {
+            path: '/workbench',
+            name: '工作台',
+            component: () => import( /* webpackChunkName: "home" */ '@/point/views/workbench'),
+            meta: {
+              groupCode: 'workbench'
+            }
+          },
           {
             path: '/jfRule',
             name: '积分规则',
@@ -355,7 +363,7 @@ const constantRouterMap = [
           },
           {
             path: '/custom_rank',
-            name: '自定义B分排名',
+            name: '自定义排名',
             component: () => import('@/point/views/statistics/custom_rank'),
             meta: {
               groupCode: 'statistics'

+ 7 - 0
src/styles/index.scss

@@ -701,3 +701,10 @@ code {
 .el-dialog__body p{
   margin:10px 0;
 }
+
+.width-100{
+  width: 100%;
+}
+.height-100{
+  height: 100%;
+}