walter 8 月之前
父節點
當前提交
c1fc8c9298
共有 40 個文件被更改,包括 5877 次插入680 次删除
  1. 221 0
      src/components/AppealCreate.vue
  2. 270 0
      src/components/AppealRewrite.vue
  3. 365 0
      src/components/IntegralEventSelector.vue
  4. 58 22
      src/components/SelectRule.vue
  5. 71 32
      src/components/Steps.vue
  6. 1 1
      src/home.vue
  7. 1 1
      src/performance/components/flow/Examine.vue
  8. 1 1
      src/performance/views/assessManagement/IndexSet.vue
  9. 4 1
      src/point/views/attendance/attendance_dutynew.vue
  10. 1 1
      src/point/views/attendance/attendance_groupnew.vue
  11. 1 1
      src/point/views/attendance/attendance_machinenew.vue
  12. 742 0
      src/point/views/common/AppealPopup.vue
  13. 564 0
      src/point/views/common/TaskUpdate.vue
  14. 566 0
      src/point/views/common/WorkUpdate.vue
  15. 14 4
      src/point/views/common/applicationIntegrationPopup.vue
  16. 17 5
      src/point/views/common/bonusPointsPopup.vue
  17. 292 72
      src/point/views/common/examinePopup.vue
  18. 267 84
      src/point/views/common/repeatTaskDetailsPopup.vue
  19. 196 21
      src/point/views/common/rewardTask.vue
  20. 13 2
      src/point/views/common/rewardTaskAmend.vue
  21. 199 61
      src/point/views/common/rewardTaskDetailsPopup.vue
  22. 166 68
      src/point/views/common/taskDetailsPopup.vue
  23. 195 20
      src/point/views/common/temporaryTask.vue
  24. 14 3
      src/point/views/common/temporaryTaskAmend.vue
  25. 100 16
      src/point/views/pointHome.vue
  26. 12 2
      src/point/views/setting/fixed_integral.vue
  27. 12 12
      src/point/views/setting/pk.vue
  28. 16 2
      src/point/views/setting/rule_manage.vue
  29. 24 10
      src/point/views/setting/set_basics.vue
  30. 435 0
      src/point/views/statistics/appeal.vue
  31. 559 91
      src/point/views/statistics/integral_event.vue
  32. 176 38
      src/point/views/workbench/approval_list.vue
  33. 1 2
      src/point/views/workbench/grade/apply_list.vue
  34. 2 2
      src/point/views/workbench/grade/award_punish.vue
  35. 1 1
      src/point/views/workbench/task/allTask.vue
  36. 209 68
      src/point/views/workbench/task/get_task.vue
  37. 47 25
      src/point/views/workbench/task/my_issue.vue
  38. 31 11
      src/point/views/workbench/task/my_task.vue
  39. 8 0
      src/router/index.js
  40. 5 0
      src/utils/index.js

+ 221 - 0
src/components/AppealCreate.vue

@@ -0,0 +1,221 @@
+<template>
+  <el-dialog
+    :title="title"
+    :visible.sync="visible"
+    :modal="false"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    :center="true"
+    :show-close="false"
+    :before-close="beforeCloseHandler"
+    @open="openHandler"
+    @close="closeHandler"
+    append-to-body
+    width="600px"
+    top="1%"
+  >
+
+    <template>
+      <el-form v-model="rewriteData" v-loading="loading">
+        <el-form-item label="审批人" required>
+          <el-input class="w250" autocomplete="off" v-model="rewriteData.reviewerName" placeholder="请选择审批人" />
+          <div @click="showReviewerSelector = true" style="position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
+          <EmployeeSelector
+            :multi="false"
+            :user_employee_list="true"
+            :isChecKedAll="false"
+            :is_filtration_creator="false"
+            :employee_list="superiorList"
+            :selected="rewriteData.employeeSelected"
+            :visible.sync="showReviewerSelector"
+            @confirm="handleRewriteReviewerSelector"
+          />
+        </el-form-item>
+        <el-form-item label="原因说明">
+          <el-input type="textarea" :rows="2" placeholder="填写原因说明" v-model="rewriteData.globalRemark" maxlength="100" show-word-limit @input="onGlobalRemarkInput" />
+        </el-form-item>
+        <el-form-item label="积分事件" required>
+        </el-form-item>
+        <el-card>
+          <div slot="header">
+            <span>共{{rewriteData.events.length}}条积分事件</span>
+            <el-button @click="openEventSelected" type="primary" size="mini" >选择积分事件</el-button>
+          </div>
+          <IntegralEventSelector
+            :visible.sync="showEventSelector"
+            :title="userInfo.name + '的积分事件'"
+            :eid="userInfo.id"
+            :selected="eventSelected"
+            :max="100"
+            @confirm="onEventSelected"
+          />
+          <el-scrollbar
+            :native="false"
+            style="height: 300px"
+          >
+            <el-form-item v-for="(item,index) in rewriteData.events" :key="index">
+              <el-tag closable @close="deleteEvent(item)">{{item.remark}}</el-tag>
+              <el-input type="textarea" :rows="2" v-model="item.appeal_remark" placeholder="申诉原因" maxlength="100" show-word-limit @input="onEventRemarkInput(item)" />
+            </el-form-item>
+          </el-scrollbar>
+        </el-card>
+      </el-form>
+    </template>
+
+    <template slot="footer">
+      <div class="flex-box-end flex-v-ce">
+        <el-button @click="close" :loading="submitting || !hasOpen">关闭</el-button>
+        <el-button type="primary" @click="createAppeal" :loading="submitting || !hasOpen" :disabled="!canSubmit">确认</el-button>
+      </div>
+    </template>
+
+  </el-dialog>
+</template>
+
+<script>
+import IntegralEventSelector from './IntegralEventSelector.vue'
+import Template from "../examine/components/Template.vue";
+import EmployeeSelector from "./EmployeeSelector.vue";
+import {specialFilter} from "../utils";
+export default {
+  name: 'AppealCreate',
+  components:{EmployeeSelector, Template, IntegralEventSelector},
+  props:{
+    visible:{
+      type: Boolean,
+      default: false
+    },
+    title:{
+      type: String,
+      default: '发起申诉'
+    },
+    events:{
+      type: Array,
+      default: () => {
+        return []
+      }
+    }
+  },
+  data(){
+    const pts =  this.$getTyps()
+    return {
+      userInfo: this.$userInfo(),
+      pts:pts,
+      rewriteData:{
+        events:[],
+        globalRemark:'',
+        reviewerId:'',
+        reviewerName:'',
+        employeeSelected: { dept: [], employee: [] },
+      },
+      showReviewerSelector:false,
+      showEventSelector:false,
+      superiorList:[],
+      loading:false,
+      eventSelected:[],
+      submitting:false,
+      hasOpen:false,
+    }
+  },
+  computed:{
+    canSubmit(){
+      return this.rewriteData.events.length > 0 && this.rewriteData.reviewerId
+    }
+  },
+  methods:{
+    initData(){
+      this.rewriteData = {
+        events:[],
+        globalRemark:'',
+        reviewerId:'',
+        reviewerName:'',
+        employeeSelected: { dept: [], employee: [] },
+      }
+      this.showReviewerSelector = false
+      this.loading = false
+      this.submitting = false
+      this.hasOpen = false
+    },
+    beforeCloseHandler(){
+      this.initData()
+      this.$emit('update:visible',false)
+    },
+    closeHandler(){
+      this.initData()
+    },
+    openHandler() {
+      if (this.events) this.rewriteData.events = this.events
+      this.hasOpen = true
+    },
+    handleRewriteReviewerSelector(val){
+      this.rewriteData.reviewerName = ''
+      this.rewriteData.employeeSelected = { dept: [], employee: [] }
+      this.rewriteData.reviewerId = 0
+      if (val.employee.length > 0){
+        this.rewriteData.reviewerName = val.employee[0].name
+        this.rewriteData.employeeSelected.employee = [{name:val.employee[0].name,id:val.employee[0].id,img_url:val.employee[0].img_url}]
+        this.rewriteData.reviewerId = val.employee[0].id
+      }
+    },
+    openEventSelected(){
+      this.eventSelected = !this.rewriteData.events ? [] : this.rewriteData.events.map(event => {
+        return {
+          id: event.id,
+          remark: event.remark,
+          appeal_remark:event.appeal_remark ? event.appeal_remark : ''
+        }
+      })
+      this.showEventSelector = true
+    },
+    onEventSelected(val){
+      this.rewriteData.events = val;
+    },
+    createAppeal(){
+      let self = this
+      if (!self.canSubmit) return
+      self.submitting = true
+      let params = {
+        reviewer_id:self.rewriteData.reviewerId,
+        remark:self.rewriteData.globalRemark,
+        events:self.rewriteData.events.map(item => {
+          return {id:item.id,remark:item.appeal_remark}
+        })
+      }
+      if (!params.reviewer_id || params.events.length <= 0) this.$message.error('非法操作')
+
+      self.$axiosUser('post','api/pro/integral/appeal/create',params)
+        .then(res => {
+          if (res.data.code === 1){
+            self.$message.success('申诉已发起')
+            self.$emit('createFinish',res.data.data)
+            self.close()
+          }else {
+            self.$message.error(res.data.msg)
+          }
+        })
+        .finally(() => {
+          self.submitting = false
+        })
+    },
+    close(){
+      this.$emit('update:visible',false)
+    },
+    deleteEvent(event){
+      let index = this.rewriteData.events.indexOf(event)
+      if (index >= 0) this.rewriteData.events.splice(index,1)
+    },
+    onGlobalRemarkInput(val) {
+      this.rewriteData.globalRemark = specialFilter(val)
+    },
+    onEventRemarkInput(item) {
+      item.appeal_remark = specialFilter(item.appeal_remark)
+    }
+  },
+  mounted() {
+    this.superiorList = this.$store.getters.user_info.employee_detail.superior_list
+  }
+}
+</script>
+<style scoped lang="scss">
+
+</style>

+ 270 - 0
src/components/AppealRewrite.vue

@@ -0,0 +1,270 @@
+<template>
+  <el-dialog
+    :title="title"
+    :visible.sync="visible"
+    :modal="false"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    :center="true"
+    :show-close="false"
+    :before-close="beforeCloseHandler"
+    @open="openHandler"
+    @close="closeHandler"
+    append-to-body
+    width="600px"
+    top="1%"
+  >
+
+    <template>
+      <el-form v-model="rewriteData" v-loading="loading">
+        <el-form-item label="审批人" required>
+          <el-input class="w250" autocomplete="off" v-model="rewriteData.reviewerName" placeholder="请选择审批人" :disabled="!canRewrite" />
+          <div v-if="canRewrite" @click="showReviewerSelector = true" style="position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
+          <EmployeeSelector
+            :multi="false"
+            :user_employee_list="true"
+            :isChecKedAll="false"
+            :is_filtration_creator="false"
+            :employee_list="superiorList"
+            :selected="rewriteData.employeeSelected"
+            :visible.sync="showReviewerSelector"
+            @confirm="handleRewriteReviewerSelector"
+          />
+        </el-form-item>
+        <el-form-item label="原因说明">
+          <el-input type="textarea" :rows="2" placeholder="填写原因说明" v-model="rewriteData.globalRemark" maxlength="100" show-word-limit :disabled="!canRewrite" @input="onGlobalRemarkInput" />
+        </el-form-item>
+        <el-form-item label="积分事件" required>
+        </el-form-item>
+        <el-card>
+          <div slot="header">
+            <span>共{{rewriteData.events.length}}条积分事件</span>
+            <el-button @click="openEventSelected" type="primary" size="mini" :disabled="!canRewrite" >选择积分</el-button>
+          </div>
+          <IntegralEventSelector
+            :visible.sync="showEventSelector"
+            :title="userInfo.name + '的积分事件'"
+            :eid="userInfo.id"
+            :selected="eventSelected"
+            :max="100"
+            @confirm="onEventSelected"
+          />
+          <el-scrollbar
+            :native="false"
+            style="height: 300px"
+          >
+            <el-form-item v-for="(item,index) in rewriteData.events" :key="index">
+              <el-popover
+                placement="bottom"
+                title="积分说明"
+                width="300"
+                trigger="click"
+                :content="item.remark"
+              >
+                <el-tag closable style="cursor: pointer" slot="reference" @close="deleteEvent(item)">{{item.remark}}</el-tag>
+              </el-popover>
+              <el-input type="textarea" :rows="2" v-model="item.appeal_remark" placeholder="申诉原因" maxlength="100" show-word-limit :disabled="!canRewrite" @input="onEventRemarkInput(item)" />
+            </el-form-item>
+          </el-scrollbar>
+        </el-card>
+      </el-form>
+    </template>
+
+    <template slot="footer">
+      <div class="flex-box-end flex-v-ce">
+        <el-button @click="close" :loading="submitting || !hasOpen">关闭</el-button>
+        <el-button type="primary" @click="rewriteAppeal" :loading="submitting || !hasOpen" :disabled="!canSubmit">确认</el-button>
+      </div>
+    </template>
+
+  </el-dialog>
+</template>
+
+<script>
+import IntegralEventSelector from './IntegralEventSelector.vue'
+import Template from "../examine/components/Template.vue";
+import EmployeeSelector from "./EmployeeSelector.vue";
+import {specialFilter} from "../utils";
+export default {
+  name: 'AppealRewrite',
+  components:{EmployeeSelector, Template, IntegralEventSelector},
+  props:{
+    id:{
+      type: Number,
+      default:0
+    },
+    visible:{
+      type: Boolean,
+      default: false
+    },
+    title:{
+      type: String,
+      default: '申诉重写'
+    }
+  },
+  data(){
+    const pts =  this.$getTyps()
+    return {
+      userInfo: this.$userInfo(),
+      appealInfo:null,
+      pts:pts,
+      rewriteData:{
+        events:[],
+        globalRemark:'',
+        reviewerId:'',
+        reviewerName:'',
+        employeeSelected: { dept: [], employee: [] },
+      },
+      showReviewerSelector:false,
+      showEventSelector:false,
+      superiorList:[],
+      loading:false,
+      eventSelected:[],
+      submitting:false,
+      hasOpen:false,
+    }
+  },
+  computed:{
+    canRewrite(){
+      return this.appealInfo && this.appealInfo.can_rewrite
+    },
+    canSubmit(){
+      return this.canRewrite && this.rewriteData.events.length > 0 && this.rewriteData.reviewerId
+    }
+  },
+  methods:{
+    initData(){
+      this.appealInfo = null
+      this.rewriteData = {
+        events:[],
+        globalRemark:'',
+        reviewerId:'',
+        reviewerName:'',
+        employeeSelected: { dept: [], employee: [] },
+      }
+      this.showReviewerSelector = false
+      this.loading = false
+      this.submitting = false
+      this.hasOpen = false
+    },
+    getAppealInfo(){
+      if (!this.id) return
+      let self = this
+      self.loading = true
+      self.$axiosUser('get','api/pro/integral/appeal/info',{appeal_id:this.id})
+        .then((res) => {
+          if (res.data.code === 1){
+            self.appealInfo = res.data.data
+            self.initRewriteData()
+          }
+        })
+        .finally(() => {
+          self.loading = false
+        })
+    },
+    initRewriteData(){
+      if (!this.appealInfo) return
+      this.rewriteData.events = this.appealInfo.events.map(event => {
+        let pt = this.pts.find(item => item.id === event.pt_id)
+        pt = pt ? pt.name : ''
+        return {
+          id:event.id,
+          remark:`${event.point} ${pt} ${event.event_time} ${event.event_remark}`,
+          appeal_remark:specialFilter(event.appeal_remark)
+        }
+      })
+      this.rewriteData.globalRemark = this.appealInfo.global_remark
+      let node = this.appealInfo.process.find(item => item.step === 1)
+      if (node){
+        this.rewriteData.reviewerId = node.reviewer_id
+        this.rewriteData.reviewerName = node.reviewer_name
+      }
+    },
+    beforeCloseHandler(){
+      this.initData()
+      this.$emit('update:visible',false)
+    },
+    closeHandler(){
+      this.initData()
+    },
+    openHandler() {
+      this.hasOpen = true
+      this.getAppealInfo()
+    },
+    handleRewriteReviewerSelector(val){
+      this.rewriteData.reviewerName = ''
+      this.rewriteData.employeeSelected = { dept: [], employee: [] }
+      this.rewriteData.reviewerId = 0
+      if (val.employee.length > 0){
+        this.rewriteData.reviewerName = val.employee[0].name
+        this.rewriteData.employeeSelected.employee = [{name:val.employee[0].name,id:val.employee[0].id,img_url:val.employee[0].img_url}]
+        this.rewriteData.reviewerId = val.employee[0].id
+      }
+    },
+    openEventSelected(){
+      this.eventSelected = !this.rewriteData.events ? [] : this.rewriteData.events.map(event => {
+        return {
+          id: event.id,
+          remark: event.remark,
+          appeal_remark:event.appeal_remark ? event.appeal_remark : ''
+        }
+      })
+      this.showEventSelector = true
+    },
+    onEventSelected(val){
+      this.rewriteData.events = val;
+    },
+    rewriteAppeal(){
+      let self = this
+      if (!self.canSubmit) return
+      self.submitting = true
+      let params = {
+        appeal_id:self.appealInfo.id,
+        reviewer_id:self.rewriteData.reviewerId,
+        remark:self.rewriteData.globalRemark,
+        events:self.rewriteData.events.map(item => {
+          return {id:item.id,remark:item.appeal_remark}
+        })
+      }
+
+      self.$axiosUser('post','api/pro/integral/appeal/rewrite',params)
+        .then(res => {
+          if (res.data.code === 1){
+            self.$message.success(res.data.msg)
+            self.$emit('rewriteFinish')
+            self.close()
+          }else {
+            self.$message.error(res.data.msg)
+          }
+        })
+        .finally(() => {
+          self.submitting = false
+        })
+    },
+    close(){
+      this.$emit('update:visible',false)
+    },
+    deleteEvent(event){
+      let index = this.rewriteData.events.indexOf(event)
+      if (index >= 0) this.rewriteData.events.splice(index,1)
+    },
+    onGlobalRemarkInput(val){
+      this.rewriteData.globalRemark = specialFilter(val)
+    },
+    onEventRemarkInput(item){
+      item.appeal_remark = specialFilter(item.appeal_remark)
+    }
+  },
+  mounted() {
+    this.superiorList = this.$store.getters.user_info.employee_detail.superior_list
+  }
+}
+</script>
+<style scoped lang="scss">
+.font-flex-word {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+</style>

+ 365 - 0
src/components/IntegralEventSelector.vue

@@ -0,0 +1,365 @@
+<template>
+  <el-dialog
+    :title="title"
+    :visible.sync="visible_"
+    :close-on-click-modal="false"
+    :before-close="beforeClose"
+    @open="openHandler"
+    append-to-body
+    width="1000px"
+    top="5%"
+  >
+    <el-container>
+      <el-header height="100px">
+        <el-form :inline="true">
+          <el-form-item label="积分类型">
+            <el-select v-model="searchForm.ptId" placeholder="全部">
+              <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="时间区间">
+            <el-date-picker
+              v-model="timeScope"
+              type="daterange"
+              align="right"
+              unlink-panels
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              value-format="yyyy-MM-dd"
+              editable
+              :clearable="false"
+            />
+          </el-form-item>
+          <br/>
+          <el-form-item label="关键字">
+            <el-input v-model="searchForm.keyword" placeholder="输入关键字查找" maxlength="100" clearable/>
+          </el-form-item>
+        </el-form>
+      </el-header>
+      <el-main class="employee_selector_box">
+        <el-row :gutter="10">
+          <el-col :xs="11" :sm="11" :md="11" :lg="11" :xl="11" class="scroller-box">
+            <el-scrollbar
+              :native="false"
+              style="height: 100%;padding-top: 10px;"
+              v-loading="loading"
+            >
+              <div v-for="(item,index) in list" :key="index" @click.prevent.stop="selectEvent(item)" >
+                <el-row class="select_item" :gutter="10" >
+                  <el-col :span="2"><el-checkbox v-model="item.checked"/></el-col>
+                  <el-col :span="20" class="event_remark">{{item.remark}}</el-col>
+                </el-row>
+              </div>
+            </el-scrollbar>
+          </el-col>
+          <el-col :xs="2" :sm="2" :md="2" :lg="2" :xl="2" class="col-line"><span style="opacity: 0;">空</span></el-col>
+          <el-col :xs="11" :sm="11" :md="11" :lg="11" :xl="11" class="scroller-box">
+            <el-scrollbar
+              :native="false"
+              style="height: 100%;"
+            >
+              <el-row class="select_item" :gutter="10" v-for="(item,index) in eventSelected" :key="index">
+                <el-col :span="20" class="selected_remark">
+                  <el-tooltip placement="top" :content="item.remark" :disabled="item.remark.length <= 20">
+                    <span>{{item.remark}}</span>
+                  </el-tooltip>
+                </el-col>
+                <el-col :span="2" class="event_delete"><el-button type="default" size="mini" @click="cancelEvent(item.id)" icon="el-icon-close" circle/></el-col>
+              </el-row>
+            </el-scrollbar>
+          </el-col>
+        </el-row>
+      </el-main>
+      <el-footer height="100px">
+        <center style="padding: 20px 0;">
+          <el-pagination
+            background
+            @size-change="handleSizeChange"
+            @current-change="handlePageChange"
+            :current-page="searchForm.page"
+            layout="total, sizes, prev, pager, next"
+            :page-size="searchForm.page_size"
+            :page-sizes="[10,20,50,100]"
+            :total="searchForm.total"
+            :hide-on-single-page="true"
+            :key="pageKey"
+          />
+        </center>
+        <el-row :gutter="30" type="flex" align="middle" justify="end">
+          <el-col :span="2" style="text-align: center"><el-button @click="close">取消</el-button></el-col>
+          <el-col :span="2" style="text-align: center"><el-button type="primary" :disabled="!allowConfirm" @click="onConfirm">确定</el-button></el-col>
+        </el-row>
+      </el-footer>
+    </el-container>
+
+  </el-dialog>
+</template>
+
+
+<script>
+import Template from "../examine/components/Template.vue";
+
+export default {
+  name:'integralEventSelector',
+  components: {Template},
+  props:{
+    visible:{
+      type: Boolean,
+      default:false
+    },
+    eid:{
+      type: Number,
+      default:0
+    },
+    selected:{
+      type: Array,
+      default:()=>[]
+    },
+    title:{
+      type: String,
+      default: '积分选择'
+    },
+    max:{
+      type: Number,
+      default: 100
+    }
+  },
+  data(){
+    const today = new Date()
+    const startDate = this.$moment(today).subtract(1, 'months')
+    const endDate = this.$moment(today)
+
+    const sd = new Date(startDate.format('YYYY-MM-DD'))
+    const ed = new Date(endDate.format('YYYY-MM-DD'))
+
+    const pts =  this.$getTyps()
+    pts.push({id:0,name:'全部',code:'ALL'})
+    const ptb = pts.find(item => item.code === 'BF')
+    return {
+      list:[],
+      eventSelected:[],
+      pts:pts,
+      visible_:false,
+      startDate:startDate.format('YYYY-MM-DD'),
+      endDate:endDate.format('YYYY-MM-DD'),
+      timeScope:[
+        sd,
+        ed
+      ],
+      searchForm:{
+        startDate:startDate.format('YYYY-MM-DD'),
+        endDate:endDate.format('YYYY-MM-DD'),
+        ptId:ptb ? ptb.id : 0,
+        keyword:'',
+        page:1,
+        page_size:10,
+        total:0
+      },
+      pageKey:0,
+      loading:false,
+    }
+  },
+  computed:{
+    allowConfirm(){
+      // 积分数量是否可以提交
+      return this.eventSelected.length <= this.max
+    },
+    allowSelect(){
+      // 积分数量是否还可以添加
+      return this.eventSelected.length < this.max
+    }
+  },
+  watch:{
+    visible(val){
+      this.visible_ = val
+    },
+    timeScope(val){
+      if (typeof val[0] === 'string'){
+        this.searchForm.startDate = val[0]
+        this.searchForm.endDate = val[1]
+      }else {
+        this.searchForm.startDate = this.$moment(val[0]).format('YYYY-MM-DD')
+        this.searchForm.endDate = this.$moment(val[1]).format('YYYY-MM-DD')
+      }
+      this.searchForm.page = 1
+      this.getList()
+    },
+    'searchForm.ptId'(val){
+      this.searchForm.page = 1
+      this.getList()
+    },
+    'searchForm.keyword'(val){
+      this.searchForm.page = 1
+      this.getList()
+    }
+  },
+  methods:{
+    initData(){
+      const ptb = this.pts.find(item => item.code === 'BF')
+      this.list = []
+      this.searchForm.startDate = this.startDate
+      this.searchForm.endDate = this.endDate
+      this.searchForm.ptId = ptb ? ptb.id : 0
+      this.searchForm.page = 1
+      this.searchForm.page_size = 10
+      this.searchForm.total = 0
+      this.searchForm.keyword = ''
+      this.eventSelected = []
+      this.pageKey = 1
+      this.timeScope = [
+        new Date(this.startDate),
+        new Date(this.endDate)
+      ]
+    },
+    beforeClose(done){
+      this.initData()
+      this.$emit('update:visible',false)
+      done()
+    },
+    openHandler(){
+      this.eventSelected = this.selected
+      this.getList()
+    },
+    getList(){
+      if (!this.searchForm.startDate || !this.searchForm.endDate) return
+      let self = this
+      self.loading = true
+      let params = {
+        start_day:this.searchForm.startDate,
+        end_day:this.searchForm.endDate,
+        pt_id:this.searchForm.ptId,
+        simple:true,
+        page:this.searchForm.page,
+        page_size:this.searchForm.page_size,
+        keyword:this.searchForm.keyword
+      }
+      if (this.eid) params.employee_ids = this.eid
+      self.$axiosUser('get','api/pro/integral/statistics/integral',params,'v3')
+        .then(res => {
+          if (res.data.code === 1){
+            self.list = res.data.data.list.map(item => {
+              let pt = self.pts.find(i => i.id === item.pt_id)
+              pt = !pt ? '' : (pt.code === 'BF' ? 'B分' : (pt.code === 'AF' ? 'A分' : ''))
+
+              let obj = {
+                id:item.id,
+                remark:`${item.point} ${pt} ${item.date} ${item.remark}`,
+                checked:false
+              }
+
+              let checked = self.selected.find(i => i.id === item.id)
+              if (checked) obj.checked = true
+
+              return obj
+            })
+            self.searchForm.total = res.data.data.total
+          }else {
+            self.$message.error(res.data.data.msg)
+          }
+        })
+        .finally(() => {
+          self.loading = false
+        })
+    },
+    selectEvent(item){
+      if (item.checked){
+        //取消选择
+        this.cancelEvent(item.id)
+      }else {
+        //选择
+        if (!this.allowSelect){
+          this.$message.warning('最多选择'+this.max+'条积分')
+          return
+        }
+
+        item.checked = true
+        this.eventSelected.push({id:item.id,remark:item.remark,appeal_remark:''})
+      }
+    },
+    cancelEvent(eventId){
+      let selectedEvent = this.eventSelected.find(item => item.id === eventId)
+      if (!selectedEvent) return
+      this.eventSelected.splice(this.eventSelected.indexOf(selectedEvent),1);
+
+      let event = this.list.find(i => i.id === eventId)
+      if (event) event.checked = false
+    },
+    handleSizeChange(val){
+      this.searchForm.page = 1
+      this.searchForm.page_size = val
+      this.getList()
+    },
+    handlePageChange(val){
+      this.searchForm.page = val
+      this.pageKey = val
+      this.getList()
+    },
+    onConfirm(){
+      if (!this.allowConfirm){
+        this.$message.warning('最多选择'+this.max+'条积分')
+      }
+      this.$emit('confirm',this.eventSelected)
+      this.close()
+    },
+    close(){
+      this.initData()
+      this.$emit('update:visible',false)
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.employee_selector_box {
+  width: 100%;
+  box-sizing: border-box;
+  margin: 0 auto;
+}
+.scroller-box {
+  height: 440px;
+  padding-right: 0px !important;
+  background-color: #fdfdfd;
+  border: 1px solid #eee;
+  border-radius: 4px;
+  overflow: hidden;
+}
+
+.select_item{
+  margin-bottom: 10px;
+}
+
+.select_item:hover{
+  border-radius: 4px;
+  background-color: #ecf5ff;
+  cursor: pointer;
+}
+
+.event_remark{
+  white-space: nowrap;
+  color: #606266;
+}
+
+.selected_remark{
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  color: #606266;
+}
+
+.event_delete{
+  display: table-cell;
+  text-align: right;
+  padding-right: 0px;
+}
+
+.event_delete .el-button /deep/.el-icon-close{
+  color: #ffffff;
+}
+
+.event_delete .el-button{
+  background: #c0c4cc;
+  transform: scale(0.5);
+}
+
+</style>

+ 58 - 22
src/components/SelectRule.vue

@@ -8,7 +8,7 @@
         <div class="flex-box-ce">
             <el-checkbox style="margin-left: 12px;"  v-if="isAll" v-model="checkedAll" @change="checkedChange">全选</el-checkbox>
             <div class="flex-1"></div>
-            <el-input type="text" prefix-icon="el-icon-search" class="search"  style="width: 250px;margin-bottom: 10px;" placeholder="输入关键字搜索" v-model.trim="keyword"/>
+            <el-input type="text" prefix-icon="el-icon-search" class="search"  style="width: 250px;margin-bottom: 10px;" placeholder="输入关键字搜索" v-model.trim="keyword" clearable/>
         </div>
         <div style="height: 430px;overflow-y: scroll;" class="scroll-bar">
           <div class="flex-box-ce" style="background-color: #ECF5FF;padding: 10px 0;border-bottom: 1px solid #EBEEF5;width:500px">
@@ -90,6 +90,14 @@ export default {
     isAll:{ //是否可以全选择
       type: Boolean,
       default: false
+    },
+    isScope:{
+      type: Boolean,
+      default: false
+    },
+    multiple:{
+      type: Boolean,
+      default: true
     }
   },
   name: 'SelectRule',
@@ -128,15 +136,19 @@ export default {
       this.visible_ = JSON.parse(JSON.stringify(val));
       if (val) {
         this.selectArrItem = JSON.parse(JSON.stringify(this.selectItems));
-        let employee_map = this.$getEmployeeMap();
-        if (employee_map[this.$userInfo().id].employee_detail.dept_list.length > 0) {
-          //获取当前操作者的所在部门
-          let dept_list = employee_map[this.$userInfo().id].employee_detail.dept_list.map(item => {
-            return item.dept_id;
-          });
-          this.deptIds = dept_list;
+        if (this.isScope){
+          this.getRuleScope()
+        }else {
+          let employee_map = this.$getEmployeeMap();
+          if (employee_map[this.$userInfo().id].employee_detail.dept_list.length > 0) {
+            //获取当前操作者的所在部门
+            let dept_list = employee_map[this.$userInfo().id].employee_detail.dept_list.map(item => {
+              return item.dept_id;
+            });
+            this.deptIds = dept_list;
+          }
+          this.get_department_list();
         }
-        this.get_department_list();
       }
     },
     keyword(val){
@@ -148,7 +160,7 @@ export default {
   },
   methods: {
     handleClose(item){
-      console.log(item)
+      // console.log(item)
     },
     checkedChange(val){
       let selectIds=this.selectArrItem.map(e=>e.id);
@@ -187,18 +199,22 @@ export default {
       this.selectArrItem = [];
     },
     handleSelectionChange(item) {
-      let itemIndex=0;
-      let isPush=true;
-      this.selectArrItem.forEach((e, index) => {
-        if (e.id == item.id) {
-          isPush=false;
-          itemIndex=index;
+      if (this.multiple){
+        let itemIndex=0;
+        let isPush=true;
+        this.selectArrItem.forEach((e, index) => {
+          if (e.id == item.id) {
+            isPush=false;
+            itemIndex=index;
+          }
+        });
+        if(isPush){
+          this.selectArrItem.push(item);
+        }else{
+          this.selectArrItem.splice(itemIndex, 1);
         }
-      });
-      if(isPush){
-        this.selectArrItem.push(item);
-      }else{
-        this.selectArrItem.splice(itemIndex, 1);
+      }else {
+        this.selectArrItem = [item]
       }
     },
     dept_click(item) {
@@ -242,7 +258,7 @@ export default {
         //选择指定部门规则,创始人,公司,积分专员不限制
         data['dep_ids'] = JSON.stringify(this.deptIds);
       }
-      console.log(this.deptIds,)
+      // console.log(this.deptIds,)
       this.$axiosUser('get', '/api/pro/integral/rule/trees', data).then(res => {
         this.rule_tree = this.getTreeData2(res.data.data.rule_tree);
         this.item_list = res.data.data.item_list;
@@ -257,6 +273,26 @@ export default {
         this.list = item_list;
       });
     },
+    getRuleScope(){
+      let data = {
+        cycle_type: '1',
+        pt_id:this.ptId
+      }
+      this.$axiosUser('get','/api/pro/integral/rule/trees/scope',data)
+        .then(res => {
+          this.rule_tree = this.getTreeData2(res.data.data.rule_tree);
+          this.item_list = res.data.data.item_list;
+          this.list = [];
+          let item_list = [];
+          for (let i in this.item_list) {
+            for (let k in this.item_list[i]) {
+              item_list.push(this.item_list[i][k]);
+            }
+          }
+          this.item_all=item_list;
+          this.list = item_list;
+        })
+    },
     getQx() {
       return this.$supremeAuthority('dept_manager') || this.$supremeAuthority('employee');
     },

+ 71 - 32
src/components/Steps.vue

@@ -2,7 +2,7 @@
   <div>
     <p class="row_title">
       审批
-      <span class="row_tips fontColorB">多人审批时,以最后一人为准</span>
+      <span class="row-tips fontColorB">多人审批时,以最后一人为准</span>
     </p>
     <div class="examine_steps">
       <el-steps direction="vertical" :space="50">
@@ -11,42 +11,37 @@
             <userImage width="36px" height="36px" :img_url="item.img_url" :user_name="item.name"></userImage>
           </template>
           <template slot="title">
-<!--            <div>-->
-<!--              <div class="flex-box-ce" style="color: #303133;font-size:14px;margin-top:5px;">-->
-<!--                <div class="flex-1">-->
-<!--                  {{ item.name }}-->
-<!--                  <span style="margin: 0 5px;">-->
-<!--                    <span v-if="item.remark == '待审核'" style="color:#E6A23C;font-size:13px">待审批</span>-->
-<!--                    <span v-else-if="item.remark == '审核通过'" style="color:#67C23A;font-size:13px">审批通过</span>-->
-<!--                    <span v-else-if="item.remark == '审核驳回'" style="color:#F56C6C;font-size:13px">审批驳回</span>-->
-<!--                    <span v-else>{{ item.remark }}</span>-->
-<!--                  </span>-->
-<!--                  <strong style="font-weight: 500;">-->
-<!--                    <span class="red point" v-show="item.review_point > 0">+{{ item.review_point }}</span>-->
-<!--                    <span class="green point" v-show="item.review_point < 0">{{ item.review_point }}</span>-->
-<!--                  </strong>-->
-<!--                </div>-->
-<!--                <span class="fontColorC" style="font-size:12px;">{{ item.time }}</span>-->
-<!--              </div>-->
-<!--            </div>-->
-            <span style="margin: 0 5px;">
-              <span v-if="item.remark == '待审核'" style="color:#E6A23C;font-size:13px">待审批</span>
-              <span v-else-if="item.remark == '审核通过'" style="color:#67C23A;font-size:13px">审批通过</span>
-              <span v-else-if="item.remark == '审核驳回'" style="color:#F56C6C;font-size:13px">审批驳回</span>
-              <span v-else>{{ item.remark }}</span>
-            </span>
+            <template v-if="item.step > 0">
+              阶段{{item.step}}
+            </template>
+            <el-tag :type="processStatusType(item.status)">{{processStatusMap[item.status] || '--'}}</el-tag>
           </template>
           <template slot="description" style="">
-            <el-descriptions :column="1" size="small" :label-style="{width : '80px'}" border>
+            <el-descriptions
+              :column="2"
+              direction="vertical"
+              size="small"
+              border
+              :label-style="classDescLabel"
+              :content-style="classDescContent"
+            >
               <el-descriptions-item v-if="item.time" label="时间">{{item.time}}</el-descriptions-item>
               <el-descriptions-item label="姓名">{{item.name}}</el-descriptions-item>
               <el-descriptions-item v-if="item.point" label="申请分值" >{{item.point ? item.point : ''}}</el-descriptions-item>
               <el-descriptions-item v-if="index > 0" label="发放奖票">{{item.ticket_count ? '是' :'否'}}</el-descriptions-item>
               <el-descriptions-item v-if="item.remark !== '发起' && item.review_point" label="审批分值">{{item.review_point ? item.review_point : ''}}</el-descriptions-item>
-              <el-descriptions-item v-if="item.review_remark" label="备注">{{item.review_remark}}</el-descriptions-item>
+              <el-descriptions-item v-if="item.review_remark" label="备注">
+                <el-popover
+                  placement="bottom"
+                  title="备注"
+                  width="500"
+                  trigger="click"
+                  :content="item.review_remark"
+                >
+                  <div slot="reference" style="cursor: pointer" class="desc-content" >{{item.review_remark}}</div>
+                </el-popover>
+              </el-descriptions-item>
             </el-descriptions>
-
-<!--            <div class="fontColorB" style="margin: 5px 0;">{{ item.review_remark }}</div>-->
           </template>
         </el-step>
       </el-steps>
@@ -55,8 +50,11 @@
 </template>
 
 <script>
+import Template from "../examine/components/Template.vue";
+
 export default {
   name: 'Steps',
+  components: {Template},
   props: {
     process: {
       type: Array,
@@ -66,9 +64,41 @@ export default {
     }
   },
   data() {
-    return {};
+    return {
+      processStatusMap:{
+        '-1':'发起',
+        0:'待审核',
+        1:'审核通过',
+        2:'拒绝',
+        3:'驳回重做',
+        4:'重填',
+      },
+      classDescLabel:{
+        textAlign: 'center',
+        maxWidth: '150px',
+      },
+      classDescContent:{
+        textAlign: 'center',
+        maxWidth: '150px',
+        overflow: 'hidden',
+        textOverflow: 'ellipsis',
+        whiteSpace: 'nowrap',
+      },
+    };
   },
-  methods: {}
+  methods: {
+    processStatusType(status){
+      if (status === -1) return 'info'
+      const map = {
+        0:'warning',
+        1:'success',
+        2:'danger',
+        3:'danger',
+        4:'info',
+      }
+      return map[status] || 'info'
+    }
+  }
 };
 </script>
 
@@ -95,7 +125,16 @@ export default {
     color: #606266;
   }
 }
-.row_tips{
+.row-tips{
 	font-size: 12px;
 }
+
+.desc-content{
+  display: block;
+  text-align: center;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
 </style>

+ 1 - 1
src/home.vue

@@ -6,7 +6,7 @@
 
           <div style="background-color: #fff;padding:20px;margin-bottom: 10px;" class="br-5 ">
 
-            <div class="flex-box-ce">
+            <div class="flex-box-ce" v-if="user_info">
                 <div style="margin-right: 10px;">
                   <userImage :id="user_info.id" :img_url="user_info.img_url" :user_name="user_info.name" width="50px" height="50px"></userImage>
                 </div>

+ 1 - 1
src/performance/components/flow/Examine.vue

@@ -54,7 +54,7 @@
             </el-form-item>
             <el-form-item label="审批人多人时:" v-if="item.type!=3">
               <el-radio-group v-model="item.multi_executor">
-                <el-radio :label="1">依次确认</el-radio>
+                <el-radio :label="1">依次审批</el-radio>
                 <el-radio :label="2">任一人审批</el-radio>
                 <el-radio :label="3">均需审批</el-radio>
               </el-radio-group>

+ 1 - 1
src/performance/views/assessManagement/IndexSet.vue

@@ -63,7 +63,7 @@
         <div class="main-right">
           <div class="fontColorB flex-box flex-d-center">
             <div>{{ typeName }}</div>
-            <div><el-checkbox v-model="enableDs_checked">只看已开启【加入统计项】的指标</el-checkbox></div>
+<!--            <div><el-checkbox v-model="enableDs_checked">只看已开启【加入统计项】的指标</el-checkbox></div>-->
           </div>
           <el-table :data="indexList" v-loading="loading" class="table-box scroll-bar" @selection-change="handleSelectionChange" @row-click="rowClick">
             <el-table-column type="selection"></el-table-column>

+ 4 - 1
src/point/views/attendance/attendance_dutynew.vue

@@ -14,7 +14,9 @@
     </div>
     <el-scrollbar v-loading="loading" wrap-class="column-wrapper scrollable-items-container" :native="false" style="height: 500px;">
       <div style="">
+        <!--    排班表头      -->
         <table id="schedule_table_header" style="width:100%;" class="schedule_table" cellspacing="0" cellpadding="0" @mouseleave="schedule_set_show = false">
+
           <tr>
             <td width="120" style="width:120px;">姓名</td>
             <td
@@ -68,7 +70,7 @@
             </td>
           </tr>
         </table>
-
+        <!-- 人员排班信息 -->
         <table class="schedule_table" cellspacing="0" cellpadding="0" @mouseleave="schedule_set_show = false">
           <tr v-for="(row, index) in tableData" :key="index">
             <td
@@ -174,6 +176,7 @@
           </tr>
         </table>
 
+<!--    下面的班次表格    -->
         <div style="height: 46px;"></div>
         <table class="schedule_table" cellspacing="0" cellpadding="0">
           <tr>

+ 1 - 1
src/point/views/attendance/attendance_groupnew.vue

@@ -234,7 +234,7 @@
                   </div>
                 </div>
               </el-card>
-              <el-checkbox v-model="is_out_attendance">允许外勤打卡</el-checkbox>
+              <el-checkbox v-model="is_out_attendance">允许外勤打卡(外勤打卡不加分)</el-checkbox>
             </el-form-item>
 
             <el-form-item label="加班规则" prop="overtime_rule">

+ 1 - 1
src/point/views/attendance/attendance_machinenew.vue

@@ -32,7 +32,7 @@
       @current-change="changePage"
     ></el-pagination>
 
-    <el-dialog :title="checkinMechForm.id ? '修改考勤机' : '增加考勤机'" :visible.sync="checkin_mech_add" width="730px" top="50px" @close="checkinMechCloseHandle">
+    <el-dialog title="考勤机设置" :visible.sync="checkin_mech_add" width="730px" top="50px" @close="checkinMechCloseHandle">
       <el-alert style="margin-bottom:15px;background:#fdf6ec!important;color:#E6A23C!important;" title="温馨提示:" type="success" description>
         <p class="diy-tip" style="color:#E6A23C!important;">序列号请在考勤机-设备信息里查找 如对考勤机设置项存在疑问,可联系“功道云”专属客服人员指导设置</p>
       </el-alert>

+ 742 - 0
src/point/views/common/AppealPopup.vue

@@ -0,0 +1,742 @@
+<template>
+  <div v-loading="loading">
+    <el-container v-if="appealInfo">
+      <el-main class="detail_popup">
+        <!--     基础信息     -->
+        <el-card shadow="always" class="appeal_content">
+          <template slot="header">
+            <userImage
+              :user_name="appealInfo.employee_name"
+              :img_url="appealInfo.employee_img_url"
+              class="fl"
+              width="50px"
+              height="50px"
+              fontSize="15"
+            />
+            <span style="line-height: 50px; margin-left:10px;margin-right:4px;">{{appealInfo.employee_name}}</span>
+            <el-tag :type="appealStatusType(appealInfo.status)">{{appealStatusMap[appealInfo.status] || '--'}}</el-tag>
+          </template>
+          <div>
+            <p><el-tag>{{appealInfo.create_time}}</el-tag>&nbsp;发起申诉</p>
+            <p>共&nbsp;<el-tag>{{appealInfo.events.length}}</el-tag>&nbsp;条积分事件</p>
+            <div v-if="appealInfo.global_remark">
+              <p>申请原因:</p>
+              <el-alert
+                :title="appealInfo.global_remark"
+                type="info"
+                :closable="false"
+              />
+            </div>
+            <template v-if="appealInfo.complete_time">
+              <p><el-tag>{{appealInfo.complete_time}}</el-tag>&nbsp;审批结束</p>
+            </template>
+          </div>
+        </el-card>
+        <!--     审批流程     -->
+        <div class="process">
+          <h5>审批流程</h5>
+          <el-steps direction="vertical" :space="50" >
+            <el-step v-for="(item, index) in appealInfo.process" :key="index" style="margin-bottom: 5px;">
+              <template slot="icon">
+                <userImage width="36px" height="36px" :img_url="item.reviewer_img_url" :user_name="item.reviewer_name"></userImage>
+              </template>
+              <template slot="title">
+                阶段{{item.step}}
+                <el-tag :type="processStatusType(item.status)">{{processStatusMap[item.status] || '--'}}</el-tag>
+              </template>
+              <template slot="description">
+                <el-descriptions :column="2" direction="vertical" size="small" :label-style="{width:'80px'}" border>
+                  <el-descriptions-item label="发起人">{{item.publisher_name}}</el-descriptions-item>
+                  <el-descriptions-item label="发起时间">{{item.create_time}}</el-descriptions-item>
+                  <el-descriptions-item label="审批人">{{item.reviewer_name}}</el-descriptions-item>
+                  <el-descriptions-item label="审批意见" v-if="item.remark" >
+                    <el-alert
+                      :closable="false"
+                      :title="item.remark"
+                      type="info"
+                    />
+                  </el-descriptions-item>
+                  <el-descriptions-item label="完结时间" v-if="item.complete_time" >{{item.complete_time}}</el-descriptions-item>
+                </el-descriptions>
+              </template>
+            </el-step>
+          </el-steps>
+        </div>
+        <!--     隐藏信息     -->
+        <el-collapse v-model="infoActiveNames">
+          <el-collapse-item :title="appealInfo.events.length + '条积分事件'" name="events" >
+            <el-descriptions class="detail_row" v-for="(item,index) in appealInfo.events" size="small" :key="index" :column="1" :label-style="{width : '80px'}"  border>
+              <el-descriptions-item label="积分">
+                {{item.point + ' ' + ptName(item.pt_id)}}
+                <el-tag :type="pointStatusType(item.status)" v-if="pointStatusMap[item.status]">{{pointStatusMap[item.status]}}</el-tag>
+              </el-descriptions-item>
+              <el-descriptions-item label="积分备注">
+                <el-alert
+                  :title="item.event_remark"
+                  :closable="false"
+                  type="success"
+                />
+              </el-descriptions-item>
+              <el-descriptions-item label="时间">{{item.event_time}}</el-descriptions-item>
+              <el-descriptions-item v-if="item.appeal_remark" label="申诉原因">{{item.appeal_remark}}</el-descriptions-item>
+              <el-descriptions-item v-if="item.delete_time" label="已删除">{{item.delete_time}}</el-descriptions-item>
+            </el-descriptions>
+          </el-collapse-item>
+          <el-collapse-item :title="appealInfo.logs.length + '条操作日志'" name="logs">
+            <el-alert
+              v-for="(item,index) in appealInfo.logs"
+              :key="index"
+              type="info"
+              show-icon
+              :title="item.create_time + ' ' + item.msg"
+              :closable="false"
+            />
+          </el-collapse-item>
+        </el-collapse>
+      </el-main>
+      <el-footer class="appeal_footer flex-box-end flex-v-ce" height="60" >
+        <el-popconfirm
+          v-if="appealInfo.can_delete"
+          title="删除申诉后将不可恢复,确认提交吗"
+          confirm-button-text="提交"
+          cancel-button-text="取消"
+          icon="el-icon-question"
+          icon-color="red"
+          @confirm="removeAppeal"
+          style="margin: 0 10px"
+        >
+          <el-button type="danger" size="mini" slot="reference" :loading="submitting || !hasOpen" >删除申诉</el-button>
+        </el-popconfirm>
+
+
+
+        <el-button type="danger" size="mini" v-if="appealInfo.can_refuse" @click="showReviewRefuse = true" :loading="submitting || !hasOpen">拒绝</el-button>
+        <el-button type="warning" size="mini" v-if="appealInfo.can_reject_rewrite" @click="showReviewRejectRewrite = true" :loading="submitting || !hasOpen">驳回重做</el-button>
+
+        <el-popconfirm
+          v-if="appealInfo.can_cancel"
+          title="审批撤回后可以重新编辑内容重新提交"
+          confirm-button-text="提交"
+          cancel-button-text="取消"
+          icon="el-icon-question"
+          icon-color="red"
+          @confirm="reviewCancel"
+          style="margin: 0 10px"
+        >
+          <el-button type="info" size="mini" slot="reference" :loading="submitting || !hasOpen">撤回审批</el-button>
+        </el-popconfirm>
+
+        <el-popconfirm
+          v-if="appealInfo.can_cancel_appeal"
+          title="申诉撤回后可以重新编辑内容重新提交"
+          confirm-button-text="提交"
+          cancel-button-text="取消"
+          icon="el-icon-question"
+          icon-color="red"
+          @confirm="cancelAppeal"
+          style="margin: 0 10px"
+        >
+          <el-button type="info" size="mini" slot="reference" :loading="submitting || !hasOpen" >撤回申诉</el-button>
+        </el-popconfirm>
+
+        <el-button type="success" size="mini" v-if="appealInfo.can_rewrite" :loading="submitting || !hasOpen" @click="openRewrite">重新填写</el-button>
+        <el-button type="success" size="mini" v-if="appealInfo.can_submit" @click="showReviewSubmit = true" :loading="submitting || !hasOpen">递交审批</el-button>
+
+        <el-button type="primary" size="mini" v-if="appealInfo.can_approval" @click="showReviewApproval = true" :loading="submitting || !hasOpen">通过</el-button>
+      </el-footer>
+    </el-container>
+    <noData class="center" v-else />
+
+<!--  拒绝审批  -->
+    <el-dialog
+      title="拒绝审批"
+      :visible.sync="showReviewRefuse"
+      :modal="false"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :center="true"
+      :show-close="false"
+      width="600px"
+    >
+      <template>
+        <el-form v-model="formData">
+          <el-form-item >
+            <el-input
+              type="textarea"
+              :rows="3"
+              :autosize="true"
+              :clearable="true"
+              :maxlength="100"
+              :show-word-limit="true"
+              placeholder="原因说明"
+              v-model="formData.remark"
+              @input="onFormRemarkInput"
+            />
+          </el-form-item>
+        </el-form>
+      </template>
+      <template slot="footer">
+        <div class="flex-box-end flex-v-ce">
+          <el-button type="danger" @click="formData.remark = '',showReviewRefuse = false">关闭</el-button>
+          <el-button type="primary" @click="reviewRefuse" :disabled="!canConfirmReviewRefuse" :loading="submitting || !showReviewRefuse || !hasOpen" >确认</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+<!--  驳回重做  -->
+    <el-dialog
+      title="驳回重做"
+      :visible.sync="showReviewRejectRewrite"
+      :modal="false"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :center="true"
+      :show-close="false"
+      width="600px"
+    >
+      <template>
+        <el-form v-model="formData">
+          <el-form-item >
+            <el-input
+              type="textarea"
+              :rows="3"
+              :autosize="true"
+              :clearable="true"
+              :maxlength="100"
+              :show-word-limit="true"
+              placeholder="原因说明"
+              v-model="formData.remark"
+              @input="onFormRemarkInput"
+            />
+          </el-form-item>
+        </el-form>
+      </template>
+      <template slot="footer">
+        <div class="flex-box-end flex-v-ce">
+          <el-button type="danger" @click="formData.remark = '',showReviewRejectRewrite = false">关闭</el-button>
+          <el-button type="primary" @click="reviewRejectRewrite" :disabled="!canConfirmReviewRejectRewrite" :loading="submitting || !showReviewRejectRewrite || !hasOpen">确认</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+<!--  重新填写  -->
+    <AppealRewrite
+      :visible.sync="showRewrite"
+      :id="id"
+      @rewriteFinish="onAppRewriteFinish"
+    />
+
+<!--  递交审批  -->
+    <el-dialog
+      title="递交审批"
+      width="600px"
+      :visible.sync="showReviewSubmit"
+      :modal="false"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :center="true"
+      :show-close="false"
+    >
+      <template>
+        <el-form v-model="formData">
+          <el-form-item>
+            <el-input class="w250" auto-complete="off" v-model="formData.reviewerName" placeholder="请选择审批人" />
+            <div @click="showReviewerSelector = true" style=" position: absolute; top: 0; right: 0; left: 0; bottom: 0; z-index: 9;"></div>
+            <EmployeeSelector
+              :multi="false"
+              :user_employee_list="true"
+              :isChecKedAll="false"
+              :is_filtration_creator="false"
+              :employee_list="superiorList"
+              :selected="formData.employeeSelected"
+              :visible.sync="showReviewerSelector"
+              @confirm="handleReviewerSelector"
+            />
+          </el-form-item>
+          <el-form-item>
+            <el-input
+              type="textarea"
+              :autosize="true"
+              :clearable="true"
+              :maxlength="100"
+              :show-word-limit="true"
+              placeholder="请填写原因说明"
+              v-model="formData.remark"
+              @input="onFormRemarkInput"
+            />
+          </el-form-item>
+        </el-form>
+      </template>
+      <template slot="footer">
+        <div class="flex-box-end flex-v-ce">
+          <el-button @click="formData.remark = '',formData.reviewerId = 0,formData.reviewerName = '',formData.employeeSelected = { dept: [], employee: [] },showReviewSubmit = false">关闭</el-button>
+          <el-button type="primary" @click="reviewSubmit" :disabled="!canConfirmReviewSubmit" :loading="submitting || !showReviewSubmit || !hasOpen" >确认</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+<!--  通过  -->
+    <el-dialog
+      title="通过"
+      :visible.sync="showReviewApproval"
+      :modal="false"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :center="true"
+      :show-close="false"
+      width="600px"
+    >
+      <template>
+        <el-form v-model="formData">
+          <el-form-item >
+            <el-input
+              type="textarea"
+              :rows="3"
+              :autosize="true"
+              :clearable="true"
+              :maxlength="100"
+              :show-word-limit="true"
+              placeholder="原因说明"
+              v-model="formData.remark"
+              @input="onFormRemarkInput"
+            />
+          </el-form-item>
+        </el-form>
+      </template>
+      <template slot="footer">
+        <div class="flex-box-end flex-v-ce">
+          <el-button type="danger" @click="formData.remark = '',showReviewApproval = false">关闭</el-button>
+          <el-button type="primary" @click="reviewApproval" :disabled="!canConfirmReviewApproval" :loading="submitting || !showReviewApproval || !hasOpen">确认</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+
+import Template from "../../../examine/components/Template.vue";
+import EmployeeSelector from "../../../components/EmployeeSelector.vue";
+import AppealRewrite from "../../../components/AppealRewrite.vue";
+import {specialFilter} from "../../../utils";
+
+export default {
+  name:'appealPopup',
+  components: {AppealRewrite, Template,EmployeeSelector},
+  props:{
+    id:{
+      type: Number,
+      default:0
+    }
+  },
+  data() {
+    return {
+      userInfo: this.$userInfo(),
+      hasOpen:false,
+      hasSubmit:false,    //标识复议记录是否有提交操作,用来通知父组件如果有需要的话
+      loading:false,
+      appealInfo:null,
+      superiorList:[],
+      infoActiveNames:[],
+      eventSelected:[],
+      appealStatusMap:{
+        0:'全部',
+        1:'审批中',
+        2:'审批通过',
+        3:'驳回重做',
+        4:'撤回重填',
+        5:'拒绝'
+      },
+      pointStatusMap:{
+        1:'正常',
+        2:'已删除',
+        3:'已通过申诉并删除'
+      },
+      processStatusMap:{
+        1:'待处理',
+        2:'审批通过',
+        3:'递交审批',
+        4:'拒绝',
+        5:'驳回重做',
+        6:'撤回上个节点重填',
+        7:'申诉撤回',
+      },
+      pts:[],
+      formData:{
+        reviewerId:0,
+        reviewerName:'',
+        remark:'',
+        employeeSelected: { dept: [], employee: [] },
+      },
+      rewriteData:{
+        events:[],
+        globalRemark:'',
+        reviewerId:'',
+        reviewerName:'',
+        employeeSelected: { dept: [], employee: [] },
+      },
+      showReviewRefuse:false,
+      showReviewRejectRewrite:false,
+      showReviewApproval:false,
+      showReviewerSelector:false,
+      showReviewSubmit:false,
+      submitting:false,
+      showEventSelector:false,
+      showRewrite:false,
+    }
+  },
+  watch:{
+  },
+  computed:{
+    canConfirmReviewSubmit(){
+      return this.appealInfo && this.appealInfo.can_submit && this.formData.reviewerId && this.showReviewSubmit
+    },
+    canConfirmReviewApproval(){
+      return this.appealInfo && this.appealInfo.can_approval && this.showReviewApproval
+    },
+    canConfirmReviewRejectRewrite(){
+      return this.appealInfo && this.appealInfo.can_reject_rewrite && this.showReviewRejectRewrite
+    },
+    canConfirmReviewRefuse(){
+      return this.appealInfo && this.appealInfo.can_refuse && this.showReviewRefuse
+    }
+  },
+  methods:{
+    getAppealInfo(){
+      if (!this.$props.id) return
+      let self = this
+      self.loading = true
+      self.$axiosUser('get','api/pro/integral/appeal/info',{appeal_id:this.$props.id})
+        .then((res) => {
+          if (res.data.code === 1){
+            self.appealInfo = res.data.data
+          }
+        })
+        .finally(() => {
+          self.loading = false
+        })
+    },
+    initData(){
+      this.formData.reviewerId = 0
+      this.formData.remark = ''
+      this.formData.reviewerName = ''
+      this.formData.employeeSelected = { dept: [], employee: [] }
+      this.hasSubmit = false
+      this.appealInfo = null
+      this.infoActiveNames = []
+      this.showReviewRefuse = false
+      this.showReviewRejectRewrite = false
+      this.showReviewApproval = false
+      this.showReviewerSelector = false
+      this.showReviewSubmit = false
+      this.showRewrite = false
+      this.showEventSelector = false
+      this.submitting = false
+    },
+    closedHandler(){
+      if(this.hasSubmit) this.$emit('update:appeal')
+      this.initData()
+    },
+    closeHandler(){
+      this.hasOpen = false
+    },
+    openedHandler(){
+      this.hasOpen = true
+      this.initData()
+      this.getAppealInfo()
+    },
+    ptName(ptId){
+      let item = this.pts.find(item => item.id === ptId)
+      return item ? item.name : ''
+    },
+    pointStatusType(status){
+      switch (status){
+        case 2:
+        case 3:
+          return 'warning'
+        default:
+          return "success"
+      }
+    },
+    appealStatusType(status){
+      const map = {
+        1:'info',
+        2:'success',
+        3:'warning',
+        4:'warning',
+        5:'danger'
+      }
+      return map[status] || 'info'
+    },
+    processStatusType(status){
+      const map = {
+        1:'info',
+        2:'success',
+        3:'success',
+        4:'danger',
+        5:'warning',
+        6:'warning',
+        7:'info',
+      }
+      return map[status] || 'info'
+    },
+    onAppRewriteFinish(){
+      this.hasSubmit = true
+      this.getAppealInfo()
+    },
+    removeAppeal(){
+      if (!this.appealInfo) return
+      let self = this
+      self.submitting = true
+      let params = {
+        appeal_id:self.appealInfo.id
+      }
+      self.$axiosUser('post','api/pro/integral/appeal/remove',params)
+        .then(res => {
+          if (res.data.code === 1){
+            self.$message.info('处理完毕')
+            self.hasSubmit = true
+            self.getAppealInfo()
+          }else {
+            self.$message.error(res.data.msg)
+          }
+        })
+        .finally(() => {
+          self.submitting = false
+        })
+
+    },
+    reviewRefuse(){
+      if (!this.appealInfo) return
+      let self = this
+      self.submitting = true
+      let params = {
+        appeal_id:self.appealInfo.id,
+        remark:self.formData.remark
+      }
+      self.$axiosUser('post','api/pro/integral/appeal/review/refuse',params)
+        .then(res => {
+          if (res.data.code === 1){
+            self.hasSubmit = true
+            self.getAppealInfo()
+            self.$message.success(res.data.msg)
+            self.showReviewRefuse = false
+          }else {
+            self.$message.error(res.data.msg)
+          }
+        })
+        .finally(() => {
+          self.submitting = false
+        })
+    },
+    reviewRejectRewrite(){
+      if (!this.appealInfo) return
+      let self = this
+      self.submitting = true
+      let params = {
+        appeal_id:self.appealInfo.id,
+        remark:self.formData.remark
+      }
+      self.$axiosUser('post','api/pro/integral/appeal/review/reject',params)
+        .then(res => {
+          if (res.data.code === 1){
+            self.hasSubmit = true
+            self.getAppealInfo()
+            self.$message.success(res.data.msg)
+            self.showReviewRejectRewrite = false
+          }else {
+            self.$message.error(res.data.msg)
+          }
+        })
+        .finally(() => {
+          self.submitting = false
+        })
+    },
+    reviewCancel(){
+      if (!this.appealInfo) return
+      this.submitting = true
+      let self = this
+      self.$axiosUser('post','api/pro/integral/appeal/review/cancel',{appeal_id:self.appealInfo.id})
+        .then(res => {
+          if (res.data.code === 1){
+            self.hasSubmit = true
+            self.getAppealInfo()
+            self.$message.success(res.data.msg)
+          }else {
+            self.$message.error(res.data.msg)
+          }
+        })
+        .finally(() => {
+          self.submitting = false
+        })
+    },
+    cancelAppeal(){
+      if (!this.appealInfo) return
+      this.submitting = true
+      let self = this
+
+      self.$axiosUser('post','api/pro/integral/appeal/cancel',{appeal_id:self.appealInfo.id})
+        .then(res => {
+          if (res.data.code === 1){
+            self.hasSubmit = true
+            self.getAppealInfo()
+            self.$message.success(res.data.msg)
+          }else {
+            this.$message.error(res.data.msg)
+          }
+        })
+        .finally(() => {
+          self.submitting = false
+        })
+    },
+    reviewSubmit(){
+      if (!this.appealInfo) return
+      let self = this
+      self.submitting = true
+      let params = {
+        appeal_id:self.appealInfo.id,
+        reviewer_id:self.formData.reviewerId,
+        remark:self.formData.remark
+      }
+      self.$axiosUser('post','api/pro/integral/appeal/review/submit',params)
+        .then(res => {
+          if (res.data.code === 1){
+            self.hasSubmit = true
+            self.getAppealInfo()
+            self.$message.success(res.data.msg)
+            self.showReviewSubmit = false
+          }else {
+            self.$message.error(res.data.msg)
+          }
+        })
+        .finally(() => {
+          self.submitting = false
+        })
+    },
+    reviewApproval(){
+      if (!this.appealInfo) return
+      let self = this
+      self.submitting = true
+      let params = {
+        appeal_id:self.appealInfo.id,
+        remark:self.formData.remark
+      }
+      self.$axiosUser('post','api/pro/integral/appeal/review/approval',params)
+        .then(res => {
+          if (res.data.code === 1){
+            self.hasSubmit = true
+            self.getAppealInfo()
+            self.$message.success(res.data.msg)
+            self.showReviewApproval = false
+          }else {
+            self.$message.error(res.data.msg)
+          }
+        })
+        .finally(() => {
+          self.submitting = false
+        })
+    },
+    handleReviewerSelector(val){
+      this.formData.reviewerName = ''
+      this.formData.employeeSelected = { dept: [], employee: [] }
+      this.formData.reviewerId = 0
+      if (val.employee.length > 0){
+        this.formData.reviewerName = val.employee[0].name
+        this.formData.employeeSelected.employee = [{name:val.employee[0].name,id:val.employee[0].id,img_url:val.employee[0].img_url}]
+        this.formData.reviewerId = val.employee[0].id
+      }
+    },
+    openRewrite(){
+      if (!this.appealInfo) return
+      this.rewriteData.events = this.appealInfo.events.map(event => {
+        let pt = this.pts.find(item => item.id === event.pt_id)
+        pt = pt ? pt.name : ''
+        return {
+          id:event.id,
+          remark:`${event.point} ${pt} ${event.event_remark}`,
+          appeal_remark:event.appeal_remark
+        }
+      })
+      this.rewriteData.globalRemark = this.appealInfo.global_remark
+      let node = this.appealInfo.process.find(item => item.step === 1)
+      if (node){
+        this.rewriteData.reviewerId = node.reviewer_id
+        this.rewriteData.reviewerName = node.reviewer_name
+      }
+      this.showRewrite = true
+    },
+    onFormRemarkInput(val){
+      this.formData.remark = specialFilter(val)
+    }
+  },
+  mounted() {
+    this.pts = this.$getTyps()
+    this.superiorList = this.$store.getters.user_info.employee_detail.superior_list
+  }
+}
+
+</script>
+
+<style scoped lang="scss">
+.detail_popup {
+  padding: 20px;
+  overflow-y: auto;
+  overflow-x: hidden !important;
+  height: calc(100vh - 60px);
+}
+
+.detail_row {
+  padding-bottom: 10px;
+  line-height: 50px;
+}
+
+.appeal_content {
+  font-size: 18px;
+}
+
+.appeal_content p{
+  margin-bottom: 10px;
+  font-size: 12px;
+  color: rgb(144, 147, 153);
+}
+
+.process{
+  position: relative;
+  margin: 0 0 20px 0;
+  padding-top: 12px;
+  font-size: 16px;
+  color: #303133;
+  line-height: 22px;
+}
+
+.process:before{
+  position: absolute;
+  top: 0;
+  content: ' ';
+  width: 100%;
+  border-top: 1px #f8f8f8 solid;
+}
+
+.appeal_footer{
+  border-top: 1px solid #ebebeb;
+  padding: 10px 20px;
+  font-size: 14px;
+}
+
+.appeal_action {
+  text-align: center;
+}
+
+.center{
+  margin-top: calc(100vh * 0.3);
+}
+.desc-content{
+  display: block;
+  width: 200px;
+  text-align: center;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+</style>

+ 564 - 0
src/point/views/common/TaskUpdate.vue

@@ -0,0 +1,564 @@
+<template>
+  <el-dialog
+    title="悬赏更新"
+    :visible.sync="scheduleVisible"
+    :close-on-click-modal="false"
+    :show-close="false"
+    top="5%"
+    width="600px"
+    @open="loadDetail"
+  >
+    <el-form :model="formData" ref="formData" label-width="80px" v-loading="loading" >
+      <el-form-item
+        label="任务内容"
+        prop="task_name"
+        :rules="[{required:true,message:'请填写任务内容'},{min:3,max:20,message: '长度在3到20个字'}]"
+      >
+        <el-input
+          type="textarea"
+          rows="3"
+          maxlength="20"
+          show-word-limit
+          v-model="formData.task_name"
+          @input="onTaskNameInput"
+        />
+      </el-form-item>
+      <el-form-item
+        label="积分类型"
+        prop="pt_id"
+        :rules="[{required:true,message:'请选择规则积分'}]"
+      >
+        <el-radio-group
+          v-model="formData.pt_id"
+        >
+          <el-radio v-for="(item,index) in pts" :key="index" v-show="item.code !== 'JX'" :label="item.id">{{item.name}}</el-radio>
+        </el-radio-group>
+        <span class="blue cursor" style="padding-left: 20px;font-size: 14px;" @click="$openUrl(17)">什么是A分、B分?</span>
+      </el-form-item>
+
+      <el-form-item label="指定规则">
+        <el-radio-group v-model="formData.rule_type">
+          <el-radio-button :label="0">不指定</el-radio-button>
+          <el-radio-button :label="1">规则分类</el-radio-button>
+          <el-radio-button :label="2">指定规则</el-radio-button>
+        </el-radio-group>
+      </el-form-item>
+
+      <el-form-item label="规则分类" prop="rule_id" v-if="formData.rule_type === 1" :rules="[{required:true,message:'请选择规则分类'}]">
+        <el-cascader
+          class="w250"
+          v-model="formData.rule_id"
+          :options="rule_list"
+          :props="{children:'child',label:'name',value:'id', checkStrictly: true,emitPath:false}"
+        />
+      </el-form-item>
+      <el-form-item label="积分规则" prop="rule_item.remark" v-if="formData.rule_type === 2" :rules="[{required:true,message:'请选择积分规则'}]">
+        <el-input placeholder="请选择规则" v-model="formData.rule_item.remark" readonly @focus="showRuleItems = true">
+          <el-button slot="append" icon="el-icon-search" @click.stop="showRuleItems = true"/>
+        </el-input>
+        <i style="color: red">{{itemRemark}}</i>
+        <SelectRule
+          :visible.sync="showRuleItems"
+          :pt-id = "formData.pt_id"
+          :select-items="selectItem"
+          :is-scope="true"
+          :multiple="false"
+          @confirm="onItemConfirm"
+        />
+      </el-form-item>
+
+      <el-form-item label="任务积分" prop="base_point" :rules="[{ required: true, message: '请填写任务积分'}]">
+        <el-input-number ref="base_point" v-model="formData.base_point" :disabled="formData.rule_item.range_type === 1" @change="onBasePointChange"></el-input-number>
+      </el-form-item>
+      <el-form-item label="审批人" prop="reviewer_id" :rules="[{ required: true, message: '请选择审批人'}]">
+        <el-input auto-complete="off" v-model="formData.reviewer_name" placeholder="请选择审批人" :disabled="true">
+          <el-button slot="append" icon="el-icon-search" @click.stop="showReviewer = true" />
+        </el-input>
+        <EmployeeSelector
+          :multi="false"
+          :is-chec-ked-all="false"
+          :is_manager_only="true"
+          :is_filtration_creator="false"
+          :selected="formData.reviewer_selected"
+          :visible.sync="showReviewer"
+          @confirm="reviewer_confirm"
+        />
+      </el-form-item>
+      <el-form-item
+        label="截止时间"
+        prop="expire_time"
+        :rules="[{required:true,message:'请选择截止时间'}]"
+      >
+        <el-date-picker
+          v-model="formData.expire_time"
+          type="datetime"
+          :picker-options="pickerOptions"
+          placeholder="选择截止时间"
+          format="yyyy-MM-dd HH:mm"
+          value-format="yyyy-MM-dd HH:mm"
+          default-time="18:00"
+          :clearable="false"
+        />
+        <el-tooltip placement="right" style="margin-left: 10px" content="任务截止时间是触发任务提前奖分/逾期扣分的关键属性"><span class="tips">?</span></el-tooltip>
+      </el-form-item>
+
+      <el-form-item
+        label="任务备注"
+        prop="task_remark"
+        :rules="[{max:300,message:'只允许最多300个字'}]"
+      >
+        <el-input
+          type="textarea"
+          :rows="5"
+          show-word-limit
+          v-model="formData.task_remark"
+          @input="onTaskRemarkInput"
+        />
+      </el-form-item>
+      <el-form-item label="可见范围" prop="dept_ids">
+        <el-input auto-complete="off" :disabled="true" v-model="formData.deptName" placeholder="请选中部门的人可领取">
+          <el-button slot="append" icon="el-icon-search" @click.stop="showDeptSelector = true"/>
+        </el-input>
+        <EmployeeSelector
+          :isChecKedAll="false"
+          :can_select_employee="false"
+          :can_select_dept="true"
+          :multi="true"
+          :selected="formData.dept_selected"
+          :visible.sync="showDeptSelector"
+          @confirm="dept_confirm"/>
+      </el-form-item>
+
+      <div style="margin-left: 80px; margin-bottom: 8px;">以天为单位,每 提前/逾期 一天 加分/扣分</div>
+      <el-form-item label="提前奖分" prop="ahead_award_point">
+        <el-input
+          v-model="formData.ahead_award_point"
+          @input="v => formData.ahead_award_point = v.replace(/[^\d]/g,'')"
+          placeholder="请输入每日奖分"
+          style="width: 150px;"
+        />
+        B分/每天, 奖分上限 &nbsp;
+        <el-input
+          v-model="formData.ahead_award_point_limit"
+          @input="v => formData.ahead_award_point_limit = v.replace(/[^\d]/g,'')"
+          placeholder="请输入奖分上限"
+          style="width: 150px;"
+        />
+        B分
+      </el-form-item>
+      <el-form-item label="逾期扣分" prop="timeout_deduction_point">
+        <el-input
+          v-model="formData.timeout_deduction_point"
+          @input="v => formData.timeout_deduction_point = v.replace(/[^\d]/g,'')"
+          placeholder="请输入每日扣分"
+          style="width: 150px;"
+        />
+        B分/每天, 扣分上限 &nbsp;
+        <el-input
+          v-model="formData.timeout_deduction_point_limit"
+          @input="v => formData.timeout_deduction_point_limit = v.replace(/[^\d]/g,'')"
+          placeholder="请输入扣分上限"
+          style="width: 150px;"
+        />
+        B分
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" @click="sub" >确认修改</el-button>
+        <el-button @click.stop="close">取消</el-button>
+      </el-form-item>
+    </el-form>
+
+  </el-dialog>
+</template>
+
+<script>
+import {specialFilter} from "../../../utils";
+import SelectRule from "../../../components/SelectRule.vue";
+import EmployeeSelector from "../../../components/EmployeeSelector.vue";
+
+export default {
+  name: "TaskUpdate",
+  components: {EmployeeSelector, SelectRule},
+  props:{
+    scheduleVisible:{
+      type:Boolean,
+      default:false
+    },
+    taskId:{
+      type:Number,
+      default:0
+    }
+  },
+  data(){
+    return {
+      firstInit:true,
+      pickerOptions:{
+        disabledDate (time) {
+          //disabledDate 文档上:设置禁用状态,参数为当前日期,要求返回 Boolean
+          // return time.getTime() > Date.now()//选当前时间之前的时间
+          let num=60*60*24*1000
+          return (time.getTime()+num) < Date.now()//选当前时间之后的时间
+        }
+      },
+      pts:this.$getTyps(),
+      employee_list: this.$store.getters.user_info.employee_detail.manage_scope,
+      showReviewer:false,
+      loading:false,
+      rule_list:[],
+      showRuleItems:false,
+      showDeptSelector:false,
+      formData:{
+        id:0,
+        rule_type:0,
+        rule_id:0,
+        item_id:0,
+        dept_ids:[],
+        deptName:null,
+        dept_selected: {dept: [],employee:[]},
+        rule_item:{
+          id:0,
+          remark:"",
+          cycle_type: 0,
+          is_attendance: 0,
+          max_point: 0,
+          min_point: 0,
+          prize_type: 0,
+          pt_id: 0,
+          range_type: 0,
+          rule_id:0
+        },
+        task_name:'',
+        base_point:0,
+        task_remark: '',
+        pt_id: 3,
+        expire_time: '',
+        reviewer_id: 0,
+        reviewer_name:'',
+        reviewer_selected:{ dept: [], employee: [] },
+        timeout_deduction_point: null,
+        timeout_deduction_point_limit: null,
+        ahead_award_point: null,
+        ahead_award_point_limit: null,
+      },
+    }
+  },
+  computed:{
+    selectItem(){
+      return this.formData.rule_item && this.formData.rule_item.id ? [this.formData.rule_item] : []
+    },
+    itemRemark(){
+      let pt = this.pts.find(pt => pt.id === this.formData.rule_item.pt_id)
+      pt = pt ? pt.name : ''
+      switch (this.formData.rule_item.range_type){
+        case 1:
+          return `${this.formData.rule_item.min_point} ${pt}`
+        case 2:
+          return `${this.formData.rule_item.min_point} -- ${this.formData.rule_item.max_point} ${pt}`
+        default:
+          return ''
+      }
+    }
+  },
+  watch:{
+    'formData.rule_type'(v){
+      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    //防止一进来就将规则选项重置
+    },
+
+  },
+  methods:{
+    initRuleData(){
+      this.formData.rule_id = 0
+      this.formData.item_id = 0
+      this.formData.rule_item = {
+        id:0,
+        remark:"",
+        cycle_type: 0,
+        is_attendance: 0,
+        max_point: 0,
+        min_point: 0,
+        prize_type: 0,
+        pt_id: 0,
+        range_type: 0,
+        rule_id:0
+      }
+      this.formData.base_point = 1
+    },
+    dept_confirm(data){
+      this.formData.dept_selected = {dept: [],employee:[]}
+      this.formData.dept_ids = []
+      this.formData.deptName = ''
+      if (data.dept !== null && data.dept.length != 0) {
+        this.formData.dept_selected = data
+        data.dept.forEach((element,index) => {
+          this.formData.dept_ids.push(element.dept_id)
+          this.formData.deptName += index === 0 ? element.dept_name : `,${element.dept_name}`
+        });
+      }
+    },
+    onTaskRemarkInput(val){
+      this.formData.task_remark = specialFilter(val)
+    },
+    reviewer_confirm(data){
+      this.formData.reviewer_selected = { dept: [], employee: [] };
+      this.formData.reviewer_id = '';
+      this.formData.reviewer_name = '';
+      if (data.employee !== null && data.employee.length != 0) {
+        this.formData.reviewer_selected = data;
+        this.formData.reviewer_id = data.employee[0].id;
+        this.formData.reviewer_name = data.employee[0].name;
+      }
+    },
+    onBasePointChange(currentValue,oldValue){
+      //限制范围分的上下限拦截
+      if (this.formData.rule_type !== 2 && this.formData.rule_item.range_type !== 2) return
+
+      if (currentValue < this.formData.rule_item.min_point) {
+        this.$nextTick(() => {
+          this.formData.base_point = this.formData.rule_item.min_point
+        })
+      }
+      if (currentValue > this.formData.rule_item.max_point) {
+        this.$nextTick( () => {
+          this.formData.base_point = this.formData.rule_item.max_point
+        })
+      }
+    },
+    onItemConfirm(selectArrItem){
+      this.formData.rule_item = selectArrItem.length > 0 ? selectArrItem[0] : {
+        id:0,
+        remark:"",
+        cycle_type: 0,
+        is_attendance: 0,
+        max_point: 0,
+        min_point: 0,
+        prize_type: 0,
+        pt_id: 0,
+        range_type: 0,
+        rule_id:0
+      }
+      this.formData.item_id = this.formData.rule_item.id
+      this.formData.rule_id = this.formData.rule_item.rule_id
+      this.formData.base_point = this.formData.rule_item.min_point !== 0 ? this.formData.rule_item.min_point : 1
+    },
+    close(){
+      this.$emit('update:scheduleVisible',false)
+    },
+    onTaskNameInput(val){
+      this.formData.task_name = specialFilter(val)
+    },
+    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;
+    },
+    getRuleList(){
+      let data = {
+        cycle_type:'1',
+        pt_id: this.formData.pt_id
+      }
+      this.$axiosUser('get','/api/pro/integral/rule/trees/scope',data)
+        .then(res => {
+          this.rule_list = this.getTreeData(res.data.data.rule_tree)
+        })
+    },
+    loadDetail(){
+      if (this.taskId <= 0) return
+      let self = this
+      self.loading = true
+      self.firstInit = true
+      let data = {
+        task_id:this.taskId
+      }
+      self.$axiosUser('get','/api/pro/integral/task',data)
+        .then(res => {
+          if (res.data.code !== 1) {
+            self.$message.error(res.data.msg)
+            return
+          }
+          let info = res.data.data
+          let formData = {
+            id:info.id,
+            rule_type:0,
+            rule_id:info.rule_id,
+            item_id:info.item_id,
+            dept_ids:[],
+            deptName:'',
+            dept_selected: {dept: [],employee:[]},
+            rule_item:{
+              id:0,
+              remark:"",
+              cycle_type: 0,
+              is_attendance: 0,
+              max_point: 0,
+              min_point: 0,
+              prize_type: 0,
+              pt_id: 0,
+              range_type: 0,
+              rule_id:0
+            },
+            task_name:info.task_name,
+            base_point:info.point_config.base_point,
+            task_remark: info.task_remark,
+            pt_id: info.pt_id,
+            expire_time: info.expire_time,
+            reviewer_id: info.reviewer_id,
+            reviewer_name:info.reviewer_name,
+            reviewer_selected:{ dept: [], employee: [{id:info.reviewer_id,name:info.reviewer_name,img_url:info.reviewer_img_url}] },
+            timeout_deduction_point: info.point_config.timeout_deduction_point,
+            timeout_deduction_point_limit: info.point_config.timeout_deduction_point_limit,
+            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
+            }
+          }
+          info.department_info.forEach((item,index) => {
+
+            formData.dept_selected.dept.push({
+              dept_id:item.id,
+              dept_name:item.name,
+              avatar:"static/images/e66f.jpg"
+            })
+            formData.deptName += (index === 0 ? item.name : `,${item.name}`)
+            formData.dept_ids.push(item.id)
+          })
+
+          formData.rule_type = info.item_id && info.rule_id ? 2 : (info.rule_id ? 1 : 0)
+          self.formData = formData
+        })
+        .catch(err => {
+          self.$message.error(err)
+        })
+        .finally(() => {
+          self.loading = false
+        })
+    },
+    sub(){
+      this.$refs['formData'].validate((valid) => {
+        if (valid) this.saveFun()
+      })
+    },
+    saveFun(){
+      let data = {
+        id:this.formData.id,
+        pt_id:this.formData.pt_id,
+        task_name:this.formData.task_name,
+        task_remark:this.formData.task_remark,
+        base_point:this.formData.base_point,
+        expire_time:this.formData.expire_time,
+        reviewer_id:this.formData.reviewer_id,
+        timeout_deduction_point:this.formData.timeout_deduction_point,
+        timeout_deduction_point_limit:this.formData.timeout_deduction_point_limit,
+        ahead_award_point:this.formData.ahead_award_point,
+        ahead_award_point_limit:this.formData.ahead_award_point_limit,
+        dept_ids:this.formData.dept_ids,
+        rule_id:this.formData.rule_id,
+        item_id:this.formData.item_id,
+      }
+      if(!data.ahead_award_point && data.ahead_award_point_limit){
+        this.$message.warning('奖分上限不为0时,提前奖分不能为空')
+        return
+      }else if(data.ahead_award_point && !data.ahead_award_point_limit){
+        this.$message.warning('提前奖分不为0时,奖分上限不能为空')
+        return
+      }
+      if(!data.timeout_deduction_point && data.timeout_deduction_point_limit){
+        this.$message.warning('扣分上限不为0时,逾期扣分不能为空')
+        return
+      }else if(data.timeout_deduction_point && !data.timeout_deduction_point_limit){
+        this.$message.warning('逾期扣分不为0时,扣分上限不能为空')
+        return
+      }
+      if(this.ahead_timeout(data.ahead_award_point,data.ahead_award_point_limit,'提前奖分','奖分')) return
+      if(this.ahead_timeout(data.timeout_deduction_point,data.timeout_deduction_point_limit,'逾期扣分','扣分')) return
+
+      let point_limit = this.$userInfo().point_config.point_limit ? this.$userInfo().point_config.point_limit.find(pt => pt.pt_id === 3) : null
+      if(!this.$supremeAuthority('creator') && point_limit){
+        let entry_limit =  Number(point_limit.point)
+        if(entry_limit > 0){
+          if(data.ahead_award_point > entry_limit || data.timeout_deduction_point > entry_limit ){
+            this.$message.warning('每日奖扣分 不能超过您的奖扣分权限(您的奖扣分权限:' + entry_limit + '分)')
+            return
+          }
+          if(data.ahead_award_point_limit > entry_limit*10 || data.timeout_deduction_point_limit > entry_limit*10 ){
+            this.$message.warning('奖扣分上限不能超过' + entry_limit*10 + '分(您的奖扣分权限' + entry_limit + '分*10)')
+            return
+          }
+        }
+      }
+
+      let self = this
+      self.loading = true
+      self.$axiosUser('post','/api/pro/integral/task/update',data)
+        .then(res => {
+          if (res.data.code !== 1) throw new Error(res.data.msg)
+          self.$emit('hasSubmit')
+          self.$message.success(res.data.msg)
+          self.close()
+        })
+        .catch(err => {
+          self.$message.error(err)
+          self.loading = false
+        })
+
+
+
+    },
+    ahead_timeout(item,arr,codes,code){
+      if(item){
+        if(arr){
+          if(Number(item) > Number(arr)){
+            this.$message.warning(code +'上限不能小于每日'+ codes)
+            return true
+          }
+        }else{
+          this.$message.warning( codes + '不为0时,'+ code +'上限不能为空')
+          return true
+        }
+      }
+    },
+  },
+  mounted() {
+    this.getRuleList()
+  }
+}
+
+</script>
+
+<style scoped lang="scss">
+.tips {
+  background: #409EFF;
+  border-radius: 50%;
+  width: 14px;
+  height: 14px;
+  color: #fff;
+  display: inline-block;
+  font-size: 12px;
+  line-height: 14px;
+  text-align: center;
+}
+</style>

+ 566 - 0
src/point/views/common/WorkUpdate.vue

@@ -0,0 +1,566 @@
+<template>
+  <el-dialog
+    title="任务更新"
+    :visible.sync="taskVisible"
+    :close-on-click-modal="false"
+    :show-close="false"
+    top="5%"
+    width="600px"
+    @open="loadDetail"
+  >
+    <el-form :model="formData" ref="formData" label-width="80px" v-loading="loading" >
+      <el-form-item
+        label="任务内容"
+        prop="task_name"
+        :rules="[{required:true,message:'请填写任务内容'},{min:3,max:20,message: '长度在3到20个字'}]"
+      >
+        <el-input
+          type="textarea"
+          rows="3"
+          maxlength="20"
+          show-word-limit
+          v-model="formData.task_name"
+          @input="onTaskNameInput"
+        />
+      </el-form-item>
+      <el-form-item
+        label="积分类型"
+        prop="pt_id"
+        :rules="[{required:true,message:'请选择规则积分'}]"
+      >
+        <el-radio-group
+          v-model="formData.pt_id"
+        >
+          <el-radio v-for="(item,index) in pts" :key="index" v-show="item.code !== 'JX'" :label="item.id">{{item.name}}</el-radio>
+        </el-radio-group>
+        <span class="blue cursor" style="padding-left: 20px;font-size: 14px;" @click="$openUrl(17)">什么是A分、B分?</span>
+      </el-form-item>
+
+      <el-form-item label="指定规则">
+        <el-radio-group v-model="formData.rule_type">
+          <el-radio-button :label="0">不指定</el-radio-button>
+          <el-radio-button :label="1">规则分类</el-radio-button>
+          <el-radio-button :label="2">指定规则</el-radio-button>
+        </el-radio-group>
+      </el-form-item>
+
+      <el-form-item label="规则分类" prop="rule_id" v-if="formData.rule_type === 1" :rules="[{required:true,message:'请选择规则分类'}]">
+        <el-cascader
+          class="w250"
+          v-model="formData.rule_id"
+          :options="rule_list"
+          :props="{children:'child',label:'name',value:'id', checkStrictly: true,emitPath:false}"
+        />
+      </el-form-item>
+
+      <el-form-item label="积分规则" prop="rule_item.remark" v-if="formData.rule_type === 2" :rules="[{required:true,message:'请选择积分规则'}]">
+        <el-input placeholder="请选择规则" v-model="formData.rule_item.remark" readonly @focus="showRuleItems = true">
+          <el-button slot="append" icon="el-icon-search" @click.stop="showRuleItems = true"/>
+        </el-input>
+        <i style="color: red">{{itemRemark}}</i>
+        <SelectRule
+          :visible.sync="showRuleItems"
+          :pt-id = "formData.pt_id"
+          :select-items="selectItem"
+          :is-scope="true"
+          :multiple="false"
+          @confirm="onItemConfirm"
+        />
+      </el-form-item>
+
+      <el-form-item label="任务积分" prop="base_point" :rules="[{ required: true, message: '请填写任务积分'}]">
+        <el-input-number ref="base_point" v-model="formData.base_point" :disabled="formData.rule_item.range_type === 1" @change="onBasePointChange"></el-input-number>
+      </el-form-item>
+
+      <el-form-item label="执行人" prop="targets" :rules="[{ required: true, message: '请选择执行人'}]">
+        <el-input auto-complete="off" :disabled="true" v-model="formData.target_name" placeholder="请选择执行人">
+          <el-button slot="append" icon="el-icon-search" @click.stop="showApproval = true" />
+        </el-input>
+        <!--  执行人  -->
+        <EmployeeSelector
+          :employee_list="employee_list"
+          :user_employee_list="true"
+          :multi="false"
+          :selected="formData.target_selected"
+          :visible.sync="showApproval"
+          @confirm="approval_confirm"
+        />
+      </el-form-item>
+      <el-form-item label="审批人" prop="reviewer_id" :rules="[{ required: true, message: '请选择审批人'}]">
+        <el-input auto-complete="off" v-model="formData.reviewer_name" placeholder="请选择审批人" :disabled="true">
+          <el-button slot="append" icon="el-icon-search" @click.stop="showReviewer = true" />
+        </el-input>
+        <EmployeeSelector
+          :multi="false"
+          :is-chec-ked-all="false"
+          :is_manager_only="true"
+          :is_filtration_creator="false"
+          :selected="formData.reviewer_selected"
+          :visible.sync="showReviewer"
+          @confirm="reviewer_confirm"
+        />
+      </el-form-item>
+      <el-form-item
+        label="截止时间"
+        prop="expire_time"
+        :rules="[{required:true,message:'请选择截止时间'}]"
+      >
+        <el-date-picker
+          v-model="formData.expire_time"
+          type="datetime"
+          :picker-options="pickerOptions"
+          placeholder="选择截止时间"
+          format="yyyy-MM-dd HH:mm"
+          value-format="yyyy-MM-dd HH:mm"
+          default-time="18:00"
+          :clearable="false"
+        />
+        <el-tooltip placement="right" style="margin-left: 10px" content="任务截止时间是触发任务提前奖分/逾期扣分的关键属性"><span class="tips">?</span></el-tooltip>
+      </el-form-item>
+
+      <el-form-item
+        label="任务备注"
+        prop="task_remark"
+        :rules="[{max:300,message:'只允许最多300个字'}]"
+      >
+        <el-input
+          type="textarea"
+          :rows="5"
+          maxlength="300"
+          show-word-limit
+          v-model="formData.task_remark"
+          @input="onTaskRemarkInput"
+        />
+      </el-form-item>
+
+      <div style="margin-left: 80px; margin-bottom: 8px;">以天为单位,每 提前/逾期 一天 加分/扣分</div>
+      <el-form-item
+        label="提前奖分"
+        prop="ahead_award_point"
+      >
+        <el-input
+          v-model="formData.ahead_award_point"
+          @input="v => formData.ahead_award_point = v.replace(/[^\d]/g,'')"
+          placeholder="请输入每日奖分" style="width: 150px;"
+        />
+        B分/每天,
+        奖分上限 &nbsp;
+        <el-input
+          v-model="formData.ahead_award_point_limit"
+          @input="v => formData.ahead_award_point_limit = v.replace(/[^\d]/g,'')"
+          placeholder="请输入奖分上限"
+          style="width: 150px;"
+        />
+        B分
+      </el-form-item>
+      <el-form-item
+        label="逾期扣分"
+        prop="timeout_deduction_point"
+      >
+        <el-input
+          v-model="formData.timeout_deduction_point"
+          @input="v => formData.timeout_deduction_point = v.replace(/[^\d]/g,'')"
+          placeholder="请输入每日扣分"
+          style="width: 150px;"/>
+        B分/每天,扣分上限 &nbsp;
+        <el-input
+          v-model="formData.timeout_deduction_point_limit"
+          @input="v => formData.timeout_deduction_point_limit = v.replace(/[^\d]/g,'')"
+          placeholder="请输入扣分上限"
+          style="width: 150px;"
+        />
+        B分
+      </el-form-item>
+      <el-form-item>
+        <el-button @click.stop="close">关闭</el-button>
+        <el-button type="primary" @click.stop="taskSubmit">提交</el-button>
+      </el-form-item>
+    </el-form>
+  </el-dialog>
+</template>
+
+<script>
+
+import Template from "../../../examine/components/Template.vue";
+import SelectRule from "../../../components/SelectRule.vue";
+import EmployeeSelector from "../../../components/EmployeeSelector.vue";
+import {specialFilter} from "../../../utils";
+
+export default {
+  name: "WorkUpdate",
+  components: {EmployeeSelector, SelectRule, Template},
+  props:{
+    taskVisible:{
+      type: Boolean,
+      default: false
+    },
+    workId:{
+      type: Number,
+      default:0
+    }
+  },
+  data() {
+    return {
+      firstInit:true,
+      pts:this.$getTyps(),
+      employee_list: this.$store.getters.user_info.employee_detail.manage_scope,
+      showApproval:false,
+      showReviewer:false,
+      pickerOptions:{
+        disabledDate (time) {
+          //disabledDate 文档上:设置禁用状态,参数为当前日期,要求返回 Boolean
+          // return time.getTime() > Date.now()//选当前时间之前的时间
+          let num=60*60*24*1000
+          return (time.getTime()+num) < Date.now()//选当前时间之后的时间
+        }
+      },
+      // 执行者
+      loading:false,
+      rule_list:[],
+      showRuleItems:false,
+      formData:{
+        rule_type:0,
+        rule_id:0,
+        item_id:0,
+        rule_item:{
+          id:0,
+          remark:"",
+          cycle_type: 0,
+          is_attendance: 0,
+          max_point: 0,
+          min_point: 0,
+          prize_type: 0,
+          pt_id: 0,
+          range_type: 0,
+        },
+        task_name: '',
+        base_point: '',
+        task_remark: '',
+        pt_id: 3,
+        expire_time: '',
+        targets: [],
+        target_name:'',
+        target_selected:{ dept: [], employee: [] },
+        reviewer_id: 0,
+        reviewer_name:'',
+        reviewer_selected:{ dept: [], employee: [] },
+        timeout_deduction_point: null,
+        timeout_deduction_point_limit: null,
+        ahead_award_point: null,
+        ahead_award_point_limit: null,
+      }
+    }
+  },
+  watch:{
+    'formData.rule_type'(val,old) {
+      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    //防止一进来就将规则选项重置
+    }
+  },
+  computed:{
+    selectItem(){
+      return this.formData.rule_item && this.formData.rule_item.id ? [this.formData.rule_item] : []
+    },
+    itemRemark(){
+      let pt = this.pts.find(pt => pt.id === this.formData.rule_item.pt_id)
+      pt = pt ? pt.name : ''
+      switch (this.formData.rule_item.range_type){
+        case 1:
+          return `${this.formData.rule_item.min_point} ${pt}`
+        case 2:
+          return `${this.formData.rule_item.min_point} -- ${this.formData.rule_item.max_point} ${pt}`
+        default:
+          return ''
+      }
+    }
+  },
+  methods:{
+    initRuleData(){
+      this.formData.rule_id = 0
+      this.formData.item_id = 0
+      this.formData.rule_item = {
+        id:0,
+        remark:"",
+        cycle_type: 0,
+        is_attendance: 0,
+        max_point: 0,
+        min_point: 0,
+        prize_type: 0,
+        pt_id: 0,
+        range_type: 0,
+      }
+      this.formData.base_point = 1
+    },
+    close(){
+      this.$emit('update:taskVisible',false)
+    },
+    loadDetail(){
+      if (this.workId <= 0) return
+      let self = this
+      self.loading = true
+      self.firstInit = true
+      let data = {
+        work_id: this.workId
+      }
+      this.$axiosUser('get','/api/pro/integral/work',data)
+        .then(res =>{
+          if (res.data.code !== 1) {
+            self.$message.error(res.data.msg)
+            return
+          }
+          let info = res.data.data
+          let formData = {
+            rule_type:0,
+            rule_id:info.rule_id,
+            item_id:info.item_id,
+            rule_item:{
+              id:0,
+              remark:"",
+              cycle_type: 0,
+              is_attendance: 0,
+              max_point: 0,
+              min_point: 0,
+              prize_type: 0,
+              pt_id: 0,
+              range_type: 0,
+            },
+            task_name: info.task_name,
+            base_point: info.point_config.base_point || 0,
+            task_remark: info.task_remark,
+            pt_id: info.pt_id,
+            expire_time: info.expire_time,
+            targets: [info.employee_id],
+            target_name:info.employee_name,
+            target_selected:{ dept: [], employee: [{id:info.employee_id,img_url:info.img_url,name:info.employee_name}] },
+            reviewer_id: info.reviewer_id,
+            reviewer_name:info.reviewer_name,
+            reviewer_selected:{ dept: [], employee: [{id:info.reviewer_id,img_url:info.reviewer_img_url,name:info.reviewer_name}] },
+            timeout_deduction_point: info.point_config.timeout_deduction_point || '',
+            timeout_deduction_point_limit: info.point_config.timeout_deduction_point_limit || '',
+            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,
+            }
+          }
+          formData.rule_type = info.item_id && info.rule_id ? 2 : (info.rule_id ? 1 : 0)
+          self.formData = formData
+          self.loading = false
+        })
+        .catch(err => {
+          self.$message.error(err)
+        })
+    },
+    getRuleList(){
+      let data = {
+        cycle_type:'1',
+        pt_id: this.formData.pt_id
+      }
+      this.$axiosUser('get','/api/pro/integral/rule/trees/scope',data)
+        .then(res => {
+          this.rule_list = this.getTreeData(res.data.data.rule_tree)
+        })
+    },
+    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;
+    },
+    onItemConfirm(selectArrItem){
+      this.formData.rule_item = selectArrItem.length > 0 ? selectArrItem[0] : {
+        id:0,
+        remark:"",
+        cycle_type: 0,
+        is_attendance: 0,
+        max_point: 0,
+        min_point: 0,
+        prize_type: 0,
+        pt_id: 0,
+        range_type: 0,
+      }
+      this.formData.item_id = this.formData.rule_item.id
+      this.formData.rule_id = this.formData.rule_item.rule_id
+      this.formData.base_point = this.formData.rule_item.min_point !== 0 ? this.formData.rule_item.min_point : 1
+    },
+    onBasePointChange(currentValue,oldValue){
+      //限制范围分的上下限拦截
+      if (this.formData.rule_type !== 2 && this.formData.rule_item.range_type !== 2) return
+
+      if (currentValue < this.formData.rule_item.min_point) {
+        this.$nextTick(() => {
+          this.formData.base_point = this.formData.rule_item.min_point
+        })
+      }
+      if (currentValue > this.formData.rule_item.max_point) {
+        this.$nextTick( () => {
+          this.formData.base_point = this.formData.rule_item.max_point
+        })
+      }
+    },
+    approval_confirm(data) {
+      this.formData.target_selected = { dept: [], employee: [] };
+      this.formData.targets = [];
+      this.formData.target_name = '';
+      if (data.employee !== null && data.employee.length != 0) {
+        this.formData.target_selected = data;
+        this.formData.targets.push(data.employee[0].id);
+        this.formData.target_name = data.employee[0].name;
+      }
+    },
+    reviewer_confirm(data){
+      this.formData.reviewer_selected = { dept: [], employee: [] };
+      this.formData.reviewer_id = '';
+      this.formData.reviewer_name = '';
+      if (data.employee !== null && data.employee.length != 0) {
+        this.formData.reviewer_selected = data;
+        this.formData.reviewer_id = data.employee[0].id;
+        this.formData.reviewer_name = data.employee[0].name;
+      }
+    },
+    onTaskNameInput(val){
+      this.formData.task_name = specialFilter(val)
+    },
+    onTaskRemarkInput(val){
+      this.formData.task_remark = specialFilter(val)
+    },
+    ahead_timeout(item,arr,codes,code){
+      if(item){
+        if(arr){
+          if(Number(item) > Number(arr)){
+            this.$message.warning(code +'上限不能小于每日'+ codes)
+            return true
+          }
+        }else{
+          this.$message.warning( codes + '不为0时,'+ code +'上限不能为空')
+          return true
+        }
+      }
+    },
+    taskSubmit(){
+      if (this.formData.rule_type === 1 && this.formData.rule_id <= 0){
+        this.$message.error("请选择规则分类")
+        return
+      }
+      if (this.formData.rule_type === 2 && this.formData.item_id <= 0){
+        this.$message.error("请选择积分规则")
+        return
+      }
+      this.$refs['formData'].validate(valid => {
+        if (valid){
+          let data = {
+            ahead_award_point:this.formData.ahead_award_point ? this.formData.ahead_award_point : 0,
+            ahead_award_point_limit:this.formData.ahead_award_point_limit ? this.formData.ahead_award_point_limit : 0,
+            timeout_deduction_point:this.formData.timeout_deduction_point ? this.formData.timeout_deduction_point : 0,
+            timeout_deduction_point_limit:this.formData.timeout_deduction_point_limit ? this.formData.timeout_deduction_point_limit : 0,
+            targets:this.formData.targets,
+            task_name:this.formData.task_name,
+            task_remark:this.formData.task_remark,
+            rule_id:this.formData.rule_id,
+            item_id:this.formData.item_id,
+            id:this.workId,
+            base_point:this.formData.base_point,
+            expire_time:this.formData.expire_time,
+            reviewer_id:this.formData.reviewer_id,
+            package_id:0,
+            weight:0,
+            pt_id:this.formData.pt_id
+          }
+
+          if(!data.ahead_award_point && data.ahead_award_point_limit){
+            this.$message.warning('奖分上限不为0时,提前奖分不能为空')
+            return
+          }else if(data.ahead_award_point && !data.ahead_award_point_limit){
+            this.$message.warning('提前奖分不为0时,奖分上限不能为空')
+            return
+          }
+
+          if(!data.timeout_deduction_point && data.timeout_deduction_point_limit){
+            this.$message.warning('扣分上限不为0时,逾期扣分不能为空')
+            return
+          }else if(data.timeout_deduction_point && !data.timeout_deduction_point_limit){
+            this.$message.warning('逾期扣分不为0时,扣分上限不能为空')
+            return
+          }
+
+          if(this.ahead_timeout(data.ahead_award_point,data.ahead_award_point_limit,'提前奖分','奖分')) return
+          if(this.ahead_timeout(data.timeout_deduction_point,data.timeout_deduction_point_limit,'逾期扣分','扣分')) return
+
+          let point_limit = this.$userInfo().point_config.point_limit ? this.$userInfo().point_config.point_limit.find(pt => pt.pt_id === 3) : null
+          if(!this.$supremeAuthority('creator') && point_limit){
+            let entry_limit =  Number(point_limit.point)
+            if(entry_limit > 0){
+              if(data.ahead_award_point > entry_limit || data.timeout_deduction_point > entry_limit ){
+                this.$message.warning('每日奖扣分 不能超过您的奖扣分权限(您的奖扣分权限:' + entry_limit + '分)')
+                return
+              }
+              if(data.ahead_award_point_limit > entry_limit*10 || data.timeout_deduction_point_limit > entry_limit*10 ){
+                this.$message.warning('奖扣分上限不能超过' + entry_limit*10 + '分(您的奖扣分权限' + entry_limit + '分*10)')
+                return
+              }
+            }
+          }
+
+          let self = this
+          self.loading = true
+
+          self.$axiosUser('post', '/api/pro/integral/work/update', data)
+            .then(res => {
+              if (res.data.code !== 1){
+                self.$message.error(res.data.msg)
+                self.loading = false
+                return
+              }
+              self.$emit('hasSubmit')
+              self.$message.success(res.data.msg)
+              self.$emit('update:taskVisible',false)
+            })
+            .catch(err => {
+              self.$message.error(err)
+              self.loading = false
+            })
+
+
+        }
+      })
+    }
+  },
+  mounted() {
+    this.getRuleList()
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.tips {
+  background: #409EFF;
+  border-radius: 50%;
+  width: 14px;
+  height: 14px;
+  color: #fff;
+  display: inline-block;
+  font-size: 12px;
+  line-height: 14px;
+  text-align: center;
+}
+</style>

+ 14 - 4
src/point/views/common/applicationIntegrationPopup.vue

@@ -59,7 +59,7 @@
               :prop="'items.' + index + '.remark'"
               :rules="[{ required: true, message: '请输入事件内容'}, { min: 2, max: 300, message: '长度在 2 到 300 个字符'}]"
             >
-              <el-input type="textarea" clearable maxlength="300" show-word-limit rows="4" placeholder="请输入事件内容" v-model="item.remark"></el-input>
+              <el-input type="textarea" clearable maxlength="300" show-word-limit rows="4" placeholder="请输入事件内容" v-model="item.remark" @input="onRemarkInput(item)"></el-input>
               <el-button @click="item.remark=''" type="danger" plain size="mini" style="position: absolute;right: 0px;bottom: -30px;z-index: 99999;">清空</el-button>
             </el-form-item>
 
@@ -118,13 +118,19 @@
         <el-table-column prop="msg" label="备注信息"></el-table-column>
         <el-table-column prop="status" label="处理状态">
           <template slot-scope="scope">
-            <span :style="'color:' + (scope.row.status == 0 ? '#f70000' : '#47bf47')">{{ scope.row.status == 0 ? '申请失败' : '申请成功' }}</span>
+            <span :style="'color:' + (scope.row.status === 0 ? '#f70000' : '#47bf47')">{{ scope.row.status === 0 ? '申请失败' : '申请成功' }}</span>
           </template>
         </el-table-column>
       </el-table>
     </el-dialog>
 
-    <SelectRule :visible.sync="isShowRule" @confirm="ruleConfirm" :ptId="0"  :selectItems="selectItem"></SelectRule>
+    <SelectRule
+      :visible.sync="isShowRule"
+      :ptId="0"
+      :selectItems="selectItem"
+      :is-scope="true"
+      @confirm="ruleConfirm"
+    />
 
     <el-dialog title="提交结果" :visible.sync="isResult"  width="1000" :close-on-click-modal="false" :close-on-press-escape="false" :show-close="false">
     	<div v-if="!isShowError">
@@ -172,6 +178,7 @@ import moment from 'moment';
 import EmployeeSelector from '@/components/EmployeeSelector';
 import uploadOss from '@/components/upload';
 import SelectRule from '@/components/SelectRule';
+import {specialFilter} from "../../../utils";
 
 export default {
   name: 'applicationIntegration',
@@ -300,7 +307,7 @@ export default {
             items.push(this.isItemId(e.id))
           }else{
             let item = JSON.parse(JSON.stringify(this.item));
-            item.remark = e.remark;
+            item.remark = specialFilter(e.remark);
             item.rule_id = e.rule_id;
             item.item_id = e.id;
             item.ruleData= e;
@@ -582,6 +589,9 @@ export default {
         };
       })
       this.$emit('update:visible', false);
+    },
+    onRemarkInput(item){
+      item.remark = specialFilter(item.remark)
     }
   }
 };

+ 17 - 5
src/point/views/common/bonusPointsPopup.vue

@@ -67,7 +67,7 @@
               :prop="'items.' + index + '.remark'"
               :rules="[{ required: true, message: '请输入事件内容'}, { min: 2, max: 300, message: '长度在 2 到 300 个字符'}]"
             >
-              <el-input type="textarea" clearable maxlength="300" show-word-limit rows="4" placeholder="请输入事件内容" v-model="item.remark"></el-input>
+              <el-input type="textarea" clearable maxlength="300" show-word-limit rows="4" placeholder="请输入事件内容" v-model="item.remark" @input="onRemarkInput(item)"></el-input>
               <el-button @click="item.remark=''" type="danger" plain size="mini" style="position: absolute;right: 0px;bottom: -30px;z-index: 99999;">清空</el-button>
             </el-form-item>
 
@@ -142,7 +142,13 @@
         <el-table-column prop="rule_item" label="备注信息"></el-table-column>
       </el-table>
     </el-dialog>
-    <SelectRule :visible.sync="isShowRule" @confirm="ruleConfirm" :ptId="ptId" :selectItems="selectItem"></SelectRule>
+    <SelectRule
+      :visible.sync="isShowRule"
+      :ptId="ptId"
+      :selectItems="selectItem"
+      :is-scope="true"
+      @confirm="ruleConfirm"
+    />
     <el-dialog title="提交结果" :visible.sync="isResult"  width="1000" :close-on-click-modal="false" :close-on-press-escape="false" :show-close="false">
     	<div v-if="!isShowError">
     		<div style="text-align: center;margin-bottom: 10px;" class="red" v-if="isShowError2">{{errorMsg}}</div>
@@ -236,6 +242,7 @@ import moment from 'moment';
 import EmployeeSelector from '@/components/EmployeeSelector';
 import uploadOss from '@/components/upload';
 import SelectRule from '@/components/SelectRule';
+import {specialFilter} from "../../../utils";
 export default {
   name: 'bonusPointsForm',
   // 数据
@@ -407,7 +414,6 @@ export default {
     ruleChange(value,obj) {
       this.$nextTick(()=>{
         let nodes=this.$refs['ruleCascader'].getCheckedNodes()//选择的节点数据
-        // console.log(nodes)
         let itemIds=value.map(e=>{
           return e[e.length-1]
         })
@@ -446,7 +452,7 @@ export default {
             items.push(this.isItemId(e.id))
           }else{
             let item = JSON.parse(JSON.stringify(this.item));
-            item.remark = e.remark;
+            item.remark = specialFilter(e.remark);
             item.name = e.remark;
             item.rule_id = e.rule_id;
             item.item_id = e.id;
@@ -559,9 +565,12 @@ export default {
       if (this.deptIds.length > 0 && this.getQx()) {//选择指定部门规则,创始人,公司,积分专员不限制
         data['dep_ids'] = JSON.stringify(this.deptIds);
       }
-      this.$axiosUser('get', '/api/pro/integral/rule/trees', data).then(res => {
+      this.$axiosUser('get', '/api/pro/integral/rule/trees/scope', data).then(res => {
         this.rule_list = this.getTreeData(res.data.data.rule_tree);
       });
+      // this.$axiosUser('get', '/api/pro/integral/rule/trees', data).then(res => {
+      //   this.rule_list = this.getTreeData(res.data.data.rule_tree);
+      // });
     },
 
     // 递归判断列表,把最后的child设为undefined
@@ -774,6 +783,9 @@ export default {
       this.selectItem=[];
       this.rule_list_value=[];
       this.$emit('update:visible', false);
+    },
+    onRemarkInput(item){
+      item.remark = specialFilter(item.remark)
     }
   }
 };

+ 292 - 72
src/point/views/common/examinePopup.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
     <el-drawer :title="title" :visible.sync="show" :with-header="false" :size="'600px'" :before-close="closeDetail" direction="rtl">
-      <div class="drawer_title">审批详情</div>
+<!--      <div class="drawer_title">审批详情</div>-->
       <div v-loading="detail_loading">
         <div class="detail_popup" v-if="detail_info !== null">
           <el-row :gutter="10" style="padding-bottom:20px;border-bottom:1px #f8f8f8 solid;position: relative;">
@@ -21,69 +21,161 @@
                 </span>
                 <span class="color_green point" v-show="detail_info.point < 0 && detail_info.point">{{ detail_info.point }} {{ $getTypsName(detail_info.pt_id) }}</span>
               </template>
-              <br />
-              <template>
-                <b style="font-size:13px;position: absolute;left:65px;top:45px">
-                  <span v-if="detail_info.status == 1" class="green">审批通过</span>
-                  <span v-else-if="detail_info.status == 2" class="red">审批驳回</span>
-                  <span v-else-if="detail_info.status == 0" class="orange">待审批</span>
-                  <span v-else></span>
-                </b>
-              </template>
+<!--              <br />-->
+<!--              <template>-->
+<!--                <b style="font-size:13px;position: absolute;left:65px;top:45px">-->
+<!--                  <span v-if="detail_info.status == 1" class="green">审批通过</span>-->
+<!--                  <span v-else-if="detail_info.status == 2" class="red">拒绝</span>-->
+<!--                  <span v-else-if="detail_info.status == 0" class="orange">待审批</span>-->
+<!--                  <span v-else></span>-->
+<!--                </b>-->
+<!--              </template>-->
+              <el-tag :type="reviewStatusType(detail_info.review_status)" >{{reviewStatusMap[detail_info.review_status] || '--'}}</el-tag>
             </el-col>
           </el-row>
-          <el-row :gutter="10" v-for="(item, index) in detail_info.detail" :key="index">
-            <el-col :span="4">{{ item.key }}</el-col>
-            <el-col :span="20" v-if="item.key == '附件'">
-              <el-image v-for="(items, indexs) in item.value" :key="indexs" style="width: 100px; height: 100px;margin:2px;" :src="items" :preview-src-list="item.value"></el-image>
-            </el-col>
-            <el-col :span="20" v-else-if="item.key == '工作留存'">
-              <el-image v-for="(items, indexs) in item.value" :key="indexs" style="width: 100px; height: 100px;margin:2px;" :src="items" :preview-src-list="item.value"></el-image>
-            </el-col>
-            <el-col :span="20" v-else style="word-wrap: break-word">{{ item.value }}</el-col>
-          </el-row>
-          <el-row :gutter="10" v-if="detail_info.files != null && detail_info.files > 0">
-            <el-col :span="4">图片</el-col>
-            <el-col :span="20"><el-image style="width: 100px; height: 100px" :src="detail_info.files[0]" :preview-src-list="detail_info.files"></el-image></el-col>
-          </el-row>
-          <div v-show="detail_info.item_name != ''">
-            <p class="row_title">
-              规则依据 &nbsp;
+          <el-descriptions direction="vertical" :column="2" border title="审批信息" >
+            <el-descriptions-item
+              v-for="(item,index) in detail_info.detail"
+              :key="index"
+              :label="item.key"
+              :label-style="{textAlign:'center',maxWidth:'200px'}"
+              :content-style="{textAlign:'center',maxWidth: '200px'}"
+            >
+              <template v-if="item.key === '附件'">
+                <el-image v-for="(items, indexs) in item.value" :key="indexs" style="width: 50px; height: 50px;margin:2px;" :src="items" :preview-src-list="item.value"></el-image>
+              </template>
+              <template v-else-if="item.key === '工作留存'">
+                <el-image v-for="(items, indexs) in item.value" :key="indexs" style="width: 100px; height: 100px;margin:2px;" :src="items" :preview-src-list="item.value"></el-image>
+              </template>
+              <template v-else>
+                <el-popover
+                  placement="bottom"
+                  :title="item.key"
+                  width="500"
+                  trigger="click"
+                  :content="item.value.toString()"
+                >
+                  <div slot="reference" style="cursor: pointer" class="desc-content">{{item.value}}</div>
+                </el-popover>
+              </template>
+              <template v-else-if="item.key === '工作备注'">
+                <el-popover
+                  placement="bottom"
+                  title="工作备注"
+                  width="500"
+                  trigger="click"
+                  :content="item.value"
+                >
+                  <div slot="reference" style="cursor: pointer" class="desc-content">{{item.value}}</div>
+                </el-popover>
+              </template>
+            </el-descriptions-item>
+          </el-descriptions>
+          <el-descriptions
+            direction="vertical"
+            :column="1"
+            border
+            v-if="detail_info.item_name"
+            :label-style="{textAlign:'center',width:'100px'}"
+            :content-style="{textAlign:'center',maxWidth:'200px'}"
+          >
+            <template slot="title">
+              <p class="row_title">规则依据</p>
               <span class="row_tips" style="font-size:12px;color:#909399">此事件打分参考以下积分规则</span>
-            </p>
-            <el-row>
-              <el-col :span="4">事件分类</el-col>
-              <el-col :span="20">{{ detail_info.rule_name }}</el-col>
-            </el-row>
-            <el-row>
-              <el-col :span="4">积分规则</el-col>
-              <el-col :span="20">{{ detail_info.item_name }}</el-col>
-            </el-row>
-						<el-row>
-							<el-col :span="4">规则积分</el-col>
-							<el-col :span="20">
-								<template v-if="detail_info.item_range_type == 1">
-									<span v-if="detail_info.item_max_point > 0">+</span>
-									{{ detail_info.item_max_point }}{{ detail_info.pt_id == 3 ? 'B分' : detail_info.pt_id == 2 ? 'A分' : detail_info.pt_id == 1 ? '绩效分' : '' }}
-								</template>
-								<template v-else>
-									{{ detail_info.item_min_point }}~{{ detail_info.item_max_point
-									}}{{ detail_info.pt_id == 3 ? 'B分' : detail_info.pt_id == 2 ? 'A分' : detail_info.pt_id == 1 ? '绩效分' : '' }}
-								</template>
-							</el-col>
-						</el-row>
-          </div>
+            </template>
+            <el-descriptions-item label="规则分类">
+              <el-popover
+                placement="bottom"
+                title="规则分类"
+                trigger="click"
+                :content="detail_info.rule_name"
+              >
+                <div slot="reference" style="cursor: pointer" class="desc-content">{{detail_info.rule_name}}</div>
+              </el-popover>
+            </el-descriptions-item>
+            <el-descriptions-item label="积分规则">
+              <el-popover
+                placement="bottom"
+                title="事件分类"
+                trigger="click"
+                :content="detail_info.item_name"
+              >
+                <div slot="reference" style="cursor: pointer" class="desc-content">{{detail_info.item_name}}</div>
+              </el-popover>
+            </el-descriptions-item>
+            <el-descriptions-item label="规则积分">
+              <template v-if="detail_info.item_range_type === 1">
+                <span v-if="detail_info.item_max_point > 0">+</span>
+                {{ detail_info.item_max_point }}{{ detail_info.pt_id === 3 ? 'B分' : detail_info.pt_id === 2 ? 'A分' : detail_info.pt_id === 1 ? '绩效分' : '' }}
+              </template>
+              <template v-else>
+                {{ detail_info.item_min_point }}~{{ detail_info.item_max_point
+                }}{{ detail_info.pt_id === 3 ? 'B分' : detail_info.pt_id === 2 ? 'A分' : detail_info.pt_id === 1 ? '绩效分' : '' }}
+              </template>
+            </el-descriptions-item>
+          </el-descriptions>
+          <el-descriptions
+            direction="vertical"
+            :column="1"
+            border
+            v-else-if="detail_info.rule_name"
+            :label-style="{textAlign:'center'}"
+            :content-style="{textAlign:'center'}"
+          >
+            <template slot="title">
+              <p class="row_title">规则依据</p>
+              <span class="row_tips" style="font-size:12px;color:#909399">此事件打分参考以下积分规则</span>
+            </template>
+            <el-descriptions-item label="规则分类">
+              <el-popover
+                placement="bottom"
+                title="规则分类"
+                width="500"
+                trigger="click"
+                :content="detail_info.rule_name"
+              >
+                <div slot="reference" style="cursor: pointer" class="desc-content">{{detail_info.rule_name}}</div>
+              </el-popover>
+            </el-descriptions-item>
+          </el-descriptions>
+
           <div v-show="detail_info.process">
             <Steps :process="detail_info.process"></Steps>
           </div>
+          <el-collapse v-if="detail_info && detail_info.logs" v-model="infoActiveNames">
+            <el-collapse-item :disabled="detail_info.logs.length === 0" :title="detail_info.logs.length + '条操作日志'" name="logs">
+              <el-alert
+                v-for="(item,index) in detail_info.logs"
+                :key="index"
+                type="info"
+                show-icon
+                :title="item.create_time + ' ' + item.msg"
+                :closable="false"
+              />
+            </el-collapse-item>
+          </el-collapse>
         </div>
         <footer class="drawer-footer flex-box-end flex-v-ce">
-          <div v-if="detail_info.status == 0&&detail_info.reviewer_id==$userInfo().id">
-            <el-button v-if="detail_info.pt_id == 1" @click="closeDetail">取消</el-button>
-            <el-button v-else @click="rejectBtn">驳回</el-button>
-            <el-button type="primary" @click="adoptBtn">通过</el-button>
+<!--          <div v-if="detail_info.status == 0&&detail_info.reviewer_id==$userInfo().id">-->
+
+          <div v-if="canComplete">
+            <el-button v-if="canRejectRewrite" type="warning" @click="showRejectRewrite = true" >
+              <el-tooltip content="驳回申请,任务执行者重新处理任务再重新提交" placement="top-start"><span>驳回重做</span></el-tooltip>
+            </el-button>
+
+
+            <el-button v-if="detail_info.pt_id === 1" @click="closeDetail">取消</el-button>
+
+            <el-button v-else @click="rejectBtn">
+              <el-tooltip content="拒绝并终止审批" placement="top"><span>拒绝</span></el-tooltip>
+            </el-button>
+
+            <el-button type="primary" @click="adoptBtn">
+              <el-tooltip content="第一阶段审批节点可指定分数值是否发放奖票等,并可以继续提交到下个审批人" placement="top-end"><span>通过</span></el-tooltip>
+            </el-button>
           </div>
-          <div v-if="detail_info.can_refuse==1">
+
+          <div v-if="canRefuse">
             <span style="color:#909399;font-size:12px;padding-right:20px">撤回后需重新审批</span>
             <el-button type="primary" @click="revokeApproval">撤回审批</el-button>
           </div>
@@ -91,7 +183,7 @@
       </div>
     </el-drawer>
 
-    <el-dialog :close-on-click-modal="false" title="审批驳回" :visible.sync="rejectShow" :before-close="rejectClose" width="520px">
+    <el-dialog :close-on-click-modal="false" title="拒绝审批" :visible.sync="rejectShow" :before-close="rejectClose" width="520px" center>
       <el-form :model="rejectForm" ref="rejectForm" label-width="80px" v-loading="rejectLoading">
         <el-form-item
           label="审批意见"
@@ -106,17 +198,17 @@
             }
           ]"
         >
-          <el-input type="textarea" :rows="4" v-model="rejectForm.remark" placeholder="请输入审批意见(限50字)"></el-input>
+          <el-input type="textarea" :rows="4" v-model="rejectForm.remark" placeholder="请输入审批意见(限50字)" maxlength="50" show-word-limit @input="onRejectRemarkInput"></el-input>
         </el-form-item>
 
         <div class="flex-box-end">
           <el-button @click="cancelReject('rejectForm')">取消</el-button>
-          <el-button type="primary" @click="confirmReject('rejectForm')">确认驳回</el-button>
+          <el-button type="primary" @click="confirmReject('rejectForm')">确认</el-button>
         </div>
       </el-form>
     </el-dialog>
 
-    <el-dialog title="审批通过" :close-on-click-modal="false" :visible.sync="adoptShow" width="571px" :before-close="adoptClose">
+    <el-dialog title="通过审批" :close-on-click-modal="false" :visible.sync="adoptShow" width="571px" :before-close="adoptClose" center>
       <el-form :model="adoptForm" ref="adoptForm" label-width="80px" v-loading="determinedBy" class="form">
         <el-form-item label="指定规则" v-if="!detail_info.rule_id && !detail_info.item_id && detail_info.source_type != 4">
           <el-switch v-model="adoptForm.ruleOrItem" active-color="#13ce66"></el-switch>
@@ -149,7 +241,7 @@
         <el-form-item
           label="规则"
           v-if="detail_info.source_type != 4"
-          v-show="(detail_info.rule_id && detail_info.item) || adoptForm.ruleOrItem"
+          v-show="(detail_info.rule_id && detail_info.item_id) || adoptForm.ruleOrItem"
           prop="item_id"
           :rules="[{ required: true, message: '请选择规则'}]"
         >
@@ -201,7 +293,7 @@
               :min="detail_info.item_min_point"
               :max="detail_info.item_max_point"
               v-model="adoptForm.point"
-              :disabled="detail_info.pid? true:false"
+              :disabled="!isFirstStep"
               type="number"
             ></el-input-number>
             <el-input-number
@@ -232,12 +324,12 @@
           prop="remark"
           :rules="[{ required: true, message: '请输入审批意见'}, { max: 100, message: '长度不能超过 100 个字符'}]"
         >
-          <el-input :rows="4" type="textarea" v-model="adoptForm.remark" placeholder="说点什么(限100字)"></el-input>
+          <el-input :rows="4" type="textarea" v-model="adoptForm.remark" placeholder="说点什么(限100字)" @input="onApprovalRemarkInput"></el-input>
         </el-form-item>
         <div style="padding-left: 80px">奖票用于优秀表现和重要事项的表彰</div>
-        <el-form-item label="发放奖票"><el-switch :disabled="!!detail_info.pid" v-model="adoptForm.switch" active-color="#13ce66"></el-switch></el-form-item>
+        <el-form-item label="发放奖票"><el-switch :disabled="!isFirstStep" v-model="adoptForm.switch" active-color="#13ce66"></el-switch></el-form-item>
 
-        <el-form-item label="发生时间" v-if="(detail_info.source_type == 2 || detail_info.source_type == 3) && detail_info.pid == 0">
+        <el-form-item label="发生时间" v-if="(detail_info.source_type === 2 || detail_info.source_type === 3) && isFirstStep">
           <el-row>
             <el-col :span="18">
               <el-date-picker
@@ -270,15 +362,52 @@
           />
         </el-form-item>
         <el-form-item v-if="detail_info.source_type != 4" label="审批意见" prop="remark" :rules="[{ max: 100, message: '长度不能超过 100 个字符'}]">
-          <el-input :rows="4" type="textarea" v-model="adoptForm.remark" placeholder="说点什么(限100字)"></el-input>
+          <el-input :rows="4" type="textarea" v-model="adoptForm.remark" placeholder="说点什么(限100字)" @input="onApprovalRemarkInput"></el-input>
         </el-form-item>
 
-        <el-form-item>
+        <center>
           <el-button @click="adoptClose">取 消</el-button>
-          <el-button type="primary" @click="submitAdopt('adoptForm')">确定通过</el-button>
-        </el-form-item>
+          <el-button type="primary" @click="submitAdopt('adoptForm')">确定</el-button>
+        </center>
       </el-form>
     </el-dialog>
+
+    <el-dialog
+      title="驳回重做"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :modal="false"
+      :show-close="false"
+      :visible.sync="showRejectRewrite"
+      width="571px"
+      center
+    >
+      <template>
+        <el-form v-model="formRejectRewrite">
+          <el-form-item>
+            <el-input
+              type="textarea"
+              :rows="3"
+              :clearable="true"
+              :maxlength="100"
+              :show-word-limit="true"
+              placeholder="原因说明"
+              v-model="formRejectRewrite.remark"
+              @input="onRewriteRemarkInput"
+            />
+          </el-form-item>
+        </el-form>
+      </template>
+      <template slot="footer">
+        <div class="flex-box-end flex-v-ce">
+          <el-button @click="formRejectRewrite.remark = '',showRejectRewrite = false">关闭</el-button>
+          <el-button type="primary" :disabled="!canRejectRewrite" :loading="submitting" @click="rejectRewrite">确认</el-button>
+        </div>
+      </template>
+
+    </el-dialog>
+
+
   </div>
 </template>
 
@@ -286,6 +415,8 @@
 import EmployeeSelector from '@/components/EmployeeSelector';
 import Steps from '@/components/Steps.vue';
 import moment from 'moment';
+import Template from "../../../examine/components/Template.vue";
+import {specialFilter} from "../../../utils";
 export default {
   name: 'examinePopup',
   data() {
@@ -344,7 +475,20 @@ export default {
       show_employee_selector: false,
       isCreator:false,//是否创始人
       flatteningIntegralRules:[],
+      showRejectRewrite:false,
+      formRejectRewrite:{
+        remark:''
+      },
+      submitting:false,
+      infoActiveNames:[],
+      reviewStatusMap:{
+        0:'待审批',
+        1:'已通过',
+        2:'拒绝',
+        3:'驳回重做',
+      }
     };
+
   },
   props: {
     id: {
@@ -385,16 +529,30 @@ export default {
       }
     }
   },
-  components: { EmployeeSelector, Steps, moment },
+  components: {Template, EmployeeSelector, Steps, moment },
   computed: {
+    isFirstStep(){
+      return this.detail_info && ((this.detail_info.pid === 0 && this.detail_info.step === 0) || this.detail_info.step === 1)
+    },
+    canComplete(){
+      return this.detail_info && this.detail_info.can_complete === 1
+    },
+    canRefuse(){
+      return this.detail_info && this.detail_info.can_refuse === 1
+    },
+    canRejectRewrite(){
+      return this.canComplete && this.detail_info.source_type === 1
+    },
     returnIs() {
       let is=false
       is=this.forbiddenInputNum;
-      if(this.detail_info.pid){
+      // if(this.detail_info.pid){
+      if(!this.isFirstStep){
         is=true
       }
       return is
-    }
+    },
+
   },
   mounted() {
     this.isCreator=this.$supremeAuthority('creator');
@@ -567,6 +725,10 @@ export default {
     },
     // 关闭抽屉
     closeDetail() {
+      this.infoActiveNames = []
+      this.rejectShow = false
+      this.adoptShow = false
+      this.showRejectRewrite = false
       this.$emit('update:show', false);
     },
     // 驳回按钮
@@ -742,6 +904,53 @@ export default {
             });
         }
       });
+    },
+    rejectRewrite(){
+      let self = this
+      self.submitting = true
+      let params = {
+        review_id:self.detail_info.id,
+        remark:self.formRejectRewrite.remark || ''
+      }
+
+      self.$axiosUser('post','/api/pro/integral/review/reject/rewrite',params)
+        .then((res) => {
+          if(res.data.code === 1){
+            self.formRejectRewrite.remark = ''
+            self.showRejectRewrite = false
+            self.closeDetail()
+            self.$parent.get_list()
+          } else {
+            self.$message.error(res.data.msg)
+          }
+        })
+        .finally(() => {
+          self.submitting = false
+        })
+
+
+
+    },
+    reviewStatusType(status){
+      switch (status) {
+        case 0:
+          return 'info'
+        case 1:
+          return 'success'
+        case 2:
+        case 3:
+        default:
+          return 'warning'
+      }
+    },
+    onApprovalRemarkInput(val){
+      this.adoptForm.remark = specialFilter(val)
+    },
+    onRejectRemarkInput(val){
+      this.rejectForm.remark = specialFilter(val)
+    },
+    onRewriteRemarkInput(val){
+      this.formRejectRewrite.remark = specialFilter(val)
     }
   }
 };
@@ -779,7 +988,7 @@ export default {
   padding: 20px;
   overflow-y: auto;
   overflow-x: hidden !important;
-  height: calc(100vh - 120px);
+  height: calc(100vh - 60px);
   .row_title {
     position: relative;
     margin: 0 0 20px 0;
@@ -810,4 +1019,15 @@ export default {
   height: 60px;
   box-sizing: border-box;
 }
+.detail_row{
+  padding-bottom: 10px;
+  line-height: 50px;
+}
+.desc-content{
+  display: block;
+  text-align: center;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
 </style>

+ 267 - 84
src/point/views/common/repeatTaskDetailsPopup.vue

@@ -4,102 +4,276 @@
     <el-drawer :visible.sync="Delay_to_open" :with-header="false" :size="'500px'" :before-close="handleClose" :custom-class="'drawer_details'">
       <div class="details_title">{{ title }}</div>
       <div class="details_content" v-if="workDetailData" v-loading="loading">
-        <ul>
-          <li class="flex-box">
-            <div class="label">任务内容</div>
-            <div class="content_text">{{ workDetailData.name }}</div>
-          </li>
-          <li class="flex-box">
-            <div class="label">任务备注</div>
-            <div class="content_text orange">{{ workDetailData.remark }}</div>
-          </li>
-          <li class="flex-box">
-            <div class="label">执行周期</div>
-            <div class="content_text orange">{{workDetailData.target_info.length>0? '临时任务-':'悬赏任务-'}}{{ workDetailData.task_cycle_mark }}</div>
-          </li>
-          <li class="flex-box" v-if="workDetailData.point_config">
-          	<div class="label">任务积分</div>
-          	<div class="content_text orange">
-          		{{ workDetailData.point_config.base_point }}
-          		<span>{{ workDetailData.pt_id == 2 ? 'A分' : workDetailData.pt_id == 3 ? 'B分' : '' }}</span>
-          	</div>
-          </li>
-          <li class="flex-box" v-if="workDetailData.file_list && workDetailData.file_list.length > 0">
-          	<div class="label">任务附件</div>
-          	<div class="content_text">
-          		<el-image
-          			v-for="(item, index) in workDetailData.file_list"
-          			:key="index"
-          			style="width: 100px; height: 100px;margin-right:8px"
-          			:src="item"
-          			:preview-src-list="workDetailData.file_list"
-          		></el-image>
-          	</div>
-          </li>
-          <li class="flex-box">
-          	<div class="label">发布人</div>
-          	<div class="content_text">{{ workDetailData.owner_name }}</div>
-          </li>
-          <li class="flex-box">
-          	<div class="label">截止时间</div>
-          	<div class="content_text">
-          		<span v-if="workDetailData.task_cycle == '1'">{{workDetailData.task_cycle_mark}}{{ dayTime(workDetailData.task_cycle_value) }}截止</span>
-          		<span v-if="workDetailData.task_cycle == '2'">
+<!--        <ul>-->
+<!--          <li class="flex-box">-->
+<!--            <div class="label">任务内容</div>-->
+<!--            <div class="content_text">{{ workDetailData.name }}</div>-->
+<!--          </li>-->
+<!--          <li class="flex-box">-->
+<!--            <div class="label">任务备注</div>-->
+<!--            <div class="content_text orange">{{ workDetailData.remark }}</div>-->
+<!--          </li>-->
+<!--          <li class="flex-box">-->
+<!--            <div class="label">执行周期</div>-->
+<!--            <div class="content_text orange">{{workDetailData.target_info.length>0? '临时任务-':'悬赏任务-'}}{{ workDetailData.task_cycle_mark }}</div>-->
+<!--          </li>-->
+<!--          <li class="flex-box" v-if="workDetailData.point_config">-->
+<!--          	<div class="label">任务积分</div>-->
+<!--          	<div class="content_text orange">-->
+<!--          		{{ workDetailData.point_config.base_point }}-->
+<!--          		<span>{{ workDetailData.pt_id == 2 ? 'A分' : workDetailData.pt_id == 3 ? 'B分' : '' }}</span>-->
+<!--          	</div>-->
+<!--          </li>-->
+<!--          <li class="flex-box" v-if="workDetailData.file_list && workDetailData.file_list.length > 0">-->
+<!--          	<div class="label">任务附件</div>-->
+<!--          	<div class="content_text">-->
+<!--          		<el-image-->
+<!--          			v-for="(item, index) in workDetailData.file_list"-->
+<!--          			:key="index"-->
+<!--          			style="width: 100px; height: 100px;margin-right:8px"-->
+<!--          			:src="item"-->
+<!--          			:preview-src-list="workDetailData.file_list"-->
+<!--          		></el-image>-->
+<!--          	</div>-->
+<!--          </li>-->
+<!--          <li class="flex-box">-->
+<!--          	<div class="label">发布人</div>-->
+<!--          	<div class="content_text">{{ workDetailData.owner_name }}</div>-->
+<!--          </li>-->
+<!--          <li class="flex-box">-->
+<!--          	<div class="label">截止时间</div>-->
+<!--          	<div class="content_text">-->
+<!--          		<span v-if="workDetailData.task_cycle == '1'">{{workDetailData.task_cycle_mark}}{{ dayTime(workDetailData.task_cycle_value) }}截止</span>-->
+<!--          		<span v-if="workDetailData.task_cycle == '2'">-->
+<!--          			<span>{{workDetailData.task_cycle_mark}}{{ weekList[workDetailData.task_cycle_value - 1] }}截止</span>-->
+<!--          		</span>-->
+<!--          		<span v-if="workDetailData.task_cycle == '3'">{{workDetailData.task_cycle_mark}}{{ workDetailData.task_cycle_value }}号截止</span>-->
+<!--          	</div>-->
+<!--          </li>-->
+<!--          <li class="flex-box" v-if="workDetailData.schedule_expire_time">-->
+<!--            <div class="label">有效日期</div>-->
+<!--            <div class="content_text" >-->
+<!--              <span v-if="!isExpire(workDetailData.schedule_expire_time)" >{{workDetailData.schedule_expire_time}}</span>-->
+<!--              <el-alert v-else :title="workDetailData.schedule_expire_time" type="warning" :closable="false" ></el-alert>-->
+<!--            </div>-->
+<!--          </li>-->
+<!--          <li class="flex-box" v-if="workDetailData.department_info">-->
+<!--          	<div class="label">可见范围</div>-->
+<!--          	<div class="content_text" v-if="workDetailData.department_info.length>0">-->
+<!--          	<span v-for="(item,index) in workDetailData.department_info" :key="index">-->
+<!--          		{{item.name}}-->
+<!--          		<span v-if="(workDetailData.department_info.length - 1) > index"> ,</span>-->
+<!--          	</span>-->
+<!--          	</div>-->
+<!--          	<div class="content_text" v-else>全公司</div>-->
+<!--          </li>-->
+<!--					<li class="flex-box" v-if="workDetailData.point_config">-->
+<!--						<div class="label">逾期扣分</div>-->
+<!--						<div class="content_text">{{ workDetailData.point_config.timeout_deduction_point }}/天</div>-->
+<!--					</li>-->
+<!--					<li class="flex-box" v-if="workDetailData.point_config">-->
+<!--						<div class="label">提前奖分</div>-->
+<!--						<div class="content_text">{{ workDetailData.point_config.ahead_award_point }}/天</div>-->
+<!--					</li>-->
+<!--        </ul>-->
+<!--        <el-row style=" margin-bottom: 20px;">-->
+<!--          <el-col :span="24" style="line-height: 30px;">审批人</el-col>-->
+<!--          <el-col :span="24">-->
+<!--            <div>-->
+<!--              <userImage class="fl" :id="workDetailData.reviewer_id" :user_name="workDetailData.reviewer_name" width="50px" height="50px" style=" margin-right: 15px;"></userImage>-->
+<!--              <p style="margin: 0; line-height: 50px;">{{ workDetailData.reviewer_name }}</p>-->
+<!--            </div>-->
+<!--          </el-col>-->
+<!--        </el-row>-->
+<!--        <el-row v-if="workDetailData.target_info.length>0">-->
+<!--          <el-col :span="24" style="line-height: 30px;">执行人</el-col>-->
+<!--          <el-col :span="24">-->
+<!--            <div v-for="(item, index) in workDetailData.target_info" style="margin-bottom: 10px;">-->
+<!--              <userImage class="fl" :id="item.id" :user_name="item.name" width="50px" height="50px" style=" margin-right: 15px;"></userImage>-->
+<!--              <p style="margin: 0; line-height: 50px;">{{ item.name }}</p>-->
+<!--            </div>-->
+<!--          </el-col>-->
+<!--        </el-row>-->
+
+        <el-card shadow="always">
+          <template slot="header">
+            <div class="flex-box flex-v-ce">
+              <userImage
+                style="margin-right: 15px;"
+                width="50px"
+                height="50px"
+                class="fl"
+                :id="workDetailData.owner_id"
+                :user_name="workDetailData.owner_name"
+                :img_url="workDetailData.owner_img_url"
+              />
+              <div>
+                {{workDetailData.owner_name}}
+                {{ $getTypsName(workDetailData.pt_id) }}{{scheduleTypeMark}}&nbsp;
+                <el-tag>{{ workDetailData.point_config.base_point }}分</el-tag>
+              </div>
+            </div>
+          </template>
+          <el-descriptions
+            :title="scheduleTypeMark + '信息'"
+            direction="vertical"
+            :column="2"
+            size="small"
+            :label-style="{width:'80px',textAlign:'center'}"
+            :content-style="{width:'80px',textAlign: 'center'}"
+            border
+          >
+            <el-descriptions-item :label="scheduleTypeMark + '内容'">
+              {{workDetailData.name}}
+            </el-descriptions-item>
+            <el-descriptions-item v-if="workDetailData.remark" :label="scheduleTypeMark + '备注'">
+              {{workDetailData.remark}}
+            </el-descriptions-item>
+            <el-descriptions-item label="执行周期">
+              {{workDetailData.target_info.length>0? '临时任务-':'悬赏任务-'}}{{ workDetailData.task_cycle_mark }}
+            </el-descriptions-item>
+            <el-descriptions-item
+              v-if="workDetailData.point_config"
+              :label="scheduleTypeMark + '积分'"
+            >
+              {{ workDetailData.point_config.base_point }}
+              <span>{{ $getTypsName(workDetailData.pt_id) }}</span>
+            </el-descriptions-item>
+            <el-descriptions-item
+              v-if="workDetailData.file_list && workDetailData.file_list.length > 0"
+              title="附件"
+            >
+              <el-image
+                v-for="(item, index) in workDetailData.file_list"
+                :key="index"
+                style="width: 100px; height: 100px;margin-right:8px"
+                :src="item"
+                :preview-src-list="workDetailData.file_list"
+              ></el-image>
+            </el-descriptions-item>
+            <el-descriptions-item
+              label="截止时间"
+            >
+              <span v-if="workDetailData.task_cycle == '1'">{{workDetailData.task_cycle_mark}}{{ dayTime(workDetailData.task_cycle_value) }}截止</span>
+              <span v-if="workDetailData.task_cycle == '2'">
           			<span>{{workDetailData.task_cycle_mark}}{{ weekList[workDetailData.task_cycle_value - 1] }}截止</span>
           		</span>
-          		<span v-if="workDetailData.task_cycle == '3'">{{workDetailData.task_cycle_mark}}{{ workDetailData.task_cycle_value }}号截止</span>
-          	</div>
-          </li>
-          <li class="flex-box" v-if="workDetailData.schedule_expire_time">
-            <div class="label">有效日期</div>
-            <div class="content_text" >
+              <span v-if="workDetailData.task_cycle == '3'">{{workDetailData.task_cycle_mark}}{{ workDetailData.task_cycle_value }}号截止</span>
+            </el-descriptions-item>
+            <el-descriptions-item
+              v-if="workDetailData.schedule_expire_time"
+              label="有效日期"
+            >
               <span v-if="!isExpire(workDetailData.schedule_expire_time)" >{{workDetailData.schedule_expire_time}}</span>
               <el-alert v-else :title="workDetailData.schedule_expire_time" type="warning" :closable="false" ></el-alert>
-            </div>
-          </li>
-          <li class="flex-box" v-if="workDetailData.department_info">
-          	<div class="label">可见范围</div>
-          	<div class="content_text" v-if="workDetailData.department_info.length>0">
-          	<span v-for="(item,index) in workDetailData.department_info" :key="index">
+            </el-descriptions-item>
+            <el-descriptions-item
+              v-if="workDetailData.department_info"
+              label="可见范围"
+            >
+              <div v-if="workDetailData.department_info.length>0">
+                <span v-for="(item,index) in workDetailData.department_info" :key="index">
           		{{item.name}}
           		<span v-if="(workDetailData.department_info.length - 1) > index"> ,</span>
           	</span>
-          	</div>
-          	<div class="content_text" v-else>全公司</div>
-          </li>
-					<li class="flex-box" v-if="workDetailData.point_config">
-						<div class="label">逾期扣分</div>
-						<div class="content_text">{{ workDetailData.point_config.timeout_deduction_point }}/天</div>
-					</li>
-					<li class="flex-box" v-if="workDetailData.point_config">
-						<div class="label">提前奖分</div>
-						<div class="content_text">{{ workDetailData.point_config.ahead_award_point }}/天</div>
-					</li>
-        </ul>
-        <el-row style=" margin-bottom: 20px;">
-          <el-col :span="24" style="line-height: 30px;">审批人</el-col>
-          <el-col :span="24">
-            <div>
-              <userImage class="fl" :id="workDetailData.reviewer_id" :user_name="workDetailData.reviewer_name" width="50px" height="50px" style=" margin-right: 15px;"></userImage>
-              <p style="margin: 0; line-height: 50px;">{{ workDetailData.reviewer_name }}</p>
-            </div>
-          </el-col>
-        </el-row>
-        <el-row v-if="workDetailData.target_info.length>0">
-          <el-col :span="24" style="line-height: 30px;">执行人</el-col>
-          <el-col :span="24">
-            <div v-for="(item, index) in workDetailData.target_info" style="margin-bottom: 10px;">
-              <userImage class="fl" :id="item.id" :user_name="item.name" width="50px" height="50px" style=" margin-right: 15px;"></userImage>
-              <p style="margin: 0; line-height: 50px;">{{ item.name }}</p>
-            </div>
-          </el-col>
-        </el-row>
+              </div>
+              <div v-else>
+                全公司
+              </div>
+            </el-descriptions-item>
+            <template v-if="workDetailData.point_config">
+              <el-descriptions-item
+                label="逾期扣分"
+              >
+                {{ workDetailData.point_config.timeout_deduction_point }}&nbsp;B/天
+              </el-descriptions-item>
+              <el-descriptions-item
+                label="提前奖分"
+              >
+                {{ workDetailData.point_config.ahead_award_point }}&nbsp;B分/天
+              </el-descriptions-item>
+            </template>
+            <el-descriptions-item label="审批人">
+              <div style="width: fit-content;margin: 0 auto;">
+                <userImage
+                  width="50px"
+                  height="50px"
+                  class="fl"
+                  :id="workDetailData.reviewer_id"
+                  :user_name="workDetailData.reviewer_name"
+                  :img_url="workDetailData.reviewer_img_url"
+                />
+                <div>{{ workDetailData.reviewer_name }}</div>
+              </div>
+            </el-descriptions-item>
+            <el-descriptions-item
+              v-if="workDetailData.target_info.length > 0"
+              label="执行人"
+            >
+              <div style="width: fit-content;margin: 0 auto;">
+                <div
+                  v-for="(item, index) in workDetailData.target_info"
+                  :key="index"
+                  style="margin-bottom: 10px; display: inline-block;margin-right: 5px;"
+                >
+                  <userImage class="fl" :id="item.id" :user_name="item.name" width="50px" height="50px" />
+                  <div>{{ item.name }}</div>
+                </div>
+              </div>
+            </el-descriptions-item>
+          </el-descriptions>
+
+          <el-descriptions
+            v-if="workDetailData.item_info"
+            style="margin-top: 20px"
+            title="规则依据"
+            direction="vertical"
+            :column="1"
+            size="small"
+            :label-style="{width:'80px',textAlign:'center'}"
+            :content-style="{width:'80px',textAlign: 'center'}"
+            border
+          >
+            <el-descriptions-item label="规则">{{workDetailData.item_info.remark}}</el-descriptions-item>
+            <el-descriptions-item label="积分">{{pointRemark}}</el-descriptions-item>
+            <el-descriptions-item label="规则状态" v-if="workDetailData.item_info.has_delete">
+              <el-tag type="warning">规则已删除</el-tag>
+            </el-descriptions-item>
+            <el-descriptions-item v-if="workDetailData.rule_info" label="分类">{{workDetailData.rule_info.name}}</el-descriptions-item>
+            <el-descriptions-item v-if="workDetailData.rule_info && workDetailData.rule_info.has_delete" label="分类状态">
+              <el-tag type="warning">分类已删除</el-tag>
+            </el-descriptions-item>
+          </el-descriptions>
+
+          <el-descriptions
+            v-else-if="workDetailData.rule_info"
+            style="margin-top: 20px"
+            title="规则分类"
+            direction="vertical"
+            :column="1"
+            size="small"
+            :label-style="{width:'80px',textAlign:'center'}"
+            :content-style="{width:'80px',textAlign: 'center'}"
+            border
+          >
+            <el-descriptions-item label="分类">{{workDetailData.rule_info.name}}</el-descriptions-item>
+            <el-descriptions-item label="分类状态" v-if="workDetailData.rule_info.has_delete">
+              <el-tag type="warning">分类已删除</el-tag>
+            </el-descriptions-item>
+          </el-descriptions>
+
+
+        </el-card>
+
+
       </div>
     </el-drawer>
   </div>
 </template>
 
 <script>
+import Template from "../../../examine/components/Template.vue";
+
 export default {
   name: 'repeatTaskDetailsPopup',
   props: {
@@ -127,8 +301,17 @@ export default {
       weekList: ['一', '二', '三', '四', '五', '六', '日']
     };
   },
-  components: {},
+  components: {Template},
   watch: {},
+  computed:{
+    scheduleTypeMark(){
+      return !this.workDetailData ? '--' : (this.workDetailData.type === 2 ? '悬赏' : '任务')
+    },
+    pointRemark(){
+      if (!(this.workDetailData && this.workDetailData.item_info)) return ''
+      return this.workDetailData.item_info.range_type === 1 ? `${this.workDetailData.item_info.min_point} ${this.$getTypsName(this.workDetailData.item_info.pt_id)}` : `${this.workDetailData.item_info.min_point} -- ${this.workDetailData.item_info.max_point} ${this.$getTypsName(this.workDetailData.item_info.pt_id)}`
+    }
+  },
   mounted() {
     this.getData();
     this.Delay_to_open = this.visible; //更换打开抽屉时机,避免打开两次

+ 196 - 21
src/point/views/common/rewardTask.vue

@@ -9,11 +9,50 @@
             prop="task_name"
             :rules="[{ required: true, message: '请填写任务内容'}, { min: 3, max: 20, message: '长度在 3 到 20 个字符'}]"
           >
-            <el-input type="textarea" rows="3" maxlength="20" show-word-limit v-model="formData.task_name" placeholder="请输入任务内容(限20字)" class="reward_textarea"></el-input>
+            <el-input type="textarea" rows="3" maxlength="20" show-word-limit v-model="formData.task_name" placeholder="请输入任务内容(限20字)" class="reward_textarea" @input="onTaskNameInput"></el-input>
           </el-form-item>
 
+          <el-form-item label="积分类型" prop="pt_id" :rules="[{ required: true, message: '请选择积分类型'}]">
+            <el-radio-group v-model="formData.pt_id">
+              <el-radio v-for="(item, index) in pts" :key="index" v-show="item.code !== 'JX'" :label="item.id">{{ item.name }}</el-radio>
+            </el-radio-group>
+            <span class="blue cursor" style="padding-left: 20px;font-size: 14px;" @click="$openUrl(17)">什么是A分、B分?</span>
+          </el-form-item>
+
+          <el-form-item label="指定规则">
+            <el-radio-group v-model="formData.rule_type">
+              <el-radio-button :label="0">不指定</el-radio-button>
+              <el-radio-button :label="1">规则分类</el-radio-button>
+              <el-radio-button :label="2">指定规则</el-radio-button>
+            </el-radio-group>
+          </el-form-item>
+
+          <el-form-item label="规则分类" prop="rule_id" v-if="formData.rule_type === 1" :rules="[{required:true,message:'请选择规则分类'}]">
+            <el-cascader
+              class="w250"
+              v-model="formData.rule_id"
+              :options="rule_list"
+              :props="{children:'child',label:'name',value:'id', checkStrictly: true,emitPath:false}"
+            />
+          </el-form-item>
+          <el-form-item label="积分规则" prop="rule_item.remark" v-if="formData.rule_type === 2" :rules="[{required:true,message:'请选择积分规则'}]">
+            <el-input placeholder="请选择规则" v-model="formData.rule_item.remark" readonly @focus="showRuleItems = true">
+              <el-button slot="append" icon="el-icon-search" @click.stop="showRuleItems = true"/>
+            </el-input>
+            <i style="color: red">{{itemRemark}}</i>
+            <SelectRule
+              :visible.sync="showRuleItems"
+              :pt-id = "formData.pt_id"
+              :select-items="selectItem"
+              :is-scope="true"
+              :multiple="false"
+              @confirm="onItemConfirm"
+            />
+          </el-form-item>
+
+
           <el-form-item label="任务积分" prop="base_point" :rules="[{ required: true, message: '请填写任务积分'}]">
-            <el-input-number v-model="formData.base_point" :min="1"></el-input-number>
+            <el-input-number v-model="formData.base_point" :disabled="formData.rule_item.range_type === 1" @change="onBasePointChange" />
           </el-form-item>
           <el-form-item label="审批人" prop="reviewer_id" :rules="[{ required: true, message: '请选择审批人'}]">
             <el-row>
@@ -33,12 +72,7 @@
             />
           </el-form-item>
 
-          <el-form-item label="规则积分" prop="pt_id" :rules="[{ required: true, message: '请选择规则积分'}]">
-            <el-radio-group v-model="formData.pt_id">
-              <el-radio v-for="(item, index) in $getTyps()" :key="index" v-show="item.code !== 'JX'" :label="item.id">{{ item.name }}</el-radio>
-            </el-radio-group>
-            <span class="blue cursor" style="padding-left: 20px;font-size: 14px;" @click="$openUrl(17)">什么是A分、B分?</span>
-          </el-form-item>
+
           <el-form-item label="重复周期" prop="task_cycle">
             <el-select v-model="formData.task_cycle" placeholder="请选择重复周期">
               <el-option v-for="(item, index) in task_cycle_arr" :key="index" :label="item.name" :value="item.value"></el-option>
@@ -55,24 +89,29 @@
               default-time="18:00"
               :clearable="false"
             ></el-date-picker>
+            <el-tooltip placement="right" style="margin-left: 10px" content="任务截止时间是触发任务提前奖分/逾期扣分的关键属性"><span class="tips">?</span></el-tooltip>
           </el-form-item>
 
           <el-form-item label="截止时间" prop="task_expire_day" v-if="formData.task_cycle == 1" :rules="[{ required: true, message: '请选择截止时间'}]">
             <el-select v-model="formData.task_expire_day" placeholder="请选择截止时间">
               <el-option v-for="item in columns1" :key="item.value" :label="item.name" :value="item.value"></el-option>
             </el-select>
+            <el-tooltip placement="right" style="margin-left: 10px" content="任务截止时间是触发任务提前奖分/逾期扣分的关键属性"><span class="tips">?</span></el-tooltip>
           </el-form-item>
 
           <el-form-item label="截止时间" prop="task_expire_day" v-if="formData.task_cycle == 2" :rules="[{ required: true, message: '请选择截止时间'}]">
             <el-select v-model="formData.task_expire_day" placeholder="请选择截止时间">
               <el-option v-for="item in columns2" :key="item.value" :label="item.name" :value="item.value"></el-option>
             </el-select>
+            <el-tooltip placement="right" style="margin-left: 10px" content="任务截止时间是触发任务提前奖分/逾期扣分的关键属性"><span class="tips">?</span></el-tooltip>
           </el-form-item>
 
           <el-form-item label="截止时间" prop="task_expire_day" v-if="formData.task_cycle == 3" :rules="[{ required: true, message: '请选择截止时间'}]">
             <el-select v-model="formData.task_expire_day" placeholder="请选择截止时间">
               <el-option v-for="item in columns3" :key="item.value" :label="item.name" :value="item.value"></el-option>
             </el-select>
+
+            <el-tooltip placement="right" style="margin-left: 10px" content="任务截止时间是触发任务提前奖分/逾期扣分的关键属性"><span class="tips">?</span></el-tooltip>
           </el-form-item>
 
           <el-form-item prop="schedule_expire_date" label="有效日期">
@@ -88,11 +127,11 @@
               @change="scheduleExpireDateChange"
               @input="scheduleExpireDateInput"
             ></el-date-picker>
-            <el-tooltip placement="right" content="设置此选项,到了有效日期不再自动发布。默认一直重复发布悬赏" style="margin-left: 10px"><span class="tips">?</span></el-tooltip>
+            <el-tooltip placement="right" content="设置此选项,到了(不包含)有效日期不再自动发布。默认一直重复发布悬赏" style="margin-left: 10px"><span class="tips">?</span></el-tooltip>
           </el-form-item>
 
           <el-form-item label="任务备注" prop="task_remark" :rules="[{ max: 300, message: '长度不能超过 300 个字'}]">
-            <el-input type="textarea" :rows="5" maxlength="300" show-word-limit v-model="formData.task_remark" placeholder="请输入任务内容(限300字)"></el-input>
+            <el-input type="textarea" :rows="5" maxlength="300" show-word-limit v-model="formData.task_remark" placeholder="请输入任务内容(限300字)" @input="onTaskRemarkInput"></el-input>
           </el-form-item>
           <el-form-item label="谁可以看" prop="dept_ids">
             <el-row>
@@ -114,30 +153,35 @@
 
 					<div style="margin-left: 80px; margin-bottom: 8px;">以天为单位,每 提前/逾期 一天 加分/扣分</div>
 					<el-form-item label="提前奖分" prop="ahead_award_point">
-						<el-input v-model="formData.ahead_award_point" oninput="value=value.replace(/[^\d]/g,'')" placeholder="请输入每日奖分" style="width: 150px;"></el-input>
+						<el-input
+              v-model="formData.ahead_award_point"
+              @input="v => formData.ahead_award_point = v.replace(/[^\d]/g,'')"
+              placeholder="请输入每日奖分"
+              style="width: 150px;"
+            />
 						B分/每天, 奖分上限 &nbsp;
 						<el-input
 							v-model="formData.ahead_award_point_limit"
-							oninput="value=value.replace(/[^\d]/g,'')"
+              @input="v => formData.ahead_award_point_limit = v.replace(/[^\d]/g,'')"
 							placeholder="请输入奖分上限"
 							style="width: 150px;"
-						></el-input>
+						/>
 						B分
 					</el-form-item>
 					<el-form-item label="逾期扣分" prop="timeout_deduction_point">
 						<el-input
 							v-model="formData.timeout_deduction_point"
-							oninput="value=value.replace(/[^\d]/g,'')"
+              @input="v => formData.timeout_deduction_point = v.replace(/[^\d]/g,'')"
 							placeholder="请输入每日扣分"
 							style="width: 150px;"
-						></el-input>
+						/>
 						B分/每天, 扣分上限 &nbsp;
 						<el-input
 							v-model="formData.timeout_deduction_point_limit"
-							oninput="value=value.replace(/[^\d]/g,'')"
+              @input="v => formData.timeout_deduction_point_limit = v.replace(/[^\d]/g,'')"
 							placeholder="请输入扣分上限"
 							style="width: 150px;"
-						></el-input>
+						/>
 						B分
 					</el-form-item>
 
@@ -163,8 +207,8 @@
 <script>
 import moment from 'moment';
 import EmployeeSelector from '@/components/EmployeeSelector';
-import {format} from "echarts/lib/export";
-import {deflateSetHeader} from "pikaz-excel-js/lib/PikazJsExcel.common";
+import {specialFilter} from "../../../utils";
+import SelectRule from "../../../components/SelectRule.vue";
 export default {
   name: 'bonusPoints',
   props: {
@@ -185,6 +229,7 @@ export default {
   },
   data() {
     return {
+      pts:this.$getTyps(),
       pickerOptions:{
           disabledDate (time) {
             //disabledDate 文档上:设置禁用状态,参数为当前日期,要求返回 Boolean
@@ -194,7 +239,23 @@ export default {
           }
       },
       forTheTaskLoading: false,
+      showRuleItems:false,
+      rule_list:[],
       formData: {
+        rule_type:0,
+        rule_id:0,
+        rule_item:{
+          id:0,
+          remark:"",
+          cycle_type: 0,
+          is_attendance: 0,
+          max_point: 0,
+          min_point: 0,
+          prize_type: 0,
+          pt_id: 0,
+          range_type: 0,
+          rule_id: 0,
+        },
         task_type: '1',
         pt_id: 3,
         task_name: '',
@@ -294,7 +355,24 @@ export default {
       show_dept_selector: false
     };
   },
-  components: { EmployeeSelector },
+  computed:{
+    selectItem(){
+      return this.formData.rule_item && this.formData.rule_item.id ? [this.formData.rule_item] : []
+    },
+    itemRemark(){
+      let pt = this.pts.find(pt => pt.id === this.formData.rule_item.pt_id)
+      pt = pt ? pt.name : ''
+      switch (this.formData.rule_item.range_type){
+        case 1:
+          return `${this.formData.rule_item.min_point} ${pt}`
+        case 2:
+          return `${this.formData.rule_item.min_point} -- ${this.formData.rule_item.max_point} ${pt}`
+        default:
+          return ''
+      }
+    }
+  },
+  components: {SelectRule, EmployeeSelector },
   watch: {
     'formData.task_cycle'(val) {
       if (val) {
@@ -304,9 +382,39 @@ export default {
         this.formData.schedule_expire_date = '';
       }
     },
+    'formData.rule_type'(val) {
+      this.initRuleData()
+    },
+    'formData.pt_id'(val){
+      if (this.formData.rule_type === 2) this.initRuleData()
+    }
   },
   methods: {
+    initRuleData(){
+      this.formData.rule_id = 0
+      this.formData.rule_item = {
+        id:0,
+        remark:"",
+        cycle_type: 0,
+        is_attendance: 0,
+        max_point: 0,
+        min_point: 0,
+        prize_type: 0,
+        pt_id: 0,
+        range_type: 0,
+        rule_id: 0,
+      }
+      this.formData.base_point = 1
+    },
     sub(formName) {
+      if (this.formData.rule_type === 1 && this.formData.rule_id <= 0){
+        this.$message.error('请选择规则分类')
+        return
+      }
+      if (this.formData.rule_type === 2 && this.formData.rule_item.id <= 0){
+        this.$message.error('请选择积分规则')
+        return
+      }
       this.$refs[formName].validate(valid => {
         if (valid) {
           this.saveFun(formName);
@@ -318,6 +426,8 @@ export default {
       this.$refs[formName].resetFields();
       this.executorName = '';
       this.reviewerName = '';
+      this.formData.rule_type = 0
+      this.initRuleData()
     },
     ahead_timeout(item, arr, codes, code) {
     	if (item) {
@@ -339,6 +449,7 @@ export default {
     saveFun(formName) {
       let self = this;
       let data = JSON.parse(JSON.stringify(self.formData));
+      data.item_id = data.rule_item.id
       if (data.task_cycle == 0) {
         delete data.task_cycle;
         delete data.task_expire_day;
@@ -364,7 +475,7 @@ export default {
       }
       if (this.ahead_timeout(data.ahead_award_point, data.ahead_award_point_limit, '提前奖分', '奖分')) return;
       if (this.ahead_timeout(data.timeout_deduction_point, data.timeout_deduction_point_limit, '逾期扣分', '扣分')) return;
-      if (!this.$supremeAuthority('creator') || this.$userInfo().point_config.point_limit.length != 0) {
+      if (!this.$supremeAuthority('creator') && this.$userInfo().point_config.point_limit.length != 0) {
       	let entry_limit = Number(this.$userInfo().point_config.point_limit[1].point);
       	if (entry_limit > 0) {
       		if (data.ahead_award_point > entry_limit || data.timeout_deduction_point > entry_limit) {
@@ -483,6 +594,8 @@ export default {
     closeDialog() {
       this.formData.timeout_deduction_point_limit = null;
       this.formData.ahead_award_point_limit = null;
+      this.formData.rule_type = 0
+      this.initRuleData()
       this.resetForm('formData');
       // this.$emit('update:dialogVisible', false)
     },
@@ -497,6 +610,68 @@ export default {
         this.$forceUpdate();
       })
     },
+    onTaskNameInput(val){
+      this.formData.task_name = specialFilter(val)
+    },
+    onTaskRemarkInput(val){
+      this.formData.task_remark = specialFilter(val)
+    },
+    getRuleList(){
+      let data = {
+        cycle_type:'1',
+        pt_id: this.formData.pt_id
+      }
+      this.$axiosUser('get','/api/pro/integral/rule/trees/scope',data)
+        .then(res => {
+          this.rule_list = this.getTreeData(res.data.data.rule_tree)
+        })
+    },
+    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;
+    },
+    onItemConfirm(selectArrItem){
+      this.formData.rule_item = selectArrItem.length > 0 ? selectArrItem[0] : {
+        id:0,
+        remark:"",
+        cycle_type: 0,
+        is_attendance: 0,
+        max_point: 0,
+        min_point: 0,
+        prize_type: 0,
+        pt_id: 0,
+        range_type: 0,
+        rule_id: 0,
+      }
+      this.formData.rule_id = this.formData.rule_item.rule_id
+      this.formData.base_point = this.formData.rule_item.min_point !== 0 ? this.formData.rule_item.min_point : 1
+    },
+    onBasePointChange(currentValue,oldValue){
+      //限制范围分的上下限拦截
+      if (this.formData.rule_type !== 2 && this.formData.rule_item.range_type !== 2) return
+
+      if (currentValue < this.formData.rule_item.min_point) {
+        this.$nextTick(() => {
+          this.formData.base_point = this.formData.rule_item.min_point
+        })
+      }
+      if (currentValue > this.formData.rule_item.max_point) {
+        this.$nextTick( () => {
+          this.formData.base_point = this.formData.rule_item.max_point
+        })
+      }
+    }
+  },
+  mounted() {
+    this.getRuleList()
   }
 };
 </script>

+ 13 - 2
src/point/views/common/rewardTaskAmend.vue

@@ -11,7 +11,7 @@
       <div v-loading="forTheTaskLoading">
         <el-form :model="formData" ref="formData" label-width="80px" class="form">
           <el-form-item label="任务内容" prop="task_name" :rules="[{ required: true, message: '请填写任务内容' },{ min: 3, max: 20, message: '长度在 3 到 20 个字符'}]">
-            <el-input type="textarea" rows="3" maxlength="20" show-word-limit v-model="formData.task_name" placeholder="请输入任务内容(限20字)" class="reward_textarea" ></el-input>
+            <el-input type="textarea" rows="3" maxlength="20" show-word-limit v-model="formData.task_name" placeholder="请输入任务内容(限20字)" class="reward_textarea" @input="onTaskNameInput" ></el-input>
           </el-form-item>
 
           <el-form-item label="任务积分" prop="base_point" :rules="[{ required: true, message: '请填写任务积分'}]">
@@ -52,6 +52,7 @@
               default-time="18:00"
               :clearable="false"
               ></el-date-picker>
+            <el-tooltip placement="right" style="margin-left: 10px" content="任务截止时间是触发任务提前奖分/逾期扣分的关键属性"><span class="tips">?</span></el-tooltip>
           </el-form-item>
 
           <el-form-item label="截止时间" prop="task_expire_day" v-if="formData.task_cycle == 1" :rules="[{ required: true, message: '请选择截止时间'}]">
@@ -63,6 +64,7 @@
                 :value="item.value">
               </el-option>
             </el-select>
+            <el-tooltip placement="right" style="margin-left: 10px" content="任务截止时间是触发任务提前奖分/逾期扣分的关键属性"><span class="tips">?</span></el-tooltip>
           </el-form-item>
 
           <el-form-item label="截止时间" prop="task_expire_day" v-if="formData.task_cycle == 2" :rules="[{ required: true, message: '请选择截止时间'}]">
@@ -74,6 +76,7 @@
                 :value="item.value">
               </el-option>
             </el-select>
+            <el-tooltip placement="right" style="margin-left: 10px" content="任务截止时间是触发任务提前奖分/逾期扣分的关键属性"><span class="tips">?</span></el-tooltip>
           </el-form-item>
 
           <el-form-item label="截止时间" prop="task_expire_day" v-if="formData.task_cycle == 3" :rules="[{ required: true, message: '请选择截止时间'}]">
@@ -85,10 +88,11 @@
                 :value="item.value">
               </el-option>
             </el-select>
+            <el-tooltip placement="right" style="margin-left: 10px" content="任务截止时间是触发任务提前奖分/逾期扣分的关键属性"><span class="tips">?</span></el-tooltip>
           </el-form-item>
 
           <el-form-item label="任务备注" prop="task_remark" :rules="[{ max: 300 ,message: '长度不能超过 300 个字'}]">
-            <el-input type="textarea" :rows="5" maxlength="300" show-word-limit v-model="formData.task_remark" placeholder="请输入任务内容(限300字)"></el-input>
+            <el-input type="textarea" :rows="5" maxlength="300" show-word-limit v-model="formData.task_remark" placeholder="请输入任务内容(限300字)" @input="onTaskRemarkInput"></el-input>
           </el-form-item>
           <el-form-item label="谁可以看" prop="dept_ids">
             <el-row>
@@ -131,6 +135,7 @@
 <script>
   import moment from 'moment'
   import EmployeeSelector from '@/components/EmployeeSelector'
+  import {specialFilter} from "../../../utils";
   export default {
     name: 'bonusPoints',
     props:{
@@ -405,6 +410,12 @@
           dept_ids: null
         };
         this.$refs[formName].resetFields();
+      },
+      onTaskNameInput(val){
+        this.formData.task_name = specialFilter(val)
+      },
+      onTaskRemarkInput(val){
+        this.formData.task_remark = specialFilter(val)
       }
     }
   }

+ 199 - 61
src/point/views/common/rewardTaskDetailsPopup.vue

@@ -4,9 +4,83 @@
     <el-drawer :visible.sync="Delay_to_open" :with-header="false" :size="'500px'" :before-close="handleClose" :custom-class="'drawer_details'">
       <div class="details_title">{{ title }}</div>
       <div class="details_content" v-if="workDetailData" v-loading="loading">
-        <el-row>
-          <el-col :span="24">
-            <div class="">
+<!--        <el-row>-->
+<!--          <el-col :span="24">-->
+<!--            <div class="">-->
+<!--              <userImage-->
+<!--                style="margin-right: 15px;"-->
+<!--                width="50px"-->
+<!--                height="50px"-->
+<!--                class="fl"-->
+<!--                :id="workDetailData.owner_id"-->
+<!--                :user_name="workDetailData.owner_name"-->
+<!--                :img_url="workDetailData.owner_img_url"-->
+<!--              ></userImage>-->
+<!--              <div>-->
+<!--                <div style="line-height: 25px;">-->
+<!--                  我悬赏的{{ $getTypsName(workDetailData.pt_id) }}任务 {{ workDetailData.point_config.base_point }}{{ $getTypsName(workDetailData.pt_id) }}-->
+<!--                </div>-->
+<!--                <div style="color: #909399; line-height: 25px;">-->
+<!--                  <b>{{ workDetailData.receiver_name }}</b>-->
+<!--                  {{ workDetailData.status_mark }}-->
+<!--                </div>-->
+<!--              </div>-->
+<!--            </div>-->
+<!--          </el-col>-->
+<!--        </el-row>-->
+
+<!--        <ul>-->
+<!--          <li class="flex-box">-->
+<!--            <div class="label">任务内容</div>-->
+<!--            <div class="content_text">{{ workDetailData.task_name }}</div>-->
+<!--          </li>-->
+<!--          <li class="flex-box" v-if="workDetailData.status == 2 && workDetailData.receiver_id != 0">-->
+<!--            <div class="label">领取人</div>-->
+<!--            <div class="content_text">{{ workDetailData.receiver_name }}</div>-->
+<!--          </li>-->
+<!--          <li class="flex-box" v-if="workDetailData.status == 3 && workDetailData.receiver_id != 0">-->
+<!--            <div class="label">完成人</div>-->
+<!--            <div class="content_text">{{ workDetailData.receiver_name }}</div>-->
+<!--          </li>-->
+<!--          <li class="flex-box" v-if="workDetailData.task_remark">-->
+<!--            <div class="label">任务备注</div>-->
+<!--            <div class="content_text">{{ workDetailData.task_remark }}</div>-->
+<!--          </li>-->
+<!--          <li class="flex-box" v-if="workDetailData.point_config">-->
+<!--            <div class="label">任务积分</div>-->
+<!--            <div class="content_text orange">{{ workDetailData.point_config.base_point }}{{ $getTypsName(workDetailData.pt_id) }}</div>-->
+<!--          </li>-->
+<!--          <li class="flex-box">-->
+<!--            <div class="label">发布时间</div>-->
+<!--            <div class="content_text">{{ workDetailData.create_time }}</div>-->
+<!--          </li>-->
+<!--          <li class="flex-box">-->
+<!--            <div class="label">截止时间</div>-->
+<!--            <div class="content_text">{{ workDetailData.end_time }}</div>-->
+<!--          </li>-->
+<!--					<li class="flex-box" v-if="workDetailData.point_config">-->
+<!--						<div class="label">逾期扣分</div>-->
+<!--						<div class="content_text">{{ workDetailData.point_config.timeout_deduction_point }}/天</div>-->
+<!--					</li>-->
+<!--					<li class="flex-box" v-if="workDetailData.point_config.ahead_award_point">-->
+<!--						<div class="label">提前奖分</div>-->
+<!--						<div class="content_text">{{ workDetailData.point_config.ahead_award_point }}/天</div>-->
+<!--					</li>-->
+<!--          <li class="flex-box" v-if="workDetailData.department_info">-->
+<!--            <div class="label">可见范围</div>-->
+<!--            <div class="content_text">-->
+<!--              <span v-for="(item, index) in workDetailData.department_info">{{ item.name }},</span>-->
+<!--            </div>-->
+<!--          </li>-->
+<!--          <li class="flex-box">-->
+<!--            <div class="label">任务类型</div>-->
+<!--            <div class="content_text">{{ workDetailData.source_type_mark }}</div>-->
+<!--          </li>-->
+<!--        </ul>-->
+
+        <el-card shadow="always">
+          <template slot="header">
+            <div class="flex-box flex-v-ce">
               <userImage
                 style="margin-right: 15px;"
                 width="50px"
@@ -15,76 +89,134 @@
                 :id="workDetailData.owner_id"
                 :user_name="workDetailData.owner_name"
                 :img_url="workDetailData.owner_img_url"
-              ></userImage>
+              />
               <div>
-                <div style="line-height: 25px;">
-                  我悬赏的{{ $getTypsName(workDetailData.pt_id) }}任务 {{ workDetailData.point_config.base_point }}{{ $getTypsName(workDetailData.pt_id) }}
-                </div>
-                <div style="color: #909399; line-height: 25px;">
-                  <b>{{ workDetailData.receiver_name }}</b>
-                  {{ workDetailData.status_mark }}
-                </div>
+                {{workDetailData.owner_name}}
+                {{ $getTypsName(workDetailData.pt_id) }}任务
+                <el-tag>{{ workDetailData.point_config.base_point }}分</el-tag>
+                <el-tag type="info">{{ workDetailData.receiver_name }}{{ workDetailData.status_mark }}</el-tag>
               </div>
             </div>
-          </el-col>
-        </el-row>
+          </template>
+          <el-descriptions
+            title="任务信息"
+            direction="vertical"
+            :column="2"
+            size="small"
+            :label-style="{width:'80px',textAlign:'center'}"
+            :content-style="{width:'80px',textAlign: 'center'}"
+            border
+          >
+            <el-descriptions-item
+              label="任务内容"
+            >{{workDetailData.task_name}}
+            </el-descriptions-item>
+            <el-descriptions-item
+              v-if="workDetailData.receiver_id !== 0"
+              :label="workDetailData.status == 3 ? '完成人' : '领取人'"
+            >{{workDetailData.receiver_name}}
+            </el-descriptions-item>
+            <el-descriptions-item
+              v-if="workDetailData.task_remark"
+              label="任务备注"
+            >{{workDetailData.task_remark}}
+            </el-descriptions-item>
+            <el-descriptions-item
+              v-if="workDetailData.point_config"
+              label="任务积分"
+            >
+              {{ workDetailData.point_config.base_point }}{{ $getTypsName(workDetailData.pt_id) }}
+            </el-descriptions-item>
+            <el-descriptions-item label="发布时间">{{workDetailData.create_time}}</el-descriptions-item>
+            <el-descriptions-item label="截止时间">{{workDetailData.end_time}}</el-descriptions-item>
+            <el-descriptions-item
+              v-if="workDetailData.point_config && workDetailData.point_config.timeout_deduction_point"
+              label="逾期扣分"
+            >
+              {{ workDetailData.point_config.timeout_deduction_point }}/天
+            </el-descriptions-item>
+            <el-descriptions-item
+              v-if="workDetailData.point_config && workDetailData.point_config.ahead_award_point"
+              label="提前奖分"
+            >
+              {{ workDetailData.point_config.ahead_award_point }}/天
+            </el-descriptions-item>
+            <el-descriptions-item
+              v-if="workDetailData.department_info"
+              label="可见范围"
+            >
+              <div class="content_text" v-if="workDetailData.department_info.length > 0">
+                <span
+                  v-for="(item, index) in workDetailData.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="workDetailData.reviewer_name"
+              label="审批人"
+            >
+              {{workDetailData.reviewer_name}}
+            </el-descriptions-item>
+            <el-descriptions-item label="任务类型">{{ workDetailData.source_type_mark }}</el-descriptions-item>
+          </el-descriptions>
 
-        <ul>
-          <li class="flex-box">
-            <div class="label">任务内容</div>
-            <div class="content_text">{{ workDetailData.task_name }}</div>
-          </li>
-          <li class="flex-box" v-if="workDetailData.status == 2 && workDetailData.receiver_id != 0">
-            <div class="label">领取人</div>
-            <div class="content_text">{{ workDetailData.receiver_name }}</div>
-          </li>
-          <li class="flex-box" v-if="workDetailData.status == 3 && workDetailData.receiver_id != 0">
-            <div class="label">完成人</div>
-            <div class="content_text">{{ workDetailData.receiver_name }}</div>
-          </li>
-          <li class="flex-box" v-if="workDetailData.task_remark">
-            <div class="label">任务备注</div>
-            <div class="content_text">{{ workDetailData.task_remark }}</div>
-          </li>
-          <li class="flex-box" v-if="workDetailData.point_config">
-            <div class="label">任务积分</div>
-            <div class="content_text orange">{{ workDetailData.point_config.base_point }}{{ $getTypsName(workDetailData.pt_id) }}</div>
-          </li>
-          <li class="flex-box">
-            <div class="label">发布时间</div>
-            <div class="content_text">{{ workDetailData.create_time }}</div>
-          </li>
-          <li class="flex-box">
-            <div class="label">截止时间</div>
-            <div class="content_text">{{ workDetailData.end_time }}</div>
-          </li>
-					<li class="flex-box" v-if="workDetailData.point_config">
-						<div class="label">逾期扣分</div>
-						<div class="content_text">{{ workDetailData.point_config.timeout_deduction_point }}/天</div>
-					</li>
-					<li class="flex-box" v-if="workDetailData.point_config.ahead_award_point">
-						<div class="label">提前奖分</div>
-						<div class="content_text">{{ workDetailData.point_config.ahead_award_point }}/天</div>
-					</li>
-          <li class="flex-box" v-if="workDetailData.department_info">
-            <div class="label">可见范围</div>
-            <div class="content_text">
-              <span v-for="(item, index) in workDetailData.department_info">{{ item.name }},</span>
-            </div>
-          </li>
-          <li class="flex-box">
-            <div class="label">任务类型</div>
-            <div class="content_text">{{ workDetailData.source_type_mark }}</div>
-          </li>
-        </ul>
+          <el-descriptions
+            v-if="workDetailData.item_info"
+            style="margin-top: 20px"
+            title="规则依据"
+            direction="vertical"
+            :column="1"
+            size="small"
+            :label-style="{width:'80px',textAlign:'center'}"
+            :content-style="{width:'80px',textAlign: 'center'}"
+            border
+          >
+            <el-descriptions-item label="规则">{{workDetailData.item_info.remark}}</el-descriptions-item>
+            <el-descriptions-item label="积分">{{pointRemark}}</el-descriptions-item>
+            <el-descriptions-item label="规则状态" v-if="workDetailData.item_info.has_delete">
+              <el-tag type="warning">规则已删除</el-tag>
+            </el-descriptions-item>
+            <el-descriptions-item v-if="workDetailData.rule_info" label="分类">{{workDetailData.rule_info.name}}</el-descriptions-item>
+            <el-descriptions-item v-if="workDetailData.rule_info && workDetailData.rule_info.has_delete" label="分类状态">
+              <el-tag type="warning">分类已删除</el-tag>
+            </el-descriptions-item>
+          </el-descriptions>
+
+          <el-descriptions
+            v-else-if="workDetailData.rule_info"
+            style="margin-top: 20px"
+            title="规则分类"
+            direction="vertical"
+            :column="1"
+            size="small"
+            :label-style="{width:'80px',textAlign:'center'}"
+            :content-style="{width:'80px',textAlign: 'center'}"
+            border
+          >
+            <el-descriptions-item label="分类">{{workDetailData.rule_info.name}}</el-descriptions-item>
+            <el-descriptions-item label="分类状态" v-if="workDetailData.rule_info.has_delete">
+              <el-tag type="warning">分类已删除</el-tag>
+            </el-descriptions-item>
+          </el-descriptions>
+
+        </el-card>
       </div>
     </el-drawer>
   </div>
 </template>
 
 <script>
+import Template from "../../../examine/components/Template.vue";
+
 export default {
   name: 'rewardTaskDetailsPopup',
+  components: {Template},
   props: {
     title: {
       type: String,
@@ -108,6 +240,12 @@ export default {
       }
     };
   },
+  computed:{
+    pointRemark(){
+      if (!(this.workDetailData && this.workDetailData.item_info)) return ''
+      return this.workDetailData.item_info.range_type === 1 ? `${this.workDetailData.item_info.min_point} ${this.$getTypsName(this.workDetailData.item_info.pt_id)}` : `${this.workDetailData.item_info.min_point} -- ${this.workDetailData.item_info.max_point} ${this.$getTypsName(this.workDetailData.item_info.pt_id)}`
+    }
+  },
   mounted() {
     this.getData();
     this.Delay_to_open = this.visible; //更换打开抽屉时机,避免打开两次

+ 166 - 68
src/point/views/common/taskDetailsPopup.vue

@@ -4,69 +4,149 @@
     <el-drawer  :visible.sync="Delay_to_open" :with-header="false" :size="'500px'" :before-close="handleClose" :custom-class="'drawer_details'">
       <div class="details_title">{{ title }}</div>
       <div class="details_content"  v-loading="loading">
-        <div class="flex-box flex-v-ce">
-          <userImage class="user_img person_imghead" width="46px" height="46px" :user_name="workDetailData.employee_name" :img_url="workDetailData.img_url"></userImage>
-          <div class="d_userMessage">
-            <div>{{ workDetailData.employee_name }}</div>
-            <div v-if="detailType != 2 && workDetailData.dept_list[0]">{{ workDetailData.dept_list[0].dept_name }}</div>
-          </div>
-          <div style="margin-left: 5px;" class="flex-box flex-v-ce">
-            <div v-if="workDetailData.point_config.review_point > 0" class="red">+{{ workDetailData.point_config.review_point }}</div>
-            <div v-else class="green">{{ workDetailData.point_config.review_point }}</div>
-            <div style="margin-left: 5px;">{{ $getTypsName(workDetailData.pt_id) }}</div>
-          </div>
-        </div>
-        <ul>
-          <li class="flex-box">
-            <div class="label">任务内容</div>
-            <div class="content_text">{{ workDetailData.task_name }}</div>
-          </li>
-          <li class="flex-box">
-            <div class="label">发布时间</div>
-            <div class="content_text">{{ workDetailData.create_time }}</div>
-          </li>
-          <li class="flex-box">
-            <div class="label">任务备注</div>
-            <textarea class="flex-1" disabled="disabled" v-model="workDetailData.task_remark" style="border: none;height:100px"></textarea>
-          </li>
-          <li class="flex-box">
-            <div class="label">任务积分</div>
-            <div class="content_text">{{ workDetailData.point_config.base_point }}{{ workDetailData.pt_name }}</div>
-          </li>
-          <li class="flex-box" v-if="workDetailData.point_config.review_point">
-            <div class="label">最终分</div>
-            <div class="content_text">{{ workDetailData.point_config.review_point }}</div>
-          </li>
-          <li class="flex-box">
-            <div class="label">截止时间</div>
-            <div class="content_text">{{ workDetailData.expire_time }} <span style="padding-left: 10px;" class="red" v-show="workDetailData.expire_day > 0">逾期{{ workDetailData.expire_day }}天</span></div>
-          </li>
-					<li class="flex-box" v-if="workDetailData.point_config.timeout_deduction_point > 0">
-						<div class="label">逾期扣分</div>
-						<div class="content_text">{{ workDetailData.point_config.timeout_deduction_point }} B分/天</div>
-					</li>
-					<li class="flex-box" v-if="workDetailData.point_config.ahead_award_point > 0">
-						<div class="label">提前奖分</div>
-						<div class="content_text">{{ workDetailData.point_config.ahead_award_point }} B分/天</div>
-					</li>
-          <li class="flex-box">
-            <div class="label">审批人</div>
-            <div class="content_text">{{ workDetailData.reviewer_name }}</div>
-          </li>
-          <li class="flex-box">
-            <div class="label">发布人</div>
-            <div class="content_text">{{ workDetailData.publisher_name }}</div>
-          </li>
-          <li class="flex-box">
-            <div class="label">积分种类</div>
-            <div class="content_text">{{ workDetailData.pt_name }}</div>
-          </li>
-        </ul>
+<!--        <div class="flex-box flex-v-ce">-->
+<!--          <userImage class="user_img person_imghead" width="46px" height="46px" :user_name="workDetailData.employee_name" :img_url="workDetailData.img_url"></userImage>-->
+<!--          <div class="d_userMessage">-->
+<!--            <div>{{ workDetailData.employee_name }}</div>-->
+<!--            <div v-if="detailType != 2 && workDetailData.dept_list[0]">{{ workDetailData.dept_list[0].dept_name }}</div>-->
+<!--          </div>-->
+<!--          <div style="margin-left: 5px;" class="flex-box flex-v-ce">-->
+<!--            <div v-if="workDetailData.point_config.review_point > 0" class="red">+{{ workDetailData.point_config.review_point }}</div>-->
+<!--            <div v-else class="green">{{ workDetailData.point_config.review_point }}</div>-->
+<!--            <div style="margin-left: 5px;">{{ $getTypsName(workDetailData.pt_id) }}</div>-->
+<!--          </div>-->
+<!--        </div>-->
+<!--        <ul>-->
+<!--          <li class="flex-box">-->
+<!--            <div class="label">任务内容</div>-->
+<!--            <div class="content_text">{{ workDetailData.task_name }}</div>-->
+<!--          </li>-->
+<!--          <li class="flex-box">-->
+<!--            <div class="label">发布时间</div>-->
+<!--            <div class="content_text">{{ workDetailData.create_time }}</div>-->
+<!--          </li>-->
+<!--          <li class="flex-box">-->
+<!--            <div class="label">任务备注</div>-->
+<!--            <textarea class="flex-1" disabled="disabled" v-model="workDetailData.task_remark" style="border: none;height:100px"></textarea>-->
+<!--          </li>-->
+<!--          <li class="flex-box">-->
+<!--            <div class="label">任务积分</div>-->
+<!--            <div class="content_text">{{ workDetailData.point_config.base_point }}{{ workDetailData.pt_name }}</div>-->
+<!--          </li>-->
+<!--          <li class="flex-box" v-if="workDetailData.point_config.review_point">-->
+<!--            <div class="label">最终分</div>-->
+<!--            <div class="content_text">{{ workDetailData.point_config.review_point }}</div>-->
+<!--          </li>-->
+<!--          <li class="flex-box">-->
+<!--            <div class="label">截止时间</div>-->
+<!--            <div class="content_text">{{ workDetailData.expire_time }} <span style="padding-left: 10px;" class="red" v-show="workDetailData.expire_day > 0">逾期{{ workDetailData.expire_day }}天</span></div>-->
+<!--          </li>-->
+<!--					<li class="flex-box" v-if="workDetailData.point_config.timeout_deduction_point > 0">-->
+<!--						<div class="label">逾期扣分</div>-->
+<!--						<div class="content_text">{{ workDetailData.point_config.timeout_deduction_point }} B分/天</div>-->
+<!--					</li>-->
+<!--					<li class="flex-box" v-if="workDetailData.point_config.ahead_award_point > 0">-->
+<!--						<div class="label">提前奖分</div>-->
+<!--						<div class="content_text">{{ workDetailData.point_config.ahead_award_point }} B分/天</div>-->
+<!--					</li>-->
+<!--          <li class="flex-box">-->
+<!--            <div class="label">审批人</div>-->
+<!--            <div class="content_text">{{ workDetailData.reviewer_name }}</div>-->
+<!--          </li>-->
+<!--          <li class="flex-box">-->
+<!--            <div class="label">发布人</div>-->
+<!--            <div class="content_text">{{ workDetailData.publisher_name }}</div>-->
+<!--          </li>-->
+<!--          <li class="flex-box">-->
+<!--            <div class="label">积分种类</div>-->
+<!--            <div class="content_text">{{ workDetailData.pt_name }}</div>-->
+<!--          </li>-->
+<!--        </ul>-->
+
+<!--    基础信息    -->
+        <el-card shadow="always" >
+          <template slot="header">
+            <div class="flex-box flex-v-ce">
+              <userImage class="user_img person_imghead" width="46px" height="46px" :user_name="workDetailData.employee_name" :img_url="workDetailData.img_url"></userImage>
+              <div class="d_userMessage">
+                <div>{{ workDetailData.employee_name }}</div>
+                <div v-if="detailType != 2 && workDetailData.dept_list[0]">{{ workDetailData.dept_list[0].dept_name }}</div>
+              </div>
+              <div style="margin-left: 5px;" class="flex-box flex-v-ce" v-if="workDetailData.point_config.review_point">
+                <div v-if="workDetailData.point_config.review_point > 0" class="red">+{{ workDetailData.point_config.review_point }}</div>
+                <div v-else class="green">{{ workDetailData.point_config.review_point }}</div>
+                <div style="margin-left: 5px;">{{ $getTypsName(workDetailData.pt_id) }}</div>
+              </div>
+            </div>
+          </template>
+          <el-descriptions
+            title="任务信息"
+            direction="vertical"
+            :column="2"
+            size="small"
+            :label-style="{width:'80px',textAlign:'center'}"
+            :content-style="{width:'80px',textAlign: 'center'}"
+            border
+          >
+            <el-descriptions-item label="审批人">{{workDetailData.reviewer_name}}</el-descriptions-item>
+            <el-descriptions-item label="发布人">{{workDetailData.publisher_name}}</el-descriptions-item>
+            <el-descriptions-item label="任务积分">{{ workDetailData.point_config.base_point }}{{ workDetailData.pt_name }}</el-descriptions-item>
+            <el-descriptions-item label="内容">{{workDetailData.task_name}}</el-descriptions-item>
+            <el-descriptions-item label="任务备注">{{workDetailData.task_remark}}</el-descriptions-item>
+            <el-descriptions-item label="发布时间">{{workDetailData.create_time}}</el-descriptions-item>
+            <el-descriptions-item v-if="workDetailData.point_config.review_point" label="最终分">{{workDetailData.point_config.review_point}}</el-descriptions-item>
+            <el-descriptions-item label="截止时间">{{ workDetailData.expire_time }} <span style="padding-left: 10px;" class="red" v-show="workDetailData.expire_day > 0">逾期{{ workDetailData.expire_day }}天</span></el-descriptions-item>
+            <el-descriptions-item v-if="workDetailData.point_config.timeout_deduction_point > 0" label="逾期扣分">{{ workDetailData.point_config.timeout_deduction_point }} B分/天</el-descriptions-item>
+            <el-descriptions-item v-if="workDetailData.point_config.ahead_award_point > 0" label="提前奖分">{{ workDetailData.point_config.ahead_award_point }} B分/天</el-descriptions-item>
+
+          </el-descriptions>
+
+          <el-descriptions
+            v-if="workDetailData.item_info"
+            style="margin-top: 20px"
+            title="规则依据"
+            direction="vertical"
+            :column="1"
+            size="small"
+            :label-style="{width:'80px',textAlign:'center'}"
+            :content-style="{width:'80px',textAlign: 'center'}"
+            border
+          >
+            <el-descriptions-item label="规则">{{workDetailData.item_info.remark}}</el-descriptions-item>
+            <el-descriptions-item label="积分">{{pointRemark}}</el-descriptions-item>
+            <el-descriptions-item label="规则状态" v-if="workDetailData.item_info.has_delete">
+              <el-tag type="warning">规则已删除</el-tag>
+            </el-descriptions-item>
+            <el-descriptions-item v-if="workDetailData.rule_info" label="分类">{{workDetailData.rule_info.name}}</el-descriptions-item>
+            <el-descriptions-item v-if="workDetailData.rule_info && workDetailData.rule_info.has_delete" label="分类状态">
+              <el-tag type="warning">分类已删除</el-tag>
+            </el-descriptions-item>
+          </el-descriptions>
+
+          <el-descriptions
+            v-else-if="workDetailData.rule_info"
+            style="margin-top: 20px"
+            title="规则分类"
+            direction="vertical"
+            :column="1"
+            size="small"
+            :label-style="{width:'80px',textAlign:'center'}"
+            :content-style="{width:'80px',textAlign: 'center'}"
+            border
+          >
+            <el-descriptions-item label="分类">{{workDetailData.rule_info.name}}</el-descriptions-item>
+            <el-descriptions-item label="分类状态" v-if="workDetailData.rule_info.has_delete">
+              <el-tag type="warning">分类已删除</el-tag>
+            </el-descriptions-item>
+          </el-descriptions>
+
+        </el-card>
+
         <div v-show="showWork">
           <div class="d_progress">
             <div class="flex-box">
               <div class="flex-1">工作进度({{ workDetailData.progress }}%)</div>
-              <div class="fontColorC addJf" @click="isSlider = true" v-if="workDetailData.employee_id == userId && workDetailData.status == 1">+更新进度</div>
+              <div class="fontColorC addJf" @click="isSlider = true" v-if="canUpdate">+更新进度</div>
             </div>
             <el-progress :percentage="workDetailData.progress"></el-progress>
           </div>
@@ -78,9 +158,9 @@
                   <div
                     class="fontColorC addJf"
                     @click="isOne = true"
-                    v-if="workDetailData.employee_id == userId && (workDetailData.status == 1||workDetailData.status == 2)"
+                    v-if="canUpdate"
                   >
-                    +记一条工作记录
+                    +新增工作记录
                   </div>
                 </div>
                 <div class="work_box">
@@ -126,7 +206,7 @@
                         <i class="el-icon-delete"  v-if="item.recorder_id == userId" @click="deleteItem(item,index)"></i>
                     </div>
                   </div>
-                  <div v-if="point_list.length == 0" class="fontColorC" style="text-align: center;">暂无分记录</div>
+                  <div v-if="point_list.length == 0" class="fontColorC" style="text-align: center;">暂无分记录</div>
                 </div>
               </el-tab-pane>
             </el-tabs>
@@ -153,7 +233,7 @@
     <el-dialog :close-on-click-modal="false" title="记一条" :visible.sync="isOne" :before-close="publicClose" width="40%">
       <div class="flex-box">
         <div style="width: 80px;">工作记录</div>
-        <el-input type="textarea" :rows="3" placeholder="请输入内容" v-model="textarea"></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>
@@ -164,7 +244,7 @@
     <el-dialog :close-on-click-modal="false" title="记分" :visible.sync="isIntegral" :before-close="publicClose" width="40%">
       <el-form :model="integral" ref="integral" label-width="80px">
         <el-form-item label="记录" prop="text" :rules="[{ required: true, message: '记录不能为空' }]">
-          <el-input type="textarea" :rows="3" v-model="integral.text"></el-input>
+          <el-input type="textarea" :rows="3" v-model="integral.text" @input="onIntegralTextInput"></el-input>
         </el-form-item>
         <el-form-item label="记分" prop="num" :rules="[{ required: true, message: '记分不能为空' }, { type: 'number', message: '积分必须为数字值' }]">
           <div class="num" :class="[integral.type == '1' ? 'add' : 'jian']"></div>
@@ -186,8 +266,12 @@
 </template>
 
 <script>
+import Template from "../../../examine/components/Template.vue";
+import {specialFilter} from "../../../utils";
+
 export default {
   name: 'taskDetailsPopup',
+  components: {Template},
   props: {
     title: {
       type: String,
@@ -249,6 +333,15 @@ export default {
       isShowJf:false
     };
   },
+  computed:{
+    canUpdate(){
+      return this.workDetailData.employee_id === this.userId && [1,6].includes(this.workDetailData.status)
+    },
+    pointRemark(){
+      if (!(this.workDetailData && this.workDetailData.item_info)) return ''
+      return this.workDetailData.item_info.range_type === 1 ? `${this.workDetailData.item_info.min_point} ${this.$getTypsName(this.workDetailData.item_info.pt_id)}` : `${this.workDetailData.item_info.min_point} -- ${this.workDetailData.item_info.max_point} ${this.$getTypsName(this.workDetailData.item_info.pt_id)}`
+    }
+  },
   watch: {
     isSlider(val) {
       if (val) {
@@ -264,6 +357,12 @@ export default {
     });
   },
   methods: {
+    onTextareaInput(val){
+      this.textarea = specialFilter(val)
+    },
+    onIntegralTextInput(val){
+      this.integral.text = specialFilter(val)
+    },
     deleteItem(obj,index){
       this.$confirm('此操作将永久删除记录, 是否继续?', '提示', {
         confirmButtonText: '确定',
@@ -342,7 +441,6 @@ export default {
         work_id: this.workDetailData.id,
         process: []
       };
-      // console.log(items)
       items.unshift(process);
       data.process = items;
       this.$refs[formName].validate(valid => {
@@ -400,16 +498,16 @@ export default {
       this.$emit('update:visible', false);
     },
     keepTheScore(data){
-      if(data.status > 2){
+      if(![1,2,6].includes(data.status)){
         return false
       }
-      if(this.userId == data.reviewer_id){
+      if(this.userId === data.reviewer_id){
         return true
       }
       let info=this.$getEmployeeMapItem(data.employee_id)
       if(info){
         return info.employee_detail.superior_list.some(x =>{
-          if(this.userId == x.id){
+          if(this.userId === x.id){
             return true
           }
         })

+ 195 - 20
src/point/views/common/temporaryTask.vue

@@ -9,11 +9,41 @@
             prop="task_name"
             :rules="[{ required: true, message: '请填写任务内容'}, { min: 3, max: 20, message: '长度在 3 到 20 个字符'}]"
           >
-            <el-input type="textarea" rows="3" maxlength="20" show-word-limit v-model="formData.task_name" placeholder="请输入任务内容(限20字)"></el-input>
+            <el-input type="textarea" rows="3" maxlength="20" show-word-limit v-model="formData.task_name" placeholder="请输入任务内容(限20字)" @input="onTaskNameInput"></el-input>
+          </el-form-item>
+
+          <el-form-item label="积分类型" prop="pt_id" :rules="[{ required: true, message: '请选择积分类型'}]">
+            <el-radio-group v-model="formData.pt_id">
+              <el-radio v-for="(item, index) in pts" :key="index" v-show="item.code !== 'JX'" :label="item.id">{{ item.name }}</el-radio>
+            </el-radio-group>
+            <span class="blue cursor" style="padding-left: 20px;font-size: 14px;" @click="$openUrl(17)">什么是A分、B分?</span>
+          </el-form-item>
+
+          <el-form-item label="指定规则">
+            <el-radio-group v-model="formData.rule_type">
+              <el-radio-button :label="0">不指定</el-radio-button>
+              <el-radio-button :label="1">规则分类</el-radio-button>
+              <el-radio-button :label="2">指定规则</el-radio-button>
+            </el-radio-group>
+          </el-form-item>
+
+          <el-form-item label="规则分类" prop="rule_id" v-if="formData.rule_type === 1" :rules="[{required:true,message:'请选择规则分类'}]">
+            <el-cascader
+              class="w250"
+              v-model="formData.rule_id"
+              :options="rule_list"
+              :props="{children:'child',label:'name',value:'id', checkStrictly: true,emitPath:false}"
+            />
+          </el-form-item>
+          <el-form-item label="积分规则" prop="rule_item.remark" v-if="formData.rule_type === 2" :rules="[{required:true,message:'请选择积分规则'}]">
+            <el-input placeholder="请选择规则" v-model="formData.rule_item.remark" readonly @focus="showRuleItems = true">
+              <el-button slot="append" icon="el-icon-search" @click.stop="showRuleItems = true"/>
+            </el-input>
+            <i style="color: red">{{itemRemark}}</i>
           </el-form-item>
 
           <el-form-item label="任务积分" prop="base_point" :rules="[{ required: true, message: '请填写任务积分'}]">
-            <el-input-number v-model="formData.base_point" :min="1"></el-input-number>
+            <el-input-number ref="base_point" v-model="formData.base_point" :disabled="formData.rule_item.range_type === 1" @change="onBasePointChange"></el-input-number>
           </el-form-item>
 
           <el-form-item label="执行人" prop="targets" :rules="[{ required: true, message: '请选择执行人'}]">
@@ -33,12 +63,6 @@
             </el-row>
           </el-form-item>
 
-          <el-form-item label="规则积分" prop="pt_id" :rules="[{ required: true, message: '请选择规则积分'}]">
-            <el-radio-group v-model="formData.pt_id">
-              <el-radio v-for="(item, index) in $getTyps()" :key="index" v-show="item.code !== 'JX'" :label="item.id">{{ item.name }}</el-radio>
-            </el-radio-group>
-                        <span class="blue cursor" style="padding-left: 20px;font-size: 14px;" @click="$openUrl(17)">什么是A分、B分?</span>
-          </el-form-item>
           <el-form-item label="重复周期" prop="task_cycle">
             <el-select v-model="formData.task_cycle" placeholder="请选择重复周期">
               <el-option v-for="(item, index) in task_cycle_arr" :key="index" :label="item.name" :value="item.value"></el-option>
@@ -55,23 +79,27 @@
               default-time="18:00"
               :clearable="false"
             ></el-date-picker>
+            <el-tooltip placement="right" style="margin-left: 10px" content="任务截止时间是触发任务提前奖分/逾期扣分的关键属性"><span class="tips">?</span></el-tooltip>
           </el-form-item>
           <el-form-item label="截止时间" prop="task_expire_day" v-if="formData.task_cycle == 1" :rules="[{ required: true, message: '请选择截止时间'}]">
             <el-select v-model="formData.task_expire_day" placeholder="请选择截止时间">
               <el-option v-for="item in columns1" :key="item.value" :label="item.name" :value="item.value"></el-option>
             </el-select>
+            <el-tooltip placement="right" style="margin-left: 10px" content="任务截止时间是触发任务提前奖分/逾期扣分的关键属性"><span class="tips">?</span></el-tooltip>
           </el-form-item>
 
           <el-form-item label="截止时间" prop="task_expire_day" v-if="formData.task_cycle == 2" :rules="[{ required: true, message: '请选择截止时间'}]">
             <el-select v-model="formData.task_expire_day" placeholder="请选择截止时间">
               <el-option v-for="item in columns2" :key="item.value" :label="item.name" :value="item.value"></el-option>
             </el-select>
+            <el-tooltip placement="right" style="margin-left: 10px" content="任务截止时间是触发任务提前奖分/逾期扣分的关键属性"><span class="tips">?</span></el-tooltip>
           </el-form-item>
 
           <el-form-item label="截止时间" prop="task_expire_day" v-if="formData.task_cycle == 3" :rules="[{ required: true, message: '请选择截止时间'}]">
             <el-select v-model="formData.task_expire_day" placeholder="请选择截止时间">
               <el-option v-for="item in columns3" :key="item.value" :label="item.name" :value="item.value"></el-option>
             </el-select>
+            <el-tooltip placement="right" style="margin-left: 10px" content="任务截止时间是触发任务提前奖分/逾期扣分的关键属性"><span class="tips">?</span></el-tooltip>
           </el-form-item>
 
           <el-form-item label="有效日期" prop="schedule_expire_date" >
@@ -87,39 +115,44 @@
               @change="scheduleExpireDateChange"
               @input="scheduleExpireDateInput"
             ></el-date-picker>
-            <el-tooltip placement="right" content="设置此选项,到了有效日期不再自动发布。默认一直重复发布任务" style="margin-left: 10px"><span class="tips">?</span></el-tooltip>
+            <el-tooltip placement="right" content="设置此选项,到了(不包含)有效日期不再自动发布。默认一直重复发布任务" style="margin-left: 10px"><span class="tips">?</span></el-tooltip>
           </el-form-item>
 
           <el-form-item label="任务备注" prop="task_remark" :rules="[{ max: 300, message: '长度不能超过 300 个字'}]">
-            <el-input type="textarea" :rows="5" maxlength="300" show-word-limit v-model="formData.task_remark" placeholder="请输入任务内容(限300字)"></el-input>
+            <el-input type="textarea" :rows="5" maxlength="300" show-word-limit v-model="formData.task_remark" placeholder="请输入任务内容(限300字)" @input="onTaskRemarkInput"></el-input>
           </el-form-item>
 
           <div style="margin-left: 80px; margin-bottom: 8px;">以天为单位,每 提前/逾期 一天 加分/扣分</div>
           <el-form-item label="提前奖分" prop="ahead_award_point">
-          	<el-input v-model="formData.ahead_award_point" oninput="value=value.replace(/[^\d]/g,'')" placeholder="请输入每日奖分" style="width: 150px;"></el-input>
+          	<el-input
+              v-model="formData.ahead_award_point"
+              @input="v => formData.ahead_award_point = v.replace(/[^\d]/g,'')"
+              placeholder="请输入每日奖分"
+              style="width: 150px;"
+            />
           	B分/每天, 奖分上限 &nbsp;
           	<el-input
           		v-model="formData.ahead_award_point_limit"
-          		oninput="value=value.replace(/[^\d]/g,'')"
+              @input="v => formData.ahead_award_point_limit = v.replace(/[^\d]/g,'')"
           		placeholder="请输入奖分上限"
           		style="width: 150px;"
-          	></el-input>
+          	/>
           	B分
           </el-form-item>
           <el-form-item label="逾期扣分" prop="timeout_deduction_point">
           	<el-input
           		v-model="formData.timeout_deduction_point"
-          		oninput="value=value.replace(/[^\d]/g,'')"
+              @input="v => formData.timeout_deduction_point = v.replace(/[^\d]/g,'')"
           		placeholder="请输入每日扣分"
           		style="width: 150px;"
-          	></el-input>
+          	/>
           	B分/每天, 扣分上限 &nbsp;
           	<el-input
           		v-model="formData.timeout_deduction_point_limit"
-          		oninput="value=value.replace(/[^\d]/g,'')"
+              @input="v => formData.timeout_deduction_point_limit = v.replace(/[^\d]/g,'')"
           		placeholder="请输入扣分上限"
           		style="width: 150px;"
-          	></el-input>
+          	/>
           	B分
           </el-form-item>
 
@@ -160,12 +193,22 @@
       :visible.sync="show_reviewer_selector"
       @confirm="reviewer_confirm"
     />
+    <SelectRule
+      :visible.sync="showRuleItems"
+      :pt-id = "formData.pt_id"
+      :select-items="selectItem"
+      :is-scope="true"
+      :multiple="false"
+      @confirm="onItemConfirm"
+    />
   </div>
 </template>
 
 <script>
 import moment from 'moment';
 import EmployeeSelector from '@/components/EmployeeSelector';
+import {specialFilter} from "../../../utils";
+import SelectRule from "../../../components/SelectRule.vue";
 export default {
   name: 'temporaryTask',
   props: {
@@ -186,7 +229,23 @@ export default {
   },
   data() {
     return {
+      rule_list:[],
+      showRuleItems:false,
       formData: {
+        rule_type:0,
+        rule_id:0,
+        rule_item:{
+          id:0,
+          remark:"",
+          cycle_type: 0,
+          is_attendance: 0,
+          max_point: 0,
+          min_point: 0,
+          prize_type: 0,
+          pt_id: 0,
+          range_type: 0,
+          rule_id: 0,
+        },
         task_name: '',
         base_point: '',
         task_remark: '',
@@ -292,10 +351,11 @@ export default {
         { name: '29号', value: 29 },
         { name: '30号', value: 30 },
         { name: '31号', value: 31 }
-      ]
+      ],
+      pts:this.$getTyps()
     };
   },
-  components: { EmployeeSelector },
+  components: {SelectRule, EmployeeSelector },
   watch: {
     'formData.task_cycle'(val) {
       if (val) {
@@ -304,10 +364,57 @@ export default {
         this.formData.expire_time = moment().format('YYYY-MM-DD 18:00');
         this.formData.schedule_expire_date = '';
       }
+    },
+    'formData.rule_type'(val) {
+      this.initRuleData()
+    },
+    'formData.pt_id'(val){
+      if (this.formData.rule_type === 2) this.initRuleData()
+    }
+  },
+  computed:{
+    selectItem(){
+      return this.formData.rule_item && this.formData.rule_item.id ? [this.formData.rule_item] : []
+    },
+    itemRemark(){
+      let pt = this.pts.find(pt => pt.id === this.formData.rule_item.pt_id)
+      pt = pt ? pt.name : ''
+      switch (this.formData.rule_item.range_type){
+        case 1:
+          return `${this.formData.rule_item.min_point} ${pt}`
+        case 2:
+          return `${this.formData.rule_item.min_point} -- ${this.formData.rule_item.max_point} ${pt}`
+        default:
+          return ''
+      }
     }
   },
   methods: {
+    initRuleData(){
+      this.formData.rule_id = 0
+      this.formData.rule_item = {
+        id:0,
+        remark:"",
+        cycle_type: 0,
+        is_attendance: 0,
+        max_point: 0,
+        min_point: 0,
+        prize_type: 0,
+        pt_id: 0,
+        range_type: 0,
+        rule_id: 0,
+      }
+      this.formData.base_point = 1
+    },
     sub(formName) {
+      if (this.formData.rule_type === 1 && this.formData.rule_id <= 0){
+        this.$message.error('请选择规则分类')
+        return
+      }
+      if (this.formData.rule_type === 2 && this.formData.rule_item.id <= 0){
+        this.$message.error('请选择积分规则')
+        return
+      }
       this.$refs[formName].validate(valid => {
         if (valid) {
           this.saveFun(formName);
@@ -319,6 +426,8 @@ export default {
       this.$refs[formName].resetFields();
       this.executorName = '';
       this.reviewerName = '';
+      this.formData.rule_type = 0
+      this.initRuleData()
     },
     ahead_timeout(item, arr, codes, code) {
     	if (item) {
@@ -341,6 +450,7 @@ export default {
       // /api/integral/schedule/publish/work
       let self = this;
       let data = JSON.parse(JSON.stringify(self.formData));
+      data.item_id = data.rule_item.id
       if (data.task_cycle == 0) {
         delete data.task_cycle;
         delete data.task_expire_day;
@@ -370,7 +480,7 @@ export default {
       }
       if (this.ahead_timeout(data.ahead_award_point, data.ahead_award_point_limit, '提前奖分', '奖分')) return;
       if (this.ahead_timeout(data.timeout_deduction_point, data.timeout_deduction_point_limit, '逾期扣分', '扣分')) return;
-      if (!this.$supremeAuthority('creator') || this.$userInfo().point_config.point_limit.length != 0) {
+      if (!this.$supremeAuthority('creator') && this.$userInfo().point_config.point_limit.length != 0) {
       	let entry_limit = Number(this.$userInfo().point_config.point_limit[1].point);
       	if (entry_limit > 0) {
       		if (data.ahead_award_point > entry_limit || data.timeout_deduction_point > entry_limit) {
@@ -466,6 +576,8 @@ export default {
     closeDialog() {
       this.formData.timeout_deduction_point_limit= null;
       this.formData.ahead_award_point_limit= null;
+      this.formData.rule_type = 0
+      this.initRuleData()
       this.resetForm('formData');
       // this.$emit('update:dialogVisible', false)
     },
@@ -480,6 +592,69 @@ export default {
         this.$forceUpdate();
       })
     },
+    onTaskNameInput(val) {
+      this.formData.task_name = specialFilter(val)
+    },
+    onTaskRemarkInput(val){
+      this.formData.task_remark = specialFilter(val)
+    },
+    getRuleList(){
+      let data = {
+        cycle_type:'1',
+        pt_id: this.formData.pt_id
+      }
+      this.$axiosUser('get','/api/pro/integral/rule/trees/scope',data)
+        .then(res => {
+          this.rule_list = this.getTreeData(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;
+    },
+    onItemConfirm(selectArrItem){
+      this.formData.rule_item = selectArrItem.length > 0 ? selectArrItem[0] : {
+        id:0,
+        remark:"",
+        cycle_type: 0,
+        is_attendance: 0,
+        max_point: 0,
+        min_point: 0,
+        prize_type: 0,
+        pt_id: 0,
+        range_type: 0,
+        rule_id: 0,
+      }
+      this.formData.rule_id = this.formData.rule_item.rule_id
+      this.formData.base_point = this.formData.rule_item.min_point !== 0 ? this.formData.rule_item.min_point : 1
+    },
+    onBasePointChange(currentValue,oldValue){
+      //限制范围分的上下限拦截
+      if (this.formData.rule_type !== 2 && this.formData.rule_item.range_type !== 2) return
+
+      if (currentValue < this.formData.rule_item.min_point) {
+        this.$nextTick(() => {
+          this.formData.base_point = this.formData.rule_item.min_point
+        })
+      }
+      if (currentValue > this.formData.rule_item.max_point) {
+        this.$nextTick( () => {
+          this.formData.base_point = this.formData.rule_item.max_point
+        })
+      }
+    }
+  },
+  mounted() {
+    this.getRuleList()
   }
 };
 </script>

+ 14 - 3
src/point/views/common/temporaryTaskAmend.vue

@@ -9,7 +9,7 @@
             prop="task_name"
             :rules="[{ required: true, message: '请填写任务内容'}, { min: 3, max: 20, message: '长度在 3 到 20 个字符'}]"
           >
-            <el-input type="textarea"rows="3" maxlength="20" show-word-limit v-model="formData.task_name" placeholder="请输入任务内容(限20字)"></el-input>
+            <el-input type="textarea"rows="3" maxlength="20" show-word-limit v-model="formData.task_name" placeholder="请输入任务内容(限20字)" @input="onTaskNameInput"></el-input>
           </el-form-item>
 
           <el-form-item label="任务积分" prop="base_point" :rules="[{ required: true, message: '请填写任务积分'}]">
@@ -61,27 +61,31 @@
               default-time="18:00"
               :clearable="false"
             ></el-date-picker>
+            <el-tooltip placement="right" style="margin-left: 10px" content="任务截止时间是触发任务提前奖分/逾期扣分的关键属性"><span class="tips">?</span></el-tooltip>
           </el-form-item>
           <el-form-item label="截止时间" prop="task_expire_day" v-if="formData.task_cycle == 1" :rules="[{ required: true, message: '请选择截止时间'}]">
             <el-select v-model="formData.task_expire_day" placeholder="请选择截止时间">
               <el-option v-for="item in columns1" :key="item.value" :label="item.name" :value="item.value"></el-option>
             </el-select>
+            <el-tooltip placement="right" style="margin-left: 10px" content="任务截止时间是触发任务提前奖分/逾期扣分的关键属性"><span class="tips">?</span></el-tooltip>
           </el-form-item>
 
           <el-form-item label="截止时间" prop="task_expire_day" v-if="formData.task_cycle == 2" :rules="[{ required: true, message: '请选择截止时间'}]">
             <el-select v-model="formData.task_expire_day" placeholder="请选择截止时间">
               <el-option v-for="item in columns2" :key="item.value" :label="item.name" :value="item.value"></el-option>
             </el-select>
+            <el-tooltip placement="right" style="margin-left: 10px" content="任务截止时间是触发任务提前奖分/逾期扣分的关键属性"><span class="tips">?</span></el-tooltip>
           </el-form-item>
 
           <el-form-item label="截止时间" prop="task_expire_day" v-if="formData.task_cycle == 3" :rules="[{ required: true, message: '请选择截止时间'}]">
             <el-select v-model="formData.task_expire_day" placeholder="请选择截止时间">
               <el-option v-for="item in columns3" :key="item.value" :label="item.name" :value="item.value"></el-option>
             </el-select>
+            <el-tooltip placement="right" style="margin-left: 10px" content="任务截止时间是触发任务提前奖分/逾期扣分的关键属性"><span class="tips">?</span></el-tooltip>
           </el-form-item>
 
           <el-form-item label="任务备注" prop="task_remark" :rules="[{ max: 300, message: '长度不能超过 300 个字'}]">
-            <el-input type="textarea" :rows="5" maxlength="300" show-word-limit v-model="formData.task_remark" placeholder="请输入任务内容(限300字)"></el-input>
+            <el-input type="textarea" :rows="5" maxlength="300" show-word-limit v-model="formData.task_remark" placeholder="请输入任务内容(限300字)" @input="onTaskRemarkInput"></el-input>
           </el-form-item>
 
 					<div style="margin-left: 80px; margin-bottom: 8px;">以天为单位,每 提前/逾期 一天 加分/扣分</div>
@@ -107,6 +111,7 @@
 <script>
 import moment from 'moment';
 import EmployeeSelector from '@/components/EmployeeSelector';
+import {specialFilter} from "../../../utils";
 export default {
   name: 'temporaryTask',
   props: {
@@ -352,7 +357,7 @@ export default {
       }
       if(this.ahead_timeout(data.ahead_award_point,data.ahead_award_point_limit,'提前奖分','奖分')) return
       if(this.ahead_timeout(data.timeout_deduction_point,data.timeout_deduction_point_limit,'逾期扣分','扣分')) return
-      if(!this.$supremeAuthority('creator')||this.$userInfo().point_config.point_limit.length!=0){
+      if(!this.$supremeAuthority('creator') && this.$userInfo().point_config.point_limit.length!=0){
       	let entry_limit =  Number(this.$userInfo().point_config.point_limit[1].point)
       	if(entry_limit > 0){
       		if(data.ahead_award_point > entry_limit || data.timeout_deduction_point > entry_limit ){
@@ -414,6 +419,12 @@ export default {
     },
     closeDialog() {
       this.$emit('update:dialogVisible', false);
+    },
+    onTaskNameInput(val){
+      this.formData.task_name = specialFilter(val)
+    },
+    onTaskRemarkInput(val){
+      this.formData.task_remark = specialFilter(val)
     }
   }
 };

+ 100 - 16
src/point/views/pointHome.vue

@@ -113,25 +113,32 @@
                     />
 
                     <div
-                      v-if="item.rank == 4 || item.rank == 5"
+                      v-if="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; 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;"
-                    >
-                      <b>{{ item.rank }}</b>
-                    </div>
-                    <div style="position: absolute;left: 10px;top: -16px;z-index:2;">
-                      <div
-                        v-if="index == 5 || index == 6"
-                        style="width:60px;height:24px;border:1px solid #C0C4CC;background-color:#fff;border-radius:20px;font-size:12px;color:#303133;text-align:center;line-height:24px"
-                      >
-                        <b>{{ index == 5 ? '倒数第2' : index == 6 ? '倒数第1' : '' }}</b>
-                      </div>
-                    </div>
+
+<!--                    <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; 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;"-->
+<!--                    >-->
+<!--                      <b>{{ item.rank }}</b>-->
+<!--                    </div>-->
+<!--                    <div style="position: absolute;left: 10px;top: -16px;z-index:2;">-->
+<!--                      <div-->
+<!--                        v-if="index == 5 || index == 6"-->
+<!--                        style="width:60px;height:24px;border:1px solid #C0C4CC;background-color:#fff;border-radius:20px;font-size:12px;color:#303133;text-align:center;line-height:24px"-->
+<!--                      >-->
+<!--                        <b>{{ index == 5 ? '倒数第2' : index == 6 ? '倒数第1' : '' }}</b>-->
+<!--                      </div>-->
+<!--                    </div>-->
                     <userImage :id="item.employee_id" :img_url="item.employee_img_url" fontSize="16" :user_name="item.employee_name" width="60px" height="60px"></userImage>
                   </div>
                   <span
@@ -147,7 +154,12 @@
 
           <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 class="flex-1">
+                <b class="title">团队PK</b>
+                <el-tooltip placement="top" content="只针对B分">
+                  <i class="el-icon-question fontColorC"></i>
+                </el-tooltip>
+              </div>
             </div>
             <div>
               <div class="flex-1 scroll-bar" style="margin: 20px 0; overflow-x: auto; ">
@@ -161,6 +173,7 @@
                     start-placeholder="开始日期"
                     end-placeholder="结束日期"
                     value-format="yyyy-MM-dd"
+                    :picker-options="instantPickerOptions"
                     editable
                   ></el-date-picker>
                 </div>
@@ -205,6 +218,7 @@
                   start-placeholder="开始日期"
                   end-placeholder="结束日期"
                   value-format="yyyy-MM-dd"
+                  :picker-options="instantPickerOptions"
                   editable
                 ></el-date-picker>
               </el-form-item>
@@ -455,6 +469,7 @@ import QRCode from 'qrcodejs2';
 import { mapGetters, mapState } from 'vuex';
 import axios from 'axios';
 import ECharts from 'echarts';
+import moment from "moment/moment";
 export default {
   components: {
     QRCode
@@ -465,6 +480,63 @@ export default {
     deptRankStartDate = this.$moment(deptRankStartDate).format('YYYY-MM-DD');
     let deptRankEndDate = this.$moment().format('YYYY-MM-DD');
     return {
+      instantPickerOptions: {
+        shortcuts: [
+          {
+            text: '今天',
+            onClick(picker) {
+              const now = new Date(new Date().toLocaleDateString());
+              const start = now.getTime();
+
+              picker.$emit('pick', [moment(start).format('YYYY-MM-DD'),moment(start).format('YYYY-MM-DD')]);
+            }
+          },
+          {
+            text: '昨天',
+            onClick(picker) {
+              const now = new Date(new Date().toLocaleDateString());
+              const start = now.getTime() - 60 * 60 * 24 * 1000;
+              picker.$emit('pick', [moment(start).format('YYYY-MM-DD'),moment(start).format('YYYY-MM-DD')]);
+            }
+          },
+          {
+            text: '本周',
+            onClick(picker) {
+              picker.$emit('pick', [moment().startOf('isoWeek').format('YYYY-MM-DD'),moment().endOf('isoWeek').format('YYYY-MM-DD')]);
+            }
+          },
+          {
+            text: '上周',
+            onClick(picker) {
+              picker.$emit('pick', [moment().subtract(1, 'w').startOf('isoWeek').format('YYYY-MM-DD'),moment().subtract(1, 'w').endOf('isoWeek').format('YYYY-MM-DD')]);
+            }
+          },
+          {
+            text: '本月',
+            onClick(picker) {
+              picker.$emit('pick', [moment().startOf('month').format('YYYY-MM-DD'),moment().endOf('month').format('YYYY-MM-DD')]);
+            }
+          },
+          {
+            text: '上月',
+            onClick(picker) {
+              picker.$emit('pick', [moment().subtract(1,'month').startOf('month').format('YYYY-MM-DD'),moment().subtract(1,'month').endOf('month').format('YYYY-MM-DD')]);
+            }
+          },
+          {
+            text:'本年',
+            onClick(picker){
+              picker.$emit('pick',[moment().startOf('year').format('YYYY-MM-DD'),moment().endOf('year').format('YYYY-MM-DD')])
+            },
+          },
+          {
+            text:'去年',
+            onClick(picker){
+              picker.$emit('pick',[moment().subtract(1,'year').startOf('year').format('YYYY-MM-DD'),moment().subtract(1,'year').endOf('year').format('YYYY-MM-DD')])
+            },
+          },
+        ]
+      },
       ruleTrees:[],
       rule:[],
       noticeRole: !this.$supremeAuthority('dept_manager')&&!this.$supremeAuthority('employee'),
@@ -1617,6 +1689,7 @@ export default {
       this.$socketApiTow.sendData(msg,(res) => {
         if (res.type !== msg.type || res.code !== 1) return;
         this.deptRankList = res.result.list;
+        this.deptRankList.reverse()
         this.deptRankLoading = false;
       })
     },
@@ -2699,4 +2772,15 @@ box-sizing: content-box;
 /deep/ .el-dialog__body {
   padding: 0 80px 15px;
 }
+  .tips {
+    background: #409EFF;
+    border-radius: 50%;
+    width: 14px;
+    height: 14px;
+    color: #fff;
+    display: inline-block;
+    font-size: 12px;
+    line-height: 14px;
+    text-align: center;
+  }
 </style>

+ 12 - 2
src/point/views/setting/fixed_integral.vue

@@ -5,6 +5,7 @@
         <el-alert class="diy-tip" title="什么是自动积分?" type="success" description show-icon>
           <p>系统按照设定的时间(每月/每周/每日) 自动给员工添加的积分,比如某员工有一个工程师证,得到公司的认可,公司就会每月给他加分<span class="blue cursor" style="padding-left: 20px;" @click="$openUrl(2)">如何设置自动积分?</span></p>
           <p>每个周期开始自动加分,超过加分时间点将顺延到下一个周期加分,请提前设置加分项。如每月1号自动加分,10号才设置加分项,需等到次月1号才会自动加分</p>
+          <p>当前系统只允许提交如下内容:数字、中文、英文字母、下划线、空格以及以下特殊字符<code>:,.!@{}[]()<></code></p>
         </el-alert>
       </el-col>
     </el-row>
@@ -95,7 +96,7 @@
 
     <el-dialog :title="grouping_type == 'add' ? '新增加分组' : '编辑加分组'" :visible.sync="grouping_show" :close-on-click-modal="false" width="500px">
       <el-form :model="grouping" ref="grouping" :rules="grouping_rules" label-width="100px">
-        <el-form-item label="加分组名称" prop="name"><el-input v-model="grouping.name" maxlength="10" show-word-limit placeholder="请输入加分组名称"></el-input></el-form-item>
+        <el-form-item label="加分组名称" prop="name"><el-input v-model="grouping.name" maxlength="10" show-word-limit placeholder="请输入加分组名称" @input="onGroupNameInput"></el-input></el-form-item>
         <div style="overflow: hidden;">
           <el-button class="fl" :disabled="btn_disabled" type="danger" v-show="grouping_type == 'edit'" @click="del_grouping(grouping)">删除</el-button>
           <el-button class="fr" :disabled="btn_disabled" type="primary" @click="grouping_btn('grouping')">确定</el-button>
@@ -108,7 +109,7 @@
       <div style="text-align: center;margin-bottom: 10px;" class="orange" v-show="rules_detail_title == '编辑加分项'">如加分周期是“月”:系统将在每月1号的24点前,自动完成加分</div>
       <el-form :model="rules_detail_form" ref="rules_detail_form" :rules="rules_rules" label-width="120px">
         <el-form-item label="加分项名称" prop="remark">
-          <el-input v-model="rules_detail_form.remark" maxlength="50" show-word-limit placeholder="请输入加分项名称"></el-input>
+          <el-input v-model="rules_detail_form.remark" maxlength="50" show-word-limit placeholder="请输入加分项名称" @input="onDetailRemarkInput"></el-input>
         </el-form-item>
         <el-form-item label="分组" prop="rule_id">
           <el-select v-model="rules_detail_form.rule_id" style="width: 100%;" placeholder="请选择分组">
@@ -189,6 +190,7 @@
 
 <script>
 import EmployeeSelectorTwo from '@/components/EmployeeSelectorTwo';
+import {specialFilter} from "../../../utils";
 import { type } from 'os';
 let PerformTheNumber = true; //五秒执行一次变量
 export default {
@@ -684,6 +686,7 @@ export default {
             rule_list.forEach(item => {
               item.child = item_list['rule_' + item.id] || [];
             });
+            //打开第一个有细则记录的分类
             rule_list.some((item, index) => {
               if (item.child.length > 0) {
                 this.open_right(item.child[0]);
@@ -763,6 +766,7 @@ export default {
       this.rules_detail_form = JSON.parse(JSON.stringify(this.right_rules_detail));
       this.rules_detail_form.is_attendance=this.rules_detail_form.is_attendance.toString();
       this.rules_detail_form.sync = '2';
+      this.rules_detail_form.remark = specialFilter(this.rules_detail_form.remark)
     },
 
     // 新增规则
@@ -779,6 +783,12 @@ export default {
         pt_id: '3'
       };
       this.rules_detail_show = true;
+    },
+    onGroupNameInput(val){
+      this.grouping.name = specialFilter(val)
+    },
+    onDetailRemarkInput(val){
+      this.rules_detail_form.remark = specialFilter(val)
     }
   },
   mounted() {

+ 12 - 12
src/point/views/setting/pk.vue

@@ -3,19 +3,19 @@
     <!--规则提示-->
     <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>
+        <p><b>团队PK通过自定义PK配置、团队参与人员等。在相同积分规则内对团队进行积分对比</b></p>
+        <p><b>团队配置流程</b></p>
+        <li class="headLi">指定PK在哪些积分规则分类或者积分规则内有效,只针对B分</li>
         <li class="headLi">创建团队,指定参与者</li>
         <p><b>团队积分构成</b></p>
-        <li class="headLi">团队参与者在档案配置中积分规则内的积分总和</li>
+        <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>
+          <el-button type="primary" @click="addDoc" v-if="!manageAble">创建PK配置</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)">
@@ -29,8 +29,8 @@
           <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>
+          <el-button v-if="currentDoc" type="primary" size="small" @click="editDoc">PK配置</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" >
@@ -69,10 +69,10 @@
     </div>
 
 <!--  创建/编辑档案  -->
-    <el-dialog :title="isUpdateDoc ? '档案配置': '创建档案' " width="700px" top="10vh" :visible.sync="showDoc" :close-on-click-modal="false" >
+    <el-dialog :title="isUpdateDoc ? 'PK配置': '创建PK配置' " 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 label="PK名" prop="name" :required="true">
+          <el-input v-model="docForm.name" maxlength="10" auto-complete="off" show-word-limit placeholder="请输入PK名" ></el-input>
         </el-form-item>
         <el-form-item label="积分规则" :required="true" >
           <el-select v-model="docForm.ruleType" style="margin-bottom: 6px;width: 400px;" >
@@ -243,7 +243,7 @@ export default {
       },
       docFormValidateRules:{
         name: [
-          {required: true,message:'请输入档案名称'},
+          {required: true,message:'请输入PK名'},
           { min: 3, max: 10, message: '长度在 3 到 10 个字符'}
         ]
       },
@@ -382,7 +382,7 @@ export default {
       this.showDoc = true;
     },
     deleteDoc(){
-      this.$confirm('确认删除当前档案吗?','删除档案',{confirmButtonText:'确定',cancelButtonText:'取消',type:"warning"}).then(() => {
+      this.$confirm('确认删除当前配置吗?','删除PK配置',{confirmButtonText:'确定',cancelButtonText:'取消',type:"warning"}).then(() => {
           this.commitDeleteDoc();
       })
     },

+ 16 - 2
src/point/views/setting/rule_manage.vue

@@ -4,6 +4,8 @@
     <el-alert class="diy-tip"  type="success"  description show-icon>
       <strong style="font-size: 14px;">积分规则是什么?如何制定?<span class="blue cursor" @click="$openUrl(16)">查看视频</span> </strong>
       <p>添加规则时请先【添加规则分类】,再【添加规则】;或者直接【导入规则】</p>
+      <p>当前系统只允许提交如下内容:数字、中文、英文字母、空格以及以下特殊字符</p>
+      <p>+:、,.!@$#%*={}:,。!()【】《》;¥??’”</p>
     </el-alert>
 
     <!-- 中间内容 -->
@@ -80,7 +82,7 @@
     >
       <el-form :model="dept_formdata" ref="dept_formdata" :rules="dept_formdata_rules" label-width="80px">
         <el-form-item label="规则分类" prop="name">
-          <el-input v-model="dept_formdata.name" maxlength="20" show-word-limit style="width: 500px;" placeholder="分类名称"></el-input>
+          <el-input v-model="dept_formdata.name" maxlength="20" show-word-limit style="width: 500px;" placeholder="分类名称" @input="onRuleNameInput"></el-input>
         </el-form-item>
         <el-form-item label="上级分类">
           <el-cascader
@@ -127,7 +129,7 @@
     <el-dialog :title="rule_type == 'add' ? '添加规则' : '编辑规则'" :visible.sync="rule_show" @close="rule_close('rules_detail_form')" :close-on-click-modal="false" width="700px">
       <el-form :model="rules_detail_form" ref="rules_detail_form" :rules="rules" label-width="80px">
         <el-form-item label="规则内容" prop="remark">
-          <el-input v-model="rules_detail_form.remark" placeholder="请输入规则内容" maxlength="300" show-word-limit type="textarea" :rows="3"></el-input>
+          <el-input v-model="rules_detail_form.remark" placeholder="请输入规则内容" maxlength="300" show-word-limit type="textarea" :rows="3" @input="onRuleRemarkInput"></el-input>
         </el-form-item>
         <el-form-item label="所属分类" prop="rule_id">
           <div style="position: relative;">
@@ -249,6 +251,7 @@
 <script>
 import EmployeeSelector from '@/components/EmployeeSelector';
 import {_debounce} from '@/utils/auth';
+import {specialFilter} from "../../../utils";
 let PerformTheNumber = true; //五秒执行一次变量
 export default {
   name: 'rule_category',
@@ -443,6 +446,7 @@ export default {
     keyword:_debounce(function(val){
       this.get_department_list();
     }),
+
   },
   methods: {
     showDept() {
@@ -835,9 +839,11 @@ export default {
             if (this.dept_ids.length > 0) {
               this.dept_formdata.dep_ids = JSON.stringify(this.dept_ids);
             }
+            let ruleName = this.dept_formdata.name
             this.$axiosUser('put', '/api/pro/integral/rule', this.dept_formdata).then(res => {
               if (res.data.code == 1) {
                 this.$message.success('修改积分规则成功');
+                this.dept_name = ruleName
                 this.get_department_list(function() {});
               }
             });
@@ -971,6 +977,7 @@ export default {
       this.class_show = true;
       this.class_type = 'edit';
       this.dept_formdata = JSON.parse(JSON.stringify(this.class_item));
+      this.dept_formdata.name = specialFilter(this.dept_formdata.name)
       let dept_ids = [];
       if (this.dept_formdata.departments.length > 0) {
         this.dept_formdata.departments.forEach(element => {
@@ -1237,6 +1244,7 @@ export default {
     editDetails(val) {
       this.rule_type = 'edit';
       this.rules_detail_form = JSON.parse(JSON.stringify(val));
+      this.rules_detail_form.remark = specialFilter(this.rules_detail_form.remark)
       if (this.rules_detail_form.min_point == this.rules_detail_form.max_point) {
         this.rules_detail_form.range_type = '1';
       } else {
@@ -1271,6 +1279,12 @@ export default {
         }
       }
       return data;
+    },
+    onRuleRemarkInput(val){
+      this.rules_detail_form.remark = specialFilter(val)
+    },
+    onRuleNameInput(val){
+      this.dept_formdata.name = specialFilter(val)
     }
   },
   mounted() {

+ 24 - 10
src/point/views/setting/set_basics.vue

@@ -52,11 +52,12 @@
               <template slot="label">
                 <span>积分审批</span>
                 <el-tooltip placement="top">
-                  <div slot="content" style="width: 300px">勾选开启后,根据积分规则制度的奖扣分、审批积分,均不受权限分限制,可直接提交通过</div>
+                  <div slot="content" style="width: 300px">勾选开启后,根据积分规则制度的奖扣B分、审批积分,均不受权限分限制,可直接提交通过</div>
                   <span class="tips">?</span>
                 </el-tooltip>
               </template>
-              <el-checkbox v-model="basics_info.rule_limit_check">规则内打分免审(仅对B分有效)</el-checkbox>
+              <el-checkbox v-model="basics_info.rule_limit_check">规则内不验证权限分</el-checkbox>
+<!--              <el-checkbox v-model="basics_info.rule_limit_check">规则内打分免审(仅对B分有效)</el-checkbox>-->
             </el-form-item>
             <el-form-item prop="task_review">
               <template slot="label">
@@ -122,6 +123,16 @@
               </template>
               <el-checkbox v-model="basics_info.specified_rule_item" >提交积分时,必须选择积分规则</el-checkbox>
             </el-form-item>
+            <el-form-item prop="appeal">
+              <template slot="label">
+                <span>积分申诉</span>
+                <el-tooltip placement="top">
+                  <div slot="content">开启可对个人积分提起申诉审批,通过后自动撤销积分事件</div>
+                  <span class="tips">?</span>
+                </el-tooltip>
+              </template>
+              <el-checkbox v-model="basics_info.appeal">开启</el-checkbox>
+            </el-form-item>
           </template>
           <el-form-item>
             <el-button type="primary" :loading="save_loading" @click="save('basics_info')">保存</el-button>
@@ -133,8 +144,9 @@
 </template>
 <script>
   import EmployeeSelector from '@/components/EmployeeSelector';
+  import Template from "../../../examine/components/Template.vue";
 export default {
-  components:{EmployeeSelector},
+  components:{Template, EmployeeSelector},
   data() {
     return {
       loading: false,
@@ -176,13 +188,14 @@ export default {
     get_basics() {
       this.loading = true;
       this.$axiosUser('get', '/api/pro/integral/site/config').then(res => {
-          if (res.data.code == 1) {
+          if (res.data.code === 1) {
             var resData = res.data.data;
-            resData.rule_limit_check = resData.rule_limit_check == 1 ? false : true;
-            resData.task_review = resData.task_review == 1 ? true : false;
-            resData.look_dept_ranking =resData.look_dept_ranking == 1 ? true : false;
-            resData.change_reviewer =resData.change_reviewer == 1 ? true : false;
-            resData.specified_rule_item =resData.specified_rule_item == 1 ? true : false;
+            resData.rule_limit_check = new Number(resData.rule_limit_check).valueOf()  === 0;
+            resData.task_review = new Number(resData.task_review).valueOf() === 1;
+            resData.look_dept_ranking = new Number(resData.look_dept_ranking).valueOf() === 1;
+            resData.change_reviewer = new Number(resData.change_reviewer).valueOf() === 1;
+            resData.specified_rule_item = new Number(resData.specified_rule_item).valueOf() === 1;
+            resData.appeal = new Number(resData.appeal).valueOf() === 1;
             this.basics_info = resData;
             if(resData.not_in_rank){
               this.employee_selected.employee = resData.not_in_rank;
@@ -209,9 +222,10 @@ export default {
           this.basics_info.look_dept_ranking ? (data.look_dept_ranking = 1) : (data.look_dept_ranking = 0);
           this.basics_info.change_reviewer ? (data.change_reviewer = 1) : (data.change_reviewer = 0);
           this.basics_info.specified_rule_item ? (data.specified_rule_item = 1) : (data.specified_rule_item = 0);
+          this.basics_info.appeal ? (data.appeal = 1) : (data.appeal = 0);
           data.not_in_rank=JSON.stringify(this.employee_selected.employee);
           this.$axiosUser('post', '/api/pro/integral/site/config', data, 'v2').then(res => {
-              if (res.data.code == 1) {
+              if (res.data.code === 1) {
                 this.$message.success(res.data.msg);
               } else {
                 this.$message.error(res.data.msg);

+ 435 - 0
src/point/views/statistics/appeal.vue

@@ -0,0 +1,435 @@
+<template>
+  <div class="appeal_box boxMinHeight">
+    <el-row>
+      <el-button type="primary" :disabled="!appealEnable" @click="showAppealCreate = true">发起申诉</el-button>
+    </el-row>
+    <el-tabs v-model="currentTag">
+      <el-tab-pane
+        :name="tabs[2].name"
+        :disabled="loading"
+      >
+        <template slot="label">
+          <el-tooltip content="等待您处理的申诉" placement="top-start">
+            <span>{{tabs[2].label}}</span>
+          </el-tooltip>
+        </template>
+      </el-tab-pane>
+      <el-tab-pane
+        :name="tabs[1].name"
+        :disabled="loading"
+      >
+        <template slot="label">
+          <el-tooltip content="自己发起的申诉" placement="top">
+            <span>{{tabs[1].label}}</span>
+          </el-tooltip>
+        </template>
+      </el-tab-pane>
+      <el-tab-pane
+        :name="tabs[0].name"
+        :disabled="loading"
+      >
+        <template slot="label">
+          <el-tooltip content="参与审批的申诉" placement="top-end">
+            <span>{{tabs[0].label}}</span>
+          </el-tooltip>
+        </template>
+      </el-tab-pane>
+
+
+    </el-tabs>
+
+    <el-container>
+      <el-header>
+        <el-form :inline="true">
+          <el-form-item label="状态" v-if="currentTag === 'publishList'">
+            <el-select v-model="searchForm.status">
+              <el-option v-for="item in appealStatus" :key="item.id" :label="item.value" :value="item.id" />
+            </el-select>
+          </el-form-item>
+        </el-form>
+      </el-header>
+      <el-main>
+        <el-table
+          :data="list"
+          v-loading="loading"
+          :row-class-name="statusClassName"
+          @row-click="openAppealInfo"
+        >
+          <el-table-column label="申请人">
+            <template slot-scope="scope">
+              <userImage
+                style="float: left"
+                :id="scope.row.employee_id"
+                :user_name="scope.row.employee_name"
+                :img_url="scope.row.employee_img_url"
+                width="40px"
+                height="40px"
+              />
+              <span style="margin-left: 10px; line-height: 50px; display: inline-block">{{scope.row.employee_name}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="审批人">
+            <template slot-scope="scope">
+              <userImage
+                style="float: left"
+                :id="scope.row.last_reviewer_id"
+                :user_name="scope.row.reviewer_name"
+                :img_url="scope.row.reviewer_img_url"
+                width="40px"
+                height="40px"
+              />
+              <span style="margin-left: 10px; line-height: 50px; display: inline-block">{{scope.row.reviewer_name}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="积分事件数" prop="event_count"></el-table-column>
+          <el-table-column label="状态">
+            <template slot-scope="scope">
+              {{appealStatusMap[scope.row.status] || "--"}}
+            </template>
+          </el-table-column>
+          <el-table-column label="日期" prop="create_time"></el-table-column>
+          <template slot="empty">
+            <noData></noData>
+          </template>
+        </el-table>
+      </el-main>
+      <el-footer>
+        <center style="padding: 20px 0;">
+          <el-pagination
+            background
+            @size-change="handleSizeChange"
+            @current-change="handlePageChange"
+            :current-page="searchForm.page"
+            layout="total, sizes, prev, pager, next"
+            :page-size="searchForm.page_size"
+            :page-sizes="[10,20,50,100]"
+            :total="searchForm.total"
+            :hide-on-single-page="true"
+            :key="pageKey"
+          />
+        </center>
+      </el-footer>
+    </el-container>
+
+<!--  申诉详情  -->
+    <el-drawer
+      :with-header="false"
+      :visible.sync="showDetail"
+      size="500px"
+      direction="rtl"
+      :show-close="false"
+      :wrapper-closable="true"
+      @close="handleAppealClose"
+      @closed="handleAppealClosed"
+      @opened="handleAppealOpen"
+    >
+      <AppealPopup ref="appealInfo" :id="appealId" @update:appeal="init"/>
+    </el-drawer>
+
+    <AppealCreate
+      :visible.sync="showAppealCreate"
+      @createFinish="onAppealCreateFinish"
+    />
+
+  </div>
+</template>
+
+<script>
+import Template from "../../../examine/components/Template.vue";
+import AppealPopup from "../common/AppealPopup.vue";
+import AppealCreate from "../../../components/AppealCreate.vue";
+
+export default {
+  name:'appeal',
+  components: {AppealCreate, Template,AppealPopup},
+  data(){
+    return {
+      userInfo: this.$userInfo(),
+      tabs:[
+        {label:'参与列表',name:'joinList'},
+        {label:'申诉列表',name:'publishList'},
+        {label:'待处理列表',name: 'waitingList'}
+      ],
+      currentTag:'waitingList',
+      pageKey:0,
+      loading:false,
+      searchForm:{
+        status:3,
+        page:1,
+        page_size:10,
+        total:0
+      },
+      appealStatusMap:{
+        0:'全部',
+        1:'审批中',
+        2:'审批通过',
+        3:'驳回重做',
+        4:'撤回重填',
+        5:'拒绝'
+      },
+      appealStatus:[
+        {
+          id:0,
+          value:'全部'
+        },
+        {
+          id:1,
+          value:'审批中'
+        },
+        {
+          id:2,
+          value:'审批通过'
+        },
+        {
+          id:3,
+          value:'驳回重做'
+        },
+        {
+          id:4,
+          value:'撤回重填'
+        },
+        {
+          id:5,
+          value:'拒绝'
+        },
+      ],
+      appealEnable:false,
+      list:[],
+      showDetail:false,
+      pts:[],
+      pointStatusMap:{
+        1:'正常',
+        2:'已删除',
+        3:'已通过申诉并删除'
+      },
+      infoActiveNames:[],
+      processStatusMap:{
+        1:'待处理',
+        2:'审批通过',
+        3:'递交审批',
+        4:'拒绝',
+        5:'驳回重做',
+        6:'撤回上个节点重填',
+        7:'申诉撤回',
+      },
+      appealId:0,
+      showAppealCreate:false,
+    }
+  },
+  methods:{
+    statusClassName({row}){
+      switch (row.status){
+        case 2:
+          return "success"
+        case 3:
+        case 4:
+        case 5:
+          return "warning"
+        default:
+          return ""
+      }
+    },
+    getList(){
+      if (this.currentTag === 'publishList'){
+        this.getPublishList()
+      }else if (this.currentTag === 'joinList') {
+        this.getJoinList()
+      }else if (this.currentTag === 'waitingList'){
+        this.getListForWaiting()
+      }
+    },
+    getPublishList(){
+      let self = this
+      let params = {
+        status:self.searchForm.status,
+        page:self.searchForm.page,
+        page_size:self.searchForm.page_size
+      }
+      self.loading = true
+      self.list = []
+      self.searchForm.total = 0
+      self.$axiosUser('get','/api/pro/integral/appeal/list/publisher',params)
+        .then(res => {
+          if (res.data.code === 1){
+            self.list = res.data.data.list
+            self.searchForm.total = res.data.data.total
+          }
+        })
+        .finally(() => {
+          self.loading = false
+        })
+    },
+    getJoinList(){
+      let self = this
+      let params = {
+        page:self.searchForm.page,
+        page_size:self.searchForm.page_size
+      }
+      self.loading = true
+      self.list = []
+      self.searchForm.total = 0
+      self.$axiosUser('get','/api/pro/integral/appeal/list/reviewer',params)
+        .then((res) => {
+          if (res.data.code === 1){
+            self.list = res.data.data.list
+            self.searchForm.total = res.data.data.total
+          }
+        })
+        .finally(() => {
+          self.loading= false
+        })
+    },
+    getListForWaiting(){
+      let self = this
+      let params = {
+        last_reviewer_id:self.userInfo.id,
+        status:1,
+        page:self.searchForm.page,
+        page_size:self.searchForm.page_size
+      }
+      self.loading = true
+      self.list = []
+      self.searchForm.total = 0
+      self.$axiosUser('get','/api/pro/integral/appeal/list',params)
+        .then((res) => {
+          if (res.data.code === 1){
+            self.list = res.data.data.list
+            self.searchForm.total = res.data.data.total
+          }
+        })
+        .finally(() => {
+          self.loading= false
+        })
+    },
+    getConfig(){
+      let self = this
+      self.$axiosUser('get','/api/pro/integral/site/config')
+        .then(res => {
+          if (res.data.code === 1){
+            self.appealEnable = res.data.data.appeal === 1
+          }
+        })
+    },
+    handleSizeChange(val){
+      this.searchForm.page = 1
+      this.searchForm.page_size = val
+      this.getList()
+    },
+    handlePageChange(val){
+      this.searchForm.page = val
+      this.pageKey = val          //预防实际页数变动但是分页组件中没变的问题
+      this.getList()
+    },
+    openAppealInfo(appeal){
+      this.appealId = appeal.id
+      this.showDetail = true
+    },
+    handleAppealClose(){
+      this.$refs['appealInfo'].closeHandler()
+    },
+    handleAppealClosed(){
+      this.$refs['appealInfo'].closedHandler()
+    },
+    handleAppealOpen(){
+      this.$refs['appealInfo'].openedHandler()
+    },
+    init(){
+      //el-pagination组件换页有问题,每次有数据更新需要重置为第一页暂时处理下
+      this.searchForm.page = 1
+      this.searchForm.page_size = 10
+      this.getList()
+    },
+    onAppealCreateFinish(){
+      this.getList()
+    }
+  },
+  watch:{
+    currentTag(){
+      this.searchForm.page = 1
+      this.searchForm.page_size = 10
+      this.getList()
+    },
+    'searchForm.status'(v,o){
+      this.searchForm.page = 1
+      this.getList()
+    },
+    'searchForm.page'(v){
+      this.pageKey = v
+    }
+  },
+  mounted() {
+    this.pts = this.$getTyps()
+    this.getConfig()
+    this.getList()
+  },
+}
+</script>
+
+<style scoped lang="scss">
+.appeal_box {
+  background-color: white;
+  padding: 20px;
+}
+
+/deep/ .el-table tr:hover{
+  cursor:pointer
+}
+
+/deep/ .el-table .success{
+  background: #f0f9eb;
+}
+
+/deep/ .el-table .warning{
+  background: oldlace;
+}
+
+//.detail_popup {
+//  padding: 20px;
+//  overflow-y: auto;
+//  overflow-x: hidden !important;
+//  height: calc(100vh - 60px);
+//}
+//
+//.detail_row {
+//  padding-bottom: 10px;
+//  line-height: 50px;
+//}
+//
+//.appeal_content {
+//  font-size: 18px;
+//}
+//
+//.appeal_content p{
+//  margin-bottom: 10px;
+//  font-size: 12px;
+//  color: rgb(144, 147, 153);
+//}
+//
+//.process{
+//  position: relative;
+//  margin: 0 0 20px 0;
+//  padding-top: 12px;
+//  font-size: 16px;
+//  color: #303133;
+//  line-height: 22px;
+//}
+//
+//.process:before{
+//  position: absolute;
+//  top: 0;
+//  content: ' ';
+//  width: 100%;
+//  border-top: 1px #f8f8f8 solid;
+//}
+//
+//.appeal_footer{
+//  border-top: 1px solid #ebebeb;
+//  padding: 10px 20px;
+//  font-size: 14px;
+//}
+//
+//.appeal_action {
+//  text-align: center;
+//}
+
+</style>

+ 559 - 91
src/point/views/statistics/integral_event.vue

@@ -1,12 +1,17 @@
 <template>
-  <div>
-    <div class="integral_event_box boxMinHeight">
-      <div class="flex-box-ce flex-d-wrap">
-        <div class="sleItem">
-          <el-select v-model="newTaskFormType" style="width:110px;" filterable placeholder="请选择">
-            <el-option v-for="item in pullrow" :key="item.id" :label="item.value" :value="item.id"></el-option>
-          </el-select>
-          <span v-show="newTaskFormType == 1">
+  <el-container>
+    <el-header :height="headerMaxHeight">
+      <el-collapse v-model="activeCollapseName" >
+        <el-collapse-item title="积分搜索" name="search">
+          <template slot="title">
+            <el-tag style="margin-left: 20px">当前数据:{{total}}条,最多导出10000条。</el-tag>
+          </template>
+          <div class="flex-box-ce flex-d-wrap" style="margin-left: 20px">
+            <div class="sleItem">
+              <el-select v-model="newTaskFormType" style="width:110px;" filterable placeholder="请选择">
+                <el-option v-for="item in pullrow" :key="item.id" :label="item.value" :value="item.id"></el-option>
+              </el-select>
+              <span v-show="newTaskFormType == 1">
             <el-cascader
               class="date-picker-width"
               v-model="rule"
@@ -20,7 +25,7 @@
               placeholder="全部规则分类"
             ></el-cascader>
           </span>
-          <span v-show="newTaskFormType == 2">
+              <span v-show="newTaskFormType == 2">
             <el-cascader
               @change="ruleautomatic"
               class="date-picker-width"
@@ -34,82 +39,92 @@
               clearable
             ></el-cascader>
           </span>
-        </div>
-        <div class="sleItem">
-          <span class="label">积分类型</span>
-          <el-select class="date-picker-width" v-model="formData.pt_id" clearable placeholder="全部">
-            <el-option v-for="item in $getTyps()" :key="item.name" :label="item.name" :value="item.id"></el-option>
-          </el-select>
-        </div>
-        <div class="sleItem">
-          <span class="label">事件来源</span>
-          <el-select class="date-picker-width" v-model="formData.source_type" clearable placeholder="全部">
-            <el-option v-for="item in source_type" :key="item.name" :label="item.name" :value="item.id"></el-option>
-          </el-select>
-        </div>
-        <div class="sleItem">
-          <span class="label">部门</span>
-          <el-cascader class="date-picker-width" v-model="dept_name" :options="dept_tree" ref="dept" clearable filterable change-on-select placeholder="全公司"></el-cascader>
-        </div>
-        <div class="sleItem flex-box-ce">
-          <span class="label">时间</span>
-          <el-date-picker
-            v-model="time_slot"
-            type="daterange"
-            value-format="yyyy-MM-dd"
-            range-separator="至"
-            :clearable="process=='production'? false:true"
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
-            :picker-options="instantPickerOptions"
-          ></el-date-picker>
-        </div>
-        <div class="sleItem flex-box-ce">
-          <el-select v-model="select_employee_id" filterable clearable placeholder="请输入或选择人员" style="width: 250px;margin-right: 10px;">
-            <el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
-          </el-select>
-          <el-input v-model="formData.keyword" style="width: 250px;" placeholder="输入关键字查找" maxlength="100" @keyup.enter.native="keyWordSelect" class="persons_name">
-            <el-button slot="append" icon="el-icon-search" @click="keyWordSelect"></el-button>
-          </el-input>
-          <span class="label" style="margin-left: 10px">奖扣分值</span>
-          <el-select v-model="formData.add_subtract" style="width:110px;" filterable placeholder="全部">
-            <el-option v-for="item in add_subtract_items" :key="item.id" :label="item.value" :value="item.id"></el-option>
-          </el-select>
-        </div>
-      </div>
-      <div class="flex-box-ce" style="margin-bottom: 20px;">
-        <div class="flex-1">
-          <el-button type="primary" v-if="!$supremeAuthority('employee')" @click="excelImportShow = true">导入数据</el-button>
-          <el-button type="primary" @click="exportExcel">导出当前数据</el-button>
-          <el-button class="first-element-btn" v-if="noticeRole" :disabled="selectionID.length == 0" @click="deleteInBatches" type="danger">批量删除</el-button>
-        </div>
-      </div>
-      <div class="diy-tip1" style="margin-bottom: 10px;">
-        <div>
-          当前数据:{{total}}条,最多导出10000条。
-        </div>
-      </div>
-      <el-table :data="list" style="width: 100%" v-loading="loading" @row-click="open_detail" @selection-change="deleteEvents">
-        <el-table-column v-if="noticeRole" :selectable="isSelectable" type="selection" width="55"></el-table-column>
-        <el-table-column prop="employee_name" label="姓名" align="left" width="180px">
+            </div>
+            <div class="sleItem">
+              <span class="label">积分类型</span>
+              <el-select class="date-picker-width" v-model="formData.pt_id" clearable placeholder="全部">
+                <el-option v-for="item in $getTyps()" :key="item.name" :label="item.name" :value="item.id"></el-option>
+              </el-select>
+            </div>
+            <div class="sleItem">
+              <span class="label">事件来源</span>
+              <el-select class="date-picker-width" v-model="formData.source_type" clearable placeholder="全部">
+                <el-option v-for="item in source_type" :key="item.name" :label="item.name" :value="item.id"></el-option>
+              </el-select>
+            </div>
+            <div class="sleItem">
+              <span class="label">部门</span>
+              <el-cascader class="date-picker-width" v-model="dept_name" :options="dept_tree" ref="dept" clearable filterable change-on-select placeholder="全公司"></el-cascader>
+            </div>
+            <div class="sleItem flex-box-ce">
+              <span class="label">时间</span>
+              <el-date-picker
+                v-model="time_slot"
+                type="daterange"
+                value-format="yyyy-MM-dd"
+                range-separator="至"
+                :clearable="process=='production'? false:true"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                :picker-options="instantPickerOptions"
+              ></el-date-picker>
+            </div>
+            <div class="sleItem flex-box-ce">
+              <el-select v-model="select_employee_id" filterable clearable placeholder="受益人员" style="width: 250px;margin-right: 10px;">
+                <el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
+              </el-select>
+              <el-select v-model="select_recorder_id" filterable clearable placeholder="录入人" style="width: 250px;margin-right: 10px;">
+                <el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>
+              </el-select>
+              <el-input v-model="formData.keyword" style="width: 250px;" placeholder="输入关键字查找" maxlength="100" @keyup.enter.native="keyWordSelect" class="persons_name">
+                <el-button slot="append" icon="el-icon-search" @click="keyWordSelect"></el-button>
+              </el-input>
+              <span class="label" style="margin-left: 10px">奖扣分值</span>
+              <el-select v-model="formData.add_subtract" style="width:110px;" filterable placeholder="全部">
+                <el-option v-for="item in add_subtract_items" :key="item.id" :label="item.value" :value="item.id"></el-option>
+              </el-select>
+            </div>
+          </div>
+          <div class="flex-box-ce" style="margin-bottom: 10px;margin-left: 20px">
+            <div class="flex-1">
+              <el-button type="primary" v-if="!$supremeAuthority('employee')" @click="excelImportShow = true">导入数据</el-button>
+              <el-button type="primary" @click="exportExcel">导出当前数据</el-button>
+              <el-button class="first-element-btn" v-if="noticeRole" :disabled="selectionID.length == 0" @click="deleteInBatches" type="danger">批量删除</el-button>
+              <el-button type="warning" :disabled="!appealEnable || appealSelectionEvents.length === 0" @click="showAppealCreate = true" >发起申诉</el-button>
+            </div>
+          </div>
+        </el-collapse-item>
+      </el-collapse>
+    </el-header>
+    <el-main>
+      <el-table
+        :data="list"
+        style="width: 100%"
+        v-loading="loading"
+        @row-click="open_detail"
+        @selection-change="deleteEvents"
+      >
+<!--        <el-table-column v-if="noticeRole" :selectable="isSelectable" type="selection" width="55" fixed></el-table-column>-->
+        <el-table-column :selectable="isSelectable" type="selection" width="55" fixed></el-table-column>
+        <el-table-column prop="employee_name" label="姓名" align="left" width="180px" fixed>
           <template slot-scope="scope">
             <userImage class="fl" :id="scope.row.employee_id" :user_name="scope.row.employee_name" :img_url="scope.row.employee_img_url" width="50px" height="50px"></userImage>
             <span style="margin-left: 10px; line-height: 50px;">{{ scope.row.employee_name }}</span>
           </template>
         </el-table-column>
-        <el-table-column prop="dept" label="部门" align="left" width="200px"></el-table-column>
-        <el-table-column prop="point_mark" label="积分" align="left" width="120px">
+        <el-table-column prop="point_mark" label="积分" align="left" width="120px" fixed>
           <template slot-scope="scope">
             <span :class="scope.row.point < 0 ? 'color_green' : 'color_red'">{{ scope.row.point_mark }} {{ $getTypsName(scope.row.pt_id) }}</span>
           </template>
         </el-table-column>
+        <el-table-column prop="dept" label="部门" align="left" width="200px"></el-table-column>
         <el-table-column prop="remark" show-overflow-tooltip label="事件内容" align="left" min-width="280px"></el-table-column>
         <el-table-column prop="rule_name" show-overflow-tooltip label="规则分类" align="left" min-width="140px"></el-table-column>
         <el-table-column prop="item_remark" show-overflow-tooltip label="规则细则" align="left" min-width="140px"></el-table-column>
         <el-table-column prop="create_time" label="事件发生时间" align="left" min-width="140px">
-        	<template slot-scope="scope">
-        		{{ scope.row.event_time }}
-        	</template>
+          <template slot-scope="scope">
+            {{ scope.row.event_time }}
+          </template>
         </el-table-column>
         <el-table-column prop="source_type" label="来源" align="left" width="140px">
           <template slot-scope="scope">
@@ -133,6 +148,8 @@
           <noData></noData>
         </template>
       </el-table>
+    </el-main>
+    <el-footer height="60">
       <center class="pagination">
         <el-pagination
           background
@@ -145,10 +162,9 @@
           :total="total"
         ></el-pagination>
       </center>
-    </div>
-
+    </el-footer>
     <el-drawer title="事件详情" :visible.sync="detail_popup" ref="drawer" :with-header="false" :width="'500px'" direction="rtl">
-      <div class="drawer_title">事件详情</div>
+      <div class="drawer_title">事件详情 <el-tag v-if="detail_info && detail_info.has_appeal">已申诉</el-tag> </div>
       <div class="detail_popup" v-loading="detail_loading" v-if="detail_info !== null">
         <el-row style="padding-bottom:10px;border-bottom:1px #f8f8f8 solid;">
           <el-col :span="24">
@@ -214,11 +230,11 @@
           </el-row>
         </div>
         <div v-show="detail_info.process"><Steps :process="detail_info.process"></Steps></div>
-<!--        <div v-if="!detail_info.is" class="red" style="text-align: center;">
-          考勤积分暂不支持立即删除,请在
-          <span class="blue">{{ detail_info.btnDate }}</span>
-          后再操作删除此事件
-        </div> -->
+        <!--        <div v-if="!detail_info.is" class="red" style="text-align: center;">
+                  考勤积分暂不支持立即删除,请在
+                  <span class="blue">{{ detail_info.btnDate }}</span>
+                  后再操作删除此事件
+                </div> -->
       </div>
       <div class="drawer-footer flex-box-end flex-v-ce" v-show="noticeRole">
         <el-button @click="close_integral_event">取消</el-button>
@@ -308,14 +324,382 @@
       </span>
     </el-dialog>
 
-  </div>
+    <!--  发起申诉  -->
+    <AppealCreate
+      :visible.sync="showAppealCreate"
+      :events="appealSelectionEvents"
+      @createFinish="onAppealCreateFinish"
+    />
+
+    <!--  申诉详情  -->
+    <el-drawer
+      :with-header="false"
+      :visible.sync="showAppealDetail"
+      size="500px"
+      direction="rtl"
+      :show-close="false"
+      :wrapper-closable="true"
+      @close="handleAppealClose"
+      @closed="handleAppealClosed"
+      @opened="handleAppealOpen"
+    >
+      <AppealPopup ref="appealInfo" :id="appeal.id" @update:appeal="onAppealUpdate"/>
+    </el-drawer>
+  </el-container>
+
+<!--  <div>-->
+<!--    <div class="integral_event_box boxMinHeight">-->
+<!--      <el-collapse v-model="activeCollapseName" >-->
+<!--        <el-collapse-item title="积分搜索" name="search">-->
+<!--          <template slot="title">-->
+<!--            <el-tag>当前数据:{{total}}条,最多导出10000条。</el-tag>-->
+<!--          </template>-->
+<!--          <div class="flex-box-ce flex-d-wrap">-->
+<!--            <div class="sleItem">-->
+<!--              <el-select v-model="newTaskFormType" style="width:110px;" filterable placeholder="请选择">-->
+<!--                <el-option v-for="item in pullrow" :key="item.id" :label="item.value" :value="item.id"></el-option>-->
+<!--              </el-select>-->
+<!--              <span v-show="newTaskFormType == 1">-->
+<!--            <el-cascader-->
+<!--              class="date-picker-width"-->
+<!--              v-model="rule"-->
+<!--              :options="rule_trees"-->
+<!--              :props="props"-->
+<!--              @change="rule_null"-->
+<!--              ref="rule"-->
+<!--              clearable-->
+<!--              filterable-->
+<!--              change-on-select-->
+<!--              placeholder="全部规则分类"-->
+<!--            ></el-cascader>-->
+<!--          </span>-->
+<!--              <span v-show="newTaskFormType == 2">-->
+<!--            <el-cascader-->
+<!--              @change="ruleautomatic"-->
+<!--              class="date-picker-width"-->
+<!--              v-model="automaticIntegration"-->
+<!--              :options="rule_list"-->
+<!--              :props="props"-->
+<!--              ref="rule1"-->
+<!--              filterable-->
+<!--              change-on-select-->
+<!--              placeholder="全部自动积分"-->
+<!--              clearable-->
+<!--            ></el-cascader>-->
+<!--          </span>-->
+<!--            </div>-->
+<!--            <div class="sleItem">-->
+<!--              <span class="label">积分类型</span>-->
+<!--              <el-select class="date-picker-width" v-model="formData.pt_id" clearable placeholder="全部">-->
+<!--                <el-option v-for="item in $getTyps()" :key="item.name" :label="item.name" :value="item.id"></el-option>-->
+<!--              </el-select>-->
+<!--            </div>-->
+<!--            <div class="sleItem">-->
+<!--              <span class="label">事件来源</span>-->
+<!--              <el-select class="date-picker-width" v-model="formData.source_type" clearable placeholder="全部">-->
+<!--                <el-option v-for="item in source_type" :key="item.name" :label="item.name" :value="item.id"></el-option>-->
+<!--              </el-select>-->
+<!--            </div>-->
+<!--            <div class="sleItem">-->
+<!--              <span class="label">部门</span>-->
+<!--              <el-cascader class="date-picker-width" v-model="dept_name" :options="dept_tree" ref="dept" clearable filterable change-on-select placeholder="全公司"></el-cascader>-->
+<!--            </div>-->
+<!--            <div class="sleItem flex-box-ce">-->
+<!--              <span class="label">时间</span>-->
+<!--              <el-date-picker-->
+<!--                v-model="time_slot"-->
+<!--                type="daterange"-->
+<!--                value-format="yyyy-MM-dd"-->
+<!--                range-separator="至"-->
+<!--                :clearable="process=='production'? false:true"-->
+<!--                start-placeholder="开始日期"-->
+<!--                end-placeholder="结束日期"-->
+<!--                :picker-options="instantPickerOptions"-->
+<!--              ></el-date-picker>-->
+<!--            </div>-->
+<!--            <div class="sleItem flex-box-ce">-->
+<!--              <el-select v-model="select_employee_id" filterable clearable placeholder="请输入或选择人员" style="width: 250px;margin-right: 10px;">-->
+<!--                <el-option v-for="item in employee_map" :key="item.id" :label="item.name" :value="item.id"></el-option>-->
+<!--              </el-select>-->
+<!--              <el-input v-model="formData.keyword" style="width: 250px;" placeholder="输入关键字查找" maxlength="100" @keyup.enter.native="keyWordSelect" class="persons_name">-->
+<!--                <el-button slot="append" icon="el-icon-search" @click="keyWordSelect"></el-button>-->
+<!--              </el-input>-->
+<!--              <span class="label" style="margin-left: 10px">奖扣分值</span>-->
+<!--              <el-select v-model="formData.add_subtract" style="width:110px;" filterable placeholder="全部">-->
+<!--                <el-option v-for="item in add_subtract_items" :key="item.id" :label="item.value" :value="item.id"></el-option>-->
+<!--              </el-select>-->
+<!--            </div>-->
+<!--          </div>-->
+<!--          <div class="flex-box-ce" style="margin-bottom: 20px;">-->
+<!--            <div class="flex-1">-->
+<!--              <el-button type="primary" v-if="!$supremeAuthority('employee')" @click="excelImportShow = true">导入数据</el-button>-->
+<!--              <el-button type="primary" @click="exportExcel">导出当前数据</el-button>-->
+<!--              <el-button class="first-element-btn" v-if="noticeRole" :disabled="selectionID.length == 0" @click="deleteInBatches" type="danger">批量删除</el-button>-->
+<!--              <el-button type="warning" :disabled="!appealEnable || appealSelectionEvents.length === 0" @click="showAppealCreate = true" >发起申诉</el-button>-->
+<!--            </div>-->
+<!--          </div>-->
+<!--        </el-collapse-item>-->
+<!--      </el-collapse>-->
+<!--      <el-table-->
+<!--        :data="list"-->
+<!--        style="width: 100%"-->
+<!--        v-loading="loading"-->
+<!--        @row-click="open_detail"-->
+<!--        @selection-change="deleteEvents"-->
+<!--        :height="tableMaxHeight"-->
+<!--      >-->
+<!--        <el-table-column v-if="noticeRole" :selectable="isSelectable" type="selection" width="55"></el-table-column>-->
+<!--        <el-table-column prop="employee_name" label="姓名" align="left" width="180px">-->
+<!--          <template slot-scope="scope">-->
+<!--            <userImage class="fl" :id="scope.row.employee_id" :user_name="scope.row.employee_name" :img_url="scope.row.employee_img_url" width="50px" height="50px"></userImage>-->
+<!--            <span style="margin-left: 10px; line-height: 50px;">{{ scope.row.employee_name }}</span>-->
+<!--          </template>-->
+<!--        </el-table-column>-->
+<!--        <el-table-column prop="dept" label="部门" align="left" width="200px"></el-table-column>-->
+<!--        <el-table-column prop="point_mark" label="积分" align="left" width="120px">-->
+<!--          <template slot-scope="scope">-->
+<!--            <span :class="scope.row.point < 0 ? 'color_green' : 'color_red'">{{ scope.row.point_mark }} {{ $getTypsName(scope.row.pt_id) }}</span>-->
+<!--          </template>-->
+<!--        </el-table-column>-->
+<!--        <el-table-column prop="remark" show-overflow-tooltip label="事件内容" align="left" min-width="280px"></el-table-column>-->
+<!--        <el-table-column prop="rule_name" show-overflow-tooltip label="规则分类" align="left" min-width="140px"></el-table-column>-->
+<!--        <el-table-column prop="item_remark" show-overflow-tooltip label="规则细则" align="left" min-width="140px"></el-table-column>-->
+<!--        <el-table-column prop="create_time" label="事件发生时间" align="left" min-width="140px">-->
+<!--        	<template slot-scope="scope">-->
+<!--        		{{ scope.row.event_time }}-->
+<!--        	</template>-->
+<!--        </el-table-column>-->
+<!--        <el-table-column prop="source_type" label="来源" align="left" width="140px">-->
+<!--          <template slot-scope="scope">-->
+<!--            <span v-show="scope.row.source_type == 1">积分奖扣 <span v-if="scope.row.recorder_name">({{scope.row.recorder_name}})</span></span>-->
+<!--            <span v-show="scope.row.source_type == 2">任务</span>-->
+<!--            <span v-show="scope.row.source_type == 3">积分系统分配</span>-->
+<!--            <span v-show="scope.row.source_type == 4">考勤系统分配</span>-->
+<!--            <span v-show="scope.row.source_type == 5">积分申请 <span v-if="scope.row.applyor_name">({{scope.row.applyor_name}})</span></span>-->
+<!--            <span v-show="scope.row.source_type == 6">绩效任务包</span>-->
+<!--            <span v-show="scope.row.source_type == 8">积分导入</span>-->
+<!--            <span v-show="scope.row.source_type == 9">A分转B分</span>-->
+<!--            <span v-show="scope.row.source_type > 9">其他</span>-->
+<!--          </template>-->
+<!--        </el-table-column>-->
+<!--        <el-table-column prop="create_time" label="录入时间" align="left" width="120px">-->
+<!--          <template slot-scope="scope">-->
+<!--            {{ cuttString(scope.row.create_time) }}-->
+<!--          </template>-->
+<!--        </el-table-column>-->
+<!--        <template slot="empty">-->
+<!--          <noData></noData>-->
+<!--        </template>-->
+<!--      </el-table>-->
+<!--      <center class="pagination">-->
+<!--        <el-pagination-->
+<!--          background-->
+<!--          @size-change="handleSizeChange"-->
+<!--          @current-change="handleCurrentChange"-->
+<!--          :current-page="formData.page"-->
+<!--          :page-sizes="[10, 20, 50, 100]"-->
+<!--          layout="total, sizes, prev, pager, next"-->
+<!--          :page-size="pageLimit"-->
+<!--          :total="total"-->
+<!--        ></el-pagination>-->
+<!--      </center>-->
+<!--    </div>-->
+
+<!--    <el-drawer title="事件详情" :visible.sync="detail_popup" ref="drawer" :with-header="false" :width="'500px'" direction="rtl">-->
+<!--      <div class="drawer_title">事件详情</div>-->
+<!--      <div class="detail_popup" v-loading="detail_loading" v-if="detail_info !== null">-->
+<!--        <el-row style="padding-bottom:10px;border-bottom:1px #f8f8f8 solid;">-->
+<!--          <el-col :span="24">-->
+<!--            <userImage :user_name="detail_info.employee_name" :img_url="detail_info.img_url" class="fl" width="50px" height="50px" fontSize="15"></userImage>-->
+<!--            <span style="line-height:50px; margin-left:10px;margin-right:4px;">{{ detail_info.employee_name }}</span>-->
+<!--            <span class="color_red point" v-show="detail_info.point >= 0">+{{ detail_info.point }} {{ $getTypsName(detail_info.pt_id) }}</span>-->
+<!--            <span class="color_green point" v-show="detail_info.point < 0">{{ detail_info.point }} {{ $getTypsName(detail_info.pt_id) }}</span>-->
+<!--          </el-col>-->
+<!--        </el-row>-->
+
+<!--        <el-row>-->
+<!--          <el-col :span="4">事件内容</el-col>-->
+<!--          <el-col :span="20" v-if="detail_info.remark">{{ detail_info.remark && (detail_info.remark.customize || detail_info.remark.rule) }}</el-col>-->
+<!--        </el-row>-->
+
+<!--        <el-row>-->
+<!--          <el-col :span="4">规则分类</el-col>-->
+<!--          <el-col :span="20">{{ detail_info.rule_list }}</el-col>-->
+<!--        </el-row>-->
+
+<!--        <el-row v-show="detail_info.rule_list">-->
+<!--          <el-col :span="4">发生时间</el-col>-->
+<!--          <el-col :span="20">{{ detail_info.date }}</el-col>-->
+<!--        </el-row>-->
+
+<!--        <el-row v-show="detail_info.source_type">-->
+<!--          <el-col :span="4">来源类型</el-col>-->
+<!--          <el-col :span="20">{{ returnStr(detail_info.source_type) }}</el-col>-->
+<!--        </el-row>-->
+
+<!--        <el-row v-show="detail_info.recorder_name">-->
+<!--          <el-col :span="4">记录人</el-col>-->
+<!--          <el-col :span="20">{{ detail_info.recorder_name }}</el-col>-->
+<!--        </el-row>-->
+
+<!--        <el-row v-show="detail_info.files !== null && detail_info.files.length > 0">-->
+<!--          <el-col :span="4">图片</el-col>-->
+<!--          <el-col :span="20">-->
+<!--            <el-image-->
+<!--              v-for="(item, index) in detail_info.files"-->
+<!--              :key="index"-->
+<!--              style="width: 100px; height: 100px;margin:1px"-->
+<!--              :src="item"-->
+<!--              :preview-src-list="detail_info.files"-->
+<!--            ></el-image>-->
+<!--          </el-col>-->
+<!--        </el-row>-->
+
+<!--        <div v-show="detail_info.rule_item_id">-->
+<!--          <p class="row_title">规则依据</p>-->
+<!--          <el-row>-->
+<!--            <el-col :span="4">规则分类</el-col>-->
+<!--            <el-col :span="19">{{ detail_info.rule_list }}</el-col>-->
+<!--          </el-row>-->
+<!--          <el-row v-show="detail_info.rule_item_id">-->
+<!--            <el-col :span="4">积分规则</el-col>-->
+<!--            <el-col :span="19">{{ detail_info.rule_item.remark }}</el-col>-->
+<!--          </el-row>-->
+<!--          <el-row v-show="detail_info.rule_item_id">-->
+<!--            <el-col :span="4">规则积分</el-col>-->
+<!--            <el-col :span="19" v-show="detail_info.rule_item.min_point == detail_info.rule_item.max_point">{{ detail_info.rule_item.min_point }} {{ $getTypsName(detail_info.pt_id) }}</el-col>-->
+<!--            <el-col :span="19" v-show="detail_info.rule_item.min_point != detail_info.rule_item.max_point">{{ detail_info.rule_item.min_point }} ~ {{ detail_info.rule_item.max_point }} {{ $getTypsName(detail_info.pt_id) }}</el-col>-->
+<!--          </el-row>-->
+<!--        </div>-->
+<!--        <div v-show="detail_info.process"><Steps :process="detail_info.process"></Steps></div>-->
+<!--&lt;!&ndash;        <div v-if="!detail_info.is" class="red" style="text-align: center;">-->
+<!--          考勤积分暂不支持立即删除,请在-->
+<!--          <span class="blue">{{ detail_info.btnDate }}</span>-->
+<!--          后再操作删除此事件-->
+<!--        </div> &ndash;&gt;-->
+<!--      </div>-->
+<!--      <div class="drawer-footer flex-box-end flex-v-ce" v-show="noticeRole">-->
+<!--        <el-button @click="close_integral_event">取消</el-button>-->
+<!--        <el-button type="danger" @click="del_integral_event(detail_info)">删除</el-button>-->
+<!--      </div>-->
+<!--    </el-drawer>-->
+
+<!--    &lt;!&ndash; 导入数据 &ndash;&gt;-->
+<!--    <el-dialog title="导入积分事件数据" width="600px" :visible.sync="excelImportShow" :close-on-click-modal="false" :before-close="close_import">-->
+<!--      <div style="padding:0 50px;">-->
+<!--        <div class="align-center" style="margin-bottom:20px;">-->
+<!--          <p>-->
+<!--            1、下载积分事件模版,批量录入积分事件-->
+<!--            <el-button type="primary" @click="downloadTemplate" plain>下载模板</el-button>-->
+<!--          </p>-->
+<!--          <el-upload-->
+<!--            :limit="1"-->
+<!--            :headers="ATOKEN"-->
+<!--            ref="upload1"-->
+<!--            :action="integralUpload"-->
+<!--            :data="{ type: 'integral' }"-->
+<!--            :on-success="handlePictureCardPreview"-->
+<!--            :before-upload="beforeFilesUpload"-->
+<!--          >-->
+<!--            <p>-->
+<!--              2、上传积分事件数据Excel表-->
+<!--              <el-button type="primary" plain>选择文件</el-button>-->
+<!--            </p>-->
+<!--          </el-upload>-->
+<!--          <p>3、选择文件后点击下方【上传】按钮</p>-->
+<!--        </div>-->
+
+<!--        <div class="align-center" style="margin-bottom:20px; float:left; margin-left:10px;"></div>-->
+<!--        <div class="align-center" style="margin-bottom:20px; float:left; margin-left:10px;">&lt;!&ndash; <el-button type="primary" @click="downloadSheet">Excel导出</el-button> &ndash;&gt;</div>-->
+<!--        <div style="clear:both;"></div>-->
+<!--      </div>-->
+<!--      <div slot="footer" class="dialog-footer">-->
+<!--        <el-button @click="close_import">取 消</el-button>-->
+<!--        <el-button type="primary" @click="uploadFile(1)" :loading="update_btn" plain>上传</el-button>-->
+<!--      </div>-->
+<!--    </el-dialog>-->
+
+<!--    <el-dialog :close-on-click-modal="false" title="导入结果" :visible.sync="importErrorInfoShow" width="30%">-->
+<!--      <div>-->
+<!--        <el-table :data="error_list" border stripe>-->
+<!--          <el-table-column prop="name" label="备注信息">-->
+<!--            <template slot-scope="scope">-->
+<!--              {{ scope.row }}-->
+<!--            </template>-->
+<!--          </el-table-column>-->
+<!--        </el-table>-->
+<!--      </div>-->
+<!--      <span slot="footer"><el-button type="primary" @click="importErrorInfoShow = false">确 定</el-button></span>-->
+<!--    </el-dialog>-->
+
+<!--    <el-dialog title="轮播排名" :visible.sync="swiperShow" width="500px">-->
+<!--      <div>-->
+<!--        <el-form :inline="true">-->
+<!--          <div style="color:rgb(122 202 126);font-size: 13px;padding:5px 0 20px 0">设置后,相关排名信息可在各类智能终端屏幕上的网页浏览器滚屏展示</div>-->
+<!--          <el-form-item label="展示标题">-->
+<!--            <el-input-->
+<!--              type="textarea"-->
+<!--              :autosize="{ minRows: 2, maxRows: 6 }"-->
+<!--              v-model="titleVals"-->
+<!--              placeholder="请输入标题"-->
+<!--              maxlength="20"-->
+<!--              show-word-limit-->
+<!--              style="width: 341px"-->
+<!--            ></el-input>-->
+<!--          </el-form-item>-->
+<!--        </el-form>-->
+<!--        <el-row>-->
+<!--          <el-col :span="4" style="line-height: 36px;">&nbsp;&nbsp;&nbsp;显示最新</el-col>-->
+<!--          <el-col :span="6">-->
+<!--            <el-select v-model="page_size" placeholder="请选择">-->
+<!--              <el-option v-for="item in swiperPageList" :key="item.value" :label="item.value" :value="item.value"></el-option>-->
+<!--            </el-select>-->
+<!--          </el-col>-->
+<!--          <el-col :span="6" style="line-height: 36px;">条积分事件来轮播</el-col>-->
+<!--        </el-row>-->
+<!--      </div>-->
+<!--      <span slot="footer">-->
+<!--        <el-button @click="swiperShow = false">取 消</el-button>-->
+<!--        <router-link :to="{ path: '/deptRankSwiper?' + '&page=1&page_size=' + this.page_size + '&types=1&companyName='+titleVals }" target="_blank">-->
+<!--          <el-button type="primary">开始轮播</el-button>-->
+<!--        </router-link>-->
+<!--      </span>-->
+<!--    </el-dialog>-->
+
+<!--&lt;!&ndash;  发起申诉  &ndash;&gt;-->
+<!--    <AppealCreate-->
+<!--      :visible.sync="showAppealCreate"-->
+<!--      :events="appealSelectionEvents"-->
+<!--      @createFinish="onAppealCreateFinish"-->
+<!--    />-->
+
+<!--    &lt;!&ndash;  申诉详情  &ndash;&gt;-->
+<!--    <el-drawer-->
+<!--      :with-header="false"-->
+<!--      :visible.sync="showAppealDetail"-->
+<!--      size="500px"-->
+<!--      direction="rtl"-->
+<!--      :show-close="false"-->
+<!--      :wrapper-closable="true"-->
+<!--      @close="handleAppealClose"-->
+<!--      @closed="handleAppealClosed"-->
+<!--      @opened="handleAppealOpen"-->
+<!--    >-->
+<!--      <AppealPopup ref="appealInfo" :id="appeal.id" @update:appeal="onAppealUpdate"/>-->
+<!--    </el-drawer>-->
+<!--  </div>-->
 </template>
 <script>
 import moment from 'moment';
 import Steps from '@/components/Steps.vue';
+import AppealCreate from "../../../components/AppealCreate.vue";
+import AppealPopup from "../common/AppealPopup.vue";
+import Template from "../../../examine/components/Template.vue";
 export default {
   data() {
     return {
+      userInfo: this.$userInfo(),
+      pts:this.$getTyps(),
       instantPickerOptions: {
         shortcuts: [
           {
@@ -376,6 +760,7 @@ export default {
       rule_list: [], //自动积分分类列表
       noticeRole:!this.$supremeAuthority('dept_manager') && !this.$supremeAuthority('employee'),
       select_employee_id: '',
+      select_recorder_id: '',
       employee_map: this.$getEmployeeMap(),
       integralUpload:this.$serverdomain + '/api/pro/upload/excel',
       titleVals: '',
@@ -411,10 +796,9 @@ export default {
       update_btn: false,
       error_list: [],
       importErrorInfoShow: false,
-
       deriveNum: 0,
-
       selectionID: [] ,//删除的事件ID
+      appealSelectionEvents:[], //批量发起申诉的事件ID
       source_type: [
       	{id: 0,name: '全部'},
       	{id: 1,name: '积分奖扣'},
@@ -439,10 +823,16 @@ export default {
           value: '扣分',
           id: 2
         },
-      ]
+      ],
+      showAppealCreate:false,
+      appeal:{id:0},
+      showAppealDetail:false,
+      appealEnable:false,
+      activeCollapseName:['search'],
+      // tableMaxHeight:680
     };
   },
-  components: {Steps},
+  components: {Template, AppealPopup, AppealCreate, Steps},
   created() {
       this.process=process.env.NODE_ENV
       this.deriveRestrict()
@@ -454,6 +844,7 @@ export default {
     this.get_rule_trees();
     this.get_integral_list(this.formData);
     this.voluntarilyRule_trees(); //自动积分列表
+    this.getConfig()
   },
   watch: {
     newTaskFormType(val) {
@@ -499,6 +890,11 @@ export default {
       this.formData.employee_ids = val;
       this.get_integral_list(this.formData);
     },
+    select_recorder_id(val) {
+      this.formData.page = 1
+      this.formData.recorder_id= val
+      this.get_integral_list(this.formData)
+    }
   },
   methods: {
     returnStr(id){
@@ -517,7 +913,13 @@ export default {
     	})
     },
     isSelectable(row, index) {
-      return row.is;
+      if (this.noticeRole) {
+        /*指点管理员*/
+        return row.is;
+      }else {
+        /*非指定管理员*/
+        return row.employee_id === this.userInfo.id
+      }
     },
     ruleautomatic() {
       let list = this.automaticIntegration;
@@ -536,10 +938,21 @@ export default {
     //删除事件
     deleteEvents(selection) {
       let listId = [];
+      let appealEvents = [];
       selection.forEach(item => {
         listId.push(item.id);
+        if (item.employee_id === this.userInfo.id) {
+          let pt = this.pts.find(p => p.id === item.pt_id)
+          pt = pt ? pt.name : ''
+          appealEvents.push({
+            id:item.id,
+            remark:`${item.point} ${pt} ${item.event_time} ${item.remark}`,
+            appeal_remark: ''
+          })
+        }
       });
       this.selectionID = listId;
+      this.appealSelectionEvents = appealEvents
     },
     //批量删除
     deleteInBatches() {
@@ -645,6 +1058,7 @@ export default {
           (this.formData.rule_id ? '&rule_ids=' + this.formData.rule_id : '') +
           (this.formData.pt_id ? '&pt_id=' + this.formData.pt_id : '') +
           (this.formData.employee_ids ? '&employee_ids=' + this.formData.employee_ids : '') +
+          (this.formData.recorder_id ? '&recorder_id=' + this.formData.recorder_id : '') +
           (this.formData.dept_id ? '&dept_ids=' + this.formData.dept_id : '') +
           (this.formData.start_day ? '&start_day=' + this.formData.start_day : '') +
           (this.formData.end_day ? '&end_day=' + this.formData.end_day : '') +
@@ -803,6 +1217,51 @@ export default {
     },
     close_integral_event() {
       this.detail_popup = false;
+    },
+    onAppealCreateFinish(appeal){
+      this.appeal = {id:0}
+      this.$confirm('申诉已发起,积分申诉模块可以查看详细记录','发起申诉',{
+        confirmButtonText:'直接查看',
+        cancelButtonText:'知道了',
+        type:'success'
+      })
+        .then(() => {
+          this.appeal = appeal
+          this.showAppealDetail = true
+        })
+
+      this.get_integral_list(this.formData)
+    },
+    onAppealUpdate(){
+      this.get_integral_list(this.formData)
+    },
+    handleAppealClose(){
+      this.$refs['appealInfo'].closeHandler()
+    },
+    handleAppealClosed(){
+      this.$refs['appealInfo'].closedHandler()
+    },
+    handleAppealOpen(){
+      this.$refs['appealInfo'].openedHandler()
+    },
+    getConfig(){
+      let self = this
+      self.$axiosUser('get','/api/pro/integral/site/config')
+        .then(res => {
+          if (res.data.code === 1){
+            self.appealEnable = res.data.data.appeal === 1
+          }
+        })
+    },
+  },
+  computed:{
+    tableMaxHeight(){
+      // return this.activeCollapseName.includes('search') ? 530 : 710
+      return this.activeCollapseName.includes('search') ? '30%' : '80%'
+    },
+    headerMaxHeight(){
+      // return this.activeCollapseName.includes('search') ? '300' : '50'
+      return this.activeCollapseName.includes('search') ? '27%' : '5%'
     }
   }
 };
@@ -915,9 +1374,18 @@ span.point {
 /deep/ .el-dialog__body {
   padding: 0px 20px 30px;
 }
-</style>
-<style lang="scss">
-  .el-tooltip__popper{
-    max-width: 800px;
-  }
+.el-tooltip__popper{
+  max-width: 800px;
+}
+
+.el-header{
+  padding: 0;
+}
+.el-main{
+  padding: 0;
+}
+.el-footer{
+  padding: 0;
+  background-color: white;
+}
 </style>

+ 176 - 38
src/point/views/workbench/approval_list.vue

@@ -2,10 +2,16 @@
   <div>
     <div class="box boxMinHeight" style="position: relative;">
         <span class="blue cursor" style="position: absolute;top: 30px;right: 20px;z-index: 2000;" @click="$openUrl(10)"><i class="el-icon-question" style="padding-right: 5px;font-size: 16px;position: relative;top: 1px;"></i>审批流程说明</span>
-      <el-tabs v-model="formData.type"><el-tab-pane v-for="(item, index) in tabsOption" :key="index" :label="item.label" :name="item.name"></el-tab-pane></el-tabs>
+      <el-tabs v-model="formData.type">
+        <el-tab-pane v-for="(item,index) in tabsOption" :key="index" :name="item.name">
+          <template slot="label">
+            <el-tooltip placement="top" :content="item.desc"><span>{{item.label}}</span></el-tooltip>
+          </template>
+        </el-tab-pane>
+      </el-tabs>
       <el-form ref="formData" :inline="true" :model="formData" label-width="80px">
-        <el-form-item label="工作类型">
-          <el-select v-model="formData.source_type" placeholder="请选择排序">
+        <el-form-item label="审批来源">
+          <el-select v-model="formData.source_type" placeholder="请选择来源">
             <el-option v-for="item in sourceList" :key="item.id" :label="item.name" :value="item.id"></el-option>
           </el-select>
         </el-form-item>
@@ -19,31 +25,75 @@
         </el-select>
       </el-form>
 
-      <div v-if="formData.type == 'waiting'">
-        <el-table :data="list" style="width: 100%; cursor: pointer;" v-loading="loading" class="listTable" @row-click="openDetail">
-          <el-table-column label="审批标题" prop="task_name">
+      <div v-if="formData.type === 'waiting'">
+        <el-table
+          :data="list"
+          style="width: 100%;"
+          v-loading="loading"
+          class="listTable"
+          max-height="600"
+        >
+          <el-table-column label="人员信息" prop="employee_name" fixed width="200">
+            <template slot-scope="scope">
+              <el-popover
+                title="人员信息"
+                placement="top"
+                trigger="click"
+                popper-class="popperSPBOX"
+              >
+                <el-descriptions
+                  :column="1"
+                  size="mini"
+                  :label-style="{width: '100px'}"
+                  :content-style="{width: '100px'}"
+                  border
+                >
+                  <el-descriptions-item label="发起人">{{scope.row.applyor_name}}</el-descriptions-item>
+                  <el-descriptions-item label="受益人">{{scope.row.employee_name}}</el-descriptions-item>
+                  <el-descriptions-item label="流程审批人">{{scope.row.last_reviewer_name}}</el-descriptions-item>
+                </el-descriptions>
+                <div style="cursor: pointer;" slot="reference">
+                  <userImage class="fl" width="50px" height="50px" :id="scope.row.employee_id" :user_name="scope.row.employee_name" :img_url="scope.row.employee_img_url"></userImage>
+                  <span class="tableTitle">{{scope.row.employee_name}}</span>
+                </div>
+              </el-popover>
+            </template>
+          </el-table-column>
+          <el-table-column label="来源" prop="source_type" width="100" fixed>
             <template slot-scope="scope">
-              <userImage class="fl" width="50px" height="50px" :id="scope.row.employee_id" :user_name="scope.row.employee_name"></userImage>
-              <span class="tableTitle" v-show="scope.row.source_type == 1">{{ scope.row.employee_name }}的积分任务</span>
-              <span class="tableTitle" v-show="scope.row.source_type == 2">{{ scope.row.employee_name }}的积分申请</span>
-              <span class="tableTitle" v-show="scope.row.source_type == 3">{{ scope.row.employee_name }}的积分奖扣</span>
-              <span class="tableTitle" v-show="scope.row.source_type == 4">{{ scope.row.employee_name }}的绩效工作</span>
+              <el-tag :type="sourceTypeTag(scope.row.source_type)">{{sourceMap[scope.row.source_type] || '--'}}</el-tag>
             </template>
           </el-table-column>
-          <el-table-column label="审批内容" prop="remark.rule">
+          <el-table-column label="审批内容" prop="remark.rule" width="500">
             <template slot-scope="scope">
-              <el-popover trigger="hover" placement="top" popper-class="popperSPBOX">
+              <el-popover trigger="click" placement="top" popper-class="popperSPBOX">
                 <span>{{ scope.row.remark.customize || scope.row.remark.rule }}</span>
-                <div slot="reference" class="name-wrapper" style="width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">
+                <div slot="reference" class="name-wrapper" style="width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor: pointer;">
                   <span>{{ scope.row.remark.customize || scope.row.remark.rule }}</span>
                 </div>
               </el-popover>
             </template>
           </el-table-column>
-          <el-table-column label="时间" prop="event_time" width="150"></el-table-column>
-          <el-table-column label="操作" prop="owner_id" width="80">
+          <el-table-column label="时间" prop="event_time" width="150">
+            <template slot-scope="scope">
+              <i class="el-icon-time"></i>
+              <span style="margin-left: 10px">{{ scope.row.event_time }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="申请分" prop="point" width="150">
+            <template slot-scope="scope">
+              <template v-if="scope.row.point !== 0">
+                <span v-show="scope.row.point < 0" class="green">{{ scope.row.point }} {{ $getTypsName(scope.row.pt_id) }}</span>
+                <span v-show="scope.row.point >= 0" class="red">+{{ scope.row.point }} {{ $getTypsName(scope.row.pt_id) }}</span>
+              </template>
+              <template v-else>
+                <span>--</span>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" prop="owner_id" fixed="right">
             <template slot-scope="scope">
-              <el-button type="text">审批</el-button>
+              <el-button type="text" @click="openDetail(scope.row)">审批</el-button>
             </template>
           </el-table-column>
           <template slot="empty">
@@ -53,37 +103,93 @@
       </div>
 
       <div v-if="formData.type == 'reviewed'">
-        <el-table :data="list" style="width: 100%; cursor: pointer;" v-loading="loading" class="listTable" @row-click="openDetail">
-          <el-table-column label="审批标题" prop="task_name">
+        <el-table
+          :data="list"
+          style="width: 100%;"
+          v-loading="loading"
+          class="listTable"
+          max-height="600"
+        >
+          <el-table-column label="人员信息" prop="employee_name" fixed width="200">
+            <template slot-scope="scope">
+              <el-popover
+                title="人员信息"
+                placement="top"
+                trigger="click"
+              >
+                <el-descriptions
+                  :column="1"
+                  popper-class="popperSPBOX"
+                  size="mini"
+                  :label-style="{width: '100px'}"
+                  :content-style="{width: '100px'}"
+                  style="width: 200px"
+                  border
+                >
+                  <el-descriptions-item label="发起人">{{scope.row.applyor_name}}</el-descriptions-item>
+                  <el-descriptions-item label="受益人">{{scope.row.employee_name}}</el-descriptions-item>
+                  <el-descriptions-item label="流程审批人">{{scope.row.last_reviewer_name}}</el-descriptions-item>
+                </el-descriptions>
+                <div style="cursor: pointer;" slot="reference">
+                  <userImage class="fl" width="50px" height="50px" :id="scope.row.employee_id" :user_name="scope.row.employee_name"></userImage>
+                  <span class="tableTitle">{{scope.row.employee_name}}</span>
+                </div>
+              </el-popover>
+            </template>
+          </el-table-column>
+          <el-table-column label="来源" prop="source_type" width="100">
             <template slot-scope="scope">
-              <userImage class="fl" width="50px" height="50px" :id="scope.row.employee_id" :user_name="scope.row.employee_name"></userImage>
-              <span class="tableTitle" v-show="scope.row.source_type == 1">{{ scope.row.employee_name }}的积分任务</span>
-              <span class="tableTitle" v-show="scope.row.source_type == 2">{{ scope.row.employee_name }}的积分申请</span>
-              <span class="tableTitle" v-show="scope.row.source_type == 3">{{ scope.row.employee_name }}的积分奖扣</span>
-              <span class="tableTitle" v-show="scope.row.source_type == 4">{{ scope.row.employee_name }}的绩效工作</span>
+              <el-tag :type="sourceTypeTag(scope.row.source_type)">{{sourceMap[scope.row.source_type] || '--'}}</el-tag>
             </template>
           </el-table-column>
-          <el-table-column label="审批内容" prop="remark.rule">
+          <el-table-column label="审批内容" prop="remark.rule" width="300">
             <template slot-scope="scope">
-              <el-popover trigger="hover" placement="top" popper-class="popperSPBOX">
+              <el-popover trigger="click" placement="top" popper-class="popperSPBOX">
                 <span>{{ scope.row.remark.customize || scope.row.remark.rule }}</span>
-                <div slot="reference" class="name-wrapper" style="width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">
+                <div slot="reference" class="name-wrapper" style="width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor: pointer;">
                   <span>{{ scope.row.remark.customize || scope.row.remark.rule }}</span>
                 </div>
               </el-popover>
             </template>
           </el-table-column>
-          <el-table-column label="时间" prop="event_time" width="150"></el-table-column>
-          <el-table-column label="积分" prop="review_point" width="120">
+          <el-table-column label="时间" prop="event_time" width="150">
+            <template slot-scope="scope">
+              <i class="el-icon-time"></i>
+              <span style="margin-left: 10px">{{ scope.row.event_time }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="申请分" prop="point" width="150">
+            <template slot-scope="scope">
+              <template v-if="scope.row.point !== 0">
+                <span v-show="scope.row.point < 0" class="green">{{ scope.row.point }} {{ $getTypsName(scope.row.pt_id) }}</span>
+                <span v-show="scope.row.point >= 0" class="red">+{{ scope.row.point }} {{ $getTypsName(scope.row.pt_id) }}</span>
+              </template>
+              <template v-else>
+                <span>--</span>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column label="最终分" prop="review_point" width="150">
+            <template slot-scope="scope">
+              <template v-if="scope.row.review_point !== 0">
+                <span v-show="scope.row.review_point < 0" class="green">{{ scope.row.review_point }} {{ $getTypsName(scope.row.pt_id) }}</span>
+                <span v-show="scope.row.review_point >= 0" class="red">+{{ scope.row.review_point }} {{ $getTypsName(scope.row.pt_id) }}</span>
+              </template>
+              <template v-else>
+                <span>--</span>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column label="流程状态" prop="status" >
             <template slot-scope="scope">
-              <span v-show="scope.row.review_point < 0" class="green">{{ scope.row.review_point }} {{ $getTypsName(scope.row.pt_id) }}</span>
-              <span v-show="scope.row.review_point >= 0" class="red">+{{ scope.row.review_point }} {{ $getTypsName(scope.row.pt_id) }}</span>
+<!--              <span v-show="scope.row.status == 1" class="color_green">审批通过</span>-->
+<!--              <span v-show="scope.row.status == 2" class="color_red">审批驳回</span>-->
+              <el-tag :type="statusType(scope.row.review_status)">{{statusMap[scope.row.review_status] || '--'}}</el-tag>
             </template>
           </el-table-column>
-          <el-table-column label="状态" prop="status" width="80">
+          <el-table-column label="操作" prop="owner_id" fixed="right">
             <template slot-scope="scope">
-              <span v-show="scope.row.status == 1" class="color_green">审批通过</span>
-              <span v-show="scope.row.status == 2" class="color_red">审批驳回</span>
+              <el-button type="text" @click="openDetail(scope.row)">审批详情</el-button>
             </template>
           </el-table-column>
           <template slot="empty">
@@ -111,6 +217,7 @@
 
 <script>
 import examinePopup from '@/point/views/common/examinePopup';
+import Template from "../../../examine/components/Template.vue";
 
 export default {
   data() {
@@ -124,16 +231,28 @@ export default {
         page: 1
       },
       total: null,
-      list: null,
+      list: [],
       loading: false,
       point_types: null,
       employee_map: this.$getEmployeeMap(),
-      tabsOption: [{ label: '待我审批', name: 'waiting' }, { label: '我已审批', name: 'reviewed' }],
+      tabsOption: [{ label: '待审批', name: 'waiting' ,desc:"等待您处理的申请记录,请及时处理"}, { label: '参与审批', name: 'reviewed' ,desc:"参与过审批的记录,可用于跟进审批结果"}],
       detailShow: false,
       detail_id: null,
       sourceList: [{ name: '全部', id: '0' }, { name: '积分任务', id: '1' }, { name: '积分申请', id: '2' }, { name: '积分奖扣', id: '3' }
       // { name: '绩效工作', id: '4' },
-      ]
+      ],
+      statusMap:{
+        0:'待审核',
+        1:'审核通过',
+        2:'拒绝',
+        3:'驳回重做',
+        4:'重填',
+      },
+      sourceMap:{
+        1:'任务',
+        2:'申请',
+        3:'积分奖扣',
+      }
     };
   },
   watch: {
@@ -157,12 +276,31 @@ export default {
       this.get_list();
     }
   },
-  components: { examinePopup },
+  components: {Template, examinePopup },
   mounted() {
     this.get_list();
     this.point_types = this.getPointTypes();
   },
   methods: {
+    sourceTypeTag(sourceType){
+      const map = {
+        1:'info',
+        2:'success',
+        3:'warning',
+      }
+      return map[sourceType] || 'info'
+    },
+    statusType(status){
+      if (status === -1) return 'info'
+      const map = {
+        0:'warning',
+        1:'success',
+        2:'danger',
+        3:'danger',
+        4:'info',
+      }
+      return map[status] || 'info'
+    },
     openDetail(item) {
       this.detail_id = item.id;
       this.detailShow = true;

+ 1 - 2
src/point/views/workbench/grade/apply_list.vue

@@ -146,7 +146,6 @@
 </template>
 
 <script>
-import moment from "moment";
 import Steps from '@/components/Steps.vue';
 import applicationIntegrationPopup from "@/point/views/common/applicationIntegrationPopup";
 import {_debounce} from '@/utils/auth';
@@ -178,7 +177,7 @@ export default {
   },
   components: {
     applicationIntegrationPopup,
-    Steps
+    Steps,
   },
   watch: {
     'formData.keyword':_debounce(function(val){

+ 2 - 2
src/point/views/workbench/grade/award_punish.vue

@@ -2,8 +2,8 @@
   <div>
     <el-alert class="diy-tip" title="管理者均能操作奖扣积分,普通员工只能申请积分" type="success" description show-icon>
       <p>
-        奖扣成功后,员工将收到积分提醒;权限不足时,奖扣分需要递交上级审批。</br>
-        奖扣时,可选择已制定好的积分规则(公司已有的制度)或者自定义内容(公司制度以外的事项)</br>
+        奖扣成功后,员工将收到积分提醒;权限不足时,奖扣分需要递交上级审批。<br/>
+        奖扣时,可选择已制定好的积分规则(公司已有的制度)或者自定义内容(公司制度以外的事项)<br/>
         也可以选择奖A分或B分,如需详细了解A、B分,查看右侧帮助【A分、B分常见问题】
       </p>
     </el-alert>

+ 1 - 1
src/point/views/workbench/task/allTask.vue

@@ -40,7 +40,7 @@
             </template>
           </el-table-column>
           <el-table-column label="截止时间" prop="expire_time" sortable="custom"></el-table-column>
-          <el-table-column label="操作" prop="owner_id">
+          <el-table-column label="操作" prop="owner_id" fixed="right" >
             <template slot-scope="scope">
               <el-link type="primary" :underline="false" @click.stop="openDetail(scope.row)" class="blue">查看任务</el-link>
               <el-link

+ 209 - 68
src/point/views/workbench/task/get_task.vue

@@ -7,6 +7,12 @@
       </el-tabs>
       <div v-if="active === 'unclaimed'">
         <el-table :data="list" style="width: 100%" v-loading="loading" @row-click="openDetail">
+          <el-table-column label="发布者" prop="owner_name">
+            <template slot-scope="scope">
+              <userImage class="fl" :id="scope.row.owner_id" :user_name="scope.row.owner_name" :img_url="scope.row.owner_img_url" width="50px" height="50px"></userImage>
+              <span style="line-height: 50px; padding-left: 10px;">{{ scope.row.owner_name }}</span>
+            </template>
+          </el-table-column>
           <el-table-column label="任务内容" prop="task_name" show-overflow-tooltip></el-table-column>
           <el-table-column label="积分" prop="base_point" width="120">
             <template slot-scope="scope">
@@ -17,7 +23,7 @@
           <el-table-column label="截止时间" prop="expire_time" width="200"></el-table-column>
           <el-table-column label="操作" prop="owner_id" v-if="!$supremeAuthority('creator')" width="120">
             <template slot-scope="scope">
-              <el-link v-if="scope.row.owner_id!=$userInfo().id" type="primary">领取任务</el-link>
+              <el-link v-if="scope.row.owner_id!=$userInfo().id && scope.row.reviewer_id != $userInfo().id" type="primary">领取任务</el-link>
             </template>
           </el-table-column>
           <template slot="empty">
@@ -62,79 +68,205 @@
       </center>
 
       <el-drawer :custom-class="'drawer_details'" :visible.sync="detailShow" :with-header="false" size="500px">
-        <div class="details_title">任务详情</div>
+        <div class="details_title">悬赏信息</div>
         <div class="details_content" v-loading="detail_loading">
-          <div style="border-bottom:1px #f8f8f8 solid;padding-bottom: 10px;margin-bottom: 10px;" class="flex-box-ce">
-              <userImage
-                :user_name="active == 'unclaimed' ? detailInfo.owner_name : detailInfo.receiver_name"
-                :id="active == 'unclaimed' ? detailInfo.owner_id : detailInfo.receiver_id"
-                :img_url="active == 'unclaimed' ? detailInfo.owner_img_url : detailInfo.receiver_img_url"
-                class="fl"
-                width="50px"
-                height="50px"
-                fontSize="15"
-              ></userImage>
-              <div class="flex-1" style="padding-left: 10px;">
-                <div class="flex-box-ce" style="margin-bottom: 4px;">
-                  <div class="flex-1" style="font-size: 16px;font-weight: 700;">
-                    {{ active == 'unclaimed' ? detailInfo.owner_name : detailInfo.receiver_name }}{{active == 'unclaimed' ? `悬赏的${$getTypsName(detailInfo.pt_id)}任务`:`领取的${$getTypsName(detailInfo.pt_id)}任务`}}
-                  </div>
-                  <div>
-                    <span class="color_red point" v-show="detailInfo.point_config.base_point >= 0">+{{ detailInfo.point_config.base_point }}</span>
-                    <span class="color_green point" v-show="detailInfo.point_config.base_point < 0">{{ detailInfo.point_config.base_point }}</span>
-                  </div>
-                </div>
-                <div class="orange">{{detailInfo.status_mark}}</div>
-              </div>
-          </div>
+<!--          <div style="border-bottom:1px #f8f8f8 solid;padding-bottom: 10px;margin-bottom: 10px;" class="flex-box-ce">-->
+<!--              <userImage-->
+<!--                :user_name="active == 'unclaimed' ? detailInfo.owner_name : detailInfo.receiver_name"-->
+<!--                :id="active == 'unclaimed' ? detailInfo.owner_id : detailInfo.receiver_id"-->
+<!--                :img_url="active == 'unclaimed' ? detailInfo.owner_img_url : detailInfo.receiver_img_url"-->
+<!--                class="fl"-->
+<!--                width="50px"-->
+<!--                height="50px"-->
+<!--                fontSize="15"-->
+<!--              ></userImage>-->
+<!--              <div class="flex-1" style="padding-left: 10px;">-->
+<!--                <div class="flex-box-ce" style="margin-bottom: 4px;">-->
+<!--                  <div class="flex-1" style="font-size: 16px;font-weight: 700;">-->
+<!--                    {{ active == 'unclaimed' ? detailInfo.owner_name : detailInfo.receiver_name }}{{active == 'unclaimed' ? `悬赏的${$getTypsName(detailInfo.pt_id)}任务`:`领取的${$getTypsName(detailInfo.pt_id)}任务`}}-->
+<!--                  </div>-->
+<!--                  <div>-->
+<!--                    <span class="color_red point" v-show="detailInfo.point_config.base_point >= 0">+{{ detailInfo.point_config.base_point }}</span>-->
+<!--                    <span class="color_green point" v-show="detailInfo.point_config.base_point < 0">{{ detailInfo.point_config.base_point }}</span>-->
+<!--                  </div>-->
+<!--                </div>-->
+<!--                <div class="orange">{{detailInfo.status_mark}}</div>-->
+<!--              </div>-->
+<!--          </div>-->
 
-          <el-row v-if="detailInfo.task_name !== ''">
-            <el-col :span="4">任务内容</el-col>
-            <el-col :span="20">{{ detailInfo.task_name }}</el-col>
-          </el-row>
+<!--          <el-row v-if="detailInfo.task_name !== ''">-->
+<!--            <el-col :span="4">任务内容</el-col>-->
+<!--            <el-col :span="20">{{ detailInfo.task_name }}</el-col>-->
+<!--          </el-row>-->
 
-          <el-row v-if="detailInfo.task_remark !== ''">
-            <el-col :span="4">任务备注</el-col>
-            <el-col :span="20">{{ detailInfo.task_remark }}</el-col>
-          </el-row>
+<!--          <el-row v-if="detailInfo.task_remark !== ''">-->
+<!--            <el-col :span="4">任务备注</el-col>-->
+<!--            <el-col :span="20">{{ detailInfo.task_remark }}</el-col>-->
+<!--          </el-row>-->
 
-          <el-row v-if="detailInfo.type_mark !== ''">
-            <el-col :span="4">任务类型</el-col>
-            <el-col :span="20">{{ detailInfo.type_mark }}</el-col>
-          </el-row>
+<!--          <el-row v-if="detailInfo.type_mark !== ''">-->
+<!--            <el-col :span="4">任务类型</el-col>-->
+<!--            <el-col :span="20">{{ detailInfo.type_mark }}</el-col>-->
+<!--          </el-row>-->
 
-          <el-row v-if="$getTypsName(detailInfo.pt_id) !== ''">
-            <el-col :span="4">积分类型</el-col>
-            <el-col :span="20">{{ $getTypsName(detailInfo.pt_id) }}</el-col>
-          </el-row>
-          <el-row v-if="detailInfo.create_time !== ''">
-            <el-col :span="4">发布时间</el-col>
-            <el-col :span="20">{{ detailInfo.create_time }}</el-col>
-          </el-row>
-          <el-row v-if="detailInfo.expire_time !== ''">
-            <el-col :span="4">截止时间</el-col>
-            <el-col :span="20">{{ detailInfo.expire_time }}</el-col>
-          </el-row>
-          <el-row v-if="detailInfo.reviewer_name">
-            <el-col :span="4">审批人</el-col>
-            <el-col :span="20">{{ detailInfo.reviewer_name }}</el-col>
-          </el-row>
-          <el-row v-if="detailInfo.owner_name">
-            <el-col :span="4">发布人</el-col>
-            <el-col :span="20">{{ detailInfo.owner_name }}</el-col>
-          </el-row>
-          <el-row v-if="detailInfo.task_file_list !== null && detailInfo.task_file_list.length !== 0">
-            <el-col :span="4">图片附件</el-col>
-            <el-col :span="20">
-              <el-image
-              v-for="(item,index) in detailInfo.task_file_list"
-              :key="index"
-              style="width: 100px; height: 100px; margin-right:10px"
-              :src="item"
-              :preview-src-list="detailInfo.task_file_list"></el-image>
-              </el-col>
-          </el-row>
+<!--          <el-row v-if="$getTypsName(detailInfo.pt_id) !== ''">-->
+<!--            <el-col :span="4">积分类型</el-col>-->
+<!--            <el-col :span="20">{{ $getTypsName(detailInfo.pt_id) }}</el-col>-->
+<!--          </el-row>-->
+<!--          <el-row v-if="detailInfo.create_time !== ''">-->
+<!--            <el-col :span="4">发布时间</el-col>-->
+<!--            <el-col :span="20">{{ detailInfo.create_time }}</el-col>-->
+<!--          </el-row>-->
+<!--          <el-row v-if="detailInfo.expire_time !== ''">-->
+<!--            <el-col :span="4">截止时间</el-col>-->
+<!--            <el-col :span="20">{{ detailInfo.expire_time }}</el-col>-->
+<!--          </el-row>-->
+<!--          <el-row v-if="detailInfo.reviewer_name">-->
+<!--            <el-col :span="4">审批人</el-col>-->
+<!--            <el-col :span="20">{{ detailInfo.reviewer_name }}</el-col>-->
+<!--          </el-row>-->
+<!--          <el-row v-if="detailInfo.owner_name">-->
+<!--            <el-col :span="4">发布人</el-col>-->
+<!--            <el-col :span="20">{{ detailInfo.owner_name }}</el-col>-->
+<!--          </el-row>-->
+<!--          <el-row v-if="detailInfo.task_file_list !== null && detailInfo.task_file_list.length !== 0">-->
+<!--            <el-col :span="4">图片附件</el-col>-->
+<!--            <el-col :span="20">-->
+<!--              <el-image-->
+<!--              v-for="(item,index) in detailInfo.task_file_list"-->
+<!--              :key="index"-->
+<!--              style="width: 100px; height: 100px; margin-right:10px"-->
+<!--              :src="item"-->
+<!--              :preview-src-list="detailInfo.task_file_list"></el-image>-->
+<!--              </el-col>-->
+<!--          </el-row>-->
+
+          <el-card shadow="always">
+            <template slot="header">
+              <div class="flex-box-ce">
+                <userImage
+                  :user_name="active == 'unclaimed' ? detailInfo.owner_name : detailInfo.receiver_name"
+                  :id="active == 'unclaimed' ? detailInfo.owner_id : detailInfo.receiver_id"
+                  :img_url="active == 'unclaimed' ? detailInfo.owner_img_url : detailInfo.receiver_img_url"
+                  class="fl"
+                  width="50px"
+                  height="50px"
+                  fontSize="15"
+                />
+                <div>
+                  {{detailInfo.owner_name}}
+                  {{ $getTypsName(detailInfo.pt_id) }}任务
+                  <el-tag>{{ detailInfo.point_config.base_point }}分</el-tag>
+                  <el-tag type="info">{{ detailInfo.receiver_name }}{{ detailInfo.status_mark }}</el-tag>
+                </div>
+              </div>
+            </template>
+            <el-descriptions
+              title="任务信息"
+              direction="vertical"
+              :column="2"
+              size="small"
+              :label-style="{width:'80px',textAlign:'center'}"
+              :content-style="{width:'80px',textAlign: 'center'}"
+              border
+            >
+              <el-descriptions-item label="任务内容">{{detailInfo.task_name}}</el-descriptions-item>
+              <el-descriptions-item
+                v-if="detailInfo.receiver_id !== 0"
+                :label="detailInfo.status == 3 ? '完成人' : '领取人'"
+              >{{detailInfo.receiver_name}}
+              </el-descriptions-item>
+              <el-descriptions-item
+                v-if="detailInfo.task_remark"
+                label="任务备注"
+              >{{detailInfo.task_remark}}
+              </el-descriptions-item>
+              <el-descriptions-item
+                v-if="detailInfo.point_config"
+                label="任务积分"
+              >
+                {{ detailInfo.point_config.base_point }}{{ $getTypsName(detailInfo.pt_id) }}
+              </el-descriptions-item>
+              <el-descriptions-item label="发布时间">{{detailInfo.create_time}}</el-descriptions-item>
+              <el-descriptions-item label="截止时间">{{detailInfo.end_time}}</el-descriptions-item>
+              <el-descriptions-item
+                v-if="detailInfo.point_config && detailInfo.point_config.timeout_deduction_point"
+                label="逾期扣分"
+              >
+                {{ detailInfo.point_config.timeout_deduction_point }}/天
+              </el-descriptions-item>
+              <el-descriptions-item
+                v-if="detailInfo.point_config && detailInfo.point_config.ahead_award_point"
+                label="提前奖分"
+              >
+                {{ detailInfo.point_config.ahead_award_point }}/天
+              </el-descriptions-item>
+              <el-descriptions-item
+                v-if="detailInfo.department_info"
+                label="可见范围"
+              >
+                <div class="content_text" v-if="detailInfo.department_info.length > 0">
+                <span
+                  v-for="(item, index) in detailInfo.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="detailInfo.reviewer_name"
+                label="审批人"
+              >
+                {{detailInfo.reviewer_name}}
+              </el-descriptions-item>
+              <el-descriptions-item label="任务类型">{{ detailInfo.source_type_mark }}</el-descriptions-item>
+            </el-descriptions>
+
+            <el-descriptions
+              v-if="detailInfo.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="规则">{{detailInfo.item_info.remark}}</el-descriptions-item>
+              <el-descriptions-item label="积分">{{pointRemark}}</el-descriptions-item>
+              <el-descriptions-item label="规则状态" v-if="detailInfo.item_info.has_delete">
+                <el-tag type="warning">规则已删除</el-tag>
+              </el-descriptions-item>
+              <el-descriptions-item v-if="detailInfo.rule_info" label="分类">{{detailInfo.rule_info.name}}</el-descriptions-item>
+              <el-descriptions-item v-if="detailInfo.rule_info && detailInfo.rule_info.has_delete" label="分类状态">
+                <el-tag type="warning">分类已删除</el-tag>
+              </el-descriptions-item>
+            </el-descriptions>
+
+            <el-descriptions
+              v-else-if="detailInfo.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="分类">{{detailInfo.rule_info.name}}</el-descriptions-item>
+              <el-descriptions-item label="分类状态" v-if="detailInfo.rule_info.has_delete">
+                <el-tag type="warning">分类已删除</el-tag>
+              </el-descriptions-item>
+            </el-descriptions>
+          </el-card>
         </div>
+
         <div class="drawer-footer flex-box-end flex-v-ce" v-if="detailInfo.status == '1' && user_id != detailInfo.owner_id && detailInfo.reviewer_id != user_id">
           <el-button plain @click="detailShow = false">取消</el-button>
           <el-button type="primary" @click="collectTask" :loading="receiveLoad">领取任务</el-button>
@@ -145,8 +277,11 @@
 </template>
 
 <script>
+import Template from "../../../../examine/components/Template.vue";
+
 export default {
   name: 'get_task',
+  components: {Template},
   data() {
     return {
       active: 'unclaimed',
@@ -167,6 +302,12 @@ export default {
       user_id: this.$store.getters.user_info.id
     };
   },
+  computed:{
+    pointRemark(){
+      if (!(this.detailInfo && this.detailInfo.item_info)) return ''
+      return this.detailInfo.item_info.range_type === 1 ? `${this.detailInfo.item_info.min_point} ${this.$getTypsName(this.detailInfo.item_info.pt_id)}` : `${this.detailInfo.item_info.min_point} -- ${this.detailInfo.item_info.max_point} ${this.$getTypsName(this.detailInfo.item_info.pt_id)}`
+    }
+  },
   mounted() {
     this.get_list();
   },

+ 47 - 25
src/point/views/workbench/task/my_issue.vue

@@ -57,12 +57,13 @@
           </el-table-column>
           <el-table-column label="任务内容" prop="task_name" >
             <template slot-scope="scope">
-              <el-popover trigger="hover" placement="top">
-                <span>{{ scope.row.task_name }}</span>
+              <el-popover trigger="hover" placement="top" v-if="scope.row.task_remark">
+                <span>{{ scope.row.task_remark }}</span>
                 <div slot="reference" class="name-wrapper">
                   <span style="white-space: normal; overflow: hidden;">{{ scope.row.task_name }}</span>
                 </div>
               </el-popover>
+              <span v-else style="white-space: normal; overflow: hidden;">{{ scope.row.task_name }}</span>
             </template>
           </el-table-column>
           <el-table-column label="积分" prop="point_config.base_point" width="120px">
@@ -153,17 +154,22 @@
 
       <div v-if="status == 'repetitive'">
         <el-table :data="list" style="width: 100%" v-loading="loading" :row-class-name="scheduleClassName" @row-click="repetitiveTasksClick">
-          <el-table-column label="执行人" prop="target_info" width='250px'>
+          <el-table-column label="执行人" prop="target_info" width='150px'>
             <template slot-scope="scope">
               <span v-for="(item,index) in scope.row.target_info" :key="index">
-                <span v-if="scope.row.target_info.length == 1 && index == 0">{{item.name}}</span>
-                <span v-if="scope.row.target_info.length > 1 && index == 0">{{item.name}}等{{scope.row.target_info.length}}人</span>
+                <span v-if="scope.row.target_info.length === 1 && index === 0">{{item.name}}</span>
+                <span v-if="scope.row.target_info.length > 1 && index === 0">{{item.name}}等{{scope.row.target_info.length}}人</span>
               </span>
             </template>
           </el-table-column>
           <el-table-column label="任务内容" prop="remark">
             <template slot-scope="scope">
-              {{scope.row.name || scope.row.remark}}
+              <el-popover trigger="hover" placement="top">
+                <span>{{scope.row.remark}}</span>
+                <div slot="reference" class="name-wrapper">
+                  <span style="white-space: normal; overflow: hidden;">{{ scope.row.name }}</span>
+                </div>
+              </el-popover>
             </template>
           </el-table-column>
           <el-table-column label="任务积分" prop="point_config.base_point" width="120px">
@@ -214,12 +220,15 @@
     <!-- 临时任务 -->
     <temporaryTask :dialogVisible.sync="dialogVisible" :showTitle="'指派任务'"></temporaryTask>
     <!-- 临时任务-修改 -->
-    <temporaryTaskAmend :dialogVisible.sync="dialogVisibleAmend" :showTitle="'任务编辑'" :modifyData="modifyData"></temporaryTaskAmend>
+<!--    <temporaryTaskAmend :dialogVisible.sync="dialogVisibleAmend" :showTitle="'任务编辑'" :modifyData="modifyData"></temporaryTaskAmend>-->
+    <WorkUpdate :taskVisible.sync="dialogVisibleAmend" :work-id="workId" @hasSubmit="get_list" />
 
     <!-- 悬赏任务 -->
     <rewardTask :dialogVisible.sync="rewardTaskShow" :showTitle="'悬赏任务'"></rewardTask>
     <!-- 悬赏任务-修改 -->
-    <rewardTaskAmend :dialogVisible.sync="rewardTaskAmendShow" ref="rewardTasks" :showTitle="'任务编辑'" :rewardTaskAmendData="rewardTaskAmendData"></rewardTaskAmend>
+<!--    <rewardTaskAmend :dialogVisible.sync="rewardTaskAmendShow" ref="rewardTasks" :showTitle="'任务编辑'" :rewardTaskAmendData="rewardTaskAmendData"></rewardTaskAmend>-->
+    <TaskUpdate :schedule-visible.sync="rewardTaskAmendShow" :task-id="taskId" @hasSubmit="get_list"  />
+
 
     <!-- 详情弹窗 -->
     <taskDetailsPopup :visible.sync="showDetailPopup"  v-if="showDetailPopup" :id="detailId" :title="'任务详情'"></taskDetailsPopup>
@@ -228,7 +237,7 @@
     <repeatTaskDetailsPopup :visible.sync="showRepetitiveTasksPopup" v-if="showRepetitiveTasksPopup" :id="detailId" :title="'重复任务详情'"></repeatTaskDetailsPopup>
 
     <!-- 悬赏任务详情弹窗 -->
-    <rewardTaskDetailsPopup :visible.sync="showRewardTaskDetailsPopup" v-if="showRewardTaskDetailsPopup" :id="detailId" :title="'工作详情'"></rewardTaskDetailsPopup>
+    <rewardTaskDetailsPopup :visible.sync="showRewardTaskDetailsPopup" v-if="showRewardTaskDetailsPopup" :id="detailId" :title="'悬赏信息'"></rewardTaskDetailsPopup>
   </div>
 </template>
 
@@ -240,10 +249,15 @@
   import taskDetailsPopup from '@/point/views/common/taskDetailsPopup'
   import repeatTaskDetailsPopup from '@/point/views/common/repeatTaskDetailsPopup'
   import rewardTaskDetailsPopup from '@/point/views/common/rewardTaskDetailsPopup'
+  import WorkUpdate from "../../common/WorkUpdate.vue";
+  import TaskUpdate from "../../common/TaskUpdate.vue";
+
   export default {
     name: 'my_issue',
     data() {
       return {
+        workId: 0,
+        taskId: 0,
         weekList: ['一', '二', '三', '四', '五', '六', '日'],
         rewardTaskAmendData:{},//悬赏修改
         modifyData:{},//任务修改
@@ -290,7 +304,10 @@
         detailId: 0
       }
     },
-    components: {temporaryTask,rewardTask,rewardTaskAmend ,temporaryTaskAmend,taskDetailsPopup,repeatTaskDetailsPopup, rewardTaskDetailsPopup},
+    components: {
+      TaskUpdate,
+      WorkUpdate,
+      temporaryTask,rewardTask,rewardTaskAmend ,temporaryTaskAmend,taskDetailsPopup,repeatTaskDetailsPopup, rewardTaskDetailsPopup},
     watch:{
       status(val){
         this.formData.page = 1
@@ -333,6 +350,9 @@
       this.point_types = this.getPointTypes()
     },
     methods: {
+      onTaskUpdateClose(){
+        this.dialogVisibleAmend = false
+      },
       ptID(id){
         switch(id){
           case 'BF':
@@ -346,24 +366,26 @@
       //悬赏修改
       offerARewardAmend2(item){
         this.rewardTaskAmendShow = true
-        this.$refs.rewardTasks.forTheTaskLoading = true
-        let params = {
-          task_id:item.id
-        }
-        // this.rewardTaskAmendData = item
-        this.$axiosUser('get','/api/pro/integral/task',params).then(res => {
-            if (res.data.code == 1) {
-              this.rewardTaskAmendData = res.data.data
-            } else {
-              self.$message.error(res.data.msg);
-            }
-          }).finally(() => {
-            this.$refs.rewardTasks.forTheTaskLoading = false
-          })
+        this.taskId = item.id
+        // this.$refs.rewardTasks.forTheTaskLoading = true
+        // let params = {
+        //   task_id:item.id
+        // }
+        // // this.rewardTaskAmendData = item
+        // this.$axiosUser('get','/api/pro/integral/task',params).then(res => {
+        //     if (res.data.code == 1) {
+        //       this.rewardTaskAmendData = res.data.data
+        //     } else {
+        //       self.$message.error(res.data.msg);
+        //     }
+        //   }).finally(() => {
+        //     this.$refs.rewardTasks.forTheTaskLoading = false
+        //   })
       },
       //任务修改
       issueAmend1(item){
         this.modifyData = item
+        this.workId = item.id
         this.dialogVisibleAmend = true
       },
        //删除---我指派的、我悬赏的、重复任务    (重复任务需等后端接口)
@@ -523,7 +545,7 @@ $red: #f56c6c;
     color: #a6a8aa;
   }
 
- /deep/ .el-table tr:hover{
+/deep/ .el-table tr:hover{
   cursor:pointer
 }
 

+ 31 - 11
src/point/views/workbench/task/my_task.vue

@@ -3,7 +3,7 @@
     <div class="box boxMinHeight">
       <el-tabs v-model="formData.status"><el-tab-pane v-for="(item, index) in tabsOption" :key="index" :label="item.label" :name="item.name"></el-tab-pane></el-tabs>
 
-      <el-form ref="formData" :inline="true" :model="formData" label-width="80px">
+      <el-form ref="formData" :inline="true" :model="formData" label-width="80px" v-if="formData.status !== 'rewrite'">
         <el-form-item label="积分类型">
           <el-select v-model="formData.pt_id" clearable placeholder="请选择积分类型">
             <el-option v-for="item in point_type" :key="item.id" :label="item.name" :value="item.id"></el-option>
@@ -14,15 +14,20 @@
         </el-form-item>
       </el-form>
 
-      <div v-if="formData.status == 'running'">
+      <div v-if="['running'].includes(formData.status)">
         <el-radio-group v-model="formData.today" style="margin-bottom: 20px;">
           <el-radio-button label="0">全部任务</el-radio-button>
           <el-radio-button label="1">今日任务</el-radio-button>
           <el-radio-button label="2">逾期任务</el-radio-button>
           <el-radio-button label="3">其他任务</el-radio-button>
         </el-radio-group>
-        <el-table :data="list" style="width: 100%" v-loading="loading" @row-click="openDetail">
-          <el-table-column label="任务内容" prop="task_name" show-overflow-tooltip></el-table-column>
+        <el-table
+          :data="list"
+          style="width: 100%"
+          v-loading="loading"
+          @row-click="openDetail"
+        >
+          <el-table-column label="任务内容" prop="task_name" show-overflow-tooltip fixed width="300"></el-table-column>
           <el-table-column label="积分" width="120">
             <template slot-scope="scope">
               <span v-if="scope.row.point_config.review_point != 0" class="red">{{ scope.row.point_config.review_point }} {{ scope.row.pt_name }}</span>
@@ -30,7 +35,7 @@
             </template>
           </el-table-column>
           <el-table-column label="截止时间" prop="expire_time" width="200"></el-table-column>
-          <el-table-column label="操作" prop="owner_id" width="120">
+          <el-table-column label="操作" prop="owner_id" fixed="right">
             <template slot-scope="scope">
               <el-link type="primary" @click.stop="completeBtn(scope.row)">完成任务</el-link>
             </template>
@@ -51,11 +56,16 @@
             </template>
           </el-table-column>
           <el-table-column label="截止时间" prop="expire_time" width="200"></el-table-column>
-          <el-table-column label="状态" prop="review_status" width="120">
+          <el-table-column v-if="formData.status !== 'rewrite'" label="状态" prop="review_status" width="120">
             <template slot-scope="scope">
               <div class="orange" v-if="scope.row.review_status == 0">待处理</div>
               <div class="green" v-if="scope.row.review_status == 1">已通过</div>
-              <div class="red" v-if="scope.row.review_status == 2">已驳回</div>
+              <div class="red" v-if="scope.row.review_status == 2">已拒绝</div>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" prop="owner_id" fixed="right" v-if="['rewrite'].includes(formData.status)">
+            <template slot-scope="scope">
+              <el-link type="primary" @click.stop="completeBtn(scope.row)">完成任务</el-link>
             </template>
           </el-table-column>
           <template slot="empty">
@@ -83,7 +93,7 @@
       <div class="details_content">
         <el-form :model="detail_form" ref="detail_form" label-width="80px">
           <el-form-item label="任务备注" prop="remark" :rules="[{ required: true, message: '请填写任务备注(限30字)'}]">
-            <el-input v-model="detail_form.remark" type="textarea" maxlength="30" show-word-limit></el-input>
+            <el-input v-model="detail_form.remark" type="textarea" maxlength="30" show-word-limit @input="onRemarkInput"></el-input>
           </el-form-item>
         </el-form>
         <footer class="drawer-footer flex-box-end flex-v-ce">
@@ -100,13 +110,15 @@
 
 <script>
 import taskDetailsPopup from '@/point/views/common/taskDetailsPopup';
+import Template from "../../../../examine/components/Template.vue";
+import {specialFilter} from "../../../../utils";
 
 export default {
   name: 'my_task',
   data() {
     return {
       active: 'running',
-      tabsOption: [{ label: '待完成', name: 'running' }, { label: '待审批', name: 'complete' }, { label: '已审批', name: 'reviewed' }],
+      tabsOption: [{ label: '待完成', name: 'running' },{ label: '驳回重做', name: 'rewrite' }, { label: '待审批', name: 'complete' }, { label: '已审批', name: 'reviewed' }],
       list: [],
       loading: false,
       total: null,
@@ -125,24 +137,29 @@ export default {
         page_size: 10
       },
       completeShow: false,
-      showDetailPopup: false,
       detailId: null,
       showDetailPopup: false,
       showRepetitiveTasksPopup: false,
       showRewardTaskDetailsPopup: false,
       tabPosition:'0',
+      statusMap:{
+        1:'待处理',
+
+      }
     };
   },
-  components: { taskDetailsPopup },
+  components: {Template, taskDetailsPopup },
   watch: {
     'formData.today'(val){
       this.formData.page = 1;
       this.get_list();
     },
     'formData.pt_id'(val) {
+      this.formData.page = 1;
       this.get_list();
     },
     'formData.sort'(val) {
+      this.formData.page = 1;
       this.get_list();
     },
     'formData.status'(val) {
@@ -231,6 +248,9 @@ export default {
         .finally(() => {
           self.loading = false;
         });
+    },
+    onRemarkInput(val){
+      this.detail_form.remark = specialFilter(val)
     }
   }
 };

+ 8 - 0
src/router/index.js

@@ -159,6 +159,14 @@ const constantRouterMap = [
               jurisdiction: ['creator', 'admin', 'point_manager', 'dept_manager']
             }
           },
+          {
+            path: '/appeal',
+            name: '积分申诉',
+            component: () => import( /* webpackChunkName: "integral_event" */ '@/point/views/statistics/appeal'),
+            meta: {
+              groupCode: 'integral'
+            }
+          },
 
           // 任务管理
           {

+ 5 - 0
src/utils/index.js

@@ -321,3 +321,8 @@ export function deepClone(source) {
 export function uniqueArr(arr) {
   return Array.from(new Set(arr))
 }
+
+
+export function specialFilter(inputStr){
+  return inputStr.replace(/[^(\w\d\s\u4e00-\u9fa5+:、,.!@$#%*={}:,。!()【】《》;¥??’”\-\(\)\[\])]/g,"")
+}