zhouwx
6 天以前 f94b96403234f5927e74f72fc0cbc65d7b426019
src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectReview/index.vue
@@ -9,9 +9,10 @@
              plain
              icon="Plus"
              @click="openDialog('add',{})"
              v-hasPermi="['projectReview:add']"
          >新增</el-button>
        </el-form-item>
        <el-form-item v-if="isAdmin" label="企业:" >
        <el-form-item v-if="isAdmin" label="单位:" >
          <el-select v-model="data.queryParams.companyId" placeholder="请选择" @change="changeCom" clearable>
            <el-option
                v-for="item in companyList"
@@ -37,27 +38,60 @@
<!--          </el-select>-->
        </el-form-item>
        <el-form-item label="类型:">
          <el-select v-model="data.queryParams.type" filterable placeholder="请选择"
          >
            <el-option
                v-for="item in data.typeList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item >
          <el-button  type="primary" @click="getList">查询</el-button>
          <el-button  type="primary" plain @click="reset">重置</el-button>
          <el-form-item style="margin-left: 15px">
            <el-button
                type="primary"
                @click="exportData"
            >导出</el-button>
          </el-form-item>
        </el-form-item>
      </el-form>
    </div>
    <!-- 表格数据 -->
    <el-table v-loading="loading" :data="dataList" :border="true">
    <el-table v-loading="loading" :data="dataList" :border="true" @selection-change="handleSelectionChange">
      <el-table-column type="selection" width="55" :selectable="isRowSelectable" />
      <el-table-column label="序号" type="index" align="center" width="80"/>
      <el-table-column label="项目名称" prop="itemName" align="center" width="130"  :show-overflow-tooltip="true" />
      <el-table-column label="文件编号" prop="num" align="center"  />
      <el-table-column label="文件名称" prop="fileName" align="center"  />
      <el-table-column label="文件" prop="fileName" align="center" >
      <el-table-column label="项目名称" prop="itemName" align="center"   :show-overflow-tooltip="true" />
      <el-table-column label="设计和开发阶段" prop="stage" align="center"  />
      <el-table-column label="类型" prop="type" align="center"  >
        <template #default="scope">
          <el-link v-if="scope.row.fileName" style="" type="primary" @click="openFile(scope.row.filePath)">{{scope.row.fileName}}</el-link>
          <span>{{scope.row.type == 1 ? '会签评审' :scope.row.type == 2? '会议评审' :'' }}</span>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" v-if="userTpye == 0 || userTpye == 6">
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template #default="scope">
          <el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
          <el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
          <div v-if="scope.row.type == 2" style="display: flex;align-items: center;justify-content: center">
            <el-button link type="primary"  @click="downloadFile(scope.row)" v-hasPermi="['projectReview:edit']">下载</el-button>
            <el-button link type="primary"  @click="openDialog('edit',scope.row)" v-hasPermi="['projectReview:edit']">编辑</el-button>
            <el-button link type="danger" @click="handleDelete(scope.row)" v-hasPermi="['projectReview:del']">删除</el-button>
          </div>
          <div v-if="scope.row.type == 1" style="display: flex;align-items: center;justify-content: center">
              <!--没发送之前-->
            <div v-if="scope.row.status ==1" style="display: flex;align-items: center;justify-content: center">
              <el-button  link type="primary" @click="sendReviewMsg(scope.row)" v-hasPermi="['projectReview:send']">发送</el-button>
              <el-button link type="primary" @click="openDialog('edit',scope.row)" v-hasPermi="['projectReview:edit']">编辑</el-button>
              <el-button link type="danger" @click="handleDelete(scope.row)"  v-hasPermi="['projectReview:del']">删除</el-button>
            </div>
            <!--发送之后-->
            <div v-if="scope.row.status == 2" style="display: flex;align-items: center;justify-content: center">
              <el-button link type="primary" @click="openDialog('view',scope.row)">查看</el-button>
              <el-button link type="danger" @click="handleDelete(scope.row)" v-if="userTpye == 0" v-hasPermi="['projectReview:del']">删除</el-button>
            </div>
          </div>
        </template>
      </el-table-column>
    </el-table>
@@ -83,25 +117,40 @@
import Cookies from "js-cookie";
import {renderAsync} from "docx-preview";
import {get} from "@vueuse/core";
import {delReview, getReviewPage} from "@/api/selfProblems/projectReview";
import {delReview, getReviewPage, sendReview} from "@/api/selfProblems/projectReview";
import axios from "axios";
import {getToken} from "@/utils/auth";
// import {generateWordDocument} from "@/views/build/conpanyFunctionConsult/digitalFileDep/manageType/qualityManual/components/exportDoc";
import {generateWordDocument} from "@/utils/exportWord";
import {imageUrlToBase64} from "@/utils/imageToBase";
const userStore = useUserStore()
const { proxy } = getCurrentInstance();
const loading = ref(false);
const dialogRef = ref();
const choosedData = ref([])
const data = reactive({
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    companyId: null,
    itemName: null
    itemName: null,
    type:null
  },
  total: 0,
  dataList: [],
  companyList: [],
  industryList: [],
  isAdmin: false,
  typeList: [],
  typeList: [
    {
      id: 1,
      name: '会签评审'
    },
    {
      id: 2,
      name: '会议评审'
    },
  ],
  exportDialog: false,
  projectList: [],
@@ -175,7 +224,8 @@
      pageNum: 1,
      pageSize: 10,
      companyId: null,
      itemId: null
      itemId: null,
      type:null
    }
    await getCompanyList()
  }else {
@@ -183,9 +233,11 @@
      pageNum: 1,
      pageSize: 10,
      companyId: data.queryParams.companyId,
      itemId: null
      itemId: null,
      type:null
    }
  }
  choosedData.value = []
  await getList()
  await getProjectList()
}
@@ -212,7 +264,7 @@
const openFile = async(path)=>{
  const ext = path.split('.').pop().toLowerCase();
  if (ext === 'doc') {
    ElMessageBox.confirm('暂不支持线上预览.doc文件,是否下载查看?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning' }).then(() => {
    ElMessageBox.confirm('暂不支持线上预览.doc、.xls、.xlsx文件,是否下载查看?', '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning' }).then(() => {
      window.open(`${import.meta.env.VITE_APP_BASE_API}/${path}`, '_blank');
    }).catch(() => {
      console.log('取消预览')
@@ -252,7 +304,133 @@
  }
}
const downloadFile = (e)=>{
  axios.get(import.meta.env.VITE_APP_BASE_API + '/' +e.filePath,{headers:{'Content-Type': 'application/json','Authorization': `${getToken()}`},responseType: 'blob'}).then(res=>{
    if (res) {
      const link = document.createElement('a')
      let blob = new Blob([res.data],{type: res.data.type})
      link.style.display = "none";
      link.href = URL.createObjectURL(blob); // 创建URL
      link.setAttribute("download", e.fileName);
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
    } else {
      ElMessage({
        type: 'warning',
        message: '文件读取失败'
      });
    }
  })
}
const sendReviewMsg = (val) =>{
  ElMessageBox.confirm(
      '确定发送审核此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const res = await sendReview(val.id)
        if(res.code == 200){
          ElMessage.success('数据发送成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
const handleSelectionChange = (val) => {
  choosedData.value = val
}
const exportData = () => {
  if(choosedData.value && choosedData.value.length === 0){
    ElMessage.warning('请选择需要导出的数据')
  }else {
    startGeneration()
  }
}
const templatePath = ref('/projectReviewExample.docx')
const startGeneration = async () => {
  const data = JSON.parse(JSON.stringify(choosedData.value))
  for(const item of data){
    item.leaderList = await Promise.all(
        item.reviewUsers
            .filter(user => user.reviewType === '评审组长')
            .map(async (x, index) => {
              let signBase64 = '';
              if (x.sign != '') {
                try {
                  const url = import.meta.env.VITE_APP_BASE_API + '/' + x.sign;
                  signBase64 = await imageUrlToBase64(url, {
                    format: 'png',
                    quality: 0.8
                  });
                } catch (err) {
                  signBase64 = '';
                }
              }
              return {
                ...x,
                first: index === 0,
                sign: signBase64 || '',
                reviewOpinionName: x.reviewOpinion == 1 ? '同意':x.reviewOpinion == 2 ? '不同意':'',
                reviewTime: x.reviewTime ?x.reviewTime: ''
              };
            })
    );
    item.leaderAgre = item.leaderList.filter(item => item.reviewOpinion == 1)
    // 2. 处理 peopleList:同样用 Promise.all 等待异步完成
    item.peopleList = await Promise.all(
        item.reviewUsers
            .filter(user => user.reviewType === '评审组员')
            .map(async (x, index) => {
              let signBase64 = '';
              if (x.sign != '') {
                try {
                  const url = import.meta.env.VITE_APP_BASE_API + '/' + x.sign;
                  signBase64 = await imageUrlToBase64(url, {
                    format: 'png',
                    quality: 0.8
                  });
                } catch (err) {
                  signBase64 = '';
                }
              }
              return {
                ...x,
                first: index === 0,
                sign: signBase64 || '',
                reviewOpinionName: x.reviewOpinion == 1 ? '同意':x.reviewOpinion == 2 ? '不同意':'',
                reviewTime: x.reviewTime ?x.reviewTime: ''
              };
            })
    );
    item.productItems = item.productItems.map(i => i.fileName)
    console.log('item.productItems', item.productItems)
    try {
      generateWordDocument(templatePath.value, item, item.itemName + `_${item.stage}审批表.docx`);
    } catch (error) {
      ElMessage({
        type: 'warning',
        message: '导出失败'
      });
    }
  }
}
const changeCom = () => {
  getProjectList()
}
const isRowSelectable = (row) => {
  return row.type !== 2;
}
</script>