Newer
Older
xc-business-system / src / views / quality / review / run / components / reportContent.vue
lyg on 8 Mar 2024 5 KB 质量活动
<!-- 报告内容 -->
<script name="ReportContent" lang="ts" setup>
import { ElMessage, ElMessageBox } from 'element-plus'
import templateDialog from './templateDialog.vue'
import { useCheckList, useCheckNoTips } from '@/commonMethods/useCheckList'
import { detailReviewRun, getReviewRunList } from '@/api/quality/review/run'
const $props = defineProps({
  data: {
    type: Array,
    required: true,
  },
})
const $route = useRoute()
const $router = useRouter()
const list = ref<any[]>([])
watch(() => $props.data, (newVal) => {
  if (newVal?.length) {
    list.value = $props.data
    list.value.forEach((item: any) => {
      item.editable = true
    })
  }
  else {
    list.value = []
  }
}, {
  deep: true,
  immediate: true,
})
const columns = ref([
  { text: '', value: 'inspectionContent', required: false, width: '220' },
  { text: '质量管理体系运行情况', value: 'inspectionMethod', required: true },
  { text: '存在问题', value: 'inspectionRes', required: true, width: '350' },
  { text: '对策', value: 'refStandard', required: true, width: ' 350' },
])

// 检查数据列表
function checkCertificateList() {
  return useCheckList(list.value, columns.value, '报告内容')
}
// 将列表置为不可编辑状态
function setAllRowReadable() {
  for (const item of list.value) {
    item.editable = false
  }
}
// 编辑行
const dblclickRow = (row: any) => {
  if ($route.path.includes('detail')) { return }
  setAllRowReadable()
  row.editable = true
}
// 删除行
const deleteRow = (row: any) => {
  ElMessageBox.confirm(
    '确认删除当前行数据吗?',
    '提示',
    {
      confirmButtonText: '确认',
      cancelButtonText: '取消',
      type: 'warning',
    },
  ).then(() => {
    const data = list.value.findIndex(item => item === row)
    list.value.splice(data, 1)
  })
}
const handler = (type: string, index: number) => {
  if (type === 'insert') {
    if (!checkCertificateList()) { return }
    setAllRowReadable()
    list.value.splice(index + 1, 0, {
      inspectionContent: '',
      inspectionMethod: '',
      inspectionRes: '',
      refStandard: '',
      editable: true,
    })
  }
  else if (type === 'delete') {
    deleteRow(list.value[index])
  }
  else if (type === 'update') {
    if (!checkCertificateList()) { return }
    dblclickRow(list.value[index])
  }
}
// 鼠标移出表格 自动置为不可编辑状态
const eventBlur = () => {
  if ($route.path.includes('detail')) { return }
  if (useCheckNoTips(list.value, columns.value)) {
    setAllRowReadable()
  }
}
defineExpose({
  list,
  checkCertificateList,
})
// 插入模板
const templateRef = ref()
const selectTemplate = () => {
  if (checkCertificateList()) {
    templateRef.value.initDialog()
  }
}
// 确认选择模板
const confirmTemplate = (template: any) => {
  console.log(template, '选择的模板')
}
// 自动填充上次内容
const fillContent = () => {
  getReviewRunList({ limit: 1, offset: 1 }).then((res) => {
    if (res.data.rows.length) {
      detailReviewRun({ id: res.data.rows[0].id }).then((res1) => {
        console.log(res1.data, '需要填充的内容')
        if (res1.data.repContents?.length) {
          list.value = res1.data.repContents
          list.value = list.value.map((item: any) => ({ ...item, editable: true }))
        }
        else {
          ElMessage.warning('暂无内容填充')
        }
      })
    }
    else {
      ElMessage.warning('暂无内容填充')
    }
  })
}
</script>

<template>
  <detail-block title="报告内容">
    <template-dialog ref="templateRef" @add="confirmTemplate" />
    <template #btns>
      <el-button type="primary" @click="fillContent">
        自动填充上次内容
      </el-button>
      <!-- <el-button type="primary" @click="selectTemplate">
        插入内容模板
      </el-button> -->
    </template>
    <el-table
      ref="multipleTableRef" :data="list" style="width: 100%;" border
    >
      <el-table-column align="center" label="序号" width="80" type="index" />
      <el-table-column
        v-for="item in columns" :key="item.value" :prop="item.value" :label="item.text"
        align="center" :width="item.width"
      >
        <template #header>
          <span v-show="item.required && !$route.path.includes('detail')" style="color: red;">*</span><span>{{ item.text }}</span>
        </template>
        <template #default="scope">
          <span v-if="!scope.row.editable">{{ scope.row[item.value] }}</span>
          <span v-if="item.text === '' && scope.row.editable">{{ scope.row[item.value] }}</span>
          <el-input
            v-if="item.text !== '' && scope.row.editable" v-model="scope.row[item.value]" :autofocus="true"
            :placeholder="`${item.text}`" class="input" type="textarea" :rows="4"
          />
        </template>
      </el-table-column>
      <!-- <el-table-column v-if="!$route.path.includes('detail')" align="center" label="操作" width="180">
        <template #default="scope">
          <el-button
            v-if="!scope.row.editable"
            size="small"
            type="primary"
            link
            @click="handler('update', scope.$index)"
          >
            编辑
          </el-button>
          <el-button
            v-if="scope.$index !== 0"
            size="small"
            type="danger"
            link
            @click="handler('delete', scope.$index)"
          >
            删除
          </el-button>
          <el-button
            size="small"
            type="primary"
            link
            @click="handler('insert', scope.$index)"
          >
            下移
          </el-button>
          <el-button
            size="small"
            type="primary"
            link
            @click="handler('insert', scope.$index)"
          >
            上移
          </el-button>
        </template>
      </el-table-column> -->
    </el-table>
  </detail-block>
</template>