Newer
Older
CallCenterFront / src / views / caseManage / caseCommon / caseProcess.vue
zhangyingjie on 27 Apr 2020 15 KB 工单处理流程增加案卷类型修改
<template>
  <div class="app-container">
    <el-form ref="processForm" :model="processForm" label-width="auto">
      <div v-if="showDateTime">
        <el-row>
          <el-form-item label="完成时限">
            <el-date-picker
              v-model="processForm.limitedTime"
              :clearable="false"
              type="datetime"
              value-format="yyyy-MM-dd HH:mm:ss"
              placeholder="选择完成时限"/>
          </el-form-item>
        </el-row>
      </div>
      <div v-if="showCaseType">
        <el-form-item label="事件类型" required>
          <el-col :span="6">
            <el-select key="eorcSelect" v-model="processForm.eorc" placeholder="请选择" style="width: 100%" @change="selectEorc">
              <el-option v-for="item of eorcList" :key="'eorc_'+item.value" :label="item.name" :value="item.value"/>
            </el-select>
          </el-col>
          <el-col :span="6">
            <el-select key="typeSelect" v-model="processForm.caseTypeCode" placeholder="请选择" style="width: 100%" @change="selectCaseType">
              <el-option v-for="item of caseTypeList" :key="'case_'+item.id" :label="item.typeName" :value="item.typeCode"/>
            </el-select>
          </el-col>
          <el-col :span="6">
            <el-select key="typeDetailSelect" v-model="processForm.caseTypeDetailCode" placeholder="请选择" style="width: 100%" clearable>
              <el-option v-for="item of caseDetailTypeList" :key="'casedetail_'+item.id" :label="item.typeDetailName" :value="item.typeDetailCode"/>
            </el-select>
          </el-col>
        </el-form-item>
      </div>
      <el-row>
        <el-form-item label="下一步处理方式" required>
          <el-radio-group v-model="processForm.changeState" @change="selectNextOperation">
            <el-radio v-for="node in nextNodeList" :key="'_node'+node.id" :label="node.nextState">{{ node.nextOperation }}</el-radio>
          </el-radio-group>
        </el-form-item>
      </el-row>
      <div v-if="showSingleSelect">
        <el-row>
          <el-col :span="6">
            <el-form-item label="处理部门" required>
              <el-select key="muiltDept" v-model="processForm.dispatchDeptId" :loading="deptSelectLoading" filterable placeholder="请选择处理部门" @change="selectDisposalDept">
                <el-option v-for="item in disposalDeptList" :key="item.id" :label="item.simplename" :value="item.id"/>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="交办处理人" required>
              <el-select key="singleUser" v-model="processForm.taskUserId" :loading="userSelectLoading" filterable placeholder="请选择处理人">
                <el-option v-for="item in normalUserList" :key="'single_'+item.id" :label="item.name" :value="item.id"/>
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
      </div>
      <div v-if="showMulitSelect">
        <el-row>
          <el-col :span="6">
            <el-form-item label="处理部门" required>
              <el-select key="muiltDept" v-model="selectedDept" :loading="deptSelectLoading" filterable placeholder="请选择处理部门" @change="selectDept" >
                <el-option v-for="item in deptList" :key="item.id" :label="item.simplename" :value="item.id"/>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="会签处理人" required>
              <el-select key="MulitUser" v-model="selectedUserList" :loading="userSelectLoading" multiple filterable placeholder="请选择处理人" style="width:400px" @change="selectUser" >
                <el-option v-for="item in userList" :key="'mulit_'+item.id" :label="item.name" :value="item.id"/>
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-form-item label="已选人员">
            <el-tag v-for="item in allUserList" :key="'user-'+item" closable @close="delSelect(item)">{{ userMap[item] && userMap[item].name }}</el-tag>
          </el-form-item>
        </el-row>
      </div>
      <el-row>
        <el-form-item label="反馈结果">
          <el-input v-model="processForm.remarks" type="textarea" maxlength="50" show-word-limit/>
        </el-form-item>
      </el-row>
      <el-row style="text-align: center;">
        <el-button class="submitBtn" type="primary" @click="onSubmit">提交</el-button>
      </el-row>
    </el-form>
  </div>
</template>

<script>
import DeptSelect from '@/components/DeptSelect'
import { getEorc } from '@/api/allDict'
import { getCaseType, getCaseDetailType } from '@/api/callCase'
import { getDisposalDeptList, getUserList, getDeptList } from '@/api/callCase'
import { getNextNodeList, completeCaseTask } from '@/api/process'
export default {
  name: 'CaseProcess',
  components: { DeptSelect },
  props: {
    bizId: {
      type: String,
      default: ''
    },
    processId: {
      type: String,
      default: ''
    },
    taskId: {
      type: String,
      default: ''
    },
    caseState: {
      type: Number,
      default: null
    },
    limitedTime: {
      type: String,
      default: ''
    },
    caseDetail: {
      type: Object,
      default: null
    }
  },
  data() {
    return {
      processForm: { // 流程处理表单
        bizId: '', // 事件id(主键id)
        processId: '', // 流程ID
        currState: '', // 当前处理状态
        changeState: '', // 待变更状态
        remarks: '', // 备注
        dispatchDeptId: '', // 指派任务给某个组织机构
        taskUserId: '', // 任务指派人员,
        limitedTime: '', // 完成时限,
        eorc: '',
        caseTypeCode: '',
        caseTypeDetailCode: ''
      },
      nextNodeList: [], // 流程节点列表
      eorcList: [],
      caseTypeList: [],
      caseDetailTypeList: [],
      disposalDeptList: [], // 处置部门列表(交办用)
      normalUserList: [], // 处置人员列表(交办用)
      showSingleSelect: false, // 选择人员,单选
      showMulitSelect: false, // 选择人员,多选
      showDateTime: false, // 选择延期时间
      showCaseType: false,
      deptSelectLoading: false, // 处置部门选择框加载动画
      userSelectLoading: false, // 处理人选择框加载动画
      userQuery: {
        deptid: '', // 部门id (默认为当前用户部门)
        hasMine: '0', // 是否包含本人,1包含, 0不包含
        roleTips: '' // 角色标识,获取处置人员时传noraml
      },
      deptList: [], // 部门列表(会签用)
      userList: [], // 用户列表(会签用)
      userMap: {}, // 存储人员id:人员信息(会签用)
      deptMap: {}, // 存储部门id:部门下的已选人员(会签用)
      selectedDept: '', // 已选部门
      selectedUserList: [], // 下拉框多选用户列表
      allUserList: [] // 全部已选用户列表
    }
  },
  mounted() {
    this.processForm.bizId = this.bizId
    this.processForm.processId = this.processId
    this.processForm.currState = this.caseState

    this.fetchNextNodeList()
    this.fetchDisposalDeptList()
    this.fetchDeptList()
    this.fetchEorcList()

    if ((this.caseState === 6 || this.caseState === 33 || this.caseState === 31) && this.hasPerm('/changeLimitedTime')) {
      this.processForm.limitedTime = this.limitedTime
      this.showDateTime = true
    }
    if (this.caseState === 6) {
      this.setCaseType()
      this.showCaseType = true
    }
  },
  methods: {
    /**
     * 获取下级流转节点
     */
    fetchNextNodeList() {
      getNextNodeList(this.processForm.currState).then(response => {
        this.nextNodeList = response.data
      })
    },
    // 大类列表
    fetchEorcList() {
      getEorc().then(response => {
        if (response.code === 200) {
          this.eorcList = response.data
        }
      })
    },
    // 二级类型列表
    fetchCaseTypeList() {
      getCaseType(this.processForm.eorc).then(response => {
        this.caseTypeList = response.data
      })
    },
    // 三级类型列表
    fetchCaseDetailTypeList() {
      getCaseDetailType(this.processForm.caseTypeCode).then(response => {
        this.caseDetailTypeList = response.data
      })
    },
    selectEorc(val) {
      console.log('selectEorc', val)
      if (val === '') {
        this.processForm.caseTypeCode = ''
        this.processForm.caseTypeDetailCode = ''
      } else {
        this.processForm.caseTypeCode = ''
        this.processForm.caseTypeDetailCode = ''
        this.fetchCaseTypeList()
      }
    },
    selectCaseType(val) {
      console.log('selectCaseType', val)
      if (val === '') {
        this.processForm.caseTypeDetailCode = ''
      } else {
        this.processForm.caseTypeDetailCode = ''
        this.fetchCaseDetailTypeList()
      }
    },
    /**
     * 选择处理方式之后:
     * 如果下一步是交办,选择人员和部门(单选),清空相关信息
     * 如果下一步是会签,选择部门和人员(多选),清空相关信息
     * 否则,隐藏人员和部门,清空processForm中的dispatchDeptId和taskUserId
     */
    selectNextOperation(changeState) {
      this.showSingleSelect = false
      this.showMulitSelect = false
      // this.showDateTime = false
      this.processForm.dispatchDeptId = ''
      this.processForm.taskUserId = ''
      // this.processForm.limitedTime = ''

      this.normalUserList = []
      this.selectedDept = ''
      this.selectedUserList = []
      this.allUserList = []
      this.userMap = {}
      this.deptMap = {}
      // 交办
      if (changeState === 2) {
        this.showSingleSelect = true
      }
      // 会签
      if (changeState === 9) {
        this.showMulitSelect = true
      }
      // if ((this.caseState === 6 || this.caseState === 33 || this.caseState === 31) && this.hasPerm('/changeLimitedTime')) {
      //   if (changeState !== 5 && changeState !== 4) {
      //     // this.processForm.limitedTime = this.limitedTime
      //     this.showDateTime = true
      //   }
      //   // this.setCaseType()
      //   this.showCaseType = true
      // }
    },
    async setCaseType() {
      this.processForm.eorc = this.caseDetail.eorc
      await this.fetchCaseTypeList()
      this.processForm.caseTypeCode = this.caseDetail.caseTypeCode
      await this.fetchCaseDetailTypeList()
      this.processForm.caseTypeDetailCode = this.caseDetail.caseDetailTypeCode
    },
    // 提交
    onSubmit() {
      console.log('submit')
      this.$confirm('确定提交案件处理吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        // 点击“确定”后的操作
        const isBuild = this.buildProcessForm()
        if (!isBuild) {
          return
        }
        this.$emit('loading')
        completeCaseTask(this.processForm).then(response => {
          console.log(response)
          if (response.code === 200) {
            this.$emit('submitSuccess')
          } else {
            this.$emit('submitError')
          }
        }).catch((res) => {
          this.$emit('submitError')
        })
      }).catch(() => {
        // 点击“取消”后的操作
      })
    },
    buildProcessForm() {
      if (!this.processForm.changeState) {
        this.$message.error('处理方式不能为空')
        return false
      }
      // 交办:传dispatchDeptId和taskUserId
      if (this.processForm.changeState === 2) {
        if (!this.processForm.dispatchDeptId) {
          this.$message.error('处理部门不能为空')
          return false
        }
        if (!this.processForm.taskUserId) {
          this.$message.error('处理人不能为空')
          return false
        }
      }
      // 会签:传countersigns,为对象列表,每个对象包含taskUserId和dispatchDeptId
      if (this.processForm.changeState === 9) {
        if (!this.allUserList || this.allUserList.length < 1) {
          this.$message.error('处理人不能为空')
          return false
        }
        // !!!!会签人员处理
        const counterSigns = this.allUserList.map(item => {
          const u = this.userMap[item]
          return {
            taskUserId: u.id,
            dispatchDeptId: u.deptId
          }
        })
        console.log('countersigns', counterSigns)
        this.processForm.countersigns = counterSigns
      }
      if (this.showCaseType) {
        if (!this.processForm.eorc || !this.processForm.caseTypeCode || !this.processForm.caseTypeDetailCode) {
          this.$message.error('事件类型不能为空')
          return false
        }
      }
      // 会签完成/未完成:传taskId
      if (this.processForm.currState === 9) {
        this.processForm.taskId = this.taskId
      }
      return true
    },
    /**
     * 获取处置单位列表(交办用)
     */
    fetchDisposalDeptList() {
      this.deptSelectLoading = true
      getDisposalDeptList().then(response => {
        this.disposalDeptList = response.data
        this.deptSelectLoading = false
      })
    },
    /**
     * 获取处置人员列表(交办用)
     */
    fetchNormalUserList() {
      this.userSelectLoading = true
      this.userQuery.roleTips = 'normal'
      getUserList(this.userQuery).then(response => {
        this.normalUserList = response.data
        this.userSelectLoading = false
      })
    },
    /**
     * 监听选择处置单位,获取处理人员(交办)
     */
    selectDisposalDept(val) {
      console.log('selectDisposalDept')
      this.normalUserList = []
      this.processForm.taskUserId = ''
      if (val) {
        this.userQuery.deptid = val
        this.fetchNormalUserList()
      }
    },
    /**
     * 获取部门列表(会签用)
     */
    fetchDeptList() {
      this.deptSelectLoading = true
      getDeptList().then(response => {
        this.deptList = response.data
        this.deptSelectLoading = false
      })
    },
    /**
     * 获取人员列表(会签用)
     */
    fetchUserList() {
      this.userQuery.roleTips = ''
      this.userSelectLoading = true
      getUserList(this.userQuery).then(response => {
        this.userList = response.data
        this.userList.forEach(item => {
          const iid = item.id
          if (this.allUserList.includes(iid)) {
            this.selectedUserList.push(iid)
          }
          this.userMap[iid] = item
        })
        console.log('userMap', this.userMap)
        this.userSelectLoading = false
      })
    },
    /**
     * 监听选择单位,获取人员列表(会签)
     */
    selectDept(val) {
      console.log('selectDept')
      this.userList = []
      this.selectedUserList = []
      if (val) {
        this.userQuery.deptid = val
        this.fetchUserList()
      }
    },
    /**
     * 选择人员(多选,会签):
     * 将选择的人员放进deptMap中,然后遍历deptMap,将全部人员放入allUserList
     */
    selectUser(v) {
      this.deptMap[this.selectedDept] = v
      this.allUserList = Object.keys(this.deptMap).reduce((arr, item) => {
        return arr.concat(this.deptMap[item])
      }, [])
      console.log('tttt', this.allUserList, this.deptMap)
    },
    /**
     * 从数组中删除
     */
    delFromArr(arr, item) {
      arr.splice(arr.indexOf(item), 1)
    },
    /**
     * 从已选和全部已选中移除人员(会签)
     */
    delSelect(v) {
      this.delFromArr(this.allUserList, v)
      this.delFromArr(this.selectedUserList, v)
    }
  }
}
</script>

<style lang="scss" scoped>
.process-select {
  width: 200px;
}
</style>