zhouwx
3 小时以前 c5f4bef2a867c3da79555a95b60a7c4d5c295f0e
src/views/work/marketingManagement/contractManagement/contractChange/components/editDialog.vue
@@ -40,7 +40,7 @@
        <el-row :gutter="24">
          <el-col :span="8">
            <el-form-item label="合同:" prop="contractId" >
              <el-select clearable v-model="state.form.contractId" :disabled="title =='查看'" filterable>
              <el-select clearable v-model="state.form.contractId" :disabled="title =='查看'" filterable @change="changeContract">
                <el-option
                    v-for="item in state.contractList"
                    :key="item.id"
@@ -63,12 +63,12 @@
          </el-col>
          <el-col :span="8">
            <el-form-item label="记录人:" prop="registrantId">
              <el-select clearable v-model="state.form.registrantId" :disabled="title =='查看'" filterable  style="width: 240px;margin-bottom: 5px">
              <el-select clearable v-model="state.form.registrantId" :disabled="title =='查看'" filterable  style="width: 240px;margin-bottom: 5px" @change="changeRegistrant">
                <el-option
                    v-for="item in state.peopleList"
                    :key="item.id"
                    :key="item.userId"
                    :label="item.name"
                    :value="item.id"
                    :value="item.userId"
                />
              </el-select>
            </el-form-item>
@@ -210,43 +210,60 @@
              <div style="display: flex;width: 100%;">
                <el-table :data="state.form.reviewMesses" :border="true" >
                  <el-table-column type="index" label="序号"  align="center"></el-table-column>
                  <el-table-column :label="state.form.type == 1 ? '评审部门' :'变更部门' " prop="deptName" align="center" >
                  <el-table-column :label="state.form.type == 1 ? '评审部门' :'变更部门' " prop="deptId" align="center" >
                    <template  #default="{row,$index}">
                      <el-form-item :prop="'reviewMesses.' + '[' + $index + ']' + 'deptName'" :rules="state.rules.deptName">
                        <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="row.deptName" placeholder="请输入"></el-input>
                      <el-form-item :prop="'reviewMesses.' + '[' + $index + ']' + 'deptId'" :rules="state.rules.deptId" >
                        <el-select
                            :disabled="title === '查看'"
                            v-model="row.deptId"
                            placeholder="请选择部门"
                            style="width: 240px"
                            @change="changeDept"
                        >
                          <el-option
                              v-for="item in state.deptList"
                              :key="item.deptId"
                              :label="item.deptName"
                              :value="item.deptId"
                          />
                        </el-select>
                      </el-form-item>
                    </template>
                  </el-table-column>
                  <el-table-column :label="state.form.type == 1 ? '评审内容(含风险)' :'变更内容(含风险)' " prop="reviewMess" align="center" >
                    <template #default="{row,$index}">
                      <div v-for="(i,index) in row.contractReviewMessbs" :key="index">
                        <el-form-item :prop="'reviewMesses.' + '[' + $index + '].' +'contractReviewMessbs.' + '[' + index + ']' + '.reviewMess'" :rules="state.rules.reviewMess">
                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="i.reviewMess" placeholder="请输入"></el-input>
<!--                      <div v-for="(i,index) in row.contractReviewMessbs" :key="index">-->
                        <el-form-item :prop="'reviewMesses.' + '[' + $index + ']' + 'reviewMess'" :rules="state.rules.reviewMess">
                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="row.reviewMess" placeholder="请输入"></el-input>
                        </el-form-item>
                      </div>
<!--                      </div>-->
                    </template>
                  </el-table-column>
                  <el-table-column :label="state.form.type == 1 ? '评审意见' :'变更意见' " prop="reviewOpinion" align="center">
                    <template #default="{row,$index}">
                      <div v-for="(i,index) in row.contractReviewMessbs" :key="index">
                        <el-form-item :prop="'reviewMesses.' + '[' + $index + '].' +'contractReviewMessbs.' + '[' + index + ']' + '.reviewOpinion'" :rules="state.rules.reviewOpinion">
                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="i.reviewOpinion" placeholder="请输入"></el-input>
                        <el-form-item :prop="'reviewMesses.' + '[' + $index + ']' + 'reviewOpinion'" :rules="state.rules.reviewOpinion">
                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="row.reviewOpinion" placeholder="请输入"></el-input>
                        </el-form-item>
                      </div>
                    </template>
                  </el-table-column>
                  <el-table-column label="签字" prop="reviewSign" align="center" >
                  <el-table-column label="人员" prop="reviewUser" align="center" >
                    <template #default="{row,$index}">
                      <div v-for="(i,index) in row.contractReviewMessbs" :key="index">
                        <el-form-item :prop="'reviewMesses.' + '[' + $index + '].' +'contractReviewMessbs.' + '[' + index + ']' + '.reviewSign'" :rules="state.rules.reviewSign">
                          <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="i.reviewSign" placeholder="请输入"></el-input>
                        <el-form-item :prop="'reviewMesses.' + '[' + $index + ']' + 'reviewUser'" :rules="state.rules.reviewUser">
                          <el-select clearable v-model="row.reviewUser" :disabled="title =='查看'" filterable  style="width: 240px;margin-bottom: 5px" @change="changeReviewUser($event,$index)">
                            <el-option
                                v-for="item in state.peopleList"
                                :key="item.userId"
                                :label="item.name"
                                :value="item.userId"
                            />
                          </el-select>
                        </el-form-item>
                      </div>
                    </template>
                  </el-table-column>
                  <el-table-column label="操作" align="center"  v-if="title !== '查看'" >
                    <template #default="scope">
                      <el-button link type="primary"  @click="addObject(scope.row,scope.$index)" >添加</el-button>
<!--                      <el-button link type="primary"  @click="addObject(scope.row,scope.$index)" >添加</el-button>-->
                      <el-button link type="danger"  @click="delContent(scope.row,scope.$index)" >删除</el-button>
                    </template>
                  </el-table-column>
@@ -266,12 +283,12 @@
        <el-row :gutter="24">
          <el-col :span="12">
            <el-form-item label="法人/委托代理人签字:" prop="legalPerson" >
              <el-select clearable v-model="state.form.legalPerson" :disabled="title =='查看'" filterable  style="width: 240px;margin-bottom: 5px">
              <el-select clearable v-model="state.form.legalPerson" :disabled="title =='查看'" filterable  style="width: 240px;margin-bottom: 5px" @change="changeLegal">
                <el-option
                    v-for="item in state.peopleList"
                    :key="item.id"
                    :key="item.userId"
                    :label="item.name"
                    :value="item.id"
                    :value="item.userId"
                />
              </el-select>
            </el-form-item>
@@ -303,7 +320,7 @@
import Cookies from "js-cookie";
import {getCompany} from "@/api/onlineEducation/company";
import {ElMessage} from "element-plus";
import {getUser} from "@/api/onlineEducation/user";
import {getEmployeeRecordList, getEmployeeRecords, getUser} from "@/api/onlineEducation/user";
import {getDept, getObject, getObjectPage} from "@/api/qualityObjectives/object";
import {addTable, editTable, getTargetById} from "@/api/qualityObjectives/table";
import {addNeedDiscren, editNeedDiscren} from "@/api/need/need";
@@ -311,6 +328,11 @@
import {getCustomer} from "@/api/customerList";
import {getLedger} from "@/api/contractLedger";
import {verifyPhone} from "@/utils/validate";
import {generateWordDocument} from "@/utils/exportWord";
import PizZip from "pizzip";
import docxtemplater from "docxtemplater";
import axios from "axios";
import {getToken} from "@/utils/auth";
const dialogVisible = ref(false);
const title = ref("");
@@ -351,7 +373,12 @@
    legalTime: "",
    suggest: '',
    contractReviewRequires: [],
    reviewMesses: []
    reviewMesses: [],
    filePath:'',
    fileName:'',
    registrantName:'',
    legalName:'',
    number:''
  },
  rules: {
    companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
@@ -370,16 +397,16 @@
    riskMess: [{ required: true, message: '请输入风险识别', trigger: 'blur' }],
    legalPerson: [{ required: true, message: '请选择法人', trigger: 'blur' }],
    legalTime: [{ required: true, message: '请选择日期', trigger: 'blur' }],
    suggest: [{ required: true, message: '请输入评审意见', trigger: 'blur' }],
    // suggest: [{ required: true, message: '请输入评审意见', trigger: 'blur' }],
    productName: [{required: true, message: "", trigger: "blur"}],
    pecification: [{required: true, message: "", trigger: "blur"}],
    amount: [{required: true, message: "", trigger: "blur"}],
    price: [{required: true, message: "", trigger: "blur"}],
    // remark: [{required: true, message: "", trigger: "blur"}],
    deptName:[{required: true, message: "", trigger: "blur"}],
    deptId:[{required: true, message: "", trigger: "blur"}],
    reviewMess:[{required: true, message: "", trigger: "blur"}],
    reviewOpinion:[{required: true, message: "", trigger: "blur"}],
    reviewSign:[{required: true, message: "", trigger: "blur"}],
    // reviewOpinion:[{required: true, message: "", trigger: "blur"}],
    reviewUser:[{required: true, message: "", trigger: "blur"}],
    contractReviewRequires:[{ required: true, message: '请填写顾客明示的要求及用途表', trigger: 'blur' }],
    reviewMesses:[{ required: true, message: '请填写评审/变更内容表', trigger: 'blur' }],
  },
@@ -424,10 +451,25 @@
  }
  await getContractList()
  await getPeopleList()
  await getDeptList()
  dialogVisible.value = true;
}
const getDeptList = async () => {
  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
    return
  }
  const param = {
    pageNum: 1,
    pageSize: 999,
    companyId: state.form.companyId
  }
  const res = await getDept(param)
  if(res.code === 200){
    state.deptList = res.data
  }
}
const onSubmit = async () => {
  await generateAndUpload()
  const valid = await busRef.value.validate();
  if(valid){
    if(title.value === '新增'){
@@ -467,6 +509,50 @@
    }
  }
}
const templatePath = ref()
const generateAndUpload = async () => {
  try {
    const data = JSON.parse(JSON.stringify(state.form))
    data.contractReviewRequires = data.contractReviewRequires.map(item => {
      return{
        ...item,
        remark: item.remark ? item.remark : ' '
      }
    })
    templatePath.value = data.type == 1 ?  '/contractReviewExample.docx' : '/contractChangeExample.docx'
    const msg = data.type == 1 ? '评审' : '变更'
    const response = await fetch(templatePath.value) // public目录下的文件可直接通过/访问
    if (!response.ok) {
      throw new Error('模板文件加载失败')
    }
    const templateContent = await response.arrayBuffer()
    const zip = new PizZip(templateContent)
    const doc = new docxtemplater(zip, {
      paragraphLoop: true,
      linebreaks: true
    })
    doc.setData(data)
    doc.render()
    const out = doc.getZip().generate({
      type: 'blob',
      mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
    })
    const file = new File([out],`合同${msg}表.docx`, {
      type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
    })
    const formData = new FormData()
    formData.append('file', file)
    const uploadResponse = await axios.post(import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', formData, {
      headers: {
        Authorization: getToken()
      },
    })
      state.form.fileName = uploadResponse.data.data.originName
      state.form.filePath = uploadResponse.data.data.path
  } catch (error) {
  }
}
const getContractList = async () => {
  if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
    return
@@ -486,13 +572,11 @@
    return
  }
  const queryParams = {
    pageNum: 1,
    pageSize: 9999,
    companyId: state.form.companyId
  }
  const res = await getUser(queryParams)
  const res = await getEmployeeRecords(queryParams)
  if(res.code == 200){
    state.peopleList = res.data.list?res.data.list:[]
    state.peopleList = res.data?res.data:[]
  }else{
    ElMessage.warning(res.message)
  }
@@ -525,7 +609,12 @@
    legalTime: "",
    suggest: '',
    contractReviewRequires: [],
    reviewMesses: []
    reviewMesses: [],
    filePath:'',
    fileName:'',
    registrantName:'',
    legalName:'',
    number:''
  }
  state.companyList = []
  state.contractList = []
@@ -541,6 +630,7 @@
      state.form.companyId = item.id
    }
  })
  getDeptList()
  getContractList()
  getPeopleList()
}
@@ -549,15 +639,15 @@
  state.form.contractReviewRequires.push({})
}
const addContentTable = () => {
  state.form.reviewMesses.push({contractReviewMessbs: [{}]})
  state.form.reviewMesses.push({})
}
const addObject = (val,itemIndex) => {
  state.form.reviewMesses.forEach((item,index) => {
    if(index == itemIndex){
      item.contractReviewMessbs.push({})
    }
  })
}
// const addObject = (val,itemIndex) => {
//   state.form.reviewMesses.forEach((item,index) => {
//     if(index == itemIndex){
//       item.contractReviewMessbs.push({})
//     }
//   })
// }
const delProduct = (val,itemIndex) => {
  state.form.contractReviewRequires.forEach((item,index) => {
    if(index == itemIndex){
@@ -568,14 +658,37 @@
const delContent = (val,itemIndex) => {
  state.form.reviewMesses.forEach((item,index) => {
    if(index == itemIndex){
      if(item.contractReviewMessbs.length == 1){
        state.form.reviewMesses.splice(index,1)
      }else {
        item.contractReviewMessbs.pop()
      }
      state.form.reviewMesses.splice(index,1)
    }
  })
}
const changeRegistrant = (val) => {
  const obj = state.peopleList.find(i => i.userId == val)
  state.form.registrantName = obj.name
}
const changeLegal = (val) => {
  const obj = state.peopleList.find(i => i.userId == val)
  state.form.legalName = obj.name
}
const changeReviewUser = (val,index) => {
  const obj = state.peopleList.find(i => i.userId == val)
  state.form.reviewMesses[index].reviewName = obj.name
}
const changeContract = (val) => {
  const obj = state.contractList.find(i => i.id == val)
  state.form.number = obj.number
}
const changeDept = (val) => {
  const obj = state.deptList.find(i => i.deptId == val)
  state.form.deptName = obj.deptName
}
defineExpose({
  openDialog