فهرست منبع

feat:投标企业信用报告入口、下单、样例、审核

yangfeng 3 ماه پیش
والد
کامیت
bfd6e81ce8

+ 9 - 0
apps/bigmember_pc/src/api/modules/common.js

@@ -15,3 +15,12 @@ export function getCustomInfo (data) {
     data
   })
 }
+
+// 附件上传
+export function ajaxUploadFile(data) {
+  return request({
+    url: '/front/filemanage/upload',
+    method: 'post',
+    data
+  })
+}

+ 29 - 0
apps/bigmember_pc/src/api/modules/pay.js

@@ -128,3 +128,32 @@ export function getGiftRecordDetail(data) {
     data: qs.stringify(data)
   })
 }
+
+// 投标企业信用报告-信用报告查询
+export function ajaxGetCreditReport(data) {
+  data = qs.stringify(data)
+  return request({
+    url: '/subscribepay/bidCreditReport/report/get',
+    method: 'post',
+    data
+  })
+}
+
+// 投标企业信用报告-信用报告修改
+export function ajaxUpdateCreditReport(data) {
+  return request({
+    url: '/subscribepay/bidCreditReport/report/update',
+    method: 'post',
+    data
+  })
+}
+
+// 投标企业信用报告-投标企业名称联想
+export function ajaxBiddingEntSearch(data) {
+  data = qs.stringify(data)
+  return request({
+    url: '/subscribepay/bidCreditReport/entSearch',
+    method: 'post',
+    data
+  })
+}

BIN
apps/bigmember_pc/src/assets/images/credit-report-icon.png


BIN
apps/bigmember_pc/src/assets/images/投标企业信用报告(样例_剑鱼标讯).pdf


+ 20 - 1
apps/bigmember_pc/src/router/modules/order.js

@@ -284,7 +284,26 @@ export default [
             }
           }
         ]
-      }
+      },
+      {
+        path: 'credit-report',
+        components: commonOrder({
+          info: () => import('@/views/order/components/credit-report/info.vue')
+        }),
+        children: [
+          {
+            path: '',
+            meta: {
+              title: '购买投标企业信用报告',
+              productId: 150
+            },
+            components: {
+              'buy-tip': () =>
+                import('@/views/order/components/credit-report/buy-tip.vue')
+            }
+          }
+        ]
+      },
     ]
   }
 ]

+ 18 - 0
apps/bigmember_pc/src/router/modules/report.js

@@ -33,5 +33,23 @@ export default [
         component: () => import('@/views/download-pdf/propReport.vue'),
       }
     ]
+  },
+  // 报告样例
+  {
+    path: '/free/report/sample',
+    name: 'report_sample',
+    meta: {
+      title: '报告样例'
+    },
+    component: () => import('@/views/reportDownload/sample.vue')
+  },
+  // 报告审核
+  {
+    path: '/free/report/examine',
+    name: 'report_examine',
+    meta: {
+      title: '报告审核'
+    },
+    component: () => import('@/views/reportDownload/examine.vue')
   }
 ]

+ 2 - 1
apps/bigmember_pc/src/store/order.js

@@ -71,7 +71,8 @@ const productNameMap = {
   118: '剑鱼文库会员',
   201: '企业中标分析报告下载包',
   202: '业主采购分析报告下载包',
-  203: '市场分析定制报告下载包'
+  203: '市场分析定制报告下载包',
+  150: '投标企业信用报告'
 }
 
 const Hooks = {

+ 60 - 13
apps/bigmember_pc/src/views/article-content/components/ContentHeader.vue

@@ -19,7 +19,7 @@ import BidrenewalDialog from '@/views/BidrenewalDialog/index.vue'
 import { useQuickJoinBidModel } from '@/composables/quick-join-bid'
 import WorkspaceButtonGroup from '@/components/dialog/WorkspaceButtonGroup.vue'
 import ContentBIActions from '@/views/article-content/components/ContentBIActions.vue'
-import { GetInWhichContainer } from '@/views/article-content/composables/useArticleUtil'
+import { GetInWhichContainer, doOpenCreditReportPage } from '@/views/article-content/composables/useArticleUtil'
 
 const getters = useStore().getters
 const vt = computed(() => {
@@ -108,6 +108,11 @@ const {
   showRenMaiButton,
   loading: remMaiLoading
 } = useRenMaiModel(ContentModel)
+
+// console.log(ContentModel.value)
+const buyerName = ref('')
+buyerName.value = ContentModel.value?._summary?._s?.buyer || ''
+console.log(buyerName.value)
 </script>
 
 <template>
@@ -258,18 +263,26 @@ const {
         </div>
       </div>
     </div>
-    <div class="expands-actions" v-if="!sunPublishContent">
-      <div class="expands-actions-l"></div>
-      <div class="expands-actions-r">
-        <el-button
-          type="primary"
-          v-if="showRenMaiButton"
-          :loading="remMaiLoading"
-          class="relationship-button"
-          @click="findRenMai"
-        >
-          <i class="iconfont icon-renmai"></i>找人脉
-        </el-button>
+    <div class="flex flex-(items-center justify-end)">
+      <div class="credit-report">
+        <div class="report-container">
+          <div class="report-text">通过信用背书、风险预警、政策适配,赋能投标突围</div>
+          <button class="report-btn" @click="doOpenCreditReportPage(buyerName)">投标企业信用报告</button>
+        </div>
+      </div>
+      <div class="expands-actions" v-if="!sunPublishContent">
+        <div class="expands-actions-l"></div>
+        <div class="expands-actions-r">
+          <el-button
+            type="primary"
+            v-if="showRenMaiButton"
+            :loading="remMaiLoading"
+            class="relationship-button"
+            @click="findRenMai"
+          >
+            <i class="iconfont icon-renmai"></i>找人脉
+          </el-button>
+        </div>
       </div>
     </div>
     <!-- 分享弹窗 -->
@@ -487,10 +500,44 @@ const {
   justify-content: space-between;
 }
 .relationship-button {
+  margin-left: 10px;
   padding: 6px 20px;
   height: 30px;
+  background: linear-gradient(281deg, #28C1E2 3.53%, #5FD4E3 98.32%);
+  border: 0;
   .iconfont {
     margin-right: 2px;
   }
 }
+.credit-report{
+  display: flex;
+  justify-content: flex-end;
+  .report-container{
+    display: inline-flex;
+    height: 30px;
+    margin-top: 8px;
+    align-items: center;
+    background: rgba(42, 190, 209, 0.16);
+    border-radius: 4px;
+    overflow: hidden;
+    border: 1px solid rgba(42, 190, 209, 0.16);
+  }
+  .report-text{
+    flex: 1;
+    height: 100%;
+    padding: 4px 12px;
+    line-height: 22px;
+    color: #2ABED1;
+    font-size: 14px;
+  }
+  .report-btn{
+    height: 100%;
+    color: #fff;
+    line-height: 22px;
+    padding: 4px 12px;
+    font-size: 14px;
+    border-radius: 4px;
+    background: linear-gradient(281deg, #28C1E2 3.53%, #5FD4E3 98.32%);
+  }
+}
 </style>

+ 11 - 0
apps/bigmember_pc/src/views/article-content/composables/useArticleUtil.js

@@ -88,3 +88,14 @@ export function GetInWhichContainer() {
   const InWhichContainer = window.parent !== window ? 'in-app' : 'in-web'
   return InWhichContainer
 }
+
+// 打开企业信用报告购买页
+export function doOpenCreditReportPage(buyer = '') {
+  const link = router.resolve({
+    path: '/order/credit-report',
+    query: {
+      buyer
+    }
+  })
+  window.open(link.href, '_blank')
+}

+ 22 - 0
apps/bigmember_pc/src/views/order/components/credit-report/buy-tip.vue

@@ -0,0 +1,22 @@
+<template>
+  <div class="buy-tip">
+    <p>购买须知:</p>
+    <p>剑鱼平台产品与服务属于虚拟数字产品,鉴于服务的特殊性,一旦开通权益不支持退款,请确认无误后进行支付。</p>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'buy-tip',
+}
+</script>
+
+<style scoped>
+.buy-tip {
+  margin-top: 28px;
+  font-size: 12px;
+  font-weight: 400;
+  color: #888888;
+  line-height: 16px;
+}
+</style>

+ 316 - 0
apps/bigmember_pc/src/views/order/components/credit-report/info.vue

@@ -0,0 +1,316 @@
+<template>
+  <div class="report-order-info">
+    <div class="report-order-info__header flex flex-justify-between">
+      <div>
+        <p class="report-role">报告作用:</p>
+        <p class="report-desc">信用报告通过信用背书、风险预警、政策适配,三大核心作用,成为投标企业参与市场竞争的关键工具。</p>
+      </div>
+      <button type="button" class="sample-btn">查看报告样例</button>
+    </div>
+    <div class="report-order-info__main">
+      <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="104px" @validate="updateFormState" >
+        <el-form-item label="投标企业名称" prop="biddingName">
+          <el-select
+            v-model="ruleForm.biddingCode"
+            filterable
+            remote
+            :remote-method="querySearchEnt"
+            :loading="loading"
+            placeholder="必填"
+            :popper-append-to-body="false"
+            @change="selectBiddingName"
+          >
+            <el-option
+              v-for="item in biddingOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="招标单位名称" prop="buyerName">
+          <el-autocomplete
+            class="inline-input"
+            v-model="ruleForm.buyerName"
+            :fetch-suggestions="querySearchBuyer"
+            :popper-append-to-body="false"
+            :highlight-first-item="true"
+            placeholder="必填"
+            @select="selectBuyerName"
+          ></el-autocomplete>
+        </el-form-item>
+        <el-form-item label="邮箱" prop="email">
+          <el-input v-model="ruleForm.email" placeholder="必填,报告将发送至邮箱"></el-input>
+        </el-form-item>
+        <p class="buy-notify">支付成功后,系统将在XX分钟内将报告发送至您的邮箱,您也可前往“资产-报告下载记录”查看详情。</p>
+      </el-form>
+    </div>
+  </div>
+</template>
+
+<script>
+import { Form, FormItem, Input, Autocomplete, Select, Option } from 'element-ui'
+import { mapActions, mapMutations, mapGetters } from 'vuex'
+import { getCourseInfo, getBuyerAssociation, ajaxBiddingEntSearch } from '@/api/modules'
+
+export default {
+  name: 'credit-report-order-info',
+  components: {
+    [Form.name]: Form,
+    [FormItem.name]: FormItem,
+    [Input.name]: Input,
+    [Autocomplete.name]: Autocomplete,
+    [Select.name]: Select,
+    [Option.name]: Option
+  },
+  data() {
+    const validateEmail = (rule, value, callback) => {
+      const status = /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(value)
+      if (value === '') {
+        return callback(new Error('邮箱不能为空'))
+      } else {
+        if (!status) {
+          return callback(new Error('邮箱格式错误'))
+        } else {
+          callback()
+        }
+      }
+    }
+    return {
+      ruleForm: {
+        biddingName: '',
+        biddingCode: '',
+        buyerName: '',
+        email: ''
+      },
+      rules: {
+        biddingName: [
+          { required: true, message: '投标企业名称不能为空', trigger: 'change' }
+        ],
+        buyerName: [
+          { required: true, message: '招标单位名称不能为空', trigger: 'change' }
+        ],
+        email: [
+          { required: true, validator: validateEmail, trigger: 'change' }
+        ]
+      },
+      reportInfo: {},
+      biddingOptions: [],
+      buyerOptions: [],
+      loading: false
+    }
+  },
+  computed: {
+    ...mapGetters('order', [
+      'productSpecInfoList',
+      'productSpecInfo',
+      'productFormInfo',
+      'productChoiceOffers',
+      'productOrderAmount'
+    ]),
+    // 格式化商品规格
+    specList() {
+      return this.productSpecInfoList.map((spec) => {
+        return {
+          label: spec._format.title,
+          price: spec._format.money,
+          desc: spec._format.desc,
+          tipText: spec._format.tag,
+          id: spec.productId,
+          _data: spec
+        }
+      })
+    },
+    // 获取当前选中的规格信息
+    specActiveInfo() {
+      return this.specList.find((spec) => spec.id === this.specActiveId)
+    },
+    pass() {
+      const emailPass = this.ruleForm.email && /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/.test(this.ruleForm.email)
+      return Boolean(this.ruleForm.biddingName && this.ruleForm.buyerName && emailPass)
+    }
+  },
+  async created() {
+    if (this.$route.query && this.$route.query.buyer) {
+      this.ruleForm.buyerName = this.$route.query.buyer
+    }
+    // 获取报告信息
+    // this.getInfo()
+    // 获取产品信息
+    await this.setProductInfo({
+      id: this.$route.meta.productId,
+      hooks: {
+        submit: this.doSubmit.bind(this)
+      }
+    })
+    this.updateUI({
+      submitText: '立即抢购'
+    })
+    this.updateFormState()
+  },
+  methods: {
+    ...mapMutations('order', ['updateFormStatus', 'updateUI', 'updateCanNextMap']),
+    ...mapActions('order', [
+      'setProductInfo',
+      'setProductSpecInfo',
+      'changeProductChoiceSpec'
+    ]),
+    updateFormState() {
+      this.updateCanNextMap({
+        spec: this.pass
+      })
+    },
+    selectBiddingName(value) {
+      // this.ruleForm.biddingCode = value
+      const selected = this.biddingOptions.find(item => item.value === value);
+      if (selected) {
+        this.ruleForm.biddingName = selected.label
+      }
+    },
+    async querySearchEnt(queryString) {
+      if (queryString) {
+        this.loading = true
+        const { error_code: code, data } = await ajaxBiddingEntSearch({
+          entName: queryString
+        })
+        if (code === 0) {
+          this.biddingOptions = data?.map(item => ({ value: item.cert_no, label: item.name }))
+        }
+        this.loading = false
+      } else {
+        this.biddingOptions = []
+      }
+    },
+    async querySearchBuyer(queryString, cb) {
+      if (queryString) {
+       const { error_code: code, data } = await getBuyerAssociation({ name: queryString })
+       if (code === 0 && data && data?.list.length) {
+        this.buyerOptions = data?.list.map(item => ({ value: item, label: item }))
+        cb(this.buyerOptions)
+       } else {
+        cb([])
+       }
+      } else {
+        cb([])
+      }
+    },
+    selectBuyerName(item) {
+      this.ruleForm.buyerName = item.label
+    },
+    // 获取信用报告信息
+    async getInfo() {
+      await getCourseInfo({
+        _id: this.$route.params.id
+      }).then((res) => {
+        if (res?.result?.data) {
+          this.reportInfo = res.result.data
+        }
+      })
+    },
+    /**
+     * 订单提交事件
+     * @param payload
+     * @param next
+     * @returns {Promise<*>}
+     */
+    async doSubmit(payload, next) {
+      // 处理参数格式化
+      const params = {
+        product: payload.productName,
+        productId: payload.productSpecId,
+        discountId: payload.offersId,
+        lotteryId: payload.offersId,
+        activityType: payload.activityType,
+        data: {
+          company: this.ruleForm.biddingName,
+          cert_no: this.ruleForm.biddingCode,
+          buyer: this.ruleForm.buyerName,
+          email: this.ruleForm.email,
+          order_phone: this.productFormInfo?.phone
+        }
+      }
+      // 发送请求
+      const { data, error_code: code, error_msg: message } = await next(params)
+      if (code === 0 && data?.needPay) {
+        const orderCode = data.order_code
+        location.href = '/front/creditReport/orderPay/' + orderCode
+      } else {
+        this.$message({
+          message: message || '创建订单失败,请刷新重试',
+          type: 'warning'
+        })
+      }
+      // 处理成功回调
+      return true
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.report-order-info {
+  padding: 0 32px;
+  &__header {
+    padding: 24px 0;
+    border-bottom: 1px solid #E0E0E0;
+  }
+  .report-role{
+    font-size: 14px;
+    line-height: 24px;
+    color:#1d1d1d;
+  }
+  .report-desc{
+    font-size: 14px;
+    line-height: 22px;
+    color:#686868;
+  }
+  .sample-btn{
+    width: 100px;
+    height: 30px;
+    line-height: 30px;
+    background: $color_main;
+    border-radius: 4px;
+    color: #fff;
+    font-size: 14px;
+  }
+  &__main {
+    padding: 24px 0 16px;
+    .buy-notify{
+      padding-left: 104px;
+      font-size: 14px;
+      color: #686868;
+      line-height: 22px;
+    }
+  }
+  ::v-deep{
+    .el-form-item__label{
+      padding-right: 8px;
+      font-size: 14px;
+      color: #1d1d1d;
+      line-height: 22px;
+      text-align: left;
+    }
+    .el-input__inner{
+      width: 590px;
+      height: 36px;
+      padding: 0 12px;
+      line-height: 36px;
+      color: #1d1d1d;
+    }
+    .el-form-item{
+      display: flex;
+      align-items: center;
+      margin-bottom: 20px;
+      &:last-of-type{
+        margin-bottom: 8px;
+        &.is-error{
+          margin-bottom: 20px;
+        }
+      }
+    }
+    .el-form-item__content{
+      margin-left: 0!important;
+    }
+  }
+}
+</style>

+ 1 - 1
apps/bigmember_pc/src/views/portrayal/Loading.vue

@@ -35,7 +35,7 @@ export default {
     async getLink() {
       const member = this.bigmember
       const sVip = this.svip
-      const position = this.position ? `?position=${this.position}` : ''
+      let position = this.position ? `?position=${this.position}` : ''
       if (this.inResourceBI) {
         position += position ? '&resource=BI' : '?resource=BI'
       }

+ 417 - 0
apps/bigmember_pc/src/views/reportDownload/examine.vue

@@ -0,0 +1,417 @@
+<template>
+  <section class="report-examine v-w1200">
+    <el-form v-if="hasRecord" ref="form" :model="form" label-width="240px">
+      <el-form-item label="无政府采购严重违法行为记录证明:" prop="prove_purchase">
+        <el-upload
+          action="string"
+          :http-request="(file) => uploadFileHandle(file, 'prove_purchase')"
+          :limit="1"
+          :show-file-list="false"
+          :before-upload="beforeUpload"
+          accept="image/jpeg, image/jpg, image/png"
+        >
+          <div class="upload-container">
+            <div v-if="form.prove_purchase" class="avatar-container" @click.stop>
+              <img :src="domain + form.prove_purchase" class="avatar">
+              <i class="el-icon-delete" @click.stop="removeImg('prove_purchase')"></i>
+            </div>
+            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+          </div>
+          <div slot="tip" class="el-upload__tip">只能上传jpeg/jpg/png图片文件</div>
+        </el-upload>
+      </el-form-item>
+      <el-form-item label="有无政府采购严重违法行为:">
+        <el-radio-group v-model="form.prove_purchase_status">
+          <el-radio :label="0">无风险</el-radio>
+          <el-radio :label="1">有风险</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="·无被执行记录证明:" prop="prove_executed">
+        <el-upload
+          action="string"
+          :http-request="(file) => uploadFileHandle(file, 'prove_executed')"
+          :limit="1"
+          :show-file-list="false"
+          :before-upload="beforeUpload"
+          accept="image/jpeg, image/jpg, image/png"
+        >
+          <div class="upload-container">
+            <div v-if="form.prove_executed" class="avatar-container" @click.stop>
+              <img :src="domain + form.prove_executed" class="avatar">
+              <i class="el-icon-delete" @click.stop="removeImg('prove_executed')"></i>
+            </div>
+            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+          </div>
+          <div slot="tip" class="el-upload__tip">只能上传jpeg/jpg/png图片文件</div>
+        </el-upload>
+      </el-form-item>
+      <el-form-item label="有无被执行记录:">
+        <el-radio-group v-model="form.prove_executed_status">
+          <el-radio :label="0">无风险</el-radio>
+          <el-radio :label="1">有风险</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="无失信被执行记录证明:" prop="prove_dishonesty">
+        <el-upload
+          action="string"
+          :http-request="(file) => uploadFileHandle(file, 'prove_dishonesty')"
+          :limit="1"
+          :show-file-list="false"
+          :before-upload="beforeUpload"
+          accept="image/jpeg, image/jpg, image/png"
+        >
+          <div class="upload-container">
+            <div v-if="form.prove_dishonesty" class="avatar-container" @click.stop>
+              <img :src="domain + form.prove_dishonesty" class="avatar">
+              <i class="el-icon-delete" @click.stop="removeImg('prove_dishonesty')"></i>
+            </div>
+            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+          </div>
+          <div slot="tip" class="el-upload__tip">只能上传jpeg/jpg/png图片文件</div>
+        </el-upload>
+      </el-form-item>
+      <el-form-item label="有无失信被执行记录:">
+        <el-radio-group v-model="form.prove_dishonesty_status">
+          <el-radio :label="0">无风险</el-radio>
+          <el-radio :label="1">有风险</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="无安全生产严重失信记录证明:" prop="prove_produce">
+        <el-upload
+          action="string"
+          :http-request="(file) => uploadFileHandle(file, 'prove_produce')"
+          :limit="1"
+          :show-file-list="false"
+          :before-upload="beforeUpload"
+          accept="image/jpeg, image/jpg, image/png"
+        >
+          <div class="upload-container">
+            <div v-if="form.prove_produce" class="avatar-container" @click.stop>
+              <img :src="domain + form.prove_produce" class="avatar">
+              <i class="el-icon-delete" @click.stop="removeImg('prove_produce')"></i>
+            </div>
+            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+          </div>
+          <div slot="tip" class="el-upload__tip">只能上传jpeg/jpg/png图片文件</div>
+        </el-upload>
+      </el-form-item>
+      <el-form-item label="有无安全生产严重失信记录:">
+        <el-radio-group v-model="form.prove_produce_status">
+          <el-radio :label="0">无风险</el-radio>
+          <el-radio :label="1">有风险</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="信用中国:">
+        <el-upload
+          action="string"
+          :http-request="(file) => uploadFileHandle(file, 'creditchina')"
+          :limit="1"
+          :show-file-list="false"
+          :before-upload="beforeUpload"
+          accept=".pdf"
+        >
+          <div class="upload-container">
+            <el-tag
+              v-if="form.creditchina"
+              type="success"
+              closable
+              @close="removePdf"
+              @click.stop="handlePreviewPdf(form.creditchina)"
+              >
+              {{ pdfName }}
+            </el-tag>
+            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+          </div>
+          <div slot="tip" class="el-upload__tip">*只能上传pdf文件</div>
+        </el-upload>
+      </el-form-item>
+      <el-form-item>
+        <el-button :disabled="disabled" type="primary" @click="onSubmit">审核</el-button>
+      </el-form-item>
+    </el-form>
+    <Empty v-else>
+      <p>该记录不存在</p>
+    </Empty>
+    <el-dialog
+      title="提示"
+      :visible.sync="collectDialogVisible"
+      width="380px"
+      custom-class="collect-dialog"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      center>
+      <div class="dialog-content">
+        <p>该报告的表单信息已经收集过。</p>
+        <p v-if="reportInfo.confirmTime">表单提交时间: <span class="highlight-text">{{ reportInfo.confirmTime }}</span></p>
+        <p v-if="reportInfo.reportTime">报告生成时间: <span class="highlight-text">{{ reportInfo.reportTime }}</span></p>
+        <p v-if="reportInfo.emailTime">邮件发送时间: <span class="highlight-text">{{ reportInfo.emailTime }}</span></p>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="collectDialogVisible = false">我知道了</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog
+      title="提示"
+      :visible.sync="againDialogVisible"
+      width="380px"
+      custom-class="collect-dialog"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      center>
+      <div class="dialog-content">
+        <p>该报告的表单信息已经收集过,是否重新提交?</p>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="againDialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="confirmFn">确 定</el-button>
+      </span>
+    </el-dialog>
+  </section>
+</template>
+
+<script>
+import { Form, FormItem, Radio, RadioGroup, Button, Upload, Tag, Icon, Dialog } from 'element-ui'
+import { ajaxUploadFile, ajaxUpdateCreditReport, ajaxGetCreditReport } from '@/api/modules'
+import Empty from '@/components/common/Empty.vue'
+export default {
+  name: 'report-examine',
+  components: {
+    [Form.name]: Form,
+    [FormItem.name]: FormItem,
+    [Radio.name]: Radio,
+    [RadioGroup.name]: RadioGroup,
+    [Button.name]: Button,
+    [Upload.name]: Upload,
+    [Tag.name]: Tag,
+    [Icon.name]: Icon,
+    [Dialog.name]: Dialog,
+    Empty
+  },
+  data() {
+    return {
+      hasRecord: true,
+      id: '',
+      form: {
+        prove_purchase: '',
+        prove_purchase_status: 0,
+        prove_executed: '',
+        prove_executed_status: 0,
+        prove_dishonesty: '',
+        prove_dishonesty_status: 0,
+        prove_produce: '',
+        prove_produce_status: 0,
+        creditchina: ''
+      },
+      pdfName: '',
+      domain: window.location.origin,
+      reportInfo: {
+        confirmTime: null,
+        reportTime: null,
+        emailTime: null,
+        status: 0
+      },
+      collectDialogVisible: false,
+      againDialogVisible: false
+    }
+  },
+  computed: {
+    disabled() {
+      return !this.form.prove_purchase || !this.form.prove_executed || !this.form.prove_dishonesty || !this.form.prove_produce || !this.form.creditchina
+    }
+  },
+  created() {
+    this.id = this.$route.query?.id
+    if (this.id) {
+      this.getCreditReportForm()
+    }
+  },
+  methods: {
+    async getCreditReportForm() {
+      const { data, status, msg } = await ajaxGetCreditReport({ id: this.id })
+      if (status === 1) {
+        this.hasRecord = true
+        const { prove_purchase, prove_purchase_status, prove_executed, prove_executed_status, prove_dishonesty, prove_dishonesty_status,  prove_produce, prove_produce_status, creditchina } = data
+        this.reportInfo.status = data.status
+        if (data.status >= 0) {
+          this.form = {
+            prove_purchase,
+            prove_purchase_status,
+            prove_executed,
+            prove_executed_status,
+            prove_dishonesty,
+            prove_dishonesty_status,
+            prove_produce,
+            prove_produce_status,
+            creditchina
+          }
+          if(creditchina){
+            const filename = creditchina.split('/').pop()
+            this.pdfName = filename
+          }
+          this.reportInfo.confirmTime = data.submit_time
+          this.reportInfo.reportTime = data.complete_time
+          this.reportInfo.emailTime = data.send_mail_time
+          this.collectDialogVisible = true
+          return
+        }
+      } else {
+        this.$toast(msg)
+        this.hasRecord = false
+      }
+    },
+    async uploadFileHandle(file, filed) {
+      const params = new FormData()
+      params.append('type', 'bidCreditReportFile')
+      params.append('bidCreditReportFile', file.file)
+      try {
+         const { error: code, url, filename } = await ajaxUploadFile(params)
+        if (code === 0 && url) {
+          this.form[filed] = url
+          if(filed === 'creditchina'){
+            this.pdfName = filename
+          }
+        }
+      } catch (error) {
+        console.error('上传失败:', error)
+      }
+    },
+    handlePreviewPdf(url) {
+      if (!url) return
+      const pdfUrl = window.location.origin + url
+      window.open(pdfUrl, '_blank')
+    },
+    removePdf() {
+      this.form.creditchina = ''
+      this.pdfName = ''
+    },
+    removeImg(file) {
+      this.form[file] = ''
+    },
+    beforeUpload(file) {
+      const isLt2M = file.size / 1024 / 1024 < 10
+      if (!isLt2M) {
+        this.$toast('上传文件大小不能超过 10MB!')
+      }
+      return isLt2M
+    },
+    async confirmFn() {
+      const { error_code: code, error_msg: msg } = await ajaxUpdateCreditReport({ ...this.form, id: this.id })
+      if (code === 0) {
+        this.$toast('提交成功')
+        window.location.reload()
+      } else {
+        this.$toast(msg)
+      }
+    },
+    onSubmit() {
+      if (this.reportInfo.status > 0) {
+        this.againDialogVisible = true
+        return
+      } else {
+        this.confirmFn()
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.report-examine{
+  background: #fff;
+  ::v-deep{
+    .el-form{
+      padding: 30px;
+    }
+    .el-form-item:nth-child(odd){
+      margin-bottom: 10px;
+    }
+    .el-upload__input{
+      display: none!important;
+    }
+    .upload-container{
+      text-align: left;
+    }
+    .avatar-uploader .el-upload {
+      border: 1px dashed #d9d9d9;
+      border-radius: 6px;
+      cursor: pointer;
+      position: relative;
+      overflow: hidden;
+    }
+    .avatar-uploader .el-upload:hover {
+      border-color: #409EFF;
+    }
+    .avatar-uploader-icon {
+      font-size: 28px;
+      color: #8c939d;
+      width: 120px;
+      height: 120px;
+      line-height: 120px;
+      text-align: center;
+      border: 1px dashed #d9d9d9;
+    }
+    .avatar-container{
+      position: relative;
+      width: 120px;
+      height: 120px;
+      border: 1px dashed #d9d9d9;
+      border-radius: 6px;
+      overflow: hidden;
+    }
+    .el-icon-delete{
+      display: none;
+      position: absolute;
+      right: 2px;
+      top: 2px;
+      z-index: 10;
+      font-size: 22px;
+      color: #1d1d1d;
+      &:hover{
+        color: #1d1d1d;
+      }
+    }
+    .avatar {
+      width: 100%;
+      height: 100%;
+      display: block;
+      z-index: 9;
+    }
+    .avatar-container:hover{
+      .el-icon-delete{
+        display: block;
+      }
+    }
+  }
+}
+::v-deep{
+  .empty-container{
+    height: 500px;
+  }
+  .collect-dialog{
+    margin: 0 auto !important;
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    border-radius: 8px;
+    .el-dialog__body{
+      padding: 20px 30px;
+    }
+    .el-dialog__footer{
+      padding: 10px 30px 24px;
+      .el-button{
+        padding: 10px 40px;
+        border-radius: 4px;
+      }
+    }
+    .dialog-content{
+      p{
+        margin-bottom: 8px;
+        line-height: 24px;
+        font-size: 14px;
+        color: #333;
+      }
+    }
+  }
+}
+</style>

+ 69 - 1
apps/bigmember_pc/src/views/reportDownload/record.vue

@@ -20,6 +20,17 @@
         </div>
       </div>
     </section>
+    <section class="flex flex-(justify-between items-center) credit-report-box">
+      <div class="flex flex-items-center credit-report-content">
+        <p class="credit-report-title">投标企业信用报告</p>
+        <p class="credit-report-desc">信用报告通过信用背书、风险预警、政策适配,三大核心作用,成为投标企业参与市场竞争的关键工具‌</p>
+        <img class="credit-report-icon" src="@/assets/images/credit-report-icon.png" alt="信用报告">
+      </div>
+      <div class="flex flex-items-center report-action">
+        <span class="view-report-sample" @click="goViewSample">查看报告样例</span>
+        <button class="report-to-buy" @click="goBuyCreditReport">去购买</button>
+      </div>
+    </section>
     <section class="box-container record-box">
       <p class="box-title">报告下载记录</p>
       <el-table
@@ -294,7 +305,8 @@ export default {
       typeObj: {
         '1': '企业中标分析报告',
         '2': '业主采购分析报告',
-        '3': '市场分析定制报告'
+        '3': '市场分析定制报告',
+        '4': '投标企业信用报告'
       }
     }
   },
@@ -408,6 +420,9 @@ export default {
         case 3:
           result = '市场分析定制报告'
           break
+        case 4:
+          result = '投标企业信用报告'
+          break
       }
       return result
     }
@@ -535,6 +550,12 @@ export default {
     // 进入采购单位画像
     goUnitPortrayal (name) {
       window.open(`/swordfish/page_big_pc/unit_portrayal/${name}`, '_blank')
+    },
+    goViewSample() {
+      window.open('/swordfish/page_big_pc/free/report/sample', '_blank')
+    },
+    goBuyCreditReport() {
+      window.open('/swordfish/page_big_pc/order/credit-report', '_blank')
     }
   }
 }
@@ -696,6 +717,53 @@ export default {
         margin-top:0;
       }
     }
+    .credit-report-box{
+      padding: 15px 24px;
+      margin-bottom: 16px;
+      background: linear-gradient(90deg, #E3FCFF 0%, #FFFFFF 100%);
+      border-radius: 4px;
+      border: 1px solid #87DFEA;
+      .credit-report-content{
+        position: relative;
+      }
+      .credit-report-title{
+        margin-right: 12px;
+        color: #1D1D1D;
+        font-size: 16px;
+        line-height: 24px;
+      }
+      .credit-report-desc{
+        position: relative;
+        color: #686868;
+        font-size: 14px;
+        line-height: 22px;
+        z-index: 10;
+      }
+      .view-report-sample{
+        color: $color_main;
+        cursor: pointer;
+        font-size: 14px;
+        line-height: 22px;
+      }
+      .report-to-buy{
+        margin-left: 20px;
+        background: $color_main;
+        color: #fff;
+        font-size: 14px;
+        line-height: 22px;
+        padding: 4px 24px;
+        border-radius: 4px;
+      }
+      .credit-report-icon{
+        position: absolute;
+        top: 50%;
+        right: -80px;
+        width: 112px;
+        height: 60px;
+        transform: translateY(-50%);
+        z-index: 9;
+      }
+    }
   }
 
 

+ 79 - 0
apps/bigmember_pc/src/views/reportDownload/sample.vue

@@ -0,0 +1,79 @@
+<template>
+  <div class="report-sample v-w1200">
+    <div class="sample-container">
+      <iframe class="iframe" :src="pdfUrl" :style="{ height: iframeHeight }" frameborder="0"></iframe>
+      <AdSense v-show="!loginFlag" ref="adSense" :code="code" @openUrl="openUrl"></AdSense>
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+import { getAssetsFile } from '@/utils'
+import AdSense from '@/views/order/components/adsense/index.vue'
+export default {
+  name: 'report-sample',
+  components:{
+    AdSense
+  },
+  data() {
+    return {
+      pdfUrl: getAssetsFile('投标企业信用报告(样例_剑鱼标讯).pdf'),
+      code: 'new-pc-index-top-ad',
+      adHeight: 0
+    }
+  },
+  computed: {
+    ...mapGetters('user', ['loginFlag']),
+    iframeHeight() {
+      return this.adHeight ? `calc(100% - ${this.adHeight}px)` : '100%'
+    }
+  },
+  mounted() {
+    setTimeout(() => {
+      this.getAdStyle()
+    }, 300)
+    console.log(this.loginFlag)
+  },
+  methods: {
+    getAdStyle() {
+      this.$nextTick(() => {
+        if (this.$refs.adSense && this.$refs.adSense.$el) {
+          const adElement = this.$refs.adSense.$el
+          const height = adElement.clientHeight
+          this.adHeight = height
+        }
+      })
+    },
+    openUrl() {
+      // 打开登录弹框or跳转登录页面
+      // location.href = '/notin/page?source=bidCreditReport'
+      const redirectUrl = '/swordfish/page_big_pc/order/credit-report'
+      this.$showLoginDialog(false, redirectUrl)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.report-sample{
+  height: 100vh;
+  .sample-container{
+    display: flex;
+    flex-direction: column;
+    height: 100%;
+  }
+  .iframe{
+    flex: 1;
+    width: 100%;
+  }
+  .adsense{
+    padding: 0;
+  }
+}
+</style>
+<style>
+.adsense .content{
+  padding: 0!important;
+}
+</style>

+ 2 - 1
configs/proxy/dev-proxy.js

@@ -40,7 +40,8 @@ const ProxyPrefixes = [
   '/js',
   '/css',
   '/antiRes',
-  '/images/wx/'
+  '/images/wx/',
+  '/shareFile/'
 ]
 
 export function useServerProxy(domain, defaultProxy = {}) {