zhouwx
2 天以前 9e4ea4987852902539e91ec438150c1deaa89742
修改
已修改4个文件
已添加2个文件
602 ■■■■■ 文件已修改
public/fileProjectExample.docx 补丁 | 查看 | 原始文档 | blame | 历史
src/api/selfProblems/productFile.js 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/components/dataDialog.vue 49 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/index.vue 121 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectSet/components/editDialog.vue 202 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectSet/index.vue 189 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/fileProjectExample.docx
Binary files differ
src/api/selfProblems/productFile.js
@@ -41,3 +41,44 @@
    })
}
//项目
export function getProductSetPage(params) {
    return request({
        url: '/quality-target/item/list',
        method: 'get',
        params: params
    })
}
export function getProductSet(params) {
    return request({
        url: '/quality-target/item/listAll',
        method: 'get',
        params: params
    })
}
export function addProductSet(data) {
    return request({
        url: '/quality-target/item/insert',
        method: 'post',
        data: data
    })
}
export function editProductSet(params) {
    return request({
        url: `/quality-target/item/update`,
        method: 'post',
        data: params
    })
}
export function delProductSet(data) {
    return request({
        url: `/quality-target/item/deleted?itemId=${data}`,
        method: 'get'
    })
}
src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/components/dataDialog.vue
@@ -9,6 +9,21 @@
        :close-on-click-modal="false"
    >
      <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="150px" >
        <el-form-item  label="项目名称:" prop="itemId">
          <el-select v-model="state.form.itemId"
           filterable
           placeholder="请选择"
           clearable style="width: 100%"
          >
            <el-option
                v-for="item in state.projectList"
                :key="item.id"
                :label="item.itemName"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="文件编号:" prop="number">
          <el-input v-model.trim="state.form.number" :disabled="state.title =='查看'" placeholder="文件编号"></el-input>
        </el-form-item>
@@ -46,7 +61,8 @@
import {getToken} from "@/utils/auth";
import {delPic} from "@/api/onlineEducation/banner";
import {addFile, editFile} from "@/api/qualityManage/range";
import {addProductFile, editProductFile} from "@/api/selfProblems/productFile";
import {addProductFile, editProductFile, getProductSet} from "@/api/selfProblems/productFile";
import Cookies from "js-cookie";
const emit = defineEmits(["getList"]);
const dialogVisible = ref(false)
@@ -61,12 +77,14 @@
    companyId: null,
    catalogueId: null,
    erdact: '',
    number: ''
    number: '',
    itemId: null
  },
  formRules:{
    number: [{ required: true, message: '请输入材料编号', trigger: 'blur' }],
    fileName: [{ required: true, message: '请输入材料名称', trigger: 'blur' }],
    filePath: [{ required: true, message: '请上传文件', trigger: 'blur' }],
    itemId: [{ required: true, message: '请选择项目', trigger: 'blur' }],
  },
  isAdmin: false,
  companyList: [],
@@ -76,16 +94,21 @@
    Authorization: getToken()
  },
  fileLimit: 1,
  fileList: []
  fileList: [],
  projectList: [],
  userId: null,
})
onMounted(() => {
});
const openDialog = async (type, value,companyId,catalogueId) => {
const openDialog = async (type, value,companyId,catalogueId,userId) => {
  const userInfo = JSON.parse(Cookies.get('userInfo'))
  state.isAdmin = userInfo.userType === 0;
  state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看'
  state.form.companyId = companyId
  state.form.catalogueId = catalogueId
  state.userId = userId
  state.form.type = 2
  if(state.title == '编辑'||state.title == '查看'){
    Object.keys(state.form).forEach(key => {
@@ -100,8 +123,23 @@
      }
      state.fileList = [obj]
    }
    state.form.itemId = state.form.itemId == 0 ? null : state.form.itemId
  }
  await getProjectList()
  dialogVisible.value = true
}
const getProjectList = async () => {
  const param = {
    companyId: state.form.companyId,
    userId: state.isAdmin ? null : state.userId
  }
  const res = await getProductSet(param);
  if(res.code === 200){
    state.projectList = res.data
  }else{
    ElMessage.warning(res.message)
  }
}
const onSubmit = async () => {
@@ -192,7 +230,8 @@
    companyId: null,
    catalogueId: null,
    erdact: '',
    number: ''
    number: '',
    itemId: null
  }
  state.fileList = []
  superRef.value.clearValidate();
src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectFile/index.vue
@@ -22,6 +22,26 @@
            />
          </el-select>
        </el-form-item>
        <el-form-item style="margin-left: 15px" label="项目名称:">
          <el-select v-model="data.queryParams.itemId"
                     filterable
                     placeholder="请选择"
                     clearable style="width: 100%"
                     @change="changePro"
                    >
            <el-option
                v-for="item in data.projectList"
                :key="item.id"
                :label="item.itemName"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item style="margin-left: 15px">
          <el-button  type="primary" @click="query">查询</el-button>
          <el-button  type="primary" plain @click="reset">重置</el-button>
        </el-form-item>
        <el-form-item>
          <el-button
              style="margin-left: 15px"
@@ -67,6 +87,7 @@
          <el-table style="margin:15px 0;width: 100%" :data="state.form.dataList" :border="true" >
            <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
            <el-table-column label="目录" prop="catalogueName" align="center" width="130"  :show-overflow-tooltip="true" />
            <el-table-column label="项目名称" prop="itemName" align="center" width="130"  :show-overflow-tooltip="true" />
            <el-table-column label="文件编号" prop="number" align="center"  />
            <el-table-column label="文件名称" prop="fileNameSimple" align="center"  />
            <el-table-column label="文件" prop="fileName" align="center" >
@@ -113,7 +134,7 @@
import axios from "axios";
import TEditor from "@/components/Tinymce/Tinymce.vue";
import {renderAsync} from "docx-preview";
import {delProductFile, getProductFilePage} from "@/api/selfProblems/productFile";
import {delProductFile, getProductFilePage, getProductSet} from "@/api/selfProblems/productFile";
import {generateWordDocument} from "@/utils/exportWord";
const { proxy } = getCurrentInstance();
@@ -128,9 +149,12 @@
  queryParams: {
    type: 3,
    companyId: null,
    itemId: null,
  },
  companyList: [],
  projectList: [],
  isAdmin: false,
  userId: null,
  defaultProps: {
    children: 'children',
    label: 'name',
@@ -154,6 +178,8 @@
  const userInfo = JSON.parse(Cookies.get('userInfo'))
  console.log("userInfo",userInfo)
  data.isAdmin = userInfo.userType === 0;
  data.userId = userInfo.id
  if(data.isAdmin){
    await getCompanyList()
    data.queryParams.companyId = data.companyList[0].id
@@ -163,6 +189,7 @@
    data.queryParams.companyId = userInfo.companyId
    state.form.companyId = userInfo.companyId
  }
  await getProjectList()
  await getList();
  if(data.treeData.length >0){
    // state.form.catalogueId = data.treeData[0].id
@@ -171,7 +198,24 @@
  }
})
const getProjectList = async () => {
  const param = {
    companyId: data.queryParams.companyId,
    userId: data.isAdmin ? null : data.userId
  }
  const res = await getProductSet(param);
  if(res.code === 200){
    data.projectList = res.data
    // if(res.data && res.data.length >0 ){
    //   data.queryParams.itemId = res.data[0].id
    // }
  }else{
    ElMessage.warning(res.message)
  }
}
const getList = async () => {
  data.treeData = [];
  loading.value = true;
@@ -263,15 +307,23 @@
      state.form.companyId = item.id
    }
  })
  await getList()
  if(data.treeData.length >0 ){
    // state.form.catalogueId = data.treeData[0].id
    // currentSelectedKey.value = state.form.catalogueId
    await getFileList()
  }else {
    state.form.dataList = []
  }
  data.projectList = []
  data.queryParams.itemId = null
  await getProjectList()
  // await getList()
  // if(data.treeData.length >0 ){
  //   // state.form.catalogueId = data.treeData[0].id
  //   // currentSelectedKey.value = state.form.catalogueId
  //   await getFileList()
  // }else {
  //   state.form.dataList = []
  // }
}
const changePro = () => {
  state.form.id = ''
  state.form.catalogueId = null
}
const handleNodeClick = async (val) => {
@@ -318,11 +370,21 @@
  }
}
const openDataDialog = (type, value) => {
  if(type =='edit'){
    state.form.catalogueId = value.catalogueId
  }
  if(!state.form.catalogueId){
    ElMessage.warning('请先选择左侧目录!')
    return
  }
  dialogRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId);
  dialogRef.value.openDialog(type, value, state.form.companyId,state.form.catalogueId,data.userId);
  nextTick(() => {
    if(!currentSelectedKey.value){
      state.form.catalogueId = null
    }
  })
}
const openRecordDialog = (type, value) => {
  if(!state.form.catalogueId){
@@ -392,23 +454,47 @@
}
const reset = async () => {
  data.queryParams = {
    companyId: '',
    companyId: data.isAdmin ? null : data.queryParams.companyId,
    pageNum: 1,
    pageSize: 10,
    itemId: null,
  }
  state.form.id = ''
  state.form.catalogueId = null
  data.companyList = [];
  data.treeData = []
  if(data.isAdmin){
    await  getCompanyList()
    data.queryParams.companyId = data.companyList[0].id
    data.queryParams.companyName = data.companyList[0].name
    state.form.companyId = data.companyList[0].id
  }
  await getProjectList();
  await getList();
  await  getCompanyList()
  data.queryParams.companyId = data.companyList[0].id
  data.queryParams.companyName = data.companyList[0].name
  state.form.companyId = data.companyList[0].id
  if(data.treeData.length >0 ){
    await getFileList()
  }else {
    state.form.dataList = []
  }
}
const query = async () => {
  await getList()
  if(data.treeData.length >0 ){
    await getFileList()
  }else {
    state.form.dataList = []
  }
}
const getFileList = async () => {
  const queryParams = {
    companyId: state.form.companyId,
    catalogueId: state.form.catalogueId,
    type: 2
    type: 2,
    itemId: data.queryParams.itemId
  }
  const res = await getProductFilePage(queryParams)
  if (res.code == 200) {
@@ -534,6 +620,8 @@
    }
  })
  const caralogList = idGroupToTree(dataList)
  const itemList = idGroupToTree(data.projectList)
  table.tableList = caralogList.map((item,index) => {
    return {
      ...item,
@@ -565,6 +653,7 @@
    children: items
  }));
}
</script>
<style scoped lang="scss">
src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectSet/components/editDialog.vue
对比新文件
@@ -0,0 +1,202 @@
<template>
  <div class="notice">
    <el-dialog
        v-model="dialogVisible"
        :title="title"
        width="550px"
        :before-close="handleClose"
        :close-on-press-escape="false"
        :close-on-click-modal="false"
    >
      <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules"  label-width="150px" >
        <el-form-item label="企业名称:" prop="companyId" v-if="state.isAdmin">
          <el-select v-model="state.form.companyId" filterable placeholder="请选择"  @change="selectValueCom"   clearable style="width: 100%" :disabled="title == '查看' || title == '编辑' || !state.isAdmin">
            <el-option
                v-for="item in state.companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="项目名称:" prop="itemName" >
          <el-input v-model="state.form.itemName" placeholder="项目名称" :disabled="title === '查看'"/>
        </el-form-item>
        <el-form-item label="项目参与人员:"  prop="users" >
          <el-select
              clearable
              multiple
              collapse-tags
              collapse-tags-tooltip
              v-model="state.students"
              :disabled="state.title =='查看'"
              filterable
              style="width: 100%"
          >
            <el-option
                v-for="item in state.peopleList"
                :key="item.id"
                :label="item.name"
                :value="item.id"
            />
          </el-select>
        </el-form-item>
      </el-form>
      <template #footer v-if="title !== '查看'">
        <span class="dialog-footer">
            <el-button @click="handleClose" size="default">取 消</el-button>
            <el-button type="primary"   @click="onSubmit" size="default" v-preReClick>确认</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import {nextTick, onMounted, reactive, ref, toRefs} from 'vue'
import {ElMessage} from "element-plus";
import Cookies from "js-cookie";
import {getUser} from "@/api/onlineEducation/user";
import {addProductSet, editProductSet} from "@/api/selfProblems/productFile";
const dialogVisible = ref(false);
const title = ref("");
const busRef = ref();
const length = ref()
const emit = defineEmits(["getList"]);
const state = reactive({
  form: {
    id: '',
    companyId: null,
    itemName: '',
    users: []
  },
  formRules:{
    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
    itemName: [{ required: true, message: '请输入项目名称', trigger: 'blur' }],
    users: [{ required: true, message: '请选择项目参与人员', trigger: 'blur' }],
  },
  isAdmin: false,
  companyList: [],
  students: []
})
onMounted(() => {
})
const openDialog = async (type, value,companyList) => {
  const userInfo = JSON.parse(Cookies.get('userInfo'))
  state.isAdmin = userInfo.userType === 0;
  if(state.isAdmin){
    state.companyList = companyList
  }
  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
  if(type === 'edit' || type === 'review') {
    state.form = JSON.parse(JSON.stringify(value));
    state.students = state.form.users.map(i => i.userId)
  }
  await  getPeopleList()
  dialogVisible.value = true;
}
const onSubmit = async () => {
  state.form.users = state.students.map(item => {
    return {
      userId: item
    }
  })
  const valid = await busRef.value.validate();
  if(!state.isAdmin){
    const userInfo = JSON.parse(Cookies.get('userInfo'))
    state.form.companyId = userInfo.companyId
  }
  if(valid){
    if(title.value === '新增'){
      const {id, ...data} = JSON.parse(JSON.stringify(state.form))
      const res = await addProductSet(data)
      if(res.code === 200){
        ElMessage({
          type: 'success',
          message: '新增成功'
        });
      }else{
        ElMessage.warning(res.message)
      }
      emit("getList")
      busRef.value.clearValidate();
      reset();
      dialogVisible.value = false;
    }else if(title.value === '编辑'){
      const {...data} = JSON.parse(JSON.stringify(state.form))
      const res = await editProductSet(data)
      if(res.code === 200){
        ElMessage({
          type: 'success',
          message: '编辑成功'
        });
      }else{
        ElMessage.warning(res.message)
      }
      emit("getList")
      busRef.value.clearValidate();
      reset();
      dialogVisible.value = false;
    }
  }
}
const handleClose = () => {
  busRef.value.clearValidate();
  reset();
  dialogVisible.value = false;
  emit("getList")
}
const getPeopleList = async ()=> {
  if(state.isAdmin && !state.form.companyId && (state.form.companyId == 0 || state.form.companyId == null)){
    return
  }
  const queryParams = {
    pageNum: 1,
    pageSize: 9999,
    companyId: state.form.companyId
  }
  const res = await getUser(queryParams)
  if(res.code == 200){
    state.peopleList = res.data.list?res.data.list:[]
  }else{
    ElMessage.warning(res.message)
  }
};
const selectValueCom = () => {
  state.students = []
  state.form.users = []
  getPeopleList()
}
const reset = () => {
  state.form = {
    id: '',
    companyId: null,
    itemName: '',
    users: []
  }
  state.companyList = []
  state.students = []
}
defineExpose({
  openDialog
});
</script>
<style scoped lang="scss">
.notice{
  :deep(.el-form .el-form-item__label) {
    font-size: 15px;
  }
  .file {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
  }
}
</style>
src/views/build/conpanyFunctionConsult/digitalFileDep/project/projectSet/index.vue
对比新文件
@@ -0,0 +1,189 @@
<template>
  <div class="app-container">
    <div style="display: flex;justify-content: space-between">
      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
        <el-form-item>
          <el-button
              v-if="userTpye == 0 || userTpye == 6"
              type="primary"
              plain
              icon="Plus"
              @click="openDialog('add',{})"
          >新增</el-button>
        </el-form-item>
        <el-form-item v-if="isAdmin" label="企业:" >
          <el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
            <el-option
                v-for="item in companyList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item v-if="isAdmin">
          <el-button  type="primary" @click="getList">查询</el-button>
          <el-button  type="primary" plain @click="reset">重置</el-button>
        </el-form-item>
      </el-form>
    </div>
    <!-- 表格数据 -->
    <el-table v-loading="loading" :data="dataList" :border="true">
      <el-table-column label="序号" type="index" align="center" width="80"/>
      <el-table-column label="项目名称" prop="itemName" align="center" />
      <el-table-column label="项目参与人员" align="center" >
        <template #default="scope">
          <div style="display: flex;flex-wrap: wrap;align-items: center;justify-content: center">
            <div v-for="(item,index) in scope.row.users" style="display: flex" >{{item.userName}}<div v-if="scope.row.users && index !=scope.row.users.length -1" style="margin-right: 2px"> , </div></div>
          </div>
        </template>
      </el-table-column>
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" v-if="userTpye == 0 || userTpye == 6">
        <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>
        </template>
      </el-table-column>
    </el-table>
    <pagination
        v-show="total > 0"
        :total="total"
        v-model:page="queryParams.pageNum"
        v-model:limit="queryParams.pageSize"
        @pagination="getList"
    />
    <edit-dialog ref="dialogRef" @getList=getList></edit-dialog>
  </div>
</template>
<script setup>
import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import {delCompany, getCompany} from "@/api/onlineEducation/company";
import editDialog from './components/editDialog.vue'
import useUserStore from "@/store/modules/user";
import {delProductSet, getProductSetPage} from "@/api/selfProblems/productFile";
import Cookies from "js-cookie";
const userStore = useUserStore()
const { proxy } = getCurrentInstance();
const loading = ref(false);
const dialogRef = ref();
const data = reactive({
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    companyId: null,
    industryType: null,
    type: '',
    templateName: ''
  },
  total: 0,
  dataList: [],
  companyList: [],
  industryList: [],
  isAdmin: false,
  typeList: [],
  exportDialog: false,
});
const state = reactive({
  form: {
    id: null,
    filePath: '',
    companyId: null
  },
  formRules:{
    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
  },
  exportFileList: [],
})
const { queryParams, total, dataList,companyList,industryList, isAdmin } = toRefs(data);
const userTpye = ref()
onMounted(async ()=>{
  const userInfo = JSON.parse(Cookies.get('userInfo'))
  userTpye.value = userInfo.userType
  if(userStore.roles.includes('admin')){
    data.isAdmin = true
    data.queryParams.companyId = null
    await getCompanyList()
  }else{
    data.isAdmin = false
    data.queryParams.companyId = userStore.companyId
  }
  await getList()
})
onUnmounted(()=>{
})
const getList = async () => {
  loading.value = true
  const res = await getProductSetPage(data.queryParams)
  if(res.code == 200){
    data.dataList = res.data.list
    data.total = res.data.total
  }else{
    ElMessage.warning(res.message)
  }
  loading.value = false
}
const getCompanyList = async ()=>{
  const queryParams = {
    pageNum: 1,
    pageSize: 999
  }
  const res = await getCompany(queryParams)
  if (res.code == 200) {
    data.companyList = res.data.list?res.data.list:[]
  } else {
    ElMessage.warning(res.message)
  }
}
const openDialog = (type, value) => {
  dialogRef.value.openDialog(type, value, data.companyList);
}
/** 重置新增的表单以及其他数据  */
const reset= async()=> {
  if(data.isAdmin){
    data.queryParams = {
      pageNum: 1,
      pageSize: 10,
      companyId: null,
    }
    await getCompanyList()
  }else {
    data.queryParams = {
      pageNum: 1,
      pageSize: 10,
      companyId: data.queryParams.companyId,
    }
  }
  await getList()
}
const handleDelete = (val) => {
  ElMessageBox.confirm(
      '确定删除此条数据?',
      '提示',
      {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
      .then( async() => {
        const res = await delProductSet(val.id)
        if(res.code == 200){
          ElMessage.success('数据删除成功')
          await getList()
        }else{
          ElMessage.warning(res.message)
        }
      })
}
</script>