Browse Source

Merge remote-tracking branch 'origin/master'

sangwenwei 1 year ago
parent
commit
ac97ff7032

+ 7 - 0
src/api/cw/projectRecords/ProjectRecordsService.js

@@ -100,6 +100,13 @@ export default {
 			method: "get",
 		});
 	},
+	partialCustomerInfoList: function (params) {
+		return request({
+			url: prefix + "/cwProjectRecords/partialCustomerInfoList",
+			method: "get",
+			params: params,
+		});
+	},
 	getContractClientList: function (params) {
 		return request({
 			url: prefix + "/cw_work_client/info/getContractClientList",

+ 168 - 0
src/views/cw/projectRecords/CwConstructionForm.vue

@@ -0,0 +1,168 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :close-on-click-modal="false"
+	  draggable
+      width="1100px"
+      height="500px"
+      @close="close"
+      v-model="visible">
+      <div style="height: calc(100% - 80px);">
+          <el-form size="small" :inline="true" class="query-form" ref="searchForm" :model="searchForm" @submit.native.prevent>
+            <!-- 搜索框-->
+            <el-form-item label="联系人" prop="clientName">
+              <el-input size="small" v-model="searchForm.clientName" placeholder="请输入联系人" clearable></el-input>
+            </el-form-item>
+            <el-form-item label="客户名称" prop="name">
+              <el-input size="small" v-model="searchForm.name" placeholder="请输入客户名称" clearable></el-input>
+            </el-form-item>
+            <el-form-item label="创建者" prop="createUserName">
+              <el-input size="small" v-model="searchForm.createUserName" placeholder="请输入创建者" clearable></el-input>
+            </el-form-item>
+
+            <el-form-item>
+              <el-button type="primary" @click="list()" size="small" icon="el-icon-search">查询</el-button>
+              <el-button @click="resetSearch()" size="small" icon="el-icon-refresh-right">重置</el-button>
+            </el-form-item>
+          </el-form>
+
+          <vxe-table
+            border="inner"
+            auto-resize
+            resizable
+            height="400px"
+            :loading="loading"
+            size="small"
+            ref="projectTable"
+            show-header-overflow
+            show-overflow
+            highlight-hover-row
+            :menu-config="{}"
+            :print-config="{}"
+            :sort-config="{remote:true}"
+            :data="dataList"
+            :row-config="{isCurrent: true}"
+            :checkbox-config="{trigger: 'row'}"
+          >
+            <vxe-column type="seq" width="60" title="序号"></vxe-column>
+            <vxe-column type="checkbox" width="40px"></vxe-column>
+            <vxe-column min-width="120" align="center" title="施工方名称" field="name"></vxe-column>
+            <vxe-column min-width="160" align="center" title="统一社会信用代码" field="uscCode"></vxe-column>
+            <vxe-column min-width="160" align="center" title="联系人" field="clientName"></vxe-column>
+            <vxe-column min-width="160" align="center" title="联系电话" field="contactFirst"></vxe-column>
+            <vxe-column min-width="160" align="center" title="手机号" field="contactSecond"></vxe-column>
+            <vxe-column min-width="160" align="center" title="创建者" field="createUserName"></vxe-column>
+
+          </vxe-table>
+          <vxe-pager
+            background
+            size="small"
+            :current-page="tablePage.currentPage"
+            :page-size="tablePage.pageSize"
+            :total="tablePage.total"
+            :page-sizes="[10, 20, 100, 1000, {label: '全量数据', value: 1000000}]"
+            :layouts="['PrevPage', 'JumpNumber', 'NextPage', 'FullJump', 'Sizes', 'Total']"
+            @page-change="currentChangeHandle">
+          </vxe-pager>
+        </div>
+		<template #footer>
+			<span class="dialog-footer">
+			  <el-button size="small" @click="close()" icon="el-icon-circle-close">关闭</el-button>
+			  <el-button size="small" type="primary" v-if="method != 'view'" @click="getProgram2()" icon="el-icon-circle-check" v-noMoreClick>确定</el-button>
+			</span>
+		</template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import projectRecordsService from '@/api/cw/projectRecords/ProjectRecordsService'
+  export default {
+    data () {
+      return {
+        title: '联系人选择',
+        method: '',
+        visible: false,
+        loading: false,
+        tablePage: {
+          total: 0,
+          currentPage: 1,
+          pageSize: 10,
+          orders: []
+        },
+        dataList: [],
+        searchForm: {
+          name: '',
+			createUserName: '',
+			clientName: '',
+        },
+        checkType: '',
+        detail: '',
+        num: true // num为true是多选,false是单选
+      }
+    },
+    created () {
+    },
+    components: {
+    },
+    methods: {
+      /**
+       * @param contractId 合同id
+       */
+      init (contractId) {
+        this.visible = true
+        this.list()
+      },
+      // 表单提交
+      getProgram2 () {
+        let rows
+        if (this.commonJS.isEmpty(this.$refs.projectTable.getCheckboxRecords())) {
+          this.$message.error('请至少选择一条数据')
+          return
+        }
+        if (this.num === false) {
+          if (this.$refs.projectTable.getCheckboxRecords().length > 1) {
+            this.$message.error('最多选择一条数据')
+            return
+          }
+        }
+        rows = this.$refs.projectTable.getCheckboxRecords()
+        this.close()
+        this.$emit('getProgram2', rows)
+      },
+      list () {
+        this.loading = true
+        projectRecordsService.partialCustomerInfoList({
+          'current': this.tablePage.currentPage,
+          'size': this.tablePage.pageSize,
+          'orders': this.tablePage.orders,
+          ...this.searchForm
+        }).then((data) => {
+          this.dataList = data.records
+          this.tablePage.total = data.total
+          this.loading = false
+        })
+      },
+      // 当前页
+      currentChangeHandle ({currentPage, pageSize}) {
+        this.tablePage.currentPage = currentPage
+        this.tablePage.pageSize = pageSize
+        this.list()
+      },
+      resetSearch () {
+        this.$refs.searchForm.resetFields()
+        this.list()
+      },
+      close () {
+        this.detail = ''
+        this.visible = false
+      }
+    }
+  }
+</script>
+<style>
+  .messageZindex {
+    z-index:9999 !important;
+  }
+</style>

+ 152 - 14
src/views/cw/projectRecords/ProjectRecordsAddForm.vue

@@ -140,13 +140,14 @@
                   {required: true, message:'请选择项目等级(500万及500万以上为A级,500万以下为B级)', trigger:'blur'}
                ]">
 						  <el-radio-group v-model="inputForm.projectLevel">
-							  <el-radio v-for="item in $dictUtils.getDictList('cw_project_level')" :label="item.value" >{{item.label}}</el-radio>
+							  <el-radio v-for="item in $dictUtils.getDictList('cw_project_level')" :label="item.value">{{item.label}}</el-radio>
 						  </el-radio-group>
 					  </el-form-item>
+					  <div style="color: red; display: block; margin-left: 140px;">500万及500万以上为A级,500万以下为B级</div>
 				  </el-col>
                 <el-col :span="12">
-                  <el-form-item label="项目规模(元)" prop="projectMoney"
-                                :rules="[{required: true, message:'项目规模不能为空', trigger:'blur'}
+                  <el-form-item label="送审规模(万元)" prop="projectMoney"
+                                :rules="[{required: true, message:'送审规模不能为空', trigger:'blur'}
                    ]">
                     <el-input-number
                       v-model="inputForm.projectMoney"
@@ -156,7 +157,7 @@
                       :max="9999999999"
                       :step="0.01"
                       :min="0"
-                      placeholder="请填写项目规模"
+                      placeholder="请填写送审规模"
                       :controls="false"
                       clearable>
                     </el-input-number>
@@ -175,6 +176,7 @@
                         :value="item.value">
                       </el-option>
                     </el-select>
+					  <div style="color: red; display: block; ">与归档资料关联,请仔细选择</div>
                   </el-form-item>
                 </el-col>
                 <!--<el-col :span="12">
@@ -196,7 +198,6 @@
                 <el-col :span="12">
                   <el-form-item label="项目预计时间" prop="planDate"
                                 :rules="[
-                                {required: true, message:'项目预计时间不能为空', trigger:'blur'}
                    ]">
                     <el-date-picker
                       style="width: 100%"
@@ -218,9 +219,23 @@
                    ]">
 <!--                    <UserSelectSignatory :readonly="true" :disabled="status === 'audit' || status === 'taskFormDetail'" :limit='1' :modelValue="inputForm.projectLeaderId" @update:modelValue='(value) => {inputForm.projectLeaderId = value}'></UserSelectSignatory>-->
 					  <UserSelectForQualification :readonly="true" :disabled="method === 'view'" :limit='1' :modelValue="inputForm.projectLeaderId" @update:modelValue='(value) => {inputForm.projectLeaderId = value}'></UserSelectForQualification>
+					  <span style="color: red">必须拥有一级造价师证书</span>
 				  </el-form-item>
                 </el-col>
 				  <el-col :span="12">
+					  <el-form-item label="工程类型" prop="engineeringType"
+									:rules="[
+                                 {required: true, message:'工程类型不能为空', trigger:'blur'}
+                  ]">
+						  <el-tree-select
+							  v-model="inputForm.engineeringType"
+							  :data="engineeringTypeList"
+							  :render-after-expand="false"
+							  style="width: 100%"
+						  />
+					  </el-form-item>
+				  </el-col>
+				  <el-col :span="12">
 					  <el-form-item label="项目经理1" prop="projectMasterId"
 									:rules="[
                    ]">
@@ -416,6 +431,60 @@
                     </el-form>
                   </el-row>
                 </el-tab-pane>
+				  <el-tab-pane name="construction">
+					  <template v-slot:label>
+						  <span> 施工方信息</span>
+					  </template>
+					  <el-row :gutter="15">
+						  <el-button style="margin-bottom: 15px" type="primary" :disabled="status === 'audit' || status === 'taskFormDetail'" @click="openConstructionForm()"  plain>
+							  添加施工方信息联系人
+						  </el-button>
+					  </el-row>
+					  <el-row  :gutter="15">
+						  <el-form :disabled="true" style="width: 100%;">
+							  <vxe-table
+								  border
+								  show-overflow
+								  show-footer
+								  :column-config="{resizable: true}"
+								  ref="construction"
+								  :key="tableKeyConstruction"
+								  class="vxe-table-element"
+								  :data="inputForm.cwProjectConstructionList"
+								  keep-source
+								  style=""
+								  highlight-current-row
+								  :edit-config="{trigger: 'click', mode: 'row', showStatus: false, autoClear: true, icon: '-'}"
+							  >
+								  <vxe-table-column min-width="306" align="center"  field="name" title="施工方单位名称" :edit-render="{}">
+									  <template v-slot:edit="scope">
+										  <el-input v-model="scope.row.name" placeholder="施工方单位名称" clearable></el-input>
+									  </template>
+								  </vxe-table-column>
+								  <vxe-table-column min-width="306" align="center" field="clientName" title="联系人姓名" :edit-render="{}">
+									  <template v-slot:edit="scope">
+										  <el-input v-model="scope.row.clientName" placeholder="联系人姓名" clearable></el-input>
+									  </template>
+								  </vxe-table-column>
+								  <vxe-table-column min-width="307" align="center" field="contactFirst" title="联系方式1" :edit-render="{}">
+									  <template v-slot:edit="scope">
+										  <el-input v-model="scope.row.contactFirst" oninput="value=value.replace(/[^\d]/g,'')" placeholder="联系方式1" clearable></el-input>
+									  </template>
+								  </vxe-table-column>
+								  <vxe-table-column min-width="308" align="center" field="contactSecond" title="联系方式2" :edit-render="{}">
+									  <template v-slot:edit="scope">
+										  <el-input v-model="scope.row.contactSecond" oninput="value=value.replace(/[^\d]/g,'')" placeholder="联系方式2" clearable></el-input>
+									  </template>
+								  </vxe-table-column>
+								  <vxe-table-column align="center" title="操作" width="100">
+									  <template v-slot="scope">
+										  <el-button type="danger" @click="removeEvent(scope.row,scope.$rowIndex,'construction')">删除</el-button>
+									  </template>
+								  </vxe-table-column>
+							  </vxe-table>
+						  </el-form>
+					  </el-row>
+				  </el-tab-pane>
                 <el-tab-pane label="附件" name="files">
                   <!--        附件-->
                   <UpLoadComponent ref="uploadComponent"></UpLoadComponent>
@@ -439,6 +508,7 @@
     <CwProjectBusinessTypeListForm ref="cwProjectBusinessTypeListForm" @getBusinessType="getBusinessType"></CwProjectBusinessTypeListForm>
     <ContractNameForm ref="contractNameForm"></ContractNameForm>
     <CwClientPageForm ref="cwClientPageForm" @getProgram="getProgram"></CwClientPageForm>
+    <CwConstructionForm ref="cwConstructionForm" @getProgram2="getProgram2"></CwConstructionForm>
   </div>
 
 
@@ -448,6 +518,7 @@
 
 <script>
   import CwClientPageForm from './CwClientPageForm'
+  import CwConstructionForm from './CwConstructionForm'
   import UpLoadComponent from '@/views/common/UpLoadComponent'
   import SelectTree from '@/components/treeSelect/treeSelect.vue'
   import projectRecordsService from '@/api/cw/projectRecords/ProjectRecordsService'
@@ -477,6 +548,7 @@
     },
     data () {
       return {
+		  engineeringTypeList: [],
 	    showChildDialog: false,
 	    typeVisible:false,
         title: '',
@@ -507,6 +579,7 @@
           status: '',
           workAttachmentDtoList: [],
           cwProjectClientInfoDTOList: [],
+			cwProjectConstructionList: [],
           contractName: '',
           contractAmount: '',
           contractNum: '',
@@ -521,14 +594,17 @@
           realHeader: '',
           clientContactsName: '',
           reportType: '',
-          programRow: '',
+			engineeringType: '',
           cwProjectClientContactDTOList: []
         },
+		  programRow: '',
+		  programRow2: '',
         keyWatch: '',
         activeName: 'client',
         tableKey: '',
         tableKeyClient: '1',
         tableKeyContact: '2',
+		  tableKeyConstruction: '3',
         visible: false,
         validContactRules: {
           name: [
@@ -589,6 +665,7 @@
     },
     components: {
       CwClientPageForm,
+		CwConstructionForm,
       UpLoadComponent,
       SelectTree,
       WorkClientChooseForm,
@@ -640,6 +717,7 @@
           status: '',
           workAttachmentDtoList: [],
           cwProjectClientInfoDTOList: [],
+			cwProjectConstructionList: [],
           contractName: '',
           contractAmount: '',
           contractNum: '',
@@ -654,8 +732,10 @@
           realHeader: '',
           clientContactsName: '',
           reportType: '',
+			engineeringType: '',
           cwProjectClientContactDTOList: []
         }
+        this.engineeringTypeList = []
         this.inputForm.id = id
         this.loading = false
         this.$nextTick(() => {
@@ -664,6 +744,7 @@
           projectRecordsService.queryById(this.inputForm.id).then((data) => {
             this.$refs.uploadComponent.clearUpload()
             this.inputForm = this.recover(this.inputForm, data)
+			  this.engineeringTypeList = data.engineeringTypeList
             this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
             if (this.commonJS.isEmpty(this.inputForm.workAttachmentDtoList)) {
               this.inputForm.workAttachmentDtoList = []
@@ -671,6 +752,9 @@
             if (this.commonJS.isEmpty(this.inputForm.cwProjectClientContactDTOList)) {
               this.inputForm.cwProjectClientContactDTOList = []
             }
+            if (this.commonJS.isEmpty(this.inputForm.cwProjectConstructionList)) {
+              this.inputForm.cwProjectConstructionList = []
+            }
             if (this.commonJS.isEmpty(this.inputForm.createDate)) {
               this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
             }
@@ -716,25 +800,27 @@
               throw new Error('“被服务单位”中至少填写一条信息')
             }
             if (this.inputForm.projectLevel === '1') {
-            	if (this.inputForm.projectMoney>= 500) {
+            	if (this.inputForm.projectMoney < 500) {
 					this.loading = false
-					this.$message.error('送审规模于500万元,项目等级请选择B级!')
-					throw new Error('送审规模于500万元,项目等级请选择B级!')
+					this.$message.error('送审规模于500万元,项目等级请选择B级!')
+					throw new Error('送审规模于500万元,项目等级请选择B级!')
 				}
 
             } else {
-				if (this.inputForm.projectMoney < 500) {
+				if (this.inputForm.projectMoney >= 500) {
 					this.loading = false
-					this.$message.error('送审规模于500万元,项目等级请选择A级!')
-					throw new Error('送审规模于500万元,项目等级请选择A级!')
+					this.$message.error('送审规模于500万元,项目等级请选择A级!')
+					throw new Error('送审规模于500万元,项目等级请选择A级!')
 				}
 			}
             if (this.$refs.uploadComponent.checkProgress()) {
               this.loading = false
               throw new Error()
             }
-            this.inputForm.planStartDate = this.inputForm.planDate[0]
-            this.inputForm.planEndDate = this.inputForm.planDate[1]
+			  if (this.commonJS.isNotEmpty(this.inputForm.planDate)) {
+				  this.inputForm.planStartDate = this.inputForm.planDate[0]
+				  this.inputForm.planEndDate = this.inputForm.planDate[1]
+			  }
             this.inputForm.workAttachmentDtoList = this.$refs.uploadComponent.getDataList()
             if (this.commonJS.isEmpty(this.inputForm.createDate)) {
               this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
@@ -752,6 +838,7 @@
         })
       },
       close () {
+		  this.engineeringTypeList = []
         this.inputForm = {
 			projectType: '',
           id: '',
@@ -777,6 +864,7 @@
           status: '',
           workAttachmentDtoList: [],
           cwProjectClientInfoDTOList: [],
+			cwProjectConstructionList: [],
           contractName: '',
           contractAmount: '',
           contractNum: '',
@@ -791,6 +879,7 @@
           realHeader: '',
           clientContactsName: '',
           reportType: '',
+			engineeringType: '',
           cwProjectClientContactDTOList: [],
           contactFirst: '',
           contactSecond: '',
@@ -852,6 +941,51 @@
           this.programRow = this.inputForm.cwProjectClientContactDTOList.length
         }
       },
+		openConstructionForm () {
+			this.$refs.cwConstructionForm.init()
+			if (this.inputForm.cwProjectConstructionList.length > 0) {
+				this.programRow2 = this.inputForm.cwProjectConstructionList.length
+			} else {
+				this.programRow2 = this.inputForm.cwProjectConstructionList.length
+			}
+		},
+		getProgram2 (rows) {
+      	console.log('rows', rows)
+			rows.forEach((item, index) => {
+				if (index === 0) {
+					let d = {
+						name: '',
+						clientName: '',
+						contactFirst: '',
+						contactSecond: '',
+						clientId: ''
+					}
+					this.$refs.construction.insertAt(d)
+					this.inputForm.cwProjectConstructionList.push(d)
+					this.tableKeyConstruction = Math.random()
+
+					let r = this.inputForm.cwProjectConstructionList[this.programRow2]
+					r.name = item.name
+					r.clientName = item.clientName
+					r.contactFirst = item.contactFirst
+					r.contactSecond = item.contactSecond
+					r.clientId = item.clientId
+					this.inputForm.cwProjectConstructionList[this.programRow2] = r
+				} else {
+					let r = {
+						name: item.name,
+						clientName: item.clientName,
+						contactFirst: item.contactFirst,
+						contactSecond: item.contactSecond,
+						clientId: item.clientId
+					}
+					this.inputForm.cwProjectConstructionList.push(r)
+					this.tableKeyConstruction = Math.random()
+				}
+			})
+			this.$forceUpdate()
+			this.programRow2 = ''
+		},
       getProgram (rows) {
         rows.forEach((item, index) => {
           if (index === 0) {
@@ -911,6 +1045,10 @@
           this.$refs.contactTable.remove(row)
           this.inputForm.cwProjectClientContactDTOList.splice(rowIndex, 1)
         }
+        if (type === 'construction') {
+          this.$refs.construction.remove(row)
+          this.inputForm.cwProjectConstructionList.splice(rowIndex, 1)
+        }
       },
       // 打开客户选择组件
       openWorkClient () {

+ 153 - 14
src/views/cw/projectRecords/ProjectRecordsAddForm2.vue

@@ -143,10 +143,11 @@
 							  <el-radio v-for="item in $dictUtils.getDictList('cw_project_level')" :label="item.value" >{{item.label}}</el-radio>
 						  </el-radio-group>
 					  </el-form-item>
+					  <div style="color: red; display: block; margin-left: 140px;">500万及500万以上为A级,500万以下为B级</div>
 				  </el-col>
                 <el-col :span="12">
-                  <el-form-item label="项目规模(元)" prop="projectMoney"
-                                :rules="[{required: true, message:'项目规模不能为空', trigger:'blur'}
+                  <el-form-item label="送审规模(万元)" prop="projectMoney"
+                                :rules="[{required: true, message:'送审规模不能为空', trigger:'blur'}
                    ]">
                     <el-input-number
                       v-model="inputForm.projectMoney"
@@ -156,7 +157,7 @@
                       :max="9999999999"
                       :step="0.01"
                       :min="0"
-                      placeholder="请填写项目规模"
+                      placeholder="请填写送审规模"
                       :controls="false"
                       clearable>
                     </el-input-number>
@@ -175,6 +176,7 @@
                         :value="item.value">
                       </el-option>
                     </el-select>
+					  <div style="color: red; display: block; ">与归档资料关联,请仔细选择</div>
                   </el-form-item>
                 </el-col>
                 <!--<el-col :span="12">
@@ -196,7 +198,6 @@
                 <el-col :span="12">
                   <el-form-item label="项目预计时间" prop="planDate"
                                 :rules="[
-                                {required: true, message:'项目预计时间不能为空', trigger:'blur'}
                    ]">
                     <el-date-picker
                       style="width: 100%"
@@ -217,9 +218,23 @@
                                 :rules="[
                    ]">
                     <UserSelectSignatory :readonly="true" :disabled="status === 'audit' || status === 'taskFormDetail'" :limit='1' :modelValue="inputForm.projectLeaderId" @update:modelValue='(value) => {inputForm.projectLeaderId = value}'></UserSelectSignatory>
-                  </el-form-item>
+					  <span style="color: red">必须拥有一级造价师证书</span>
+				  </el-form-item>
                 </el-col>
 				  <el-col :span="12">
+					  <el-form-item label="工程类型" prop="engineeringType"
+									:rules="[
+                                 {required: true, message:'工程类型不能为空', trigger:'blur'}
+                  ]">
+						  <el-tree-select
+							  v-model="inputForm.engineeringType"
+							  :data="engineeringTypeList"
+							  :render-after-expand="false"
+							  style="width: 100%"
+						  />
+					  </el-form-item>
+				  </el-col>
+				  <el-col :span="12">
 					  <el-form-item label="项目经理1" prop="projectMasterId"
 									:rules="[
                    ]">
@@ -415,6 +430,60 @@
                     </el-form>
                   </el-row>
                 </el-tab-pane>
+				  <el-tab-pane name="construction">
+					  <template v-slot:label>
+						  <span> 施工方信息</span>
+					  </template>
+					  <el-row :gutter="15">
+						  <el-button style="margin-bottom: 15px" type="primary" :disabled="status === 'audit' || status === 'taskFormDetail'" @click="openConstructionForm()"  plain>
+							  添加施工方信息联系人
+						  </el-button>
+					  </el-row>
+					  <el-row  :gutter="15">
+						  <el-form :disabled="true" style="width: 100%;">
+							  <vxe-table
+								  border
+								  show-overflow
+								  show-footer
+								  :column-config="{resizable: true}"
+								  ref="construction"
+								  :key="tableKeyConstruction"
+								  class="vxe-table-element"
+								  :data="inputForm.cwProjectConstructionList"
+								  keep-source
+								  style=""
+								  highlight-current-row
+								  :edit-config="{trigger: 'click', mode: 'row', showStatus: false, autoClear: true, icon: '-'}"
+							  >
+								  <vxe-table-column min-width="306" align="center"  field="name" title="施工方单位名称" :edit-render="{}">
+									  <template v-slot:edit="scope">
+										  <el-input v-model="scope.row.name" placeholder="施工方单位名称" clearable></el-input>
+									  </template>
+								  </vxe-table-column>
+								  <vxe-table-column min-width="306" align="center" field="clientName" title="联系人姓名" :edit-render="{}">
+									  <template v-slot:edit="scope">
+										  <el-input v-model="scope.row.clientName" placeholder="联系人姓名" clearable></el-input>
+									  </template>
+								  </vxe-table-column>
+								  <vxe-table-column min-width="307" align="center" field="contactFirst" title="联系方式1" :edit-render="{}">
+									  <template v-slot:edit="scope">
+										  <el-input v-model="scope.row.contactFirst" oninput="value=value.replace(/[^\d]/g,'')" placeholder="联系方式1" clearable></el-input>
+									  </template>
+								  </vxe-table-column>
+								  <vxe-table-column min-width="308" align="center" field="contactSecond" title="联系方式2" :edit-render="{}">
+									  <template v-slot:edit="scope">
+										  <el-input v-model="scope.row.contactSecond" oninput="value=value.replace(/[^\d]/g,'')" placeholder="联系方式2" clearable></el-input>
+									  </template>
+								  </vxe-table-column>
+								  <vxe-table-column align="center" title="操作" width="100">
+									  <template v-slot="scope">
+										  <el-button type="danger" @click="removeEvent(scope.row,scope.$rowIndex,'construction')">删除</el-button>
+									  </template>
+								  </vxe-table-column>
+							  </vxe-table>
+						  </el-form>
+					  </el-row>
+				  </el-tab-pane>
                 <el-tab-pane label="附件" name="files">
                   <!--        附件-->
                   <UpLoadComponent ref="uploadComponent"></UpLoadComponent>
@@ -438,6 +507,7 @@
     <CwProjectBusinessTypeListForm ref="cwProjectBusinessTypeListForm" @getBusinessType="getBusinessType"></CwProjectBusinessTypeListForm>
     <ContractNameForm ref="contractNameForm"></ContractNameForm>
     <CwClientPageForm ref="cwClientPageForm" @getProgram="getProgram"></CwClientPageForm>
+	  <CwConstructionForm ref="cwConstructionForm" @getProgram2="getProgram2"></CwConstructionForm>
   </div>
 
 
@@ -446,6 +516,7 @@
 </template>
 
 <script>
+	import CwConstructionForm from './CwConstructionForm'
   import CwClientPageForm from './CwClientPageForm'
   import UpLoadComponent from '@/views/common/UpLoadComponent'
   import SelectTree from '@/components/treeSelect/treeSelect.vue'
@@ -476,12 +547,14 @@
     },
     data () {
       return {
+		  engineeringTypeList: [],
 	    showChildDialog: false,
 	    typeVisible:false,
         title: '',
         method: '',
         loading: false,
         inputForm: {
+			engineeringType: '',
 			projectType: '',
           id: '',
           createDate: '',
@@ -505,6 +578,7 @@
           processDefinitionId: '',
           status: '',
           workAttachmentDtoList: [],
+			cwProjectConstructionList: [],
           cwProjectClientInfoDTOList: [],
           contractName: '',
           contractAmount: '',
@@ -520,14 +594,16 @@
           realHeader: '',
           clientContactsName: '',
           reportType: '',
-          programRow: '',
           cwProjectClientContactDTOList: []
         },
+		  programRow: '',
+		  programRow2: '',
         keyWatch: '',
         activeName: 'client',
         tableKey: '',
         tableKeyClient: '1',
         tableKeyContact: '2',
+		  tableKeyConstruction: '3',
         visible: false,
         validContactRules: {
           name: [
@@ -587,6 +663,7 @@
       }
     },
     components: {
+		CwConstructionForm,
       CwClientPageForm,
       UpLoadComponent,
       SelectTree,
@@ -615,6 +692,7 @@
         this.activeName = 'client'
         this.method = method
         this.inputForm = {
+			engineeringType: '',
 			projectType: '',
           id: '',
           createDate: '',
@@ -639,6 +717,7 @@
           status: '',
           workAttachmentDtoList: [],
           cwProjectClientInfoDTOList: [],
+			cwProjectConstructionList: [],
           contractName: '',
           contractAmount: '',
           contractNum: '',
@@ -655,6 +734,7 @@
           reportType: '',
           cwProjectClientContactDTOList: []
         }
+		  this.engineeringTypeList = []
         this.inputForm.id = id
         this.loading = false
         this.$nextTick(() => {
@@ -663,6 +743,7 @@
           projectRecordsService.queryById(this.inputForm.id).then((data) => {
             this.$refs.uploadComponent.clearUpload()
             this.inputForm = this.recover(this.inputForm, data)
+			  this.engineeringTypeList = data.engineeringTypeList
             this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
             if (this.commonJS.isEmpty(this.inputForm.workAttachmentDtoList)) {
               this.inputForm.workAttachmentDtoList = []
@@ -683,6 +764,9 @@
             if (this.commonJS.isEmpty(this.inputForm.cwProjectClientInfoDTOList)) {
               this.inputForm.cwProjectClientInfoDTOList = []
             }
+            if (this.commonJS.isEmpty(this.inputForm.cwProjectConstructionList)) {
+              this.inputForm.cwProjectConstructionList = []
+            }
             if (this.commonJS.isEmpty(this.inputForm.projectLeaderId)) {
               this.inputForm.projectLeaderId = this.$store.state.user.id
             }
@@ -715,25 +799,28 @@
               throw new Error('“被服务单位”中至少填写一条信息')
             }
 			  if (this.inputForm.projectLevel === '1') {
-				  if (this.inputForm.projectMoney>= 500) {
+				  if (this.inputForm.projectMoney < 500) {
 					  this.loading = false
-					  this.$message.error('送审规模于500万元,项目等级请选择B级!')
-					  throw new Error('送审规模于500万元,项目等级请选择B级!')
+					  this.$message.error('送审规模于500万元,项目等级请选择B级!')
+					  throw new Error('送审规模于500万元,项目等级请选择B级!')
 				  }
 
 			  } else {
-				  if (this.inputForm.projectMoney < 500) {
+				  if (this.inputForm.projectMoney >= 500) {
 					  this.loading = false
-					  this.$message.error('送审规模于500万元,项目等级请选择A级!')
-					  throw new Error('送审规模于500万元,项目等级请选择A级!')
+					  this.$message.error('送审规模于500万元,项目等级请选择A级!')
+					  throw new Error('送审规模于500万元,项目等级请选择A级!')
 				  }
 			  }
             if (this.$refs.uploadComponent.checkProgress()) {
               this.loading = false
               throw new Error()
             }
-            this.inputForm.planStartDate = this.inputForm.planDate[0]
-            this.inputForm.planEndDate = this.inputForm.planDate[1]
+            if (this.commonJS.isNotEmpty(this.inputForm.planDate)) {
+				this.inputForm.planStartDate = this.inputForm.planDate[0]
+				this.inputForm.planEndDate = this.inputForm.planDate[1]
+			}
+
             this.inputForm.workAttachmentDtoList = this.$refs.uploadComponent.getDataList()
             if (this.commonJS.isEmpty(this.inputForm.createDate)) {
               this.inputForm.createDate = this.moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
@@ -751,7 +838,9 @@
         })
       },
       close () {
+		  this.engineeringTypeList = []
         this.inputForm = {
+			engineeringType: '',
 			projectType: '',
           id: '',
           createDate: '',
@@ -776,6 +865,7 @@
           status: '',
           workAttachmentDtoList: [],
           cwProjectClientInfoDTOList: [],
+			cwProjectConstructionList: [],
           contractName: '',
           contractAmount: '',
           contractNum: '',
@@ -910,6 +1000,10 @@
           this.$refs.contactTable.remove(row)
           this.inputForm.cwProjectClientContactDTOList.splice(rowIndex, 1)
         }
+		  if (type === 'construction') {
+			  this.$refs.construction.remove(row)
+			  this.inputForm.cwProjectConstructionList.splice(rowIndex, 1)
+		  }
       },
       // 打开客户选择组件
       openWorkClient () {
@@ -1115,6 +1209,51 @@
 			this.inputForm.businessType = row.id
 			this.inputForm.businessTypeName = row.name
 		},
+		openConstructionForm () {
+			this.$refs.cwConstructionForm.init()
+			if (this.inputForm.cwProjectConstructionList.length > 0) {
+				this.programRow2 = this.inputForm.cwProjectConstructionList.length
+			} else {
+				this.programRow2 = this.inputForm.cwProjectConstructionList.length
+			}
+		},
+		getProgram2 (rows) {
+			console.log('rows', rows)
+			rows.forEach((item, index) => {
+				if (index === 0) {
+					let d = {
+						name: '',
+						clientName: '',
+						contactFirst: '',
+						contactSecond: '',
+						clientId: ''
+					}
+					this.$refs.construction.insertAt(d)
+					this.inputForm.cwProjectConstructionList.push(d)
+					this.tableKeyConstruction = Math.random()
+
+					let r = this.inputForm.cwProjectConstructionList[this.programRow2]
+					r.name = item.name
+					r.clientName = item.clientName
+					r.contactFirst = item.contactFirst
+					r.contactSecond = item.contactSecond
+					r.clientId = item.clientId
+					this.inputForm.cwProjectConstructionList[this.programRow2] = r
+				} else {
+					let r = {
+						name: item.name,
+						clientName: item.clientName,
+						contactFirst: item.contactFirst,
+						contactSecond: item.contactSecond,
+						clientId: item.clientId
+					}
+					this.inputForm.cwProjectConstructionList.push(r)
+					this.tableKeyConstruction = Math.random()
+				}
+			})
+			this.$forceUpdate()
+			this.programRow2 = ''
+		},
     }
   }
 </script>

+ 146 - 7
src/views/cw/projectRecords/ProjectRecordsForm.vue

@@ -145,11 +145,12 @@
 							  <el-radio v-for="item in $dictUtils.getDictList('cw_project_level')" :label="item.value" >{{item.label}}</el-radio>
 						  </el-radio-group>
 					  </el-form-item>
+					  <div style="color: red; display: block; margin-left: 140px;">500万及500万以上为A级,500万以下为B级</div>
 				  </el-col>
                 <el-col :span="12">
-                  <el-form-item label="项目规模(元)" prop="projectMoney"
+                  <el-form-item label="送审规模(万元)" prop="projectMoney"
                                 :rules="[
-                                	{required: true, message:'项目规模不能为空', trigger:'blur'}
+                                	{required: true, message:'送审规模不能为空', trigger:'blur'}
                    ]">
                     <el-input-number
                       v-model="inputForm.projectMoney"
@@ -159,7 +160,7 @@
                       :max="9999999999"
                       :step="0.01"
                       :min="0"
-                      placeholder="请填写项目规模"
+                      placeholder="请填写送审规模"
                       :controls="false"
                     >
                     </el-input-number>
@@ -178,6 +179,7 @@
                         :value="item.value">
                       </el-option>
                     </el-select>
+					  <div style="color: red; display: block; ">与归档资料关联,请仔细选择</div>
                   </el-form-item>
                 </el-col>
                 <!--<el-col :span="12">
@@ -198,7 +200,6 @@
                 <el-col :span="12">
                   <el-form-item label="项目预计时间" prop="planDate"
                                 :rules="[
-                                {required: true, message:'项目预计时间不能为空', trigger:'blur'}
                    ]">
                     <el-date-picker
                       style="width: 100%"
@@ -221,8 +222,22 @@
                    ]">
 					  <UserSelectForQualification :readonly="true" :disabled="method === 'view'" :limit='1' :modelValue="inputForm.projectLeaderId" @update:modelValue='(value) => {inputForm.projectLeaderId = value}'></UserSelectForQualification>
 <!--                    <UserSelect :readonly="true" :disabled="method === 'view'" :limit='1' :modleValue="inputForm.projectLeaderId" @update:modelValue='(value) => {inputForm.projectLeaderId = value}'></UserSelect>-->
+					  <span style="color: red">必须拥有一级造价师证书</span>
                   </el-form-item>
                 </el-col>
+				  <el-col :span="12">
+					  <el-form-item label="工程类型" prop="engineeringType"
+									:rules="[
+                                 {required: true, message:'工程类型不能为空', trigger:'blur'}
+                  ]">
+						  <el-tree-select
+							  v-model="inputForm.engineeringType"
+							  :data="engineeringTypeList"
+							  :render-after-expand="false"
+							  style="width: 100%"
+						  />
+					  </el-form-item>
+				  </el-col>
                 <el-col :span="12">
                   <el-form-item label="项目经理1" prop="projectMasterId"
                                 :rules="[
@@ -440,6 +455,60 @@
                   </vxe-table>
                 </el-row>
               </el-tab-pane>
+				<el-tab-pane name="construction">
+					<template v-slot:label>
+						<span> 施工方信息</span>
+					</template>
+					<el-row :gutter="15">
+						<el-button style="margin-bottom: 15px" type="primary" :disabled="true" @click="openConstructionForm()"  plain>
+							添加施工方信息联系人
+						</el-button>
+					</el-row>
+					<el-row  :gutter="15">
+						<el-form :disabled="true" style="width: 100%;">
+							<vxe-table
+								border
+								show-overflow
+								show-footer
+								:column-config="{resizable: true}"
+								ref="construction"
+								:key="tableKeyConstruction"
+								class="vxe-table-element"
+								:data="inputForm.cwProjectConstructionList"
+								keep-source
+								style=""
+								highlight-current-row
+								:edit-config="{trigger: 'click', mode: 'row', showStatus: false, autoClear: true, icon: '-'}"
+							>
+								<vxe-table-column min-width="250" align="center"  field="name" title="施工方单位名称" :edit-render="{}">
+									<template v-slot:edit="scope">
+										<el-input v-model="scope.row.name" placeholder="施工方单位名称" clearable></el-input>
+									</template>
+								</vxe-table-column>
+								<vxe-table-column min-width="250" align="center" field="clientName" title="联系人姓名" :edit-render="{}">
+									<template v-slot:edit="scope">
+										<el-input v-model="scope.row.clientName" placeholder="联系人姓名" clearable></el-input>
+									</template>
+								</vxe-table-column>
+								<vxe-table-column min-width="250" align="center" field="contactFirst" title="联系方式1" :edit-render="{}">
+									<template v-slot:edit="scope">
+										<el-input v-model="scope.row.contactFirst" oninput="value=value.replace(/[^\d]/g,'')" placeholder="联系方式1" clearable></el-input>
+									</template>
+								</vxe-table-column>
+								<vxe-table-column min-width="240" align="center" field="contactSecond" title="联系方式2" :edit-render="{}">
+									<template v-slot:edit="scope">
+										<el-input v-model="scope.row.contactSecond" oninput="value=value.replace(/[^\d]/g,'')" placeholder="联系方式2" clearable></el-input>
+									</template>
+								</vxe-table-column>
+								<vxe-table-column align="center" title="操作" width="100">
+									<template v-slot="scope">
+										<el-button type="danger" @click="removeEvent(scope.row,scope.$rowIndex,'construction')">删除</el-button>
+									</template>
+								</vxe-table-column>
+							</vxe-table>
+						</el-form>
+					</el-row>
+				</el-tab-pane>
               <el-tab-pane label="附件" name="files">
                 <!--        附件-->
                 <UpLoadComponent ref="uploadComponent"></UpLoadComponent>
@@ -562,11 +631,13 @@
       <InvoiceForm ref="invoiceFormDialog"></InvoiceForm>
       <ReportManagementForm ref="reportManagementForm"></ReportManagementForm>
       <ProjectRecordsForm ref="projectRecordsForm"></ProjectRecordsForm>
+		<CwConstructionForm ref="cwConstructionForm" @getProgram2="getProgram2"></CwConstructionForm>
     </el-dialog>
   </div>
 </template>
 
 <script>
+	import CwConstructionForm from './CwConstructionForm'
 	import UserSelectSignatory from '@/components/userSelect'
   import UpLoadComponent from '@/views/common/UpLoadComponent'
   import SelectTree from '@/components/treeSelect/treeSelect.vue'
@@ -600,10 +671,12 @@
     },
     data () {
       return {
+		  engineeringTypeList: [],
         title: '',
         method: '',
         loading: false,
         inputForm: {
+			engineeringType: '',
           id: '',
           createDate: '',
 			projectStartTime: '',
@@ -627,6 +700,7 @@
           status: '',
           workAttachmentDtoList: [],
           cwProjectClientInfoDTOList: [],
+			cwProjectConstructionList: [],
           contractName: '',
           contractAmount: '',
           contractNum: '',
@@ -644,6 +718,8 @@
           cwProjectClientContactDTOList: [],
           cwProjectMembersDTOList: []
         },
+		  programRow: '',
+		  programRow2: '',
         keyWatch: '',
         activeName: 'client',
         activeNameTop: 'project',
@@ -662,6 +738,7 @@
         },
         reportList: [],
         tableKeyContact: '2',
+		  tableKeyConstruction: '3',
         validContactRules: {
           name: [
             {required: true, message: '姓名不可以为空'}
@@ -708,6 +785,7 @@
       }
     },
     components: {
+		CwConstructionForm,
 		UserSelectSignatory,
       UpLoadComponent,
       SelectTree,
@@ -739,6 +817,7 @@
         this.activeName = 'client'
         this.activeNameTop = 'project'
         this.inputForm = {
+			engineeringType: '',
           id: '',
           createDate: '',
 			projectStartTime: '',
@@ -762,6 +841,7 @@
           status: '',
           workAttachmentDtoList: [],
           cwProjectClientInfoDTOList: [],
+			cwProjectConstructionList: [],
           contractName: '',
           contractAmount: '',
           contractNum: '',
@@ -778,12 +858,14 @@
           cwProjectClientContactDTOList: [],
           cwProjectMembersDTOList: []
         }
+		  this.engineeringTypeList = []
         this.inputForm.id = id
         this.loading = false
         this.$nextTick(() => {
           this.$refs.inputForm.resetFields()
           this.loading = true
           projectRecordsService.queryById(this.inputForm.id).then((data) => {
+			  this.engineeringTypeList = data.engineeringTypeList
             this.$refs.uploadComponent.clearUpload()
             this.inputForm = this.recover(this.inputForm, data)
             this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
@@ -822,6 +904,9 @@
             if (this.commonJS.isEmpty(this.inputForm.cwProjectClientInfoDTOList)) {
               this.inputForm.cwProjectClientInfoDTOList = []
             }
+			  if (this.commonJS.isEmpty(this.inputForm.cwProjectConstructionList)) {
+				  this.inputForm.cwProjectConstructionList = []
+			  }
             if (this.commonJS.isEmpty(this.inputForm.projectMasterId) && this.method !== 'view') {
               this.inputForm.projectMasterId = this.$store.state.user.id
             }
@@ -903,8 +988,10 @@
                 throw new Error('“客户联系人”中至少填写一条信息')
               }
               this.contactSubmit()
-              this.inputForm.planStartDate = this.inputForm.planDate[0]
-              this.inputForm.planEndDate = this.inputForm.planDate[1]
+				if (this.commonJS.isNotEmpty(this.inputForm.planDate)) {
+					this.inputForm.planStartDate = this.inputForm.planDate[0]
+					this.inputForm.planEndDate = this.inputForm.planDate[1]
+				}
               if (this.$refs.uploadComponent.checkProgress()) {
                 this.loading = false
                 return
@@ -978,6 +1065,7 @@
       },
       close () {
         this.inputForm = {
+			engineeringType: '',
           id: '',
           createDate: '',
 			projectStartTime: '',
@@ -1001,6 +1089,7 @@
           status: '',
           workAttachmentDtoList: [],
           cwProjectClientInfoDTOList: [],
+			cwProjectConstructionList: [],
           contractName: '',
           contractAmount: '',
           contractNum: '',
@@ -1017,6 +1106,7 @@
           cwProjectClientContactDTOList: [],
           cwProjectMembersDTOList: []
         }
+		  this.engineeringTypeList = []
         this.$refs.uploadComponent.clearUpload()
         this.$refs.inputForm.resetFields()
         this.$emit('refreshList')
@@ -1074,6 +1164,10 @@
           this.$refs.contactTable.remove(row)
           this.inputForm.cwProjectClientContactDTOList.splice(rowIndex, 1)
         }
+		  if (type === 'construction') {
+			  this.$refs.construction.remove(row)
+			  this.inputForm.cwProjectConstructionList.splice(rowIndex, 1)
+		  }
       },
       openWorkClient () {
         this.$refs.workClientChooseForm.init()
@@ -1289,7 +1383,52 @@
             throw new Error('客户联系人中,第' + (index + 1) + '条数据的“联系方式1”未填写')
           }
         })
-      }
+      },
+		openConstructionForm () {
+			this.$refs.cwConstructionForm.init()
+			if (this.inputForm.cwProjectConstructionList.length > 0) {
+				this.programRow2 = this.inputForm.cwProjectConstructionList.length
+			} else {
+				this.programRow2 = this.inputForm.cwProjectConstructionList.length
+			}
+		},
+		getProgram2 (rows) {
+			console.log('rows', rows)
+			rows.forEach((item, index) => {
+				if (index === 0) {
+					let d = {
+						name: '',
+						clientName: '',
+						contactFirst: '',
+						contactSecond: '',
+						clientId: ''
+					}
+					this.$refs.construction.insertAt(d)
+					this.inputForm.cwProjectConstructionList.push(d)
+					this.tableKeyConstruction = Math.random()
+
+					let r = this.inputForm.cwProjectConstructionList[this.programRow2]
+					r.name = item.name
+					r.clientName = item.clientName
+					r.contactFirst = item.contactFirst
+					r.contactSecond = item.contactSecond
+					r.clientId = item.clientId
+					this.inputForm.cwProjectConstructionList[this.programRow2] = r
+				} else {
+					let r = {
+						name: item.name,
+						clientName: item.clientName,
+						contactFirst: item.contactFirst,
+						contactSecond: item.contactSecond,
+						clientId: item.clientId
+					}
+					this.inputForm.cwProjectConstructionList.push(r)
+					this.tableKeyConstruction = Math.random()
+				}
+			})
+			this.$forceUpdate()
+			this.programRow2 = ''
+		},
     }
   }
 </script>

+ 142 - 6
src/views/cw/projectRecords/ProjectRecordsForm2.vue

@@ -147,9 +147,9 @@
 					  </el-form-item>
 				  </el-col>
                 <el-col :span="12">
-                  <el-form-item label="项目规模(元)" prop="projectMoney"
+                  <el-form-item label="送审规模(万元)" prop="projectMoney"
                                 :rules="[
-                                	{required: true, message:'项目规模不能为空', trigger:'blur'}
+                                	{required: true, message:'送审规模不能为空', trigger:'blur'}
                    ]">
                     <el-input-number
                       v-model="inputForm.projectMoney"
@@ -159,7 +159,7 @@
                       :max="9999999999"
                       :step="0.01"
                       :min="0"
-                      placeholder="请填写项目规模"
+                      placeholder="请填写送审规模"
                       :controls="false"
                     >
                     </el-input-number>
@@ -178,6 +178,7 @@
                         :value="item.value">
                       </el-option>
                     </el-select>
+					  <div style="color: red; display: block; ">与归档资料关联,请仔细选择</div>
                   </el-form-item>
                 </el-col>
                 <!--<el-col :span="12">
@@ -198,7 +199,6 @@
                 <el-col :span="12">
                   <el-form-item label="项目预计时间" prop="planDate"
                                 :rules="[
-                                {required: true, message:'项目预计时间不能为空', trigger:'blur'}
                    ]">
                     <el-date-picker
                       style="width: 100%"
@@ -220,8 +220,22 @@
                                 :rules="[
                    ]">
                     <UserSelect :readonly="true" :disabled="method === 'view'" :limit='1' :modleValue="inputForm.projectLeaderId" @update:modelValue='(value) => {inputForm.projectLeaderId = value}'></UserSelect>
-                  </el-form-item>
+					  <span style="color: red">必须拥有一级造价师证书</span>
+				  </el-form-item>
                 </el-col>
+				  <el-col :span="12">
+					  <el-form-item label="工程类型" prop="engineeringType"
+									:rules="[
+                                 {required: true, message:'工程类型不能为空', trigger:'blur'}
+                  ]">
+						  <el-tree-select
+							  v-model="inputForm.engineeringType"
+							  :data="engineeringTypeList"
+							  :render-after-expand="false"
+							  style="width: 100%"
+						  />
+					  </el-form-item>
+				  </el-col>
                 <el-col :span="12">
                   <el-form-item label="项目经理1" prop="projectMasterId"
                                 :rules="[
@@ -439,6 +453,60 @@
                   </vxe-table>
                 </el-row>
               </el-tab-pane>
+				<el-tab-pane name="construction">
+					<template v-slot:label>
+						<span> 施工方信息</span>
+					</template>
+					<el-row :gutter="15">
+						<el-button style="margin-bottom: 15px" type="primary" :disabled="true" @click="openConstructionForm()"  plain>
+							添加施工方信息联系人
+						</el-button>
+					</el-row>
+					<el-row  :gutter="15">
+						<el-form :disabled="true" style="width: 100%;">
+							<vxe-table
+								border
+								show-overflow
+								show-footer
+								:column-config="{resizable: true}"
+								ref="construction"
+								:key="tableKeyConstruction"
+								class="vxe-table-element"
+								:data="inputForm.cwProjectConstructionList"
+								keep-source
+								style=""
+								highlight-current-row
+								:edit-config="{trigger: 'click', mode: 'row', showStatus: false, autoClear: true, icon: '-'}"
+							>
+								<vxe-table-column min-width="250" align="center"  field="name" title="施工方单位名称" :edit-render="{}">
+									<template v-slot:edit="scope">
+										<el-input v-model="scope.row.name" placeholder="施工方单位名称" clearable></el-input>
+									</template>
+								</vxe-table-column>
+								<vxe-table-column min-width="250" align="center" field="clientName" title="联系人姓名" :edit-render="{}">
+									<template v-slot:edit="scope">
+										<el-input v-model="scope.row.clientName" placeholder="联系人姓名" clearable></el-input>
+									</template>
+								</vxe-table-column>
+								<vxe-table-column min-width="250" align="center" field="contactFirst" title="联系方式1" :edit-render="{}">
+									<template v-slot:edit="scope">
+										<el-input v-model="scope.row.contactFirst" oninput="value=value.replace(/[^\d]/g,'')" placeholder="联系方式1" clearable></el-input>
+									</template>
+								</vxe-table-column>
+								<vxe-table-column min-width="240" align="center" field="contactSecond" title="联系方式2" :edit-render="{}">
+									<template v-slot:edit="scope">
+										<el-input v-model="scope.row.contactSecond" oninput="value=value.replace(/[^\d]/g,'')" placeholder="联系方式2" clearable></el-input>
+									</template>
+								</vxe-table-column>
+								<vxe-table-column align="center" title="操作" width="100">
+									<template v-slot="scope">
+										<el-button type="danger" @click="removeEvent(scope.row,scope.$rowIndex,'construction')">删除</el-button>
+									</template>
+								</vxe-table-column>
+							</vxe-table>
+						</el-form>
+					</el-row>
+				</el-tab-pane>
               <el-tab-pane label="附件" name="files">
                 <!--        附件-->
                 <UpLoadComponent ref="uploadComponent"></UpLoadComponent>
@@ -561,11 +629,13 @@
       <InvoiceForm ref="invoiceFormDialog"></InvoiceForm>
       <ReportManagementForm ref="reportManagementForm"></ReportManagementForm>
       <ProjectRecordsForm ref="projectRecordsForm"></ProjectRecordsForm>
+		<CwConstructionForm ref="cwConstructionForm" @getProgram2="getProgram2"></CwConstructionForm>
     </el-dialog>
   </div>
 </template>
 
 <script>
+	import CwConstructionForm from './CwConstructionForm'
 	import UserSelectSignatory from '@/components/userSelect'
   import UpLoadComponent from '@/views/common/UpLoadComponent'
   import SelectTree from '@/components/treeSelect/treeSelect.vue'
@@ -599,10 +669,12 @@
     },
     data () {
       return {
+		  engineeringTypeList: [],
         title: '',
         method: '',
         loading: false,
         inputForm: {
+			engineeringType: '',
           id: '',
           createDate: '',
 			projectStartTime: '',
@@ -626,6 +698,7 @@
           status: '',
           workAttachmentDtoList: [],
           cwProjectClientInfoDTOList: [],
+			cwProjectConstructionList: [],
           contractName: '',
           contractAmount: '',
           contractNum: '',
@@ -643,6 +716,9 @@
           cwProjectClientContactDTOList: [],
           cwProjectMembersDTOList: []
         },
+		  programRow: '',
+		  programRow2: '',
+		  tableKeyConstruction: '3',
         keyWatch: '',
         activeName: 'client',
         activeNameTop: 'project',
@@ -707,6 +783,7 @@
       }
     },
     components: {
+		CwConstructionForm,
 		UserSelectSignatory,
       UpLoadComponent,
       SelectTree,
@@ -738,6 +815,7 @@
         this.activeName = 'client'
         this.activeNameTop = 'project'
         this.inputForm = {
+			engineeringType: '',
           id: '',
           createDate: '',
 			projectStartTime: '',
@@ -761,6 +839,7 @@
           status: '',
           workAttachmentDtoList: [],
           cwProjectClientInfoDTOList: [],
+			cwProjectConstructionList: [],
           contractName: '',
           contractAmount: '',
           contractNum: '',
@@ -777,12 +856,14 @@
           cwProjectClientContactDTOList: [],
           cwProjectMembersDTOList: []
         }
+		  this.engineeringTypeList = []
         this.inputForm.id = id
         this.loading = false
         this.$nextTick(() => {
           this.$refs.inputForm.resetFields()
           this.loading = true
           projectRecordsService.queryById(this.inputForm.id).then((data) => {
+			  this.engineeringTypeList = data.engineeringTypeList
             this.$refs.uploadComponent.clearUpload()
             this.inputForm = this.recover(this.inputForm, data)
             this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
@@ -821,6 +902,9 @@
             if (this.commonJS.isEmpty(this.inputForm.cwProjectClientInfoDTOList)) {
               this.inputForm.cwProjectClientInfoDTOList = []
             }
+			  if (this.commonJS.isEmpty(this.inputForm.cwProjectConstructionList)) {
+				  this.inputForm.cwProjectConstructionList = []
+			  }
             if (this.commonJS.isEmpty(this.inputForm.projectMasterId) && this.method !== 'view') {
               this.inputForm.projectMasterId = this.$store.state.user.id
             }
@@ -977,6 +1061,7 @@
       },
       close () {
         this.inputForm = {
+			engineeringType: '',
           id: '',
           createDate: '',
 			projectStartTime: '',
@@ -1000,6 +1085,7 @@
           status: '',
           workAttachmentDtoList: [],
           cwProjectClientInfoDTOList: [],
+			cwProjectConstructionList: [],
           contractName: '',
           contractAmount: '',
           contractNum: '',
@@ -1016,6 +1102,7 @@
           cwProjectClientContactDTOList: [],
           cwProjectMembersDTOList: []
         }
+		  this.engineeringTypeList = []
         this.$refs.uploadComponent.clearUpload()
         this.$refs.inputForm.resetFields()
         this.$emit('refreshList')
@@ -1073,6 +1160,10 @@
           this.$refs.contactTable.remove(row)
           this.inputForm.cwProjectClientContactDTOList.splice(rowIndex, 1)
         }
+		  if (type === 'construction') {
+			  this.$refs.construction.remove(row)
+			  this.inputForm.cwProjectConstructionList.splice(rowIndex, 1)
+		  }
       },
       openWorkClient () {
         this.$refs.workClientChooseForm.init()
@@ -1288,7 +1379,52 @@
             throw new Error('客户联系人中,第' + (index + 1) + '条数据的“联系方式1”未填写')
           }
         })
-      }
+      },
+		openConstructionForm () {
+			this.$refs.cwConstructionForm.init()
+			if (this.inputForm.cwProjectConstructionList.length > 0) {
+				this.programRow2 = this.inputForm.cwProjectConstructionList.length
+			} else {
+				this.programRow2 = this.inputForm.cwProjectConstructionList.length
+			}
+		},
+		getProgram2 (rows) {
+			console.log('rows', rows)
+			rows.forEach((item, index) => {
+				if (index === 0) {
+					let d = {
+						name: '',
+						clientName: '',
+						contactFirst: '',
+						contactSecond: '',
+						clientId: ''
+					}
+					this.$refs.construction.insertAt(d)
+					this.inputForm.cwProjectConstructionList.push(d)
+					this.tableKeyConstruction = Math.random()
+
+					let r = this.inputForm.cwProjectConstructionList[this.programRow2]
+					r.name = item.name
+					r.clientName = item.clientName
+					r.contactFirst = item.contactFirst
+					r.contactSecond = item.contactSecond
+					r.clientId = item.clientId
+					this.inputForm.cwProjectConstructionList[this.programRow2] = r
+				} else {
+					let r = {
+						name: item.name,
+						clientName: item.clientName,
+						contactFirst: item.contactFirst,
+						contactSecond: item.contactSecond,
+						clientId: item.clientId
+					}
+					this.inputForm.cwProjectConstructionList.push(r)
+					this.tableKeyConstruction = Math.random()
+				}
+			})
+			this.$forceUpdate()
+			this.programRow2 = ''
+		},
     }
   }
 </script>

+ 17 - 8
src/views/cw/projectRecords/ProjectRecordsList.vue

@@ -347,15 +347,24 @@
       },
 		//生成报告号
 		addReportNum (id,projectNumber) {
-      		//根据项目id创建一条报告信息,同时生成报告号  默认是咨字报告号
-			let param = {
-				'projectId' : id,
-				'projectNumber' : projectNumber,
-			}
-			this.reportReviewService.saveNew(param).then((data) => {
-				this.refreshList()
-			}).catch(() => {
 
+			this.$confirm(`确定生成报告号吗?`, '提示', {
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type: 'warning'
+			}).then(() => {
+				this.loading = true
+				//根据项目id创建一条报告信息,同时生成报告号  默认是咨字报告号
+				let param = {
+					'projectId' : id,
+					'projectNumber' : projectNumber,
+				}
+				this.reportReviewService.saveNew(param).then((data) => {
+					this.refreshList()
+					this.loading = false
+				}).catch(() => {
+
+				})
 			})
 
 		},

+ 17 - 8
src/views/cw/projectRecords/ProjectRecordsList2.vue

@@ -347,15 +347,24 @@
       },
 		//生成报告号
 		addReportNum (id,projectNumber) {
-      		//根据项目id创建一条报告信息,同时生成报告号  默认是咨字报告号
-			let param = {
-				'projectId' : id,
-				'projectNumber' : projectNumber,
-			}
-			this.reportReviewService.saveNew(param).then((data) => {
-				this.refreshList()
-			}).catch(() => {
 
+			this.$confirm(`确定生成报告号吗?`, '提示', {
+				confirmButtonText: '确定',
+				cancelButtonText: '取消',
+				type: 'warning'
+			}).then(() => {
+				this.loading = true
+				//根据项目id创建一条报告信息,同时生成报告号  默认是咨字报告号
+				let param = {
+					'projectId' : id,
+					'projectNumber' : projectNumber,
+				}
+				this.reportReviewService.saveNew(param).then((data) => {
+					this.refreshList()
+					this.loading = false
+				}).catch(() => {
+
+				})
 			})
 
 		},

+ 149 - 3
src/views/cw/reportManagement/ProjectRecordsInfoForm.vue

@@ -225,6 +225,19 @@
 <!--                    <UserSelect :readonly="true" :disabled="method === 'view'" :limit='1' :modleValue="inputForm.projectLeaderId" @update:modelValue='(value) => {inputForm.projectLeaderId = value}'></UserSelect>-->
                   </el-form-item>
                 </el-col>
+				  <el-col :span="12">
+					  <el-form-item label="工程类型" prop="engineeringType"
+									:rules="[
+                                 {required: true, message:'工程类型不能为空', trigger:'blur'}
+                  ]">
+						  <el-tree-select
+							  v-model="inputForm.engineeringType"
+							  :data="engineeringTypeList"
+							  :render-after-expand="false"
+							  style="width: 100%"
+						  />
+					  </el-form-item>
+				  </el-col>
                 <el-col :span="12">
                   <el-form-item label="项目经理1" prop="projectMasterId"
                                 :rules="[
@@ -442,6 +455,60 @@
                   </vxe-table>
                 </el-row>
               </el-tab-pane>
+				<el-tab-pane name="construction">
+					<template v-slot:label>
+						<span> 施工方信息</span>
+					</template>
+					<el-row :gutter="15">
+						<el-button style="margin-bottom: 15px" type="primary" :disabled="true" @click="openConstructionForm()"  plain>
+							添加施工方信息联系人
+						</el-button>
+					</el-row>
+					<el-row  :gutter="15">
+						<el-form :disabled="true" style="width: 100%;">
+							<vxe-table
+								border
+								show-overflow
+								show-footer
+								:column-config="{resizable: true}"
+								ref="construction"
+								:key="tableKeyConstruction"
+								class="vxe-table-element"
+								:data="inputForm.cwProjectConstructionList"
+								keep-source
+								style=""
+								highlight-current-row
+								:edit-config="{trigger: 'click', mode: 'row', showStatus: false, autoClear: true, icon: '-'}"
+							>
+								<vxe-table-column min-width="250" align="center"  field="name" title="施工方单位名称" :edit-render="{}">
+									<template v-slot:edit="scope">
+										<el-input v-model="scope.row.name" placeholder="施工方单位名称" clearable></el-input>
+									</template>
+								</vxe-table-column>
+								<vxe-table-column min-width="250" align="center" field="clientName" title="联系人姓名" :edit-render="{}">
+									<template v-slot:edit="scope">
+										<el-input v-model="scope.row.clientName" placeholder="联系人姓名" clearable></el-input>
+									</template>
+								</vxe-table-column>
+								<vxe-table-column min-width="250" align="center" field="contactFirst" title="联系方式1" :edit-render="{}">
+									<template v-slot:edit="scope">
+										<el-input v-model="scope.row.contactFirst" oninput="value=value.replace(/[^\d]/g,'')" placeholder="联系方式1" clearable></el-input>
+									</template>
+								</vxe-table-column>
+								<vxe-table-column min-width="240" align="center" field="contactSecond" title="联系方式2" :edit-render="{}">
+									<template v-slot:edit="scope">
+										<el-input v-model="scope.row.contactSecond" oninput="value=value.replace(/[^\d]/g,'')" placeholder="联系方式2" clearable></el-input>
+									</template>
+								</vxe-table-column>
+								<vxe-table-column align="center" title="操作" width="100">
+									<template v-slot="scope">
+										<el-button type="danger" @click="removeEvent(scope.row,scope.$rowIndex,'construction')">删除</el-button>
+									</template>
+								</vxe-table-column>
+							</vxe-table>
+						</el-form>
+					</el-row>
+				</el-tab-pane>
               <el-tab-pane label="附件" name="files">
                 <!--        附件-->
                 <UpLoadComponent ref="uploadComponent"></UpLoadComponent>
@@ -1058,7 +1125,8 @@
 						<el-col :span="12">
 							<el-form-item label="造价咨询营业收入(万元)" prop="ziXunShouRu"
 										  :rules="[
-										{ validator: ziXunShouRuRange, trigger: 'change' }
+										{ validator: ziXunShouRuRange, trigger: 'change' },
+										{required: true, message: '造价咨询营业收入(万元)不能为空', trigger: 'blur'},
 			   ]">
 								<el-input
 									v-on:input="inputForm4.ziXunShouRu=inputForm4.ziXunShouRu.replace(/[^\d.]/g,'')
@@ -1332,7 +1400,8 @@
 						<el-col :span="12">
 							<el-form-item label="造价咨询营业收入(万元)" prop="ziXunShouRu"
 										  :rules="[
-										{ validator: ziXunShouRuRange, trigger: 'change' }
+										{ validator: ziXunShouRuRange, trigger: 'change' },
+										{required: true, message: '造价咨询营业收入(万元)不能为空', trigger: 'blur'},
 			   ]">
 								<el-input
 									v-on:input="inputForm4.ziXunShouRu=inputForm4.ziXunShouRu.replace(/[^\d.]/g,'')
@@ -1930,11 +1999,13 @@
       <ReportManagementForm ref="reportManagementForm"></ReportManagementForm>
       <ProjectRecordsForm ref="projectRecordsForm"></ProjectRecordsForm>
 		<WorkClientChooseRadio ref="workClientChooseRadio" @getWorkClientRadioChoose="getWorkClientChoose2"></WorkClientChooseRadio>
-    </el-dialog>
+		<CwConstructionForm ref="cwConstructionForm" @getProgram2="getProgram2"></CwConstructionForm>
+	</el-dialog>
   </div>
 </template>
 
 <script>
+	import CwConstructionForm from '@/views/cw/projectRecords/CwConstructionForm'
 	import OSSSerivce, {
 		// eslint-disable-next-line no-unused-vars
 		beforeAvatarUpload,
@@ -1978,10 +2049,13 @@
     },
     data () {
       return {
+		  engineeringTypeList: [],
         title: '',
         method: '',
         loading: false,
         inputForm: {
+			engineeringType: '',
+			cwProjectConstructionList: [],
           id: '',
 			projectType: '',
           createDate: '',
@@ -2024,6 +2098,9 @@
           cwProjectClientContactDTOList: [],
           cwProjectMembersDTOList: []
         },
+		  programRow: '',
+		  programRow2: '',
+		  tableKeyConstruction: '3',
 		  inputForm2: {
 			  customerId: '',  // 客户id
 			  address: '',
@@ -2230,6 +2307,7 @@
       }
     },
     components: {
+		CwConstructionForm,
 		FileForm,
 		UserSelectSignatory,
 		WorkClientChooseRadio,
@@ -2262,6 +2340,8 @@
         this.activeName = 'client'
         this.activeNameTop = 'project'
         this.inputForm = {
+			engineeringType: '',
+			cwProjectConstructionList: [],
           id: '',
 			projectType: '',
           createDate: '',
@@ -2434,12 +2514,14 @@
 				  name: this.$store.state.user.name
 			  },
 		  }
+		  this.engineeringTypeList = []
         this.inputForm.id = id
         this.loading = false
         this.$nextTick(() => {
           this.$refs.inputForm.resetFields()
           this.loading = true
           projectRecordsService.queryById(this.inputForm.id).then((data) => {
+			  this.engineeringTypeList = data.engineeringTypeList
             this.$refs.uploadComponent.clearUpload()
             this.inputForm = this.recover(this.inputForm, data)
             this.inputForm = JSON.parse(JSON.stringify(this.inputForm))
@@ -2458,6 +2540,9 @@
             if (this.commonJS.isEmpty(this.inputForm.officeId)) {
               this.inputForm.officeId = this.$store.state.user.office.id
             }
+			  if (this.commonJS.isEmpty(this.inputForm.cwProjectConstructionList)) {
+				  this.inputForm.cwProjectConstructionList = []
+			  }
             if (this.commonJS.isEmpty(this.inputForm.cwProjectMembersDTOList)) {
               this.inputForm.cwProjectMembersDTOList = []
             } else {
@@ -2762,7 +2847,10 @@
         }
       },
       close () {
+		  this.engineeringTypeList = []
         this.inputForm = {
+			engineeringType: '',
+			cwProjectConstructionList: [],
           id: '',
 			projectType: '',
           createDate: '',
@@ -2869,6 +2957,10 @@
           this.$refs.contactTable.remove(row)
           this.inputForm.cwProjectClientContactDTOList.splice(rowIndex, 1)
         }
+		  if (type === 'construction') {
+			  this.$refs.construction.remove(row)
+			  this.inputForm.cwProjectConstructionList.splice(rowIndex, 1)
+		  }
       },
       openWorkClient () {
         this.$refs.workClientChooseForm.init()
@@ -3086,6 +3178,60 @@
 				return kb + '' + sizes[i]
 			}
 		},
+		ziXunShouRuRange(rule, value, callback) {
+			if (!value || value.trim() === "") {
+				callback(new Error('造价咨询营业收入不能为空!'));
+			} else if (parseFloat(value) <= 0) {
+				callback(new Error('造价咨询营业收入必须大于0!'));
+			} else {
+				callback();
+			}
+		},
+		openConstructionForm () {
+			this.$refs.cwConstructionForm.init()
+			if (this.inputForm.cwProjectConstructionList.length > 0) {
+				this.programRow2 = this.inputForm.cwProjectConstructionList.length
+			} else {
+				this.programRow2 = this.inputForm.cwProjectConstructionList.length
+			}
+		},
+		getProgram2 (rows) {
+			console.log('rows', rows)
+			rows.forEach((item, index) => {
+				if (index === 0) {
+					let d = {
+						name: '',
+						clientName: '',
+						contactFirst: '',
+						contactSecond: '',
+						clientId: ''
+					}
+					this.$refs.construction.insertAt(d)
+					this.inputForm.cwProjectConstructionList.push(d)
+					this.tableKeyConstruction = Math.random()
+
+					let r = this.inputForm.cwProjectConstructionList[this.programRow2]
+					r.name = item.name
+					r.clientName = item.clientName
+					r.contactFirst = item.contactFirst
+					r.contactSecond = item.contactSecond
+					r.clientId = item.clientId
+					this.inputForm.cwProjectConstructionList[this.programRow2] = r
+				} else {
+					let r = {
+						name: item.name,
+						clientName: item.clientName,
+						contactFirst: item.contactFirst,
+						contactSecond: item.contactSecond,
+						clientId: item.clientId
+					}
+					this.inputForm.cwProjectConstructionList.push(r)
+					this.tableKeyConstruction = Math.random()
+				}
+			})
+			this.$forceUpdate()
+			this.programRow2 = ''
+		},
     }
   }
 </script>

+ 12 - 2
src/views/cw/reportManagement/ReportManagementFormNew.vue

@@ -808,8 +808,18 @@
 						  if (item.levelFlag === 2 && item.mustFlag === 1){
 							  if (item.children.length === 0){
 								  this.loading = false
-								  this.$message.error('文件未上传')
-								  throw new Error('文件未上传')
+								  this.$message.error(item.name + '文件未上传')
+								  throw new Error(item.name + '文件未上传')
+							  } else {
+								  item.children.forEach(child => {
+									  const fileExtension = child.attachmentName.split('.').pop(); // 获取文件后缀名
+									  const supportedFileTypes = item.type.split(','); // 支持的文件类型数组
+									  if (!supportedFileTypes.includes(fileExtension)) {
+										  this.loading = false;
+										  this.$message.error(child.attachmentName + ' 文件类型不受支持');
+										  throw new Error(child.attachmentName + ' 文件类型不受支持');
+									  }
+								  });
 							  }
 						  }
 					  })

+ 12 - 2
src/views/cw/reportManagement/ReportManagementFormNew1.vue

@@ -690,8 +690,18 @@
 						  if (item.levelFlag === 2 && item.mustFlag === 1){
 							  if (item.children.length === 0){
 								  this.loading = false
-								  this.$message.error('文件未上传')
-								  throw new Error('文件未上传')
+								  this.$message.error(item.name + '文件未上传')
+								  throw new Error(item.name + '文件未上传')
+							  } else {
+								  item.children.forEach(child => {
+									  const fileExtension = child.attachmentName.split('.').pop(); // 获取文件后缀名
+									  const supportedFileTypes = item.type.split(','); // 支持的文件类型数组
+									  if (!supportedFileTypes.includes(fileExtension)) {
+										  this.loading = false;
+										  this.$message.error(child.attachmentName + ' 文件类型不受支持');
+										  throw new Error(child.attachmentName + ' 文件类型不受支持');
+									  }
+								  });
 							  }
 						  }
 					  })

+ 13 - 0
src/views/cw/reportManagement/ReportManagementFormNew2.vue

@@ -811,6 +811,19 @@
 							  }
 						  }
 					  })*/
+					  this.tableData.forEach(item=>{
+						  if (item.children.length > 0){
+							  item.children.forEach(child => {
+								  const fileExtension = child.attachmentName.split('.').pop(); // 获取文件后缀名
+								  const supportedFileTypes = item.type.split(','); // 支持的文件类型数组
+								  if (!supportedFileTypes.includes(fileExtension)) {
+									  this.loading = false;
+									  this.$message.error(child.attachmentName + ' 文件类型不受支持');
+									  throw new Error(child.attachmentName + ' 文件类型不受支持');
+								  }
+							  });
+						  }
+					  })
 
 					  this.reportReviewService.saveFormReviewNew(this.inputForm).then(() => {
 						  this.$emit('refreshList')

+ 14 - 3
src/views/cw/reportManagement/ReportManagementFormNew3.vue

@@ -204,7 +204,8 @@
 					<el-col :span="12">
 						<el-form-item label="造价咨询营业收入(万元)" prop="ziXunShouRu"
 									  :rules="[
-										{ validator: ziXunShouRuRange, trigger: 'change' }
+										{ validator: ziXunShouRuRange, trigger: 'change' },
+										{required: true, message: '造价咨询营业收入(万元)不能为空', trigger: 'blur'},
 			   ]">
 							<!--						  <el-input v-model="inputForm.ziXunShouRu" placeholder="请输入造价咨询营业收入" clearable></el-input>-->
 							<el-input
@@ -769,8 +770,18 @@
 						  if (item.levelFlag === 2 && item.mustFlag === 1){
 							  if (item.children.length === 0){
 								  this.loading = false
-								  this.$message.error('文件未上传')
-								  throw new Error('文件未上传')
+								  this.$message.error(item.name + '文件未上传')
+								  throw new Error(item.name + '文件未上传')
+							  } else {
+								  item.children.forEach(child => {
+									  const fileExtension = child.attachmentName.split('.').pop(); // 获取文件后缀名
+									  const supportedFileTypes = item.type.split(','); // 支持的文件类型数组
+									  if (!supportedFileTypes.includes(fileExtension)) {
+										  this.loading = false;
+										  this.$message.error(child.attachmentName + ' 文件类型不受支持');
+										  throw new Error(child.attachmentName + ' 文件类型不受支持');
+									  }
+								  });
 							  }
 						  }
 					  })

+ 9 - 9
src/views/cw/reportManagement/ReportManagementList.vue

@@ -129,12 +129,12 @@
 			</vxe-column>
 			<vxe-column min-width="130" title="质量复核" fixed="right" align="center" field="reviewStatus">
 				<template #default="scope">
-					<el-button @click="detail(scope.row)" :type="$dictUtils.getDictLabel('quality_status_info', scope.row.reviewStatus, '')" effect="dark" >{{$dictUtils.getDictLabel("quality_status", scope.row.reviewStatus, '未开始')}} </el-button>
+					<el-button v-if="scope.row.projectLevel==='1'" @click="detail(scope.row)" :type="$dictUtils.getDictLabel('quality_status_info', scope.row.reviewStatus, '')" effect="dark" >{{$dictUtils.getDictLabel("quality_status", scope.row.reviewStatus, '未开始')}} </el-button>
 				</template>
 			</vxe-column>
 			<vxe-column min-width="100" title="报告签发" fixed="right" align="center" field="signAndIssueStatus">
 				<template #default="scope">
-					<el-button @click="signAndIssueDetail(scope.row)"
+					<el-button @click="signAndIssueDetail(scope.row)" v-if="scope.row.projectLevel==='1'"
 							   :type="$dictUtils.getDictLabel('status_info', scope.row.signAndIssueStatus, '')"
 							   effect="dark">
 						{{$dictUtils.getDictLabel("status", scope.row.signAndIssueStatus, '未开始')}}
@@ -185,10 +185,10 @@
 							   text type="primary" @click="pushOnlineArchiving(scope.row)">线上归档</el-button>
 					<el-button v-if="hasPermission('cw:workContract:filed') && (scope.row.createById === $store.state.user.id||haveProjectIds.includes(scope.row.projectId)) && scope.row.status === '5'&& scope.row.reviewStatus === '5' && scope.row.onlineArchivingStatus === '2'" text type="primary" @click="rebackPushOnline(scope.row)">撤回线上归档</el-button>
 					<el-button v-if="hasPermission('cw:workContract:filed') && (scope.row.createById === $store.state.user.id||haveProjectIds.includes(scope.row.projectId)) && scope.row.status === '5'&& scope.row.reviewStatus === '5' && scope.row.onlineArchivingStatus === '4'" text type="primary" @click="adjustPushOnline(scope.row)">驳回调整</el-button>
-					<el-button v-if="hasPermission('cw:workContract:filed') && (scope.row.createById === $store.state.user.id||haveProjectIds.includes(scope.row.projectId)) && scope.row.status === '5' && scope.row.reviewStatus === '5' && (scope.row.onlineArchivingStatus === '5' || scope.row.onlineArchivingStatus === '7')
+					<el-button v-if="hasPermission('cw:workContract:filed') && (scope.row.createById === $store.state.user.id||haveProjectIds.includes(scope.row.projectId)) && scope.row.status === '5' && scope.row.reviewStatus === '5' && (scope.row.onlineArchivingStatus === '5' || scope.row.onlineArchivingStatus === '7') && scope.row.projectLevel === '1'
 					&& (scope.row.paperArchivingStatus === '0' || scope.row.paperArchivingStatus === '1' || scope.row.paperArchivingStatus === '3' || scope.row.paperArchivingStatus === undefined || scope.row.paperArchivingStatus === '' || scope.row.paperArchivingStatus === '6')" text type="primary" @click="pushPaperArchiving(scope.row)">纸质归档</el-button>
-					<el-button v-if="hasPermission('cw:workContract:filed') && (scope.row.createById === $store.state.user.id||haveProjectIds.includes(scope.row.projectId)) && scope.row.status === '5'&& scope.row.reviewStatus === '5' && scope.row.onlineArchivingStatus === '5' && scope.row.paperArchivingStatus === '2'" text type="primary" @click="rebackPushPaper(scope.row)">撤回纸质归档</el-button>
-					<el-button v-if="hasPermission('cw:workContract:filed') && (scope.row.createById === $store.state.user.id||haveProjectIds.includes(scope.row.projectId)) && scope.row.status === '5'&& scope.row.reviewStatus === '5' && scope.row.onlineArchivingStatus === '5' && scope.row.paperArchivingStatus === '4'" text type="primary" @click="adjustPushPaper(scope.row)">驳回调整</el-button>
+					<el-button v-if="hasPermission('cw:workContract:filed') && (scope.row.createById === $store.state.user.id||haveProjectIds.includes(scope.row.projectId)) && scope.row.status === '5'&& scope.row.reviewStatus === '5' && scope.row.onlineArchivingStatus === '5' && scope.row.paperArchivingStatus === '2' && scope.row.projectLevel === '1'" text type="primary" @click="rebackPushPaper(scope.row)">撤回纸质归档</el-button>
+					<el-button v-if="hasPermission('cw:workContract:filed') && (scope.row.createById === $store.state.user.id||haveProjectIds.includes(scope.row.projectId)) && scope.row.status === '5'&& scope.row.reviewStatus === '5' && scope.row.onlineArchivingStatus === '5' && scope.row.paperArchivingStatus === '4' && scope.row.projectLevel === '1'" text type="primary" @click="adjustPushPaper(scope.row)">驳回调整</el-button>
 				</div>
             </template>
           </vxe-column>
@@ -478,7 +478,7 @@
 			}
 
 			if (row.projectLevel === '1') {
-				status = 'startAndClose'
+				status = 'startAndHold'
 			}
 
 			taskService.getTaskDef({ procDefId: this.processDefinitionAuditId,
@@ -747,11 +747,11 @@
 			let procDefId = ''
 			let procDefKey = ''
 			if (row.projectLevel === '1') {
-				status = 'startAndClose'
+				status = 'startAndHold'
 				procDefId = this.onlineArchivingProcDefIdA
 				procDefKey = this.onlineArchivingProcDefKeyA
 			} else if (row.projectLevel === '2'){
-				status = 'startAndClose'
+				status = 'startAndHold'
 				procDefId = this.onlineArchivingProcDefIdB
 				procDefKey = this.onlineArchivingProcDefKeyB
 			}
@@ -870,7 +870,7 @@
 				title = ' ' + row.documentNo + ' - ' + row.projectName
 			}
 
-			let processTitle = `${this.userName} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了` + title + '[报告-线上归档]'
+			let processTitle = `${this.userName} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了` + title + '[报告-纸质归档]'
 			let status = 'startAndHold'
 			if (row.reviewStatus === '3') {
 				status = 'startAndClose'

+ 10 - 10
src/views/cw/reportManagement/ReportManagementList2.vue

@@ -129,12 +129,12 @@
 			</vxe-column>
 			<vxe-column min-width="130" title="质量复核" fixed="right" align="center" field="reviewStatus">
 				<template #default="scope">
-					<el-button @click="detail(scope.row)" :type="$dictUtils.getDictLabel('quality_status_info', scope.row.reviewStatus, '')" effect="dark" >{{$dictUtils.getDictLabel("quality_status", scope.row.reviewStatus, '未开始')}} </el-button>
+					<el-button v-if="scope.row.projectLevel==='1'" @click="detail(scope.row)" :type="$dictUtils.getDictLabel('quality_status_info', scope.row.reviewStatus, '')" effect="dark" >{{$dictUtils.getDictLabel("quality_status", scope.row.reviewStatus, '未开始')}} </el-button>
 				</template>
 			</vxe-column>
 			<vxe-column min-width="100" title="报告签发" fixed="right" align="center" field="signAndIssueStatus">
-				<template #default="scope">
-					<el-button @click="signAndIssueDetail(scope.row)"
+				<template #default="scope" >
+					<el-button @click="signAndIssueDetail(scope.row)" v-if="scope.row.projectLevel==='1'"
 							   :type="$dictUtils.getDictLabel('status_info', scope.row.signAndIssueStatus, '')"
 							   effect="dark">
 						{{$dictUtils.getDictLabel("status", scope.row.signAndIssueStatus, '未开始')}}
@@ -185,10 +185,10 @@
 							   text type="primary" @click="pushOnlineArchiving(scope.row)">线上归档</el-button>
 					<el-button v-if="hasPermission('cw:workContract:filed') && (scope.row.createById === $store.state.user.id||haveProjectIds.includes(scope.row.projectId)) && scope.row.status === '5'&& scope.row.reviewStatus === '5' && scope.row.onlineArchivingStatus === '2'" text type="primary" @click="rebackPushOnline(scope.row)">撤回线上归档</el-button>
 					<el-button v-if="hasPermission('cw:workContract:filed') && (scope.row.createById === $store.state.user.id||haveProjectIds.includes(scope.row.projectId)) && scope.row.status === '5'&& scope.row.reviewStatus === '5' && scope.row.onlineArchivingStatus === '4'" text type="primary" @click="adjustPushOnline(scope.row)">驳回调整</el-button>
-					<el-button v-if="hasPermission('cw:workContract:filed') && (scope.row.createById === $store.state.user.id||haveProjectIds.includes(scope.row.projectId)) && scope.row.status === '5' && scope.row.reviewStatus === '5' && (scope.row.onlineArchivingStatus === '5' || scope.row.onlineArchivingStatus === '7')
+					<el-button v-if="hasPermission('cw:workContract:filed') && (scope.row.createById === $store.state.user.id||haveProjectIds.includes(scope.row.projectId)) && scope.row.status === '5' && scope.row.reviewStatus === '5' && (scope.row.onlineArchivingStatus === '5' || scope.row.onlineArchivingStatus === '7') && scope.row.projectLevel === '1'
 					&& (scope.row.paperArchivingStatus === '0' || scope.row.paperArchivingStatus === '1' || scope.row.paperArchivingStatus === '3' || scope.row.paperArchivingStatus === undefined || scope.row.paperArchivingStatus === '' || scope.row.paperArchivingStatus === '6')" text type="primary" @click="pushPaperArchiving(scope.row)">纸质归档</el-button>
-					<el-button v-if="hasPermission('cw:workContract:filed') && (scope.row.createById === $store.state.user.id||haveProjectIds.includes(scope.row.projectId)) && scope.row.status === '5'&& scope.row.reviewStatus === '5' && scope.row.onlineArchivingStatus === '5' && scope.row.paperArchivingStatus === '2'" text type="primary" @click="rebackPushPaper(scope.row)">撤回纸质归档</el-button>
-					<el-button v-if="hasPermission('cw:workContract:filed') && (scope.row.createById === $store.state.user.id||haveProjectIds.includes(scope.row.projectId)) && scope.row.status === '5'&& scope.row.reviewStatus === '5' && scope.row.onlineArchivingStatus === '5' && scope.row.paperArchivingStatus === '4'" text type="primary" @click="adjustPushPaper(scope.row)">驳回调整</el-button>
+					<el-button v-if="hasPermission('cw:workContract:filed') && (scope.row.createById === $store.state.user.id||haveProjectIds.includes(scope.row.projectId)) && scope.row.status === '5'&& scope.row.reviewStatus === '5' && scope.row.onlineArchivingStatus === '5' && scope.row.paperArchivingStatus === '2' && scope.row.projectLevel === '1'" text type="primary" @click="rebackPushPaper(scope.row)">撤回纸质归档</el-button>
+					<el-button v-if="hasPermission('cw:workContract:filed') && (scope.row.createById === $store.state.user.id||haveProjectIds.includes(scope.row.projectId)) && scope.row.status === '5'&& scope.row.reviewStatus === '5' && scope.row.onlineArchivingStatus === '5' && scope.row.paperArchivingStatus === '4' && scope.row.projectLevel === '1'" text type="primary" @click="adjustPushPaper(scope.row)">驳回调整</el-button>
 				</div>
             </template>
           </vxe-column>
@@ -478,7 +478,7 @@
 			}
 
 			if (row.projectLevel === '1') {
-				status = 'startAndClose'
+				status = 'startAndHold'
 			}
 
 			taskService.getTaskDef({ procDefId: this.processDefinitionAuditId,
@@ -747,11 +747,11 @@
 			let procDefId = ''
 			let procDefKey = ''
 			if (row.projectLevel === '1') {
-				status = 'startAndClose'
+				status = 'startAndHold'
 				procDefId = this.onlineArchivingProcDefIdA
 				procDefKey = this.onlineArchivingProcDefKeyA
 			} else if (row.projectLevel === '2'){
-				status = 'startAndClose'
+				status = 'startAndHold'
 				procDefId = this.onlineArchivingProcDefIdB
 				procDefKey = this.onlineArchivingProcDefKeyB
 			}
@@ -870,7 +870,7 @@
 				title = ' ' + row.documentNo + ' - ' + row.projectName
 			}
 
-			let processTitle = `${this.userName} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了` + title + '[报告-线上归档]'
+			let processTitle = `${this.userName} 在 ${this.moment(new Date()).format('YYYY-MM-DD HH:mm')} 发起了` + title + '[报告-纸质归档]'
 			let status = 'startAndHold'
 			if (row.reviewStatus === '3') {
 				status = 'startAndClose'

+ 18 - 2
src/views/cw/reportManagement/onlineArchiving/ReportOnlineArchiving.vue

@@ -222,6 +222,7 @@
 				method: '',
 				loading: false,
 				inputForm: {
+					reviewBy: '',
 					onlineArchivingProcInsId: '',
 					onlineArchivingId: '',
 					projectId: '',
@@ -287,6 +288,7 @@
 				console.log('method', method)
 				this.method = method
 				this.inputForm = {
+					reviewBy: '',
 					onlineArchivingProcInsId: '',
 					onlineArchivingId: '',
 					projectId: '',
@@ -426,6 +428,7 @@
 				} else if (status === 'start') {
 					// 送审  待审核
 					this.inputForm.status = '2'
+					this.inputForm.assignee = this.inputForm.reviewBy
 				} else if (status === 'agree') {
 					// 审核同意
 					this.inputForm.agreeDate = this.moment(new Date()).format('YYYY-MM-DD')
@@ -433,6 +436,7 @@
 					// this.inputForm.status = '5'
 				} else if (status === 'reapply') {
 					this.inputForm.status = '2'
+					this.inputForm.assignee = this.inputForm.reviewBy
 				}
 				if (this.commonJS.isEmpty(this.tableData)) {
 					this.loading = false
@@ -470,8 +474,18 @@
 								if (item.levelFlag === 2 && item.mustFlag === 1){
 									if (item.children.length === 0){
 										this.loading = false
-										this.$message.error('文件未上传')
-										throw new Error('文件未上传')
+										this.$message.error(item.name + '文件未上传')
+										throw new Error(item.name + '文件未上传')
+									} else {
+										item.children.forEach(child => {
+											const fileExtension = child.attachmentName.split('.').pop(); // 获取文件后缀名
+											const supportedFileTypes = item.type.split(','); // 支持的文件类型数组
+											if (!supportedFileTypes.includes(fileExtension)) {
+												this.loading = false;
+												this.$message.error(child.attachmentName + ' 文件类型不受支持');
+												throw new Error(child.attachmentName + ' 文件类型不受支持');
+											}
+										});
 									}
 								}
 							})
@@ -549,6 +563,8 @@
 			},
 			close () {
 				this.inputForm = {
+					reviewBy: '',
+					onlineArchivingProcInsId: '',
 					onlineArchivingId: '',
 					projectId: '',
 					reportNo: '',

+ 46 - 18
src/views/cw/reportManagement/reportReview/ReportReviewForm.vue

@@ -112,13 +112,26 @@
 					  </el-form-item>
 				  </el-col>
 				  <el-col :span="12">
-					  <el-form-item label="下一节点审核人" prop="reviewBy"
+					  <el-form-item label="审核人" prop="reviewBy"
 									:rules="[
-										{required: true, message:'下一节点审核人不能为空', trigger:'change'}
+										{required: true, message:'审核人不能为空', trigger:'change'}
                    ]">
-						  <UserSelectSignatory style="width: 100%" ref="userSelect1"
-											   :readonly="true" :limit='1' :modelValue="inputForm.reviewBy"
-											   @update:modelValue='(value) => {inputForm.reviewBy = value}'></UserSelectSignatory>
+						  <!--						  <UserSelectSignatory style="width: 100%" ref="userSelect1"-->
+						  <!--											   :readonly="true" :limit='1' :modelValue="inputForm.reviewBy"-->
+						  <!--											   @update:modelValue='(value) => {inputForm.reviewBy = value}'></UserSelectSignatory>-->
+						  <SelectUserTree
+							  ref="companyTree"
+							  :props="{
+                  value: 'id',             // ID字段名
+                  label: 'name',         // 显示名称
+                  children: 'children'    // 子级字段名
+                }"
+							  :url="`/system-server/sys/user/treeUserDataAllOffice?type=2`"
+							  :value="inputForm.reviewBy"
+							  :clearable="true"
+							  size="default"
+							  :accordion="true"
+							  @getValue="(value) => {inputForm.reviewBy=value}"/>
 					  </el-form-item>
 				  </el-col>
 				  <el-col :span="12">
@@ -533,6 +546,7 @@
 </template>
 
 <script>
+	import SelectUserTree from '@/views/utils/treeUserSelect'
 	import FileForm from './FileForm'
 	import OSSSerivce, {
 		// eslint-disable-next-line no-unused-vars
@@ -684,6 +698,7 @@
       }
     },
     components: {
+		SelectUserTree,
 		FileForm,
 		UserPullFormNew,
 		UserSelectSignatory,
@@ -768,19 +783,21 @@
 				  this.detailKey = Math.random()
 			  } else {
 				  console.log('this.inputForm.detailInfos', this.inputForm.detailInfos)
-				  this.reportReviewService.getUserInfo(this.inputForm.reviewBy).then((data) => {
-					  this.inputForm.detailInfos.forEach(item => {
-						  professionList = this.getProfessionList(item.professionType)
-						  professionList.forEach(item2 => {
-							  if (item.profession == item2.value) {
-								  item.profession = item2.label
-							  }
-							  if (item.userRole === '技术负责人') {
-								  item.memberName = data.memberName + '(' + this.inputForm.reviewByName + '代)'
-							  }
+				  if (this.commonJS.isNotEmpty(this.inputForm.reviewBy)) {
+					  this.reportReviewService.getUserInfo(this.inputForm.reviewBy).then((data) => {
+						  this.inputForm.detailInfos.forEach(item => {
+							  professionList = this.getProfessionList(item.professionType)
+							  professionList.forEach(item2 => {
+								  if (item.profession == item2.value) {
+									  item.profession = item2.label
+								  }
+								  if (item.userRole === '技术负责人') {
+									  item.memberName = data.memberName + '(' + this.inputForm.reviewByName + '代)'
+								  }
+							  })
 						  })
 					  })
-				  })
+				  }
 
 			  }
 			  console.log('status', this.status)
@@ -1027,11 +1044,22 @@
 					  }
 				  }
 				  this.tableData.forEach(item=>{
+				  	console.log('附件item', item)
 					  if (item.levelFlag === 2 && item.mustFlag === 1){
 						  if (item.children.length === 0){
 							  this.loading = false
-							  this.$message.error('文件未上传')
-							  throw new Error('文件未上传')
+							  this.$message.error(item.name + '文件未上传')
+							  throw new Error(item.name + '文件未上传')
+						  } else {
+							  item.children.forEach(child => {
+								  const fileExtension = child.attachmentName.split('.').pop(); // 获取文件后缀名
+								  const supportedFileTypes = item.type.split(','); // 支持的文件类型数组
+								  if (!supportedFileTypes.includes(fileExtension)) {
+									  this.loading = false;
+									  this.$message.error(child.attachmentName + ' 文件类型不受支持');
+									  throw new Error(child.attachmentName + ' 文件类型不受支持');
+								  }
+							  });
 						  }
 					  }
 				  })

+ 46 - 19
src/views/cw/reportManagement/reportReview/ReportReviewForm2.vue

@@ -81,9 +81,22 @@
 									:rules="[
 										{required: true, message:'审核人员不能为空', trigger:'change'}
                    ]">
-						  <UserSelectSignatory style="width: 100%" ref="userSelect1"
-											   :readonly="true" :limit='1' :modelValue="inputForm.reviewBy"
-											   @update:modelValue='(value) => {inputForm.reviewBy = value}'></UserSelectSignatory>
+<!--						  <UserSelectSignatory style="width: 100%" ref="userSelect1"-->
+<!--											   :readonly="true" :limit='1' :modelValue="inputForm.reviewBy"-->
+<!--											   @update:modelValue='(value) => {inputForm.reviewBy = value}'></UserSelectSignatory>-->
+						  <SelectUserTree
+							  ref="companyTree"
+							  :props="{
+                  value: 'id',             // ID字段名
+                  label: 'name',         // 显示名称
+                  children: 'children'    // 子级字段名
+                }"
+							  :url="`/system-server/sys/user/treeUserDataAllOffice?type=2`"
+							  :value="inputForm.reviewBy"
+							  :clearable="true"
+							  size="default"
+							  :accordion="true"
+							  @getValue="(value) => {inputForm.reviewBy=value}"/>
 					  </el-form-item>
 				  </el-col>
 				  <el-col :span="12">
@@ -427,6 +440,7 @@
 	} from '@/api/sys/OSSService'
 	import UserPullFormNew from '@/views/finance/invoice/UserPullFormNew'
 	import UserSelectSignatory from '@/components/userSelectNew'
+	import SelectUserTree from '@/views/utils/treeUserSelect'
   import ReportCancellApplyService from '@/api/cw/reportCancellApply/ReportCancellApplyService'
   import ReportReviewService from '@/api/cw/reportManagement/ReportReviewService'
   import projectReportService from '@/api/cw/reportManagement/ProjectReportService'
@@ -570,6 +584,7 @@
     components: {
 		FileForm,
 		UserPullFormNew,
+		SelectUserTree,
 		UserSelectSignatory,
     },
     methods: {
@@ -653,19 +668,21 @@
 				  this.detailKey = Math.random()
 			  } else {
 				  console.log('this.inputForm.detailInfos', this.inputForm.detailInfos)
-				  this.reportReviewService.getUserInfo(this.inputForm.reviewBy).then((data) => {
-					  this.inputForm.detailInfos.forEach(item => {
-						  professionList = this.getProfessionList(item.professionType)
-						  professionList.forEach(item2 => {
-							  if (item.profession == item2.value) {
-								  item.profession = item2.label
-							  }
-							  if (item.userRole === '技术负责人') {
-								  item.memberName = data.memberName + '(' + this.inputForm.reviewByName + '代)'
-							  }
+				  if (this.commonJS.isNotEmpty(this.inputForm.reviewBy)) {
+					  this.reportReviewService.getUserInfo(this.inputForm.reviewBy).then((data) => {
+						  this.inputForm.detailInfos.forEach(item => {
+							  professionList = this.getProfessionList(item.professionType)
+							  professionList.forEach(item2 => {
+								  if (item.profession == item2.value) {
+									  item.profession = item2.label
+								  }
+								  if (item.userRole === '技术负责人') {
+									  item.memberName = data.memberName + '(' + this.inputForm.reviewByName + '代)'
+								  }
+							  })
 						  })
 					  })
-				  })
+				  }
 
 			  }
 			  console.log('status', this.status)
@@ -767,7 +784,7 @@
           // 暂存
           this.inputForm.reviewStatus = '1'
           this.loading = true
-
+			let i = this.inputForm.detailInfos.length
 			for (let j = 0; j < i; j++) {
 				this.inputForm.detailInfos[j].detailNumber = ''
 				this.inputForm.detailInfos[j].detailNumber = j + 1;
@@ -914,8 +931,18 @@
 					  if (item.levelFlag === 2 && item.mustFlag === 1){
 						  if (item.children.length === 0){
 							  this.loading = false
-							  this.$message.error('文件未上传')
-							  throw new Error('文件未上传')
+							  this.$message.error(item.name + '文件未上传')
+							  throw new Error(item.name + '文件未上传')
+						  } else {
+							  item.children.forEach(child => {
+								  const fileExtension = child.attachmentName.split('.').pop(); // 获取文件后缀名
+								  const supportedFileTypes = item.type.split(','); // 支持的文件类型数组
+								  if (!supportedFileTypes.includes(fileExtension)) {
+									  this.loading = false;
+									  this.$message.error(child.attachmentName + ' 文件类型不受支持');
+									  throw new Error(child.attachmentName + ' 文件类型不受支持');
+								  }
+							  });
 						  }
 					  }
 				  })
@@ -939,7 +966,7 @@
 						  } else if (this.inputForm.projectLevel === '2'){
 							  this.inputForm.reviewStatus = '5'
 							  this.reportReviewService.saveFormReviewNew(this.inputForm).then((data) => {
-								  this.$router.push({path: '/cw/reportManagement/ReportManagementList'})
+								  this.$router.push({path: '/cw/reportManagement/ReportManagementList2'})
 								  this.loading = false
 							  }).catch(() => {
 								  this.loading = false
@@ -959,7 +986,7 @@
 					  } else if (this.inputForm.projectLevel === '2'){
 						  this.inputForm.reviewStatus = '5'
 						  this.reportReviewService.saveFormReviewNew(this.inputForm).then((data) => {
-							  this.$router.push({path: '/cw/reportManagement/ReportManagementList'})
+							  this.$router.push({path: '/cw/reportManagement/ReportManagementList2'})
 							  this.loading = false
 						  }).catch(() => {
 							  this.loading = false

+ 14 - 3
src/views/cw/reportManagement/signAndIssue/ReportSignAndIssue.vue

@@ -234,7 +234,8 @@
 						<el-col :span="12">
 							<el-form-item label="造价咨询营业收入(万元)" prop="ziXunShouRu"
 										  :rules="[
-										{ validator: ziXunShouRuRange, trigger: 'change' }
+										{ validator: ziXunShouRuRange, trigger: 'change' },
+										{required: true, message: '造价咨询营业收入(万元)不能为空', trigger: 'blur'},
 			   ]">
 								<el-input
 									v-on:input="inputForm.ziXunShouRu=inputForm.ziXunShouRu.replace(/[^\d.]/g,'')
@@ -687,8 +688,18 @@
 								if (item.levelFlag === 2 && item.mustFlag === 1){
 									if (item.children.length === 0){
 										this.loading = false
-										this.$message.error('文件未上传')
-										throw new Error('文件未上传')
+										this.$message.error(item.name + '文件未上传')
+										throw new Error(item.name + '文件未上传')
+									} else {
+										item.children.forEach(child => {
+											const fileExtension = child.attachmentName.split('.').pop(); // 获取文件后缀名
+											const supportedFileTypes = item.type.split(','); // 支持的文件类型数组
+											if (!supportedFileTypes.includes(fileExtension)) {
+												this.loading = false;
+												this.$message.error(child.attachmentName + ' 文件类型不受支持');
+												throw new Error(child.attachmentName + ' 文件类型不受支持');
+											}
+										});
 									}
 								}
 							})