Przeglądaj źródła

feature:增加招标管理模块

liuzl 2 lat temu
rodzic
commit
c9181eca49

+ 20 - 0
api/bid/index.js

@@ -0,0 +1,20 @@
+import micro_request from '@/utils/micro_request'
+
+const basePath = process.uniEnv.VUE_APP_ParentPath
+export default {
+  get(query) {
+    return micro_request.postRequest(basePath, 'CustCustomerBidRecord', 'Get', query)
+  },
+  add(query) {
+    return micro_request.postRequest(basePath, 'CustCustomerBidRecord', 'Add', query)
+  },
+  update(query) {
+    return micro_request.postRequest(basePath, 'CustCustomerBidRecord', 'Update', query)
+  },
+  delete(query) {
+    return micro_request.postRequest(basePath, 'CustCustomerBidRecord', 'Delete', query)
+  },
+  list(query) {
+    return micro_request.postRequest(basePath, 'CustCustomerBidRecord', 'List', query)
+  },
+}

+ 14 - 0
pages.json

@@ -205,6 +205,20 @@
         "navigationStyle": "custom"
       },
       "tit": "新建经销商"
+    },
+    {
+      "path": "pages/inviteTenders/index",
+      "style": {
+        "navigationStyle": "custom"
+      },
+      "tit": "招标信息"
+    },
+    {
+      "path": "pages/inviteTenders/details",
+      "style": {
+        "navigationStyle": "custom"
+      },
+      "tit": "招标详情"
     }
   ],
   "tabBar": {

+ 3 - 3
pages/home/index.vue

@@ -119,13 +119,13 @@
               </view>
             </u-col>
             <u-col span="6">
-              <view class="menu-item flex_l flex-colunm" @click="handleHomeLink()">
+              <view class="menu-item flex_l flex-colunm" @click="handleHomeLink('/pages/inviteTenders/index')">
                 <view class="menu-img-box">
                   <image class="menu-img" src="../../static/images/menu6.png" mode="scaleToFill" />
                 </view>
                 <view class="menu-info flex flex-column">
-                  <view class="tit1">工单管理</view>
-                  <view class="tit2">工单进度查询</view>
+                  <view class="tit1">招标信息</view>
+                  <view class="tit2">招标信息查询</view>
                 </view>
               </view>
             </u-col>

+ 91 - 0
pages/inviteTenders/components/detail.vue

@@ -0,0 +1,91 @@
+<!--
+ * @Author: liuzhenlin 461480418@qq.ocm
+ * @Date: 2023-02-15 16:25:58
+ * @LastEditors: liuzhenlin
+ * @LastEditTime: 2023-05-22 16:10:29
+ * @Description: file content
+ * @FilePath: \oms\pages\distributor\components\distrDetail.vue
+-->
+<template>
+  <view>
+    <view>
+      <view class="info-item">
+        <u-row justify="space-between" gutter="10">
+          <u-col span="12">
+            <view class="flex_l">
+              <view class="label">信息分类:</view>
+              <view class="desc">{{ bidInfoTypeOptions[detail.infoType] }}</view>
+            </view>
+          </u-col>
+        </u-row>
+      </view>
+      <view class="info-item">
+        <u-row>
+          <u-col span="12">
+            <view class="flex_l">
+              <view class="label">中标单位:</view>
+              <view class="desc">{{ detail.bidder }}</view>
+            </view>
+          </u-col>
+        </u-row>
+      </view>
+      <view class="info-item">
+        <u-row justify="space-between" gutter="10">
+          <u-col span="12">
+            <view class="flex_l">
+              <view class="label">备注:</view>
+              <view class="desc">{{ detail.remark }}</view>
+            </view>
+          </u-col>
+        </u-row>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+  export default {
+    name: 'OmsCustomerDetail',
+    props: {
+      detail: {
+        type: [Object],
+        default: {},
+      },
+    },
+    data() {
+      return {
+        bidInfoTypeOptions: {},
+      }
+    },
+
+    mounted() {
+      this.getOptions()
+    },
+
+    methods: {
+      getOptions() {
+        this.getDicts('bid_info_type').then((response) => {
+          this.bidInfoTypeOptions = {}
+          response.data.values.filter((i) => {
+            this.bidInfoTypeOptions[i.key] = i.value
+          })
+        })
+      },
+    },
+  }
+</script>
+
+<style lang="scss" scoped>
+  .info-item {
+    padding: 20rpx;
+    .label {
+      width: 160rpx;
+      color: #646464;
+      font-size: 26rpx;
+    }
+    .desc {
+      font-size: 26rpx;
+      margin-left: 20rpx;
+    }
+  }
+</style>

+ 117 - 0
pages/inviteTenders/components/followRecords.vue

@@ -0,0 +1,117 @@
+<template>
+  <view class="todo-list">
+    <u-empty mode="list" text="暂无记录" v-if="followList.length == 0"></u-empty>
+    <view v-else v-for="(v, i) in followList" :key="i">
+      <view class="follow-date">
+        <u-text :bold="true" size="26rpx" :text="v.followDay"></u-text>
+      </view>
+      <view class="todo-item" v-for="item in v.followupList" :key="item.id">
+        <u-row>
+          <u-col span="12">
+            <view class="header">
+              <u-row>
+                <u-col span="12">
+                  <view class="flex_l">
+                    <text class="tit-txt text-ellipsis flex_1">
+                      {{ item.contactsName }} 跟进({{ formatType(item.followType) }})
+                    </text>
+                  </view>
+                </u-col>
+              </u-row>
+              <view class="content flex">
+                <text>{{ item.followContent }}</text>
+              </view>
+              <view class="content-footer flex1">
+                <text class="date">{{ item.followDate }}</text>
+                <view class="flex flex-middle">
+                  <text class="user-txt">联系人:{{ item.contactsName }}</text>
+                </view>
+              </view>
+            </view>
+          </u-col>
+        </u-row>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+  import to from 'await-to-js'
+  import followApi from '../../../api/follow'
+  export default {
+    name: 'OmsCustomerDetail',
+    props: {
+      targetId: {
+        type: [String, Number],
+        default: '0',
+      },
+    },
+    data() {
+      return {
+        followList: [],
+      }
+    },
+    mounted() {
+      this.getRecords()
+    },
+
+    methods: {
+      async getRecords() {
+        let params = {
+          targetId: '' + this.targetId,
+          targetType: '60',
+          DaysBeforeToday: 9999,
+        }
+        const [err, res] = await to(followApi.getListByDay(params))
+        if (err) return
+        if (res.code == 200) this.followList = res.data.list || []
+      },
+      formatType(val) {
+        let str = ''
+        if (val == 10) str = '电话'
+        else if (val == 20) str = '邮件'
+        else if (val == 30) str = '拜访'
+        return str
+      },
+    },
+  }
+</script>
+
+<style lang="scss" scoped>
+  .todo-list {
+    height: 100%;
+    overflow: auto;
+    .follow-date {
+      padding: 20rpx 0 20rpx 20rpx;
+    }
+    .todo-item {
+      padding: 12rpx 40rpx 12rpx 46rpx;
+      background: #f2f3f5;
+      border-radius: 15rpx;
+      margin-bottom: 32rpx;
+      .tit-txt {
+        font-size: 28rpx;
+        font-weight: bold;
+        color: #323232;
+      }
+      .content {
+        padding: 10rpx 0;
+        font-size: 28rpx;
+        color: #646464;
+      }
+      .content-footer {
+        padding: 0 0 12rpx 0;
+        font-size: 24rpx;
+        .date {
+          color: #969696;
+        }
+        .user-img {
+          width: 46rpx;
+          height: 46rpx;
+          border-radius: 50%;
+          margin-right: 15rpx;
+        }
+      }
+    }
+  }
+</style>

+ 306 - 0
pages/inviteTenders/details.vue

@@ -0,0 +1,306 @@
+<!--
+ * @Author: liuzhenlin 461480418@qq.ocm
+ * @Date: 2023-01-12 11:57:48
+ * @LastEditors: liuzhenlin
+ * @LastEditTime: 2023-02-28 10:21:59
+ * @Description: file content
+ * @FilePath: \oms\pages\distributor\details.vue
+-->
+<template>
+  <view class="home">
+    <view class="nav">
+      <view :style="{ paddingTop }">
+        <view class="title" :style="[{ height }, { lineHeight: height }]">
+          <view class="back" @click="goBack()">
+            <u-icon name="arrow-left" color="#ffffff" size="22"></u-icon>
+          </view>
+          <text>招标信息详情</text>
+        </view>
+      </view>
+    </view>
+    <view class="main">
+      <view class="main-top">
+        <view class="customer-box">
+          <view class="header flex1">
+            <view class="name flex_l">
+              <image class="img" src="../../static/images/menu1.png" mode="scaleToFill" />
+              <text>{{ bidInfo.title }}</text>
+            </view>
+            <view class="date">{{ parseTime(bidInfo.biddingTime, '{y}-{m}-{d}') }}</view>
+          </view>
+          <view class="info">
+            <view class="info-item">
+              <u-row>
+                <u-col span="6">
+                  <view class="flex_l">
+                    <view class="info-label">招标产品名称:</view>
+                    <text class="info-txt">{{ bidInfo.productName }}</text>
+                  </view>
+                </u-col>
+                <u-col span="6">
+                  <view class="flex_l">
+                    <view class="info-label">项目预算:</view>
+                    <text class="info-txt">{{ bidInfo.budget }}</text>
+                  </view>
+                </u-col>
+              </u-row>
+            </view>
+            <view class="info-item">
+              <u-row justify="space-between">
+                <u-col span="6">
+                  <view class="flex_l">
+                    <view class="info-label">发布招标日期:</view>
+                    <text class="info-txt">{{ parseTime(bidInfo.publishedTime, '{y}-{m}-{d}') }}</text>
+                  </view>
+                </u-col>
+                <u-col span="6">
+                  <view class="flex_l">
+                    <view class="info-label">客户名称:</view>
+                    <text class="info-txt">{{ bidInfo.cuctName }}</text>
+                  </view>
+                </u-col>
+              </u-row>
+            </view>
+          </view>
+        </view>
+        <view class="tabs">
+          <u-tabs
+            v-if="curTabIndex >= 0"
+            @change="changeTabs"
+            :current="curTabIndex"
+            :scrollable="false"
+            :list="list"
+            :activeStyle="{
+              color: '#3E7EF8',
+              fontWeight: 'bold',
+            }"
+            :inactiveStyle="{
+              color: '#969696',
+            }"></u-tabs>
+        </view>
+      </view>
+      <view class="data-list">
+        <!-- 跟进记录 -->
+        <follow-records v-if="curTabIndex == 0" ref="follow" :targetId="bidId" :targetType="distrType"></follow-records>
+        <!-- 详情 -->
+        <bid-detail v-if="curTabIndex == 1" :detail="bidInfo"></bid-detail>
+      </view>
+      <!-- 新增按钮 -->
+      <view class="fixed-btn-group" :style="{ width: openBtnWidth ? '180rpx' : '90rpx' }">
+        <view class="flex1" v-if="openBtnWidth">
+          <view class="btn center" @click="openFollow()">跟</view>
+        </view>
+        <view class="btn center" @click="openBtnWidth = !openBtnWidth">
+          <u-icon name="plus" color="#fff" size="20"></u-icon>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+<script>
+  import bidApi from '../../api/bid'
+  import to from 'await-to-js'
+  import bidDetail from './components/detail'
+  import followRecords from './components/followRecords'
+  export default {
+    name: 'omsIndex',
+    components: { bidDetail, followRecords },
+    data() {
+      return {
+        openBtnWidth: false,
+        curTabIndex: -1,
+        fllowList: [], //跟进数据
+        list: [
+          {
+            name: '跟进记录',
+            index: 0,
+          },
+          {
+            name: '详细信息',
+            index: 1,
+          },
+        ],
+        height: '',
+        paddingTop: '',
+        bidInfo: {},
+        bidId: 0, //招标id
+      }
+    },
+    onLoad(option) {
+      this.bidId = parseInt(option.id)
+    },
+    created() {
+      const navData = uni.getMenuButtonBoundingClientRect()
+      this.height = navData.height + 'px'
+      this.paddingTop = navData.top + 'px'
+    },
+    onShow() {
+      this.curTabIndex = 0
+      this.openBtnWidth = false
+      this.getBidDeatil()
+    },
+    onHide() {
+      this.curTabIndex = -1
+    },
+    methods: {
+      async getBidDeatil() {
+        const [err, res] = await to(bidApi.get({ id: this.bidId }))
+        if (err) return
+        if (res && res.code == 200) {
+          this.bidInfo = res.data
+        }
+      },
+      // 改变tab
+      changeTabs(data) {
+        this.curTabIndex = data.index
+      },
+      // 打开转移
+      openFollow() {
+        // this.$store.commit('setDetails', this.projectData)
+        uni.navigateTo({
+          //保留当前页面,跳转到应用内的某个页面
+          url: '/pages/publicPages/follow?targetType=60&id=' + this.bidInfo.id,
+        })
+      },
+      goBack() {
+        uni.navigateBack({
+          //关闭当前页面,返回上一页面或多级页面。
+          delta: 1,
+        })
+      },
+    },
+  }
+</script>
+<style>
+  page {
+    background: #f2f3f5;
+  }
+</style>
+<style lang="scss" scoped>
+  .home {
+    padding-top: 200rpx;
+
+    .nav {
+      position: absolute;
+      left: 0;
+      top: 0;
+      width: 100%;
+      height: 356rpx;
+      background: #3e7ef8;
+      border-radius: 0 0 31rpx 31rpx;
+      .title {
+        position: relative;
+        text-align: center;
+        font-size: 32rpx;
+        font-weight: bold;
+        color: #ffffff;
+        .back {
+          position: absolute;
+          top: 0;
+          bottom: 0;
+          margin: auto;
+          left: 70rpx;
+          display: flex;
+        }
+      }
+    }
+
+    .main {
+      position: absolute;
+      width: 100%;
+      height: calc(100vh - 200rpx);
+      overflow: hidden;
+      padding-bottom: 64rpx;
+      .main-top {
+        padding: 0 32rpx;
+      }
+      .customer-box {
+        width: 100%;
+        background: #ffffff;
+        box-shadow: 0 6rpx 19rpx 2rpx rgba(0, 45, 132, 0.15);
+        border-radius: 32rpx;
+        padding: 22rpx 38rpx 68rpx 40rpx;
+        .header {
+          .name {
+            .img {
+              width: 46rpx;
+              height: 46rpx;
+              border-radius: 50%;
+              margin-right: 8rpx;
+            }
+            text {
+              font-size: 28rpx;
+              font-weight: bold;
+              color: #323232;
+            }
+          }
+          .date {
+            font-size: 24rpx;
+            color: #3e7ef8;
+          }
+        }
+        .info {
+          .info-item {
+            margin-top: 18rpx;
+            .info-label {
+              width: 162rpx;
+              text-align: left;
+              font-size: 24rpx;
+              color: #646464;
+            }
+            .info-txt {
+              flex: 1;
+              font-size: 24rpx;
+              color: #323232;
+            }
+          }
+        }
+      }
+      .data-list {
+        margin-top: 16rpx;
+        width: 100%;
+        height: calc(100vh - 532rpx);
+        background: #ffffff;
+        padding: 32rpx;
+        overflow: auto;
+        padding-bottom: 145rpx;
+        .status1 {
+          color: #4096fb;
+          background: rgba(64, 150, 251, 0.2);
+        }
+        .status2 {
+          background: rgba(255, 184, 60, 0.2);
+          color: #ffb83c;
+        }
+        .status3 {
+          color: #fe6936;
+          background: rgba(254, 105, 54, 0.2);
+        }
+      }
+    }
+    .fixed-btn-group {
+      position: fixed;
+      display: flex;
+      justify-content: space-around;
+      align-items: center;
+      width: 90rpx;
+      height: 90rpx;
+      bottom: 50rpx;
+      right: 50rpx;
+      box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+      border-radius: 20px;
+      transition: all 0.2s;
+      background: #fff;
+      .btn {
+        width: 60rpx;
+        height: 60rpx;
+        background: #3e7ef8;
+        border-radius: 50%;
+        margin: 10rpx;
+        font-size: 26rpx;
+        font-weight: bold;
+        color: #ffffff;
+      }
+    }
+  }
+</style>

+ 352 - 0
pages/inviteTenders/index.vue

@@ -0,0 +1,352 @@
+<!--
+ * @Author: liuzhenlin 461480418@qq.ocm
+ * @Date: 2023-01-12 11:57:48
+ * @LastEditors: liuzhenlin
+ * @LastEditTime: 2023-05-22 15:31:58
+ * @Description: file content
+ * @FilePath: \oms\pages\distributor\index.vue
+-->
+<template>
+  <view class="home">
+    <view class="nav">
+      <view :style="{ paddingTop }">
+        <view class="title" :style="[{ height }, { lineHeight: height }]">
+          <view class="back" @click="goBack()">
+            <u-icon name="arrow-left" color="#ffffff" size="22"></u-icon>
+          </view>
+          <text>招标信息</text>
+        </view>
+      </view>
+    </view>
+    <view class="main">
+      <!-- 搜索 -->
+      <view class="query-wrap">
+        <view class="search-container">
+          <view class="search-input">
+            <u-input
+              clearable
+              placeholderStyle="font-size:26rpx"
+              :customStyle="{ height: '66rpx' }"
+              v-model="title"
+              prefixIcon="search"
+              prefixIconStyle="font-size: 22px;color: #909399"
+              placeholder="请输入招标信息标题"
+              shape="circle"
+              border="surround"></u-input>
+          </view>
+          <view class="search-btn" @click="searchList">搜索</view>
+        </view>
+      </view>
+      <u-empty v-if="bidData.length == 0" mode="list" text="暂无数据"></u-empty>
+      <scroll-view :scroll-y="true" class="data-list" @scrolltolower="lower" v-else>
+        <view>
+          <view class="data-item" v-for="(v, i) in bidData" :key="i" @click="toDetails(v)">
+            <view class="customer-name flex">
+              <text class="name">{{ v.title }}</text>
+            </view>
+            <view class="customer-info flex">
+              <view class="info-left flex_1">
+                <view class="info-row flex_l">
+                  <text class="info-label">客户名称:</text>
+                  <u-text color="#323232" size="24rpx" :text="v.cuctName || '-'"></u-text>
+                </view>
+                <view class="info-row flex_l">
+                  <text class="info-label">招标产品名称:</text>
+                  <u-text color="#323232" size="24rpx" :text="v.productName || '-'"></u-text>
+                </view>
+                <view class="info-row flex_l">
+                  <text class="info-label">发布招标日期:</text>
+                  <u-text
+                    color="#323232"
+                    size="24rpx"
+                    :text="parseTime(v.publishedTime, '{y}-{m}-{d}') || '-'"></u-text>
+                </view>
+              </view>
+            </view>
+          </view>
+          <u-loadmore :status="loadStatus" />
+        </view>
+      </scroll-view>
+    </view>
+    <!-- 消息提示 -->
+    <u-toast ref="uToast"></u-toast>
+  </view>
+</template>
+<script>
+  import bidApi from '../../api/bid'
+  import to from 'await-to-js'
+  export default {
+    name: 'omsIndex',
+    components: {},
+    data() {
+      return {
+        openBtnWidth: false,
+        lineBg: require('@/static/images/up.png'),
+        curTabIndex: 0,
+        height: '',
+        paddingTop: '',
+        pageNum: 0,
+        pageSize: 10,
+        bidData: [], //客户列表
+        bidDataTotal: 0, //列表元素数量
+        loadStatus: '', //加载状态
+        title: '', //经销商名称
+      }
+    },
+    created() {
+      const navData = uni.getMenuButtonBoundingClientRect()
+      this.height = navData.height + 'px'
+      this.paddingTop = navData.top + 'px'
+    },
+    onShow() {
+      this.searchList()
+    },
+    methods: {
+      // 上拉滚动
+      lower() {
+        if (this.bidData.length < this.bidDataTotal && this.loadStatus != 'loading') {
+          this.$u.throttle(this.getBidList(), 2000, false)
+        }
+      },
+      // 查询列表
+      searchList() {
+        this.pageNum = 0
+        this.getBidList(true)
+      },
+      async getBidList(reset) {
+        this.loadStatus = 'loading'
+        this.pageNum++
+        let params = {
+          title: this.title,
+          pageNum: this.pageNum,
+          pageSize: this.pageSize,
+        }
+        const [err, res] = await to(bidApi.list(params))
+        if (err) {
+          this.loadStatus = 'nomore'
+          return
+        }
+        if (res && res.code == 200) {
+          if (reset) {
+            this.bidData = res.data.list || []
+          } else {
+            this.bidData = [...this.bidData, ...(res.data.list || [])]
+          }
+          this.bidDataTotal = res.data.total
+          this.loadStatus = this.bidData.length == this.bidDataTotal ? 'nomore' : 'loadmore'
+        } else {
+          this.loadStatus = 'nomore'
+        }
+      },
+      goBack() {
+        uni.navigateBack({
+          //关闭当前页面,返回上一页面或多级页面。
+          delta: 1,
+        })
+      },
+      toDetails(v) {
+        uni.navigateTo({
+          //保留当前页面,跳转到应用内的某个页面
+          url: '/pages/inviteTenders/details?id=' + v.id,
+        })
+      },
+    },
+  }
+</script>
+<style>
+  page {
+    background: #f2f3f5;
+  }
+</style>
+<style lang="scss" scoped>
+  .home {
+    padding-top: 188rpx;
+
+    .nav {
+      position: absolute;
+      left: 0;
+      top: 0;
+      width: 100%;
+      height: 284rpx;
+      background: #3e7ef8;
+      .title {
+        position: relative;
+        text-align: center;
+        font-size: 32rpx;
+        font-weight: bold;
+        color: #ffffff;
+        .back {
+          position: absolute;
+          top: 0;
+          bottom: 0;
+          margin: auto;
+          left: 70rpx;
+          display: flex;
+        }
+      }
+    }
+
+    .main {
+      position: absolute;
+      width: 100%;
+      height: calc(100vh - 188rpx);
+      background: #ffffff;
+      box-shadow: 0 6rpx 19rpx 2rpx rgba(0, 45, 132, 0.15);
+      border-radius: 31rpx 31rpx 0 0;
+      padding: 0 32rpx;
+      padding-bottom: 64rpx;
+      .query-wrap {
+        padding-top: 20rpx;
+        .search-container {
+          display: flex;
+          align-items: center;
+          .search-input {
+            flex: 1;
+          }
+          .search-btn {
+            text-align: center;
+            line-height: 60rpx;
+            border-radius: 12rpx;
+            width: 100rpx;
+            height: 60rpx;
+            font-size: 26rpx;
+            margin: 0 0 0 12rpx;
+            background: $u-primary;
+            color: #ffffff;
+          }
+        }
+      }
+      .data-list {
+        width: 100%;
+        height: calc(100vh - 372rpx);
+        overflow-y: scroll;
+        .data-item {
+          background: rgba(242, 243, 245, 0.5);
+          border-radius: 15rpx;
+          padding: 28rpx 40rpx 28rpx 38rpx;
+          margin-top: 32rpx;
+          .customer-name {
+            .name {
+              flex: 1;
+              color: #323232;
+              font-weight: bold;
+              font-size: 28rpx;
+              margin-right: 12rpx;
+            }
+            .user-code {
+              width: 180rpx;
+              height: 32rpx;
+              font-size: 24rpx;
+              color: #323232;
+              line-height: 32rpx;
+            }
+          }
+          .customer-info {
+            .info-left {
+              .transfer-btn {
+                margin-top: 20rpx;
+                width: 150rpx;
+              }
+              .info-row {
+                margin-top: 12rpx;
+                .info-label {
+                  color: #646464;
+                  font-size: 24rpx;
+                }
+              }
+            }
+            .info-right {
+              padding-top: 30rpx;
+              .user-img {
+                border-radius: 50%;
+                width: 46rpx;
+                height: 46rpx;
+              }
+            }
+          }
+        }
+      }
+    }
+
+    .filter-popup {
+      background: rgba(0, 0, 0, 0.8);
+      position: fixed;
+      width: 100%;
+      height: 100%;
+      left: 0;
+      z-index: 1;
+      .filter-wrap {
+        width: 100%;
+        padding: 20rpx;
+        background: #ffffff;
+        .filter-item {
+          padding-bottom: 30rpx;
+          .tit {
+            font-size: 26rpx;
+            color: #323232;
+            font-weight: bold;
+            padding-bottom: 20rpx;
+          }
+          .menu-list {
+            display: flex;
+            flex-wrap: wrap;
+            .menu-item {
+              margin-right: 40rpx;
+              margin-bottom: 20rpx;
+            }
+          }
+        }
+      }
+      .btn-box {
+        width: 698rpx;
+        height: 75px;
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        > view {
+          width: 320rpx;
+          height: 40px;
+          border-radius: 40px;
+          border: solid 1rpx #ec652b;
+          align-items: center;
+          justify-content: center;
+          text-align: center;
+          line-height: 40px;
+        }
+        .reset {
+          color: #ec652b;
+        }
+        .submit {
+          color: #fff;
+          background-color: #ec652b;
+        }
+      }
+    }
+
+    .fixed-btn-group {
+      position: fixed;
+      display: flex;
+      justify-content: space-around;
+      align-items: center;
+      width: 90rpx;
+      height: 90rpx;
+      bottom: 50rpx;
+      right: 50rpx;
+      box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+      border-radius: 20px;
+      transition: all 0.2s;
+      background: #fff;
+
+      .btn {
+        width: 60rpx;
+        height: 60rpx;
+        background: #3e7ef8;
+        border-radius: 50%;
+        margin: 10rpx;
+        font-size: 26rpx;
+        font-weight: bold;
+        color: #ffffff;
+      }
+    }
+  }
+</style>

+ 16 - 0
pages/publicPages/follow.vue

@@ -122,6 +122,7 @@
   import distrApi from '../../api/base/distr'
   import custApi from '../../api/customer'
   import prodApi from '../../api/project'
+  import bidApi from '../../api/bid'
   import ProjectContact from '@/components/ProjectContact'
   import CustomerContact from '@/components/CustomerContact'
   import DistrContact from '@/components/DistrContact'
@@ -238,11 +239,19 @@
             this.details = res.data
           }
         } else if (this.targetType == '50') {
+          // 经销商代理商
           const [err, res] = await to(distrApi.getEntity({ id: this.curId }))
           if (err) return
           if (res && res.code == 200) {
             this.details = res.data.list
           }
+        } else if (this.targetType == '60') {
+          // 招标信息
+          const [err, res] = await to(bidApi.get({ id: this.curId }))
+          if (err) return
+          if (res && res.code == 200) {
+            this.details = res.data
+          }
         }
       },
       // 打开联系人
@@ -253,6 +262,8 @@
           this.$refs.projectConcat.open(this.details.id, this.details.custId)
         } else if (this.targetType == '50') {
           this.$refs.distrConcat.open(this.details.id)
+        } else if (this.targetType == '60') {
+          this.$refs.concat.open(this.details.custId)
         }
       },
       // 行业选择
@@ -303,6 +314,11 @@
                 targetId: this.details.id,
                 targetName: this.details.distName,
               }
+            } else if (this.targetType == '60') {
+              idParams = {
+                targetId: this.details.id,
+                targetName: this.details.title,
+              }
             }
             let params = Object.assign(
               {