Newer
Older
CallCenterFront / src / views / qualityManage / qualitySound / qualityCheck.vue
StephanieGitHub on 2 May 2020 12 KB MOD: 质检新增参数是否需要播放器
<!--录音质检,录音复核-->
<template>
  <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible" width="1200px" append-to-body>
    <div>
      <el-form ref="dataForm" :model="form" label-width="80px" size="mini">
        <el-row :gutter="20">
          <el-col v-if="needPlayer" :span="12">
            <audio-player ref="adplayer" :the-url="sound.url" :the-control-ist="sound.controlList"/>
          </el-col>
          <el-col :span="12">
            <el-form-item label="质检评语">
              <el-input v-model="form.checkComment" type="textarea" rows="3"/>
            </el-form-item>
          </el-col>
        </el-row>
        <div>
          <div v-if="dialogStatus=='first'" style="margin-top:10px;">
            <el-form-item label="质检模块">
              <el-select v-model="form.checkModular" placeholder="请选择质检模块" style="width:250px;">
                <el-option v-for="item of modularList" :key="item.id" :label="item.modularName" :value="item.id"/>
              </el-select>
            </el-form-item>
          </div>
          <el-row v-show="scoreData.length>0">
            <el-col>
              <el-table :data="scoreData" :span-method="objectSpanMethod" size="mini" style="width: 100%" cell-class-name="slim-row" border>
                <el-table-column prop="firstIndexName" label="一级指标"/>
                <el-table-column prop="secondIndexName" label="二级指标"/>
                <el-table-column prop="indexDetail" label="质检考核标准解析"/>
                <el-table-column prop="indexTypeName" label="考核标准类型"/>
                <el-table-column prop="date" label="质检考核">
                  <template slot-scope="scope">
                    <!--分值型-->
                    <el-input v-if="scope.row.indexType=='0'" v-model="scope.row.score" :disabled="dialogStatus=='info'" type="number" size="mini" style="width: 100px" class="inputClass"/>
                    <span v-if="scope.row.indexType=='0'" class="tips">总分:{{ scope.row.maxScore }}</span>
                    <!--是否-->
                    <el-radio-group v-if="scope.row.indexType=='1'" v-model="scope.row.score" :disabled="dialogStatus=='info'">
                      <el-radio label="1">是</el-radio>
                      <el-radio label="0">否</el-radio>
                    </el-radio-group>
                    <!--文本型-->
                    <el-input v-if="scope.row.indexType=='2'" v-model="scope.row.score" :disabled="dialogStatus=='info'" maxlength="20" size="mini" style="width: 150px" class="inputClass"/>
                  </template>
                </el-table-column>
              </el-table>
            </el-col>
          </el-row>
        </div>

      </el-form>
    </div>
    <div slot="footer" class="dialog-footer">
      <el-button :loading="btnLoading" type="primary" @click="saveData">保存</el-button>
      <el-button @click="cancel">取消</el-button>
    </div>
  </el-dialog>
</template>

<script>
import AudioPlayer from '../../../components/AudioPlayer/AudioPlayer'
import { getQIndexList, getQModulerList, firstCheck, secondCheck } from '@/api/qualityCheck'

export default {
  name: 'QualityCheck',
  components: { AudioPlayer },
  props: {
    needPlayer: {
      type: Boolean,
      default: true
    }
  },
  data() {
    return {
      dialogFormVisible: false, // 对话框是否显示
      dialogStatus: '', // 对话框类型:create,update
      form: {
        callid: '',
        checkComment: '',
        checkModular: '',
        scoreSituation: ''
      }, // 表单
      scoreData: [],
      modularList: [], // 质检模块列表
      textMap: {
        first: '质检',
        twice: '质检复核'
      }, // 表头显示标题
      rules: {
        modularName: [{ required: true, message: '模块名称不能为空', trigger: ['blur', 'change'] }],
        description: [{ required: true, message: '描述不能为空', trigger: ['blur', 'change'] }],
        score: [{ required: true, message: '总分不能为空', trigger: ['blur', 'change'] }]
      }, // 前端校验规则
      rowAndColumn: [],
      pos: 0,
      posT: 0,
      disabled: false,
      sound: {
        url: '',
        controlList: 'noDownload noSpeed onlyOnePlaying'
      },
      btnLoading: false // 保存按钮的加载中状态
    }
  },
  watch: {
    'form.checkModular': function(val) {
      this.fetchQIndex(val)
    }
  },
  methods: {
    // 初始化对话框
    initDialog(dialogStatus, dialogFormVisible, row = null) {
      this.dialogStatus = dialogStatus
      this.dialogFormVisible = dialogFormVisible
      this.btnLoading = false
      this.fetchModularList()
      if (dialogStatus === 'first') { // 如果是新增,清除验证
        this.disabled = false
        this.resetForm()
        this.form.callid = row.callid
        this.$nextTick(() => {
          this.$refs['dataForm'].clearValidate()
        })
      } else if (dialogStatus === 'twice') { // 如果是修改,将row中数据填写到输入框中
        this.form.callid = row.callid
        this.fetchQIndex('1', dialogStatus)
        if (dialogStatus === 'info') {
          this.fetchQIndex('1', dialogStatus)
          this.disabled = true
        } else {
          this.disabled = false
        }
      }
    },
    // 获取质检模块列表
    fetchModularList() {
      getQModulerList().then(response => {
        response.data = [
          { modularName: '标准模块', id: '2', pid: '1', deptName: '顶级', num: '1' },
          { modularName: '入门标准模块', id: '3', pid: '1', deptName: '顶级', num: '1' },
          { modularName: '完整标准模块', id: '4', pid: '1', deptName: '顶级', num: '1' }
        ]
        this.modularList = response.data
      })
    },
    // 获取指标列表
    fetchQIndex(modularId, type) {
      const params = {
        modularId: modularId
      }
      this.scoreData = []
      getQIndexList(params).then(response => {
        if (response.code === 200) {
          response.data.rows = [
            { 'id': '1', 'firstIndexName': '信息内容准确', 'secondIndexName': '信息内容准确无误', 'indexDetail': '信息内容准确无误', 'indexType': '0', 'indexTypeName': '分值型', 'score': '4' },
            { 'id': '1', 'firstIndexName': '信息内容准确', 'secondIndexName': '信息内容全面', 'indexDetail': '信息内容全面', 'indexType': '0', 'indexTypeName': '分值型', 'score': '4' },
            { 'id': '1', 'firstIndexName': '信息内容准确', 'secondIndexName': '是否与客户核实', 'indexDetail': '是否与客户核实', 'indexType': '0', 'indexTypeName': '分值型', 'score': '4' },
            { 'id': '1', 'firstIndexName': '信息内容准确', 'secondIndexName': '有无夸张', 'indexDetail': '有无夸张', 'indexType': '0', 'indexTypeName': '分值型', 'score': '5' },
            { 'id': '1', 'firstIndexName': '语音语速语调', 'secondIndexName': '吐字清晰', 'indexDetail': '吐字清晰', 'indexType': '0', 'indexTypeName': '分值型', 'score': '5' },
            { 'id': '1', 'firstIndexName': '语音语速语调', 'secondIndexName': '语调适当起伏', 'indexDetail': '语调适当起伏', 'indexType': '1', 'indexTypeName': '是否型', 'score': '4' },
            { 'id': '1', 'firstIndexName': '语音语速语调', 'secondIndexName': '声音修饰', 'indexDetail': '声音修饰', 'indexType': '1', 'indexTypeName': '是否型', 'score': '4' },
            { 'id': '1', 'firstIndexName': '语音语速语调', 'secondIndexName': '是否拖音', 'indexDetail': '是否拖音', 'indexType': '1', 'indexTypeName': '是否型', 'score': '4' },
            { 'id': '1', 'firstIndexName': '语音语速语调', 'secondIndexName': '语速适中', 'indexDetail': '语速适中', 'indexType': '1', 'indexTypeName': '是否型', 'score': '4' }
          ]
          const data = response.data.rows
          const self = this
          self.rowAndColumn = []
          debugger
          for (const i in data) {
            if (i === '0') {
              self.rowAndColumn.push(1)
              self.pos = 0
            } else {
              if (data[i].firstIndexName === data[i - 1].firstIndexName) {
                // 如果firstIndexName相等就累加,并且push0
                self.rowAndColumn[self.pos] += 1
                self.rowAndColumn.push(0)
              } else {
                self.rowAndColumn.push(1)
                self.pos = i
              }
            }
            const item = data[i]
            const row = {
              id: item.id,
              firstIndexName: item.firstIndexName,
              secondIndexName: item.secondIndexName,
              indexDetail: item.indexDetail,
              indexType: item.indexType,
              indexTypeName: item.indexTypeName,
              maxScore: item.score,
              score: ''
            }
            this.scoreData.push(row)
          }
          this.listLoading = false
          if (type !== 'first') {
            this.fetchCheckDetail()
          }
        }
      })
    },
    // 获取质检详情
    fetchCheckDetail() {
      const params = '1'
      getQIndexList(params).then(response => {
        if (response.code === 200) {
          this.form.checkComment = '良好'
          this.form.checkModular = '1'
          this.form.scoreSituation = '1:1,2:1,3:1,4:1,5:1,6:1,7:1,8:1,9:1'
          // 遍历scoreSituation,得到得分
          const scoreList = this.form.scoreSituation.split(',')
          for (const i in scoreList) {
            const item = scoreList[i]
            const itemList = item.split(':')
            this.scoreData[i].score = itemList[1]
          }
        }
      })
    },
    // 重置表单
    resetForm() {
      this.form = {
        callid: '',
        checkComment: '',
        checkModular: '',
        scoreSituation: ''
      }
    },
    // 保存数据
    saveData: function() {
      if (this.dialogStatus === 'first') {
        this.qualityTwiceCheck()
      } else if (this.dialogStatus === 'twice') {
        this.qualityCheck()
      }
    },
    formatData() {
      const result = []
      for (const item of this.scoreData) {
        const line = item.id + ':' + item.score
        result.push(line)
      }
      result.join(',')
      return result
    },
    // 质检
    qualityCheck: function() {
      this.$refs['dataForm'].validate((valid) => {
        if (valid) {
          const form = {
            callid: this.form.callid,
            checkComment: this.form.checkComment,
            checkModular: this.form.checkModular,
            scoreSituation: this.formatData()
          }
          this.btnLoading = true
          firstCheck(form).then(response => {
            if (response.code === 200) {
              this.$message.success('质检成功')
              this.$emit('refresh')
              this.dialogFormVisible = false
            }
          }).catch(_ => { // 异常情况,loading置为false
            this.btnLoading = false
          })
        }
      })
    },
    // 质检复核
    qualityTwiceCheck: function() {
      this.$refs['dataForm'].validate((valid) => {
        if (valid) {
          const form = {
            callid: this.form.callid,
            checkComment: this.form.checkComment,
            checkModular: this.form.checkModular,
            scoreSituation: this.formatData()
          }
          this.btnLoading = true
          secondCheck(form).then(response => {
            if (response.code === 200) {
              this.$message.success('质检复核成功')
              this.$emit('refresh')
              this.dialogFormVisible = false
            }
          }).catch(_ => { // 异常情况,loading置为false
            this.btnLoading = false
          })
        }
      })
    },
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      const self = this
      if (columnIndex === 0) {
        if (self.rowAndColumn[rowIndex]) {
          const rowNum = self.rowAndColumn[rowIndex]
          return {
            rowspan: rowNum,
            colspan: rowNum > 0 ? 1 : 0
          }
        }
        return {
          rowspan: 0,
          colspan: 0
        }
      }
    },
    cancel: function() {
      this.dialogFormVisible = false
      this.$emit('watchChild')
    }
  }
}
</script>

<style rel="stylesheet/scss" lang="scss" scoped>

  .el-dialog{
    width:700px
  }
  .el-select{
    width: 100%;
  }
  .slim-row{
    padding: 4px 0px;
    .tips{
      margin-left: 10px;
      color: red;
    }
  }
</style>