Преглед изворни кода

Merge branch 'dev1.2.0' of http://222.90.211.174:3000/suf/factoring-trade-c-front-end into dev1.2.0

sufan пре 2 месеци
родитељ
комит
da4685af2c

+ 19 - 0
src/api/sushang/supplierCredit.js

@@ -0,0 +1,19 @@
+import request from '@/utils/request'
+
+// 身份证OCR识别
+export function ocrIdentifyCard(params) {
+  return request({
+    url: '/zjxl/do_idCardOCR',
+    method: 'get',
+    params
+  })
+}
+
+// 营业执照OCR识别
+export function ocrBusinessLicense(params) {
+  return request({
+    url: '/zjxl/do_businessLicenseOCR',
+    method: 'get',
+    params
+  })
+}

+ 1 - 0
src/components/Upload/index.vue

@@ -452,6 +452,7 @@ export default {
         const newName = `预览图片${fileType || type}`
         window.open(`#/perview?fileId=${idNum}&absolutePath=${absolutePath}&name=${newName}`)
       } else {
+        // window.open(`#/perview/pdf?fileId=${idNum}&resource=${fileType ? 0 : 1}`)
         window.open(`${process.env.VUE_APP_BASE_API}/system/fileStorage/preview?fileId=${idNum}&resource=${fileType ? 0 : 1}#toolbar=0&navpanes=0&scrollbar=0`)
       }
     },

+ 5 - 0
src/router/index.js

@@ -70,6 +70,11 @@ export const constantRoutes = [
     component: () => import('@/views/perview/index'),
     hidden: true
   },
+  {
+    path: '/perview/pdf',
+    component: () => import('@/views/perview/pdf'),
+    hidden: true
+  },
   {
     path: '/about',
     component: () => import('@/views/perview/about'),

+ 289 - 26
src/views/myBusiness/supplementaryInfo/components/AddInfo.vue

@@ -19,7 +19,7 @@
         </div>
         <cy-comm-table
           ref="commTable"
-          style="margin-top: 10px; width: 100%"
+          style="margin-top: 10px; width: 100%;"
           :columns="columns"
           :data="tableData"
           :count="0"
@@ -122,10 +122,27 @@
             }"
             :disabled="disabled"
             :file-data="businessLicense"
+            :isCallBack="true"
+            :limit="1"
+            @call-back="businessLicenseCallBack"
             :upload-from-orange-status="true"
             placeholder="请上传营业执照"
           />
         </el-form-item>
+        <el-form-item label="经营范围" prop="businessScope">
+        <el-input
+          v-model="ruleForm.businessScope"
+          :disabled="disabled"
+          placeholder="请输入经营范围"
+        />
+      </el-form-item>
+      <el-form-item label="注册地址" prop="registeredAddress">
+        <el-input
+          v-model="ruleForm.registeredAddress"
+          :disabled="disabled"
+          placeholder="请输入注册地址"
+        />
+      </el-form-item>
         <el-form-item label="基本户信息" class="form-required" prop="basicAccountInformation">
           <cy-upload
             ref="basicAccountInformation"
@@ -138,6 +155,20 @@
             placeholder="请上传基本户信息"
           />
         </el-form-item>
+        <el-form-item label="基本存款账号" prop="bankAccount">
+        <el-input
+          v-model="ruleForm.bankAccount"
+          :disabled="disabled"
+          placeholder="请输入基本存款账号"
+        />
+      </el-form-item>
+      <el-form-item label="基本账户开户行名称" prop="bank">
+        <el-input
+          v-model="ruleForm.bank"
+          :disabled="disabled"
+          placeholder="请输入基本账户开户行名称"
+        />
+      </el-form-item>
         <el-form-item label="公司章程和修正案" class="form-required" prop="articlesAssociation">
           <cy-upload
             ref="articlesAssociation"
@@ -173,6 +204,8 @@
 import { salesContractManagementGetAuthStatus, salesContractManagementSignType } from '@/api/myTrade/salesContractManagement/salesContractManagement'
 import creditInvestigation from '../mixins/creditInvestigation'
 import { mapGetters } from 'vuex'
+import { ocrIdentifyCard, ocrBusinessLicense } from '@/api/sushang/supplierCredit'
+
 export default {
   mixins: [creditInvestigation],
   props: {
@@ -196,7 +229,11 @@ export default {
         businessAddress: '',
         id: '',
         cascaderAddress: [],
-        inputAddress: ''
+        inputAddress: '',
+        businessScope: '',
+        registeredAddress: '',
+        bankAccount: '',
+        bank: ''
       },
       locationMap: [],
       rentalContract: [],
@@ -207,7 +244,11 @@ export default {
       articlesAssociation: [],
       judgment: [],
       rules: {
-        businessAddress: [{ required: true, message: '请输入经营地址', trigger: 'blur' }]
+        businessAddress: [{ required: true, message: '请输入经营地址', trigger: 'blur' }],
+        businessScope: [{ required: true, message: '请输入经营范围', trigger: 'blur' }],
+        registeredAddress: [{ required: true, message: '请输入注册地址', trigger: 'blur' }],
+        bankAccount: [{ required: true, message: '请输入基本存款账号', trigger: 'blur' }],
+        bank: [{ required: true, message: '请输入基本账户开户行名称', trigger: 'blur' }]
       },
       tableData: [],
       columns: [
@@ -217,15 +258,55 @@ export default {
         },
         {
           label: '身份类型',
+          width: 100,
           prop: 'typeStr',
           ruleRequired: true
         },
+        {
+          label: '身份证正面',
+          width: 180,
+          ruleRequired: true,
+          render: (h, row, index) => {
+            return <cy-upload
+              ref={`idcardStorage_front_${index}`}
+              uploadParams={{ fileType: 'enterprise_idcard_front' }}
+              disabled={this.disabled}
+              isCallBack={true}
+              limit={1}
+              fileData={(row.frontFile && row.frontFile.length) ? row.frontFile : []}
+              oncall-back={ (fileList, fileName) => {
+                this.frontCardCallBack(fileList, fileName, row, index)
+              } }
+              defaultDesc='请上传身份证正面'
+            />
+          }
+        },
+        {
+          label: '身份证反面',
+          width: 180,
+          ruleRequired: true,
+          render: (h, row, index) => {
+            return <cy-upload
+              ref={`idcardStorage_back_${index}`}
+              uploadParams={{ fileType: 'enterprise_idcard_back' }}
+              disabled={this.disabled}
+              isCallBack={true}
+              limit={1}
+              fileData={(row.frontFile && row.frontFile.length) ? row.backFile : []}
+              oncall-back={ (fileList, fileName) => {
+                this.backCardCallBack(fileList, fileName, row, index)
+              } }
+              defaultDesc='请上传身份证反面'
+            />
+          }
+        },
         {
           label: '姓名',
+          width: 100,
           prop: 'name',
           ruleRequired: true,
           render: (h, row) => {
-            return row.typeStr === '实控人' ? <el-input disabled={this.disabled} v-model={ row.name} placeholder='请输入姓名'></el-input> : <span>{row.name}</span>
+            return row.typeStr === '实控人' || row.typeStr === '大股东' ? <el-input disabled={this.disabled} v-model={ row.name} placeholder='请输入姓名'></el-input> : <span>{row.name}</span>
           }
         },
         {
@@ -233,19 +314,71 @@ export default {
           prop: 'socialCreditCode',
           ruleRequired: true,
           render: (h, row) => {
-            return <cy-card-input v-model={row.socialCreditCode} disabled={this.disabled} placeholder='请输入身份证号'></cy-card-input>
+            return <el-input disabled={this.disabled} v-model={row.socialCreditCode} placeholder='请输入身份证号'></el-input>
           }
         },
         {
-          label: '身份证正反面',
-          render: (h, row, index) => {
-            return <cy-upload
-              ref={`idcardStorage${index}`}
-              uploadParams={{ fileType: 'enterprise_idcard_Files' }}
+          label: '手机号码',
+          render: (h, row) => {
+            return <el-input
               disabled={this.disabled}
-              fileData={row.files}
-              defaultDesc={`请上传身份证正反面`}
-            />
+              v-model={row.phoneNumber}
+              placeholder='请输入手机号码'
+            ></el-input>
+          }
+        },
+        {
+          label: '户籍地址',
+          ruleRequired: true,
+          render: (h, row) => {
+            return <el-input
+              disabled={this.disabled}
+              v-model={row.domicileAddress}
+              placeholder='请输入户籍地址'
+            ></el-input>
+          }
+        },
+        {
+          label: '常住地址',
+          ruleRequired: true,
+          render: (h, row) => {
+            return <el-input
+              disabled={this.disabled}
+              v-model={row.permanentAddress}
+              placeholder='请输入常住地址'
+            ></el-input>
+          }
+        },
+        {
+          label: '证件有效开始日期',
+          ruleRequired: true,
+          render: (h, row) => {
+            return <el-date-picker
+              disabled={this.disabled}
+              v-model={row.validFrom}
+              type='date'
+              value-format='yyyy-MM-dd'
+              placeholder='请选择证件有效开始日期'>
+            </el-date-picker>
+          }
+        },
+        {
+          label: '证件有效截止期',
+          ruleRequired: true,
+          render: (h, row) => {
+            return <el-date-picker
+              disabled={this.disabled}
+              v-model={row.validTo}
+              type='date'
+              value-format='yyyy-MM-dd'
+              placeholder='请选择证件有效截止期'>
+            </el-date-picker>
+          }
+        },
+        {
+          label: '邮箱',
+          render: (h, row) => {
+            return <el-input disabled={this.disabled} v-model={row.email} placeholder='请输入邮箱地址'></el-input>
           }
         }
       ],
@@ -345,13 +478,17 @@ export default {
       handler(newV) {
         if (newV === undefined || !newV?.id) return
         if (newV && Object.keys(newV)) {
-          const { businessAddress, locationMap, rentalContract, waterElectricityFees, officeEnvironment, businessLicense, basicAccountInformation, articlesAssociation, judgment, creditInvestigationInfoList, corporateName, certificateShortSignUrl, certificateSignStatus, shortAuthUrl, authStatus, id, cComprehensiveRiskInvestigationId, fddCustomerId, certificateContractId, certificateTransactionId } = JSON.parse(JSON.stringify(newV))
+          const { businessAddress, locationMap, rentalContract, waterElectricityFees, officeEnvironment, businessLicense, basicAccountInformation, articlesAssociation, judgment, creditInvestigationInfoList, corporateName, certificateShortSignUrl, certificateSignStatus, shortAuthUrl, authStatus, id, cComprehensiveRiskInvestigationId, fddCustomerId, certificateContractId, certificateTransactionId, businessScope, registeredAddress, bankAccount, bank } = JSON.parse(JSON.stringify(newV))
           this.ruleForm = {
             businessAddress,
             id,
             cComprehensiveRiskInvestigationId,
             cascaderAddress: [],
-            inputAddress: ''
+            inputAddress: '',
+            businessScope,
+            registeredAddress,
+            bankAccount,
+            bank
           }
           this.locationMap = locationMap
           this.rentalContract = rentalContract
@@ -362,6 +499,17 @@ export default {
           this.articlesAssociation = articlesAssociation
           this.judgment = judgment
           this.tableData = JSON.parse(JSON.stringify(creditInvestigationInfoList))
+
+          // 转一下个人征信身份证正反面回显
+          this.tableData.forEach((el) => {
+            const frontArr = []
+            const backArr = []
+            frontArr.push(el.frontFile)
+            backArr.push(el.backFile)
+            el.frontFile = frontArr
+            el.backFile = backArr
+          })
+
           this.enterpriseTableData = [
             {
               corporateName,
@@ -413,13 +561,33 @@ export default {
 
       // 个人征信
       const creditInvestigationInfoList = this.tableData.map((item, index) => {
-        const { type, name, socialCreditCode } = item
-        const fileLists = this.$refs.commTable.$refs[`idcardStorage${index}`].getFileLists
+        const {
+          type,
+          name,
+          socialCreditCode,
+          phoneNumber,
+          domicileAddress,
+          permanentAddress,
+          validFrom,
+          validTo,
+          email
+        } = item
+        // const fileLists = this.$refs.commTable.$refs[`idcardStorage${index}`].getFileLists
+        const fileFrontList = this.$refs.commTable.$refs[`idcardStorage_front_${index}`].getFileLists
+        const fileBackList = this.$refs.commTable.$refs[`idcardStorage_back_${index}`].getFileLists
         return {
           type,
           name,
           socialCreditCode,
-          fileList: fileLists.map(item => item.id)
+          phoneNumber,
+          domicileAddress,
+          permanentAddress,
+          validFrom,
+          validTo,
+          email,
+          front: fileFrontList.length ? fileFrontList[0].id : '',
+          back: fileBackList.length ? fileBackList[0].id : ''
+          // fileList: fileLists.map(item => item.id)
         }
       })
 
@@ -471,18 +639,20 @@ export default {
             return
           }
 
-          for (let i = 0; i < creditInvestigationInfoList.length; i++) {
-            const { name, socialCreditCode, fileList } = creditInvestigationInfoList[i]
-            if (!name) {
-              this.$message.warning('请输入姓名')
+          // 个人征信校验
+          if (!this.validateCreditInvestigationInfoList(creditInvestigationInfoList)) return
+          // 校验手机号、邮箱 -- 只校验法人
+          if (creditInvestigationInfoList.length) {
+            if (creditInvestigationInfoList[0].phoneNumber === '') {
+              this.$message.warning('请输入个人征信第一行法定代表人手机号')
               return
             }
-            if (!socialCreditCode) {
-              this.$message.warning('请输入身份证号')
+            if (creditInvestigationInfoList[0].email === '') {
+              this.$message.warning('请输入个人征信第一行法定代表人邮箱地址')
               return
             }
-            if (!fileList.length) {
-              this.$message.warning('请上传身份证正反面')
+            if (creditInvestigationInfoList[0].email && creditInvestigationInfoList[0].email.indexOf('@') < 0) {
+              this.$message.warning(`请输入个人征信第一行合法邮箱地址`)
               return
             }
           }
@@ -503,6 +673,99 @@ export default {
     getBusinessAddress() {
       const address = this.ruleForm.cascaderAddress.length ? this.ruleForm.cascaderAddress.join('') : ''
       this.ruleForm.businessAddress = address + this.ruleForm.inputAddress
+    },
+    // 身份证正面上传成功回调
+    async frontCardCallBack(fileList, fileName, row, index) {
+      const fileFrontList = this.$refs.commTable.$refs[`idcardStorage_front_${index}`].getFileLists
+
+      const fileBackList = this.$refs.commTable.$refs[`idcardStorage_back_${index}`].getFileLists
+
+      if (fileFrontList.length && fileBackList.length) {
+        row.frontFile = fileFrontList
+        row.backFile = fileBackList
+        this.ocrIdCard(fileFrontList[0].id, fileBackList[0].id, row)
+      }
+    },
+    // 身份证背面上传成功回调
+    backCardCallBack(fileList, fileName, row, index) {
+      const fileFrontList = this.$refs.commTable.$refs[`idcardStorage_front_${index}`].getFileLists
+
+      const fileBackList = this.$refs.commTable.$refs[`idcardStorage_back_${index}`].getFileLists
+
+      if (fileFrontList.length && fileBackList.length) {
+        row.frontFile = fileFrontList
+        row.backFile = fileBackList
+        this.ocrIdCard(fileFrontList[0].id, fileBackList[0].id, row)
+      }
+    },
+    // OCR身份证
+    async ocrIdCard(frontId, backId, tableRow) {
+      if (frontId !== '' && backId !== '') {
+        const res = await ocrIdentifyCard({
+          front: frontId,
+          back: backId
+        })
+
+        if (res.success) {
+          tableRow.domicileAddress = res.data.address
+          tableRow.permanentAddress = res.data.address
+          tableRow.socialCreditCode = res.data.idcard
+          tableRow.validFrom = res.data.validfrom
+          tableRow.validTo = res.data.validto
+        }
+      }
+    },
+    // 营业执照的OCR
+    async businessLicenseCallBack() {
+      const fileList = this.$refs.businessLicense.getFileLists
+
+      if (fileList.length) {
+        const res = await ocrBusinessLicense({
+          fileId: fileList[0].id
+        })
+
+        console.log(res)
+        if (res.success) {
+          this.ruleForm.businessScope = res.data.businessScope
+          this.ruleForm.registeredAddress = res.data.address
+        }
+      }
+    },
+    // 校验个人征信表格
+    validateCreditInvestigationInfoList(dataArr) {
+      let i = 0
+      while (i < dataArr.length) {
+        if (!dataArr[i].name) {
+          this.$message.warning(`请输入个人征信第${ i + 1 }行姓名`)
+          return false
+        } else if (!dataArr[i].socialCreditCode) {
+          this.$message.warning(`请输入个人征信第${ i + 1 }行身份证号`)
+          return false
+        } else if (!dataArr[i].domicileAddress) {
+          this.$message.warning(`请输入个人征信第${ i + 1 }行户籍地址`)
+          return false
+        } else if (!dataArr[i].permanentAddress) {
+          this.$message.warning(`请输入个人征信第${ i + 1 }行常住地址`)
+          return false
+        } else if (!dataArr[i].validFrom) {
+          this.$message.warning(`请输入个人征信第${ i + 1 }行证件开始日期`)
+          return false
+        } else if (!dataArr[i].validTo) {
+          this.$message.warning(`请输入个人征信第${ i + 1 }行证件结束日期`)
+          return false
+        } else if (!dataArr[i].front) {
+          this.$message.warning(`请上传个人征信第${ i + 1 }行身份证正面`)
+          return false
+        } else if (!dataArr[i].back) {
+          this.$message.warning(`请上传个人征信第${ i + 1 }行身份证反面`)
+          return false
+        } else if (!dataArr[i].email) {
+          this.$message.warning(`请输入个人征信第${ i + 1 }行邮箱`)
+          return false
+        }
+        i++
+      }
+      return true
     }
   }
 }

+ 92 - 0
src/views/myBusiness/supplementaryInfo/components/AdditionalInfo.vue

@@ -0,0 +1,92 @@
+<template>
+  <div class="supplementary-info">
+    <cy-info-title type="center">其它补充资料</cy-info-title>
+    <el-form
+      ref="ruleFormRef"
+      :model="ruleForm"
+      :rules="rules"
+      label-position="top"
+      label-width="150px"
+      class="rule-form-orange"
+    >
+      <el-form-item label="从业人数" prop="peopleEngaged">
+        <el-input
+          v-model="ruleForm.peopleEngaged"
+          :disabled="disabled"
+          placeholder="请输入从业人数"
+        />
+      </el-form-item>
+      <el-form-item label="营业收入(元)" prop="operatingRevenue">
+        <cy-amount-input
+          v-model="ruleForm.operatingRevenue"
+          :disabled="disabled"
+          placeholder="请输入营业收入"
+        />
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    disabled: {
+      type: Boolean,
+      default: false
+    },
+    detailInfo: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data() {
+    return {
+      ruleForm: {
+        peopleEngaged: '',
+        operatingRevenue: ''
+      },
+      rules: {
+        peopleEngaged: [{ required: true, message: '请输入从业人数', trigger: 'blur' }],
+        operatingRevenue: [{ required: true, message: '请输入营业收入', trigger: 'blur' }]
+      }
+    }
+  },
+  watch: {
+    detailInfo: {
+      handler(newV) {
+        console.log('detailInfo-----')
+        console.log(newV)
+        if (newV === undefined) return
+        if (newV && Object.keys(newV).length) {
+          this.ruleForm.peopleEngaged = newV.peopleEngaged
+          this.ruleForm.operatingRevenue = newV.operatingRevenue
+        }
+      },
+      immediate: true,
+      deep: true
+    }
+  },
+  methods: {
+    getParams(type) {
+      const params = {
+        peopleEngaged: this.ruleForm.peopleEngaged,
+        operatingRevenue: this.ruleForm.operatingRevenue
+      }
+      return new Promise((resolve, reject) => {
+        if (type === 'submit') {
+          this.$refs.ruleFormRef.validate(valid => {
+            if (valid) {
+              resolve(params)
+            } else {
+              reject()
+              return false
+            }
+          })
+        } else {
+          resolve(params)
+        }
+      })
+    }
+  }
+}
+</script>

+ 50 - 0
src/views/myBusiness/supplementaryInfo/components/BusinessSituation.vue

@@ -83,6 +83,44 @@
                 </cy-custom-select>
               </template>
             </el-table-column>
+            <el-table-column prop="contractName" label="合同名称">
+              <template slot-scope="scope">
+                <el-input
+                  :disabled="disabled"
+                  v-model="scope.row.contractName"
+                  placeholder="请输入合同名称"
+                />
+              </template>
+            </el-table-column>
+            <el-table-column prop="contractNumber" label="合同编号">
+              <template slot-scope="scope">
+                <el-input
+                  :disabled="disabled"
+                  v-model="scope.row.contractNumber"
+                  placeholder="请输入合同编号"
+                />
+              </template>
+            </el-table-column>
+            <el-table-column prop="contractAmount" label="合同金额(元)">
+              <template slot-scope="scope">
+                <cy-amount-input
+                  :disabled="disabled"
+                  v-model="scope.row.contractAmount"
+                  placeholder="请输入合同金额"
+                />
+              </template>
+            </el-table-column>
+            <el-table-column prop="contractDate" label="合同日期">
+              <template slot-scope="scope">
+                <el-date-picker
+                  :disabled="disabled"
+                  v-model="scope.row.contractDate"
+                  type="date"
+                  value-format="yyyy-MM-dd"
+                  placeholder="请输入合同日期"
+                />
+              </template>
+            </el-table-column>
             <el-table-column prop="name" label="下游销售单据(请上传验收单、结算单或对账单、发票、近期回款凭证)">
               <template slot-scope="scope">
                 <cy-upload
@@ -148,10 +186,18 @@ export default {
       downstreamTableData: [
         {
           name: '',
+          contractName: '',
+          contractNumber: '',
+          contractAmount: '',
+          contractDate: '',
           fileStorages: []
         },
         {
           name: '',
+          contractName: '',
+          contractNumber: '',
+          contractAmount: '',
+          contractDate: '',
           fileStorages: []
         }
       ]
@@ -200,6 +246,10 @@ export default {
         if (item?.name) {
           return {
             name: item.name,
+            contractName: item.contractName,
+            contractNumber: item.contractNumber,
+            contractAmount: item.contractAmount,
+            contractDate: item.contractDate,
             files: this.$refs[`downfileStorage${index}`].getFileLists.map(item => item.id)
           }
         }

+ 277 - 23
src/views/myBusiness/supplementaryInfo/components/GuaranteeAddInfo.vue

@@ -100,10 +100,27 @@
           }"
           :disabled="disabled"
           :file-data="businessLicense"
+          :isCallBack="true"
+          :limit="1"
+          @call-back="businessLicenseCallBack"
           :upload-from-orange-status="true"
           placeholder="请上传营业执照"
         />
       </el-form-item>
+      <el-form-item label="经营范围" prop="businessScope">
+        <el-input
+          v-model="ruleForm.businessScope"
+          :disabled="disabled"
+          placeholder="请输入经营范围"
+        />
+      </el-form-item>
+      <el-form-item label="注册地址" prop="registeredAddress">
+        <el-input
+          v-model="ruleForm.registeredAddress"
+          :disabled="disabled"
+          placeholder="请输入注册地址"
+        />
+      </el-form-item>
       <el-form-item label="基本户信息" class="one-form-item form-required" prop="basicAccountInformation">
         <cy-upload
           ref="basicAccountInformation"
@@ -116,6 +133,20 @@
           placeholder="请上传基本户信息"
         />
       </el-form-item>
+      <el-form-item label="基本存款账号" prop="bankAccount">
+        <el-input
+          v-model="ruleForm.bankAccount"
+          :disabled="disabled"
+          placeholder="请输入基本存款账号"
+        />
+      </el-form-item>
+      <el-form-item label="基本账户开户行名称" prop="bank">
+        <el-input
+          v-model="ruleForm.bank"
+          :disabled="disabled"
+          placeholder="请输入基本账户开户行名称"
+        />
+      </el-form-item>
       <el-form-item label="公司章程和修正案 " class="one-form-item form-required" prop="articlesAssociation">
         <cy-upload
           ref="articlesAssociation"
@@ -163,7 +194,11 @@ export default {
   data() {
     return {
       ruleForm: {
-        businessAddress: ''
+        businessAddress: '',
+        businessScope: '',
+        registeredAddress: '',
+        bankAccount: '',
+        bank: ''
       },
       locationMap: [],
       rentalContract: [],
@@ -174,7 +209,11 @@ export default {
       articlesAssociation: [],
       judgment: [],
       rules: {
-        businessAddress: [{ required: true, message: '请输入经营地址', trigger: 'blur' }]
+        businessAddress: [{ required: true, message: '请输入经营地址', trigger: 'blur' }],
+        businessScope: [{ required: true, message: '请输入经营范围', trigger: 'blur' }],
+        registeredAddress: [{ required: true, message: '请输入注册地址', trigger: 'blur' }],
+        bankAccount: [{ required: true, message: '请输入基本存款账号', trigger: 'blur' }],
+        bank: [{ required: true, message: '请输入基本账户开户行名称', trigger: 'blur' }]
       },
       tableData: [],
       columns: [
@@ -184,11 +223,51 @@ export default {
         },
         {
           label: '身份类型',
+          width: 100,
           prop: 'typeStr',
           ruleRequired: true
         },
+        {
+          label: '身份证正面',
+          width: 180,
+          ruleRequired: true,
+          render: (h, row, index) => {
+            return <cy-upload
+              ref={`idcardStorage_front_${index}`}
+              uploadParams={{ fileType: 'enterprise_idcard_front' }}
+              disabled={this.disabled}
+              isCallBack={true}
+              limit={1}
+              fileData={row.frontFile || []}
+              oncall-back={ (fileList, fileName, row, index) => {
+                this.frontCardCallBack(fileList, fileName, row, index)
+              } }
+              defaultDesc='请上传身份证正面'
+            />
+          }
+        },
+        {
+          label: '身份证反面',
+          width: 180,
+          ruleRequired: true,
+          render: (h, row, index) => {
+            return <cy-upload
+              ref={`idcardStorage_back_${index}`}
+              uploadParams={{ fileType: 'enterprise_idcard_back' }}
+              disabled={this.disabled}
+              isCallBack={true}
+              limit={1}
+              fileData={row.backFile || []}
+              oncall-back={ (fileList, fileName) => {
+                this.backCardCallBack(fileList, fileName, row, index)
+              } }
+              defaultDesc='请上传身份证反面'
+            />
+          }
+        },
         {
           label: '姓名',
+          width: 100,
           prop: 'name',
           ruleRequired: true,
           render: (h, row) => {
@@ -204,16 +283,67 @@ export default {
           }
         },
         {
-          label: '身份证正反面',
+          label: '手机号码',
+          render: (h, row) => {
+            return <el-input
+              disabled={this.disabled}
+              v-model={row.phoneNumber}
+              placeholder='请输入手机号码'
+            ></el-input>
+          }
+        },
+        {
+          label: '户籍地址',
           ruleRequired: true,
-          render: (h, row, index) => {
-            return <cy-upload
-              ref={`idcardStorage${index}`}
-              uploadParams={{ fileType: 'enterprise_idcard_Files' }}
+          render: (h, row) => {
+            return <el-input
               disabled={this.disabled}
-              fileData={row.files}
-              defaultDesc='请上传身份证正反面'
-            />
+              v-model={row.domicileAddress}
+              placeholder='请输入户籍地址'
+            ></el-input>
+          }
+        },
+        {
+          label: '常住地址',
+          ruleRequired: true,
+          render: (h, row) => {
+            return <el-input
+              disabled={this.disabled}
+              v-model={row.permanentAddress}
+              placeholder='请输入常住地址'
+            ></el-input>
+          }
+        },
+        {
+          label: '证件有效开始日期',
+          ruleRequired: true,
+          render: (h, row) => {
+            return <el-date-picker
+              disabled={this.disabled}
+              v-model={row.validFrom}
+              type='date'
+              value-format='yyyy-MM-dd'
+              placeholder='请选择证件有效开始日期'>
+            </el-date-picker>
+          }
+        },
+        {
+          label: '证件有效截止期',
+          ruleRequired: true,
+          render: (h, row) => {
+            return <el-date-picker
+              disabled={this.disabled}
+              v-model={row.validTo}
+              type='date'
+              value-format='yyyy-MM-dd'
+              placeholder='请选择证件有效截止期'>
+            </el-date-picker>
+          }
+        },
+        {
+          label: '邮箱',
+          render: (h, row) => {
+            return <el-input disabled={this.disabled} v-model={row.email} placeholder='请输入邮箱地址'></el-input>
           }
         }
       ],
@@ -311,11 +441,15 @@ export default {
     addInfo: {
       handler(newV) {
         if (newV && Object.keys(newV)) {
-          const { businessAddress, locationMap, rentalContract, waterElectricityFees, officeEnvironment, creditInvestigationInfoList, businessLicense, basicAccountInformation, articlesAssociation, judgment, corporateName, certificateShortSignUrl, certificateSignStatus, shortAuthUrl, authStatus, id, cComprehensiveRiskInvestigationId, fddCustomerId, certificateContractId, certificateTransactionId } = newV
+          const { businessAddress, locationMap, rentalContract, waterElectricityFees, officeEnvironment, creditInvestigationInfoList, businessLicense, basicAccountInformation, articlesAssociation, judgment, corporateName, certificateShortSignUrl, certificateSignStatus, shortAuthUrl, authStatus, id, cComprehensiveRiskInvestigationId, fddCustomerId, certificateContractId, certificateTransactionId, businessScope, registeredAddress, bankAccount, bank } = newV
           this.ruleForm = {
             businessAddress,
             id,
-            cComprehensiveRiskInvestigationId
+            cComprehensiveRiskInvestigationId,
+            businessScope,
+            registeredAddress,
+            bankAccount,
+            bank
           }
           this.locationMap = locationMap
           this.rentalContract = rentalContract
@@ -326,6 +460,17 @@ export default {
           this.articlesAssociation = articlesAssociation
           this.judgment = judgment
           this.tableData = creditInvestigationInfoList
+
+          // 转一下个人征信身份证正反面回显
+          this.tableData.forEach((el) => {
+            const frontArr = []
+            const backArr = []
+            frontArr.push(el.frontFile)
+            backArr.push(el.backFile)
+            el.frontFile = frontArr
+            el.backFile = backArr
+          })
+
           this.enterpriseTableData = [
             {
               corporateName,
@@ -365,6 +510,58 @@ export default {
         this.enterpriseTableData[0].certificateSignStatus = data ? '已签署' : '未签署'
       })
     },
+    // 身份证正面上传成功回调
+    async frontCardCallBack(fileList, fileName, row, index) {
+      const fileFrontList = this.$refs.commTable.$refs[`idcardStorage_front_${index}`].getFileLists
+
+      const fileBackList = this.$refs.commTable.$refs[`idcardStorage_back_${index}`].getFileLists
+
+      if (fileFrontList.length && fileBackList.length) {
+        this.ocrIdCard(fileFrontList[0].id, fileBackList[0].id, row)
+      }
+    },
+    // 身份证背面上传成功回调
+    backCardCallBack(fileList, fileName, row, index) {
+      const fileFrontList = this.$refs.commTable.$refs[`idcardStorage_front_${index}`].getFileLists
+
+      const fileBackList = this.$refs.commTable.$refs[`idcardStorage_back_${index}`].getFileLists
+
+      if (fileFrontList.length && fileBackList.length) {
+        this.ocrIdCard(fileFrontList[0].id, fileBackList[0].id, row)
+      }
+    },
+    // OCR身份证
+    async ocrIdCard(frontId, backId, tableRow) {
+      if (frontId !== '' && backId !== '') {
+        const res = await ocrIdentifyCard({
+          front: frontId,
+          back: backId
+        })
+
+        if (res.success) {
+          tableRow.domicileAddress = res.data.address
+          tableRow.permanentAddress = res.data.address
+          tableRow.socialCreditCode = res.data.idcard
+          tableRow.validFrom = res.data.validfrom
+          tableRow.validTo = res.data.validto
+        }
+      }
+    },
+    // 营业执照的OCR
+    async businessLicenseCallBack() {
+      const fileList = this.$refs.businessLicense.getFileLists
+
+      if (fileList.length) {
+        const res = await ocrBusinessLicense({
+          fileId: fileList[0].id
+        })
+
+        if (res.success) {
+          this.ruleForm.businessScope = res.data.businessScope
+          this.ruleForm.registeredAddress = res.data.address
+        }
+      }
+    },
     getParams(type) {
       const locationMap = this.$refs.locationMap.getFileLists
       const rentalContract = this.$refs.rentalContract.getFileLists
@@ -377,13 +574,33 @@ export default {
 
       // 个人征信
       const creditInvestigationInfoList = this.tableData.map((item, index) => {
-        const { type, name, socialCreditCode } = item
-        const fileLists = this.$refs.commTable.$refs[`idcardStorage${index}`].getFileLists
+        const {
+          type,
+          name,
+          socialCreditCode,
+          phoneNumber,
+          domicileAddress,
+          permanentAddress,
+          validFrom,
+          validTo,
+          email
+        } = item
+        const fileFrontList = this.$refs.commTable.$refs[`idcardStorage_front_${index}`].getFileLists
+        const fileBackList = this.$refs.commTable.$refs[`idcardStorage_back_${index}`].getFileLists
+        // const fileLists = this.$refs.commTable.$refs[`idcardStorage${index}`].getFileLists
         return {
           type,
           name,
           socialCreditCode,
-          fileList: fileLists.map(item => item.id)
+          phoneNumber,
+          domicileAddress,
+          permanentAddress,
+          validFrom,
+          validTo,
+          email,
+          front: fileFrontList.length ? fileFrontList[0].id : '',
+          back: fileBackList.length ? fileBackList[0].id : ''
+          // fileList: fileLists.map(item => item.id)
         }
       })
 
@@ -434,21 +651,25 @@ export default {
           //   this.$message.warning('请上传结案证明或判决书')
           //   return
           // }
-          for (let i = 0; i < creditInvestigationInfoList.length; i++) {
-            const { name, socialCreditCode, fileList } = creditInvestigationInfoList[i]
-            if (!name) {
-              this.$message.warning('请输入姓名')
+
+          // 个人征信校验
+          if (!this.validateCreditInvestigationInfoList(creditInvestigationInfoList)) return
+          // 校验手机号、邮箱 -- 只校验法人
+          if (creditInvestigationInfoList.length) {
+            if (creditInvestigationInfoList[0].phoneNumber === '') {
+              this.$message.warning('请输入个人征信第一行法定代表人手机号')
               return
             }
-            if (!socialCreditCode) {
-              this.$message.warning('请输入身份证号')
+            if (creditInvestigationInfoList[0].email === '') {
+              this.$message.warning('请输入个人征信第一行法定代表人邮箱地址')
               return
             }
-            if (!fileList.length) {
-              this.$message.warning('请上传身份证正反面')
+            if (creditInvestigationInfoList[0].email && creditInvestigationInfoList[0].email.indexOf('@') < 0) {
+              this.$message.warning(`请输入个人征信第一行合法邮箱地址`)
               return
             }
           }
+
           this.$refs.ruleForm.validate(valid => {
             if (valid) {
               resolve(params)
@@ -461,6 +682,39 @@ export default {
           resolve(params)
         }
       })
+    },
+    // 校验个人征信表格
+    validateCreditInvestigationInfoList(dataArr) {
+      let i = 0
+      while (i < dataArr.length) {
+        if (!dataArr[i].name) {
+          this.$message.warning(`请输入个人征信第${ i + 1 }行姓名`)
+          return false
+        } else if (!dataArr[i].socialCreditCode) {
+          this.$message.warning(`请输入个人征信第${ i + 1 }行身份证号`)
+          return false
+        } else if (!dataArr[i].domicileAddress) {
+          this.$message.warning(`请输入个人征信第${ i + 1 }行户籍地址`)
+          return false
+        } else if (!dataArr[i].permanentAddress) {
+          this.$message.warning(`请输入个人征信第${ i + 1 }行常住地址`)
+          return false
+        } else if (!dataArr[i].validFrom) {
+          this.$message.warning(`请输入个人征信第${ i + 1 }行证件开始日期`)
+          return false
+        } else if (!dataArr[i].validTo) {
+          this.$message.warning(`请输入个人征信第${ i + 1 }行证件结束日期`)
+          return false
+        } else if (!dataArr[i].front) {
+          this.$message.warning(`请上传个人征信第${ i + 1 }行身份证正面`)
+          return false
+        } else if (!dataArr[i].back) {
+          this.$message.warning(`请上传个人征信第${ i + 1 }行身份证反面`)
+          return false
+        }
+        i++
+      }
+      return true
     }
   }
 }

+ 17 - 4
src/views/myBusiness/supplementaryInfo/index.vue

@@ -58,6 +58,7 @@
       </cy-info-title>
     </template>
 
+    <AdditionalInfo ref="additionInfoRef" :detail-info="additionalInfo" :disabled="disabled" />
     <div v-if="!disabled" class="submit-btn">
       <el-button
         @click="
@@ -84,7 +85,8 @@ export default {
     GuaranteeAddInfo: () => import('./components/GuaranteeAddInfo'),
     FinancialSituation: () => import('./components/FinancialSituation'),
     BusinessSituation: () => import('./components/BusinessSituation'),
-    RelatedEnterprises: () => import('./components/RelatedEnterprises')
+    RelatedEnterprises: () => import('./components/RelatedEnterprises'),
+    AdditionalInfo: () => import('./components/AdditionalInfo')
   },
   data() {
     return {
@@ -93,7 +95,8 @@ export default {
       addInfo: {},
       guaranteeBasicInfo: {},
       guaranteeAddInfo: {},
-      disabled: false
+      disabled: false,
+      additionalInfo: {}
     }
   },
   created() {
@@ -107,7 +110,7 @@ export default {
       getSupplementaryInfo({ id }).then(({ data }) => {
         const { hasGuaranteeEnterprise, enterprise, guaranteeEnterprise } = data
         this.hasGuaranteeEnterprise = hasGuaranteeEnterprise
-        const { corporateName, socialCreditCode } = enterprise
+        const { corporateName, socialCreditCode, operatingRevenue, peopleEngaged } = enterprise
         // 基础信息
         this.basicInfo = {
           corporateName,
@@ -116,6 +119,12 @@ export default {
         // 补充信息
         this.addInfo = enterprise
 
+        // 其他补充材料
+        this.additionalInfo = {
+          operatingRevenue,
+          peopleEngaged
+        }
+
         if (hasGuaranteeEnterprise) {
           // 担保企业基础信息
           this.guaranteeBasicInfo = {
@@ -130,12 +139,16 @@ export default {
     async nextClick(type) {
       // 主公司
       const addInfo = await this.$refs.addInfo.getParams(type)
+      // 其他补充资料
+      const additionInfo = await this.$refs.additionInfoRef.getParams(type)
+
       var parmas = {
         Loading: true,
         visible: type === 'submit',
         id: this.$route.query.id,
         enterprise: {
-          ...addInfo
+          ...addInfo,
+          ...additionInfo
         }
       }
       if (this.hasGuaranteeEnterprise) {

+ 19 - 2
src/views/myBusiness/supplementaryInfo/mixins/creditInvestigation.js

@@ -6,12 +6,29 @@ export default {
   methods: {
     synchronizationClick() {
       const resultMap = this.tableData.reduce((result, current, currentIndex) => {
-        const { name, socialCreditCode } = current
+        const {
+          name,
+          socialCreditCode,
+          phoneNumber,
+          domicileAddress,
+          permanentAddress,
+          validFrom,
+          validTo,
+          email
+        } = current
         if (!result[name]) {
           if (name) {
             result[name] = {
+              phoneNumber,
+              domicileAddress,
+              permanentAddress,
+              validFrom,
+              validTo,
+              email,
               socialCreditCode: socialCreditCode,
-              files: this.$refs.commTable.$refs[`idcardStorage${currentIndex}`].getFileLists
+              frontFile: this.$refs.commTable.$refs[`idcardStorage_front_${currentIndex}`].getFileLists,
+              backFile: this.$refs.commTable.$refs[`idcardStorage_back_${currentIndex}`].getFileLists,
+              // files: this.$refs.commTable.$refs[`idcardStorage${currentIndex}`].getFileLists
             }
           }
         }

+ 68 - 0
src/views/perview/pdf.vue

@@ -0,0 +1,68 @@
+<template>
+  <div class="pdf-box">
+    <iframe id="pdfIframe" :src="url" frameborder="0" />
+    <!-- <div class="pdf-mark" @contextmenu="markClick" /> -->
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      url: ''
+    }
+  },
+  created() {
+    const { fileId, resource } = this.$route.query
+    this.url = `${process.env.VUE_APP_BASE_API}/system/fileStorage/preview?fileId=${fileId}&resource=${resource}#toolbar=0&navpanes=0&scrollbar=0`
+  },
+  mounted() {
+    setTimeout(() => {
+      // const iframe = document.getElementById('pdfIframe')
+      // const iframeWin = iframe.contentWindow || iframe.contentDocument.parentWindo
+      // console.log(iframeWin.document.getElementById('viewer'))
+      // console.log(iframe.height = iframeWin.document.getElementById('viewer').scrollHeight
+      // )
+      // iframeWin.document.getElementById('viewer').addEventListener('contextmenu', function(event) {
+      //   event.preventDefault()
+      //   return false
+      // })
+    }, 1000)
+
+    // const mask = document.querySelector('.pdf-mark')
+    // mask.addEventListener('scroll', function(params) {
+    //   iframe.scrollTop = mask.scrollTop
+    // })
+  },
+  methods: {
+    markClick() {
+      console.log(213123123)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.pdf-box {
+  width: 100%;
+  height: 100%;
+  overflow: auto;
+  position: relative;
+  iframe {
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    border: none;
+  }
+  .pdf-mark {
+    position: absolute;
+    top: 0px;
+    left: 0px;
+    width: 100%;
+    height: 100%;
+    background-color: rgba(0, 0, 0, 0.5); /* 半透明遮罩 */
+    overflow: auto;
+    // pointer-events: none; /* 防止遮罩阻止鼠标事件 */
+  }
+}
+</style>

+ 1 - 0
vue.config.js

@@ -42,6 +42,7 @@ module.exports = {
     // provide the app's title in webpack's name field, so that
     // it can be accessed in index.html to inject the correct title.
     name: name,
+    devtool: process.env.NODE_ENV === 'development' ? 'source-map' : undefined,
     resolve: {
       alias: {
         '@': resolve('src')